studylog/北の雲

chainer/python/nlp

Chainer1.4.0がリリースされました

主にバグ修正、CuPy関係の機能追加のようです。
モデル構造変更、公式保存方法などの実装は一ヶ月後の1.5.0になりました。

主な変更点はこちら
https://groups.google.com/forum/#!topic/chainer/bnfSQpAux7M
https://github.com/pfnet/chainer/issues?q=milestone%3Av1.4.0+is%3Aclosed

あまり変更点を追えていないのですが一応メモ。

Restore cuda.init()

Restore cuda.init · Issue #456 · pfnet/chainer · GitHub
1.3.0でcuda.init()が必要なくなった関係で互換性が失われていました。
参考
chainerメモ10 AttributeError: 'module' object has no attribute 'init' - 北の雲のstudylog

1.4.0からは1.3同様に必要は無いけれど、もしcuda.init()があっても互換性維持のためdeprecatedを出すだけでエラーで落ちなくなりました。

CuPy any,all,where,count_nonzero等が追加

これが1.4.0の一番の変更点かも。
CuPyがますますパワーアップしてNumpy互換性が増しました。

Connectionist Temporal Classification(コネクショニスト時系列分類法)

https://github.com/pfnet/chainer/pull/280
凄くかっこいい名前。玄人っぽい。

青い深層本、P126に載っているやつです。
「入出力間で系列長が違う問題を隠れマルコフを使わずに解決する」ものだそうです。
主に音声認識に使われているようです。

イメージとしては、人間が「あいうえお」と発した時に「あ」や「い」の長さは微妙に異なるはず。

  • 入力はこんな感じ

あああ いい うううう えええ おお

  • でも出力はこうしたい

あ い う え お

これを隠れマルコフではなくニューラルネットワークで処理したい場合に使うと解釈しました。
音声以外にも使い道はありそう。

コード
https://github.com/pfnet/chainer/blob/d51c33fc20ff59a25a6b58af29ff022d156cfeb9/chainer/functions/loss/ctc.py
論文
ftp://ftp.idsia.ch/pub/juergen/icml2006.pdf
P44あたりから少し解説
http://ibisml.org/archive/ibis2013/pdfs/ibis2013-kubo.pdf

Softmax cross entropyのignoreフラグ(-1)

https://github.com/pfnet/chainer/pull/500
Softmax cross entropyの正解データに-1を与えると0が返ってくるようになったようです。
バッチ処理したいけど系列長が異なる自然言語で、系列を合わせるために短い文の末尾を-1で埋めちゃえばSoftmax cross entropyに投げてもその部分は0が返ってきてくれるし、計算もしないから処理も速いのかな。
今まではEOSを表すintで埋めてたのでこれは地味に嬉しいかも。

(追記)試してみたのですがGPUだとNANが返ってきちゃいます。これは1.3以前と同じ挙動。CPUだと大丈夫。自分の問題なのかchainerのバグなのか。自分の勘違いでそもそもこういう使い方じゃないのかも。

(2016.1.8 再追記)原因が判明。-1を正解データ(y)じゃなくて学習データ(x)に投げてる箇所があったため。一つずつずらしていくと、どうしてもxに-1が出てきちゃう。
というかEmbedIDに-1を投げても値が返ってくるのは何故なんだろう。ついでにEmbedIDの数を超えててもGPUだとなぜか返ってくる。CPUはちゃんとエラー出てくれる。こっちに詳しく書きました。
studylog.hateblo.jp