深度学习各种 Normalization 方法小结

机器学习与数学

共 5398字,需浏览 11分钟

 · 2022-01-10

目前深度学习已经彻底改变了很多研究领域,如自然语言处理、计算机视觉等。深度学习当然涉及训练精心设计的深度神经网络,而各种设计会影响这些深度网络的训练机制。其中一些设计包括,

  • 网络中使用的网络层类型,例如卷积层、循环层等,以及网络应该有多少层?

  • 应该使用什么样的归一化层?

  • 待优化的损失函数应该是什么?

这些设计主要取决于我们试图解决的基本任务,并且需要对我们手头不同选项有更深入的了解。这里我们主要关注第 2 点,即深度学习中的不同 Normalization 层

本文将介绍以下 Normalization 方法,

  • Batch Normalization

  • Weight Normalization

  • Layer Normalization

  • Group Normalization

  • Instance Normalization

  • Weight Standarization

1为什么要 Normalization

在深度神经网络中,存在一种内部协变偏移internal covariate shift现象,它是由于训练过程中不断变化的网络参数导致网络各层的输入分布发生变化。

例如,输入层中某些具有较高数值的特征可能会起到主导作用,从而在网络中产生偏差,即只有这些特征对训练结果有贡献。

例如,假设特征 1 的值介于 1 和 5 之间,特征 2 的值介于 100 和 10000 之间。在训练期间,由于两个特征的规模不同,特征 2 将主导网络,只有该特征对模型作出贡献。



这仅仅是一层的情况,如果从整个深度神经网络来看,那就更加复杂了。Google 在其论文中将这一现象总结为,

Internal Covariate Shift 简称 ICS,是由于训练过程中网络参数的变化引起的网络激活分布的变化。

网络中的每一层的参数更新会导致本层的激活输出的分布发生变化,也就是后面层的输入的分布发生变化。而深度神经网络往往涉及到很多层的叠加,通过层层叠加,会引发后面层非常剧烈的变化,这就给深度模型的训练带来了巨大挑战。

由于上述原因,引入了称为 normalization 的概念来解决这些问题。

Normalization 有很多优点,包括

  • 减少内部协变偏移以改善训练;

  • 将每个特征缩放到相似的范围以防止或减少网络中的偏差;

  • 通过防止权重在整个地方爆炸并将它们限制在特定范围内来加速优化过程;

  • 通过辅助正则化减少网络中的过拟合。

Normalization 也可以结合概率论来解释。一般来说,机器学习中的方法比较偏爱独立同分布的数据。当然并不是所有算法都有这个要求,但独立同分布的数据往往可以简化一般模型的训练,提升模型的预测能力。

在把数据输入模型之前,对其经过白化(whitening)处理是一个不错的预处理步骤。

比如上图(左)的数据,先经过零均值化以及去相关性操作,得到中间的形式,各个特征相互独立;再让所有特征具有单位标准差,最终得到独立同分布的数据。

但深度学习中往往不直接使用白化操作,白化中间需要用到 PCA。如果对输入数据作一次 PCA,那也仅仅是针对线性模型,但如果针对神经网络中的中间每一层在激活后再使用白化,那计算代价太过高昂。

那怎么办呢?不妨模仿白化,但可以作一些简化,比如不考虑去相关性,而是对各层的激活输出在一定范围内作标准化处理,再加一定的缩放和偏移。这里的操作范围可以不同,于是就有了一堆 Normalization 方法。

2Batch Normalization

Batch Normalization 侧重于标准化任何特定层的输入(即来自前一层的激活)

下图左边网络中没有 BN 层,右边网络中在隐藏层后加入了 BN 层,即对影藏层的激活在小批次上作 Normalization。

标准化输入意味着网络中任何层的输入都应该近似零均值以及单位方差。简单来说,BN 层通过减去当前小批量中的输入均值并除以标准差来变换当前小批量中的每个输入。

但是每一层不需要期望具有零均值和单位方差的输入,相反,模型可能在其他均值和方差的情况下表现更好。因此,BN 层还引入了两个可学习的参数

整个层操作如下。它接受输入 并将其转换为 ,如下表所述。

输入:一个 mini-batch 上 的值:

待学习参数:

输出:

  • mini-batch 均值
  • mini-batch 方差
  • 标准化
  • 缩放和偏移

那么 BN 到底是如何帮助神经网络训练呢?直观地说,在梯度下降中,网络根据任何层的当前输入计算梯度,并在梯度方向上更新权重。但是由于这些层一个接一个地堆叠起来,任何特定层的输入数据分布会因为前一层权重的轻微更新而发生很大变化,因此当前的梯度并不能为网络提供最优更新。

而 BN 将特定层的输入数据(即来自前一层的激活)的分布作统一校正,这有助于网络为权重更新产生更好的梯度。因此,BN 通常提供非常稳定且高效的训练制度。

下面看一个隐藏层有 3 个神经元的示例,批次大小为 ,校正之前,每个神经元的输出分布可能各不相同,但 BN 层试图让它们都遵循标准正态分布,当然之后可以再作一定缩放和偏移变换。

总结一下:简而言之,BN 使得梯度更具预测性,从而有效改善网络训练。

下面,让我们看看 BN 的一些优点:

  • BN 加速深度神经网络的训练。

  • 对于每个输入小批量,我们计算不同的统计量,这引入了某种正则化。正则化技术起到在训练期间限制深度神经网络复杂度的作用。

  • 每个小批量都有不同的小分布,这些小分布之间的变化称为内部协变偏移,BN 被认为消除了这种现象。

  • BN 对通过网络的梯度流也提供了有利影响:它减少了梯度对参数尺度或其初始值的依赖性,从而使我们能够使用更高的学习率。

然而,下面是批量标准化的几个缺点:

  • BN 在每次训练迭代中计算批次数据的统计量(Mini-batch 均值和方差),因此在训练时需要更大的批次大小,以便它可以有效地逼近来自 mini-batch 的总体均值和方差。这使得 BN 更难训练用于对象检测、语义分割等应用的网络,因为它们通常涉及高分辨率(通常高达 1024,2048 等)的输入数据,使用大批量进行训练在计算上往往是不可行的。

  • BN 不适用于 RNN。问题是 RNN 与之前的时间戳具有循环连接,并且在 BN 层中的每个时间步长都需要单独的 ,这反而增加了额外的复杂性并使 BN 与 RNN 一起使用变得更加困难。

  • 不同的训练和测试计算:在测试(或推理)期间,BN 层不会从测试数据 mini-batch(上面算法表中的步骤 1 和 2)计算均值和方差,而是使用固定均值和从训练数据计算的方差。这在使用 BN 时需要谨慎,并引入了额外的复杂性。在 pytorch 中,model.eval() 确保在评估模型中设置模型,因此 BN 层利用它来使用从训练数据预先计算的固定均值和方差。

3Weight Normalization

针对 BN 的缺点,Saliman 等人提出了 WN。他们的想法是将权重向量的大小与方向解耦,从而重新参数化网络以加快训练速度。

重新参数化是什么意思呢?

不是直接对激活值 进行 normalization,而是对网络参数(权重)进行。论文作者建议使用两个参数 (权重向量的长度)(权重向量的方向)来代替某个层的权重向量

WN 加速了类似于 BN 的训练,与 BN 不同的是,它也适用于 RNN。但是与 BN 相比,使用 WN 训练深度网络的稳定性较差,因此在实践中并未得到广泛应用。

4Layer Normalization

受 BN 的启发,Hinton 等人提出的 Layer Normalization 沿特征方向而不是小批量方向对激活进行 normalization。这通过消除对批次的依赖来克服 BN 的缺点,也使得 RNN 更容易应用 BN。

与 BN 不同,LN 直接从整个隐藏层的神经元的总输入估计统计量,因此 normalization 不会在训练数据之间引入任何新的依赖关系。它适用于 RNN,并提高了几个现有 RNN 模型的训练时间和泛化性能。最近,它还与 Transformer 模型一起配合使用。

注意上图中的颜色走向,与 BN 有所不同,LN 对某一个层中所有特征进行归一化,而不是在小批量中对输入特征进行归一化。

因此,当处理批次大小(batch size) 时,实际上拥有形状为 的二维张量。此时,LN 可以表示为:

如果是 CV,那特征图就是个 4D 张量,我们可以在空间维度和所有通道上取平均值,如下所示:

5Group Normalization

与 LN 类似,GN 也沿特征方向进行操作,但与 LN 不同的是,它将特征划分为若干组并分别对每个组进行 normalization。在实践中,GN 比 LN 常常表现得更好,它的参数 num_groups 可以设为超参数。

如果觉得 BN、LN、GN 有点令人困惑,下图给出了一个总结。给定形状 (N, C, H, W) 的激活,BN 归一化 N 方向,LN 和 GN 归一化 C 方向,但 GN 额外地将 C 通道分组并单独 normalize 各个组。

分别指的是 batcheschannelsheightwidth,BN 在 方向归一化,LN 和 GN 在 方向归一化,而 GN 顾名思义就是将通道分组并分开归一化。

6Instance Normalization

上图中,最后一个是 Instance Normalization 的示意图。IN 仅仅在特征的空间维度上计算,因此它对于每个通道和样本都是独立的。

有趣的是,IN 中的仿射参数可以完全改变输出图像的风格。与 BN 不同,IN 可以将每个单独样本的风格归一化为目标风格(由 建模)。因此,训练模型更容易转换到特定风格。因为网络的其余部分可以将其学习能力集中在内容操作和局部细节上,同时丢弃原始的全局细节(即 style 信息)。它的数学表达式为:

.Adaptive Instance Normalization .

Normalization 和风格迁移密切相关。如果 是从另一个图像 的特征统计中引入的呢?通过这种方式,我们将能够通过将我们想要的特征图像均值作为 并将方差作为来自 style 图像 来建模任何任意 style。

自适应 IN(AdaIN)接收输入图像 (内容)和 style 输入 ,并简单地对齐 的通道均值和方差以匹配 的均值和方差。IN 的数学公式为:

下图中可以看到一个简单的编码器-解码器网络架构,带有额外的 AdaIN 层用于样式对齐。

7Weight Standardization

权重标准化是上述 WN 的变体。与关注激活的标准方法不同,WS 针对权重进行平滑处理。

我们来简述一下 WS 的操作流程。考虑一个标准卷积层,将其偏置项设置为

其中 表示层中的权重, 表示卷积操作。因为 是输出通道数, 对应于每个输入通道中 kernel 区域内的输入通道数。

以上图为例,。在 WS 中,我们不是直接在原始权重 上优化损失 ,而是将权重 重新参数化为 的函数,即 ,并通过 SGD 优化 上的损失

其中,

分别计算每个输出通道的均值和标准差,可以结合下图来理解。

本质上,WS 旨在单独调控每个输出通道的权重的一阶统计量。通过这种方式,WS 在反向传播期间对梯度进行 normalization。

从理论上和实验上都验证了它通过标准化卷积层中的权重来平滑损失情况。

理论上,WS 减少了损失和梯度的 Lipschitz 常数。核心思想是将卷积权重保持在一个紧凑的空间中,从而平滑了损失并改进了训练。

论文作者将 WS 与 GN 结合使用,取得了不错效果。

在 ImageNet 和 COCO 上比较 normalization 方法,GN+WS 大大优于单独使用 BN 和 GN。

8小结

最后,为了便于比较和分析它们的工作原理,我们将上述几种主要 normalization 方法汇聚在一个图中。

当在论文或具体网络架构中遇到这些名词时,脑子中可以浮现出对应的图来辅助理解。

至于这些方法分别适合什么任务,需要大家在实践中不断积累经验,也欢迎大家留言交流。


参考资料

[1]

https://theaisummer.com/normalization/

[2]

https://ai-pool.com/a/s/normalization-in-deep-learning

[3]

https://towardsdatascience.com/different-normalization-layers-in-deep-learning-1a7214ff71d6

[4]

https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338



浏览 108
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报