batch normalization 批归一化 --- 一个硬币的两面

本文主要是对BN(batch normalization)这篇论文的摘录,加上一些其他论文,辅助理解。

批归一化是在Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 这篇论文中提出的,主要的思想就是要将每一个隐藏神经元的输入变成是一个均值为0,方差为1的分布,便于加快training过程。

----------------------------------作者这么说----------------------------------------------------------------
具体实施是这样的

对于每一次的mini-batch会去算一波均值和方差,当然,这些x是针对一个神经元的输入了

在推断的过程中,也要做归一化,因为推断的时候只有一个样本输入,方差和均值的计算其实是之前的若干个mini-batch的均值和方差的平均

这个地方需要注意的一点是,方差采用的是无偏估计,对每一个mini-batch,计算出来的方差用的是下面这个式子。不明白的是为什么这个地方采用无偏估计,而之前不采用呢,估计是为了引入noise,有一个类似drop out的作用?

 

具体在使用的过程中,BN这一层呢,一般是加在非线性层之前,就是relu之类的之前。

对于CNN网络来说,BN是一个feature map共用一个gamma和beta,因为默认不光是一个神经元的输入应该满足同一个分布,而是同一个feature map的都应该满足,所以如果feature map是q*p的大小,对于大小为m的mini-batch而言,其实是计算m*p*q的整个的均值和方差,而不是像之前只要计算m个input值的。

--------------------------------------------其他论文这么说-------------------------------------------------------------

 下面看到的这个段落来自super resolution中著名的网络EDSR论文,在这篇论文中,作者没有用到BN,他们的说法是因为BN层会让特征被归一化,从而降低变化范围的自由度。他们的实验证明了去掉BN层会让图像细节部分表现更好。并且,他们表示,去掉了BN层之后,GPU的内存使用也被极大地减小了,因为BN层和卷积层占用一样多的内存。

猜你喜欢

转载自www.cnblogs.com/sunny-li/p/10088472.html