Batch Normalization笔记
IID独立同分布假设
机器学习领域很重要的一个假设,就是假设训练数据和测试数据具有相同的分布,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
Covariate Shift
指的是训练集的数据分布和预测集的数据分布不一致。
这样的情况下如果我们在训练集上训练出一个分类器,肯定在预测集上不会取得比较好的效果。 这种训练集和预测集样本分布不一致的问题就叫做“covariate shift”现象。
Internal Covariate Shift(ICS)
定义:深度学习包含很多的隐层,在训练过程中,因为各层参数不停在变化,隐层的输入分布老是变来变去,可是它们所能“指示”的样本标记(label)仍然是不变的,所以每个隐层都会面临covariate shift的问题,这就是所谓的“Internal Covariate Shift”;
Internal指的是深层网络的隐层,是发生在网络内部的事情,covariate shift问题只发生在输入层。
ICS带来的问题:
简而言之,每个神经元的输入数据不再是“独立同分布”。
(1)上层参数需要不断适应新的输入数据分布,降低学习速度;
(2)下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止;
(3)每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
因为ICS问题的存在,只能选择较小的 Learning Rate ,非常谨慎地设置参数初始值。
既然ICS问题是由于各个隐层的输入不断变化造成,那么让输入在训练过程中保持一致不就可以了吗?即利用类似于Feature Scaling的手段,对各层之间的 activations 做标准化的处理。
BN就是基于这种思路,“强制性”地调整激活值的分布。
在介绍Batch Normalization之前,先来回忆下Feature Scaling。
Feature Scaling
定义:就是把各个特征的值通过计算数学期望和方差,进行一个缩放。
这个缩放有什么意义呢?
(1)假设有两个特征X1和X2,其数值不在一个数量级上;
(2)如果它们对于最终结果的影响权重是差不多的,那么在反向传播过程中,Loss对权重W1和W2的梯度有很大的差别,类似一个椭圆;
(3)这就导致训练过程变得比较困难:
(a)因为要找到最优解,我们在横/纵两个方向上要选择不同的学习率,实际上这样的设置比较困难;
(b)所以一般会倾向于选择一个较小的学习率,这就导致训练速度下降。
经过放缩之后的梯度就比较接近一个正圆,各个方向上的梯度差不多,就能够使用较大的学习率,从而加速训练。
Batch Normalization
Feature Scaling 是基于全量样本空间来做的;
Batch Normalization 的思路也很简单,基于当前的batch,计算mean和variance,对每一个Batch输入进行 Scaling 的操作。
具体过程如下:
1、将mini-batch的数据变换为均值为0,方差为1的数据;
2、接着对正规化后的数据用 γ 和 β 两个参数进行缩放和平移;
为什么要用γ 和 β 对变换后的数据进行缩放和平移?
这两个参数是相当于给模型一个自我调整 normalize 的旋钮;如果学出来 γ 等于 σ,β 等于 μ,就意味着可能我们的模型不需要 normalization;这个选择的权利交给神经网络自己。
算法流程如下:
(图片源自李宏毅Batch Normalization课件)
注意:
1、因为 mean 和 variance 是在 batch 中计算的,这对 batch size 就提出了一定要求,不能太小,否则这个 mean 和 variance 就没有什么意义;
2、在计算梯度的时候,μ 和 σ 事实上是对梯度有影响的,而不是一个常量。因为μ 和 σ是从当前批次的数据中计算得到的;γ 和 β是和样本无关的参数,是模型自己学到的;
3、可以把BN操作放在激活函数前面或后面,但是因为通过sigmoid之类的激活函数之后再算梯度可能会出现饱和,所以放在激活函数前面更好,这个后面再解释;
4、需要格外注意的是预测阶段的处理。在训练的时候,μ 和 σ 是从当前批次的训练数据计算得到的,但是在预测时,每次只有一个样本,按BN的算法流程处理之后每个隐层的输入就都为0了?其实很简单,在训练过程中记录下每个 Batch 的 mean 和 variance,预测的时候取平均就行,更合理的操作是加权求平均。
总结
主要总结下BN的优点,以及为什么BN可以。
1、加速模型训练
BN解决了ICS的问题,因为ICS问题的存在,我们的学习率必须设置的很小,现在可以使用更大的学习率,所以BN可以加速训练;
2、防止梯度消失
对于sigmoid这类饱和型激活函数,很容易出现梯度消失的问题,因为如果值落在很大或很小的地方,梯度值就会非常小。
但是如果加上BN,就可以确保激活函数的值都在0附近,都是斜率比较大的地方,也就不会出现梯度消失的问题。
3、不那么依赖权重初始值
例如,对初始化参数值都扩大N倍,那么当前层的输出值也会扩大N倍,但是进行归一化之后,等于什么都没发生。
4、起到了一定的正则化作用,防止过拟合
过拟合实质上是训练数据中的 noise 导致的,通过 Normalization 我们可以消除这个 nosie,从而起到一定的正则化作用。
Layer Normalization
BN的两个缺点:
1、batch size不能太小。当样本数很少时,样本的均值和方差便不能反映全局的统计分布息,但是在一些场景中,比如说硬件资源受限、在线学习等场景,BN是非常不适用的;
2、在NLP场景中不好用。通常各个样本的长度都是不同的,在RNN这样的时许模型中,当统计到比较靠后的时间片时,可能只有一个样本还有数据,基于这个样本的统计信息不能反映全局分布,这是BN效果并不好。
两个缺点的产生原因均是因为计算归一化统计量时计算的样本数太少。
LN的做法:根据样本的特征数做归一化。
LN是一个独立于batch size的算法,所以无论样本数多少都不会影响参与LN计算的数据量,从而解决BN的两个问题。
具体计算过程:
MLP中的LN。设
是一层中隐层节点的数量,
是MLP的层数,我们可以计算LN的归一化统计量
和
:
其中
是一个很小的小数,防止除0(论文中忽略了这个参数)。
在LN中同样也需要一组参数来保证归一化操作不会破坏之前的信息,在LN中这组参数叫做增益(gain)
和偏置(bias)
(等同于BN中的
和
)。假设激活函数为
,最终LN的输出为:
Group Normalization
是什么?
一句话概括,Group Normbalization(GN)是一种新的深度学习归一化方式,可以替代BN。
BN存在的问题
1、过小的batch size会导致其性能下降,但是对于一些其他深度学习任务batch size往往只有1-2,比如目标检测、图像分割、视频分类上,输入的图像数据很大,较大的batchsize显存吃不消;
2、预测阶段的BN中的均值和方差参数,一般都是训练的时候在训练集上通过滑动平均预先计算好,在预测的时候,直接取这些预先计算好值,但是,当训练数据和测试数据分布有差别是时,训练集上预计算好的数据并不能代表测试数据,这就导致在训练、验证、预测这三个阶段存在前后矛盾。
为了解决这两个问题,出现了Layer normalization,但是仍比不上Group Normalization。
下面用一张图说明几个主流的Normbalization技术之间的联系与区别。
(图片源自水印)
BN:在batch样本维度上做归一化,归一化维度为[N,H,W];
LN:根据样本的特征数做归一化,归一化的维度为[C,H,W];
IN:归一化的维度为[H,W];
GN:介于LN和IN之间,其首先将channel分为许多组(group),对每一组做归一化,及先将feature的维度由[N, C, H, W]reshape为[N, G,C//G , H, W],归一化的维度为[C//G , H, W]
GN的极端情况就是LN和I N,分别对应G等于C和G等于1。
说在最后
本文为个人在学习Batch Normalization技术过程中整理的笔记,强烈推荐大家去看李宏毅老师机器学习课程中的相关章节,讲得更加清楚透彻。

浙公网安备 33010602011771号