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