一文要約: Attention は学習済みの経路制御システムです。各トークンが内積を使って他のすべてのトークンとの類似度を計算し、最も関連性の高い表現を重み付きでブレンドして取り込みます。
9.1 振り返り: ここまでに積み上げたもの
Attention に踏み込む前に、これまでに構築してきたものを整理しておきましょう。
| 章 | 概念 | 中核となる役割 |
|---|---|---|
| 4 | トークン化 + Embedding | テキスト → トークンID → ベクトル |
| 5 | Positional Encoding | 各ベクトルに位置情報を付加する |
| 6 | LayerNorm + Softmax | 活性化を安定させる。スコアを確率に変換する |
| 7 | フィードフォワードネットワーク | トークンごとの表現を変換する。学習された知識を蓄える |
| 8 | 線形変換 | 行列積 = 内積 = 類似度 / 投影 |
前提はすべて整いました。この章でいよいよ Attention の仕組みを開きます。これこそ Transformer をそれ以前のあらゆるものと根本的に異なるものにしている部分です。
9.2 アーキテクチャにおける Attention の位置
9.2.1 Transformer ブロックの構造
各 Transformer ブロックは2つの主要なサブ層で構成されています。
入力
↓
LayerNorm
↓
Masked Multi-Head Attention <- この章で扱う
↓
残差接続
↓
LayerNorm
↓
Feed Forward Network (FFN)
↓
残差接続
↓
出力
Attention は各ブロックの最初のサブ層です。モデルがどのトークンをどのトークンに影響させるかを決定する場所がここです。
9.2.2 Scaled Dot-Product Attention の内部フロー
Attention サブ層の内部フロー(詳細は第10章、ここでは概観):
入力 X
↓
学習済み重み行列 Wq, Wk, Wv を用いて X を Q, K, V に投影
↓
Q @ Kᵀ を計算 (ペアワイズ類似度スコア)
↓
1/√d_key でスケーリング
↓
マスク (デコーダーのみ: 未来の位置への注目を防ぐ)
↓
Softmax (スコアを attention 重みに変換)
↓
attention 重みを用いた V の重み付き和
↓
ヘッド全体を連結
↓
出力投影 Wo
↓
出力
この章では幾何学的な直観に集中します。なぜ内積なのか、ヒートマップは何を示すのか、「attention 重み」とは実際に何を意味するのか。Q, K, V の詳細は第10章で扱います。
9.3 Attention が存在する理由
9.3.1 言語理解における核心的な問題
次の文を考えてみてください。
"The agent opened a pull request and the reviewer left a comment on it."
モデルが末尾の "it" を処理するとき、"it" が指すのは "pull request" であり、"reviewer" でも "agent" でもないことを理解する必要があります。その参照を解決するには、数トークン前の情報に接続しなければなりません。
あらゆる単語の意味は他の単語との関係に依存しています。参照の解決、主語と動詞の一致、長距離依存の追跡——これらすべてが、シーケンス内の位置をまたいだ情報フローを必要とします。
9.3.2 RNN がこれに苦労した理由
Transformer 以前、シーケンス処理の標準手法は Recurrent Neural Network (RNN) でした。
token₁ → token₂ → token₃ → token₄ → token₅ → ...
↘ ↘ ↘
隠れ状態が前方に伝搬
RNN の問題点:
-
逐次計算: トークン1を処理してからトークン2、トークン2を処理してからトークン3。並列化できません。長いシーケンスでの学習は遅くなります。
-
長距離依存の減衰: トークン1の情報がトークン100に影響するには、多くの隠れ状態遷移を生き残らなければなりません。実際には、たいてい消えてしまいます。モデルは遠い文脈を忘れるのです。
-
勾配の問題: 長いシーケンスを逆伝播すると勾配が消失または爆発し、学習が困難になります。
9.3.3 Attention の解決策
Attention はすべてのトークンに、他のすべてのトークンへの直接アクセスを与えます。
token₁ token₂ token₃ token₄ token₅
token₁ ↔ ↔ ↔ ↔ ↔
token₂ ↔ ↔ ↔ ↔ ↔
token₃ ↔ ↔ ↔ ↔ ↔
token₄ ↔ ↔ ↔ ↔ ↔
token₅ ↔ ↔ ↔ ↔ ↔
中間状態はなく、距離による減衰もありません。1回の Attention 演算で、トークン1とトークン100はトークン50から等距離に届きます。
たとえるなら: RNN は伝言ゲームのようにシーケンスを処理します——情報が一人ずつ伝わり、途中で劣化していきます。Attention は直接ブロードキャストです。すべてのトークンが同時に他のすべてのトークンから聞こえます。
9.4 類似度の道具としての内積
9.4.1 第8章の復習
第8章で確認したとおり:
2つのベクトルの内積は、両者が似た方向を指しているとき大きく、無関係のとき小さく、反対方向を指しているとき負になります。
これが Attention に必要な道具そのものです。「トークン j はトークン i にとってどれほど関連しているか」を問う、高速で微分可能な方法です。
9.4.2 内積で関連トークンを見つける
各トークンがベクトル表現を持つと仮定します(説明のため3次元に簡略化します)。
agent = [0.2, 0.8, 0.3]
opened = [0.3, 0.7, 0.4]
pull = [0.1, 0.9, 0.2]
request = [0.8, 0.2, 0.7]
"request" と最も関連するトークンを調べるため、内積を計算します。
request · agent = 0.8×0.2 + 0.2×0.8 + 0.7×0.3 = 0.16 + 0.16 + 0.21 = 0.53
request · opened = 0.8×0.3 + 0.2×0.7 + 0.7×0.4 = 0.24 + 0.14 + 0.28 = 0.66
request · pull = 0.8×0.1 + 0.2×0.9 + 0.7×0.2 = 0.08 + 0.18 + 0.14 = 0.40
スコアから「request」に最も似ているのは "opened"(0.66)、次いで "agent"(0.53)、"pull"(0.40) だとわかります。このトイの例では完全な意味的ランキングにはなっていないかもしれませんが、実際のモデルは Q, K, V の投影を学習し、タスクに対してこれらのスコアが意味を持つようにします。仕組みを理解することが目的です。
9.4.3 行列積がすべての類似度を一括計算する
ペアを一つずつ計算するのは遅い。行列積なら1回の GPU 演算で全部できます。
トークン行列 [n, d] @ トークン行列の転置 [d, n] = 類似度行列 [n, n]
結果の (i, j) 要素は、トークン i とトークン j の内積です。長さ512のシーケンスに対して、512×512 の類似度行列が1回の呼び出しで得られます。GPU カーネルはまさにこの演算のために最適化されています。
9.5 Attention ヒートマップ: 類似度行列を可視化する
9.5.1 Q @ K が生み出すもの
Q @ Kᵀ を計算して Softmax を適用すると、attention 重み行列が得られます。16トークンのシーケンスであれば、16×16 の行列です。各行は16の位置に対する確率分布になっています。
この行列はヒートマップとして可視化できます。
- X 軸(列): Key の位置 — どのトークンが注目を受けているか。
- Y 軸(行): Query の位置 — どのトークンが注目しているか。
- 色: 明るい(黄色)= 高い attention 重み。暗い = 低い重み。
9.5.2 ヒートマップで何を見るか
典型的なパターン:
-
明るい対角線: 各トークンが自分自身に強く注目しています。自然な振る舞いです。
-
対角以外の明るいセル: 行 i にいるトークンが位置 j に強く注目しています。モデルが j の情報を i の理解に役立てることを学習したことを示します。
-
列ごとの明るさの違い: 多くの位置から高い attention を受けるトークンがあります。それらはシーケンス全体にとって重要なアンカーになっています。
9.5.3 ヒートマップが教えてくれないこと
Attention ヒートマップは直観を得たりデバッグしたりするのに役立ちます。しかし、モデルが何を「理解している」かの完全な説明にはなりません。
1枚のヒートマップは、1つの入力に対する1つのレイヤーの1つの Attention ヘッドを示しているに過ぎません。典型的なモデルには32のレイヤーと1レイヤーあたり32のヘッドがあり、1回のフォワードパスで1,024のattentionパターンが存在します。異なるヘッドはそれぞれ異なるパターンに特化しています。1枚のヒートマップを見て「モデルは X に注目している」と言うのは、1,024列のスプレッドシートの1列だけを見て全体を要約するようなものです。
直観のためにヒートマップを使うのは良いことです。ただし、解釈しすぎには注意してください。
9.6 類似度スコアから Attention 重みへ
9.6.1 生の内積スコアの問題
生の内積スコアには固定の範囲がありません。
生のスコア: [3.5, -2.1, 8.7, 0.3, ...]
これらのスコアは正にも負にもなり、絶対的なスケールはベクトルの大きさに依存します。正規化なしには「どれほど attention を向けるか」として解釈できません。
9.6.2 Softmax の出番
Softmax(第6章)は任意のスコアを有効な確率分布に変換します。
Softmax([3.5, -2.1, 8.7, 0.3]) ≈ [0.05, 0.00, 0.94, 0.01]
これで:
- すべての重みが0以上1以下になります。
- 重みの合計が1になります。
- 最も高い生スコアが最大の重みを得ます。
- 解釈が明確になります。「attention の予算の94%が位置2に割り当てられる」。
9.6.3 スケーリングのステップ: なぜ √d_key で割るのか
完全な式では Softmax の前にスケーリングのステップがあります。
なぜ √d_k で割るのでしょうか?
ベクトルの次元数が大きい場合(たとえば d_k = 512)、内積は非常に大きな値になることがあります。512個の各項がそれぞれ2つの数の積を加算するため、合計は容易に数百に達します。
大きな値が Softmax に入ると、分布が極端に尖ってしまいます。
Softmax([100, 50, 40]) ≈ [1.0, 0.0, 0.0] <- ほぼ決定論的
Softmax([5.0, 2.5, 2.0]) ≈ [0.85, 0.10, 0.06] <- 健全な状態
Softmax がほぼ決定論的になると、勾配がほぼゼロになります。学習が遅くなるか、止まってしまいます。
√d_k で割ること(たとえば √512 ≈ 22.6)で、Softmax に渡す前にスコアを適切なスケールに戻します。安価ですが、なくてはならない正規化です。
9.7 Attention の完全な式
9.7.1 式
9.7.2 ステップごとの解説
ステップ1: Q @ Kᵀ
- 形状:
[seq_len, d_k] @ [d_k, seq_len] = [seq_len, seq_len] - 各要素
(i, j)は、Query トークンiと Key トークンjの内積です。 - 解釈: 「トークン i はトークン j にどれほど注目したいか?」
ステップ2: / √d_k
- スカラーによる除算。
- Softmax の勾配が健全な範囲にスコアを収めます。
ステップ3: Softmax
- 行ごとに適用されます。
- 各行がシーケンスに対する確率分布になります。
- 要素
(i, j)は attention 重みになります。「トークン i の attention 予算のうち、どれだけの割合がトークン j に向かうか?」
ステップ4: × V
- 形状:
[seq_len, seq_len] @ [seq_len, d_v] = [seq_len, d_v] - 各出力トークンは、すべての Value ベクトルの重み付き和です。
- attention 重みが高いトークンほど、出力に多く寄与します。
9.7.3 アナロジー: 重み付き結果を返す検索
Attention を検索システムとして考えると理解しやすくなります。
- Query (Q): 検索クエリ — 「私は何を探しているか?」
- Key (K): 各ドキュメントのインデックスエントリ — 「このトークンは何を広告しているか?」
- 類似度 (
Q @ Kᵀ): マッチングスコア — 各トークンはクエリとどれほど合致するか? - Softmax: スコアを結果の分布に正規化する。
- Value (V): 各ドキュメントの実際の内容 — 「選ばれたとき、私はどんな情報を提供するか?」
- 出力 (
attention_weights @ V): 関連度で重み付けされた全ドキュメントのブレンド。
離散的なランキング結果を返す検索エンジンと違い、Attention はソフトな重み付きブレンドを返します。すべてのトークンが何かを貢献し、重みがその量を決定します。
9.8 なぜ内積でなければならないのか
9.8.1 計算効率
内積は行列積として表現できます。現代の GPU における行列積は驚異的なほどよく最適化されています。cuBLAS や Tensor Cores といったライブラリはまさにこれのために作られています。Q @ Kᵀ の1回の呼び出しで、seq_len² のすべてのペアワイズ類似度が並列に計算されます。
# 1行ですべてのペアワイズ類似度を計算する
attention_scores = Q @ K.transpose(-2, -1)
他の類似度関数(ユークリッド距離、明示的な正規化を伴うコサイン類似度)はコストが高く、単一の行列積として自然には表現できません。
9.8.2 幾何学的な明快さ
第8章で確認したとおり、内積はベクトルの整列を測ります。Query は特定の方向に「問いを立て」ます。Key はある方向に「答え」ます。その内積が、答えの方向が問いの方向に合致するかどうかを語ります。
これは便利なメタファーに留まりません。モデルは実際に Wq と Wk 行列を学習し、特定の K ベクトルと合致すべき Q ベクトルが似た方向を向くようにします。幾何学は本物です。
9.8.3 学習による柔軟性
内積という演算は固定されていますが、Q, K, V は入力の学習済み投影です。
Q = X @ Wq (形状: [seq_len, d_k])
K = X @ Wk (形状: [seq_len, d_k])
V = X @ Wv (形状: [seq_len, d_v])
モデルは学習を通じて Wq、Wk、Wv を獲得します。これにより:
- 問いを立てるときにトークン表現のどの側面を使うべきか(Q)。
- 他のトークンに向けてどの側面を広告すべきか(K)。
- 選ばれたとき、どんな情報を提供するか(V)。
内積そのものは固定された演算ですが、それが作用する投影空間は完全に学習されます。シンプルな固定演算と豊かな学習済み投影の組み合わせが、Attention をこれほど強力にしている理由です。
9.9 Self-Attention と Cross-Attention
9.9.1 Self-Attention
デコーダーのみのモデル(GPT, LLaMA, Claude)では、Q, K, V はすべて同じ入力シーケンスから生成されます。
input: "The agent opened a pull request."
Q = input @ Wq
K = input @ Wk
V = input @ Wv
すべてのトークンが同じシーケンス内の他のすべてのトークンに注目します。これが Self-Attention です。シーケンスが自分自身に問いを立てるわけです。
9.9.2 デコーダーの Self-Attention におけるCausal マスク
言語モデルでは、現在のトークンを予測するとき、未来のトークンを見てはなりません。モデルがトークン5を生成しているとき、トークン6, 7, 8... に注目できてはいけません。
これを実現するのが Causal マスク です。Softmax の前に、未来のすべての位置の attention スコアを -∞ に設定します。Softmax を通すと、それらの位置の重みが ≈ 0 になり、事実上存在しないものになります。
5トークンシーケンスのマスク済み attention 行列 (下三角):
token 1 が注目できる位置: [1]
token 2 が注目できる位置: [1, 2]
token 3 が注目できる位置: [1, 2, 3]
token 4 が注目できる位置: [1, 2, 3, 4]
token 5 が注目できる位置: [1, 2, 3, 4, 5]
対角線より上の位置はすべてマスクされます。
9.9.3 Cross-Attention
エンコーダー・デコーダーモデル(オリジナルの Transformer、翻訳モデル)では、Q はデコーダーのシーケンスから生成され、K と V はエンコーダーの出力から生成されます。
エンコーダー入力: "The agent opened a pull request."
デコーダー入力: "L'agent a ouvert une"
Q = decoder_hidden @ Wq
K = encoder_output @ Wk
V = encoder_output @ Wv
デコーダーがエンコーダーの表現に問いを立てます。これが Cross-Attention です。
9.9.4 本書の焦点
本書はデコーダーのみのモデル——GPT、LLaMA、そして同様のアーキテクチャに焦点を当てています。現代の LLM を扱うエンジニアが最初に遭遇する形がこれだからです。Causal マスクを持つ Self-Attention こそが ChatGPT, Claude, Gemini を支えているものです。第10章では QKV の詳細をさらに深く掘り下げます。
9.10 章のまとめ
9.10.1 重要な概念
| 概念 | 説明 |
|---|---|
| Attention | 各トークンが学習された類似度を通じて他のすべてのトークンに直接注目する |
| 内積 | ベクトルの整列を測る。中核となる類似度演算 |
Q @ Kᵀ | すべてのトークン間のペアワイズ類似度を1回の行列積で計算する |
| スケーリング | スコアが大きいときの Softmax の崩壊を防ぐため √d_k で割る |
| Softmax | 生の類似度スコアを attention 重み(確率分布)に変換する |
| Value の重み付き和 | 最終出力は attention 重みに比例して V ベクトルをブレンドする |
| Self-Attention | Q, K, V が同じシーケンスから生成される |
| Cross-Attention | Q が一方のシーケンス、K/V が別のシーケンスから生成される |
| Causal マスク | デコーダーが未来の位置に注目することを防ぐ |
9.10.2 Attention の式
9.10.3 核心となる学び
Attention とは、学習された投影に対する内積類似度計算です。Q が問いを立て、K が答えを広告し、両者の内積が一致度をスコアリングし、Softmax がスコアを重みに変換し、その重みが V の表現をブレンドします。モデルは意味のある Q-K マッチを生み出す投影を学習します。それがこのメカニズムのすべてです。
章のチェックリスト
この章を終えたあと、あなたは次のことができるはずです。
- Attention がすべてのトークンに他のすべてのトークンへの直接アクセスを与える理由、そしてそれが長距離依存にとって何を意味するかを説明する。
- トークン間の類似度を測るために内積が使われる理由を説明する。
- Attention の式の4つのステップを追う: Q @ Kᵀ, スケーリング, Softmax, V の重み付き和。
- Softmax の前に
√d_kで割る理由を説明する。 - Self-Attention(同じシーケンス)と Cross-Attention(2つのシーケンス)を区別する。
- デコーダーモデルにおける Causal マスクが何をするかを説明する。
次の章でお会いしましょう
以上が Attention の幾何学です。内積スコア、スケーリング、Softmax 重み、そして Value のブレンドという一連のパイプラインを式を見ずに説明できるようになっていれば、次に進む準備は十分です。
第10章では、この章が意図的に開いたままにした問いに答えます。Q, K, V とは正確に何なのか。 どこから生まれるのか。重み行列 Wq, Wk, Wv は何を学習しているのか。そしてなぜ複数のヘッドに分割することが効果的なのか。
ここまでお疲れさまでした。次章でまたお会いしましょう。