残差连接:让深层网络可训

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 等多种架构广泛采用。

参考与延伸阅读

本文累计阅读