缺陷案例實戰:精準定位梯度覆蓋 Bug
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. 極簡復現用例:$a = \text{Value}(3.0); b = \text{Value}(4.0); f = (a + b) * a; f.\text{backward}()$。
2. 因為在非分叉圖中,每個節點只接收一次反向梯度回傳,賦值 (=) 碰巧等於累加結果,掩蓋了真實缺陷。
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.