通过一个简化的ResNet小模型(如ResNet-18的某一残差块)为例,逐步说明梯度反向传播过程、参数更新和收敛机制。假设输入为图像数据,任务为分类任务。
1. 模型结构示例
以ResNet中的一个残差块(BasicBlock)为例:
输入x → 卷积层1(Conv1, 权重W1) → ReLU → 卷积层2(Conv2, 权重W2) → 残差连接(+x) → ReLU → 输出y
数学表达式:
y=ReLU(F(x)+x),其中 F(x)=Conv2(ReLU(Conv1(x)))
2. 前向传播过程
假设输入为 x,标签为 label,损失函数为交叉熵损失 L:
-
计算主路径:(x -> h1 -> a1 -> h2 -> yres( 也就是F(x)+x) -> y
h1=Conv1(x), a1=ReLU(h1)
h2=Conv2(a1), F(x)=h2 -
残差连接:
yres=F(x)+x
y=ReLU(yres) -
计算损失:
L=CrossEntropyLoss(y,label)
3. 反向传播过程(链式法则)
反向传播从损失函数 L 开始,逐层计算梯度:
(1) 损失对输出 yy 的梯度
∂L/∂y=∇yL(来自损失函数的梯度)
(2) 经过ReLU的反向传播
若输入>0则梯度为1,否则为0
(3) 残差路径的梯度
残差连接将梯度分成两部分:
∂L/∂F(x) 和 ∂L/∂x
(这是残差连接的核心:梯度可直接回传至输入,缓解梯度消失)
(4) 反向传播至Conv2(权重W2)
计算 ∂L/∂W2:
∂L/∂h2=∂L/∂F(x)
∂L/∂W2 =∂L/∂h2 * a1T(需转置输入特征)
=∂L/∂F(x) * a1T
(5) 反向传播至Conv1(权重W1)
计算 ∂L/∂W1:
∂L/∂a1=W2T⋅∂L/∂h2
∂L/∂h1=∂L/∂a1⋅II(h1>0)
∂L/∂W1 = ∂L/∂h1*xT
= ∂L/∂a1⋅II(h1>0) * xT
= W2T⋅∂L/∂h2 ⋅II(h1>0) * xT
4. 参数更新(优化器示例:SGD)
假设学习率为 ηη,优化器为SGD:
-
更新 W1W1:
W1←W1−η⋅∂L/∂W1 -
更新 W2W2:
W2←W2−η⋅∂L/∂W2
5. 收敛机制
-
梯度方向:残差结构确保梯度能直接回传至浅层(如 ∂L/∂x),避免梯度消失。
-
参数更新:每次迭代中,梯度指向损失下降最快的方向,通过多次迭代逐渐接近局部最优。
-
收敛条件:当损失 LL 的变化小于阈值,或验证集准确率不再提升时停止训练。
关键点总结
-
残差连接的作用:
即使深层梯度 ∂L/∂F(x) 很小,∂L/∂x仍能有效更新浅层权重。 -
ReLU的梯度:
仅在激活值>0时回传梯度,稀疏化梯度传播。 -
实际训练:
-
使用批量归一化(BatchNorm)时,需额外计算其参数的梯度。
-
优化器(如Adam)会调整学习率或引入动量加速收敛。
-
通过这种机制,ResNet的小模型能够高效训练并快速收敛。