引言
上一篇文章我们给AI请了一位“阅卷老师”——损失函数。它能把AI的预测和正确答案之间的差距算成一个具体的数字。AI终于知道自己错没错、错多少了。
但光知道错了没用,关键是怎么改。你考试得了58分,老师告诉你“离及格差2分”,然后呢?你得知道是选择题错得多还是大题扣了分,是哪个知识点没掌握,才能针对性复习。
神经网络也是这个逻辑。损失函数只给出了一个总分,但网络里有成千上万个权重参数,到底是哪个权重“拖了后腿”?应该朝什么方向调?调多大?
这就引出了深度学习最核心、也最让初学者头疼的算法——反向传播(Backpropagation)。

别怕,今天我们不啃数学公式,而是用一个“传话游戏”的比喻,配合一张计算图,把反向传播的底层逻辑揉碎了讲给你听。读完你会发现:原来AI的改错机制,和你小学订正数学题一模一样。
正向传播 vs 反向传播:一条“传话游戏”生产线
还记得之前文章里那个前向传播的流水线吗?数据从输入层进入,经过一层层加权求和和激活,最终变成输出。这个过程叫正向传播——信息只向前流动。
但如果最后输出错了怎么办?反向传播就是把“错误”从输出层往回传,一层一层地告诉每个神经元:“你刚才给的那个数,对最终错误的贡献是多少。”
用“传话游戏”打个比方:
十个人排成一列,第一个人小声说一个数字,每个人乘以自己的一个系数后告诉下一个人。最后一个人报出最终结果。
如果最后的结果和正确答案有差距,怎么办?反向传播的做法是:从最后一个人开始,倒着往前算——先算“最后一个人的系数对总误差的影响有多大”,然后算“倒数第二个人的系数的影响”,依次往前,直到第一个人。
算清楚每个人对错误的“贡献度”之后,每个人就知道该把自己的系数朝哪个方向调整(调大还是调小),才能让最终结果更接近正确答案。
这个“贡献度”,在数学上就叫梯度。而计算梯度的过程,就是反向传播。
反向传播的数学灵魂:链式法则
反向传播之所以能“从后往前”追溯责任,全靠一个高中就学过的数学工具——链式法则(Chain Rule)。
假设最终损失是 L,而 L 是由输出层的 y 算出来的,y 又是由前一层的 h 算出来的,h 又是由输入 x 算出来的。链式法则告诉我们:
dL/dw = (dL/dy) * (dy/dw)
用大白话翻译:要算最前面那个变量对最终结果的影响,就把中间每一层的“局部影响”乘起来。
反向传播做的就是这件事:从输出层开始,一层一层往回算“局部梯度”,然后连乘得到每一层的“累积梯度”。最后用这个梯度去更新权重,让损失值一点点下降。
动手环节:用一个最简单的例子,手动算一遍反向传播
我们不用复杂的矩阵,就用一个只有一个神经元的简化网络,手动演示一遍反向传播的完整计算过程。看完这个例子,你对“链式法则”和“梯度下降”会有肌肉记忆般的理解。
网络结构(极简版):
输入 x ---> 权重 w ---> 输出 ŷ = w × x
真实标签是 y,损失函数用MSE:L = (ŷ - y)² = (w×x - y)²。
假设某一次前向传播的具体数值:
输入 x = 2
真实标签 y = 5
当前权重 w = 1
第一步:正向传播算输出和损失
y_pred = w * x = 1 * 2 = 2
L = (2 - 5)^2 = 9
损失是9,挺大的,说明需要调整 w。
第二步:反向传播算梯度
我们要算的是 L 对 w 的导数,也就是 dL/dw。根据链式法则:
dL/dw = (dL/dy_pred) * (dy_pred/dw)
先算第一部分:dL/dy_pred = 2 * (y_pred - y) = 2 * (2 - 5) = -6。
再算第二部分:dy_pred/dw = x = 2。
两者相乘:dL/dw = (-6) * 2 = -12。
这个 -12 就是 w 的梯度。它的含义是:如果 w 增加一个很小的量,损失 L 会减少 12 倍于那个量的幅度。所以我们应该增加w(因为梯度为负,增加 w 会减小损失)。
第三步:更新权重
按照梯度下降的更新公式:w_new = w_old - alpha * dL/dw,其中 alpha 是学习率,假设取 0.1。
w_new = 1 - 0.1 * (-12) = 1 + 1.2 = 2.2
第四步:再算一次正向传播,看损失有没有变小
y_pred_new = 2.2 * 2 = 4.4
L_new = (4.4 - 5)^2 = 0.36
损失从 9 降到了 0.36,效果显著!这就是一次完整的前向+反向+更新流程。
Python代码复现这个例子
# 简单神经网络的一次训练步骤(手动计算版)x = 2y = 5w = 1alpha = 0.1# 前向传播y_pred = w * xloss = (y_pred - y) ** 2print(f"初始: w={w}, 预测={y_pred}, 损失={loss}")# 反向传播(手动求导)dL_dy_pred = 2 * (y_pred - y) # = -6dy_pred_dw = x # = 2dL_dw = dL_dy_pred * dy_pred_dw # = -12# 更新权重w_new = w - alpha * dL_dwprint(f"梯度: {dL_dw}, 新w: {w_new}")# 再次前向验证y_pred_new = w_new * xloss_new = (y_pred_new - y) ** 2print(f"更新后: w={w_new}, 预测={y_pred_new}, 损失={loss_new}")
运行结果:

这个极简例子完整展示了反向传播的全过程。在真实的深度网络里,这个“求导+连乘”的过程会对几百万个参数同时进行,但核心逻辑和这个 w 的例子完全一样。
反向传播在YOLO里是怎么跑的?
YOLO训练时,你看到的 loss 曲线下降,背后就是反向传播在默默工作:
前向传播:输入图片经过Backbone、Neck、Head,输出边界框坐标、置信度和类别概率。
计算损失:损失函数(复合了三部分)算出总损失 L。
反向传播:从输出端开始,计算 L 对每一个卷积核权重、每一个偏置的梯度。这一步由PyTorch的 autograd 自动完成——你在代码里只要写 loss.backward(),框架就会把梯度算好存在每个参数的 .grad 属性里。
更新权重:优化器(如SGD、Adam)根据梯度更新所有参数。
循环往复,损失越来越小,检测框越来越准。
一张图看懂正向与反向的区别
| 对比项 | 正向传播 | 反向传播 |
|---|---|---|
| 方向 | 输入 → 输出 | 输出 → 输入 |
| 计算内容 | 每层输出值 | 每层梯度(导数) |
| 目的 | 得到预测结果 | 计算每个参数的调整方向和大小 |
| 发生时机 | 推理和训练时都做 | 只在训练时做 |
| 依赖 | 权重和输入 | 损失值和正向传播的中间结果 |
反向传播是深度学习能够“学习”的根本原因。它把损失函数算出的“总错误”,通过链式法则一层层往回传递,精准定位到每一个权重的责任大小。没有它,神经网络就只是一堆不会进步的固定函数。
夜雨聆风