反向传播是什么?神经网络算梯度的核心算法
反向传播(Backpropagation,简称 BP)是训练神经网络最核心的算法。它的作用是高效地计算出损失函数对网络中每一个参数的梯度,也就是每个参数应该朝哪个方向调整、调整多少,才能让网络的预测误差变小。有了这些梯度,再用梯度下降等优化方法更新参数,网络就能一步步地学习。几乎所有的深度学习模型,从图像识别网络到大语言模型,都是用反向传播来训练的。
为什么需要反向传播
一个神经网络可能有数百万乃至数千亿个参数。训练时,我们需要知道损失对每一个参数的导数。最笨的办法是逐个地去试:把某个参数稍微改动一点,重新计算一次损失,看损失变化了多少。但这样每个参数都要重新计算一遍整个网络,对于有百万个参数的网络,计算一次梯度就要计算百万次,完全不可行。反向传播的巧妙之处在于:只需要一次前向计算和一次反向计算,就能同时得到所有参数的梯度,计算量只相当于前向计算的几倍。
它是怎么工作的
反向传播分为两个阶段。前向传播:把一个训练样本输入网络,从输入层开始,一层一层地往后计算,每一层把上一层的输出加权求和、经过激活函数,传给下一层,最终得到网络的输出,再用损失函数计算输出与正确答案之间的误差。在这个过程中,把每一层的中间结果保存下来。反向传播:从输出层开始,往回逐层地计算梯度。核心工具是微积分中的链式法则:如果 A 影响 B,B 影响 C,那么 A 对 C 的影响,等于 A 对 B 的影响乘以 B 对 C 的影响。首先计算损失对输出层的梯度,然后利用链式法则,把这个“误差信号”传回到上一层,计算出损失对上一层输出和参数的梯度,再继续往前传,一直传到第一层。每一层只需要用到后一层传回来的误差信号,以及前向传播时保存下来的本层的中间结果,就能算出本层的梯度。这样,误差从输出端“反向”地传遍了整个网络,算法也因此得名。
历史
反向传播的数学思想有很长的历史。芬兰学者 Seppo Linnainmaa 在 1970 年提出了反向模式的自动微分,这正是反向传播的数学本质;美国学者 Paul Werbos 在 1974 年的博士论文中提出了用它来训练神经网络。但这一方法真正广为人知,是在 1986 年:大卫·鲁梅尔哈特、杰弗里·辛顿和罗纳德·威廉姆斯在《自然》杂志上发表了一篇论文,展示了用反向传播训练多层神经网络,能够让网络的隐藏层学到有用的内部表示。这项工作解决了多层神经网络如何训练的难题,推动了神经网络研究在 20 世纪 80 年代末的复兴,也为后来的深度学习奠定了基础。辛顿后来因在深度学习方面的贡献,获得了 2018 年的图灵奖和 2024 年的诺贝尔物理学奖。
在今天的深度学习中
如今,开发者几乎不需要手工推导和编写反向传播的代码。PyTorch、TensorFlow、JAX 等深度学习框架都实现了自动微分:开发者只需要定义网络的前向计算过程,框架就会自动地记录计算图,并在需要时自动地完成反向传播,计算出所有的梯度。反向传播也有一些需要注意的问题:在很深的网络中,梯度在逐层相乘的过程中可能变得越来越小或越来越大,导致梯度消失或梯度爆炸,为此人们发展了 ReLU 激活函数、残差连接、归一化层、梯度裁剪等技术;反向传播需要保存前向计算的中间结果,训练大模型时会占用大量的显存,可以用“激活重计算”的方法,用额外的计算换取显存的节省。此外,反向传播是否与大脑的学习机制相似,一直是神经科学和人工智能研究者讨论的话题,辛顿本人也曾探索过不依赖反向传播的替代学习算法。