いよいよ核心式
Attention全12章のうち、本章が最重要です。これまで準備してきた「Embedding」「内積」「softmax」が、ここで1本の式に統合されます。
Attention(Q, K, V) = softmax(QKT/√dk)V
Vaswani et al., 2017 "Attention Is All You Need"
この式が、ChatGPT・Claude・Geminiすべての心臓部で動いています。怖そうに見えますが、本章を読み終える頃には「図書館で本を探すのと同じことをしているだけ」と思えるはずです。
図書館の比喩 — Q・K・Vの正体
あなたが図書館で「機械学習について学びたい」と思って、本を探すとしましょう。
- Query(質問):あなたの「機械学習」という検索ワード
- Key(鍵):各本の背表紙やタイトル(カタログ情報)
- Value(値):各本の実際の中身(読んで得られる情報)
この対応関係を覚えれば、Attentionの式はもう半分理解できたようなものです。
graph TD Q[Query 検索ワード\n機械学習について学びたい] --> S[相性チェック\nQとKの内積] K1[Key 本Aの背表紙\n機械学習入門] --> S K2[Key 本Bの背表紙\n料理レシピ集] --> S K3[Key 本Cの背表紙\nディープラーニング入門] --> S S --> SM[softmaxで重み化\n本A: 50%\n本B: 1%\n本C: 49%] SM --> MIX[本の中身Vを加重平均\n出力ベクトル] V1[Value 本Aの中身] --> MIX V2[Value 本Bの中身] --> MIX V3[Value 本Cの中身] --> MIX style Q fill:#3b82f6,stroke:#1d4ed8,color:#fff style K1 fill:#8b5cf6,stroke:#6d28d9,color:#fff style K2 fill:#8b5cf6,stroke:#6d28d9,color:#fff style K3 fill:#8b5cf6,stroke:#6d28d9,color:#fff style V1 fill:#f97316,stroke:#ea580c,color:#fff style V2 fill:#f97316,stroke:#ea580c,color:#fff style V3 fill:#f97316,stroke:#ea580c,color:#fff style MIX fill:#14b8a6,stroke:#0d9488,color:#fff
4ステップで完全解剖
Step 1: QK^T — すべての(Q, K)ペアの内積
まず、QueryベクトルとすべてのKeyベクトルの内積を計算します。文中に n 個のトークンがあれば、n×n の Attention Score 行列 ができます。
# 入力: 5単語 ("The animal didn't cross because tired")
# 各単語が d=64次元のQ, K, Vベクトルに変換されているとする
# QK^T の計算 (5×5 行列)
The animal didn't cross because tired
The [ - 1.2 0.8 2.1 -0.5 3.2 ]
animal[ 1.2 - 0.5 4.3 1.1 5.7 ] ← "animal" が誰と相性良いか
didn't[ 0.8 0.5 - 2.7 1.9 1.4 ]
cross [ 2.1 4.3 2.7 - 0.3 2.8 ]
because[ -0.5 1.1 1.9 0.3 - 0.6 ]
tired [ 3.2 5.7 1.4 2.8 0.6 - ] ← "tired" は "animal" との相性が5.7 行列の各セル(i, j)は、「i番目のトークンが j番目のトークンにどれだけ注目するか」の素のスコアです。
Step 2: ÷√dk — スケーリング
内積スコアを √dk(dk はKeyベクトルの次元)で割ります。dk=64なら √64=8 で割ります。これは softmaxが飽和しないようにする ための対策で、詳細は次章(第7章)で扱います。今は「ちょっと小さくする」と理解してください。
Step 3: softmax — 重みに変換
各行に対してsoftmaxを適用し、合計1の確率分布にします。たとえば「animal」の行はこうなるかもしれません。
# Step 3: softmaxで重み化
# "animal" の行(QK^T/√dk 後):
# The:0.15, animal:-, didn't:0.06, cross:0.54, because:0.14, tired:0.71
# softmax後(合計1):
# The:0.08, animal:0.12, didn't:0.07, cross:0.21, because:0.08, tired:0.44
# 解釈: "animal" の意味を決めるとき、"tired"を44%、"cross"を21%重視する Step 4: × V — Valueを加重平均
最後に、得られた重み(Attention Weight)でValueベクトルを加重平均します。「44%の tired、21%の cross、12%の animal自身、……」を混ぜ合わせて、文脈を取り込んだ新しいベクトル を作るのです。
graph LR W[重み\nThe:8%\nanimal:12%\ncross:21%\ntired:44%\n...] --> MIX[加重平均\nΣ 重み×V] V1[V_The] --> MIX V2[V_animal] --> MIX V3[V_cross] --> MIX V4[V_tired] --> MIX MIX --> O[新しい\nanimalベクトル\n文脈込み] style W fill:#8b5cf6,stroke:#6d28d9,color:#fff style MIX fill:#f97316,stroke:#ea580c,color:#fff style O fill:#14b8a6,stroke:#0d9488,color:#fff
なぜ Q, K, V の3つに分けるのか
ここで疑問が湧くはずです。「同じ入力なのに、なぜわざわざQ, K, Vの3つに分けるのか?」
答えは、関係性が非対称だから です。
たとえば「私 → あなた」と「あなた → 私」は別の関係です。「主語 → 目的語」と「目的語 → 主語」も別。Q=K=Vだと、自分自身が常に最強に似ているため、自己ループしか学習できません。
| もしQ・K・Vを分けなかったら | Q・K・Vを分けると(実際のAttention) |
|---|---|
| 自分自身が常に最強の類似度 | 役割を変えて他者と相互作用できる |
| 対称な関係しか学習できない | 非対称な関係(主語→目的語など)も学習可能 |
| 表現力が極端に低い | 柔軟な文脈処理が可能 |
| Value=Key で「中身を見る前に内容で重みづけ」になる | KとVを分けて、検索キーと中身を分離できる |
Self-Attention — Q, K, V が同じ入力から作られる
Transformerで最もよく使われるのが Self-Attention(自己注意) です。これは「文中のすべての単語が、文中のすべての単語に注意を向ける」仕組みで、Q・K・Vがすべて同じ入力(同じ文)から作られます。
一方、エンコーダ-デコーダ構造では「Cross-Attention(交差注意)」も使われます。これはデコーダがQを生成し、エンコーダの出力からK・Vを取る仕組みで、「翻訳元の情報を翻訳先で参照する」役割を担います(第10章で詳述)。
| Attention種別 | Qの出所 | K, Vの出所 | 使い道 |
|---|---|---|---|
| Self-Attention | 同じ入力 | 同じ入力 | GPT・BERTなどの基本 |
| Cross-Attention | デコーダ | エンコーダ | 翻訳の元情報を参照 |
| Masked Self-Attention | 同じ入力 | 同じ入力(未来は隠す) | GPTの生成時 |
全体像を1枚に
ここまでをまとめると、Attentionは次の流れで動きます。
graph TD X[入力 x\n単語のEmbedding列] --> WQ[W_Q で射影] X --> WK[W_K で射影] X --> WV[W_V で射影] WQ --> Q[Q クエリ] WK --> K[K キー] WV --> V[V バリュー] Q --> DOT[QK^T 内積] K --> DOT DOT --> SC[÷√dk スケーリング] SC --> SM[softmax] SM --> WT[Attention重み] WT --> OUT[加重平均\n× V] V --> OUT OUT --> Y[出力\n文脈込みのベクトル] style X fill:#3b82f6,stroke:#1d4ed8,color:#fff style Q fill:#8b5cf6,stroke:#6d28d9,color:#fff style K fill:#8b5cf6,stroke:#6d28d9,color:#fff style V fill:#8b5cf6,stroke:#6d28d9,color:#fff style DOT fill:#f97316,stroke:#ea580c,color:#fff style SM fill:#f97316,stroke:#ea580c,color:#fff style OUT fill:#14b8a6,stroke:#0d9488,color:#fff style Y fill:#14b8a6,stroke:#0d9488,color:#fff
この章のまとめ
Attentionの核心式 softmax(QK^T/√dk)V は、「図書館で本を探す」と同じ4ステップで動きます。
- Query(検索ワード)と各Key(本のラベル)の内積で相性を測る
- スケーリング(√dkで割る、第7章)
- softmaxで合計1の重みに変換
- その重みでValue(本の中身)を加重平均
Q, K, V を別の重み行列で作るのは「非対称な関係を学習するため」。Self-Attention はすべてが同じ入力から作られ、文中の任意の2単語間で情報をやり取りできるのです。
次の第7章では、本章で先送りした √dk スケーリング の謎、そして Multi-Head Attention(複数の視点を同時に持つ)を深掘りします。
理解度チェック
Attentionの核心式 softmax(QK^T/√dk)V のQ, K, V を「図書館の本探し」に例えると、それぞれ何に対応しますか?
キーボード: 1〜4 で選択、Enter で回答