BatchNormalization 与 残差 是如何改善resnet网络效果的
批量归一化(Batch Normalization)缓解梯度问题
批量归一化(Batch Normalization,简称BN)是深度学习中一个非常有效的技术,它通过规范化每一层的输入来加速训练,并帮助缓解梯度消失和梯度爆炸的问题。接下来,我会用通俗易懂的方式解释为什么批量归一化能做到这一点。
为什么能加速训练?
-
稳定每层输入分布(这个观点可能是错的, 据沐神的视频,协变量偏移并没有太多改善更多是引入噪声):
- 在没有批量归一化的情况下,随着网络的训练进行,各层的权重不断更新,这会导致每层的输入分布发生变化。这种现象被称为“内部协变量偏移”(internal covariate shift)。当输入分布变化时,模型需要不断地调整参数来适应新的输入分布,这会减慢训练速度。
- 批量归一化通过对每层输入进行标准化(使其均值为0,方差为1),保持了输入分布的稳定性,使得优化过程更加平稳,从而加快了训练速度。
-
允许使用更高的学习率:
- 因为批量归一化减少了输入分布的变化,使得模型对参数初始化不那么敏感。这意味着我们可以使用更大的学习率而不用担心参数更新过大导致训练不稳定。
- 更高的学习率可以加速收敛,因为每次更新参数时可以迈出更大的步子。
-
引入正则化效果:
- 批量归一化在计算均值和方差时依赖于当前小批量的数据,因此引入了一定程度的噪声。这种噪声起到了类似正则化的作用,有助于防止过拟合,并且可以在一定程度上替代Dropout等其他正则化方法,进一步简化模型设计。
为什么能缓解梯度问题?
-
减少梯度消失和梯度爆炸:
- 在深层网络中,激活函数的选择(如Sigmoid或Tanh)可能导致梯度消失或梯度爆炸问题。这是因为这些激活函数在其饱和区域(输出接近0或1的地方)的导数非常小,导致反向传播过程中梯度变得极其微弱或异常大。
- 批量归一化将每层的输入标准化到均值为0、方差为1的范围内,使得输入值更有可能落在激活函数的线性区域内,而不是饱和区。这样,即使在网络较深的情况下,梯度也能较好地传播,从而减少了梯度消失的风险。
-
改善梯度流:
- 当网络中的某些层出现较大的权重更新时,可能会导致后续层的输入值发生剧烈变化,进而影响梯度的传递。批量归一化通过标准化输入,限制了这种变化的程度,确保了梯度能够平滑地传递下去。
- 此外,批量归一化还引入了两个可学习的参数(缩放和平移),这使得模型可以根据实际需要灵活调整规范化后的值,进一步增强了模型的表现力。
总结来说,批量归一化通过稳定每层输入的分布、允许使用更高的学习率以及改善梯度的传递,有效地加速了训练过程,并缓解了深层网络中常见的梯度消失和梯度爆炸问题。这样一来,不仅提高了训练效率,也使得构建更深的网络成为可能。
残差网络(ResNet)如何使模型越来越好并解决深层网络中的梯度传播问题
为了更好地理解残差网络(ResNet)如何通过引入残差学习和恒等映射来改进神经网络的表现,我们可以从以下几个方面进行详细探讨:
1. 函数类与模型优化
在深度学习中,我们通常希望找到一个函数 \(f^*\),它能最好地拟合我们的数据集 \(\mathbf{X}\) 和标签 \(\mathbf{y}\)。假设有一个特定的神经网络架构 \(\mathcal{F}\),其中包含了一系列参数(如权重和偏置),这些参数可以通过训练来调整以最小化损失函数 \(L(\mathbf{X}, \mathbf{y}, f)\)。然而,在实际应用中,我们往往无法直接找到最优解 \(f^*\),而是寻找一个在给定架构 \(\mathcal{F}\) 中的最佳近似 \(f^*_\mathcal{F}\)。
- 如果我们试图通过增加网络复杂度(即设计更复杂的函数类 \(\mathcal{F}'\))来逼近 \(f^*\),并不总是能得到更好的结果。这是因为如果新旧函数类不是嵌套关系(\(\mathcal{F} \not\subseteq \mathcal{F}'\)),则新模型可能表现得更差。
- 相反,如果新旧函数类是嵌套关系(\(\mathcal{F}_1 \subseteq \ldots \subseteq \mathcal{F}_6\)),那么理论上新的模型至少不会比旧模型差。
2. 恒等映射与残差学习
残差学习的核心思想在于:与其尝试直接逼近目标函数 \(H(x)\),不如学习其与输入之间的差异 \(F(x) = H(x) - x\)。这有几个关键好处:
- 简化优化:当 \(H(x)\) 接近于输入 \(x\) 时,残差 \(F(x)\) 应接近于零,使得学习过程变得简单得多。这意味着即使在网络非常深的情况下,网络也能够轻松学会接近恒等映射的行为。
- 保持信息流:通过将原始输入 \(x\) 直接加到经过若干层变换后的输出上(即 \(\mathbf{y} = F(\mathbf{x}) + \mathbf{x}\)),可以确保信息在整个网络中得到保留,避免了因层层变换而导致的信息丢失。
3. 残差块的设计与梯度传递
在一个典型的残差块中,输入首先通过若干卷积层和其他非线性变换,然后与原始输入相加形成最终输出。这种设计不仅有助于简化优化过程,还极大地改善了梯度的传递:
-
残差块的设计:在一个典型的残差块中,输入 \(\mathbf{x}\) 首先经过若干卷积层(可能包括非线性变换),然后与原始输入相加:
\[\mathbf{y} = F(\mathbf{x}) + \mathbf{x}, \]其中 \(F(\cdot)\) 表示残差映射,即那些卷积层及其对应的非线性变换。
-
梯度传递:考虑反向传播时的链式法则,对于损失函数 \(\mathcal{L}\) 关于 \(\mathbf{x}\) 的梯度,我们有:
\[\frac{\partial \mathcal{L}}{\partial \mathbf{x}} = \frac{\partial \mathcal{L}}{\partial \mathbf{y}} \frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \frac{\partial \mathcal{L}}{\partial \mathbf{y}} (1 + \frac{\partial F(\mathbf{x})}{\partial \mathbf{x}}). \]这表明即使当 \(\frac{\partial F(\mathbf{x})}{\partial \mathbf{x}}\) 接近于零时,\(\frac{\partial \mathcal{L}}{\partial \mathbf{x}}\) 仍然可以通过直接路径得到较好的传递,从而有效地缓解了深层网络中常见的梯度消失问题。
-
恒等映射:特别地,如果残差映射 \(F(\mathbf{x}) = 0\),则输出 \(\mathbf{y} = \mathbf{x}\),意味着网络可以轻松地学会恒等映射。这不仅简化了优化过程,还允许网络在不影响性能的情况下任意加深层数。
综上所述,批量归一化通过对每一层的输入进行规范化,稳定了每一层的输入分布,进而改善了梯度流;而残差连接通过提供直接的路径让梯度可以直接传递到较早的层,大大减轻了梯度消失的风险,使得构建非常深的网络成为可能。两者结合使用,能够显著提高深度神经网络的训练效率和效果。

浙公网安备 33010602011771号