chakokuのブログ(rev4)

日々のごった煮ブログです

ミニマムなリカレントネットワークを理解(min-char-rnn.py)

RNNはいろんな記事で紹介されているけど、時間経過をネットワークで表現した図と、ネットワークの構造(時間が止まっている時の構造)が混乱してしまって、良くわからない。一番シンプルな構造でまずは理解するのが良かろうと思われ、非常に短いサンプルソースを見つけた。
min-char-rnn.pyというpythonのプログラムで、input+RNN+outputの3階層になっていて、RNNはユニットが一つだけというもの。ダウンロードは以下より

Minimal character-level language model with a Vanilla Recurrent Neural Network, in Python/numpy
https://gist.github.com/karpathy/d4dee566867f8291f086

これはスタンフォードのAndrej Karpathy氏による実装
http://cs.stanford.edu/people/karpathy/

解説記事は以下
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
和訳は以下
リカレントニューラルネットワークの理不尽な効力(翻訳)
http://qiita.com/KojiOhki/items/397f157342e0def06a9b

読み込ませたデータ
File:input.txt

this is sample text.
but are you happy??
bye and so long.

プログラムを走らせると自動で学習して文書を生成する?

----
iter 37900, loss: 0.002600
----
 his is sample text.
but are you happy??
bye and sotext.
buthare you happy??
bye and sot.
buthare you happy??
bye and sotext.
but are you happy??
bye and sotext.
but are you happy??
bye and sotext.
but

学習させる英文がいまいちなのか?と思い、不思議の国のアリスの冒頭を学習させてみた。3万回の学習で、ロスが1.15、生成された文書は以下。。白いウサギが、、とあったりする。

----
iter 30000, loss: 1.156967
----
 leepy and stupid), whethatsrel iot of a bins ut her sis ingdatsittule 
picking the daisies, when suddenly a White Rabbit with pink eyes rod 
sa hor syeking whet bt her sister was reading, but it had no

ロスが0.0026とはかなり正しく動作しているという評価??
が、、生成されるテキストはけっこう変。まぁRNNユニットがたった一つ((正確には、隠れ層の要素は100(プログラムで指定)))なのに
これだけできてしまうというのがすごいのか!?

いずれにせよ、ミニマムなRNNサンプルがすんなり動くので、デバッグしながら走らせることで、どうやってデータを与えてどうやって稼働させているのかが理解できずはず。(理解といってもプログラムの動作のレベルであって、NNのキモとなるバックプロパゲーションの数学的な理解は別)

不思議の国のアリス英文
http://www.cs.indiana.edu/metastuff/wonder/ch1.html

■学習手順と文書生成手順
pythonソースコードを読んで大よそ以下と理解(机上での分析、実際に走らせて裏はまだ取っていない)
サンプルでは、入力層+セル+出力層の3層構造、入力と出力は文字であり、文字列を学習させる際、一文字ずつ文字を与えて、正解と出力の差を学習させる。
学習の際は、サンプルドキュメントを一文字ずつRNNに与える。期待する出力(正解)は次に生成されるべき文字。例えば、helloを学習させるとして、まずhを与えて、RNNの回答を得る。今回の正解はeであり、教師データはeで、RNNが回答した文字との誤差を計算して、この誤差が0になるように学習させる

文書生成の際は、先頭文字を入力して、RNNが回答した文字を次の入力としてRNNに与えて、RNNが回答した文字をまたRNNの入力に、、というループを繰り返す。回答された文字を連結した結果がRNNが生成した文書となる。

自分の今後の取り組みとしては、この最もシンプルなRNNのソースにバックプロパゲーションの結果が提示されており、数式として理解できるのかを連鎖律で解いてみることである。これが解ければ、RNNのバックプロパゲーションがおおよそ理解できたと判断でき、好きなRNN(LSTM/GRU)とか組めるようになるはず。。

■ご参考URL
CS231n Lecture 10 - Recurrent Neural Networks, Image Captioning, LSTM
https://www.youtube.com/watch?v=iX5V1WpxxkY

CS224D Lecture 8 - 21st Apr 2016 - Recurrent Neural Networks.mp4
https://www.youtube.com/watch?v=PXm7CgzA1pc