【中字】Python 从零手写带自动微分的反向传播
Deep Learning with Yacine
https://www.youtube.com/watch?v=heSdPbAfFH4
视频介绍了自动微分(AD)这个算法,它在深度学习框架里特别重要,比如 PyTorch 的 autograd 机制就离不开它。视频里解释说,AD 的作用就是把神经网络训练过程中复杂的反向传播过程给简化了,反向传播本来是要算梯度来更新模型权重的。
视频里讲,AD 的运作原理是先构建一个有向无环的计算图,图里把所有的运算都表示出来。然后,在反向传播的时候,它就自动用链式法则来算梯度,把累积的梯度从图的后面往前传,在每个节点上都乘以局部的导数。
视频还详细讲了实现方式。它会把 `Value` 对象定义成计算图里的节点。每个 `Value` 对象都存着自己的数值 `data`、梯度 `grad`、指向前驱节点(也就是输入)的引用 `_prev`,以及生成它的操作 `_op`。而每个操作(比如加法、乘法、ReLU 等)都要自己定义一个 `_backward` 函数。这个函数呢,会附在输出的 `Value` 节点上,它负责计算局部偏导数,然后把局部导数乘以累积的 `out.grad`,这样就把梯度往回传给它的输入节点了。这里有个非常关键的点,就是梯度一定要用 `+=` 来累加,千万不能覆盖掉之前的值。
视频里说,整个反向传播过程主要分两步:
1. **构建计算图:** 从输出节点开始递归地访问所有节点,然后进行拓扑排序,这样就能确保梯度计算的顺序是正确的。
2. **计算梯度:** 逆序遍历已经构建好的计算图(从输出到输入),先把输出节点的梯度设为 1,然后依次调用每个节点的 `backward` 方法,这样梯度就能在整个网络里传播和累加起来了。
有了这种系统性的设计,再加上把每个原子计算单元和它们的局部导数都定义好了,梯度计算就变得非常直接和高效了。
立即观看