忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

Somでsin関数の近似(教師あり学習)

SOM(Self Organizing Map)でsin関数の近似をしてみました。
デモプログラムを載せます。


デモ

step :
target function = sin( * x - )
simulation speed :

解説

このプログラムは二枚のSom(入力Somと出力Som)をつかって、sin関数を近似します。
最初は、出力Somの出す答えはめちゃくちゃです。
グチャグチャの線が引かれます。
しかし何度も学習を繰り返すことによって、sin関数のようにうねうねした形になっていきます。

各図の意味

ここでは2つの図が表示されています。
上の図は入力と出力のSomを合わせて表示したもの。
下の図はそれの出力結果です。

下の図

下の図に注目してください。
下の図には2種類の線が引かれていることにお気づきでしょうか。
片方はガタガタの線で、もう片方は曲線っぽいです。

曲線っぽい方は、関数の理想の形です。
一方、ガタガタの方は、Somによって出された出力です。
Somは最初ランダムな答えをだすので、めちゃくちゃなのです。
学習を繰り返すと、なめらかな方の形に近づいていきます。

学習の過程で、なめらかな曲線の形が教師データとして使われます。
これは理想の形状で、Somの出した答えがその形状と違っていたら、どう違うのかをSomに教えるのです。
Somはそのお叱りにしたがって自分自身を修正します。
結果としてSomは理想のなめらかな線の形状に近づいていくのです。

上の図

上の図は2枚のSomを表しています。
入力Somと出力のSomです。
この図は碁盤のようなマス目になっていますね。
各マスが入力Somのニューロン1つと出力Somのニューロン1つを表しているのです。

入力データは上で、出力データは下の色です。
もちろん黒が0で白が1です。
(ただ、0から1までしか使わないという制約をここでは勝手に課したので、sinの出力の値は通常のsinの-1~1の範囲から0~1の範囲にずれてます。
なお、この制約は私が勝手に課したものであって、普通Somは範囲とか気にしなくても使えるのでご安心ください。)

たとえば、上が白で下が白だったとしましょう。
これは入力が1のとき出力が1であることを意味します。

1(白) => 1(白)

上が白で下が灰色ならこうです。

1(白) => 0.5(灰色)

他にも色々パターンがあります。

0(黒) => 1(白)
0.5(灰色) => 0(黒)

入力Somのニューロンのもっているデータが入力に反応し、そのニューロンと同じ位置にある出力Somのニューロンのデータを返すわけです。
出力Somは出力を行った後、正しい理想的なデータを混ぜられます。
これによってどんどん出力が正解に近づいていくのです。

拍手[0回]

PR