[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
SOM(Self Organizing Map)でsin関数の近似をしてみました。
デモプログラムを載せます。
このプログラムは二枚の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は出力を行った後、正しい理想的なデータを混ぜられます。
これによってどんどん出力が正解に近づいていくのです。