2017年3月15日水曜日

Google翻訳のアーキテクチャー(3) Attention Mechanism

新しいGoogle翻訳の元になった論文


新しいGoogle翻訳のシステムは、全く新しいアイデアに基づいてスクラッチから作り上げられたものではない。 その基本的なアイデアは、2016年の5月にarXivに投稿された次の論文に多くを負っている。(Google Brainのチームが、新しいシステムを6ヶ月で仕上げたと言っていることと、符合する。)

Bahdanau, D., Cho, K., and Bengio, Y. “Neural machine translation by jointly learning to align and translate”  https://goo.gl/HZxbNH 

「近年、ニューラル機械翻訳として提案されたモデルは、多くの場合、Encoder-Decoderのファミリーに属している。そこでは、ソースの文が固定長ベクトルにエンコードされ、そこからデコーダが 翻訳文を生成する。この論文では、固定長ベクトルの使用が、この基本的なEncoder/Decoderアーキテクチャの性能を改善する上でのボトルネックになっていると推論し ... 」

先に見た、Ilya Sutskever らの翻訳システムでは、翻訳されるべき文は、Encoderで、一旦、ある決まった大きさの次元(例えば8000次元)を持つベクトルに変換される。このベクトルからDecoderが翻訳文を生成する。入力された文が、長いものであっても短いものであっても、中間で生成され以降の翻訳プロセスすべての出発点となるこのベクトルの大きさは同じままだ。このシステムでは、長くても短くても入力された文全体が、一つの固定長のベクトルに変換されるのだ。

確かに、そこは翻訳の精度を上げる上でのボトルネックになりうる。事実、Ilya Sutskever らのシステムでは、文の長さが長くなるにつれて、翻訳の精度が低下されるのが観察されるという。

それでは、どうすればいいのか?

「モデルに自動的に、ターゲット・ワードを予測するのに重要なソース・文の一部分について、 (ソフト)検索を可能とすることによって、これを拡張することを提案する。その際、これらの部分を明示的にハードセグメントとして形成する必要はない。」

Attention Mechanism


文全体に一つの固定長のベクトルを割り当てるのではなく、翻訳時に、ソース・文の一部分を 改めて見直して、その部分から提供される情報を翻訳に生かそうということだ。

次の図を見て欲しい。





「ここで、yはデコーダによって生成された翻訳された単語であり、xは原文の単語である。上記の図は双方向のリカレント・ネットワークを使用しているが、それは重要ではない。逆方向は無視していい。重要な部分は、各デコーダの出力するワード $y_t$が、Encoderの最後の状態だけでなく、すべての入力状態の重みづけられた結合に依存することである。 aは、出力ごとに、それぞれの入力状態をどの程度考慮されるべきかを定義する重みである。したがって、$a_ {3,2}$が大きい場合、これは、Decorderがターゲット文の第3の単語を生成しながら、ソース文の第2の状態に多くの注意を払うことを意味する。 aは、通常、1に合計されるように正規化される(それらは、入力状態に対する確率分布である)。」
このシステムでは、Encoderが、入力のシーケンスをAnnotationのシーケンス $(h_1, h_2 , \cdots , h_{T_x} ) $に変える。この図では、Annotation $h_i$の名前は、直接には書き込まれていない。上下に並んだ $\overrightarrow{h_i}$ と$\overleftarrow{h_i}$ を囲む四角が書かれているのだが、この四角が $h_i$である。(この論文では、右向きの隠れ層の状態$\overrightarrow{h_i}$ と左向きの隠れ層の状態 $\overleftarrow{h_i}$の「連結」として実装されている。)

Docorderが、入力の$(x_1, x_3, \cdots , x_T)$から、 $t$番目の語$y_t$ を生成しようとする時に、このAnnotationのシーケンス $(h_1, h_2 , \cdots , h_{T_x} ) $からの情報は、次の式で $c_i$に束ねられてDecoderに流れ込んでくる。
$$c_i = \sum_{j=1}^{T_x} \alpha_{ij}h_j $$
この$c_i$を、Contextと呼んでいる。

Decoderの内部状態 $s_i$は、先行するノードの内部状態$s_{i-1}$と先行するノードの出力$y_{i-1}$と、このContext $c_i$で決まるのである。
$$s_i = f(s_{i−1}, y_{i−1}, c_i)$$

「直観的には、 これは、DecoderにAttentionのメカニズムを実装する。Decoderは、ソースの文のいくつかの部分を、注意を払うべき文章だと決定する。Decoderに、Attentionのメカニズムを持たせることで、 Encoderは、ソース文内のすべての情報を固定長のベクトルにエンコードする負担から解放される。 この新しいアプローチにより、情報は、 Annotationのシークエンス上に広がって拡散することができ、その情報は、Decoderによって選択的に取り出すことができる。」

 Alignment Model 


Context $c_i$を定義している、それぞれのAnnotation $h_j$にかかる重み$\alpha_{ij}$は、次の式で定義される。
$$\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})} $$
先の図の$\alpha_{t,1}, \alpha_{t,2}, \cdots , \alpha_{t,T}$を全部足し合わせると、1になる。SoftMaxと同じだ。

$\alpha_{ij}$の計算の元になる、$e_{ij}$は、次のように計算される。
$$e_{ij} = a(s_{i-1}, h_j)$$
この指標$e_{ij}$(Alijgnment Modelと呼ばれる)は、入力のi番目付近と、出力のj番目付近が、うまくマッチしているかを示すものだ。$e_{ij}$は、Decoderの$i-1$番目の状態($y_i$を出力する直前の状態である)と、Encoderの$j$番目のAnnotation $h_j$で決まる。

次の図は、英語からフランス語の翻訳で、英語の入力の$j$番目の語と、フランス語の出力の$i$番目の語について、$\alpha_{ij}$の値をグレースケールで示したものである(白は1、黒は0)。



二つの言語の語順が、同じであれば、対角線上に、1が集まることになるのだが。

この図は、次の英語とフランス語の翻訳が、下線部分で、語順が逆になることを反映している。
The agreement on the European Economic Area was signed in August 1992 .  
L' accord sur la zone économique européenne a été signé en août 1992 . 
もっとも、Word Alignmentについては、90年代の「統計的機械翻訳モデル」においても、熱心に研究されていたので、こうしたアプローチは、新しいものではない。

Googleニューラル機械翻訳論文との比較


Googleの論文では、このAttentionの部分は、次のようになっている。

$$s_t= \it{AttentionFunction} ( \bf{y}_{i-1}, \bf{x})  \ \  \ \forall{t} ,  1 \leq t \leq M$$
$$p_t = exp(s_t) / \sum_{t=1}^M exp(s_t)   \ \ \ \forall{t} ,  1 \leq t \leq M$$
$$a_i = \sum_{t=1}^M p_t \cdot \bf{x}_t $$

基本的には、この論文と同じであることがわかる。

0 件のコメント:

コメントを投稿