在深度学习发展历程中,2015 年提出的 ResNet(Residual Neural Network,残差神经网络)无疑是一座里程碑。在此之前,传统卷积神经网络(CNN)面临 “深度诅咒”—— 当网络层数超过 20 层后,训练误差会急剧上升(梯度消失 / 梯度爆炸),模型性能不升反降。ResNet 通过创新的 “残差连接” 设计,首次实现了上千层网络的稳定训练,不仅斩获 ImageNet 竞赛冠军,更成为后续众多网络架构(如 ResNeXt、EfficientNet)的设计基石。本文将从核心痛点、残差原理、网络结构、实践细节四个维度,全面拆解 ResNet,帮你掌握这一经典架构的精髓。
一、为什么需要 ResNet?传统 CNN 的 “深度诅咒”
在 ResNet 出现前,研究者曾认为 “网络越深,特征提取能力越强”,但实际训练中却发现:当网络层数超过一定阈值(如 VGG19 的 19 层),模型会陷入两大困境,这就是 “深度诅咒” 的核心。
1. 梯度消失与梯度爆炸
深度学习通过反向传播更新参数,梯度需要从输出层逐层传递到输入层。在传统 CNN 中,每经过一层激活函数(如 ReLU、Sigmoid),梯度会被进一步缩放:
- 梯度消失:若每层梯度缩放系数小于 1(如 Sigmoid 函数梯度最大值仅 0.25),经过几十层传递后,梯度会趋近于 0,输入层参数几乎无法更新,模型 “学不到东西”。
- 梯度爆炸:若每层梯度缩放系数大于 1(如初始化权重过大),梯度会指数级增长,导致参数更新幅度过大,模型训练震荡不收敛。
尽管 Batch Normalization(BN)能缓解部分问题,但当网络层数超过 50 层时,梯度传递仍会出现严重衰减,模型难以训练。
2. 退化问题(Degradation)
即使解决了梯度传递问题,传统深层网络还会出现 “退化现象”:随着层数增加,训练误差和测试误差同时上升(区别于过拟合 —— 过拟合是训练误差下降、测试误差上升)。这意味着深层网络的拟合能力甚至不如浅层网络,例如:在 CIFAR-10 数据集上,56 层的传统 CNN 测试误差比 20 层的网络高 1.5% 以上。
原因在于:传统 CNN 要求每一层都学习 “完整的特征映射”,当层数过深时,模型难以优化所有层的参数来拟合复杂映射关系,导致特征表示能力退化。
二、ResNet 的核心创新:残差连接与残差块
ResNet 的突破在于提出 “残差连接”(Residual Connection),将网络需要学习的 “完整特征映射” 拆解为 “残差映射”,大幅降低优化难度。这一设计的本质是 “让网络学习‘差异’而非‘全貌’”。
1. 残差连接的核心思想
传统 CNN 中,假设某层输入为x,该层需要学习的特征映射为H(x)(即 “完整映射”)。而 ResNet 通过残差连接,将输入x直接跳过该层(或多层)传递到后续层,此时网络只需学习 “残差映射”F(x)=H(x)−x,最终输出为:H(x)=F(x)+x
这样做的优势在于:
- 简化优化目标:学习残差映射F(x)比学习完整映射H(x)更容易。例如,当H(x)接近恒等映射(即该层对特征提升有限)时,F(x)只需学习接近 0 的映射,参数更新更轻松。
- 梯度直接传递:反向传播时,梯度可以通过残差连接 “短路” 传递到浅层(无需经过所有中间层),有效缓解梯度消失。例如,输出层梯度可直接传递到输入层附近,确保浅层参数能有效更新。
2. 残差块(Residual Block):ResNet 的基本单元
残差连接通过 “残差块” 实现,ResNet 包含两种核心残差块,分别对应不同层数的网络:
(1)Basic Block(基础残差块):适用于浅层 ResNet(如 ResNet18、ResNet34)
Basic Block 由 “2 个 3×3 卷积层 + BN 层 + ReLU 激活” 组成,残差连接分为两种情况:
- 相同维度连接(Identity Mapping):当输入特征图的通道数和尺寸与输出一致时,直接将输入x与卷积层输出F(x)相加,结构如下:
输入x → BN → ReLU → 3×3卷积 → BN → ReLU → 3×3卷积 → 输出F(x)
↑ ↓
└──────────────────────────────────────┘
残差连接:F(x) + x → 最终输出
- 维度匹配连接(1×1 卷积调整):当输入与输出维度不一致(如通道数变化、尺寸下采样)时,需在残差连接中加入 1×1 卷积(“瓶颈卷积”),将x调整为与F(x)相同维度后再相加:
输入x → 1×1卷积(调整维度) → 输出x'↓→ BN → ReLU → 3×3卷积 → BN → ReLU → 3×3卷积 → 输出F(x)
↓ ↓
└──────────────────────────────────────┘
残差连接:F(x) + x' → 最终输出1×1 卷积的作用是 “降维 / 升维 + 下采样”,例如将输入通道数从 64 调整为 128,同时通过 stride=2 实现特征图尺寸减半。
(2)Bottleneck Block(瓶颈残差块):适用于深层 ResNet(如 ResNet50、ResNet101)
为减少深层网络的计算量,Bottleneck Block 采用 “1×1 卷积 + 3×3 卷积 + 1×1 卷积” 的结构,通过 1×1 卷积先降维、再升维,大幅减少参数数量:
- 降维:第一个 1×1 卷积将输入通道数从C降至C/4(如 256→64),减少后续 3×3 卷积的计算量(3×3 卷积计算量与通道数成正比)。
- 特征提取:3×3 卷积在低维空间提取特征,兼顾性能与效率。
- 升维:第二个 1×1 卷积将通道数从C/4恢复至C,确保输出维度与残差连接匹配。
结构如下(以维度匹配情况为例):
输入x → 1×1卷积(降维,stride=2) → BN → ReLU → 3×3卷积 → BN → ReLU → 1×1卷积(升维) → 输出F(x)
↓ ↓
└──────────────────────────────────────────────────────────────────────────────┘
残差连接:F(x) + x(x已通过1×1卷积调整维度) → 最终输出
计算量对比:以输入通道数 256、输出通道数 256 为例,Bottleneck Block 的计算量仅为 Basic Block 的 1/4 左右,这也是 ResNet 能实现 1000 层训练的关键。
三、ResNet 家族架构:从 18 层到 1001 层的演变
ResNet 并非单一网络,而是一个包含多个变种的家族,核心差异在于 “残差块类型” 和 “网络层数”。常用的 ResNet 变种包括 ResNet18、ResNet34、ResNet50、ResNet101、ResNet152,其架构遵循统一的设计范式,仅在残差块数量和通道数配置上有差异。
1. 通用架构框架
所有 ResNet 变种的整体结构可分为 5 个阶段,每个阶段包含若干残差块,且每个阶段的输出特征图尺寸逐步减半、通道数逐步翻倍(符合 CNN “下采样提通道” 的特征提取逻辑):
|
阶段 |
输入尺寸 |
残差块类型 |
残差块数量 |
输出通道数 |
核心作用 |
|
1 |
224×224 |
传统卷积层 |
1(7×7 卷积 + BN+ReLU+MaxPool) |
64 |
初步下采样(尺寸→112×112),提取低级特征 |
|
2 |
112×112 |
Basic/ Bottleneck |
ResNet18/34:3;ResNet50/101/152:3 |
64 |
保持通道数,深化特征提取 |
|
3 |
56×56 |
Basic/ Bottleneck |
ResNet18/34:4;ResNet50/101/152:4 |
128 |
下采样(尺寸→28×28),通道数翻倍 |
|
4 |
28×28 |
Basic/ Bottleneck |
ResNet18/34:6;ResNet50/101/152:6 |
256 |
下采样(尺寸→14×14),通道数翻倍 |
|
5 |
14×14 |
Basic/ Bottleneck |
ResNet18/34:3;ResNet50/101/152:3 |
512 |
下采样(尺寸→7×7),通道数翻倍 |
|
输出层 |
7×7 |
全局平均池化 + 全连接 |
1(1000 类分类) |
1000 |
特征压缩,输出分类概率 |
2. 关键变种差异对比
不同 ResNet 变种的核心区别在于 “残差块类型” 和 “总层数”,层数计算规则为:“阶段 1(1 层)+ 各阶段残差块数量 × 每块层数 + 输出层(1 层)”。例如:
- ResNet18:采用 Basic Block(每块 2 层),总层数 = 1 + (3+4+6+3)×2 +1 =18 层,适合资源有限的场景(如移动端)。
- ResNet50:采用 Bottleneck Block(每块 3 层),总层数 = 1 + (3+4+6+3)×3 +1 =50 层,兼顾性能与效率,是工业界最常用的变种。
- ResNet152:Bottleneck Block,总层数 = 1 + (3+8+36+3)×3 +1 =152 层,特征提取能力最强,但计算量和内存占用较大,适合高性能 GPU 场景。
四、ResNet 的优势与实践细节
ResNet 不仅解决了深层网络的训练问题,还在特征提取、泛化能力等方面具备显著优势,同时在实践中需注意一些关键细节,才能充分发挥其性能。
1. ResNet 的核心优势
- 突破深度限制:通过残差连接实现上千层网络的稳定训练,例如 ResNet1001 在 CIFAR-10 数据集上仍能保持低训练误差。
- 泛化能力强:残差连接减少了模型对 “过度拟合训练数据噪声” 的依赖,在 ImageNet 等大规模数据集上,ResNet50 的测试误差比 VGG19 低 40% 以上。
- 计算效率高:Bottleneck Block 通过 1×1 卷积降维,在相同层数下,ResNet50 的计算量仅为传统 50 层 CNN 的 1/8,兼顾深度与效率。
- 迁移学习友好:ResNet 预训练模型(如 ImageNet 预训练的 ResNet50)能为下游任务(如目标检测、图像分割)提供优质的初始特征,大幅减少小数据集的训练成本。
2. 实践中的关键细节
(1)残差连接的维度匹配
当输入与输出维度不一致时(通道数不同或尺寸不同),必须通过以下两种方式之一匹配维度,否则会出现张量形状不兼容错误:
- 1×1 卷积调整:在残差连接中加入 1×1 卷积(如 ResNet50 的 Bottleneck Block),同时通过 stride=2 实现下采样,这是 ResNet 的默认方案,性能更优。
- 零填充(Zero Padding):对输入
x
进行零填充(增加通道数)或池化(缩小尺寸),实现维度匹配,计算量更小,但可能损失部分特征信息。
(2)BN 层与激活函数的位置
ResNet 中 BN 层和激活函数的位置与传统 CNN 不同,需严格遵循 “BN→ReLU→卷积” 的顺序(残差块内部),而非 “卷积→BN→ReLU”:
- 传统 CNN 顺序:卷积→BN→ReLU,会导致残差连接中的x与F(x)的分布不一致(F(x)经过激活,x未经过)。
- ResNet 顺序:BN→ReLU→卷积,确保x与F(x)在相同的分布空间中相加,避免特征偏移,这是 ResNet 训练稳定的重要细节。
(3)初始化与优化器选择
- 权重初始化:建议采用 He 初始化(针对 ReLU 激活函数),避免初始梯度过大或过小,ResNet 官方实现默认使用此方法。
- 优化器:推荐使用 SGD+Momentum(动量 = 0.9),学习率从 0.1 开始,每 30 轮衰减为原来的 0.1,比 Adam 更适合深层网络的稳定训练(Adam 在 ResNet 等深层网络中易出现过拟合)。
(4)防止过拟合的技巧
- 数据增强:采用随机裁剪、水平翻转、颜色抖动等方法扩充数据,ResNet 在 ImageNet 训练中通过此方法将测试误差降低 1.5%~2%。
- 权重衰减(L2 正则化):设置权重衰减系数为 1e-4,抑制参数过大,避免过拟合。
五、ResNet 的影响与应用场景
ResNet 的出现不仅解决了深层网络的训练难题,更重塑了 CNN 的设计思路,其影响力贯穿计算机视觉的多个领域。
1. 对后续网络的启发
ResNet 的残差连接思想被广泛借鉴,衍生出众多改进架构:
- ResNeXt:将残差块中的 “单分支卷积” 改为 “多分支分组卷积”,提升特征多样性,ResNeXt50 性能优于 ResNet50,计算量相近。
- DenseNet:将残差连接的 “相加” 改为 “拼接”,实现特征的密集传递,进一步提升泛化能力。
- EfficientNet:结合残差连接与 “宽度、深度、分辨率” 的复合缩放策略,成为当前最高效的 CNN 架构之一。
2. 核心应用场景
- 图像分类:ResNet 是 ImageNet、CIFAR 等数据集的基准模型,工业界在商品分类、医学图像分类等任务中广泛采用 ResNet50/101。
- 目标检测:作为 Faster R-CNN、YOLOv3 等检测模型的骨干网络(Backbone),ResNet 能提供更丰富的高层特征,提升检测精度(如 ResNet50 作为 YOLOv3 骨干,比 DarkNet53 精度高 5% 以上)。
- 图像分割:在 FCN、U-Net 等分割模型中,ResNet 可替代传统骨干网络,解决分割任务中 “深层特征丢失细节” 的问题,提升分割边界的准确性。
- 迁移学习:ResNet 预训练模型是计算机视觉迁移学习的 “标配”,例如在小样本图像识别任务中,基于 ResNet50 预训练模型微调,比从零训练的模型精度高 20%~30%。
六、总结:ResNet 的核心价值与学习建议
ResNet 的成功并非偶然,其核心价值在于:通过 “残差连接” 这一简洁却深刻的设计,从根本上解决了深层网络的梯度传递与退化问题,为后续深度学习的发展奠定了基础。
对于学习者而言,掌握 ResNet 的关键在于:
- 理解 “残差映射” 为何比 “完整映射” 更易优化,而非仅记住结构;
- 区分 Basic Block 与 Bottleneck Block 的适用场景,避免盲目选择;
- 关注实践细节(如 BN 顺序、维度匹配),这些是 ResNet 训练成功的关键;
- 通过代码实现(如 PyTorch 的torchvision.models.resnet50)加深理解,对比不同变种的性能差异。
959

被折叠的 条评论
为什么被折叠?



