本教程提供了关于残差网络(ResNet)的全面指南,这是一种革命性的深度学习架构,改变了图像分类任务。我们将涵盖残差学习理论、ResNet 架构、在 PyTorch 中针对 CIFAR-10 数据集的实现,以及训练和调试的实用建议。本教程适合初学者和高级实践者,包含详细的解释和代码。
1. ResNet 简介
1.1 什么是 ResNet?
ResNet 由何凯明等人在 2015 年的论文 “Deep Residual Learning for Image Recognition” 中提出,解决了训练非常深的神经网络的挑战。传统深层网络面临梯度消失和退化问题(随着深度增加,准确率饱和或下降)。ResNet 通过残差学习解决了这些问题,使得具有数百甚至上千层的网络成为可能。
1.2 深层网络的问题
随着神经网络加深:
- 梯度消失:反向传播过程中梯度变得过小,导致学习减慢或停止。
- 退化问题:更深的网络可能比浅层网络表现更差,这不是因为过拟合,而是优化变得更困难。
ResNet 通过引入快捷连接缓解了这些问题,使网络能够学习残差函数而非直接映射。
1.3 残差学习
在传统网络中,层堆栈学习映射 H(x)H(x)H(x),其中 xxx 是输入,H(x)H(x)H(x) 是期望输出。ResNet 将其重新定义为学习残差函数:
H(x)=F(x)+xH(x) = F(x) + xH(x)=F(x)+x
- F(x)F(x)F(x):由层(例如几个卷积层)学习的残差映射。
- xxx:通过快捷连接添加的输入。
- H(x)H(x)H(x):最终输出,计算为残差加上输入。
如果最优映射接近于恒等函数(H(x)≈xH(x) \approx xH(x)≈x),F(x)F(x)F(x) 学习小的扰动(F(x)≈0F(x) \approx 0F(x)≈0)比传统层直接学习恒等函数更容易。这使得训练更深的网络更简单且更有效。
1.4 快捷连接
- 恒等快捷连接:直接将输入 xxx 添加到输出,无需额外参数(H(x)=F(x)+xH(x) = F(x) + xH(x)=F(x)+x)。
- 投影快捷连接:当输入和输出的尺寸不同(例如通道数或空间尺寸)时,使用 1x1 卷积匹配尺寸。
1.5 ResNet 的优势
- 优化更简单:残差连接促进梯度流动,缓解梯度消失问题。
- 提高准确率:更深的 ResNet(例如 ResNet-50、ResNet-101)比浅层网络具有更高的准确率。
- 可扩展性:能够训练非常深的网络(高达 1000 多层)。
- 泛化性:广泛应用于图像分类、目标检测、分割等领域。
2. ResNet 架构
ResNet 有多种深度(例如 ResNet-18、ResNet-50、ResNet-101)。我们将重点介绍通用结构,并实现一个适合 CIFAR-10(32x32 RGB 图像,10 个类别)的较小 ResNet。
2.1 构建模块
ResNet 由残差块组成,每个块实现残差学习原理。
基础块(用于 ResNet-18/34)
- 结构:
- 两个 3x3 卷积层,带有批量归一化和 ReLU。
- 快捷连接将输入添加到输出。
- 公式:y=F(x,{ Wi})+xy = F(x, \{W_i\}) + xy=F(x,{ Wi})+x
- 因其简单性,用于较浅的 ResNet。
瓶颈块(用于 ResNet-50/101/152)
- 结构:
- 1x1 卷积(减少通道数)。
- 3x3 卷积。
- 1x1 卷积(恢复通道数)。
- 每个卷积后有批量归一化和 ReLU。
- 快捷连接。
- 公式:与基础块相同,但 F(x)F(x)F(x) 更复杂。
- 用于更深的 ResNet 以降低计算成本。
2.2 架构概览
对于 CIFAR-10,我们将设计一个 ResNet-20(20 层,适合小图像)。架构包括:
- 初始卷积:3x3 卷积处理输入(3 个通道 → 16 个通道)。
- 残差阶段:通道数逐渐增加的残差块组(16、32、64)。
- 全局平均池化:将空间维度缩减为 1x1。
- 全连接层:映射到 10 个类别。
层分解
- 阶段 1:6 个基础块,16 个通道。
- 阶段 2:6 个基础块,32 个通道。
- 阶段 3:6 个基础块,64 个通道。
- 总卷积层数:1+(6+6+6)×2=371 + (6 + 6 + 6) \times 2 = 371+(6+6+6)×<