「Self-Attention」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) (ページの作成:「'''Self-Attention'''とは、Transformerの中核となっている部分です。 == 擬似コード == Self-Attentionの基本的な構造は以下のように表…」) |
Administrator (トーク | 投稿記録) |
||
6行目: | 6行目: | ||
<source lang="python"> | <source lang="python"> | ||
def self_attention(input, mask=None): | def self_attention(input, mask=None): | ||
+ | |||
# Query, Key, Valueの計算 | # Query, Key, Valueの計算 | ||
# まず入力からQuery、Key、Valueを計算します。 | # まず入力からQuery、Key、Valueを計算します。 |
2024年4月11日 (木) 01:33時点における最新版
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