読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

学習とニューラルネットワーク (5)

Neural Network Common Lisp

ボルツマンマシン

今回はボルツマンマシンのシミュレーションを実装してみました。

Simple Boltzmann Machine Simulation

エネルギー関数として { E(x_1, x_2, x_3) = (x_1 + x_2 + x_3 - 3)^{2} } を仮定すると、エネルギーの極小点は { x_1 = x_2 = x_3 = 1 } の 1 点になります。これを実際にシミュレーションにより再現できるかを見てみます。(数値は左から右にかけて状態 (0,0,0)〜(1,1,1) の出現確率に対応)

BM> (bm:bm (clnu.mx:mx t (0 -2 -2) (-2 0 -2) (-2 -2 0))
           (clnu.mx:mx t (-5) (-5) (-5))
           :update-count 1000
           :temperature 0.5)
理論値: .000 .000 .000 .096 .000 .096 .096 .711
実測値: .000 .000 .000 .088 .000 .094 .100 .718
NIL

bm という関数に与えている 2 つの行列は、エネルギー関数を展開したときの 2 次式と 1 次式に相当します。

x1, x2, x3 は確率的に 0 または 1 の値を取りますが、それらの 8 パタンの組み合わせに対する出現確率を理論値と実測値で求めてます。理論値 0.711 が最も高いですが、これは先の極小点の状態に対応しており、確率的な挙動の正しさが確認できます。

続いてエネルギー関数として { E(x_1, x_2, x_3) = (x_1 + x_2 + x_3 - 1)^{2} } を仮定すると、エネルギーの極小点は { (x_1,  x_2, x_3) = (1, 0, 0), (0, 1, 0), (0, 0, 1) } の 3 点になるので、出現確率も 3 つの極値が存在するはずです。

BM> (bm:bm (clnu.mx:mx t (0 -2 -2) (-2 0 -2) (-2 -2 0))
           (clnu.mx:mx t (-1) (-1) (-1))
           :update-count 1000
           :temperature 0.5)
理論値: .038 .282 .282 .038 .282 .038 .038 .000
実測値: .040 .214 .326 .029 .305 .039 .047 .000
NIL

というわけで、上記の通り理論値 0.282 の確率で生起する状態が 3 状態確認できました。

エネルギー関数が持つ温度パラメータについて考察してみます。温度が低いと状態遷移する頻度が低くなるため、エネルギー関数の極小点が平衡状態における出現確率として浮かび上がりやすいですが、平衡状態は初期状態に左右されやすいため局所解にとらわれる可能性があります。逆に、温度が高いと状態遷移する頻度も高くなるため、あまりに温度が高すぎると出現確率が均一になってしまい、エネルギー関数の極小点が見えづらくなる、ということがわかりました。

実装は以下の本を参考にしました。(ちなみにこの本のボルツマンマシンのサンプルコードは、未初期化の配列xにアクセスしているため正しく動作しません…)

学習とニューラルネットワーク (電子情報通信工学シリーズ)

学習とニューラルネットワーク (電子情報通信工学シリーズ)