いよいよ核心式

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の正体

あなたが図書館で「機械学習について学びたい」と思って、本を探すとしましょう。

  1. Query(質問):あなたの「機械学習」という検索ワード
  2. Key(鍵):各本の背表紙やタイトル(カタログ情報)
  3. 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
図書館の比喩:QとKで相性を測り、softmaxで重み化、Vを加重平均する

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
Step 4: 重みでValueを加重平均し、文脈込みの新しい単語ベクトルを得る

なぜ 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全体の流れ。入力 x から Q/K/V を作り、内積→スケーリング→softmax→加重平均で出力 y を得る

この章のまとめ

Attentionの核心式 softmax(QK^T/√dk)V は、「図書館で本を探す」と同じ4ステップで動きます。

  1. Query(検索ワード)と各Key(本のラベル)の内積で相性を測る
  2. スケーリング(√dkで割る、第7章)
  3. softmaxで合計1の重みに変換
  4. その重みでValue(本の中身)を加重平均

Q, K, V を別の重み行列で作るのは「非対称な関係を学習するため」。Self-Attention はすべてが同じ入力から作られ、文中の任意の2単語間で情報をやり取りできるのです。

次の第7章では、本章で先送りした √dk スケーリング の謎、そして Multi-Head Attention(複数の視点を同時に持つ)を深掘りします。

理解度チェック

問題 0 / 50%
Q1

Attentionの核心式 softmax(QK^T/√dk)V のQ, K, V を「図書館の本探し」に例えると、それぞれ何に対応しますか?

キーボード: 1〜4 で選択、Enter で回答