加速模型收敛神器——归一化(normalization)


进入到深度学习阶段,优化任务是一个非凸优化问题。模型收敛的稳定和速度是算法工程师不得不考虑的问题。归一化自提出后,就是该领域神器。本文将从归一化的思想,介绍常见的几种归一化,探究生效原理三部分来展开,最后是个人使用心得。

归一化思想

深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。Google将这一现象总结为Internal Covariate Shift。
这会导致几部分问题。其一,上层参数需要不断适应新的输入数据分布,降低学习速度。其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
因此,以 BN 为代表的 Normalization 方法退而求其次,进行了简化的白化操作。基本思想是:在将x送给神经元之前,先对其做平移和伸缩变换, 将x分布规范化成在固定区间范围的标准分布。
通用变换框架就如下所示:
加速模型收敛神器——归一化(normalization)μ是平移参数(shift parameter), θ是缩放参数(scale parameter)。通过这两个参数进行 shift 和 scale 变换,得到的数据符合均值为 0、方差为 1 的标准分布。b是再平移参数(re-shift parameter),g是再缩放参数(re-scale parameter)。将上一步得到的进一步变换,最终得到的数据符合均值为b 、标准差为g的分布。

常见归一化

Batch Normalization —— 纵向规范化

Batch Normalization 于2015年由 Google 提出,开 Normalization 之先河。其规范化针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元x的均值和方差,因而称为 Batch Normalization。
加速模型收敛神器——归一化(normalization)
按上图所示,相对于一层神经元的水平排列,BN 可以看做一种纵向的规范化。由于BN是针对单个维度定义的,因此标准公式中的计算均为element-wise的。
BN 独立地规范化每一个输入维度x,但规范化的参数是一个mini-batch的一阶统计量和二阶统计量。这就要求每一个mini-batch的统计量是整体统计量的近似估计,或者说每一个mini-batch彼此之间,以及和整体数据,都应该是近似同分布的。分布差距较小的 mini-batch 可以看做是为规范化操作和模型训练引入了噪声,可以增加模型的鲁棒性;但如果每个 mini-batch的原始分布差别很大,那么不同 mini-batch 的数据将会进行不一样的数据变换,这就增加了模型训练的难度。
因此,BN 比较适用的场景是:每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
另外,由于 BN 需要在运行过程中统计每个 mini-batch 的一阶统计量和二阶统计量,因此不适用于 动态的网络结构 和 RNN 网络。不过,也有研究者专门提出了适用于 RNN 的 BN 使用方法,这里先不展开了。

Layer Normalization —— 横向规范化

层规范化就是针对 BN 的上述不足而提出的。与 BN 不同,LN 是一种横向的规范化,如图所示。它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
加速模型收敛神器——归一化(normalization)
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免BN中受mini-batch数据分布影响的问题,可以用于小mini-batch场景、动态网络场景和RNN,特别是自然语言处理领域。此外,LN不需要保存mini-batch的均值和方差,节省了额外的存储空间。
但是,BN的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而LN对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。

Weight Normalization —— 参数规范化

前面我们讲的模型框架中,经过规范化之后的y作为输入送到下一个神经元,应用以w为参数的函数定义的变换。最普遍的变换是线性变换。BN 和 LN 均将规范化应用于输入的特征数据x ,而 WN 则另辟蹊径,将规范化应用于线性变换函数的权重w,这就是 WN 名称的来源。
加速模型收敛神器——归一化(normalization)
具体而言,WN 提出的方案是,将权重向量w分解为向量方向v和向量模g两部分:
其中v是与w同维度的向量,g是标量,决定了w的长度。因此这一权重分解的方式将权重向量的欧氏范数进行了固定,从而实现了正则化的效果。
回忆一下,BN 和 LN 是用输入的特征数据的方差对输入数据进行 scale,而 WN 则是用 神经元的权重的欧氏范式对输入数据进行 scale。虽然在原始方法中分别进行的是特征数据规范化和参数的规范化,但本质上都实现了对数据的规范化,只是用于 scale 的参数来源不同。
另外,我们看到这里的规范化只是对数据进行了 scale,而没有进行 shift,因为我们简单地令 [公式]. 但事实上,这里留下了与 BN 或者 LN 相结合的余地——那就是利用 BN 或者 LN 的方法来计算输入数据的均值μ。
WN 的规范化不直接使用输入数据的统计量,因此避免了BN过于依赖mini-batch的不足,以及LN每层唯一转换器的限制,同时也可以用于动态网络结构。

其他

Cosine Normalization —— 余弦规范化

selu —— 优化器实现normalization

Instance Normalization —— 图像单层归一化

Group Normalization —— 图像多层归一化

Switchable Normalization —— 自适应归一化

生效原理

我们以下面这个简化的神经网络为例来分析。

Normalization 的权重伸缩不变性

权重伸缩不变性(weight scale invariance)指的是,当权重w按照常量λ进行伸缩时,得到的规范化后的值保持不变。
上述规范化方法均有这一性质,这是因为,当权重w伸缩时,对应的均值和标准差均等比例伸缩,分子分母相抵。
权重伸缩不变性可以有效地提高反向传播的效率。
权重的伸缩变化不会影响反向梯度的Jacobian矩阵,因此也就对反向传播没有影响,避免了反向传播时因为权重过大或过小导致的梯度消失或梯度爆炸问题,从而加速了神经网络的训练。
权重伸缩不变性还具有参数正则化的效果,可以使用更高的学习率。
下层的权重值越大,其梯度就越小。这样,参数的变化就越稳定,相当于实现了参数正则化的效果,避免参数的大幅震荡,提高网络的泛化性能。

Normalization 的数据伸缩不变性

数据伸缩不变性(data scale invariance)指的是,当数据x按照常量λ进行伸缩时,得到的规范化后的值保持不变。
数据伸缩不变性仅对 BN、LN 和 CN 成立。因为这三者对输入数据进行规范化,因此当数据进行常量伸缩时,其均值和方差都会相应变化,分子分母互相抵消。而 WN 不具有这一性质。
数据伸缩不变性可以有效地减少梯度弥散,简化对学习率的选择。
每一层神经元的输出依赖于底下各层的计算结果。如果没有正则化,当下层输入发生伸缩变化时,经过层层传递,可能会导致数据发生剧烈的膨胀或者弥散,从而也导致了反向计算时的梯度爆炸或梯度弥散。
加入 Normalization 之后,不论底层的数据如何变化,对于某一层神经元而言,其输入永远保持标准的分布,这就使得高层的训练更加简单。从梯度的计算公式来看,数据的伸缩变化也不会影响到对该层的权重参数更新,使得训练过程更加鲁棒,简化了对学习率的选择。

参考资料:

  1. Batch Normalization,https://arxiv.org/pdf/1502.03167.pdf
  2. Layer Normalizaiton,https://arxiv.org/pdf/1607.06450v1.pdf
  3. Instance Normalization,https://arxiv.org/pdf/1607.08022.pdf
  4. Group Normalization,https://arxiv.org/pdf/1803.08494.pdf
  5. Switchable Normalization,https://arxiv.org/pdf/1806.10779.pdf
  6. https://zhuanlan.zhihu.com/p/33173246