logo
0
0
Login

micrograd

awww

一个微小的自动求导引擎(有点厉害!:))。它在动态构建的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层神经网络,我们在月亮数据集上实现了以下决策边界:

2d neuron

跟踪/可视化

为方便起见,笔记本 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)

2d neuron

运行测试

要运行单元测试,您必须安装 PyTorch,测试使用它作为参考来验证计算梯度的正确性。然后简单执行:

python -m pytest

许可证

MIT

About

这个项目是一个极简的自动求导引擎和小型神经网络库,主要用于学习和教学,而不是工业级训练。

664.00 KiB
0 forks0 stars1 branches1 TagREADMEMIT license
Language
Python9.7%
Others90.3%