nn-anatomy-transformer

実装メモ (Implementation Notes) — Transformer 版

このファイルは Transformer 版の開発記録 (フェーズごと、UI/UX 調整、決定事項など)。プロジェクト紹介・利用案内は ../README.md、設計の全文は design.md を参照。

姉妹プロジェクト nn-anatomy (MLP 版 v1) の哲学を Transformer に拡張した教材。実装は新規だが、思想・テスト方針・bundle 戦略は v1 から継承。


進捗

フェーズ 内容 状態
P0 設計書 + プロジェクト雛形 完了 (v0.3 で hand-crafted preset 方針確定)
P1 matrix.js + tokenizer.js + numpy 参照実装 完了 (JS 27 / Python 13 = 40 件、PyTorch 不採用)
P2 tools/build_preset.py + デフォルト preset 構築 完了 (Python +23 件、preset 26.1 KB、self-check 16/16)
P3 Tier 1 model.js (forward only) + presets.js inline 完了 (JS +12 = 39 件、attention fixture と 1e-12 一致、計 75 件)
P4 Tier 1 view.js (静的描画) + pan/zoom + 最小 controller 完了 (bundle 53.6 KB、Tier 1 が画面に出る)
中間 レイアウトを上下分割に変更 完了 (controls / network / side の縦 3 段、bundle 54.1 KB)
P5 Tier 1 explain.js + cell click/hover + Attention Map 常駐 完了 (bundle 72.1 KB、8 種行列の 3 段板書)
P6 Tier 1 Lesson T1-T5 + UI Lesson セレクタ 完了 (bundle 85.6 KB、JS +8 = 47 件、計 83 件)
P7 Tier 2 (Multi-Head + 残差 + LN + FFN) + Lesson T6-T8 未着手
P6 Tier 1 Lesson T1-T5 + 8 文セレクタ 未着手
P7 Tier 2 (Multi-Head + 残差 + LN + FFN) + Lesson T6-T8 未着手
P8 Tier 3 (多 Block + 複数 Preset 切替) + Lesson T9 + ドキュメント完備 未着手

P0 (設計書 + プロジェクト雛形)

完了

v1 からの方針継承

v1 からの方針変更

大きな転換 (0.1 → 0.2 で決定)

技術構成の変更

ボツ / 後送りにした案

P1 (matrix.js + tokenizer.js + numpy 参照実装) 完了

完了

v0.2 → v0.3 の方針転換

P2 (build_preset.py + デフォルト preset 構築) 完了

完了

設計値

Self-check 結果 (16 件すべて pass)

attention pattern の強さ範囲: 0.78〜0.96 (= 教育的に「明確に注目」と読める)

P3 (model.js + presets.js inline) 完了

完了

設計上のポイント

P4 (view.js + pan/zoom + 最小 controller) 完了

完了

設計上の判断

バンドル内訳 (53.6 KB)

モジュール 寄与
presets.js (inline preset JSON) ~9 KB
view.js ~10 KB
style.css ~5 KB
model.js ~4 KB
matrix.js ~3 KB
controller.js ~4 KB
その他 (rng, tokenizer, lessons stub, explain stub, index.html) ~18 KB

予算 250 KB に対して大幅に余裕がある状態。P5 (explain.js) で式テンプレートが入っても 80-100 KB 程度で収まる見込み。

レイアウト変更 (横並び → 縦 3 段)

行列は横長 (5×16 = 800 px) なので、右側 480 px の補助パネルが幅を圧迫していた問題を解消。style.css の grid を 1fr × (auto / 1fr / 320px) に変更し、controls / network / side の縦並びにした。これでメインビューが画面幅をフルに使える。bundle 53.6 → 54.1 KB (+0.5 KB のみ、コメント増分)。

P5 (explain.js + cell click/hover interactivity) 完了

完了

設計上の判断

バンドル増分内訳 (54.1 → 72.1 KB = +18 KB)

寄与 増分
explain.js (3 段板書テンプレ) ~10 KB
style.css (式表示・attmap・selected) ~3 KB
controller.js (クリック配線、refresh) ~1 KB
view.js (handlers, setSelection, click) ~1 KB
その他 ~3 KB

予算 250 KB 内で大幅余裕。Tier 2 で multi-head + LN + FFN を追加しても 130 KB 程度で収まる見込み。

P6 (Lesson T1-T5 + Lesson セレクタ) 完了

完了

各 Lesson の中身

設計上の判断

バンドル増分内訳 (72.1 → 85.6 KB = +13.5 KB)

寄与 増分
lessons.js (Lesson T1-T5 hint + checks 計約 9 KB の日本語) ~9 KB
controller.js (Lesson 配線、ヘルパ整理) ~2 KB
index.html (Lesson セレクタ追加) ~0.3 KB
style.css (.lesson-card 関連) ~1 KB
その他 ~1 KB

予算 250 KB 内で大幅余裕。Tier 2 (multi-head + LN + FFN + Lesson T6-T8) で +50-70 KB を見込んでも 150-160 KB 程度。

次のステップ (P7: Tier 2)

src/js/model.js に multi-head + 残差 + LayerNorm + FFN を追加し、設計書 §6.4-§6.6 の数式に従って forward を拡張。build_preset.py で Tier 2 用の重み (W_Q/W_K/W_V を h=2 に分割、LN の γ/β、FFN の W1/b1/W2/b2) を hand-crafted で構築。view.js に FFN タブと head 切り替え UI を追加。Lesson T6-T8 を作成 (Multi-Head の比較、残差+LN、FFN の knowledge memory 観察)。