社内の機械学習勉強会で機械学習関連で最近話題になったエントリを取り上げているのですが、ここ一ヶ月ではGoogle Neural Machine Translation(GNMT)がとても話題になっていました。直近でGNMTで使われているEncoder-Decoderやattentionのような仕組みを使う予定は特にはないですが、機械学習を使うエンジニアとして知っておいて損はないし、技術的に何が変わったことにより何ができるようになって、何はまだできないのかを知ろう、というのが目的です。技術的な項目は興味ない人も多そうなので、最後に持っていきました。
Google Neural Machine Translation(GNMT)の最近の進化について
後述するようにまだまだ問題はあるけど、体感的に変化がありました。GNMTが公開された3日後くらいにはMSも翻訳をNMTにしていて、業界の変化の速さに青ざめました...。
- Google Japan Blog: Google 翻訳が進化しました。
- Microsoft Translator launching Neural Network based translations for all its speech languages – Translator
- 機械翻訳と意味 - アスペ日記
できるようになったこと
いやこれどう見てもニューラル翻訳でしょ… pic.twitter.com/l5jMQ0WAgn
— Out-of-Domain Award (@odashi_t) 2016年11月12日
定量的な評価
Googleの論文から引用しますが、これまでの機械翻訳のシステム(Phrase-Based MT)と人手評価で比較すると、かなり改善しているのが分かります(0(complete nonsense)から6(perfect translation)で高いほうがいい翻訳を表わしている)。日本語⇔英語だとChinese⇔Englishと近い進化なのかな...?
I tried translating WAT's ASPEC-JE task with GNMT, and BLEU was 16.91 (old Google translated) -> 21.63 (GNMT) (translated by GNMT)
— Toshiaki Nakazawa (@Tzawa) 2016年11月14日
- WAT Evaluation
- コーパスへのチューニングなしで16位(組織的には3組織くらい)はすごい
- BLEUなどの評価の話についてはこの辺を読んでください
まだまだ難しいこと
言語選択ミスったら吹いたw pic.twitter.com/24OT3gTRI9
— kakira (飯テロ番長) (@kakira9618) 2016年11月13日
- 同じ単語を吐きまくる。GMTならではの問題といえそう。なぜこういうことが起きるかは技術的詳細のところを見てください
AIが割合変えてきた pic.twitter.com/B4DT6gN0Hp
— 小山浩之™ (@0yama) 2016年11月12日
- 数字や固有名詞をアグレッシブに変えてくる
— ビーム | Seiya Tokui (@beam2d) 2016年11月12日
- GNMTに限らないけど、tokenizerの問題。形態素解析まではまとめてやっていない様子(文字単位はまだ)
やっぱりGNMTでも主語が落ちると色々崩壊しますね。 pic.twitter.com/YMSjZ05Lj6
— Out-of-Domain Award (@odashi_t) 2016年11月20日
- 主語が落ちている文の翻訳
GNMTで久しぶりに意味不明なレベルの英文を見た。翻訳としておかしい以前に文としておかしい。 pic.twitter.com/nQe1K26nlO
— Out-of-Domain Award (@odashi_t) 2016年11月20日
なるほど pic.twitter.com/4MBaEFpPTK
— Out-of-Domain Award (@odashi_t) 2016年11月20日
技術的な詳細
ここからが本題。より詳しく知りたい方は以下のarXivに上がっている論文を見るのが適切かと思います。今回はおおざっぱに知りたかったので、NMTの仕組みを段階的に説明している こちらのブログを参考にしました。
- [1611.04558] Google's Multilingual Neural Machine Translation System: Enabling Zero-Shot Translation
- [1609.08144] Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation
- G社のNMT論文を読んでみた
- 京大中澤さんの解説
Encoder-decoder
- RNN: 現在の入力とこれまでの履歴から次の出力を決めるモデル
- 単語はword2vecのような技術を使って低次元の密ベクトルに埋め込む
- LSTM: RNNは学習時に勾配消失問題があったが、Forget Gateなど導入することによりこれを回避
- Encoder-decoderモデル: RNNの最後の出力を隠れ状態Sとして保持。SとNULLからDecoderを走らせて、1つ目の単語と次の隠れ状態を生成。それら2つを入力とし、さらに次の単語と次の隠れ状態を生成というのを繰り返す。EOS(文末記号)がくるまでこれを繰り返す
- NMTが同じ単語を吐きまくる原因はこの辺からきてる?
- decoderで吐くのは低次元密ベクトル。低頻度語や未知語はこのベクトルがきちんと学習されていないため、固有名詞が書き変わるような問題が起こる
- Encoder-decoder 翻訳 (TISハンズオン資料)
Encoder-decoderモデルの問題点としては、文長が長くなるにつれて後ろの履歴を表現するベクトルが怪しくなり、精度がどんどん落ちてしまうという問題がありました。
Attention based encoder-decoder
文長が長くなったときに、次に訳するのは元文のどこに注目(attention)すればいいかを陽に取り込んだのが、Attention based encoder-decoderです。図は論文より引用。
単語のインデックス毎にencoderの出力がありますが、それを重み付きで足し合わせることにより、どの単語を重視するべきかという情報をdecoder側は取り込むことができます。この重みは出力結果を解析する際にも訳に立ち、どの単語がどの単語に(ソフトに)訳出されているかが分かるというメリットがあります。図は再び論文より引用。
Bi-directional encoder layer
Encoder-decoderモデルは文を左から右に見る(Forward方向)ことにより文全体を表現するような隠れベクトルSを作っていました。文末に近いencoderの出力は文頭の情報を取り込むことはできますが、文頭のencoderの出力では文末の情報を取り込むことはできません。この問題を解決するためにLSTMで文を右から左になめていき(Backword方向)、2つの隠れベクトル(+attention)でdecoderを走らせればよさそうです。両方向からやるので、Bi-directional encoderと呼ばれます。attention + Bi-directional (+ビームサーチ)により、文長が長くなっても精度はあまり下がらず翻訳できるようになってきました。図は再び論文より引用。
"The deep is for deep learning"
いわゆるdeepにするアレです。encoder側に8層、decoder側に8層と積むことによって実現されているようです。その他、residual等々ありますが、おおざっぱに説明するにはこの辺でいいかなと思うので、終わります(疲れた)。
感想
これまでの自然言語処理の基礎技術(係り受け解析や固有表現抽出、照応解析、言語モデルなど)は翻訳に代表される応用技術で役に立つ!ということで頑張ってきた部分が大きかったと思いますが(私も談話構造解析を少しやっていたので...)、応用側がencoder decoderのようなend2endで現実的に解かれるようになると自然言語処理でこれまで作られてきたエコシステムがうまく回らなくなる部分も出てくるのかなと思うところもありました。