Self-Attention

提供: MonoBook
ナビゲーションに移動 検索に移動

Self-Attentionとは、Transformerの中核となっている部分です。

擬似コード[編集 | ソースを編集]

Self-Attentionの基本的な構造は以下のように表現できます。 なお、このコードはPythonの擬似コードであり実際には動作しません。

def self_attention(input, mask=None):

    # Query, Key, Valueの計算
    # まず入力からQuery、Key、Valueを計算します。
    # これらはそれぞれ異なる全結合層(query_projection、key_projection、value_projection)によって計算されます。
    queries = query_projection(input)
    keys = key_projection(input)
    values = value_projection(input)
    
    # スコアの計算
    # 次にQueryとKeyの内積を計算しスコアを得ます。
    # このスコアは各入力トークンが他のすべてのトークンとどの程度関連しているかを示します。  
    scores = matmul(queries, keys.transpose())
    
    # スコアをスケーリング
    # d_kは内積が大きくなりすぎてSoftmax関数が非常に小さな勾配を持つようになる
    # (つまり、勾配消失問題が発生する)のを防ぐためのスケーリングファクターです。。
    # d_kは通常、Query、Key、Valueの次元数です。
    d_k = 64
    scores = scores / sqrt(d_k)
    
    # マスクを適用(必要な場合)
    if mask is not None:
        scores = scores.masked_fill(mask == 0, -1e9)
    
    # スコアを確率分布に変換
    # スコアをSoftmax関数に通すことで確率分布(attention_weights)を得ます。
    attention_weights = softmax(scores)
    
    # Valueとの重み付き和を計算
    output = matmul(attention_weights, values)
    
    return output