Google機械翻訳の仕組み&できるようになったこと/まだ難しいことについて、社内の機械学習勉強会で説明します

社内の機械学習勉強会で最近話題になった機械学習関連のエントリを取り上げているのですが、ここ一ヶ月ではGoogle Neural Machine Translation(GNMT)がとても話題になっていました。GNMTで使われているEncoder-Decoderやattentionのような仕組みを直近で使う予定は特にはないですが、機械学習を使うエンジニアとして知っておいて損はないし、技術的に何が変わったことにより何ができるようになって、何はまだできないのかを知ろう、というのが目的です。技術的な項目は興味ない人も多そうなので、最後に持っていきました。

Google Neural Machine Translation(GNMT)の最近の進化について

後述するようにまだまだ問題はあるけど、体感的に変化がありました。GNMTが公開された3日後くらいにはMSも翻訳をNMTにしていて、業界の変化の速さに青ざめました...。特に流暢性が上がったようです。

できるようになったこと

定量的な評価

Googleの論文から引用しますが、これまでの機械翻訳のシステム(Phrase-Based MT)と人手評価で比較すると、かなり改善しているのが分かります(0(complete nonsense)から6(perfect translation)で高いほうがいい翻訳を表わしている)。日本語⇔英語だとChinese⇔Englishと近い進化なのかな...?

f:id:syou6162:20161123213515p:plain

まだまだ難しいこと

  • 同じ単語を吐きまくる。GMTならではの問題といえそう。なぜこういうことが起きるかは技術的詳細のところを見てください

  • 数字や固有名詞をアグレッシブに変えてくる

  • GNMTに限らないけど、tokenizerの問題。形態素解析まではまとめてやっていない様子

  • 主語が落ちている文の翻訳。主語を補完するとうまくできるようにはなる
    • 語順はそれほど問題にならなくなってきたというのはすごい

技術的な詳細

ここからが本題。より詳しく知りたい方は以下のarXivに上がっている論文を見るのが適切かと思います。今回はおおざっぱに知りたかったので、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です。図は論文より引用。

f:id:syou6162:20161123210551p:plain

単語のインデックス毎にencoderの出力がありますが、それを重み付きで足し合わせることにより、どの単語を重視するべきかという情報をdecoder側は取り込むことができます。この重みは出力結果を解析する際にも訳に立ち、どの単語がどの単語に(ソフトに)訳出されているかが分かるというメリットがあります。図は再び論文より引用。

f:id:syou6162:20161123210936p:plain

Bi-directional encoder layer

Encoder-decoderモデルは文を左から右に見る(Forward方向)ことにより文全体を表現するような隠れベクトルSを作っていました。文末に近いencoderの出力は文頭の情報を取り込むことはできますが、文頭のencoderの出力では文末の情報を取り込むことはできません。この問題を解決するためにLSTMで文を右から左になめていき(Backword方向)、2つの隠れベクトル(+attention)でdecoderを走らせればよさそうです。この方法は両方向からやるので、Bi-directional encoderと呼ばれます。attention + Bi-directional (+ビームサーチ)により、文長が長くなっても精度はあまり下がらず翻訳できるようになってきました。図は再び論文より引用。

f:id:syou6162:20161123212051p:plain

"The deep is for deep learning"

いわゆるdeepにするアレです。encoder側に8層、decoder側に8層と積むことによって実現されているようです。その他、residual等々ありますが、おおざっぱに説明するにはこの辺でいいかなと思うので、終わります(疲れた)。

感想

これまでの自然言語処理の基礎技術(係り受け解析や固有表現抽出、照応解析、言語モデルなど)は翻訳に代表される応用技術で役に立つ!ということで頑張ってきた部分が大きかったと思いますが(私も談話構造解析を少しやっていたので...)、応用側がencoder decoderのようなend2endで現実的に解かれるようになると自然言語処理でこれまで作られてきたエコシステムがうまく回らなくなる部分も出てくるのかなと思うところもありました。

自然言語処理の基本と技術

自然言語処理の基本と技術

  • 作者: 奥野陽,グラム・ニュービッグ,佐藤敏紀,萩原正人,前澤敏之,小町守,イノウ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2015/05/20
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (6件) を見る