
一个微小的自动求导引擎(有点厉害!:))。它在动态构建的DAG上实现反向传播(反向模式自动微分),并在其上构建了一个具有PyTorch类似API的小型神经网络库。两者都非常小,分别只有大约100行和50行代码。DAG只对标量值进行操作,例如我们将每个神经元分解为所有单独的微小加法和乘法。然而,这足以构建整个进行二元分类的深度神经网络,如演示笔记本所示。可能对教育目的有用。
pip install micrograd
下面是一个稍微有些人为的示例,展示了许多可能支持的操作:
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 提供了训练一个2层神经网络(MLP)二元分类器的完整演示。这是通过从 micrograd.nn 模块初始化一个神经网络,实现一个简单的SVM"最大间隔"二元分类损失函数,并使用SGD进行优化来实现的。如笔记本所示,使用一个带有两个16节点隐藏层的2层神经网络,我们在月亮数据集上实现了以下决策边界:

为方便起见,笔记本 trace_graph.ipynb 生成graphviz可视化图。例如,下面这个图是一个简单的2D神经元,通过在下面的代码上调用 draw_dot 得到,它显示了数据(每个节点中的左数字)和梯度(每个节点中的右数字)。
from micrograd import nn
n = nn.Neuron(2)
x = [Value(1.0), Value(-2.0)]
y = n(x)
dot = draw_dot(y)
要运行单元测试,您必须安装 PyTorch,测试使用它作为参考来验证计算梯度的正确性。然后简单执行:
python -m pytest
MIT