在深度学习中,归一化的手段可谓无处不在。

对神经网路的输入进行归一化,对每一层的归一化(Batch Normalization、Layer Normalization),对权重的归一化(Weight Normalization)都有效的提升了神经网路的表现。

这些归一化手段是否有基于一些共同的想法?归一化手段为什么能对神经网路的训练和表现带来帮助?


BN最早被认为通过降低所谓Internal Covariate Shift,这种想法的出处可考至Understanding the difficulty of training deep feedforward neural networks,想必这也是batch norm作者这么设计的初衷。但是这种想法并没有过多实验支持,比如说去年NeurlPS这篇paper作者做了实验,在batch norm之后加上一些随机扰动(non-zero mean and non-unit variance,人为引入covariate shift),发现效果仍然比不加好很多。为什么放在batch norm layer之后而不是之前?因为为了证伪batch norm通过forward pass这一步降低covariate shift来提升网路训练效率的。这样说来故事就变得很有趣了,也就是说我们大概都理解一些BN对BN层之前网路噪音的好处,那么能不能研究一下它对它后面layer的影响?所以这些研究从优化的角度,有如下几种观点。

  1. BN通过修改loss function, 可以令loss的和loss的梯度均满足更强的Lipschitzness性质(即函数f满足L-Lipschitz和 [公式] -smooth,令L和 [公式] 更小,后者其实等同于f Hessian的eigenvalue小于 [公式] ,可以作为光滑程度的度量,其实吧我觉得,一般convex optimization里拿这个度量算convergence rate是神器,对于non-convex optimization,不懂鸭,paper里好像也没写的样子),这么做的好处是当步子迈得大的时候,我们可以更自信地告诉自己计算出来的梯度可以更好地近似实际的梯度,因此也不容易让优化掉进小坑里。有意思的地方来了,是不是我在某些地方插入一个1/1000 layer,把梯度的L-Lipschitz变成1/1000L-Lipschitz就能让函数优化的更好了呢?其实不是的,因为单纯除以函数会改变整个优化问题,而BN做了不仅仅rescale这件事情,还让原来近似最优的点在做完变化之后,仍然保留在原来不远的位置。这也就是这篇文章的核心论点,BN做的是问题reparametrization而不是简单的scaling。 [1]
  2. BN把优化这件事情分解成了优化参数的方向和长度两个任务,这么做呢可以解耦层与层之间的dependency因此会让curvature结构更易于优化。这篇证了convergence rate,但由于没有认真读,所以感觉没太多资格评价。[2]

归一化手段是否殊途同归?很可能是的,在[1]的3.3作者也尝试了Lp normalization,也得到了和BN差不多的效果。至于Layer norm还是weight norm,可能都可以顺著这个思路进行研究鸭,无论是通过[1]还是[2],可能今年的paper里就见分晓了,lets see。

  1. How Does Batch Normalization Help Optimization?
  2. Exponential convergence rates for Batch Normalization: The power of length-direction decoupling in non-convex optimization


其实这个问题很难,很偏理论。

回顾一下围绕normalization的一些工作(由最新到最旧的BatchNorm):

2019,Weight Standardization(没有发表,但是有大佬Alan Yuille加持)

Weight Standardization 2019

WS叫权重标准化,建立在BN可以平滑损失landscape/BN可以平滑激活值这个观点上,进一步提升GN的效果匹配到BN的水平上,针对GN在micro-batch训练时性能不及BN。WS的原理是:减小损失和梯度的Lipschitz常数

2019,Dynamic Normalization

Differentiable Dynamic Normalization for Learning Deep Representation ICML 2019

跟SN类似,加入了GN。

2019,Switchable Normalization

Differentiable Learning-to-Normalize via Switchable Normalization ICLR 2019

SN是为每一层选择/学习适当的归一化层(IN、LN和BN),在ImageNet,COCO,CityScapes,ADE20K和Kinetics等数据集上进行实验,应用涵盖图像分类、物体检测、语义分割和视频分类。

2019,Iterative Normalization(CVPR)

Iterative Normalization Beyond Standardization towards Efficient Whitening CVPR 2019

DBN的高效版本

2019,Spatially-Adaptive Normalization(CVPR)

Semantic Image Synthesis with Spatially-Adaptive Normalization CVPR 2019

用于图像生成

2018,Gradient Normalization(ICML)

GradNorm Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks ICML 2018

2018,Kalman Normalization

Kalman Normalization Normalizing Internal Representations Across Network Layers NIPS 2018

2018,Decorrelated Batch Normalization

Decorrelated Batch Normalization CVPR 2018

BN+白化

2018,Spectral Normalization(ICLR)

Spectral Normalization for Generative Adversarial Networks ICLR 2018

2018,Group Normalization(ECCV)

Group Normalization ECCV 2018

用于物体检测和语义分割等batch size很小的时候

GroupNorm是InstanceNorm的变体。

2018,Batch-Instance Normalization

Batch-Instance Normalization for Adaptively Style-Invariant Neural Networks NIPS 2018

2018,Instance-Batch Normalization

Two at Once Enhancing Learning and Generalization Capacities via IBN-Net ECCV 2018

2016,Layer Normalization(没有发表)

用于RNN

2016,Instance Normalization(没有发表,但是经过了实践检验)

用于风格迁移

2016,Weight Normalization(NIPS)

2015,Batch Normalization(ICML)

用于卷积网路ConvNet和图像分类

逐篇看。。。总结归纳。。。需要时间。。。


以下摘自我的另一个回答,小莲子:碎碎念:Transformer的细枝末节。原本是介绍 Layer Normalization 的。

所有的规范化技术,都可以概括为如下的公式:

[公式]

对于隐层中某个节点的输出为对激活值 [公式] 进行非线性变换 [公式] 后的[公式] ,先使用均值 [公式] 和方差 [公式][公式] 进行分布调整。如果将其理解成正态分布,就是把「高瘦」和「矮胖」的都调整回正常体型(深粉色),把偏离x=0的拉回中间来(淡紫色)。

不同均值和方差下的正态分布 | sigmoid函数

这样做的第一个好处(平移)是,可以让激活值落入 [公式]梯度敏感区间(红色虚线的中间段)。梯度更新幅度变大,模型训练加快第二个好处是,可以将每一次迭代的数据调整为相同分布(相当于「白化」),消除极端值,提升训练稳定性

然而,在梯度敏感区,隐层的输出接近于「线性」,模型表达能力会大幅度下降。引入 gain 因子 [公式] 和 bias 因子 [公式] ,为规范化后的分布再加入一点「个性」。需要注意的是, [公式][公式]作为模型参数训练得到[公式][公式]在限定的数据范围内统计得到。BN 和 LN 的差别就在这里,前者在某一个 Batch 内统计某特定神经元节点的输出分布(跨样本),后者在某一次迭代更新中统计同一层内的所有神经元节点的输出分布(同一样本下)。盗用一张 @gylight 的图:


Batch Normalizing是深度学习中最重要的技巧之一。是由Sergey Ioffe和Christian Szeged创建的。Batch Normalizing使超参数的搜索更加快速便捷,也使得神经网路鲁棒性更好。

这里有一个非常简单但很容易理解的文章。

深度学习技巧之Batch Normalizing?

www.datalearner.com图标

一般来说,在训练类似逻辑回归或者深度学习的演算法的时候,我们需要对输入数据进行标准化,这样可以保证输入的数据均值为0,且输入数据都在一定范围内,这样做主要原因是非标准化的数据优化的时候目标函数是一个扁平的结果,会影响学习的速度,而标准化之后的目标函数是接近圆形的结果,对于梯度下降求解来说能显著加快找到最优值的速度。

既然如此,那么对于深度神经网路来说,我们是否可以对每一层的输出也做一个标准化,作为下一层的输入以此来加快求解速度呢?答案是可以的,这就是Batch Normalizing。


举个不是特别恰当但是能说明问题的例子,起起伏伏的路肯定没有平坦的跑起来舒服,速度也会更慢,如果是有悬崖的登山之路一不小心就会摔死。训练神经网路模型是类似的,归一化了就相当于修了一个高速公路,把高速不平的路给压平。


因为有可能两个变数的数值上差距很大,图形上就会很扁。一方面,各种数值计算时容易大数吃小数;另一方面,求梯度的时候某个轴会非常敏感。

归一化把变数约束到一个差不多大的方盒子里分析,扁平的图形变得比较圆了。有很多好处。

相当于增加了一定的约束。

变数的权重更能体现归一化后变数在系统内的贡献,不像之前可能会非常大或非常小。

优化的过程更稳定,不同方向的步长也更「正常」了;不归一化的话震荡会更剧烈。

归一化后,不同的问题都在差不多的空间里解,很多性质和经验可以借鉴。

归一化在很多领域里都有大量应用,基本目的就是为了大家在同一平台上比较,不同变数间更「公平」。

甚至有些其他方法也是为了相同的目的;比如无量刚化,雷诺数就是流体力学中非常常用的概念,当然这些数是有物理意义的。


前面各位大佬理论上讲得很细了,我这里就说简单点,给出一个较为全局的认识。

其实深度学习里的正则化方法就是 通过把一部分不重要的复杂信息损失掉,以此来降低拟合难度以及过拟合的风险,从而加速了模型的收敛 。Normalization目的就是让分布稳定下来(降低各维度数据的方差)。

不同正则化方法的区别只是操作的信息维度不同,即选择损失信息的维度不同。

在CV中常常使用BN,它是在NHW维度进行了归一化,而Channel维度的信息原封不动,因为可以认为在CV应用场景中,数据在不同channel中的信息很重要,如果对其进行归一化将会损失不同channel的差异信息。

而NLP中不同batch样本的信息关联性不大,而且由于不同的句子长度不同,强行归一化会损失不同样本间的差异信息,所以就没在batch维度进行归一化,而是选择LN,只考虑的句子内部维度的归一化。 可以认为NLP应用场景中一个样本内部维度间是有关联的,所以在信息归一化时,对样本内部差异信息进行一些损失,反而能降低方差。

选择什么样的归一化方式,取决于你关注数据的哪部分信息。如果某个维度信息的差异性很重要,需要被拟合,那就别在那个维度进行归一化。

这些归一化手段是否有基于一些共同的想法?归一化手段为什么能对神经网路的训练和表现带来帮助?看了这个回答,应该有些感觉了吧哈哈

过拟合其实就是拟合了数据过于复杂的细节,正则化方法是让模型不去拟合这些数据细节。无论是通过消除这些影响泛化的差异信息,还是通过让模型参数变得更简单,根本出发点都是一样的。


回答只是出于探讨,如有不足还望指教。

简单来说,归一就是数据清洗的一部分,和调节图像大小灰度、或者剔除离群值一样是一种优化的手段。同时是将数据映射到0-1的范围内便于度量X矩阵或者说在ANN里的input

那么为什么要用归一化?我想有两点。

其一,ANN模型参数普遍非常大,而且input在隐藏层或者池化或者卷积的过程中,参数一定是较小的,否则robust会大打折扣,而且较大的波动性在隐藏层纵向会导致部分神经元的收敛甚至消失,降低ANN的多元性和可预测性。

其二,归一化有助于展现数据的特性。用softmax tanh sigmoid……的归一方式,会得到不同特性的数据,根据不同特性的数据,optimizer的方式也会不同,例如常说的稀疏性,从而会影响拟合度的问题


水平不够,让各位见笑了,贴别人的回答过来。

https://zhuanlan.zhihu.com/p/33173246

------------

思想对应的论文都写了,统一之处就是Batch Norm论文里写的,中间层的特征分布标准化之后训练起来更容易


推荐阅读:
相关文章