这94行代码就是训练一个神经网络所需的全部。其他一切都只是为了效率。
这是我早先的项目Micrograd。它实现了一个标量值的自动求导引擎。你从叶子节点的一些数字开始(通常是输入数据和神经网络参数),通过像+和*这样的操作构建计算图,将它们混合,图在最后以一个单一值结束(损失)。然后你反向遍历图,在每个节点应用链式法则来计算梯度。梯度告诉你如何调整参数以减少损失(从而改进你的网络)。
有时候当事情变得太复杂时,我会回到这段代码,稍微喘口气。但是好吧好吧,你确实也需要知道计算图应该是什么(例如MLP -> Transformer),损失函数应该是什么(例如自回归/扩散),如何最好地利用梯度进行参数更新(例如SGD -> AdamW)等等。但这是大部分事情的核心。
1986年Rumelhart、Hinton、Williams的论文推广并使用了这种算法(反向传播)来训练神经网络:
micrograd在Github上:https://t.co/GaTd16jRnB
以及我(现在有点旧的)YouTube视频,我在其中非常缓慢地构建和解释:
