DLの記憶について、Autoencoderでいろいろ遊んでみました。
・DLの記憶に挑戦
ここまでで一応、DLの記憶に挑戦する準備ができました。
それは、どうしてもLatent空間の大きさを変化させてその様子を見たいと考えているためです。
まず、z_meanを二次元とします。
最初に7を100epoch学習します。
以下のようにいろいろな種類の7が並びます。
そして、その7を学習したweightを使って、8を100epoch学習します。
以下のようにいろいろな8が並びました。
つまり、7を学習したのに8を100epoch学習したら、すっかり7を忘れてしまいました。
ということで、これは学習しすぎということで、epoch数を減少していきます。
5epoch
上記のとおり、たかだか5epochで、もう8しか覚えていません。
2epoch
どうにか2epoch以下なら7の記憶があるようです。
そして、次に4を学習します。なんと1epochの学習で記憶がすべて4になってしまいました。
やんぬるかなw
ここで、方針転換します。
Latent空間が小さいので記憶喪失に陥っていると仮定します。
つまり、Latent空間を大きくしていきます。
z_mean=3次元として、7を100epoch学習し、その後8を2epoch学習すると以下のようにまだ7を覚えています。
しかし、8を10epoch学習すると、またまたすべて8になってしまいました。
z_meanの次元が上がると。。。
そして、さてということで、z_mean=10次元として100epoch学習すると以下の絵が得られました。
この絵を見ると、なんとなく7以外の数字も覚えているように見えます。
ということで、Latent空間の次元を徐々に増やして、2,3,5,10,20,100、そして1000次元で7を学習してみました。
その結果が以下のとおりになりました。
つまり、学習していないはずの数字までAutoencoderで再現できてしまいました。
最後のz_mean=1000の時の画像を貼っておきます。
まとめ
・潜在空間の次元が小さいとDLはすぐ忘れる
・潜在空間の次元が大きいと、明示的に学習していないことも覚える
・このとき何が起きているかを次回の記事にしたいと思います