EncoderDecoder で日英翻訳をしてみた (その2)

前回 は基本となる EncoderDecoder を紹介した。 この記事では、Attentionと呼ばれるテクニックを紹介する。

Attention

EncoderDecoder では、Encoder から Decoder に渡されるのは、ひとつの固定長ベクトルだけだった。 入力系列がどんなに長かったとしても、Decoderは、この固定長のベクトルのみから出力系列を構築する必要がある。 いくら LSTM の性能がよいとはいえ、このアーキテクチャで長い入力系列を扱うのは無理があるように思える。

この課題に対処するために、Decoder が、入力情報をより直接的に利用する Attention と呼ばれる手法を導入する。 Attention には様々なバリアントが存在するが、ここでは Luong 2015 で提案された、input feeding なしの global attention model を説明する。 (オリジナルの attention よりも実装が簡単なので)

このモデルを図示すると以下のようになる。

f:id:nojima718:20171016224714p:plain

Decoder や Attention Layer を全部書いていると図がカオスになるので、Decoder と Attention Layer に関しては t番目のユニットだけを図示した。

このモデルにおける t番目のDecoderユニットの出力は、以下のように決まる:

 t 番目のユニットの LSTM の出力を  {\bf h}_t とする。 各 i ( i = 1, \ldots, T_x) について、 i 番目の \mathrm{LSTM}_E の出力  {\bf \bar{h}}_i {\bf h}_t から重み  \alpha_i^{(t)} を計算する。

{ \displaystyle
  \alpha_i^{(t)} = \frac{                   \exp( {\bf h}_t, {\bf \bar{h}}_i    ) }
                        { \sum_{i'=1}^{T_x} \exp( {\bf h}_t, {\bf \bar{h}}_{i'} ) }
}

 {\bf \bar{h}_i} \alpha_i^{(t)} を使って、文脈ベクトル  {\bf c}_t を以下の式で定める。

{ \displaystyle
  {\bf c}_t = \sum_{i=1}^{T_x} \alpha_{i}^{(t)} {\bf \bar{h}}_i
}

そして、 {\bf h}_t {\bf c}_t を連結したベクトルに対して、 W_C \tanh W_D \mathrm{softmax} を順に適用したものが Decoder の出力となる。 (隠れユニットの次元を  V_H、出力言語の語彙を  V_D としたとき、 W_C 2 V_H から  V_H へ次元を落とす線形レイヤーであり、 W_D V_H から  V_D へ次元を上げる線形レイヤーである)

実装

hatenablog では、コードフェンスと数式を同じページに書くと、一部の数式の表示がバグることがわかったので、実装の説明は次のページで行う。