欠陥ケース演習:勾配上書きバグの特定と診断
Agent支援エンジニアリング確認
前提条件
第32日の勾配累積加算の仕組みと数値勾配検査。
学習目標
極小再現例(MRE)を構築し、代入による上書きが引き起こす潜在的な勾配誤りを数値差分比較によって正確に特定する。
手順
CLI を使用して勾配欠陥の診断コマンドを実行します:
python3 projects/autograd/cli.py diagnose --bug-type overwrite-accumulation
診断プログラムが $f = (a + b) \cdot a$ においてノード a を特定し、解析勾配 $7.0$ に対する数値差分勾配 $10.0$(相対誤差 $30\%$)を検出する様子を確認してください。
演習と予測記録
1. 勾配上書きバグを確実に再現する極小再現例(MRE)のコードを記述してください。
2. $z = x \cdot y$ のような単一分岐のテストケースでは、このバグが存在していてもなぜ gradcheck に合格してしまうのかを説明してください。
3. _backward() において、このバグを修正するための具体的な修正内容を示してください。
分岐のない線形なグラフ(各変数が一度しか使われない場合)では、各ノードに伝わる勾配は 1 回だけなので、累積 (+=) と代入 (=) が偶然同じ結果になります。変数が複数の演算で再利用されるときにのみバグが現れます。
参考解答:
1. MRE: $a = \text{Value}(3.0); b = \text{Value}(4.0); f = (a + b) * a; f.\text{backward}()$。
2. 分岐のないグラフでは、各ノードが受け取る勾配は 1 つの経路からのみであるため、代入 (=) でも偶然正しい値となって欠陥が隠蔽されるためです。
3. すべての演算子の _backward() クロージャで self.grad = ... を self.grad += ... に変更します。
累積実装と上書き実装を判別する極小テストケースを自力で構築し、その数学的原理を説明できること。
公式ソースリソースと権利証跡
micrograd: A tiny scalar-valued autograd engine
該当セクション・タイムスタンプ: micrograd/engine.py: class Value (_backward closures and backward() topological sort); README 'Example usage'
検証バージョンと日付: commit a9a9f94 (Verified: 2026-10-30)
Direct demonstration of how simple variable reuse creates branching DAGs requiring accumulation.
Autograd backward pass and multivariable calculus
Local diagnostic harness in projects/autograd/diagnostics.py.
比較対象候補リソースと選定評価 (2)
Production scale, but too large and complex for tracing by hand in introductory lessons.
Vectorized autograd; micrograd's pure scalar model is pedagogical for hand backprop.