EncoderDecoder で日英翻訳をしてみた (その2)
前回 は基本となる EncoderDecoder を紹介した。 この記事では、Attentionと呼ばれるテクニックを紹介する。
Attention
EncoderDecoder では、Encoder から Decoder に渡されるのは、ひとつの固定長ベクトルだけだった。 入力系列がどんなに長かったとしても、Decoderは、この固定長のベクトルのみから出力系列を構築する必要がある。 いくら LSTM の性能がよいとはいえ、このアーキテクチャで長い入力系列を扱うのは無理があるように思える。
この課題に対処するために、Decoder が、入力情報をより直接的に利用する Attention と呼ばれる手法を導入する。 Attention には様々なバリアントが存在するが、ここでは Luong 2015 で提案された、input feeding なしの global attention model を説明する。 (オリジナルの attention よりも実装が簡単なので)
このモデルを図示すると以下のようになる。
Decoder や Attention Layer を全部書いていると図がカオスになるので、Decoder と Attention Layer に関しては番目のユニットだけを図示した。
このモデルにおける番目のDecoderユニットの出力は、以下のように決まる:
番目のユニットの LSTM の出力を とする。 各 () について、 番目の の出力 と から重み を計算する。
と を使って、文脈ベクトル を以下の式で定める。
そして、 と を連結したベクトルに対して、、、、 を順に適用したものが Decoder の出力となる。 (隠れユニットの次元を 、出力言語の語彙を としたとき、 は から へ次元を落とす線形レイヤーであり、 は から へ次元を上げる線形レイヤーである)
実装
hatenablog では、コードフェンスと数式を同じページに書くと、一部の数式の表示がバグることがわかったので、実装の説明は次のページで行う。