Self-Attentionは、機械学習、特に自然言語処理(NLP)やコンピュータビジョンのタスクで使用される重要なメカニズムです。このメカニズムは、入力シーケンス内の依存関係や関係性を捉えることができます。
Self-Attentionの主な特徴と動作原理は以下の通りです:
- 入力シーケンスを3つのベクトル(クエリ、キー、バリュー)に変換します。
- これらのベクトルは入力の線形変換によって得られます。
- クエリとキーベクトルの類似性に基づいてバリューの重み付き和を計算します。
- 結果として得られた重み付き和と元の入力を、フィードフォワードニューラルネットワークに通して最終的な出力を生成します。
Self-Attentionの実装例をPythonコードで示します:
import numpy as np
def self_attention(x, W_q, W_k, W_v):
# クエリ、キー、バリューの計算
Q = np.dot(x, W_q)
K = np.dot(x, W_k)
V = np.dot(x, W_v)
# アテンションスコアの計算
scores = np.dot(Q, K.T) / np.sqrt(K.shape[1])
# ソフトマックス関数を適用
attention_weights = np.exp(scores) / np.sum(np.exp(scores), axis=1, keepdims=True)
# 最終的な出力の計算
output = np.dot(attention_weights, V)
return output
# 入力とウェイト行列の初期化
x = np.random.randn(5, 10) # 5つの要素、各10次元
W_q = np.random.randn(10, 8)
W_k = np.random.randn(10, 8)
W_v = np.random.randn(10, 8)
# Self-Attentionの適用
result = self_attention(x, W_q, W_k, W_v)
print(result.shape) # 出力: (5, 8)
このコードでは、Self-Attentionの基本的な実装を示しています。実際の応用では、多くの場合、複数のアテンションヘッドを使用するMulti-Head Attentionが採用されます。
Self-Attentionは以下の利点があります:
- 長距離依存関係の捕捉:シーケンス内の離れた要素間の関係を捉えることができます。
- 文脈理解:入力シーケンスの異なる部分に注目することで、文脈を理解し、各要素の関連性に基づいて適切な重みを割り当てることができます。
- 並列計算:シーケンスの各要素に対して並列に計算できるため、大規模データセットに対しても計算効率が高く、スケーラブルです。
Self-Attentionは、機械翻訳、テキスト要約、感情分析、質問応答などのNLPタスクや、画像分類、物体検出、画像キャプション生成などのコンピュータビジョンタスクで広く活用されています。