ホップフィールドネットワークをJavaScriptで実装。
2015/9/4
ホップフィールドネットワークの説明は ここ や ここ にあるが、画像認識について考えたこと。
- 全pixelが相互接続されたネットワークモデル。
- 学習時には、与えた画像の任意のpixel同士が「同じ」か「違う」かを、接続の重みとして記憶する。 複数の画像なら値を足しこむ。
- これにより「重み」に複数の画像の記憶が宿ったとみなす。
- pixelの「ON/OFF」は「1,-1」で、重みの「同じ/違う」は「1/-1」で表す。
- 想起時には、隣のpixel値に重みをかける。 「1=ON、-1=OFF」×「1=そのまま、-1=反転」なので自分のpixel値が計算できる。
- 初期画像をもとに全てのpixelについて計算を繰り返すことで、記憶に沿ったpixelの状態に近づき、 どれかの画像にたどりつく可能性がある。
- 隣と「同じ/違う」だけ記憶しているので、実は「ON/OFF」反転したパターンも想起対象になっている。
資料 によると記憶できるパターン数はニューロン数(ノード数?)の15%あたりが限界とあるが、 この例だと 25ノード×0.15=3~4個 になる。 メモリ効率でいえば元の画像をまるごと記憶したほうがいい。
プログラム。
学習データ。
3つの5×5画像を記憶させる。
重み。
学習結果の重みは25×25のマトリクスになる。対象型なので実質半分のメモリで済む。
想起パターン。
想起結果。
THETAによって精度が変わるのが困りもの。