从零开始学习大模型(十三):从经典 CNN 到 ResNet,深层网络如何训练?

卷积说明了图像特征如何计算,但增加网络层数还会带来新的优化问题。深层网络理论上可以表达更复杂的函数,并不意味着实际训练一定更容易或结果一定更好。

本篇关注经典架构解决的问题,而不是背诵每个网络的层数与排行榜数字。

1. 经典 CNN 的主要设计变化

架构 代表性设计 学习重点
LeNet 卷积、下采样与全连接组合 图像分类的基本流程
AlexNet 更大规模卷积网络、ReLU 等 数据、计算与训练方法共同影响效果
VGG 堆叠较小卷积核构造深网络 深度与规则化模块设计
ResNet 残差分支与快捷连接 改善深层网络优化

不同架构的具体变体、输入设置和训练方案不同,不能把历史结果当作在任意新数据集上的直接比较。参数量与计算量也不是同一个指标。

2. 深度增加为什么可能更难优化

在长链式计算中,梯度需要经过多次局部导数变换,可能变小或变大。初始化、激活函数和归一化都会影响传播。

此外,深网络也可能出现训练误差随深度增加而变差的退化问题。这不同于“训练误差低、验证误差高”的典型过拟合现象,应先区分优化困难与泛化问题。

3. 残差连接如何定义

残差块将输出写为 y = x + F(x)。F 是可训练分支,快捷连接直接传递 x,使模块可以学习相对输入的修正。

若对 x 求导,在可导条件下形式为 ∂y/∂x = I + ∂F/∂x。恒等路径为信息和梯度传播提供另一条路线,但不保证所有梯度问题自动消失。

输入通过残差分支与快捷路径汇合的结构示意

图 1:残差连接在相同形状下逐元素相加;形状不匹配时需要适当投影。

若通道数或空间大小改变,不能直接相加,常使用投影 P(x),得到 y = P(x) + F(x)。投影可能引入额外参数和计算,并非所有快捷路径都完全无参数。

设置 能否直接相加 处理方式
两侧形状完全相同 可以 逐元素相加
通道数量不同 不可以直接按残差语义相加 例如使用 1×1 卷积投影
空间分辨率不同 不可以直接相加 对齐下采样与投影
数组框架允许广播 仍需检查 广播成功不代表残差设计正确

4. 用最小例子检查残差与梯度

令 F(x)=ax,则 y=(1+a)x,导数为 1+a。这是标量形式,不是完整卷积块,但可以核对恒等路径的作用。

from math import isclose

def residual(x, a):
    return x + a * x

x, a, epsilon = 2.0, 0.25, 1e-5
numeric = (residual(x + epsilon, a) - residual(x - epsilon, a)) / (2 * epsilon)
assert isclose(residual(x, a), 2.5)
assert isclose(numeric, 1 + a, rel_tol=1e-8)
assert residual(x, 0.0) == x
print(round(numeric, 4))

当残差分支为零时,块可以保留恒等映射;它并不保证任何随机初始化的完整网络已经实现恒等函数。激活位置与归一化位置也随架构变体而改变。

5. 迁移学习如何复用已有网络

预训练模型可以提供初始化或固定的特征提取器。常见方式包括冻结主干、只训练任务头,以及逐步解冻部分或全部网络微调。

需要检查预处理与预训练要求是否一致,包括图像尺寸、通道顺序、归一化和类别输出数。输入标签和验证划分必须围绕目标任务重新设计。

冻结参数不等于切换评估模式。BatchNorm 等层的运行统计可能受训练模式影响,Dropout 的行为也由模式控制;应分别管理参数梯度和模块状态。

较少数据时,微调全部参数未必优于固定特征。数据与预训练领域差异较大时,也不能假定迁移一定带来提升。应保留从简单基线出发的独立比较。

6. 第三阶段小结

第三阶段串联了非线性网络、反向传播、框架训练、卷积与残差连接。下一阶段转向序列:RNN 如何保存状态,LSTM 如何通过门控改变信息流,以及注意力为什么有用。

残差学习的原始工作可参考 Deep Residual Learning for Image Recognition。

本阶段目录

  1. 神经网络为什么需要非线性?
  2. 手算一个神经网络的反向传播
  3. 用 PyTorch 训练第一个神经网络
  4. CNN 如何通过卷积提取图像特征?
  5. 从经典 CNN 到 ResNet,深层网络如何训练?

系列学习路线

上一篇:CNN 如何通过卷积提取图像特征?

下一篇:RNN 如何处理顺序与历史状态?