差分

ナビゲーションに移動 検索に移動

Self-Attention

1,824 バイト追加, 2024年4月11日 (木)
ページの作成:「'''Self-Attention'''とは、Transformerの中核となっている部分です。 == 擬似コード == Self-Attentionの基本的な構造は以下のように表…」
'''Self-Attention'''とは、[[Transformer]]の中核となっている部分です。

== 擬似コード ==
Self-Attentionの基本的な構造は以下のように表現できます。
なお、このコードはPythonの擬似コードであり実際には動作しません。
<source lang="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
</source>

[[category: 人工知能]]

案内メニュー