RNNを使った機械翻訳モデルで遊ぶ
この記事はDeep Learning Advent Calendar 5日目の記事です.
はじめに
皆様,ご無沙汰にしております.olanleedです.
とうとうAdvent Calendar以外でブログを更新しないダメな人間になってしましました.更新しようといろいろ考えてたのですが,学会やらジャーナルへの論文投稿などがあって,なかなか厳しいものがありました.
この12月は異常なまでにAdvent CalendarとLTを入れたので,怒涛の更新になりそうです.お付き合いください.
それでは本題に入りたいと思います.
RNNを用いた機械翻訳
Deep Learningが様々な分野で大きな成果を出している現在,統計的機械翻訳でもRecurrent Neural Network(RNN)を活用した研究が成功を収めています. 今回はRNN(LSTM)を用いた翻訳モデルの一つであるSequence to Sequence Modelを実装して遊んでみました.
Sequence to Sequence Modelの主要な構成要素であるRNN-LSTMについてはこちらをご覧下さい.
Sequence to Sequence Model(Seq2Seq)とは
seq2seqとは,異なる長さの翻訳元の単語列(Sequence)を入力とし,異なる長さの翻訳先の単語列(Sequence)を出力としてマッピングする手法です.
翻訳元の単語列ABCを4層からなるDeep LSTMで読み取っていき,隠れ状態ベクトルを求めます.End of Sentenceが来たら翻訳先の単語列WXYZを出力するような学習をさせます.この時,EncoderとDecoderとして利用するDeep LSTMは別々に学習させる必要があります.
seq2seqの著者は,性能を向上させるために
Decode時に単純なビームサーチを使用して,最も可能性の高い翻訳を探索する
5個のDeep LSTMを用いてEnsembleさせる
という手法をとっています.
しかし,それよりも単純かつ効果的な手法に「入力文を反転させる」というのがあります.翻訳元単語列ABCとあったら,CBAと読み込んでいき,翻訳先単語列WXYZを出力させる感じです.
もちろん,全部組み合わせたEnsemble+Beam Search+入力文反転が一番いい結果を出していますが,入力文反転だけでも十分な気がします.
似たような手法にRNN Encoder-Decoder Modelも存在します.こちらも読んでみるといいでしょう.
また,RNNのこういった手法は言語だけでなく画像にも使うことができ,CNNの出力をLSTMでエンコードすると,画像に対する説明文を生成できるRNNを実現することができます.
http://arxiv.org/pdf/1411.4555.pdf
Stanford University
https://cs.stanford.edu/people/karpathy/cvpr2015.pdf
翻訳モデルで何をするのか
seq2seqを使って素朴に機械翻訳をするのはあまりにも芸がないと考えたので,今回は「適当なタイトルを与えると,ライトノベルっぽいあらすじを生成する」というのを題材にしました.
翻訳元をタイトルにして,翻訳先をあらすじに設定します.
学習時の制約
ライトノベルのタイトルとあらすじは各レーベルから16000件以上集めました.しかし,今回は6000件くらいで試しています.レーベルにも偏りがあります.
時間の問題もあるため,元の論文では4層のLSTMを使ってますが,2層に減らす,Dropoutをしない,など学習時間をできるだけ短くしました.性能向上のアプローチも入力文反転のみです.
デモンストレーション
ライトノベルや漫画などから無作為に選んだ学習させてないタイトル,適当に思いついたタイトルを入力して,どのような出力が返ってくるか見てみたいと思います.
学習させてないタイトル
お兄様なら巨大な陰謀の解決など朝飯前ですね.
何となく,あらすじっぽい感じがします.
こんな壮大な世界観の作品でしたっけ...
「 ツンデレ な 」を予言する、とは?
異世界に転生する定めよ 漢
適当に思いついたタイトル
ラノベっぽい! けど話が転々としたり微妙に日本語になってなかったりしてますね.
急展開すぎる...
ちょっと哲学的過ぎますね...
課題
タイトルと関係してそうなあらすじは生成されていますが、そうでないのが多い感じがします.日本語になってない文書も見受けられます.
今回は制約が多かったので,今後は学習データを増やしたり,モデルを見直したりして実験してみたいと考えています.
また,翻訳元は文字N-gram,翻訳先は形態素N-gramでやってるのですが,こちらも文字N-gramにするかして,自然な日本語が生成できたらいいなと考えています.
なお,実装したモデルは会社から拝借したものであるためソースコードを公開することができません.ですが,GoogleのTensorflowにはseq2seqが実装されてるとのことなので,こちらを利用してみるといいかもしれません.
https://www.tensorflow.org/versions/master/tutorials/seq2seq/index.html
おわりに
学習に手間取ってましたが,5000円分のAWSクーポンあったので使えばよかった ~終~
次回は前半と後半に分けてRNNで文書のポジネガ判定をやってみたいと思います.お楽しみに.