Batch Normalization
多次面试的面试题会问到这个概念,整理一下。
文章有的整理于****博客,有的知乎,有的自己理解,若有侵权,告知,删即可。
详解:
大家都知道,减均值->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,使得
算法原理到这差不多就讲完了。具体的公式推导就不写了,有兴趣的读者可以自己推一下,主要用到了链式法则。