2. Self-Attentionの数理と直感
Self-Attentionとは何か
文章の中の単語は、単体で孤立して存在しているわけではありません。 周囲にあるほかの単語との関係性によって、その単語の正確な意味やニュアンスが定まります。 たとえば「銀行の 窓口 に行く」という文と、「部屋の 窓口 を開ける」という文では、「窓口」が持つ意味のニュアンスは異なります。
Self-Attention(自己注意機構)とは、「同じ文章の中にあるすべての単語同士がお互いに注意(重み)を向け合い、文脈を考慮した新しい意味表現を作り出す仕組み」です。 外部の辞書を引くのではなく、自分自身の文章の中で「どの単語とどの単語が結びついているのか」を直接計算するため、「Self(自己)」という名前がついています。
Query・Key・Valueのアナロジー
Self-Attention の数式を理解するためのもっとも分かりやすい例えが、ウェブ検索やデータベースの仕組みです。 Self-Attention では、すべての単語ベクトルから次の 3 つの役割を持つベクトルを作成します。
▸ Query(クエリ: 検索の問い合わせ)
「私はこの単語ですが、私の意味を正しく理解するために、どの単語の情報を探せばよいですか?」という検索キーワードに相当します。
▸ Key(キー: 照合用の見出し)
「私はこういう特徴を持つ単語です」という、各単語が外に向けて提示するラベルやインデックスに相当します。
▸ Value(バリュー: 実際の情報内容)
照合の結果として相手に引き渡す、単語の実際の意味データそのものです。
ある単語の Query と、文中のすべての単語の Key を突き合わせて相性を計算します。 相性が高かった単語の Value をたくさん集め、相性が低かった単語の Value は少しだけ混ぜ合わせることで、文脈に染まった新しい表現を合成します。
Scaled Dot-Product Attentionの計算手順
Transformer で採用されている基本的な計算方式は「Scaled Dot-Product Attention(縮小積和注意機構)」と呼ばれます。 数式で表すと以下の 1 行になります。
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$
一見すると複雑に見えますが、処理は次の 4 つのステップに分解できます。
Q, K の内積計算 (QK^T)
│
▼
スケーリング (÷ √d_k)
│
▼
Softmax関数で重み化 (0〜1に正規化)
│
▼
V との行列積 (重み付き和の計算)
▸ ステップ1: 内積による類似度の計算
まず、Query 行列 $Q$ と Key 行列の転置 $K^T$ の行列積(内積)を計算します。 ベクトル同士の内積は、向きが似ているほど大きな値になり、直交していると 0 になります。 これにより、どの単語とどの単語が強く関連しているかを表す類似度スコアの行列が得られます。
▸ ステップ2: スケーリング(なぜ $\sqrt{d_k}$ で割るのか)
計算したスコアを、Key の次元数 $d_k$ の平方根 $\sqrt{d_k}$ で割り算します。 次元数 $d_k$ が 64 や 128 のように大きくなると、内積の値が極端に大きくなりやすくなります。 大きな値が次の Softmax 関数に入力されると、出力の確率が 0 または 1 に極端に偏り、学習時の勾配(重みを更新するための傾き)がほぼ 0 になる「勾配消失」が起きてしまいます。 $\sqrt{d_k}$ で割るスケーリングは、数値のばらつきを抑えて学習を安定させるための極めて重要な工夫です。
▸ ステップ3: Softmaxによる確率への正規化
スケーリング後のスコアに行列の行ごとに Softmax(ソフトマックス)関数を適用します。 これにより、すべての数値が 0 から 1 の範囲に収まり、行ごとの合計値がちょうど 1(100%)の「アテンション重み」に変換されます。 これは「どの単語に何パーセントの注意を配分するか」という比率を表しています。
▸ ステップ4: Valueの重み付き平均
最後に、ステップ 3 で求めた比率(重み)を使って、Value 行列 $V$ の各行を足し合わせます(重み付き和)。 自分に関連する単語の情報が多く混ざり合い、無関係な単語の情報は排除された、文脈化された新しいベクトルが出力されます。
Multi-Head Attentionの仕組みと必要性
1 組の $Q, K, V$ だけで計算を行う場合、注意を向けられる観点が 1 つに限定されてしまうという欠点があります。 文章を読むとき、人間はさまざまな観点を同時に気にしています。 たとえば「文法的な主語と動詞の関係」「代名詞が何を指しているか」「修飾語がどこにかかっているか」といった多様な関係性です。
Multi-Head Attention(マルチヘッドアテンション)は、この課題を解決するために考案されました。 入力を複数の異なる空間(ヘッド)に分割し、それぞれのヘッドで独立して Attention を計算します。
graph TD
Input["入力ベクトル"] --> Split["異なる線形変換で h 個のヘッドに射影"]
Split --> Head1["Head 1: 主語・動詞の関係に注目"]
Split --> Head2["Head 2: 修飾関係に注目"]
Split --> Head3["Head h: 代名詞の照応に注目"]
Head1 --> Concat["全ヘッドの出力を結合 (Concat)"]
Head2 --> Concat
Head3 --> Concat
Concat --> Output["線形変換 (W_O) を経て最終出力"]
元のベクトルをそのまま使うのではなく、ヘッドごとに異なる重み行列 $W_i^Q, W_i^K, W_i^V$ を掛けて射影します。 これにより、あるヘッドは「誰が何をしたか」に注目し、別のヘッドは「いつ・どこで」に注目するといった、多角的な文脈理解が可能になります。
最後に、すべてのヘッドから得られた出力を横に連結(Concatenate)し、仕上げの線形変換行列 $W^O$ を掛けて元の次元数に戻します。 この Multi-Head Attention によって、Transformer は文章の微細なニュアンスや長距離の構造を驚異的な精度で捉えることができるのです。 次章では、単語の順番を認識させるためのもうひとつの重要技術「位置エンコーディング」を解説します。