LLMファインチューニングのためのNLPと深層学習入門 #5 seq2seq with attention

今回は、CVMLエキスパートガイドの『seq2seq with attention』を勉強していきます。

1. 概要

seq2seq with attentionは、seq2seqにアテンション機構を追加して拡張することで、変換精度と解釈性を向上させた系列対系列変換モデルです。

このモデルは、機械翻訳以外にも画像のキャプショニングやテキストからの音声合成(Text-to-Speech)など、系列間ドメイン変換やモーダル間系列変換で広く応用されています。
さらに、もともとseq2seq向けに登場したアテンション機構ですが、その後汎用的な拡張機構として応用されていきます。

よって、seq2seq with attentionは、ディープラーニング界隈で最も重要な進歩の一つと言えるでしょう。
ただし、皆さんも知っている通り、Transformerの登場以降、多くの系列対系列変換問題ではTransformerを用いるのが主流となってきています。

プレーンなseq2seqとの違い

seq2seq with attentionでは、デコーダRNN側で次の単語を毎フレーム予測する際、エンコーダRNN側の各入力単語へのアテンション係数を、単語間の類似度計算的なスコア関数(後述)から推定します。
各フレームでは、この関数によって適応的に変化するアテンション係数値を重みに用いて次の単語を予測します。

このように、毎フレームで異なるコンテキストを使用して単語予測ができるのが、アテンションなしの「プレーンな」seq2seqとの違いです。

アテンション機構がどのようにseq2seq with attentionで使われているのかについてはこの後に解説するので、現時点では

  • seq2seqにアテンション機構を導入したことで、毎フレーム異なるコンテキストを使用して単語予測ができるようになった

  • これにより、予測の正確性と文脈の解釈能力が高まった

だけ押さえておけばいいです。

2. soft attention

seq2seq with attentionには二つの一般系があります。

  1. hard attention
    argmaxで、最大アテンション係数値のベクトル1つだけをコンテキストベクトルとして採用する

  2. soft attention
    すべての入力単語ベクトルのアテンション係数による重みづけ和としてコンテキストベクトルを計算する

このように各論文では呼び分けています。

3. seq2seq with attentionの予測手順

ここでは、seq2seq with attentionの単語予測の手順について説明していきます。

図1:seq2seq with attention
seq2seq with attentionより引用

図1はseq2seq with attentionの図解です。
seq2seq with attentionの予測手順は次の3手順で構成されます。

  1. seq2seqの予測系列の、現ステップ$${i}$$の潜在変数ベクトル$${h_i}$$から、隠れベクトル$${h_{i+1}}$$を予測したい。

    • $${h_i}$$に対する、入力文章中の各単語の隠れ特徴$${s_j}$$のアテンション係数$${a_j(i)}$$を、スコア関数(後述)を用いて予測する

    • アテンション係数$${a_j(i)}$$を関連度スコア(relevance score)と呼ぶこともある。

  2. アテンション係数で重みづけされた新しい特徴ベクトルのコンテキストベクトル$${c_j}$$を計算する

    • $${{c_j}=a_j{(1)}s_1 + a_j{(2)}s_2 + … + a_j{(N)}s_N}$$を計算

    • $${c_j}$$も新たにDecoderの入力として加え、次のフレーム$${i+1}$$の潜在変数$${h_{i+1}}$$を、Decoderで予測する。

    • その後、$${h_{i+1}}$$から単語$${y_{i+1}}$$も予測する。

  3. 上記1と2の手順を、<EOS>が次の単語として予測されるまで繰り返す。

なお、$${a_j(i)}$$は重みづけ係数であるので、N個の$${a_j(i)}$$の合計が1になるように正規化する必要があります。

$$
\sum_{j}^N{a_j(i)} = 1
$$

次に、手順1と手順2の詳細を説明します。

手順1:

$${a_j(i)}$$の算出の際、まずスコア関数から$${score(s_j, h_i)}$$を、N個の$${s^{(j)}}$$に対して全て計算します。

ここで、毎フレームでのアテンション係数が、全体として1つの確率分布を形成するようにしたいので、softmax関数を用いて、すべてのアテンション係数の和が1になるように正規化します。

$$
a_j{(i)} = \frac{exp(score(s_j, h_i))}{\sum_j^Nexp(score(s_j, h_i))}
$$

まとめると、手順1では、入力系列の補助入力ベクトルN個(コンテキスト)に対して、類似度スコア関数$${score(s_j, h_i)}$$で現在のステップの潜在変数ベクトルと入力文章中の各単語の隠れ特徴との関連度を計算したのち、それらにsoftmaxを適用した$${a_j(i)}$$を最終的なアテンション係数として算出します。

図1:(再掲)seq2seq with attention
seq2seq with attentionより引用

手順2: 

手順2では、アテンション係数で重みづけしたコンテキストベクトルを作成し、それを補助入力としてメインの推定ネットワークの入力に送ります。

  • アテンション係数$${a_j(i)}$$を用いて、全入力単語埋め込みベクトルの重みづけ和としてコンテキストベクトル$${c_i}$$を計算する。

  • 次に、その$${c_i}$$を次の単語の予測時に補助入力ベクトルとして用いる。
    これにより、入力全体のコンテキスト(重みづけ)も加味して、次の単語の予測を行えるようになる。

アテンション機構なしのプレーンなseq2seqでは、入力文章全体が「最後の隠れベクトル1つのみに固定して」エンコードされました。
それに対し、seq2seq with attentionでは、出力予測の毎フレームでアテンション値に沿って注意先の入力単語が適応的に変化するコンテキスト特徴ベクトルを使用することができます。
※コンテキストベクトルがアテンション値によって毎フレーム変化するため

4. seq2seq with attentionに用いる「スコア関数」の例

単語間の予測への関連度をアテンション係数として学習する「スコア関数」のサブネットワークには、例えば[Luong et al. 2015]だと以下の3種類が試されています。

  1. $${score(s_j, h_j) = s_j \cdot h_i}$$
    これはドット積を使用しており、学習不可なので、関数の外に線形層を設けます。

  2. $${score(s_j, h_j) = s_j \cdot W_ah_i}$$
    バイリニアモデル。学習可能

  3. $${score(s_j, h_j) = v_a^Ttanh(W_a[s_j;h_i])}$$
    ベクトル結合。学習可能

これらの関数の形を見ると分かるように、スコア関数は2つのベクトル間の距離尺度のような関連度を学習させるための単純な関数を用意しています。

初期のsoft-attentionでは、このような単純なベクトル同士の足し算や掛け算をスコア関数として設定し、アテンション係数を予測します。
このスコア関数は設計時に自由に決められます。

もちろん上記のようなスコア関数ではなく、3層や4層からなるニューラルネットワークを使用してもかまいません。

5. コンテキストベクトルの利点


図2. フレームごとに適応的に変化するコンテキストベクトル$${c_i}$$ をDecoderに受け渡す様子.
CVMLエキスパートガイドより

図2はフレームごとに異なるコンテキストベクトルを各フレームで計算してデコーダに受け渡している様子を大まかに示した図です。

以前のseq2seqでは、Encoderの最後のフレームMの1つの潜在状態$$s_M$$のみ、デコーダへ渡していました。
それがseq2seq with attentionでは、次の単語を予測するのに適切なアテンションを用いて動的にコンテキストベクトルを変化させるため、そのときそのときの文脈に応じた単語予測が可能となりました。

おわりに

今回はseq2seq with attentionについて勉強しました。
筆者的にはアテンションはどう計算されるのか、それがコンテキストにどう影響するのかが気になっていたので、結構面白かったです。

それと、本記事を学習しているうちにLangChainのEmbeddingsのような技術についても、どのような理屈で動いているのかを理解できた気がします。
入力文章のアテンションに基づいて計算したコンテキストベクトルと、DBのエントリやWebページのコンテキストベクトルとの類似性を計算したら確かに入力に応じた参考情報を動的にプロンプトに加える仕組みが実現できますね。

次はTransformerの中心的な部分であり、Transformerの理解に欠かせないマルチヘッドアテンションについて学んでいきます。
それでは。

参考

この記事が気に入ったらサポートをしてみませんか?