[总结] 神经网络中 Normalization 的发展历程

目录

  1. Local Response Normalization
  2. Batch Normalization
  3. Weight Normalization
  4. Layer Normalization
  5. Instance Normalization
  6. Consine Normalization
  7. Group Normalization

1. Local Response Normalization

LRN 最早应该是出现在 2012 年的 AlexNet 中的,其主要思想是:借鉴“侧抑制”(Lateral Inhibitio)的思想实现局部神经元抑制,即使得局部的神经元产生竞争机制,使其中相应值较大的将变得更大,响应值较小的将变得更小。此外,作者在论文中指出使用 LRN 能减少其 AlexNet 在 ILSVRC-2012 上的 top-1 错误率 1.4% 和 top-5 错误率 1.2%,效果较为显著。

[总结] 神经网络中 Normalization 的发展历程_第1张图片

其中, a x , y i a^{i}_{x,y} ax,yi 表示输入中第 i i i 个 FeatureMap 中位于 ( x , y ) (x,y) (x,y) 的响应值, b x , y i b^{i}_{x,y} bx,yi 表示输出中第 i i i 个 FeatureMap 中位于 ( x , y ) (x,y) (x,y) 的响应值, k , n , α , β k,n,\alpha,\beta k,n,α,β都是由验证集所决定的超参数 (Hyper-Parameter)。论文中的设定为: k = 2 , n = 5 , α = 1 0 − 4 , β = 0.75 k=2,n=5,\alpha=10^{-4},\beta=0.75 k=2,n=5,α=104,β=0.75

在 2015 年的 VGG 中,该论文指出 LRN 在 VGG 并无任何用处:

[总结] 神经网络中 Normalization 的发展历程_第2张图片

此后,随着 Batch Normalization 等不同 Normalization 的出现,LRN 也开始逐渐落寞。

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第3张图片

2. Batch Normalization

BN 应该算是目前使用最多的 Normalization 操作了,现在甚至可以说是 CNN 网络的标配。自 2015 年 2 月的 Inception V2 提出之后,也引出了后续许多不同的 Normalization 的提出。

作者在论文中指出,提出 Batch Normalization 是目的为了解决 ‘internal covariate shift’ 现象(这个应该是属于机器学习的问题,我无法进行详细表达,建议查看其他文章),经过测试后,发现使用 BN 能加速神经网络的收敛速度,并使得神经网络对于初始化的敏感度下降。
(在 深度学习中 Batch Normalization为什么效果好? - 魏秀参的回答 - 知乎 中,答者指出其实 BN 解决的是梯度消失问题(Gradient Vanishing Problem),我感觉其实有点道理的。)

[总结] 神经网络中 Normalization 的发展历程_第4张图片

其中, x i x_i xi 为输入数据, μ B 为 数 据 平 均 值 \mu_B 为数据平均值 μB σ B 2 为 数 据 方 差 \sigma^2_B 为数据方差 σB2 γ 和 β \gamma 和 \beta γβ 为学习参数。此外, μ B \mu_B μB σ B 2 \sigma^2_B σB2 是统计量,随着 Batch 的迭代不断更新(一般实现都会对其做滑动平均,不然当 Batch Size 较小时,其统计值的波动会很大,导致网络无法收敛的)。

在 BN 中,作者之所以加上 γ \gamma γ β \beta β 这两个仿射参数(Affine Parameter),是为了使得经过 BN 处理后的数据仍可以恢复到之前的分布,从而提升了网络结构的 Capacity,即在做出一定的改变的同时,仍保留之前的能力。

此外,除了 BN 背后的原理这一话题外,大家对 Batch-normalized 应该放在非线性激活层的前面还是后面?这一话题的讨论也比较激烈,并没有达成统一的观点,只是大部分实验表明BN 放在非线性激活层后比较好,不过仍需要具体任务具体分析。

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第5张图片

注意,在 PyTorch 中冻结 BN Layer,不仅需要对将其参数的 requires_grad 设为 False,还需要将该层的 training 设为 False,即调用 eval 函数;否则,将会导致统计量不断更新,而仿射参数却一直处于冻结状态。此外,一般都会设置 track_running_state 为 True,以减小 Batch Size 所造成的统计量波动。

3. Weight Normalization

在 2016 年 2 月的 Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks 中,作者提出了与 BN 完全不同的 Normalization 操作:Weight Normalization,并指出:相较于 BN,WN 摆脱了对于 Batch 的依赖,这意味这 WN 完全可以用在 RNN 网络中(如:LSTM )以及对于噪声敏感的任务(如:强化学习、生成式模型)中;此外,WN 的计算成本低,可以减少模型的运行时间。

与 BN 不同的是, WN 并不是对输入的特征数据进行归一化操作,而是对神经网络中指定的层的参数做归一化操作。

在论文中,作者将神经网络的层表示为 y = Φ ( w ∗ x + b ) y=\Phi(w*x+b) y=Φ(wx+b),其中, w w w 为权重向量, b b b 为偏置参数, x x x 为输入向量, Φ \Phi Φ 为非线性激活函数。而 WN 就是对 w w w 做归一化,将 w w w 分解为 w = g ∗ v ∣ ∣ v ∣ ∣ w=g * \frac{v}{||v||} w=gvv,其中, v ∣ ∣ v ∣ ∣ \frac{v}{||v||} vv 为单位向量,代表 w w w 的方向, g g g 为标量,代表 w w w 的长度, ∣ ∣ v ∣ ∣ ||v|| v v v v 的欧式范数。

[总结] 神经网络中 Normalization 的发展历程_第6张图片

在 详解深度学习中的Normalization,BN/LN/WN 中,作者指出:WN 与 BN 其实是相似的。

[总结] 神经网络中 Normalization 的发展历程_第7张图片

论文作者同样提到了这一点。

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第8张图片

4. Layer Normalization

在 2016 年 7 月的 Layer Normalization 中,作者提出了一种类似与 BN 的操作: Layer Normalization,提出 LN 的主要目的是为了解决 BN 对 Batch Size 和内存的依赖以及减少 Normalization 所需时间。

LN 与 BN 的不同之处在于:BN 是对一个 Batch 中的所有样本的不同维度做 Normalization,而 LN 是对单个样本中的所有维度做 Normalization。当然,两者的数学公式长得都一样,都是求平均值、方差,做归一化后在做仿射变换。

[总结] 神经网络中 Normalization 的发展历程_第9张图片

Batch Normalization 与 Layer Normalization 的区别:

[总结] 神经网络中 Normalization 的发展历程_第10张图片

举例来说,对于 S i z e = ( N , C , H , W ) Size = (N,C,H,W) Size=(N,C,H,W) 的数据,BN 计算得到的统计量的 S i z e Size Size ( C , 1 ) (C,1) (C,1),而 LN 计算得到的统计量的 S i z e Size Size ( N , 1 ) (N,1) (N,1)

[总结] 神经网络中 Normalization 的发展历程_第11张图片

(左侧:Batch Normalization,右侧:Layer Normalization)

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第12张图片

5. Instance Normalization

在 2016 年 7 月的 Instance Normalization: The Missing Ingredient for Fast Stylization 中,作者提出与 LN 类似的操作:Instance Normalization。在论文中,作者指出在图像风格迁移任务中,生成式模型计算得到的 Feature Map 的各个 Channel 的均值与方差将影响到所生成图像的风格。故,作者提出了 IN,在 Channel 层面对输入数据进行归一化,再使用目标图像的 Channel 的均值与方差对结果进行 ‘去归一化’。

值得一提的是,IN 与LN 类似,仅对单个样本进行归一化,但是 IN 并不进行仿射变换。

举例来说,对于 S i z e = ( N , C , H , W ) Size = (N,C,H,W) Size=(N,C,H,W) 的数据,IN 计算得到的统计量的 S i z e Size Size ( N , C ) (N,C) (N,C)

[总结] 神经网络中 Normalization 的发展历程_第13张图片

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第14张图片

6. Cosine Normalization

在 2017 年 2 月的 Cosine Normalization: Using Cosine Similarity Instead of Dot Product in Neural Networks 中,作者提出了 Cosine Normalization,不对输入数据做归一化,也不对参数做归一化,而是对输入数据与参数的点乘做出改动,改为计算两者的余弦相似度 c o s θ cos \theta cosθ,即 w ∗ x w*x wx 变为 w ∗ x ∣ w ∣ ∗ ∣ x ∣ \frac{w*x}{|w|*|x|} wxwx

CN 将模型的输出进行了归一化,使得输出有界,但是也因此丢弃了原本输出中所含的 Scale 信息,所以这个是否值得也有待进一步探讨。

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第15张图片

7. Group Normalization

在 2018 年 3 月的 Group Normalization 中,作者提出了 Group Normalization,与 BN 相比,GN 的改进有两点:不再依赖 Batch Size,计算成本可由超参数进行调节。

作者在论文中指出,BN 对于 Batch Size 的依赖使得其无法较好的运用在因内存限制而使用较小 Batch Size 的任务上(如:detection, segmentation, video),故作者令 GN 仅对单个样本进行 Normalization 操作。此外,GN 更像是 LN 与 IN 的一般形式,当 G = 1 G = 1 G=1 时,GN 等价于 LN;当 G = C G = C G=C 时,GN 等价于 IN。

在 如何区分并记住常见的几种 Normalization 算法 中,作者给出了一张图像,直观的给出了以上 Normalization 的不同之处:

[总结] 神经网络中 Normalization 的发展历程_第16张图片

举例来说,对于 S i z e = ( N , C , H , W ) Size = (N,C,H,W) Size=(N,C,H,W) 的数据,GN 计算得到的统计量的 S i z e Size Size ( N , G ) (N,G) (N,G)

[总结] 神经网络中 Normalization 的发展历程_第17张图片

PyTorch 相关文档:

[总结] 神经网络中 Normalization 的发展历程_第18张图片

参考资料:

  • 如何区分并记住常见的几种 Normalization 算法
  • 详解深度学习中的Normalization,BN/LN/WN
  • 神经网络之Normalization
  • 深度学习中 Batch Normalization为什么效果好? - 魏秀参的回答 - 知乎

如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!

作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink

你可能感兴趣的:(神经网络,Normalization,Batch,Normalization,Deep,Learning,AI,杂谈)