Batch Normalization
出自论文:
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- Introduction
随机梯度下降法(SGD)在很多模型上都取得了很不错的效果,尤其是结合了mini-batch之后,一方面计算效率更高,另一方面梯度估计的更加准确。然而,SGD对模型的超参数十分敏感,尤其是学习率。
此外,还有一个问题,也就是模型的不同层的输入会随着网络的递进而变化
The change in the distributions of layers’ input presents a problem because the layers need to continuously adapt to the new distribution
这也就是我们传说中的covariate shift
2. batch-normalization
直接上公式:
从公式来看,整个BN相当于对一个batch中的数据做白化处理,然后再加上一个缩放系数和偏置。至于为什么要加这个,后面会讲,这里只要明白,这样,我们就把原本的数据缩放到了(-1,1)之间,然后通过一个缩放和平移的系数进行调整。这里的
3. 为什么管用
3.1 为什么白化管用
从下图的一个二维分布来看,最主要的原因是我们不知道原有神经网络的偏置b应该如何初始化,这个很关键
当我们的样本分布在第一象限,可是大部分情况下,我们初始化的x都是在零点,所以,如果要区分这一堆点,b的修改就会相当费劲。那么,当我们对样本做一个白化处理之后,整个样本的分布就在坐标零点周围,这样我们权值的修改就会轻松很多。这也就是这篇文章中,accelerating的来源。
3.2 为什么要缩放和平移
首先,我们通过白化获得了一个(-1,1)之间分布的样本,通过**函数之后,就可以得到新的中间层。然而在**函数中,尤其是sigmoid
我们可以很明显的看到,在(-1,1)之间,整个函数都处于线性状态,这就失去了**函数本身的意义。因此,这里文章中加入了缩放系数
4.总结
batch-normalization是一个非常好用的东西