03 残差网络(ResNets)——深度神经网络的突破
03 残差网络(ResNets)——深度神经网络的突破
🌟 课程核心目标
本节旨在解决深度神经网络训练中的梯度消失与梯度爆炸问题,通过引入“跳跃连接”(Skip Connection)构建残差网络(Residual Networks, ResNets) ,使得网络可以训练得更深、更稳定、性能更强。
🔍 一、传统神经网络的局限性
❌ 问题:深度网络难以训练
随着网络层数增加,会出现:
- 梯度消失:反向传播时梯度逐层衰减,靠近输入层的参数几乎无法更新。
- 梯度爆炸:梯度指数增长,导致训练不稳定。
- 优化困难:即使使用梯度下降等算法,模型性能也会随深度增加而下降。
✅ 结论:普通网络(Plain Network)在深度超过一定阈值后,训练误差反而上升。
🔁 二、什么是“残差块”(Residual Block)
💡 核心思想:学习“残差”而非直接映射
我们不直接让网络学习一个复杂的映射 $H(x)$,而是让它学习一个残差函数 $F(x) = H(x) - x$,然后通过:
\[H(x) = F(x) + x\]来得到最终输出。这相当于给网络加了一条“捷径”,允许信息直接跳过某些层。
🧱 残差块结构详解
基础两层网络(Plain block)
标准前馈过程如下:
- 输入 $a^{[l]}$
- 线性变换:$z^{[l+1]} = W^{[l+1]} a^{[l]} + b^{[l+1]}$
- ReLU激活:$a^{[l+1]} = g(z^{[l+1]})$
- 再次线性变换:$z^{[l+2]} = W^{[l+2]} a^{[l+1]} + b^{[l+2]}$
- 最终输出:$a^{[l+2]} = g(z^{[l+2]})$
公式表示为:
\[a^{[l+2]} = g\left(W^{[l+2]} \cdot g\left(W^{[l+1]} a^{[l]} + b^{[l+1]}\right) + b^{[l+2]}\right)\]这是一个非线性复合函数,路径长且容易出现梯度问题。
⚡️ 引入跳跃连接(Skip Connection)
在残差块中,我们将原始输入 $a^{[l]}$ 直接加到后续层的输出上:
\[a^{[l+2]} = g\left(z^{[l+2]} + a^{[l]}\right)\]其中:
- $z^{[l+2]} = W^{[l+2]} a^{[l+1]} + b^{[l+2]}$
- $a^{[l+1]} = g(z^{[l+1]})$
- $z^{[l+1]} = W^{[l+1]} a^{[l]} + b^{[l+1]}$
所以整体可写成:
\[a^{[l+2]} = g\left( W^{[l+2]} \cdot g\left( W^{[l+1]} a^{[l]} + b^{[l+1]} \right) + b^{[l+2]} + a^{[l]} \right)\]但更常见的是将 $a^{[l]}$ 加在激活之前,即:
\[a^{[l+2]} = g\left( z^{[l+2]} + a^{[l]} \right) = g\left( W^{[l+2]} a^{[l+1]} + b^{[l+2]} + a^{[l]} \right)\]✅ 这条从 $a^{[l]}$ 直接到 $a^{[l+2]}$ 的路径称为“跳跃连接”或“快捷连接”。
🔄 残差块的数学表达
设残差函数为:
\[F(a^{[l]}) = W^{[l+2]} \cdot g\left( W^{[l+1]} a^{[l]} + b^{[l+1]} \right) + b^{[l+2]}\]则输出为:
\[a^{[l+2]} = g\left( F(a^{[l]}) + a^{[l]} \right)\]这就是残差学习的核心公式。
✅ 意义:网络只需学习 $F(a^{[l]})$,即从 $a^{[l]}$ 到 $a^{[l+2]}$ 的“变化量”。如果理想情况是恒等映射,则 $F(a^{[l]}) = 0$,此时 $a^{[l+2]} = a^{[l]}$,无需训练即可保持不变。
🏗️ 三、构建完整的残差网络(ResNet)
📐 残差网络结构
将多个残差块堆叠起来,形成深度网络。每两个残差块之间添加跳跃连接,构成一个“残差单元”。
示意图如下:
1
2
3
4
x → [Block1] → [Block2] → ... → [BlockN] → a^[L]
↑ ↑ ↑
└─────────┴───────────────────┘
(Skip Connections)
每个残差块内部都有一个“短路”路径(Short Cut),允许输入直接传递到下一层。
🎯 为什么这样设计?
| 特点 | 解释 |
|---|---|
| 恒等映射友好 | 如果某几层不需要改变特征,可以直接设 $F=0$,实现恒等映射,避免退化问题。 |
| 梯度流动顺畅 | 跳跃连接提供了额外的梯度路径,防止梯度消失。 |
| 易于优化 | 学习残差比学习完整映射更容易,因为残差通常较小。 |
📈 四、实验结果对比:Plain vs ResNet
图表分析(来自He et al., 2015)
普通网络(Plain) :
- 随着层数增加,训练误差先降后升(过拟合或训练失败)。
- 深度超过一定值后,性能变差。
残差网络(ResNet) :
- 训练误差持续下降,即使深度达到100+层。
- 测试误差也显著降低,泛化能力强。
✅ 关键结论:ResNets 可以有效缓解深度带来的训练难题,实现极深网络的成功训练。
🤔 五、为什么 ResNets 有效?(Why ResNets Work?)
1. 解决了退化问题(Degradation Problem)
- 在普通网络中,加深网络可能使性能变差,这不是过拟合,而是模型能力不足。
- ResNets 允许网络“选择性地”使用更多层,若新层无帮助,可通过跳跃连接保持原输出。
2. 梯度更容易传播
- 跳跃连接提供了一条直接梯度路径,避免了长期依赖问题。
- 梯度可以通过 skip connection 快速回传,减少梯度消失风险。
3. 残差学习简化了优化任务
- 网络不再需要从零开始学习复杂映射,只需调整少量残差。
- 类似于“增量学习”,更接近人类认知方式。
🔬 六、实际应用与意义
✅ ResNet 的影响
- 成为现代 CNN 架构的基础模块。
- 广泛应用于图像识别、目标检测、语义分割等领域。
- 后续衍生出 ResNeXt、SE-ResNet、EfficientNet 等改进版本。
🛠️ 实践建议
- 使用 ResNet 作为骨干网络(backbone)。
- 在自定义网络中加入跳跃连接。
- 注意维度匹配:当输入输出维度不一致时,可用 1×1 卷积调整尺寸。
🧩 七、关键公式总结(LaTeX 兼容)
1
2
3
4
5
6
7
8
9
10
11
% 普通网络输出
a^{[l+2]} = g\left( W^{[l+2]} \cdot g\left( W^{[l+1]} a^{[l]} + b^{[l+1]} \right) + b^{[l+2]} \right)
% 残差块输出
a^{[l+2]} = g\left( W^{[l+2]} \cdot g\left( W^{[l+1]} a^{[l]} + b^{[l+1]} \right) + b^{[l+2]} + a^{[l]} \right)
% 残差函数定义
F(a^{[l]}) = W^{[l+2]} \cdot g\left( W^{[l+1]} a^{[l]} + b^{[l+1]} \right) + b^{[l+2]}
% 残差学习公式
a^{[l+2]} = g\left( F(a^{[l]}) + a^{[l]} \right)
✅ 总结:ResNets 的三大优势
| 优势 | 说明 |
|---|---|
| 深度可控 | 可轻松构建百层以上的网络 |
| 训练稳定 | 梯度传播良好,不易崩溃 |
| 性能优越 | 在 ImageNet 等任务上大幅领先 |
📚 补充知识:ResNet 发明者
- Kaiming He(何凯明):提出 ResNet 的核心思想
- Xiangyu Zhang(张祥雨)、Shaoqing Ren(任少卿)、Jian Sun(孙剑)
- 发表于 CVPR 2016,论文《Deep Residual Learning for Image Recognition》
🔥 该工作获得当年最佳论文奖,成为深度学习里程碑之一。
🚀 下一步建议
- 尝试用 PyTorch 或 TensorFlow 实现一个简单的 ResNet 模块。
- 对比 Plain Network 和 ResNet 在 MNIST 上的表现。
- 学习 ResNet 的变种如 ResNeXt、DenseNet 等。
📌 本节重点回顾
✅ 残差块 = 主路径 + 跳跃连接
✅ 学习残差 $F(x)$ ,而非完整映射 $H(x)$
✅ 跳跃连接允许信息直接传递,提升梯度流动
✅ ResNets 支持超深网络训练,性能优异
✅ 是现代视觉模型的基础架构
📘 提示:如果你正在学习深度学习,掌握 ResNet 是通往先进模型的关键一步。它不仅是技术突破,更是思维方式的革新 —— “学会做加法,而不是硬推” 。
🎯 记住一句话:
“深度网络不是越深越好,而是要让信息流得动。 ”
—— ResNet 给我们的最大启示。