Batch Normalization

多次面试的面试题会问到这个概念,整理一下。

文章有的整理于****博客,有的知乎,有的自己理解,若有侵权,告知,删即可。

通俗一点讲:简称BN,即批规范化。
BN的使用位置是在每一层输出的**函数之前。
通过一定的规范化手段,把每层神经网络中任意神经元的输入值的分布强行拉回到接近均值为0方差为1的标准正太分布 。使得**输入值落在非线性函数对输入比较敏感的区域, 这样输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度

详解:

大家都知道,减均值->zscore->白化可以逐级提升随机初始化的权重对数据分割的有效性,还可以降低overfit的可能性。

如果在每一层的**函数之后,例如ReLU=max(Wx+b,0)之后,对数据进行归一化,文章中(《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》)说这样做在训练初期,分界面还在剧烈变化时,计算出的参数不稳定,所以退而求其次,在Wx+b之后进行归一化。因为初始的W是从标准高斯分布中采样得到的,而W中元素的数量远大于x,Wx+b每维的均值本身就接近0、方差接近1,所以在Wx+b后使用Batch Normalization能得到更稳定的结果。

文中使用了类似z-score的归一化方式:每一维度减去自身均值,再除以自身标准差,由于使用的是随机梯度下降法,这些均值和方差也只能在当前迭代的batch中计算,故作者给这个算法命名为Batch Normalization。(不同维度计算没意义)。

这里有一点需要注意,像卷积层这样具有权值共享的层,Wx+b的均值和方差是对整张map求得的。在batch_size * channel * height * width这么大的一层中,对总共batch_size*height*width个像素点统计得到一个均值和一个标准差,共得到channel组参数。

在Normalization完成后,Google的研究员仍对数值稳定性不放心,又加入了两个参数gamma和beta,使得

Batch Normalization

在模型中,这两个参数与每层的W和b一样,是需要迭代求解的。文章中举了个例子,在sigmoid**函数的中间部分,函数近似于一个线性函数,使用BN后会使归一化后的数据仅使用这一段线性的部分。

Batch Normalization

算法原理到这差不多就讲完了。具体的公式推导就不写了,有兴趣的读者可以自己推一下,主要用到了链式法则。