studylog/北の雲

chainer/python/nlp

RNN/LSTMメモ 後で消すかも

d.hatena.ne.jp
多分これ学習の時点で失敗してる気がします。
http://d.hatena.ne.jp/shi3z/20150714/1436832305でもepochが進む度にperplexityが上がってるのはおかしいです。イマイチ中身を理解してませんがperplexityってlossみたいなものなので、本来は下のように下がって行くはず。(ptbサンプルの実行例)

iter 10000 training perplexity: 981.54 (108.02 iters/sec)
iter 20000 training perplexity: 405.38 (125.78 iters/sec)
iter 30000 training perplexity: 298.67 (125.76 iters/sec)
iter 40000 training perplexity: 254.68 (126.00 iters/sec)
evaluate
epoch 1 validation perplexity: 214.13
iter 50000 training perplexity: 216.40 (125.77 iters/sec)
iter 60000 training perplexity: 209.86 (125.77 iters/sec)
iter 70000 training perplexity: 195.12 (125.78 iters/sec)
iter 80000 training perplexity: 174.13 (126.00 iters/sec)
iter 90000 training perplexity: 158.10 (125.76 iters/sec)

なので学習のコードがおかしい気がします。多分。自信は無いです。

あるいは確率分布に沿って文字を出力するコードがおかしいか。
下のChainerCharRNNではこんな感じでやってます。probabilityが確率分布。

np.random.choice(range(len(probability)), p=probability)

LSTMが悪いのか、それともptbというサンプルを元にしているのが悪いのか、いまいち切り分けできない。もうちょっと再現性が高いLSTMの利用例はないものか

ChainerCharRNNがいいと思います。わかち書きすら必要無くてただ文字を投げるだけ。

github.com

1.0時代に書かれたコードなので今はそのままじゃ型チェックに引っかかってもしかしたら動かないかも。int64どうたらエラーが出る気がします。

デフォルトのRMSpropではなくAdaDeltaの方が収束速いです。dropoutは0.2にしました。

まずはこれを読ませる

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9

数分でlossが0.01ぐらいに。出力がこちら。

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9

次はこれ

ls
cd chainer/examples/ptb/
ls
tail log.txt -f
vi train_ptb.py
export PATH=/usr/local/cuda/bin:$PATH
python train_ptb.py -g 0 > log.txt &
rm model80000
vi train_ptb.py
ps aux|grep pytho
kill -HUP 14317
python train_ptb.py -g 0 > log.txt &
cd chainer/examples/ptb/
ls
export PATH=/usr/local/cuda/bin:$PATH
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py model70000 -g 0

出力

vi train_ptb.py
ps aux|grep pytho
kill -HUPP144317
python train_ptb.py -g 0 > log.txt &a
rm eel80000
vi train_ptbb2Hpy
ps aux|grep pytho
kill -HUP 14317
python train_ptb.py -g 0 > log.txt &
cd chainer/examples/ptb/
ls
tail log.txt -f

vi model80000
vi train_ptb.py
ps aux|grep pytho
kill -HUP nUnTptb
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py model700000 -g 0ls
cd chainer/l2.py
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py
python pred2.py
python pred2.py model70000 -g 0
vi pred2.py
python pred2.py
python pred2.py
python pred2.py model70000 -g 0ls
cd chainer/examples/ptb/

最初からサンプルコードに出力スクリプトがあるので楽です。

日本語は文字数が多すぎるので日本語を投げちゃうとあまりうまくいきません。rnn_sizeをかなり大きくする必要がありそうですが、自分のGPUだとメモリ2Gなので512が限界でした。
実例)文字を流し込むだけのRNNを試してみた - studylog
wikipedia日本語記事の1/500(6MB)を読ませてみましたけどあんまり日本語になりませんでした。
ただ読ませれば読ませるほどちゃんと括弧を閉じ出したりするので生き物みたいで観察してて飽きません。少しいじれば単語単位のRNNにもできますし、これ楽しいです。