ResNet
残差块(Residual Block)是ResNet(Residual Network)的核心思想之一,主要通过引入跳跃连接(skip connection)来帮助训练更深的神经网络。以下是对残差块的详细解释:
1. 残差块的基本结构
残差块的基本结构包括以下部分:
- 常规的卷积层:这部分与普通的卷积神经网络(CNN)结构相似,通常包含卷积层、激活函数(如ReLU)以及可能的批量归一化层。
- 跳跃连接(Shortcut Connection):这是残差块的关键。跳跃连接将输入信号直接传递到输出端,绕过中间的卷积层。跳跃连接的输出会与卷积层的输出进行相加(通常是元素-wise加法)。
图示结构:1
2
3Input → [Conv → ReLU → Conv] → Output
↑ ↓
Shortcut → Add
2. 残差块的核心思想
残差块的核心思想是学习“残差”(residual),而不是学习直接的映射。残差块的目标是通过学习输入和输出之间的差异来简化网络的学习过程。数学上,残差块的输出可以表示为:
[
y = F(x, \{W_i\}) + x
]
其中:
- (x) 是输入信号,
- (F(x, \{W_i\})) 是通过卷积层和激活函数等得到的特征变换(即残差部分),
- (y) 是最终的输出信号,
- (W_i) 是卷积层的权重。
简而言之,残差块并不是学习直接的输出 (y),而是学习输入和输出之间的“差异”或“残差”。通过这种方式,网络可以更容易地优化,因为它不再需要学习每一层的完整映射。
3. 为什么残差连接有效?
残差连接的引入带来了一些显著的好处:
- 缓解梯度消失问题:在传统的深度网络中,随着网络的加深,梯度会在反向传播过程中逐渐变小(梯度消失),导致网络难以训练。通过残差连接,梯度可以直接沿着跳跃连接传播,避免了梯度消失。
- 简化优化过程:直接学习残差比学习完整的映射更容易。对于浅层网络,学习的映射可能较简单;而对于深层网络,学习的残差较容易得到优化。
- 改善信息流:通过跳跃连接,输入信息可以绕过一些层传递到后面的层,这有助于缓解层间的“信息瓶颈”,使得深层网络能够更好地传播特征。
4. 残差块的不同类型
根据任务和结构的不同,残差块可以有所变化,主要有以下几种常见类型:
- 基础残差块:包括两个卷积层,每个卷积层后都有一个ReLU激活函数。输入信号通过跳跃连接直接加到输出。
- 瓶颈残差块:为减少计算量,引入了1x1卷积层,在高维特征空间和低维特征空间之间进行映射,从而减少计算量。这种结构常见于更深的ResNet版本(如ResNet-50及以上)。
5. 残差块的优势
- 训练深层网络:通过残差块,可以训练非常深的神经网络(例如,ResNet-152),并且避免了深度网络在训练时遇到的退化问题。
- 提高精度:ResNet凭借其残差连接,能够在多种图像分类、物体检测等任务中取得显著更好的性能。
总结
残差块的创新点在于引入了跳跃连接,使得网络可以学习输入和输出之间的“残差”而非直接的映射。这不仅解决了深度网络训练中的梯度消失和退化问题,也使得深层网络的训练更加高效,取得了更高的性能。在ResNet等模型中,残差块成为了深度神经网络训练中的一个关键组成部分。
数学角度
从数学角度理解ResNet(Residual Network)主要涉及其创新的残差学习(Residual Learning)理念,这一概念是通过引入跳跃连接(skip connections)来减少深度神经网络训练中的一些问题,特别是梯度消失和梯度爆炸问题。以下是对ResNet从数学角度的深入解释:
1. 传统神经网络的计算过程
对于传统的深度神经网络(DNN),假设我们有一个输入 ( x ),通过多个层(每一层的输出为 ( f ))进行处理,最终得到输出 ( y ),整个网络的过程可以表示为:
[
y = f_n(f_{n-1}(\dots f_2(f_1(x))\dots))
]
其中,( f_i ) 表示网络的每一层(比如卷积层、全连接层等),每一层会根据输入进行某种变换。
2. ResNet的核心思想:残差学习
ResNet的核心想法是通过学习输入和输出之间的残差,而不是直接学习映射。假设我们希望通过一个深度网络计算一个映射 ( H(x) ),而不是直接学习 ( H(x) ),ResNet引入了残差映射 ( F(x) ),并且将它们的输出相加。
残差学习的核心公式是:
[
y = F(x, \{W_i\}) + x
]
其中:
- ( F(x, \{W_i\}) ) 是网络的残差部分,表示层与层之间的变换(例如卷积、非线性激活等)。
- ( x ) 是输入信号(即跳跃连接传递的信号)。
- ( y ) 是输出。
3. 残差块的数学表达
在实际实现中,ResNet通过引入残差块(Residual Block),其结构在数学上可以表示为:
[
y = \mathcal{H}(x) + x
]
其中,( \mathcal{H}(x) ) 是网络希望学习的残差,而 ( x ) 是输入。即,ResNet不直接学习输入到输出的映射,而是学习输入到输出之间的差异。
4. 为什么这样做有效?
4.1 缓解梯度消失/梯度爆炸问题
在传统的深度网络中,当网络层数增加时,梯度消失或梯度爆炸问题常常导致网络无法训练。而残差连接可以有效地缓解这个问题,因为它允许梯度直接通过跳跃连接向前传播。这意味着在反向传播时,梯度可以更容易地流过网络的较深层,而不至于在传递过程中变得过小或过大。
在数学上,通过引入残差块,梯度反向传播时能够更容易地传播回输入层,因为输入 ( x ) 会直接影响输出 ( y ),而不仅仅是通过中间的层(( F(x, \{W_i\}) ))进行间接影响。
4.2 加速收敛
由于网络学习的是“残差”而非直接映射,这通常意味着学习任务变得更加容易。例如,在一些情况下,直接学习映射 ( H(x) ) 可能非常复杂,而学习残差 ( F(x) ) 会使得学习变得简单,因为残差通常比直接映射更加接近零,学习起来更容易。
4.3 退化问题(Degradation Problem)
在传统深度网络中,随着层数的增加,网络的性能往往会下降。这是因为随着网络加深,优化变得更加困难,反向传播的梯度会越来越小,导致训练不收敛,称为“退化问题”。通过残差块,ResNet使得网络的深度与性能不再呈现负相关关系。事实上,ResNet的深度增加时,性能并不会恶化,反而因为残差学习的引入,网络变得更容易训练。
4.4 简化优化问题
残差块通过直接加上输入 ( x ) 和输出 ( F(x) ) 来定义一个新函数 ( \mathcal{H}(x) )。这样做的好处在于,网络不必学习一个完全不同的目标,而是学习输入和目标之间的“差异”。这使得网络能够通过更少的训练步骤来收敛,并且在很多情况下,训练过程变得更加稳定。
5. 数学推导:ResNet的梯度传播
对于残差块,假设我们对每一层进行梯度计算:
[
\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} \cdot \left( 1 + \frac{\partial F(x)}{\partial x} \right)
]
由于 ( 1 + \frac{\partial F(x)}{\partial x} ) 保证了梯度的稳定传递(即不容易消失或爆炸),因此,网络训练时的梯度更容易传递回较早的层。
6. Residual Learning 的本质
从数学角度来看,ResNet通过学习输入和目标之间的“差异”(残差),使得每一层的学习任务变得更加简单。它允许网络学习目标输出和输入之间的偏差,从而有效地解决了深度神经网络训练中的梯度问题,并且使得网络能够更容易地进行深度扩展而不影响性能。
总结
ResNet通过引入残差连接来解决深度网络训练中的退化问题、梯度消失和梯度爆炸问题。从数学上看,残差块通过学习“差异”而不是直接学习映射,使得深层神经网络变得更容易训练。数学上,残差连接的引入不仅改善了梯度传播,还使得深度网络能够在更高的层数下依然保持良好的训练效果,从而提升了模型的性能和稳定性。
梯度公式
这段梯度计算公式:
[
\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} \cdot \left( 1 + \frac{\partial F(x)}{\partial x} \right)
]
逐步解释:
反向传播和链式法则:
- 这个公式使用了链式法则(Chain Rule),它是深度学习中反向传播的核心原理。链式法则允许我们通过将复杂的导数拆解成多个简单的部分,来计算损失函数 ( L ) 对输入 ( x ) 的导数。
公式拆解:
- 公式的左侧是 ( \frac{\partial L}{\partial x} ),表示损失函数 ( L ) 对输入 ( x ) 的梯度。
- 根据链式法则,梯度可以分解为:
[
\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x}
]
其中:- ( \frac{\partial L}{\partial y} ) 是损失函数 ( L ) 对中间变量 ( y ) 的梯度(通常 ( y ) 是网络的输出)。
- ( \frac{\partial y}{\partial x} ) 是 ( y ) 对 ( x ) 的导数,表示输出 ( y ) 如何随着输入 ( x ) 的变化而变化。
残差函数的作用:
- 这个公式特指残差块(Residual Block)。在残差网络(ResNet)中,输出 ( y ) 不仅仅是 ( x ) 的某个函数,还包括了一个残差部分:
[
y = F(x) + x
]
所以,( y ) 对 ( x ) 的导数是:
[
\frac{\partial y}{\partial x} = 1 + \frac{\partial F(x)}{\partial x}
]
这里的 ( 1 ) 来自于直接的输入 ( x ),而 ( \frac{\partial F(x)}{\partial x} ) 来自于残差函数 ( F(x) ) 的导数。
- 这个公式特指残差块(Residual Block)。在残差网络(ResNet)中,输出 ( y ) 不仅仅是 ( x ) 的某个函数,还包括了一个残差部分:
最终的梯度计算:
- 将上述部分组合在一起,我们得到:
[
\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \left( 1 + \frac{\partial F(x)}{\partial x} \right)
]
这意味着损失函数 ( L ) 对输入 ( x ) 的梯度是由以下两部分组成的:- 损失对 ( y ) 的梯度 ( \frac{\partial L}{\partial y} );
- 输出 ( y ) 对输入 ( x ) 的梯度(即包括直接传递的 ( x ) 的影响以及残差部分 ( F(x) ) 的影响)。
- 将上述部分组合在一起,我们得到:
为什么这样做有效?
在ResNet(残差网络)中,( 1 + \frac{\partial F(x)}{\partial x} ) 这一项意味着梯度可以通过跳跃连接直接传递,避免了深层网络中常见的梯度消失问题。由于输入 ( x ) 直接参与了输出 ( y ) 的计算,梯度能够更容易地在网络中传播,这使得深度网络的训练变得更加容易。
总结:
该公式展示了在残差网络中,如何通过“跳跃连接”学习残差来简化网络训练。残差连接帮助梯度在反向传播过程中更容易地传递,从而避免了深度神经网络中常见的梯度消失问题,使得更深的网络能够稳定训练并提高性能。