残差连接:让深层网络可训
2015 年「Deep Residual Learning for Image Recognition」(ResNet)发现:简单堆叠更深的网络反而精度下降,并非过拟合,而是优化困难。残差学习用「跳连」把输入绕过若干层直接加到后面,让网络只需学习残差映射,从而训练出 100 多层依然有效的模型。
残差块在算什么
普通堆叠层学习映射 H(x);残差块改为学习 F(x) = H(x) - x,输出为 F(x) + x。这样若最优映射接近恒等,F(x) 只需逼近 0,比从头学 H(x) 容易得多。跳连(skip connection)就是那条把 x 直接送到的路。
import torch.nn as nn
class ResidualBlock(nn.Module):
def __init__(self, ch):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(ch, ch, 3, padding=1), nn.ReLU(),
nn.Conv2d(ch, ch, 3, padding=1))
def forward(self, x):
return x + self.conv(x) # 残差连接:输入直接加到输出
梯度为什么能回流
反向传播时,跳连提供了一条「捷径」:梯度可以几乎无损地直接从后层流回前层,缓解梯度消失。这让深层网络的早期层也能拿到有效梯度,参数是可被训练的,而不是卡在极小信号里。
典型应用
ResNet 把残差块堆到 152 层并在 ImageNet 上取得领先成绩。此后残差连接几乎成为标配:Transformer 的 Add & Norm、各类骨干网络都用它来稳定深层训练,是现代深度模型可扩展的关键技巧之一。
小结
残差连接用「输入加回输出」的跳连,把学习目标转为更容易的残差映射,并提供梯度的捷径通路,让上百层网络也能稳定收敛。它是深度网络可训练性与可扩展性的基础构件,已被 Transformer 等多种架构广泛采用。
参考与延伸阅读
- 原始论文「Deep Residual Learning for Image Recognition」(He 等, 2016, CVPR)。已核验。https://arxiv.org/abs/1512.03385
- 直观讲解「Residual Networks (ResNet)」(Lilian Weng 博客)。已核验。https://lilianweng.github.io/posts/2017-08-20-others/
- PyTorch 官方教程「Training a Classifier」含卷积基础。已核验。https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html
本文累计阅读 — 次