一文でまとめると: 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 = 768
  • n_layers = 12
  • n_heads = 12、したがって d_head = 64
  • d_ff = 3072
  • vocab_size = 50,257
  • 学習型絶対位置 table の長さは 1,024
蒔絵師の例が GPT-2 Token IDs、embedding、12 個の Pre-Norm block、語彙 logits を通る完全な順伝播

15.1.2 GPT-1 と GPT-2 の LayerNorm 配置

両モデルとも causal self-attention を使いますが、正規化の順番が違います。

GPT-1GPT-2
Sublayer patternLN(x + Sublayer(x))x + Sublayer(LN(x))
通称Post-NormPre-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 Pre-Norm block 内の LayerNorm、masked multi-head attention、MLP、二つの残差経路と tensor 形状

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 にします。現在位置自身は見えます。

説明用 Attention score が causal mask と行ごとの Softmax を通って weight になる図

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 final hidden state を共有 Token embedding の転置で語彙 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 数

GPT-2 Small の Token embedding、位置、Attention、MLP、LayerNorm、共有出力 head の parameter 台帳

公開設定から weight、bias、embedding、LayerNorm parameter を直接数えると:

構成要素およその parameter 数比率
Token embedding38.60M31.0%
Position embedding0.79M0.6%
Attention(12層、bias 含む)28.35M22.8%
MLP(12層、bias 含む)56.67M45.5%
LayerNorm 25 個0.04M0.1% 未満
LM headToken embedding と共有、追加 0

合計は約 124.4M です。GPT-2 論文と初期説明では Small を “117M” と呼びましたが、OpenAI は後に公式 repository で、元の parameter count が誤っていたと注記しました。同じ checkpoint に歴史的な 117M 名と約124Mの直接集計が併存する理由です。


15.8 訓練中の誤差逆伝播

forward logits、cross-entropy、backprop の勾配、optimizer 更新という四つの独立した段階

四段階を混同しないでください。

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操作主要な出力
1GPT-2 BPEToken IDs [B, T]
2Token embedding lookup[B, T, 768]
3+ learned position embeddingresidual stream [B, T, 768]
4Pre-LN masked MHAcontextual update [B, T, 768]
5一つ目の residual add[B, T, 768]
6Pre-LN MLP + 二つ目の residual add[B, T, 768]
712 block + final LNhidden states [B, T, 768]
8tied output matrixlogits [B, T, 50,257]

15.9.2 核心の要点

Transformer block のどこでも同じ shape、というわけではありません。正確には residual stream の入口と出口の幅が固定され、head、T×T Attention 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 への準備をします。

このページを引用する
Zhang, Wayland (2026). 第15章: Transformer の完全な順伝播 - 入力から出力まで. In Transformer アーキテクチャ:直感から実装まで. https://waylandz.com/llm-transformer-book-ja/chapter-15-full-forward-pass/
@incollection{zhang2026transformer_ja_chapter-15-full-forward-pass,
  author = {Zhang, Wayland},
  title = {第15章: Transformer の完全な順伝播 - 入力から出力まで},
  booktitle = {Transformer アーキテクチャ:直感から実装まで},
  year = {2026},
  url = {https://waylandz.com/llm-transformer-book-ja/chapter-15-full-forward-pass/}
}