一文でまとめると: Text は Token IDs になり、Token embedding と位置 embedding の和になります。12 個の Pre-Norm block がこの residual stream を変換し、共有出力射影が語彙 logits を作ります。その後に Softmax、greedy decoding、sampling などで次の Token を選びます。この形状を追えれば、GPT-2 の一回の計算が見通せます。
15.1 全体像: Decoder-Only Architecture
15.1.1 “Decoder-Only” は何を省くのか
GPT-1、GPT-2、GPT-3、LLaMA は自回帰型の Decoder-Only Transformer です。ただし、元の Transformer decoder をそのまま切り出したわけではありません。元の decoder には encoder 出力を読む cross-attention もありました。単体の language model には encoder がなく、cross-attention sublayer もありません。残る中心部は causal self-attention、位置ごとの MLP、残差接続、正規化です。
本章は GPT-2 Small を一貫した基準にします。
d_model = 768n_layers = 12n_heads = 12、したがってd_head = 64d_ff = 3072vocab_size = 50,257- 学習型絶対位置 table の長さは 1,024
15.1.2 GPT-1 と GPT-2 の LayerNorm 配置
両モデルとも causal self-attention を使いますが、正規化の順番が違います。
| GPT-1 | GPT-2 | |
|---|---|---|
| Sublayer pattern | LN(x + Sublayer(x)) | x + Sublayer(LN(x)) |
| 通称 | Post-Norm | Pre-Norm |
| GPT-2 型 final LayerNorm | なし | あり |
GPT-2 は初期化、語彙、context length も変更しています。LayerNorm は重要な差ですが、唯一の差ではありません。ここで GPT-2 を選ぶのは、data flow 全体を一つの具体例に揃えるためです。
15.2 Step 1–3: 入力を準備する
15.2.1 Step 1: Tokenization
英語版の例を直訳せず、日本語版で続けてきた漆芸の文を使います。
入力: "蒔絵師が硯箱を"
GPT-2 自身の byte-level BPE で実測すると、次の 16 Token です。
Token IDs:
[164, 240, 242, 163, 113, 113, 30585, 104,
35585, 163, 94, 107, 163, 106, 109, 31758]
sequence length T = 16
一つの漢字が複数 Token に分かれ、個々の Token が UTF-8 文字の一部の byte だけを持つ場合もあります。Model が受け取るのは単語や文字の配列ではなく、Token sequence です。
15.2.2 Step 2: Token Embedding
各 ID は学習可能な行列 E ∈ R^(50257×768) から一行を選びます。
token_ids [B, 16]
token_embedding(token_ids) [B, 16, 768]
各行は context-free な学習 parameter です。訓練により語彙的・統計的な構造を持ちえますが、一行だけがその Token に対する model の完全な「理解」ではありません。Contextual information は後段の block で形成されます。
15.2.3 Step 3: 位置 Embedding を加える
GPT-2 は学習可能な絶対位置 table P ∈ R^(1024×768) を使います。
positions [0, 1, ..., 15]
position_embedding(positions) [16, 768]
X = token_embedding + position_embedding
X [B, 16, 768]
位置ベクトルは batch 軸へ broadcast されます。GPT-2 は訓練中、和の後に embedding dropout を適用できますが、evaluation mode では無効です。
第14章で見たように、加算は両方の signal を X に反映しますが、一意に逆変換できる梱包ではありません。RoPE や ALiBi を使う model は、位置を別の場所へ注入します。
15.3 Step 4–6: 一つの Transformer Block の内部
GPT-2 block は二行で表せます。
U = X + Dropout(MHA(LN₁(X)))
Y = U + Dropout(MLP(LN₂(U)))
Dropout は訓練 mode のみ有効で、rate は設定に依存します。重要なのは、block の interface は [B, T, 768] のままでも、内部次元は変化することです。
15.3.1 Step 4: Masked Multi-Head Attention
X を正規化して Q、K、V を作ります。head 軸を明示すると:
LN₁(X) [B, 16, 768]
Q, K, V [B, 12, 16, 64]
Q @ Kᵀ [B, 12, 16, 16]
各 head は次を計算します。
scores = Q @ Kᵀ / √64 + causal_mask
weights = Softmax(scores, dim=-1)
head_output = weights @ V [B, 12, 16, 64]
Q–K の内積は、学習された互換度 scoreです。cosine similarity でも、「二つの単語が意味的に関連する確率」でもありません。Causal mask は未来位置に -∞ を加え、Softmax 後の weight を 0 にします。現在位置自身は見えます。
12 head の出力を [B, 16, 768] に連結し、W_O で混合してから residual stream に加えます。
concat(heads) [B, 16, 768]
attention_delta = concat @ W_O [B, 16, 768]
U = X + attention_delta [B, 16, 768]
15.3.2 Step 5: 一つ目の残差経路
恒等経路は通常、深い network を最適化しやすくし、sublayer が一時的に 0 に近い更新を出す余地を与えます。ただし、勾配が絶対に消失も爆発もしないという保証ではありません。
迂回するのは**現在の residual stream X**であり、最初の Token embedding が最終層まで手付かずで保存されるわけではありません。
15.3.3 Step 6: 位置ごとの MLP と二つ目の残差経路
GPT-2 は各位置へ同じ MLP parameter を独立に適用します。
LN₂(U) [B, 16, 768]
Linear 768 → 3072
GELU
Linear 3072 → 768
Y = U + mlp_delta [B, 16, 768]
MLP 内部は実際に 3,072 へ広がります。したがって「block 内で次元は一度も変わらない」は誤りで、固定なのは residual-stream interface です。
GPT-2 Small では MLP weight が総 parameter の約45.5%です。MLP と事実関連・feature 変換を結び付ける分析もありますが、知識が MLP だけに保存されるわけではありません。Embedding、Attention、他の層も共同で働きます。
15.4 Step 7: 12 Block を重ね、Final LayerNorm を適用する
X₀ [B, 16, 768]
→ Block 1 → Block 2 → ... → Block 12
X₁₂ [B, 16, 768]
→ Final LayerNorm
H [B, 16, 768]
各層は別々の parameter を持ち、構造と shape contract だけを共有します。深さごとに局所的・構文的・抽象的な傾向が観察される model はありますが、「前半層は必ず構文、後半層は必ず推論」という hard-coded curriculum はありません。
15.5 Step 8: Hidden State から語彙 Logits へ
GPT-2 は出力射影を Token embedding weight と共有します。Embedding table を E [50257, 768] とすると:
H [B, 16, 768]
logits = H @ Eᵀ [B, 16, 50,257]
Logit i は現在の hidden state と E[i] の内積です。方向と大きさの両方に左右される未正規化の互換度 scoreであり、まだ意味類似度の確率ではありません。
15.5.1 訓練は全位置を使う
Target は同じ sequence を一 Token 右へずらしたものです。Cross-entropy は通常、logits を直接受け取ります。
input : token₀, token₁, ..., token₁₄
target: token₁, token₂, ..., token₁₅
loss = CrossEntropy(logits[:, :-1, :], targets[:, 1:])
数値的に安定な cross-entropy は内部で log_softmax を行います。PyTorch の CrossEntropyLoss などへ正規化済み probabilities を渡すのは contract 違反です。
15.5.2 生成は通常、最後の位置を使う
next_logits = logits[:, -1, :] [B, 50,257]
- Greedy decoding は
argmax(next_logits)を取る - Sampling は temperature、Softmax、top-k/top-p などで logits を変換して抽選する
したがって「最も確率の高い Token が出力」は greedy decoding の説明に限られます。Sampling は別の候補を選ぶことがあります。
15.6 完全な Shape Trace
入力 text B 個の文字列
GPT-2 BPE [B, 16]
Token embedding [B, 16, 768]
+ position embedding [B, 16, 768]
各 block の residual stream: [B, 16, 768]
Q/K/V(head 分割後) [B, 12, 16, 64]
Attention scores [B, 12, 16, 16]
MLP hidden activations [B, 16, 3072]
12 block 後 [B, 16, 768]
Final LayerNorm [B, 16, 768]
Vocabulary logits [B, 16, 50,257]
生成時の最後の位置 [B, 50,257]
選択または sample した Token ID [B]
「shape が変わらない」を正確に言えば、各 block の入口と出口で hidden width が 768 のまま、という意味です。Head split、T×T Attention matrix、広い MLP はそれぞれ内部 shape を持ちます。
15.7 GPT-2 Small の Parameter 数
公開設定から weight、bias、embedding、LayerNorm parameter を直接数えると:
| 構成要素 | およその parameter 数 | 比率 |
|---|---|---|
| Token embedding | 38.60M | 31.0% |
| Position embedding | 0.79M | 0.6% |
| Attention(12層、bias 含む) | 28.35M | 22.8% |
| MLP(12層、bias 含む) | 56.67M | 45.5% |
| LayerNorm 25 個 | 0.04M | 0.1% 未満 |
| LM head | Token embedding と共有、追加 0 | — |
合計は約 124.4M です。GPT-2 論文と初期説明では Small を “117M” と呼びましたが、OpenAI は後に公式 repository で、元の parameter count が誤っていたと注記しました。同じ checkpoint に歴史的な 117M 名と約124Mの直接集計が併存する理由です。
15.8 訓練中の誤差逆伝播
四段階を混同しないでください。
logits = model(input_ids) # 1. forward: parameter は不変
loss = cross_entropy(logits, y) # 2. scalar loss を計算
loss.backward() # 3. 勾配を計算・蓄積。parameter は不変
optimizer.step() # 4. parameter 更新を適用
optimizer.zero_grad() # 次の step に備えて勾配を消す
出力 head と Token embedding が tied weight なら同じ parameter なので、両方の使われ方から来る勾配が同じ table に集まります。Backpropagation は final LayerNorm、12 block、位置 embedding にも届き、optimizer がまとめて更新します。
15.9 章のまとめ
15.9.1 八つの段階
| Step | 操作 | 主要な出力 |
|---|---|---|
| 1 | GPT-2 BPE | Token IDs [B, T] |
| 2 | Token embedding lookup | [B, T, 768] |
| 3 | + learned position embedding | residual stream [B, T, 768] |
| 4 | Pre-LN masked MHA | contextual update [B, T, 768] |
| 5 | 一つ目の residual add | [B, T, 768] |
| 6 | Pre-LN MLP + 二つ目の residual add | [B, T, 768] |
| 7 | 12 block + final LN | hidden states [B, T, 768] |
| 8 | tied output matrix | logits [B, T, 50,257] |
15.9.2 核心の要点
Transformer block のどこでも同じ shape、というわけではありません。正確には residual stream の入口と出口の幅が固定され、head、
T×TAttention matrix、広い MLP は内部 shape を使います。最終 hidden state は語彙 logits になり、訓練は全位置の next-token loss を計算し、生成は通常最後の位置から新しい Token を一つ選びます。
章末チェックリスト
本章を終えたら、次を説明できるはずです。
- Text から語彙 logits までを追跡する
- residual-stream shape と block 内部 shape を区別する
- Pre-Norm block の二つの式を書く
- causal mask、logit、Softmax、decoding の役割を分ける
- backward と optimizer update が別工程だと説明する
- 設定から GPT-2 Small の parameter 数を見積もる
コード実装
Part 5 でこの流れを code にします。
- 第18章:
model.py— model 定義 - 第19章:
train.py— training loop - 第20章:
inference.py— inference logic
次章へ
Forward function が同じでも、訓練と生成では呼び方が大きく違います。訓練は多くの位置を並列予測し、生成は新しい Token を次の呼び出しへ戻します。第16章では二つの mode を分け、KV cache への準備をします。