今年(1/1〜2/28)一番感動した論文である「足し算をする機械」をコードをパクって実装することができた。感動である。途中いろいろ苦労したので、メモを残した。
この機械は、繰上げや2桁の数、二項演算といった概念形成をすること無く、ほぼ100%の精度で足し算することができる。つまり、二項演算の多様体を学習しているようなのである。
原論文
http://arxiv.org/abs/1410.4615
サンプル実装(お世話になっているDL4J)
前処理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]]]
足し算の結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
12+28 gives 39 != 40 87+38 gives 125 == 125 72+ 7 gives 80 != 79 67+80 gives 143 != 147 30+33 gives 63 == 63 42+40 gives 82 == 82 76+37 gives 114 != 113 66+84 gives 153 != 150 34+12 gives 45 != 46 86+69 gives 157 != 155 53+59 gives 111 != 112 50+78 gives 125 != 128 74+ 6 gives 80 == 80 |
GPUを用いた100Epochで、1時間。20%の正答率。おりこうでちゅね〜〜
かわいい(確信)