Skip to content

micrograd

一個極小的自動微分引擎(而且會咬人!)。實作了基於動態建構 DAG 的反向傳播(反向模式自動微分),並在其上建構了一個 PyTorch 風格的小型神經網路庫。兩者都非常小巧,分別只有約 100 行和 50 行程式碼。DAG 僅在標量值上操作,因此我們會將每個神經元拆解成其所有的個別加法與乘法。然而,這已足以建構完整的深度神經網路來進行二元分類,如 demo notebook 所示。適合用於教育目的。

安裝

bash
pip install micrograd

使用範例

以下是一個稍微刻意安排的範例,展示了一系列支援的運算:

python
from micrograd.engine import Value

a = Value(-4.0)
b = Value(2.0)
c = a + b
d = a * b + b**3
c += c + 1
c += 1 + c + (-a)
d += d * 2 + (b + a).relu()
d += 3 * d + (b - a).relu()
e = c - d
f = e**2
g = f / 2.0
g += 10.0 / f
print(f'{g.data:.4f}') # 輸出 24.7041,前向傳播的結果
g.backward()
print(f'{a.grad:.4f}') # 輸出 138.8338,即 dg/da 的數值
print(f'{b.grad:.4f}') # 輸出 645.5773,即 dg/db 的數值

訓練神經網路

demo.ipynb notebook 提供了訓練二層神經網路(MLP)二元分類器的完整示範。透過初始化 micrograd.nn 模組中的神經網路、實作簡單的 SVM「最大間隔」二元分類損失函數,並使用 SGD 進行優化。如 notebook 所示,使用帶有兩個 16 節點隱藏層的二層神經網路,我們在 moon 資料集上達成了以下決策邊界:

2d neuron

追蹤與視覺化

為方便起見,trace_graph.ipynb notebook 可產生 graphviz 視覺化圖。下方是一個簡單的二維神經元範例,透過對以下程式碼呼叫 draw_dot 產生,圖中顯示了每個節點的資料(左側數字)與梯度(右側數字)。

python
from micrograd import nn
n = nn.Neuron(2)
x = [Value(1.0), Value(-2.0)]
y = n(x)
dot = draw_dot(y)

2d neuron

執行測試

要執行單元測試,你需要安裝 PyTorch,因為測試使用 PyTorch 作為參考來驗證計算梯度的正確性。然後執行:

bash
python -m pytest

授權條款

MIT