北野坂備忘録

主にインストールやプログラミングのメモを載せています。

ホップフィールド・ネットワーク

 階層型ニューラルネットワークはイメージできるけど、ボルツマンマシンはイメージできない、という人が多いようです。
 制限付きボルツマンマシンにいきなり取り組むよりも、もととなったホップフィールド・ネットワークのことを理解してから進んだほうが良いと思いますが、相変わらずいきなりWikipediaを見てしまうと即死します(何の役にも立たない)。
 みっちり数式を書き込んでくれているサイトもありますが、本サイトでは逆にざっくりとしたお話をしたいと思います。
 ここでホップフィールド・ネットワークのだいたいのイメージを掴んでから、細かい数式の書かれたサイトに行きましょう。

 いつもどおり図を見てみましょう。
f:id:kenichia:20160519115045p:plain
 魔術紋章ではありません。ホップフィールド・ネットワークの一例です。
 ホップフィールド・ネットワークは「相互結合型ネットワーク」の一種です。すべてのユニット(円)がそれぞれ別のユニットと繋がっていること確認してください。これが相互結合型ネットワークです。
 相互結合型ネットワークは状態の更新方法として、一気に状態を更新する「同期的更新」とランダムに選んだユニットの状態を更新していく「非同期的更新」があります。ホップフィールド・ネットワークは非同期的更新です。
 各ユニットは「1」か「-1」を出力します。
(実は最初の論文では「1」か「0」を出力するとなっているので、そちらで説明しているサイトも多いです。)
 ユニットを結ぶ線には重みがあります。ユニット1とユニット2を結ぶ線の重みをw_1,2で表すとしましょう。
 ホップフィールド・ネットワークは線の向きによって重みが変わらない「対称結合型」ネットワークです。w_1,2とw_2,1が同じ値になるわけです。一つでも向きによって重みが変わる場合は「非対称結合型」と言います。
 各ユニットには閾値があります。入力が閾値より大きければ「1」、小さければ「-1」を出力します。

 で、だいたいの構造は分かったと思いますので次は利点です。何がうれしいのか。
 ネットワークに状態を記憶させておくことができます。
 例えばユニット1,3,6に「1」、2,4,5に「-1」を入れて重みを更新します。 
 その後、重み更新したホップフィールド・ネットワークにランダムな値を入れると、計算していくことで勝手にユニット1,3,6に「1」、2,4,5に「-1」が現れるのです。
 で、更にホップフィールド・ネットワークが凄いのは、複数のパターンを記憶させられるということです。
 具体的には、「猫の顔」と「犬の顔」をホップフィールド・ネットワークに覚えさせたとすると、「猫の顔っぽい画像」を与えると「猫の顔」を出力し、「犬の顔っぽい画像」を与えると「犬の顔」を出力するようになるのです。ただ、全く関係ない画像を突っ込んでもうまくいきません。「飛行機」の画像を突っ込んでもわけのわからない出力が返ってくるだけです。

 さあここまで来たらWikipediaを見て大丈夫です。パターンを学習したホップフィールド・ネットワークが内部状態を更新する動きを見てみましょう(Wikipediaは出力を「1」「0」にしているので注意)。

タイムスライス(t)毎に次のように動作させる
1.ランダムにユニットを一つ選ぶ
2.そのユニットへの入力の重み付き総和を計算する
3.結果に基づき、そのユニットの出力を更新する
 ・閾値より大きければ1
 ・閾値と等しければ現在と同じ値
 ・閾値より小さければ0
 ・(この際、他のユニットには手を触れない)
4.tを増分だけ増加させ最初に戻る

 というように処理していきます。
 すると、ネットワーク全体のエネルギー関数 E(t)が収束していきます。収束しきったときの各ユニットの値が出力となります。

 ところが、このホップフィールド・ネットワークは局所最小解(ローカルミニマム)に収束しやすく、抜け出せないという問題が発生しました。
 これを乗り越えたのがボルツマンマシンです。

 まとめますと、ホップフィールド・ネットワークは、
複数のパターンを記憶できる
・相互結合型
・非同期的更新
・対称結合型
・局所最小解から抜け出せない
 ネットワークだということです。

 見てのとおり、重み付けの計算方法やらなんやらはすっ飛ばしてますので、そのあたりを突っ込んで知りたい方は他サイトでご確認ください。