足し算をする機械

今年(1/1〜2/28)一番感動した論文である「足し算をする機械」をコードをパクって実装することができた。感動である。途中いろいろ苦労したので、メモを残した。

この機械は、繰上げや2桁の数、二項演算といった概念形成をすること無く、ほぼ100%の精度で足し算することができる。つまり、二項演算の多様体を学習しているようなのである。

原論文

http://arxiv.org/abs/1410.4615

サンプル実装(お世話になっているDL4J)

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/seq2seq/AdditionRNN.java

前処理ofデータ

基本は、足し算に使う2つの数を、Random無限ストリームから生成し、無限個教師データを作る。SeqToSeqなので、必要に応じて「Go」と「End」を補う。

num1=84

num2=80

toSeq=[“0″,”8″,”+”,”4″,”8″]

toOneHot=

[[1.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 1.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 1.00, 0.00, 0.00, 1.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 1.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00, 0.00]]
 
num1+num2=164
toSeq=[“Go”,”1″,”6″,”4″]
 

toOneHot=

[[0.00, 0.00, 0.00, 0.00],
[0.00, 1.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 1.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 1.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00],
[1.00, 0.00, 0.00, 0.00],
[0.00, 0.00, 0.00, 0.00]]]
 
足し算の結果
 

 

GPUを用いた100Epochで、1時間。20%の正答率。おりこうでちゅね〜〜

かわいい(確信)