こんな夢を見た

修士学生による自然言語処理研究の記録。主にDeep LearningやEmbedding関連論文の軽い自分用まとめとして。内容に誤りが含まれている場合があります。お気軽にご指摘ください。

Sequence to Sequence Learning with Neural Networks

Sequence to Sequence Learning with Neural Networks
Ilya Sutskever, Oriol Vinyals, Quoc Le, NIPS 2014

不定長のシーケンス(単語列)を入力に不定長のシーケンス(単語列)をLSTMで出力。
機械翻訳の翻訳元の文を(深層の)LSTMで読み取っていって、その後に先の文を一単語ずつ出力していく形式。単語ではなく、""という文終了シンボルが出力されたらそこで打ち切り。それによって出力側の不定長にも対応。出力時には最初は入力文ベクトルを受け取って1単語目を出力、次にそのときのmemory cellに残ったベクトルと「さっき出力した(1単語目の)単語ベクトル」を入力として2単語目を出力、以下繰り返し。学習時には「さっき出力した単語」ではなく逐次「さっき出力すべきだった正しい単語ベクトル」を入力にする。
ちなみに入力文のエンコード用LSTMと出力用のLSTMは別ものとして学習するし使用する。

一単語ずつ出力する、と書いたが、実際には毎回各単語に対して(ソフトマックスで)出力確率を求めて、その最大確率をとるものを出力している。このときに最大確率だけでなく、k-bestの単語をとっていくビームサーチを行って、最終的な複数の単語列のうちでスコア最大のものを出力文として決定することもできる。そうした方が結果はよかった。処理時間はもちろん多めにかかる。(見落としただけかもしれないが、ビームサーチ時の最終的な単語列スコアをどう求めるかは書かれていなかった。単純な確率積だと「長い単語列が著しく確率的に不利になる問題」が起きてしまいそうだが、何か解決策があるのだろうか。昔何かで読んだような……)

また、おそらく今までやられていなかった試みとして「入力文を逆順にして読み取る」ということが行われている。そしてそれは性能向上にかなり貢献している。翻訳前の文の文頭の情報ができるだけ残った状態で、翻訳後の文頭部分を出力できると考えると、似たような構文をもっている言語間であれば一般的に通用しそうだ。その辺の言語ごとの検証とか、誰かやってくれていないだろうか。

実験結果としてはstate-of-the-artの性能に迫った。このモデル単体でも良い性能が出るが、一番性能がよかったのは既存の機械翻訳のモデルで出力候補文上位1000件を用意して、それを本モデルでリランキングするというスタイルだった。どこか別の論文でもリランキングがとても上手く決まるというのを見た気がするので、生成的なDNNは(計算コストの面から見ても)リランキングモデルがかなりフィットしているのかもしれない。
入力文反転、アンサンブル、ビームサーチ、どれもばっちり性能向上に貢献していることが見れる結果で清々しい。コスパのよさでいうと、入力文反転>>>アンサンブル>ビームサーチとなりそうだ(学習計算量と実行時の計算量が入り交じっているが)。

LSTMが深層になっているのだけど、その構造がいまいち明確には書かれていないように思う。イメージはできたけど、それが本当に正しいのか不安。図がほしい。