反向传播是神经网络训练时算梯度的核心算法。模型先用前向传播算出预测,再把预测和正确答案之间的误差,沿着网络一层一层往回传,算出每个参数对这份误差“负多少责任”,最后把这些责任交给梯度下降去更新参数。它本身不直接改参数,只负责高效地算出梯度。没有它,几千亿参数的大模型每次训练要算的梯度根本算不起,深度学习也就无从谈起。
误差是怎么一步步传回去的
先正向走一遍:输入经过每一层变换得到预测,再用损失函数算出误差有多大,分类任务常用交叉熵来衡量这份误差。然后反向传播登场:它从输出层出发,借助链式法则把梯度逐层往回乘——每经过一层,就乘上这一层对输入的导数,激活函数的导数也在这个环节参与计算。传到哪一层,哪一层参数的梯度就有了。拿到全部梯度后,梯度下降按学习率把参数往误差减小的方向挪一小步,一轮训练就此完成。整个过程只依赖求导规则,不需要逐个参数去试,所以哪怕参数以亿计,也能在一次前向、一次反向后全部更新。
反向传播不是训练本身,别把它和三件事搞混
第一,它不等于梯度下降:反向传播算梯度,梯度下降用梯度更新参数,两者分工不同,缺一不可。第二,它不是唯一的求导办法:数值微分是逐个参数加微小扰动、看输出变化,参数一多就慢得没法用,反向传播靠链式法则一次算全,才撑得起深度网络。第三,推理时用不到它:模型回答问题只走前向传播,反向传播只在训练时出现。还有一个常见误解:它并不能解决梯度消失——误差传得越远、乘的导数越多,梯度可能越缩越小,深层参数几乎学不到东西,这个问题要靠残差连接、归一化等结构来缓解。
普通人什么时候会碰到它
直接碰到的场景不多,但训练大模型时处处是它:反向传播要保存中间结果,显存占用大半来自它,所以训练才需要混合精度、梯度检查点这些省显存的办法。用 PyTorch 这类框架训练时,loss.backward() 那一行代码就是在触发反向传播。判断一个训练讲解靠不靠谱,也可以看它有没有讲清这条链:前向算预测、损失定误差、反向传梯度、梯度下降更新参数——四步缺一不可,少了任何一步,训练都转不起来。