一、梯度消失
梯度消失的根本原因在于 激活函数的性质和链式法则的计算:
-
激活函数的导数很小:
- 常见的激活函数(例如 Sigmoid 和 Tanh)在输入较大或较小时,输出趋于饱和(Sigmoid 的输出趋于 0 或 1),其导数接近于 0。
- 在反向传播中,每一层的梯度都会乘以激活函数的导数。如果导数很小,乘积就会导致梯度逐渐变小。
-
链式法则的多次相乘:
假设网络有 nn 层,梯度从输出层传到第 ii 层时,会经历多次链式相乘:- 如果每一项的导数都小于 1(例如 0.5),那么多次相乘后梯度将变得非常小,接近于 0。
-
深层网络的结构:
层数越多,梯度消失的积累效应越明显,导致靠近输入层的权重几乎无法更新。
1.4 梯度消失带来的问题
- 网络无法有效学习:靠近输入层的权重无法更新,网络的学习能力只集中在靠近输出层的部分,导致模型性能受限。
- 训练时间增加:梯度很小,优化器调整参数的速度变慢,训练需要更多的时间。
二、梯度爆炸
1 梯度爆炸的现象
与梯度消失相反,当网络层数较深时,梯度在反向传播过程中可能会逐渐变大,甚至变得非常大。这种现象被称为梯度爆炸。
由于梯度过大,模型的参数更新幅度也会非常大,可能导致:
- 参数出现巨大波动,训练过程不稳定;
- 损失值(Loss)变得非常大,甚至出现
NaN
; - 模型无法收敛,最终无法学习任何规律。
2 为什么会发生梯度爆炸?
梯度爆炸的原因与梯度消失类似,主要是由于链式法则的多次相乘,但此时乘积中的值大于 1:
-
权重初始化不当:
- 如果网络的初始权重过大,在反向传播时,梯度的值也会变得很大。
- 例如,如果每层的权重初始化为 5,经过 10 层的链式积累,梯度可能会变成
-
激活函数的导数较大:
- 如果激活函数的导数值很大,梯度在多次相乘后会迅速变大。
-
深层网络的结构:
- 网络层数越多,链式法则的积累效应越明显,导致梯度爆炸的概率增大。
3 梯度爆炸带来的问题
- 训练不稳定:梯度过大,导致参数更新过快,训练过程可能无法收敛。
- 损失发散:梯度爆炸会导致损失值发散,模型无法学习有效特征。
三、残差块
残差块(Residual Block)是深度学习中 ResNet(Residual Network) 网络的核心组件,它最早由微软研究院的何凯明(Kaiming He)等人在 2015 年提出。残差块通过引入跳跃连接(skip connection),解决了深层神经网络训练中的梯度消失、梯度爆炸和退化问题,使得网络能够训练得更深、性能更好。
为什么需要残差块?
在深层神经网络中,随着网络深度的增加(层数增多),存在以下问题:
- 梯度消失(Vanishing Gradient):反向传播时,梯度在逐层传递过程中可能逐渐变小,从而无法有效更新靠近输入层的权重。
- 梯度爆炸(Exploding Gradient):反之,梯度可能会在逐层传递过程中变得过大,导致模型训练不稳定。
- 退化问题(Degradation Problem):当网络层数增加时,模型的训练误差反而会变大,甚至性能比浅层网络更差。
这些问题的根本原因在于,随着层数增加,网络在拟合复杂非线性变换时可能会难以优化。残差块通过引入跳跃连接,允许网络直接学习相对较小的残差(Residual),从而降低优化难度。
残差块的结构
一个标准的残差块具有以下结构:
- 主路径(Main Path):通过若干个卷积、批归一化(Batch Normalization)、激活函数(如 ReLU)组成,是网络的主要信息传递路径。
- 跳跃连接(Skip Connection):从输入直接添加到输出,为网络提供了一条“捷径”。
输出形式为:
y=F(x)+x
其中:
- x:残差块的输入。
- F(x):主路径中卷积、激活等操作的输出。
- y:残差块的最终输出。
通过直接将输入 x 加到输出 F(x) 上,残差块能够显式学习 F(x)=H(x)−x,即学习输入与目标值之间的残差。如果 H(x) 是目标映射函数,那么 F(x)F(x) 是残差函数。
1. 一般形式的残差块
以两个卷积层为例,残差块的结构如下:
- 输入:x
- 第一层卷积(Conv1d/Conv2d),带激活函数(如 ReLU)。
- 第二层卷积(Conv1d/Conv2d)。
- 跳跃连接:直接将 xx 与经过两层卷积后的结果相加。
- 激活函数(如 ReLU)。
数学表达式为:
y=ReLU(F(x)+x)
2. 带维度变换的残差块
如果输入和输出的特征维度不同(例如通道数或空间维度变化),需要使用额外的线性变换对输入 x 进行升维或降维(Projection Shortcut),使得尺寸匹配。
y=F(x)+Ws x
其中 Ws是一个线性变换(通常是 1×1 卷积)。
直观解释残差块的作用
1. 更容易优化深层网络
通过学习残差 F(x)=H(x)−x,残差块将复杂的非线性映射 H(x)转换为一个简单的优化问题。即使网络层数增加,残差块可以将输入直接传递到更深层,减轻梯度消失的影响。
2. 提供信息的捷径
跳跃连接允许信息直接从输入传递到输出,让网络更容易捕捉重要的特征,同时保留原始特征。
3. 防止退化问题
在普通深层网络中,增加更多的层可能会导致模型性能退化,反而不如浅层网络。残差块通过添加跳跃连接,可以显式地学习哪些层需要参与计算,哪些层可以跳过,从而有效防止退化。