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

2022.5.8最近温习了一下BN,把更白话的一些想法记录下来。

 

Batch Normalization
带来的好处 更容易训练,对初始值更不敏感
但是这些是normalization带来的好处,不是batch带来了
事实上,batch带来了很多的坏处,最大的坏处就是他的均值和方差在训练的时候是在一个batch里面完成的,但是在test的时候,是需要估计的,带来了trainig和test的不一致性。注意啊,很多train和test时候表现不一致就跟这个BN有关系。

那么问题来了, 首先为什么test的时候是需要估计的,跟训练一样,用每个样本的平均不行吗?
不行啊,因为真正在Inference的时候不可能再根据样本算一遍mean/var啊,最好是一个固定的值

那用什么值呢?
最好是用一个大的dataset的平均值嘛,所以呢标准做法是在整个training dataset上去做一次mean/var的计算,最直接的方法就是在训练完成后,固定住model,然后在整个dataset里算一次mean/var

这样可行吗?当然了,这就是precise batchnorm, 事实上biggan里面就有用到这种方法,在G_ema算他的mean/var的时候
问题是什么?还要额外算一遍,计算量太大
为此,人们想出一种简单的方法,可以一边训练一边就得到mean/var, 怎么做呢?就是ema平均大法,每次训练的时候把mean/var保存下来,跟前一次的结果做平滑,这样就可以在训练完成的时候得到一个还不错的估计了

为什么说还不错呢?
因为这个ema肯定是有滞后的,咱们一般训练的时候训练的iteration足够多,到最后其实weigths都不变了,那么其实就相当于fix住model,然后算一个dataset上的mean/var,还是不错的

最后说一下BN的妙用
可以根据不同的数据集用不同的BN,比如咱们的INS input switcable network就是通过不同的BN层去用同一套参数适应Both high/low resolution的input的。
BN层是网络中跟数据集直接对应的东西。有的时候,一个Model要处理不同的input 源,可以就通过BN层去干这个事情,比如自动驾驶中白天和黑夜两种场景,比如SR中一个模型要能应用于各种不同退化原因的Input。

 

 

 

------------------------------------------------original blog-------------------------------------------------------------------------------

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

 

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

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

 

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

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

在pytorch中,我们的track_running_stats参数就是用来决定说这一个batch的统计值(方差和均值)需要不需要纳入整体数据库的统计值的,

BN的momentum也是用来做这个事情的,决定的是纳入的权重系数。训练完成后,我们的均值和方差就算好了,可以用于inference。

 

 

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

 

 

具体在使用的过程中,BN这一层呢,一般是加在非线性层之前,就是relu之类的之前。不过很多人表示,在实际操作中,他们发现BN在relu之后loss可以达到更小值。a lot of debate.....

对于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层和卷积层占用一样多的内存。

 

posted @ 2018-12-08 17:43  sunny,lee  阅读(623)  评论(0编辑  收藏  举报