Batch normalization 起源于一个非常简单,已被证实有效的idea:对数据进行whitening preprocessing可以加快训练以及收敛。而BN就是把这个idea应用到网络中间,而不仅仅是网络的input端。
一般的,如果让我实现这个idea,我可能就把第M-1层的ouput归一化,然后传给M层。但是这样会有两个问题,1. 经过M层的linear变换之后/进行activation之前,这个数据的分布可能还是存在相当的internal covariant shift,从而导致sigmoid activate的时候集中在两端,造成梯度消失,如此又要normalize一回;2. 倘若完全normalize又有可能失去表达力,因为以前的那种分布才有可能携带足够信息。
由此,作者进行了如下improvement:1. 在activate之前进行normalize,对于一个batch size为m的batch,每个神经元都将得到m个数字,基于此进行normalize;2.normalize之后又进行linear transformation:X' = gamma * X + beta, 这两个参数由网络学习出来,让网络自己找到最佳的shift。
training没问题后inference有个小问题,infer的时候只有一个instance,无法normalize。solution很简单,计算全局mean与variance,代替之前train时compute的batch中的mean与variance。
以上。
网友评论