オムライスの備忘録

数学・統計学・機械学習・プログラミングに関することを記す

【深層学習】seq2seq / Encoder-Decoder Model #アルゴリズム編 #03

この記事の読者


深層学習・ディープラーニングのタスクの1つである「文章生成」について
その1つのアルゴリズムとである「seq2seq / Encoder-Decoder Model」の改善手法「Attention」について知りたい.

Index

Attention とは

seq2seq の改善手法のひとつとして「Attenion」がある.

入力の情報と重要度を抽出する情報が異なるので「Source Target Attention」、 また、複数のベクトルから重要度の情報を抽出するため「Soft Attention」 のような部類になる.

メリット

「猫 = cat」というような対応関係 (=アライメント / alignment) を自動で取り入れるための改良手法.

seq2seq の問題点

seq2seq の問題点として、以下のようなものが考えられる.

  • どんなに Encder への入力が長かろうが、短ろうが、Encdoer が Decoder に与える情報が固定長であるということ
  • 系列が長くなるほど、情報の伝達がうまく行われない

改善手法

Encoder と Decoder それぞれの改善手法を記す.

Encoder

1 . Encoder の隠れ状態をすべて使用する

Decoder

2 . Encoder の各時系列情報 (=時系列ごとの隠れ状態)をもとに、 Decoder の各時系列への入力情報と関連のある、または対応している情報を取得できるシステムを用意する (=Attention)

Attention の仕組み

「Encoder の各時系列情報 (=時系列ごとの隠れ状態)」から、Decodr の各時系列ごと対応した情報を取得する方法を記す.

コンテキスト ベクトル

各時系列ごとの隠れ状態ベクトル重要度・貢献度のようなものを計算することから始める.



この重要度・貢献度がベクトルで求めることができれ、行列ごとの積演算を行うことで、 対応している情報のみを抽出・取得することが可能.

取得したベクトルを「コンテキスト ベクトル」と呼ぶ.



このコンテキスト ベクトル を Decoder 内の RNN レイヤの次のレイヤに渡す.

重要度ベクトル

ここまでは、コンテキスト ベクトル の取得方法.

しかし、重要度ベクトルはどのように計算するのか.

Decoder には、各時系列ごとの計算に使用される RNN (セル) レイヤがあり、 それらは、前時刻 (最初の場合は Encoder から) の隠れ状態と 入力情報を受け取り、次時刻へ情報を出力する.

この出力のベクトルが、Encoder の隠れ状態 (全時刻の隠れ状態行列)の中の、 どのベクトルと類似しているかを重要度とみなす.

その類似度の計算を行列とベクトルの内積演算を行うことで計算する.

(類似度を計算する方法は内積が使用されるケースが多いが、他の方法で計算する研究も.)

コンテキスト ベクトル の使い方

Decoder の RNN レイヤの次のレイヤ(Dense / Affine レイヤ)には、 前レイヤの RNN の出力(Peeky を適用すれば、+ Encoder の最後の隠れ状態)を入力していたが、 コンテキストベクトルも情報として連結して利用する.

Peeky では、RNN の出力に Encoder の最後の隠れ状態を連結しただけだが、それの代わりに、 Attention で Encoder の全ての隠れ状態から必要な情報を抽出したコンテキストベクトルを使用することでよりEncoder の情報を有効に利用できる.



まとめ

  • seq2seq の改善方法のひとつとしてAttention が使用される.
  • Encoder の情報を有効に使うために、以下のような工夫をする
    • 全ての隠れ状態を利用する.
    • Decoder の入力情報と対応関係のあるEncdoer の情報のみをコンテキスト ベクトルとして、取得し利用する.
    • コンテキスト ベクトル の計算方法に、入力とEncoder の情報との類似度を利用する

参考

  • Effective Approaches to Attention-based Neural Machine Translation
    • [2015]
    • 翻訳タスクの seq2seq に attention を適用する論文
    • arxiv.org

書籍