python3

Pythonでニューラルネット(AutoEncoderで「要約/次元圧縮」してみる)その2

前回記事
を、若干、修正する。

私が思うに、
AutoEncoderの醍醐味は、「隠れ層に無理させてみる」こと。

前回は、00000001,00000010,・・・,10000000という、
「8パターン」を学習させ、
隠れ層として、000,001,010,011,・・・,111という表現を学習できたが、
「8パターン」が「2の3乗個」で、
「表現」出来るのは「当たり前」である。

8パターンより多くの学習をさせたとき、どういう表現(representation)を獲得するかに、面白みが出て来る。

(ちなみに、もちろん、ニューラルネットの各層各ノードの重み付けは
 実際にはゼロイチの2値ではない。
 数値の大小によるパターン出し分けという表現を得るのも「普通」。)

●実験その1 (パターンに無関係な ノイズを混ぜてみる)

5列目(全て1)と6列目(全て0)が、
パターンに無関係な要素(学習上は無視できるもの)

[input]       [hidden]       [output]
0000100001- 0.7 0.5 0.0  - 0000100001 + 
0000100010- 1.0 1.0 0.6  - 0000100010 + 
0000100100- 0.5 0.0 1.0  - 0000100100 + 
0000101000- 0.0 1.0 0.0  - 0000101000 + 
0001100000- 1.0 0.1 0.6  - 0001100000 + 
0010100000- 0.4 0.0 0.2  - 0010100000 + 
0100100000- 0.0 0.3 0.6  - 0100100000 + 
1000100000- 0.2 1.0 1.0  - 1000100000 + 

四捨五入すると、だいたい二進法(000,001,010,011,・・・,111)通りで、
8パターンを出し分け。順当。

●実験その2 (10パターンを試す)

[input]       [hidden]       [output]
0000000001- 0.6 0.5 0.0  - 0000000001 + 
0000000010- 0.3 1.0 1.0  - 0000000010 + 
0000000100- 0.3 1.0 0.2  - 0000000100 + 
0000001000- 0.4 0.0 0.3  - 0000001000 + 
0000010000- 0.0 0.4 0.2  - 0000010000 + 
0000100000- 1.0 0.2 0.4  - 0000100000 + 
0001000000- 0.4 0.0 1.0  - 0001000000 + 
0010000000- 1.0 0.4 1.0  - 0010000000 + 
0100000000- 0.0 0.4 0.8  - 0100000000 + 
1000000000- 1.0 1.0 0.3  - 1000000000 + 

難なく、クリアー。

●実験その3(8パターンを、隠れ層2つで学習させてみる)

[input]   [hidden]   [output]
00000001- 0.6 0.0  - 00000001 + 
00000010- 0.0 0.3  - 00000010 + 
00000100- 1.0 0.7  - 00000100 + 
00001000- 0.9 0.2  - 00001000 + 
00010000- 0.0 0.7  - 00010000 + 
00100000- 0.2 0.0  - 00100000 + 
01000000- 0.7 1.0  - 01000000 + 
10000000- 0.2 1.0  - 10000000 + 

問題なし。