教員・TA・自学者向けの授業設計ガイド。Lesson 1〜10 を どう組み合わせて何時間でどう運用するか の参考指針と、各 Lesson の 学習目標 / よくあるつまずき / 補足質問 をまとめる。
関連: design.md §9 (カリキュラム概要)、math-notes-transformer.md (数式リファレンス)、シミュレータ本体 (build/nn_sim_transformer.html)。
0. 教材としての位置づけ
- 対象: 大学情報系学部 3〜4 年次以上、深層学習・NLP の応用科目
- 前提: 線形代数 (行列積、内積)、確率の基礎 (softmax)、姉妹 nn-anatomy (MLP 版 v1) で習得した forward / backward / chain rule
- 本シミュレータが扱うもの: Transformer の forward (推論) 動作のみ。学習プロセスの理解は MLP 版で完結している前提
- 教材の特徴:
- 重みは hand-crafted preset で固定 (= attention map / FFN 検出器が常に「教材通り」に出る)
- 各セルをクリックすると 3 段板書 (一般形 → 当てはめ → 数値) で計算過程が展開する
- Lesson 文中の数値は Python テストで自動検証されているので、シミュレータ表示と教材記述が常に一致
1. 想定する授業設計
1.1 ミニマム構成 (90 分 1 コマ × 1 回)
「Transformer の forward を 1 周だけ通す」のがゴール。
| 時間 |
内容 |
使う Lesson |
| 0:00〜0:15 |
イントロ + 座学: Self-Attention の概念、Q/K/V の役割 |
(口頭説明) |
| 0:15〜0:30 |
シミュレータ起動、Embed タブで Lesson 1, 2 を流し見 |
Lesson 1, 2 |
| 0:30〜0:55 |
Q/K/V 観察 (Lesson 3, 4, 5)。bond の概念を導入 |
Lesson 3, 4, 5 |
| 0:55〜1:15 |
Attention Score → softmax → attention map (Lesson 6, 7) |
Lesson 6, 7 |
| 1:15〜1:30 |
Multi-Head の役割分担 (Lesson 8) |
Lesson 8 |
残差・LN・FFN (Lesson 9, 10) は宿題として個別観察を課す形になる。
1.2 標準構成 (90 分 × 3 回 = 270 分)
各回で 3〜4 Lesson を扱う。
| 回 |
テーマ |
扱う Lesson |
演習 |
| 1 |
入力表現と Q/K/V |
Lesson 1〜5 |
preset の dim 設計表を渡して、ある token の X 値を手で計算させる |
| 2 |
Attention の計算 |
Lesson 6, 7, 8 |
Sample 切替で異なる文の attention map を比較、bond の立ち方を観察 |
| 3 |
残差・LN・FFN |
Lesson 9, 10 |
LayerNorm 前後の行の mean/std を手計算で求めさせ、シミュレータと突き合わせる |
1.3 集中構成 (1 日ワークショップ、6〜7 時間)
各 Lesson に 30〜45 分かけて十分に観察・議論する。最後に「自分が hand-crafted の preset を変えたら attention/FFN がどう変わるか」のミニ課題で締める (preset 改変 → make build-preset && make inline-preset && make bundle で再ビルド)。
2. 各 Lesson の指導案
Lesson 1. Token Embedding を見る
- 学習目標: token id → 16 次元ベクトルへの変換が「ハッシュではなく構造化された値の埋め込み」であることを理解する
- 観察対象: Embed タブ最上段の
W_E[tokens] 行列。3 つの行 (T2 美しい / T3 花 / T0 これ) で 1 次カテゴリと 2 次特徴の値を確認
- キーポイント: preset では
+3.000 (1 次カテゴリ)、+1.000 (2 次特徴)、+0.300 (識別痕跡) と桁が違う。token を「種類」「特徴」「個体」の 3 階層で表現
- よくあるつまずき:
- 「W_E は学習されたもの?」→ ここでは hand-crafted。「典型的な学習結果として人手で設計した値」と説明
- X 行列を見て「d9 が +1.0?『美しい』はサイズ特徴を持たないのでは?」→ X = W_E + W_P で位置エンコーディングが乗っているせい。Lesson 2 で扱う
- 補足質問例:
- 「猫」と「花」は意味的に近い? → d8 (美しさ) を持つのは「花」だけ、d9 (サイズ) を持つのは「猫」だけ。共通する特徴 dim はない
- 「私」と「これ」は同じカテゴリ? → ともに d2 = +3 (指示詞・代名詞)。preset は 2 つを区別しない
Lesson 2. 位置エンコーディング (W_P) を見る
- 学習目標: 同じ token でも位置が違えば違うベクトルになる仕組みを sin/cos の式から理解
- 観察対象: W_P 行列。pos 0 の行 (sin(0)=0, cos(0)=1 が交互)、高 dim (d14, d15) のほぼ定数化
- キーポイント:
- 偶数 dim = sin、奇数 dim = cos の交互配置
10000^(2i/d_model) で dim 軸方向に異なる周波数を重ね合わせる
- 低 dim ほど位置に敏感、高 dim ほど位置に不感
- よくあるつまずき:
- 「なぜ sin と cos の両方?」→ 「位置 t と t+k の関係」を線形で取り出せる性質のため (詳細は Vaswani 2017 §3.5、本講義では深入りしない)
- 「サンプルを変えても W_P が変わらない理由?」→ W_P は token と無関係、位置だけで決まる固定値
- 補足質問例:
- サンプル #1 と #3 で T0「これ」「私」の X 行を比較。違いはどこから? → W_E は別だが W_P は同じ位置 0 で共通
Lesson 3. Q (Query) projection を見る
- 学習目標: Q が「自分はどんな相手を見たいか」の問い合わせベクトルである、を bond 配線から理解
- 観察対象: W_Q 行列の非ゼロ位置 (3 つだけ)、Q 行列 [head 0] の T2「美しい」行
- キーポイント:
- bond は preset で 3 本だけ作ってある (head 0 の col 0/1、head 1 の col 0)
- bond 0 の Q 側に流れるのは形容詞 dim (d1)
- 「位置エンコーディングの混入」: 形容詞でない token の Q にも PE 由来の小さな値が紛れる現象
- よくあるつまずき:
- 「W_Q が 16×16 で、bond が 3 つだけ? 残りの dim は何?」→ preset で意図的に 0 にしている。残り dim は学習で別の関係を覚える余地として用意されているが本シミュレータでは未使用
- 「Q[T2 美しい, head 1, d0] が +0.807 ある。なぜ?」→ X[T2, d3] = 0 (美しいは述語ではない) + W_P[t=2, d3] ≈ 0.807 が W_Q[d3, h1.d0]=1 を経由して漏れた。「位置エンコーディングの混入」の典型例
Lesson 4. K (Key) projection を見る
- 学習目標: K が Q と非対称な役割を持つ (受信側ラベル) ことを理解。本 preset では「名詞だけが 3 つの bond すべてに信号を流す」非対称構造を観察
- 観察対象: W_K の d0 行 (3 つの bond col に +1)、K[T3 花] の各 head 行が 3.141 で揃う様子、K[T0 これ] が完全に 0
- キーポイント:
- K 側は名詞 dim 1 つが 3 つの bond すべてに流れる「全方位受信機」
- 助詞・形容詞・指示詞・述語などの dim は K では一切流れない
- K[T0] が完全に 0 になるのは X[T0, d0] = 名詞(0) + sin(0) = 0 の特殊条件
- よくあるつまずき:
- 「Q と K で構造が違うのは preset の都合? それとも学習の結果?」→ 学習で得られる「典型的な構造」を hand-crafted で再現したもの。実 Transformer でも非対称性は学習で獲得される
- 「K[T0] が 0 だから T0「これ」を誰も見ない、で正しい?」→ Yes。Lesson 6 で scores の T0 列がすべて 0 になる伏線
Lesson 5. V (Value) projection を見る (identity の意義)
- 学習目標: V = X となる教育的選択の理由と、Multi-Head での V の dim 分配を理解
- 観察対象: W_V (対角線が +1.000 の単位行列)、V [head 0] = X[:, 0..7]、V [head 1] = X[:, 8..15]
- キーポイント:
W_V = I で V_full = X となる「素朴な選択」
- head 0 (前半 8 dim) はカテゴリ系、head 1 (後半 8 dim) は特徴系を運ぶ
- head 1 の奇数 dim (cos の高 dim) は token に関わらずほぼ +1.000 (= 共通の baseline)
- よくあるつまずき:
- 「V も学習で意味のある射影にならないと面白くないのでは?」→ 教材としての透明性のため identity に固定。実 Transformer ではここに「どの dim を後段に送るか」の学習が乗る
- 「head 1 の値がほぼ +1 なのは設計ミスでは?」→ 位置エンコーディングの周波数階層の効果。問題ではなく観察対象
Lesson 6. Attention Score (Q · Kᵀ / √d_k)
- 学習目標: scores 行列が Q と K の内積で作られ、bond の揃った組み合わせで大きくなる仕組みを理解
- 観察対象: scores [head 0] の T2 美しい行、scores セルクリック → 関連 dim 抜粋表 (Q[i, d0..d2] と K[j, d0..d2] の per-dim 内積)
- キーポイント:
- scores は本物の bond 信号 + 位置エンコーディングの混入による共鳴の合算
- √d_k で割るのは softmax 極端化を防ぐスケーリング
- 名詞行 (T3 花) は Q[T3] が PE 漏れだけで scores が小さく、フラットに近い
- よくあるつまずき:
- 「なぜ √d_k で割るのか厳密には?」→ Q, K 各成分が独立に分散 1 と仮定すると内積の分散が d_k になる。スケール調整 (math-notes-transformer.md §3.1 参照)
- 「他列もきっちり 0 になるはずでは?」→ PE が常に乗っているため純粋な 0 にはならない (Lesson 文の重要な観察点)
Lesson 7. softmax と attention map
- 学習目標: softmax が 行内の相対差 で集中度を決めること、scores の大小差が attn の鋭さに非線形に増幅されることを理解
- 観察対象: attn [head 0] の T0 これ行 (T3 花に 0.912 で集中)、T2 美しい行 (T3 花に 0.834 で少し緩く)、T3 花 (名詞) 行のフラット性
- キーポイント:
- scores の +0.9 の差が attn で +8 ポイントの差を生む (softmax の非線形増幅)
- サンプル #1 では head 0 だけ立つ。head 1 は述語 token が無いので diffuse
- bond 2 を見るには Sample を #3 に切り替えて Lesson 7 の補足観察、ないし Lesson 8 で
- よくあるつまずき:
- 「attention は確率なら必ずどこか 1 つに集中する?」→ scores がフラットなら attn もフラット (= 「どこにも特に注目しない」状態)
- 「T3 花の行が flat なのは attention が壊れている?」→ そうではなく、「名詞は Query を発しない側」という設計の帰結
Lesson 8. Multi-Head — 役割分担と同時並行
- 学習目標: 異なる query が異なる head 経由で「同じ token の異なる側面」を取り出す Multi-Head の利得を、X 字型の強さ分布で観察
- 観察対象: サンプル #3 の T0「私」と T4「好き」、それぞれを head 0 / head 1 で見る 4 ケース比較
- キーポイント:
- T0「私」 + head 0 → V[T2 猫] のほぼコピー (+3.83 ≈ +3.91)
- T4「好き」 + head 1 → V[T2 猫] のほぼコピー (head 1 のサイズ特徴 +1.95 ≈ +2.00)
- 反実仮想: head 0 だけだと述語が「猫」のサイズに到達できない、head 1 だけだと指示詞が「猫」の名詞情報を独占できない
- よくあるつまずき:
- 「baseline +1.0 + 増分 +0.489」の足し算が直感と合わない → V[head 1] の baseline 性質 (Lesson 5) と組み合わせて読む
- 「実 Transformer の各 head は何を見ている?」→ 学習で「文法関係 head」「類似性 head」など分化することが知られている (BertViz 等の可視化ツールが参考になる)
Lesson 9. 残差接続 + LayerNorm
- 学習目標: 残差で「自分 + 集めた情報」が並ぶ構造、LayerNorm で各 token の dim 分布が標準化される効果
- 観察対象: T0「私」の X / Y / residual1 を 3 段比較 (d0 と d2 で対照的な振る舞い)、ln1_out の per-row mean=0 / std≈1
- キーポイント:
- d0 (名詞 dim): X=0 → Y=+3.831 → residual1=+3.831 (attention 経由で猫の名詞情報を獲得)
- d2 (指示詞 dim): X=+3.000 → Y=+0.598 → residual1=+3.598 (元の指示詞情報を保持しつつ加算)
- 残差が無ければ d2 が +3 → +0.598 に置き換わって「私が指示詞である」情報が失われる
- よくあるつまずき:
- 「LayerNorm でなぜ token ごとに正規化?」→ token によって信号の大きさがばらつくと後段が不安定になる。各 token の dim パターンだけを残す目的
- 「γ=1, β=0 で固定するのは現実離れ?」→ 教材としての透明性。実 Transformer では γ, β も学習する
- 演習例: T0 行の residual1 を手計算で μ, σ² → 標準化、シミュレータの ln1_out と一致を確認
Lesson 10. FFN (検出器ニューロン) と 1 ブロック完成
- 学習目標: FFN を「per-token な検出器の集合」として理解し、knowledge memory 解釈に触れる
- 観察対象: ffn_h の T0 私 行 (h0/h2/h13/h15 が発火)、各助詞・述語 token がカテゴリ専属の単 dim 検出器を発火させる様子、ln2_out の正規化
- キーポイント:
- 単 dim 検出器 (h0..h11): 1 つの dim を閾値で「立っているか」判定
- AND 検出器 (h12..h15): 名詞 ∧ 特徴の組み合わせ検出
- W2 で「美しい名詞」検出 → 美しさ特徴を強化、という knowledge memory 動作
- よくあるつまずき:
- 「T0「私」で h13 (名詞 ∧ サイズ) が発火するのは『私』が名詞だから?」→ いいえ。attention で「猫」のサイズ特徴を取り込んだ結果。FFN は「自分の dim」と「attention で集めた dim」を区別しない ことに注意
- 「実 Transformer の FFN もこんな素朴な検出器?」→ 検出器に近い解釈 (Geva 2021 等) はあるが、学習で得られるのはもっと複雑なパターン。本シミュレータは最も素朴な実装
- 演習例: サンプル #4「私 は 本 を 読む」で h14 (名詞 ∧ 書物) が発火するか予想 → 確認
3. 演習問題例
3.1 観察課題 (各 Lesson の中で 5 分程度)
- Lesson 1: 「形容詞 token (大きい / 美しい / 人気) のうち、d8 (美しさ) と d9 (サイズ) が両方立つのはどれか?」
- Lesson 6: 「サンプル #4『私 は 本 を 読む』で scores [head 1] の T4「読む」行はどう立つか? (ヒント: 述語 dim を持つ token が頭一つ抜けるはず)」
- Lesson 9: 「T2「猫」 の residual1 行を eyeball で読み、最大 dim と最小 dim を予想 → ln1_out で標準化したらどの dim が +2 を超えるか?」
3.2 計算課題 (持ち帰り 30〜60 分)
- 「サンプル #1 で T0 これ → T3 花 の attention が 0.912 になる過程を、scores [head 0] の T0 行を手計算で再現せよ。」(Q[T0] と K の各列を hand 計算 → softmax)
- 「LayerNorm の式から、γ = 1, β = 0 で残差付き入力
[3, -1, -1, -1]^T (d_model = 4 仮定) を正規化した結果を計算せよ。シミュレータの ln1_out と桁が合うか確認。」
3.3 設計課題 (発展)
- 「もし W_Q[d8, head 0 col 2] = 1 を追加したら attention map はどう変わるか? 仮説を立ててから
tools/build_preset.py を編集して試せ。」
- 「FFN の AND 検出器 h12 (名詞 ∧ 美しさ) が発火する token を、サンプル全 8 文の中から列挙せよ。」(
make test-py で test_lesson10_ffn_neurons_fire_for_T0_私 を改造して全サンプルに広げる方針)
4. つまずきの種類別対処
| 症状 |
原因の典型 |
対処 |
| 「数値が一致しない」 |
端末の Forward 後にサンプル切替したが Lesson の sampleIdx と違う |
Lesson セレクタを再選択する。Sample を変えても Lesson 文脈は保たれるが、Lesson 文中の数値は preset で固定の sample に対するもの |
| 「同じ Lesson でも数値が違って見える」 |
表示桁の問題。+0.020 と +0.019 のような微妙な差異は丸め |
Lesson 文では 3 桁丸めで書いている。シミュレータは toFixed(3) で表示するので一致する |
| 「PE の cos(2/100^(1/8)) が思った値と違う」 |
dim 番号の偶奇取り違え。i = d/2 の整数除算 |
math-notes-transformer.md §1.2 を参照、d=2 (偶数) は sin、d=3 (奇数) は cos |
| 「attention が確率なのに行の合計が 1 にならない」 |
違う head の同じ行を見ている。head 別に softmax |
「[head 0]」「[head 1]」の表記を必ず確認 |
| 「FFN h13 が発火する条件がよく分からない」 |
入力の各 dim を見るだけでは判断できない、AND 検出器の閾値を理解する必要 |
b1 = -0.5 と W1 の +0.6 ずつから、両方の入力 dim が約 +0.83 以上のときに発火と計算で示す |
5. 関連するドキュメントへのリンク