深度神经网络的批量归一化

在深入探讨这个话题之前,我们先来了解一下什么是“标准化”。当数据中的特征具有不同的范围时,归一化是数据处理过程中使用的一种方法,用于将数据集中数值列的值调整到相似的比例。

有不同类型的标准化:

  • 批量归一化
  • 层归一化
  • 实例标准化
  • 组标准化

在本文中,我们将了解批量归一化、归一化和批量归一化之间的区别、批量归一化的必要性以及执行批量归一化的好处是什么。这是一篇中等文章,更详细地讨论了该主题。

批量归一化是一种训练深度神经网络的方法,可归一化每个小批量对图层的贡献。这具有稳定学习过程并显着减少构建深度神经网络所需的训练时期数的作用

标准化与批量标准化有何不同?

在深度学习中,在将数据传递到神经网络之前,会先进行预处理。一些技术包括标准化和规范化。两者都有相同的目标,即转换数据并将所有数据放在相同的范围内。在标准化中,从点中减去平均值,然后除以标准差。在标准化过程中,给定的值范围将标准化为新的范围。

通常,这个范围设置为[0,1],因为这个范围可以保证不会出现梯度爆炸的问题。批量归一化包括 使用当前批次的均值和方差对隐藏层的激活向量进行归一化。该归一化步骤在非线性激活函数之前(或之后)应用。这个过程是分批完成的,因此被称为批量标准化。

通俗地说,标准化是在将数据传递到网络之前在输入处应用的,而批量标准化则发生在网络内部的隐藏层内。

批量归一化的必要性是什么?

现在我们已经对前一阶段的数据进行了归一化,解决了梯度爆炸的问题,训练速度也相对提高了。据观察,即使在标准化之后,模型也往往缓慢且不稳定。其背后的原因可能是什么?让我们简单讨论一下这个问题。

我们知道神经网络如何学习。为了让神经网络能够学习,与神经元连接相关的权重必须在数据通过网络前向传递后更新。在大多数情况下,遵循随机梯度下降,所以如果其中一个权重最终变得比其他权重大得多怎么办?

这将导致其相应神经元的输出非常大,并且这种不平衡将再次继续级联通过神经网络,导致不稳定。

这就是批量归一化的用武之地。批量归一化将应用于您选择在网络中应用的层。当将批归一化应用于层时,批归一化所做的第一件事就是标准化激活函数的输出

实施批量归一化

由于我们正在缩放和移动输入,因此每个输入都有两个对应的关联变量。这些是可学习的参数。

批量归一化

我们可以在归一化方程中看到 epsilon。这是为了确保方差永远不为零。更新每个 Xi 后,批次将具有 0 均值和一些标准差。但平均值和标准偏差将高度依赖于批次样本。即,对于每个批次,均值和方差应该不同。

因此,使用两个可学习参数 gamma 和 beta。训练批次数后,gamma 应趋向于实际均值,beta 应趋向于实际标准差。

让我们看一个使用批量归一化的神经网络示例:

from keras.models import Sequential
from keras.layers import Dense, BatchNormalization
 
model = Sequential()
model.add(Dense(32, input_shape=(64,)))
#This is the Batch normalization layer
model.add(BatchNormalization())
model.add(Dense(32))
model.add(BatchNormalization())
model.add(Dense(10, activation='softmax'))
 
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

您还可以了解如何从头开始构建网络在此示例中,该模型是一个简单的前馈神经网络,具有两个隐藏的密集层和一个具有softmax激活函数的输出层。在每个密集层之后,我们添加了一个BatchNormalization层来标准化激活。这可以使用 Keras 中的类来完成BatchNormalization,该类具有多个可选参数,例如momentumepsiloncenter,您可以使用它们来自定义批量标准化层的行为。要了解更多信息,请参阅tensorflow的官方文档。

概括

现在我们已经了解了,为什么要做以及如何实施;让我们简要讨论一下它如何使神经网络受益。

  • 它减少了内部协变量偏移。
  • 提高训练速度
  • 降低初始权重的重要性
  • 正则化模式

参考: