深度神经网络中的归一化技术
为什么我们需要归一化?
归一化一直是深度学习研究的一个活跃领域。归一化技术可以大大减少机器学习模型的训练时间。让我们看看归一化的一些好处。
- 它对每个特征进行归一化,以便它们保持每个特征的贡献,因为某些特征具有比其他特征更高的数值。通过这种方式,我们的网络可以不带偏见(对于值很大的特征)。
- 它减少了内部协变量Shift。它是由于训练过程中网络参数的变化而引起的网络激活分布的变化。为了提高训练质量,我们寻求减少内部协变Shift。
- 在论文中(https://arxiv.org/pdf/1805.11604.pdf),作者声称Batch Norm使损失表面更平滑(即它更严格地限制了梯度的大小)。
- 它使优化更快,因为归一化不允许权重爆炸并将它们限制在一定范围内。
- 归一化的一个意想不到的好处是它有助于网络的正则化(只是轻微的,不是显著的)。
从上面我们可以得出结论,正确归一化可能是让你的模型有效训练的关键因素,但这并不像听起来那么容易。让我先看一些问题。
- 归一化层在分布式训练中的表现如何呢?
- 您应该使用哪种归一化技术来完成CNN,RNN,风格转移等任务?
- 在训练中更改数据集的批量大小时会发生什么?
- 哪种归一化技术是网络计算和准确性的最佳平衡呢?
为了回答这些问题,让我们逐一深入研究每种归一化技术的细节。
批归一化
批归一化是一种归一化网络中确定大小的小批量激活的方法。对于每个特征,批归一化计算小批量中该特征的均值和方差。然后它减去均值并通过其小批量标准差来划分特征。
如果增加权重的大小能使网络表现得更好呢?
为了解决这个问题,我们可以分别添加γ和β作为scale和shift学习参数。这一切可以概括为:
ε是等式中的稳定常数
与批归一化相关的问题:
- 可变批量大小→如果批量大小为1,则方差将为0,这不允许batch norm工作。此外,如果我们的mini-batch小,那么它会变得太嘈杂,而且训练可能会影响。分布式训练也会出现问题。因为,如果您在不同的机器中进行计算,那么您必须采用相同的批量大小,否则对于不同的系统,γ和β将是不同的。
- 循环神经网络 →在RNN中,在RNN中,每个时间步的重复激活将有不同的统计数据。这意味着我们必须为每一个时间步设置一个单独的batch norm层。这使得机器学习模型更加复杂和占用空间,因为它迫使我们存储训练过程中每个时间步的统计信息。
权重归一化
我们为什么不直接对激活进行归一化,而对层的权重进行归一化呢?权重归一化确实是这样。
权重归一化将权重(ω)重新参数化为:
它将权重向量与其方向分开,这与具有方差的批归一化具有类似的效果。唯一的区别在于变化而不是方向。
至于平均值,论文的作者巧妙地将仅平均批归一化和权重归一化结合起来,即使在small mini-batches中也能获得所需的输出。这意味着他们减去了minibatch 的平均值,但没有除以方差。最后,他们使用权重归一化而不是除以方差。
注:由于大数定律,与方差相比,均值的噪声较小(这使得均值优于方差)。
权重归一化与仅平均批归一化相结合,可在CIFAR-10上获得最佳结果。
层归一化
层归一化对跨特征的输入进行归一化,而不是在批归一化中对跨batch维度的输入特征进行归一化。
mini-batch包含具有相同数量特征的多个示例。Mini-batches是矩阵(或张量),其中一个轴对应于批次,另一个轴(或多个轴)对应于特征尺寸。
i代表批次,j代表特征。xᵢ,ⱼ是输入数据的第i,第j个元素。
在RNN的情况下,层归一化比批归一化更好。
实例(or Contrast)归一化
层归一化和实例归一化彼此非常相似,但它们之间的区别在于实例归一化在每个训练示例中的每个通道上归一化,而不是在训练示例中跨输入特征进行归一化。与批归一化不同,实例归一化层也在测试时应用(由于mini-batch的非依赖性)。
在这里,X ∈ℝT×C×W×H为输入包含批次Ť图像的张量。X ₜᵢⱼₖ表示第tijk个元素,其中k和j跨空间维度(图像的高度和宽度),i为特征的信道(如果输入是一个RGB颜色通道图像),t是batch中图像的索引。
该技术最初设计用于风格转移,实例归一化试图解决的问题是网络应该与原始图像的对比度无关。
组归一化
顾名思义,组归一化针对每个训练样例对通道组进行标准化。我们可以说,Group Norm介于Instance Norm和Layer Norm之间。
当我们将所有通道放入一个组时,组归一化将成为层归一化。并且,当我们将每个通道放入不同的组时,它将成为实例归一化。
Sᵢ定义如下
这里,x是由层计算的特征,i是索引。在2D图像的情况下,i =(i N,i C,i H,i W)是以(N,C,H,W)顺序索引特征的4D向量,其中N是batch轴,C是通道轴,H和W是空间高度和宽度轴。G是组的数量,它是预定义的超参数。C / G是每组的通道数。⌊.⌋是floor操作,“ ⌊kC/(C / G)⌋=⌊iC/(C / G)⌋ ”表示索引i和k假设每组通道沿C轴按顺序存储,则它们位于同一组通道中。GN计算沿(H,W)轴和沿着一组C / G通道的μ和σ。
Batch-Instance归一化
实例归一化的问题在于它完全删除了样式信息。虽然,这有其自身的优点(例如在风格转移中),但在对比度很重要的条件下(如天气分类,天空的亮度很重要)可能会出现问题。Batch-Instance归一化试图通过了解应该为每个通道(C)使用多少样式信息来处理这种情况。
Batch-Instance归一化只是批归一化和实例归一化之间的插值。
ρ的值在0和1之间
Batch-Instance归一化的有趣方面是通过梯度下降来学习平衡参数ρ。
从Batch-Instance归一化,我们可以得出结论,模型可以学习使用梯度下降自适应地使用不同的归一化方法。
我们可以在需要时切换归一化技术吗?
答案是肯定的。
可切换归一化
可切换归一化方法从批归一化、实例归一化和层归一化出发,采用不同均值和方差统计量的加权平均。
在图像分类和对象检测等任务中,切换归一化可能优于批归一化。
实例归一化在较早的层中更常使用,中间优选批归一化,最后更常使用层归一化。batch sizes越小,就越倾向于层归一化和实例归一化。