Appearance
文件重點 — micrograd
1. Value 類別(engine.py)
- 封裝一個標量值與其梯度
- 透過
_prev追蹤計算圖的父子關係 - 每個運算子都註冊一個
_backward閉包,定義如何累積梯度 - 支援
+,*,**,relu,-,/及其反身版本
2. 反向傳播流程
- 呼叫
backward()時先做拓撲排序 - 根節點梯度設為
1(dy/dy = 1) - 按逆拓撲序呼叫每個節點的
_backward() - 梯度透過累加(
+=)而非賦值,因為一個節點可能有多個子節點
3. 鏈鎖律的程式碼實現
python
# 加法:梯度直接傳遞
def _backward():
self.grad += out.grad # dL/da = dL/dout
other.grad += out.grad # dL/db = dL/dout
# 乘法:交叉相乘
def _backward():
self.grad += other.data * out.grad # dL/da = b * dL/dout
other.grad += self.data * out.grad # dL/db = a * dL/dout
# ReLU:小於 0 則梯度為 0
def _backward():
self.grad += (out.data > 0) * out.grad4. 神經網路層(nn.py)
| 類別 | 用途 | 關鍵行為 |
|---|---|---|
Module | 基類 | 提供 zero_grad() 與 parameters() |
Neuron | 單一神經元 | w·x + b,可選 ReLU |
Layer | 一層神經元 | 多個 Neuron 的集合 |
MLP | 多層感知機 | 串接多個 Layer |
5. 訓練迴圈(demo.ipynb)
- SVM max-margin loss + L2 正則化
- 學習率退火(
lr = 1.0 - 0.9*k/100) - SGD 更新參數
- 100 步內從 50% 提升到 100% 準確率