残差连接解决梯度消失的原因

记录 deepseek 的回答,让我看懂了残差连接解决梯度消失的原因,能不能解决梯度爆炸不清楚,没太搞懂,不过我的感觉是对梯度爆炸没啥用。

问题1:为什么残差连接能解决梯度消失/爆炸

deepseek 回答

这个问题问到了深度学习的“灵魂”层面。残差连接(Residual Connection)之所以能成为ResNet乃至现代大模型(Transformer)的基石,核心在于它彻底改变了信息传播的数学路径

为了让你彻底听懂,我们把“梯度消失/爆炸”的本质和残差连接的“物理破解法”拆开看:

1. 梯度消失/爆炸的本质:连乘效应(“九九八十一难”)

在没有残差连接的传统深层网络中,输入 $ x $ 要经过很多层才能变成输出 $ y $,比如: \[ y = F_3(F_2(F_1(x))) \]

在反向传播时,根据链式法则,损失 $ L $ 对输入 $ x $ 的梯度是一系列矩阵导数的连乘\[ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial F_3}{\partial F_2} \cdot \frac{\partial F_2}{\partial F_1} \cdot \frac{\partial F_1}{\partial x} \]

  • 消失:如果每一项的模都小于 1(比如 0.9),连乘 100 次后,$ 0.9^{100} $。
  • 爆炸:如果每一项的模都大于 1(比如 1.1),连乘 100 次后,$ 1.1^{100} $ 多。 深度越大,这种连乘效应越致命。

2. 残差连接的数学“破局”:化乘法为加法

残差连接把公式改成了这样(假设 $ F $ 是你要学的那几层变换): \[ y = F(x) + x \]

此时反向传播求梯度时,变成了: \[ \frac{\partial y}{\partial x} = \frac{\partial F(x)}{\partial x} + \mathbf{1} \] (这里的 $ $ 是单位矩阵,代表恒等映射)

看这个加号(+)! 现在梯度由两部分组成:

  1. $ $(主干路径,依然可能很小或很大)。
  2. $ $(短路路径,永远是 1)。

3. 为什么能解决“梯度消失”?(“保底机制”)

如果网络很深,训练初期 $ F $ 学得不好,导致 $ $ 变得极其微小(趋近于 0)。

  • 普通网络:梯度就真的变成 0 了,浅层参数彻底停止更新。
  • 残差网络:梯度等于 $ 0 + = 1 $。梯度至少还有一个“1”可以传回去!

这就好比给信息流加了一条 “高速公路”“紧急救生通道”。无论主路堵得多么水泄不通(梯度消失),急救车(梯度)总能通过旁边的直通车道把信号传回浅层,确保浅层网络至少能收到更新指令,不会“饿死”。


4. 为什么能缓解“梯度爆炸”?(“分流泄洪”)

如果网络设计不当或学习率太大,导致 $ $ 变得极其巨大(比如 10)。

  • 普通网络:梯度爆炸,参数瞬间飞 NaN(Not a Number)。
  • 残差网络:梯度是 $ 10 + 1 = 11 \(,虽然也变大了,但**它避免了“指数级放大”**。 - 在深层网络中,残差把梯度对深度的依赖从 **\) W^L \((幂级)** 降为了 **\) W^i $(加和级)**。极端大的数值会在求和中被一定程度地稀释和抑制,不再像普通网络那样呈指数级失控。

5. 一个秒懂的生活类比

  • 没有残差网络:像一条只允许单行的盘山公路(每一层都必须走)。如果路上有一辆车抛锚(梯度消失),后面整条路全堵死(更新传不下去)。如果有一辆车失控加速(梯度爆炸),整条路连环追尾(参数爆炸)。

  • 有残差网络:像旁边紧贴着一条笔直的国道(恒等映射)。国道没有红绿灯,永远畅通(梯度永远能直接传回)。主干道堵车或飙车,都不影响国道上的物流(基础梯度信号),网络总能获得稳定的反馈。


6. 结合你的 PyTorch 代码(怎么写)

你在 forward 里看到的就是这个“加号”:

1
2
3
4
5
6
7
8
9
10
11
12
13
class ResidualBlock(nn.Module):
def __init__(self, channels):
super().__init__()
self.conv1 = nn.Conv2d(channels, channels, 3, padding=1)
self.conv2 = nn.Conv2d(channels, channels, 3, padding=1)
self.relu = nn.ReLU()

def forward(self, x):
# 残差核心:将输入 x 直接加到卷积输出上
out = self.conv2(self.relu(self.conv1(x)))
out = out + x # 👈 就是这个加法操作,物理上实现了梯度直达
out = self.relu(out)
return out

一句话总结:
残差连接并没有消灭梯度消失,而是通过 “短接 + 加法” 在反向传播链中强行插入了一个 “1”。这个“1”确保了无论网络多深,深层梯度都能以“最坏保底”的方式无损地传回浅层,从而让几百上千层的网络能够稳定训练。这就是你将来要接触的大模型(GPT、ViT、扩散模型)都能跑得动的底层物理学基础。😎

问题2:还是不懂,梯度消失或爆炸指的是浅层网络的参数吧,反向传播时它们距离 loss 最远。但是残差连接 y = F(X) + x 这里 y 是深层网络,不是浅层网络啊

deepseek 回答

这个问题问得太好了,直接点中了初学者最容易产生“时空错乱”的地方。你的逻辑完全正确:正向传播时,y 确实是深层网络的输出;但梯度消失/爆炸发生在反向传播时,是从 yx(浅层)走的。

我们换个视角,站在“反向传播”的队列里来看,你瞬间就懂了。


1. 反向传播的“逆行”路线

假设损失函数是 $ L $,反向传播时,梯度信号从 $ L $ 出发,倒着往回走

当它走到你写的这一层时: \[ y = F(x) + x \] 在这一刻,y 是“上游”(靠近损失),x 是“下游”(靠近浅层输入)

现在,我们要计算损失 $ L $ 对浅层输入 $ x $ 的导数(即梯度),根据链式法则: \[ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} \]

由于 $ y = F(x) + x $,对 $ x $ 求导得到: \[ \frac{\partial y}{\partial x} = \frac{\partial F(x)}{\partial x} + 1 \]

把公式代进去: \[ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \left( \frac{\partial F(x)}{\partial x} + 1 \right) \]


2. 拆开看:浅层网络收到了“两份快递”

我们把上面的乘法拆开: \[ \frac{\partial L}{\partial x} = \underbrace{\frac{\partial L}{\partial y} \cdot \frac{\partial F(x)}{\partial x}}_{\text{快递 A(危险路径)}} + \underbrace{\frac{\partial L}{\partial y} \cdot 1}_{\text{快递 B(保命路径)}} \]

  • 快递 A(危险路径):它需要穿过 $ F(x) $ 内部的那些卷积层、全连接层。这一段路极其凶险(连乘很多梯度),等它送到浅层时,可能已经变成 0(消失)或无限大(爆炸)了。
  • 快递 B(保命路径):它直接从 y 跳到了 x!因为乘以 1,这束梯度信号被完完整整、原封不动地送到了浅层网络手中。

回答你的核心疑问
虽然 y 是深层输出,但在反向传播时,y 的梯度($ L/y $)通过“+1”这条捷径,瞬间跨越了所有中间层,直接空降到了浅层的 x 那里。 浅层参数拿到的梯度里,始终包含这份“无损直达”的保底信号。


3. 用“消防通道”来打比方

  • 没有残差:楼里只有一条狭窄的旋转楼梯(深层网络)。消防员(梯度)从顶楼(损失)往下冲,每下一层(经过一层)都会有人堵路(梯度连乘),等冲到一楼(浅层),人已经累死或挤散了(梯度消失)。
  • 有残差连接:楼里额外建了一根垂直的消防滑梯(恒等映射 +1)。滑梯的入口在顶楼(y),出口直达一楼(x)。无论中间楼层(F(x))怎么着火、怎么堵路,消防员(梯度)随时可以跳进滑梯,从顶楼瞬间滑到底楼,毫发无伤。浅层网络接到这部分“生力军”信号,就能正常更新了。

4. 结合你的 PyTorch 代码看反向流

1
2
3
4
def forward(self, x):
out = self.conv2(self.relu(self.conv1(x))) # F(x)
out = out + x # 这里是 y = F(x) + x
return out

在反向传播时(loss.backward()): 1. 梯度传回 out(即 y)。 2. 遇到 out + x 这个加法节点,梯度会分流: - 一路钻进 out(也就是 F(x)),艰难地穿过 conv2conv1 去更新它们的权重(这条路可能消失)。 - 另一路直接通过加法节点的“直连通道”,毫不费力地传到 x,进而传到 x 之前的更浅层网络。

结论:正是因为 y 是深层输出,而 ∂y/∂x = 1,所以距离最远的浅层网络,获得了最无障碍的梯度直达通道。这就是残差网络能把层数堆到几千层,而普通网络堆到 20 层就崩盘的物理学核心。😉

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2026 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信