BN (Batch Normlization) 批归一化

BN,Batch Normalization, 属于Normalization中的一种归一化方式,所以在介绍BN之前,首先了解一下Normalization.

1. 为什么需要 Normalization
在机器学习领域中,通常假设数据具有“独立同分布”的特性,这样可以简化常规机器学习模型的训练、提升机器学习模型的预测能力。

具体为什么要求“独立同分布”,也附上相关解释:

关于独立同分布,西瓜书这样解释道:

输入空间中的所有样本服从一个隐含未知的分布,训练数据所有样本都是独立地从这个分布上采样而得。

**好了,那为啥非要有这个假设呢?

我们知道,机器学习就是利用当前获取到的信息(或数据)进行训练学习,用以对未来的数据进行预测、模拟。所以都是建立在历史数据之上,采用模型去拟合未来的数据。因此需要我们使用的历史数据具有总体的代表性。

** 为什么要有总体代表性?
我们要从已有的数据(经验) 中总结出规律来对未知数据做决策,如果获取训练数据是不具有总体代表性的,就是特例的情况,那规律就会总结得不好或是错误,因为这些规律是由个例推算的,不具有推广的效果。

通过独立同分布的假设,就可以大大减小训练样本中个例的情形。

机器学习并不总是要求数据同分布。在不少问题中要求样本(数据)采样自同一个分布是因为希望用训练数据集训练得到的模型可以合理用于测试集,使用同分布假设能够使得这个做法解释得通。

因此,在把数据喂给机器学习模型之前,“白化(whitening)”是一个重要的数据预处理步骤。白化一般包含两个目的:

(1)去除特征之间的相关性 —> 独立;

(2)使得所有特征具有相同的均值和方差 —> 同分布。

白化最典型的方法就是PCA,本文不再展开。

2. 深度神经网络会破坏这种“独立同分布”的假设吗?

答案是肯定的。 神经网络模型在训练的过程中会出现“ Internal Covariate Shift”的现象,这种现象就是分布不一致假设下的一个分支问题,即:ICS破坏了 “独立同分布” 。至于什么是“ Internal Covariate Shift”,看下面的解释:

我们都知道,深度神经网络模型的训练之所以很困难,其中一个重要的原因是:
深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。

Google 将这一现象总结为 Internal Covariate Shift,简称 ICS.
大家细想便会发现:的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了
covariate shift 的定义。由于是对层间信号的分析,也即是 “internal”的来由。

3. ICS 破坏了“独立同分布”,会导致什么问题 ?

简而言之,就是说:每个神经元的输入数据不再是“独立同分布”。

其一,上层参数需要不断适应新的输入数据分布,降低学习速度。【收敛很慢】

其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。【反向传播时造成梯度弥散】

其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。【需要小心设置参数】

4. 如何解决ICS 【引入BN】

Google说引入BN可以解决ICS问题,实质上是将其作用enlarge了: 仅仅“通过mini-batch来规范化某些层/所有层的输入,从而可以固定每层输入信号的均值与方差”就可以解决问题。如果covariate shift可以用这么简单的方法解决,那前人对其的研究也真真是白做了。

那BN到底是什么原理呢?说到底还是为了防止“梯度弥散”。【我们知道这一点就可以了】

从数学角度解释: 引入BN可以解决ICS带来的梯度弥散问题

要解决独立同分布的问题,“理论正确”的方法就是对每一层的数据都进行白化操作。然而标准的白化操作代价高昂,特别是我们还希望白化操作是可微的,保证白化操作可以通过反向传播来更新梯度。

因此,以 BN 为代表的 Normalization 方法退而求其次,进行了简化的白化操作。基本思想是:在将 x 送给神经元之前,先对其做平移和伸缩变换, 将 x 的分布规范化成在固定区间范围的标准分布。
具体公式是这样的:
BN (Batch Normlization) 批归一化
将其简化一下:就是做了两次平移和缩放
BN (Batch Normlization) 批归一化

(1) μ 是平移参数(shift parameter), σ 是缩放参数(scale parameter)。通过这两个参数进行 shift 和 scale 变换,得到的数据符合均值为 0、方差为 1 的标准分布。
BN (Batch Normlization) 批归一化
2)b 是再平移参数(re-shift parameter),b 是再缩放参数(re-scale parameter)。将 上一步得到的x^ 进一步变换,最终得到的数据符合均值为 b 、方差为 g^2 的分布.
BN (Batch Normlization) 批归一化

5. 容易有疑惑的两个点

1.为什么要进行最后一步的变换重构?
2.变过去又变回来,那不跟没变一样吗?

1. 说好的处理 ICS,第一步都已经得到了标准分布,第二步怎么又给变走了?

答案是——为了保证模型的表达能力不因为规范化而下降。

我们可以看到,第一步的变换将输入数据限制到了一个全局统一的确定范围(均值为 0、方差为 1)。下层神经元可能很努力地在学习,但不论其如何变化,其输出的结果在交给上层神经元进行处理之前,将被粗暴地重新调整到这一固定范围。

沮不沮丧?沮不沮丧?
难道我们底层神经元人民就在做无用功吗?

所以,为了尊重底层神经网络的学习结果,我们将规范化后的数据进行再平移和再缩放,使得每个神经元对应的输入范围是针对该神经元量身定制的一个确定范围(均值为 b 、方差为 g^2 )。rescale 和 reshift 的参数都是可学习的,这就使得 Normalization 层可以学习如何去尊重底层的学习结果。

除了充分利用底层学习的能力,另一方面的重要意义在于保证获得非线性的表达能力。Sigmoid 等**函数在神经网络中有着重要作用,通过区分饱和区和非饱和区,使得神经网络的数据变换具有了非线性计算能力。而第一步的规范化会将几乎所有数据映射到**函数的非饱和区(线性区),仅利用到了线性变化能力,从而降低了神经网络的表达能力。而进行再变换,则可以将数据从线性区变换到非线性区,恢复模型的表达能力。

另一种解释:来源于知乎魏秀参

最后的“scale and shift”操作: 则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入
从而保证整个network的capacity。(有关capacity的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)

2. 经过这么的变回来再变过去,会不会跟没变一样?

不会, 因为,再变换引入了两个新参数 g 和 b。在旧参数中, x 的均值取决于下层神经网络的复杂关联;但在新参数中,均值仅仅由 b 来确定,去除了与下层计算的密切耦合。新参数可以通过梯度下降来学习,简化了神经网络的训练。