一文要約: Attention は学習された経路制御システムです。Query-Key の内積で許可された位置の組をスコアリングし、スケーリング、マスク、Softmax を経た重みで Value をブレンドします。
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)
↓
残差接続
↓
出力
この図は GPT-2 型の Pre-Norm ブロックを示しています。アーキテクチャによって正規化の種類、順序、並列化の仕方は変わります。この例では Attention が最初の主要なサブ層で、許可された位置の間で情報を直接混ぜ合わせます。ただし、1回の Attention 演算だけでモデルの理解をすべて説明できるわけではありません。
9.2.2 Scaled Dot-Product Attention の内部フロー
Attention サブ層の内部フロー(詳細は第10章、ここでは概観):
入力 X
↓
学習済み重み行列 W_Q, W_K, W_V を用いて X を Q, K, V に投影
↓
Q @ Kᵀ を計算 (位置の組ごとの適合度スコア)
↓
1/√d_k でスケーリング
↓
マスク (Causal マスクは未来の位置を遮断する。Padding マスクなどもある)
↓
Softmax (各行を Attention 重みに正規化)
↓
Attention 重みを用いた V の重み付き和
↓
ヘッド全体を連結
↓
ヘッドを連結した後に出力投影 W_O
↓
出力
この章では幾何学的な直観に集中します。なぜ内積なのか、ヒートマップは何を示すのか、「attention 重み」とは実際に何を意味するのか。Q, K, V の詳細は第10章で扱います。
9.3 Attention が存在する理由
9.3.1 言語理解における核心的な問題
次の文を考えてみてください。
「蒔絵師は硯箱を工房へ運び、その漆器を修復した。」
モデルが後半の「その漆器」を処理するとき、それが数Token前の「硯箱」を指し、「蒔絵師」や「工房」ではないことを結び付ける必要があります。
あらゆる単語の意味は他の単語との関係に依存しています。参照の解決、主語と動詞の一致、長距離依存の追跡——これらすべてが、シーケンス内の位置をまたいだ情報フローを必要とします。
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 は位置どうしの経路を短くします。双方向 Attention ならすべての位置の組を接続でき、Causal なデコーダー Attention では各位置が自分自身とそれ以前の位置だけに接続できます。
token₁ token₂ token₃ token₄ token₅
token₁ ↔ ↔ ↔ ↔ ↔
token₂ ↔ ↔ ↔ ↔ ↔
token₃ ↔ ↔ ↔ ↔ ↔
token₄ ↔ ↔ ↔ ↔ ↔
token₅ ↔ ↔ ↔ ↔ ↔
許可された位置どうしは、再帰的な隠れ状態の連鎖を通る必要がありません。計算グラフ上では、遠い位置にも1回の Attention 演算で届きます。ただし、経路が直接だからといって、モデルが必ず遠距離の情報を使うわけではありません。学習された位置の効果によって、特定の距離が好まれることもあります。
たとえるなら、RNN は伝言ゲームのように情報を一人ずつ渡します。Attention は許可された位置への直接放送です。Causal モードでは、後の話者は前の話者を聞けますが、前の話者は未来を聞けません。
9.4 適合度スコアを計算する道具としての内積
9.4.1 第8章の復習
第8章で確認したとおり:
Q · K = |Q| × |K| × cos(θ)。スコアは方向だけでなく大きさにも依存するため、コサイン類似度そのものではありません。
Attention はこれを「この Query はこの Key をどれほど強く読むべきか」を表す、高速で微分可能な学習済み適合度スコアとして使います。
9.4.2 内積で関連トークンを見つける
計算を見せるため、手作りの3次元ベクトルを使います。実際の Attention では、まず入力を Q と K に別々に投影します。
蒔絵師 = [0.2, 0.8, 0.3]
運び = [0.3, 0.7, 0.4]
硯箱 = [0.1, 0.9, 0.2]
漆器 = [0.8, 0.2, 0.7]
ここでは手作りの「漆器」ベクトルをQuery、残りをKeyとみなして内積を計算します。
漆器 · 蒔絵師 = 0.8×0.2 + 0.2×0.8 + 0.7×0.3 = 0.16 + 0.16 + 0.21 = 0.53
漆器 · 運び = 0.8×0.3 + 0.2×0.7 + 0.7×0.4 = 0.24 + 0.14 + 0.28 = 0.66
漆器 · 硯箱 = 0.8×0.1 + 0.2×0.9 + 0.7×0.2 = 0.08 + 0.18 + 0.14 = 0.40
この手作りの例では「運び」(0.66)、「蒔絵師」(0.53)、「硯箱」(0.40)の順になります。これは学習済みモデルの測定結果ではなく、本当の意味的な順位を証明するものでもありません。実際のモデルは W_Q と W_K を学習し、タスクに役立つスコアを作ります。
9.4.3 行列積がすべての適合度スコアを一括計算する
Query-Key の組を一つずつ計算するのは遅い。行列積ならまとめて計算できます。
Q [n, d_k] @ K.T [d_k, n] = スコア行列 [n, n]
結果の (i, j) 要素は Query i と Key j の内積です。長さ512のシーケンスなら、512×512 のスコア行列を1回の呼び出しで得られます。密な行列積のカーネルは、まさにこの種の演算に最適化されています。
9.5 Attention ヒートマップ: 重み行列を可視化する
9.5.1 スケーリング、マスク、Softmax が生み出すもの
QKᵀ / √d_k を計算し、Causal マスクを加えて Softmax を適用すると、Attention 重み行列が得られます。この教材用の図は8位置なので8×8です。各行は、許可された Key 位置について合計が1になります。
この行列はヒートマップとして可視化できます。
- X 軸(列): Key の位置 — どのトークンが注目を受けているか。
- Y 軸(行): Query の位置 — どのトークンが注目しているか。
- 色: 明るい(黄色)= 高い attention 重み。暗い = 低い重み。
9.5.2 ヒートマップで何を見るか
見つかることのあるパターン:
-
対角線上の明るいセル: Query が自分自身の位置に大きな重みを置いています。Self-Attention では自分自身を見ることもできますが、すべてのヘッドがそうするとは限りません。
-
対角線以外の明るいセル: この入力、このヘッドにおいて、Query
iが Keyjに比較的大きな重みを置いています。 -
暗い上三角: Causal マスクによって、未来の位置の重みはすべて正確に0になります。
9.5.3 ヒートマップが教えてくれないこと
Attention ヒートマップは直観を得たり、デバッグしたりするのに役立ちます。しかし、モデルが何を「理解している」か、なぜその出力を出したかを完全には説明しません。
1枚のヒートマップが示すのは、1つの入力に対する1つのレイヤーの1つの Attention ヘッドだけです。その後も、他のヘッド、残差接続、FFN、後続レイヤーが表現を変換し続けます。研究では、大きく異なる Attention 分布が同等の予測を生む場合も示されています。
ヒートマップは局所的な診断に使い、単独の因果説明として扱わないでください。
9.6 適合度スコアから Attention 重みへ
9.6.1 生の内積スコアの問題
生の内積スコアには固定の範囲がありません。
生のスコア: [3.5, -2.1, 8.7, 0.3, ...]
これらのスコアは正にも負にもなり、絶対的なスケールはベクトルの大きさに依存します。正規化なしには「どれほど attention を向けるか」として解釈できません。
9.6.2 Softmax の出番
Softmax(第6章)は任意のスコアを、非負で合計1の重みに正規化します。
Softmax([3.5, -2.1, 8.7, 0.3]) ≈ [0.0055, 0.0000, 0.9943, 0.0002]
これで:
- すべての重みが0以上1以下になります。
- 重みの合計が1になります。
- 最も高い生スコアが最大の重みを得ます。
- これは Value ベクトルを混ぜるときの行方向の係数です。あるトークンが意味的に関連している「確率」ではありません。
9.6.3 スケーリングのステップ: なぜ √d_k で割るのか
完全な式では Softmax の前にスケーリングのステップがあります。
なぜ √d_k で割るのでしょうか?
オリジナルの Transformer 論文は、統計的な直観を示しています。Q と K の各成分が独立で、平均0、分散1だとすると、内積は d_k 個の項を足すため、分散は d_k、標準偏差は √d_k になります。
大きな値が Softmax に入ると、分布が極端に尖ってしまいます。
Softmax([100, 50, 40]) ≈ [1.0, 0.0, 0.0] <- 飽和している
Softmax([5.0, 2.5, 2.0]) ≈ [0.883, 0.073, 0.044] <- 飽和が弱い
Softmax が飽和すると、多くの微分値が非常に小さくなり、最適化が難しくなります。
√d_k で割ること(たとえば √512 ≈ 22.6)で、ヘッド幅が増えても典型的なスコアのスケールを揃えます。Q と K を単位ベクトルにする処理ではなく、内積をコサイン類似度に変えるわけでもありません。
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の内積です。 - 解釈: Query
iと Keyjの、生の学習済み適合度スコア。
ステップ2: / √d_k
- スカラーによる除算。
- Softmax の勾配が健全な範囲にスコアを収めます。
ステップ3: マスク M を加え、Softmax
- 未来や Padding の位置には、Softmax の前に
-∞を加えます。 - 行ごとに適用されます。
- 各行は、許可された Key 位置に対する重みに正規化されます。
- 要素
(i, j)は混合係数であって、Keyjが本当に関連している確率ではありません。
ステップ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ᵀ): Query-Key の組ごとの学習済みマッチングスコア。 - Softmax: スコアを結果の分布に正規化する。
- Value (V): 各ドキュメントの実際の内容 — 「選ばれたとき、私はどんな情報を提供するか?」
- 出力 (
attention_weights @ V): 重みに従って全ドキュメントを混ぜたもの。
離散的なランキング結果を返す検索エンジンと違い、Attention はソフトな重み付きブレンドを返します。マスクされていないトークンは寄与できますが、マスクされた位置の寄与は正確に0です。許可された位置でも重みが実質0になることがあります。
9.8 なぜ内積がよく選ばれるのか
9.8.1 計算効率
内積は行列積として表現でき、密な行列積は現代のアクセラレーターで高度に最適化されています。Q @ Kᵀ の1回の呼び出しで、seq_len² 個のスコアを並列に計算できます。
# 1行ですべての Query-Key スコアを計算する
attention_scores = Q @ K.transpose(-2, -1)
オリジナルの Transformer 論文は加法 Attention とも比較しています。理論上の計算量は同程度ですが、内積 Attention は行列積にそのまま写せるため、実際には高速でメモリ効率も良いと報告されました。内積は実用的な設計選択であって、数学的に唯一の正解ではありません。
9.8.2 幾何学的な明快さ
第8章で確認したとおり、Q · K = |Q||K|cos(θ) です。Query は「問いを立て」、Key は特徴を「広告する」と考えられます。その内積は、方向の揃い方とベクトルの大きさを組み合わせます。
モデルは W_Q と W_K を学習し、役に立つ Query-Key の組が比較的高いスコアを得るようにします。方向はこの幾何学の一部ですが、ベクトルの長さも効きます。スコアはコサイン類似度ではありません。
9.8.3 学習による柔軟性
内積という演算は固定されていますが、Q, K, V は入力の学習済み投影です。
Q = X @ W_Q (形状: [seq_len, d_k])
K = X @ W_K (形状: [seq_len, d_k])
V = X @ W_V (形状: [seq_len, d_v])
モデルは学習を通じて W_Q、W_K、W_V を獲得します。これにより:
- 問いを立てるときにトークン表現のどの側面を使うべきか(Q)。
- 他のトークンに向けてどの側面を広告すべきか(K)。
- 選ばれたとき、どんな情報を提供するか(V)。
内積そのものは固定された演算ですが、それが作用する投影空間は完全に学習されます。シンプルな固定演算と豊かな学習済み投影の組み合わせが、Attention をこれほど強力にしている理由です。
9.9 Self-Attention と Cross-Attention
9.9.1 Self-Attention
GPT や Llama のようなデコーダーのみのモデルでは、Q, K, V はすべて同じ入力シーケンスから生成されます。
input: "蒔絵師は硯箱を工房へ運んだ。"
Q = input @ W_Q
K = input @ W_K
V = input @ W_V
Q, K, V が同じシーケンスから来るため、これを Self-Attention と呼びます。Causal デコーダーでは、各位置が注目できるのは自分自身とそれ以前の位置だけです。
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 maki-e artist repaired the"
Q = decoder_hidden @ W_Q
K = encoder_output @ W_K
V = encoder_output @ W_V
デコーダーがエンコーダーの表現に問いを立てます。これが Cross-Attention です。
9.9.4 本書の焦点
本書は、公開資料で構造を確認できる GPT や Llama のようなデコーダーのみのアーキテクチャに焦点を当てています。多くのエンジニアが最初に出会う形だからです。第10章では QKV の詳細をさらに深く掘り下げます。
9.10 章のまとめ
9.10.1 重要な概念
| 概念 | 説明 |
|---|---|
| Attention | 許可された位置どうしが、Value の重み付き混合を通じて情報を交換する |
| 内積 | 方向の揃い方と大きさを組み合わせ、Query-Key の適合度をスコアリングする |
Q @ Kᵀ | すべての Query-Key スコアを1回の行列積で計算する |
| スケーリング | ヘッド幅が増えてもスコアのスケールを安定させるため √d_k で割る |
| マスク + Softmax | 許可されない位置を遮断し、各行を重みに正規化する |
| 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 をブレンドします。ただし、その重みは1つのヘッドとレイヤーにおける経路制御を表すもので、モデルの推論全体を説明するものではありません。
章のチェックリスト
この章を終えたあと、あなたは次のことができるはずです。
- Attention が各位置から許可された位置へ直接の経路を作る理由と、それが長距離依存にとって何を意味するかを説明する。
- 内積が学習済み Query-Key の適合度スコアに使われる理由を説明する。
- Attention の式を追う: Q @ Kᵀ、スケーリング、マスク、Softmax、V の重み付き和。
- Softmax の前に
√d_kで割る理由を説明する。 - Self-Attention(同じシーケンス)と Cross-Attention(2つのシーケンス)を区別する。
- デコーダーモデルにおける Causal マスクが何をするかを説明する。
次の章でお会いしましょう
以上が Attention の幾何学です。内積スコア、スケーリング、マスク、Softmax 重み、そして Value のブレンドという一連のパイプラインを式を見ずに説明できるようになっていれば、次に進む準備は十分です。
第10章では、この章が意図的に開いたままにした問いに答えます。Q, K, V とは正確に何なのか。 どこから生まれるのか。重み行列 W_Q, W_K, W_V は何を学習しているのか。そしてなぜ複数のヘッドに分割することが効果的なのか。
ここまでお疲れさまでした。次章でまたお会いしましょう。