[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Iでデータをひとつ取り入れパラメーターを大きくする準備をします。
- 外部からの入力パターンを学習する(目が覚めている状態:Positive Phase)
- 入力パターンを可視ニューロンにセットする(つまり可視ニューロンのOn/Offを環境からセットする)。
- 隠れニューロンの発火状態(On/Off、1か0)を更新する。
- 結合の重みを、ヘブ則に従って更新する準備をする。
つまり、
d重み += 学習係数 × 可視ニューロンの発火状態 × 隠れニューロンの発火確率;
(「d重み」は重みの変化を表す変数です。
最後に「重み += d重み;」します。)- ニューロンのバイアスを更新する準備をする。
ここで、可視ニューロンと隠れニューロンでなぜか学習式が異なることに注意。
可視ニューロン : dバイアス += 学習係数 × 発火状態;
隠れニューロン : dバイアス += 学習係数 × 発火確率;
(「dバイアス」はバイアスの変化を表す変数です。
最後に「バイアス += dバイアス;」します)- 外部からの入力をなくし、自由連想する(夢を見ている状態 : Negative Phase)
- 可視ニューロンの発火状態を更新する。
- 隠れニューロンの発火状態を更新する。(場合によってはここから1に戻り、1、2を何度か繰り返すが、戻らなくてもそこそこのいい結果が出ることが知られている)
- 結合の重みを、ヘブ則の逆で更新する準備をする。
つまり、
d重み += -学習係数 × 可視ニューロンの発火状態 × 隠れニューロンの発火確率;
I.3では重みを増やしていたが、ここでは重みを減らしていることに注目。
(学習係数の前にマイナス符号あり)- ニューロンのバイアスを更新する準備をする。
ここで、可視ニューロンと隠れニューロンでなぜか学習式が異なることに注意。
可視ニューロン : dバイアス += -学習係数 × 発火状態;
隠れニューロン : dバイアス += -学習係数 × 発火確率;
I.4ではバイアスを増やしていたが、ここではバイアスを減らしていることに注意。
(学習係数の前にマイナス符号有り)- 結合の重み、ニューロンのバイアスを更新する。
重み += d重み;
バイアス += dバイアス;
その後、
d重み = 0;
dバイアス = 0;I、II、IIIを繰り返します。
(1000回くらい?)
「起きている?
眠る?
何のことだ?」
とお思いの方がいらっしゃるはずです。
今から解説します。
ここで使われている「起きている」とか「眠る」は私のオリジナル比喩ではありません。
安心して下さい。
私はよくあまり上手ではないオリジナル比喩を持ちだして相手を混乱させてしまうことがありますが、これはそうではありません。
(制限付きに限らず)ボルツマンマシンの学習はざっくり分けると2つのステップからなります。
それが「起きている時の学習」と「眠っている時の学習」なのです。
(厳密に言うとこの2つが終わった後、最終ステップ「昼と夜に蓄積された情報から実際にシナプスの重みとニューロンのバイアスを修正する」があるのですが、まあ細かいことは抜きにしましょう)
この表現はボルツマンマシンの話でよく使われます。
眠っている時の反学習と言うのはいかにもフランシス・クリックさんの、夢は忘れるために見るのだと言う説と似ているためよく関連があると言われています。
で、「起きている」とはどういうことかというと、外部から入力を受け付けて学習の準備をする、という意味です。
「眠る」とは、外部からの入力をシャットアウトし、内部の情報だけで色々やって学習の準備をする、という意味です。
そして最後のステップで、「起きている」時と「寝ている」時に得た情報を元に、実際の学習を行います。
(この記事では「起きている」時を昼と呼ぶことにします。
正式名称は"Positive phase"です。
この記事では「寝ている」時を夜と呼ぶことにします。
正式名称は"Negative phase"です。)
つまり実際の生き物は昼と夜にそれぞれ別に学習するのですが、コントラスティブ・ダイバージェンス法では学習をまとめてやるのですね。
そうしないと、私のやった感じだと、ちょっと不安定になる感じがあります。
本によっては別々に学習している方法を紹介しているものもありますが…。
(下の図では、最後の「実際に学習を行うステップ」が単純化のため描かれていません。
2つ四角が描かれていますが、本当は3つなければおかしいのです。)
さて!
では学習を始めます。
制限付きボルツマンマシンは学習したデータを後で想起することができます。
それを今セットするのです。
とりあえず1をセットしましょう。
セットされるのは上の青い1つの可視ニューロンです。
可視ニューロンの状態が1になりました!
これを今から学習します。
(学習によって結合の重みが大きくなれば良い)
(なお、可視ニューロンの発火確率が0.0であることに注意して下さい。
普通発火確率が0.0なら発火状態も0になりますが、このように外部からデータを入力するときは違うのです。
ミスマッチが起きるのです。
でもまぁ気にしないでください。)
次は隠れニューロンの状態を更新します。
まずは発火確率を求めます。
隠れニューロンの発火確率は0.5となります。
つまり発火するかしないか半々です。
何故そうなるのかというと、結合の重みが0だからです。
つまり隠れニューロンには刺激が来ないわけで、これでは発火していいのかいけないのかわかりません。
別の説明の仕方をすると、活動電位がsigmoid(1 * 0.0)だからです。
sigmoid(0)は0.5ですからね。
次に結合の重みの変化を表す「d重み」を更新します。
昼のd重みの更新式は、こうです:
d重み += 学習係数 * 可視ニューロンの発火状態 * 隠れニューロンの発火確率;
これは「2つのニューロンが同時に発火した時その間の結合が強くなる」というヘブ則に似ていますね。
(夜の更新式はまた違います。プラズマイナス逆になるのです)
よって、このケースでは次のようになります:
d重み += 学習係数 * 1(可視ニューロンの発火状態) * 0.5(隠れニューロンの発火確率)
さて夜がやってきました。
おやすみなさいの時間です。
制限付きボルツマンマシンは目を閉じ眠ります。
目を閉じると外の世界からのインプットがなくなりますね。
つまり外の世界からの情報に惑わされずにニューロンは状態を更新できるのです。
可視ニューロンは、今度は外部からデータをセットされるのではなく、隠れニューロンの発火状態を元に自分自身の発火確率を求めます。
ちなみに、夜のd重みの更新式は次のようになります:
d重み += -学習係数 * 可視ニューロンの発火状態 * 隠れニューロンの発火確率;
(昼の更新式とはちょっと違います。
プラスマイナスが違うのです。
学習係数の前にマイナスが付いていますよね。
つまり、「2つのニューロンが同時に発火すると、その間の結合が弱まる」のです。
ヘブ則の逆ですね。
何でこんなのが必要なのでしょう?
不思議ですね。)
そうやってd重みを更新した後、今度は重みを更新します。
重み += d重み; //重みを更新
d重み = 0; //リセット
この調子で「隠れニューロンの発火状態が1」の場合も手作業でシミュレートできます。
しかし結果は同じなので気にしないでください。
このケースでは、隠れニューロンの発火状態は学習に何ら影響を与えません。
最終的に重みの期待値が0.25(= (0.5 + 0.0) / 2)になることは解っていただけると思います。
このように、重みがプラスになるとどうなるかというと、想起の際に出力が1になる確率が高まります。
つまり、1という学習したパターンを思い出せるようになったのです。
ちなみに、ここでは昼と夜を一度しか繰り返していません。
が、実際のプログラムでは1000回くらい繰り返したりします。
そして複数の学習パターンを学習することもあるので(制限付きボルツマンマシンは、複数のパターンを覚えることができます)、更に繰り返しの数は増えます。