Skip to content

文件重點 — micrograd

1. Value 類別(engine.py)

  • 封裝一個標量值與其梯度
  • 透過 _prev 追蹤計算圖的父子關係
  • 每個運算子都註冊一個 _backward 閉包,定義如何累積梯度
  • 支援 +, *, **, relu, -, / 及其反身版本

2. 反向傳播流程

  1. 呼叫 backward() 時先做拓撲排序
  2. 根節點梯度設為 1dy/dy = 1
  3. 按逆拓撲序呼叫每個節點的 _backward()
  4. 梯度透過累加+=)而非賦值,因為一個節點可能有多個子節點

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.grad

4. 神經網路層(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% 準確率