Up | Self-Attention | 作成: 2025-05-17 更新: 2025-05-24 |
記号法:
Self-Attention は,入力の
X = ( x_ij ) 1. Query, Key, Value の生成 入力 X(S) に,3 種類の重み行列 W_Q, W_K, W_V
Q = X(S) W_Q K = X(S) W_K V = X(S) ·W_V i 行で見ると:
K_i = x_i W_K : x_i に重み_K 付け V_i = x_i W_V : x_i に重み_V 付け Q, K, V は,Query, Key, Value と呼んで,つぎのように意味づけられている:
K_i = x_i W_K :語彙_i が持つ情報の特徴 V_i = x_i W_V :語彙_i が S の他の語彙_j に与える意味 2. Multi-Head Attention Q, K, V は LEN(S)×D 行列であるが,Transformer の実装では,計算を並列処理 (ヘッド数 : H ) で効率化するために,W_Q, W_K, W_V を D / H 列のブロック H 個に,等分する:
(W_Q)_1, ‥‥, W_Q)_H (W_K)_1, ‥‥, W_K)_H (W_V)_1, ‥‥, W_V)_H 即ち,重み付け計算は,つぎのようになる:
(Q)_k = X(S) (W_Q)_k (K)_k = X(S) (W_K)_k (V)_k = X(S) (W_V)_k k = 1, ‥‥, H
K = X(S) W_K) V = X(S) W_V この方法を,「Multi-Head Attention」と謂う。 しかし「最後は同じ」ということで,ここでは「Single-Head」で論を進める。 3. Attention スコアの計算 Q と K の内積をとってスコア行列を作る。 3.1 Attention スコア A(未正規化)
A = ( A_ij ) = Q・K^T ここで「・」の意味は, 「A_ij は,Q の i 行ベクトルと K^T の j 列ベクトルの内積」
K_j : 重み_K づけられた x_j (語彙_j ) A_ij = Q_i・K_j は,つぎの意味が込められている::
K_j :「x_j はどんな意味を持っているか・何を提供できるか」 Q_i・K_j :「x_i にとって x_j がどれほど重要か」 なぜ,「x_i にとって x_j がどれほど重要か」の表現が「Q_i・K_j」なのか? 内積は,ベクトルの向きの違いを定量化するのに使われる。 そこで Q_i・K_j に,Q_i に込めた意味と K_j に込めた意味の引き合う力の強さ,あるいは距離の近さ,の表現を見込むというわけである。 3.2 A の 正規化 (softmax) 内積は,ベクトルの大きさの2つの値と,向きの違いの値の積である。 よって,2つのベクトルの「近さ」の表現に内積を使うときは,ベクトルの大きさの調整 (スケーリング) が必要になる。 Self-Attention では,さらに A の 正規化へと進む。 A から行列 α= (α_ij ) をつぎのように導く:
α_ij は,A_ij = Q_i・K_j の「x_i にとって x_j がどれほど重要か」をさらに精巧にしたもの,ということになる。 そうすると,翻って,Q_i と K_j による「x_i にとって x_j がどれほど重要か」の表現は,α_ij に限るとは言えない。 もっといいものがあり得る。 こんな場合,「いいもの」を課題化していることを示すのに,記号 sim (similarity, 類似度) が使われる。 そしてTransformer は, sim( Q_i, K_j ) = α_ij としているわけである。 実際これは,式がシンプルで計算が簡明になる。 (α_ij ) は,特に,
α_ij は,一昔前の読み方だと「遷移」である: そこで,つぎのような表現になっている: この読み方によれば,( α_ij ) は「注意分布」である: また,α_ij に 「語彙_i が語彙_j を引く力」 の見方をすれば,( α_ij ) は「引力分布」になる。 4. Self-Attention 層の出力 Self-Attention は,つぎの行列を出力とする:
Z = ( z_ij ) = α V Self-Attention 層の入力から出力までを図にまとめると: ↓ ┌──────┬─────┐ 線形変換│W_Q │W_K │W_V ↓ ↓ ↓ Q K V └──┬───┘ │ ↓ │ ( Q_i · K_j ) │ 正規化↓ │ α │ └────┬────┘ ↓ Z =α V < α_j は
「トークンID_i に対する V_1, ‥‥, V_LEN(S) の加重平均」 こうして,Q, K, V の3つが入ったベクトルが出力される。 最終的に「V_1, ‥‥, V_LEN(S) の加重平均」だからといって,Value が中心なわけではない。 言語の実現はシンタクスとセマンティクスの構造の実現である。 したがって Self-Attention の出力に対して考えるべきは,「シンタクスとセマンティクスの重合」なのである。 Transformer がしようとしていることの捉え:
Self_Attention の出力は,つぎのように表現されている: 「出力ベクトル Z_i は、 表現2 「トークンベクトルは、全体を見て自分の意味を組み直す。」 しかし, 「Q, K, V, Z の意味は,これだ」 「これを理解しなければならない」 と定めたら,ここで躓いて先に進めなくなる。 ベクトルに「シンタクスとセマンティクスの重合」の契機を植えつけるという,土台わけのわからぬ話なのだから,「不明・不可視も理由のあること」と思うのもありだろう。 |