Attention Mechanism


1.注意力メカニズムの直観的な理解と出現背景


1.1直感的理解


次の文があります.

もし私たちがこの文章だけを読むとき、私たちの認知システムは「食べた」という動詞と何を食べたかに関する名詞であるとしたら、ここでは一般的に「チキン」に気づくことが容易に予想できる.これに対して、「食べた」を表す動詞と、どのような唐揚げを表す「校村」という言葉は、「唐揚げ」より相対的に集中度が低い.
この概念は次のようにも理解できます.深さ学習における注意力は,どの情報が重要であるかを決定するために重み付けベクトルとして広く解釈できる.画像内の画素や文の単語などの要素を予測または推定するために,注意力ベクトルを用いて他の要素との相関がどれほど強いかを推定した.ある意味では、この簡単で簡単な概念は今まで続いているので、私たちはこの概念に「注目」しなければなりません.

1.2登場背景



[ソース]:https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/lecture_notes/Transformer.pdf
上の図に示すように、注意された概念が現れる前に、RNN、LSTM、およびSeq 2 Seqモデルのような自然言語処理の分野にいくつかのモデルが存在する.

しかし,上記モデルの致命的な欠点は,固定長のコンテキストベクトル(Context Vector)を用いて残りの長い文を記憶できないことである.すなわち,文章全体の情報を一定サイズのベクトルに圧縮するため,表列データの特性上,前のデータの情報は通常忘れられる.これらの理由により、この問題を解決するための注意メカニズムが現れます.(バタナウなど、2015).

2.注意メカニズムの定義


注意メカニズムは,機械翻訳の分野で長入力シーケンスの記憶をよりよく保つために誕生した.既存のSeq 2 Seqモデルでエンコーダの最後の非表示状態から単一のコンテキストベクトルを構築する従来の方法とは異なり、図に示すように、予測デコーダから出力される単語の各時点(timestep)でエンコーダ内の完全な入力文を再度参照する.

[ソース]:https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html
では、その予測単語に関連する単語をどのように集中させるかの具体的な方法について説明します.
実際、注意メカニズムにはいくつかの方法があります.

[ソース]:https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html


ここではBahdano,2015,Transformerで使われているSelf-ATtentionの概念を紹介します.

Bahdanau Attention


Bahdano paperでは、下図をもう一度思い出しましょう.

[ソース]:https://arxiv.org/pdf/1409.0473.pdf


YtY{t}Yt:timetでDecoderのtarget word
XjX{j}Xj:Encoderでのinputword
hjh{j}hj:jから入力へのエンコーダ非表示状態
StS{t}St:timetでは、Decoderの隠し状態を表します.

数式が現れました.それぞれの数式を図に結びつけてみましょう.
i:現在のデコーダで処理中のインデックス
j:各エンコーダ出力インデックス
まず,eije{ij}eijはエンコーダのjビットのすべての出力値とデコーダのi−1ビットhiddenstatesとの間のattention scoreを求める.このようにエンコーダのどの位置の値が最大に相関するかを求める.次のeije{ij}eijはsoftmaxをとることによって確率値で表される.
ではここの核心はeije{ij}eijです.これはBahdano Attentionが提案した方法で、具体的な修飾は以下の通りです.

単純にtanhを活性化関数として用い,WAWa}WAとUAU a}UAは重み付け行列である.重み付け行列と「加算」をそれぞれ乗算し,vav{a}vaのパラメータに乗算し,最終的な注意スコアを求める.
求めた各attenton scoreをaija{ij}aijのような確率値に変換し、contextベクトルを以下のように求めた.

これにより、出力単語の各時間ステップがデコーダで予測され、コンテキストベクトルが得られ、エンコーダ内の入力文全体が再び参照される.
以下をコードで表す
class BahdanauAttention(Attention):
    """
    Attention > Additive Attention > Bahdanau approach 
    Inputs:
        query_vector: (hidden_size)
        multiple_items: (batch_size, num_of_items, hidden_size)
    Returns:
        blendded_vector: (batch_size, item_vector hidden_size)
        attention_scores: (batch_size, num_of_items)
    """
    def __init__(self, item_dim, query_dim, attention_dim):
        super(BahdanauAttention, self).__init__(item_dim, query_dim, attention_dim)
        print("Attention > Additive > Bahdanau")
        # parameter definition
        
        # W is used for project query to the attention dimension
        # U is used for project each item to the attention dimension
        self.W = nn.Linear(self.query_dim, self.attention_dim, bias=False)
        self.U = nn.Linear(self.item_dim, self.attention_dim, bias=False)
        
        # v is used for calculating attention score which is scalar value
        self.v = nn.Parameter(torch.randn(1, attention_dim, dtype=torch.float))

    def _calculate_reactivity(self, query_vector, multiple_items):
        B, N, H = multiple_items.shape  # [B,N,H]

        # linear projection is applied to the last dimension
        s = query_vector.unsqueeze(1)
        sum = F.tanh(self.W(s) + self.U(multiple_items))
        # note that broadcasting is performed when adding different shape
        
        batch_v = self.v.transpose(0,1).expand(B,self.attention_dim,1)
        reactivity_scores = torch.bmm(sum,batch_v).squeeze(-1)

        return reactivity_scores

Self-attention


つまり、同じ文の中の単語と単語の関係を身につける意味を受け入れれば、それは容易になるということです.これについてTransformerでより詳しく説明します.次の図は自己注意を示しています.

[ソース]:https://arxiv.org/pdf/1601.06733.pdf

実習コードリンク


Bahdano Attentionを用いた実験コードは以下の実験室で見つけることができる.
https://colab.research.google.com/drive/1ye0XZGTXI78xn30yRUn5-nv8Mu1mSIUW?usp=sharing

参考資料


https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html
https://arxiv.org/pdf/1601.06733.pdf
https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice