前向传播回答“当前参数会预测什么”,训练还要回答“每个参数该往哪边改、改多少”。梯度下降负责用梯度更新参数,反向传播负责高效算出这组梯度。
一、损失函数与学习目标
对预测 y=f(x;W) 和真实目标 y^,损失函数 ℓ(y,y^) 衡量单个样本的错误。课件用三分类 one-hot 目标 (1,0,0)T 和均方误差举例:
ℓ(y,y^)=∥y−y^∥22=(1−y1)2+y22+y32.
理想目标是最小化数据分布上的期望损失
Wmin E(x,y^)∼P[ℓ(f(x;W),y^)].
真实分布未知,训练中使用有限数据的平均损失近似它。神经网络含大量复合非线性,通常无法像线性最小二乘那样令 ∂L/∂W=0 后直接解方程,只能迭代下降。
二、梯度给出最陡上升方向
对参数向量 W=(w1,…,wd),梯度为
∇WL=(∂w1∂L,…,∂wd∂L).
一阶 Taylor 展开说明,小步长 ΔW 下
L(W+ΔW)≈L(W)+∇WLTΔW.
令 ΔW=−η∇WL,便得到梯度下降更新:
W(k+1)=W(k)−η∇WL(W(k)),
其中 η>0 是学习率。负号不可少,因为梯度指向上升最快方向。
三、计算图与链式法则
把复杂函数拆成加法、乘法、指数、倒数、激活函数等基本节点,就得到计算图。每个节点只需知道两件事:
- 前向时怎样由输入算输出;
- 反向时怎样把上游梯度乘以本节点的局部导数。
若 q=q(x)、f=f(q),链式法则为
∂x∂f=∂q∂f∂x∂q.
常用局部导数包括
∂x∂(x+y)=1,∂x∂(xy)=y,
dxdex=ex,dxd(1/x)=−x21,
σ′(x)=σ(x)(1−σ(x)).
若一条变量分叉影响损失的多条路径,各路径传回的梯度要相加,不能只取一条。
四、课件标量计算图例子
课件计算
f(w,x)=1+e−(w0x0+w1x1+w2)1
并取
w0=2,x0=−1,w1=−3,x1=−2,w2=−3.
先算线性部分:
z=2(−1)+(−3)(−2)−3=1,
所以
f=σ(1)≈0.731.
反向从输出梯度 ∂f/∂f=1 开始:
∂z∂f=f(1−f)≈0.731×0.269≈0.197.
再乘局部导数:
∂w0∂f=∂z∂fx0≈−0.197,
∂x0∂f=∂z∂fw0≈0.393.
同理可得
∂w1∂f≈−0.393,∂x1∂f≈−0.590,∂w2∂f≈0.197.
这正是课件图中红色梯度值的来源:每经过一个节点,就用“上游梯度 × 局部梯度”继续向前传。
五、一层网络的矩阵反向传播
设
a=Wx+b,y=σ(a),L=∥y−y^∥22.
先对输出求导:
∂y∂L=2(y−y^).
定义预激活梯度
δ=∂a∂L=2(y−y^)⊙σ(a)⊙(1−σ(a)),
其中 ⊙ 表示逐元素乘法。则
∂W∂L=δxT,∂b∂L=δ,∂x∂L=WTδ.
形状检查很有用:若 W∈Rdout×din,则 δxT 也必须是 dout×din。
六、两层网络的完整推导
前向传播为
a(1)h(1)a(2)y=W(1)x+b(1),=σ(a(1)),=W(2)h(1)+b(2),=σ(a(2)).
从输出层往回:
δ(2)=∂a(2)∂L=2(y−y^)⊙σ′(a(2)),
∂W(2)∂L=δ(2)(h(1))T,∂b(2)∂L=δ(2).
隐藏层收到的梯度为
∂h(1)∂L=(W(2))Tδ(2),
再穿过激活函数:
δ(1)=∂a(1)∂L=(W(2))Tδ(2)⊙σ′(a(1)).
最后
∂W(1)∂L=δ(1)xT,∂b(1)∂L=δ(1).
更深网络只是不断重复“乘下一层权重的转置 → 乘本层激活导数 → 与本层输入做外积”。反向传播复用已经算出的中间梯度,具有动态规划的思想,避免为每个参数重复展开整条链。
七、完整训练循环
一次梯度更新可以概括为:
- 初始化或读取当前参数;
- 前向传播,保存各层 a(l),h(l);
- 计算预测与目标之间的损失;
- 从损失开始反向传播,得到每层参数梯度;
- 用 W←W−η∂L/∂W 更新;
- 在许多小批量上重复,直到验证性能不再提升。
前向时保存中间激活会占显存;反向时正是靠这些值计算局部导数。只记公式而忽略这一生命周期,很难理解深度学习训练为什么比单次推理更耗内存。
八、输入梯度与对抗样例
反向传播不只能算参数梯度,也能算 ∂L/∂x。若沿着让损失增加的方向给输入一个很小扰动,例如
Δx=εsign(∂x∂L),
就可能在肉眼几乎看不出变化时改变预测,这就是课件最后展示的对抗样例。它也说明模型学到的局部决策边界可能与人的感知边界不同。
九、常见误区与 sanity check
- 梯度下降要减梯度;梯度上升才加梯度。
- 反向传播是求导算法,不是优化器;真正更新参数的是 SGD、Adam 等优化算法。
- 分叉节点的梯度要相加,共享参数在不同样本或时间步产生的梯度也要累加。
- 用有限差分
[L(w+ϵ)−L(w−ϵ)]/(2ϵ)
抽查少量参数,可验证手写反向传播。
- 若学习率极小但一次更新后损失反而大幅上升,应先检查梯度符号、矩阵转置和广播形状。