caffe中的batchNorm层
链接: http://blog.csdn.net/wfei101/article/details/78449680
caffe 中为什么bn层要和scale层一起使用
这个问题首先你要理解batchnormal是做什么的。它其实做了两件事。
1) 输入归一化 x_norm = (x-u)/std, 其中u和std是个累计计算的均值和方差。
2)y=alpha×x_norm + beta,对归一化后的x进行比例缩放和位移。其中alpha和beta是通过迭代学习的。
那么caffe中的bn层其实只做了第一件事。scale层做了第二件事。
这样你也就理解了scale层里为什么要设置bias_term=True,这个偏置就对应2)件事里的beta:
BatchNorm层优点:
caffe master branch采用的是分离式写法,conv层扔掉bias,接一个BN层,再接一个带bias的Scale层。(相当于数据标准化,减均值然后除标准差)
使用:在cnn 后增加,位于神经元非线性变换(relu)前,基本上大多数网络结构都能很自然地融合进去。
论文中将Batch Normalization的作用说得突破天际,好似一下解决了所有问题,下面就来列举一下:
(1) 可以使用更高的学习率。如果每层的scale不一致,实际上每层需要的学习率是不一样的,同一层不同维度的scale往往也需要不同大小的学习率,通常需要使用最小的那个学习率才能保证损失函数有效下降,Batch Normalization将每层、每维的scale保持一致,那么我们就可以直接使用较高的学习率进行优化。
(2) 移除或使用较低的dropout。 dropout是常用的防止overfitting的方法,而导致overfit的位置往往在数据边界处,如果初始化权重就已经落在数据内部,overfit现象就可以得到一定的缓解。论文中最后的模型分别使用10%、5%和0%的dropout训练模型,与之前的40%-50%相比,可以大大提高训练速度。
(3) 降低L2权重衰减系数。 还是一样的问题,边界处的局部最优往往有几维的权重(斜率)较大,使用L2衰减可以缓解这一问题,现在用了Batch Normalization,就可以把这个值降低了,论文中降低为原来的5倍。
(4) 取消Local Response Normalization层。 由于使用了一种Normalization,再使用LRN就显得没那么必要了。而且LRN实际上也没那么work。
(5) 减少图像扭曲的使用。 由于现在训练epoch数降低,所以要对输入数据少做一些扭曲,让神经网络多看看真实的数据。
总结;
优点:
1.加速训练
2.减小权重的值的尺度的影响
3.归一化所带来的噪声也有模型正则化的作用
缺点:
1.那就是在训练时,因为要对数据进行scale,所以有很多矩阵乘法,导致训练时间过长。
貌似所有的带来效果收益的操作都是噪声所带来的正则化的功劳,正则化是个啥概念?从几何上可以这样理解,NN其实就是在一个高维空间上构建了分类面,数据不变的情况下,这个分类面恰好贴合数据,完美fit训练集,而添加噪声后,相当于一些数据的位置不停的在变化,使得分类面发生了可包纳的数据量增加了,从而增加的泛化能力。说来说去好像是Data Augmentation的功劳