ボルツマンマシン

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

Simple Boltzmann Machine Simulation

エネルギー関数として を仮定すると、エネルギーの極小点は の 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 が最も高いですが、これは先の極小点の状態に対応しており、確率的な挙動の正しさが確認できます。

続いてエネルギー関数として を仮定すると、エネルギーの極小点は の 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にアクセスしているため正しく動作しません…）