阅读论文:1502.InceptionV2-BN
参考:
论文地址:https://arxiv.org/pdf/1502.03167.pdf
详细说明:http://blog.****.net/hjimce/article/details/50866313
理解:http://blog.****.net/shuzfan/article/details/50723877
效果为什么好:https://www.zhihu.com/question/38102762
https://github.com/BVLC/caffe/blob/master/include/caffe/layers/batch_norm_layer.hpp
序言:
在以往的网络训练中,对于参数的初始化和训练速率都必须小心谨慎的选择,这导致网络的训练十分困难并且缓慢。究其原因,论文认为是网络中不同层的输出会相互影响,某一层输出变量分布的改变,会导致之后网络不断调整适应。因此文章希望能够固定每一层输出的分布之后,再送入**函数,这样没一层网络不用去调整适应不同分布的输入,便可以加快训练效率。
传统的白化方法也提出了类似的思想,但是其没有对白化层做后向传播。因此论文提出后向传播时需要对单一训练样本和样本集求导。为了简化算法使之能够应用,论文只对每一维的变量进行nomalization,并且是在一个mini-batch中。为了防止归一化破坏数据原始的分布,又设置了额外一组可训练的参数使之确保有能够恢复原分布的能力(但未必一定恢复)。在inference时,将之前所有mini-batch数据的均值和方差采样,将bn层参数固定,这样达到了一个全局归一化的效果,具体公式参见论文。
BN层的提出具有非常大的影响力,目前绝大多数网络都会使用BN层,其提升的训练效率是非常明显的.但其背后的原理,还有待进一步探讨。
BN可以看做对输入样本的一种约束,最大作用是加速收敛,减少模型对dropout,careful weight initialnization依赖,可以adopt higher learning rate的优势,收敛速度可以提高10倍以上。网络可以采用具有非线性饱和特性的**函数(比如:s型**函数),因为它可以避免网络陷入饱和状态。基于整个训练集的白化是非常耗时的,因为白化需要计算 x 的协方差矩阵及白化部分,还需计算BP算法中的求导。但是基于某个或者部分样本进行规范化又会changes the representation ability of a network所以本文在minibatch内归一化,再用可以学习的 γ 和 β 来拟合minibatch的统计量与整个训练集统计量之间的关系。
1.使用BN,把网络中各层输入 x 变为 BN(x)即可。可以使用SGD及其各种变种训练。
2.训练时候在minibatch内规范化非常高效,但是推断时就不需要而且不应该这样了。推断是我们希望输出只取决于输入,所以规范化中的期望、方差用全部数据计算
论文信息:
深层网络训练时,由于模型参数在不断修改,所以各层的输入的概率分布在不断变化,这使得我们必须使用较小的学习率及较好的权重初值,导致训练很慢,同时也导致使 saturating nonlinearities **函数(如sigmoid,正负两边都会饱和)时训练很困难。
这种现象加 internal covariate shift ,解决办法是:对每层的输入进行归一化。
引言:
因为神经网络本质学习的就是数据分布(representation learning),如果数据分布变化了,神经网络又不得不学习新的分布。为保证网络参数训练的稳定性和收敛性,往往需要选择比较小的学习速率(learning rate),同时参数初始化的好坏也明显影响训练出的模型精度,特别是在训练具有饱和非线性(死区特性)的网络,比如即采用S或双S**函数网络,比如LSTM,GRU。解决办法:引入Batch Normalization,作为深度网络模型的一个层,每次先对input数据进行归一化,再送入神经网络输入层。
当一个学习系统的输入分布是变化的时,即训练集的样本分布和测试集的样本分布不一致,训练的模型就很难有较好的泛化能力,这叫做 covariate shift (Shimodaira, 2000),解决办法是domain adaptation (Jiang, 2008).和迁移学习。BN想把输入的均值方差规范化,使输入分布一致,但是仅均值、方差一样的分布就一定一样吗?但是思路是这样,而且效果好。注意Sigmoid 函数的特性,当输入不集中在 0 附近时(饱和时),梯度会非常小,训练会很慢。然而,输入x受前面层的参数的影响,这些参数的变化很可能导致x过早变化到sigmoid函数的饱和区域,收敛减慢。这种影响随着深度增加而加大。ReLU和好的初值、更小的学习率可以解决梯度消失的问题。但是,要是我们能让输入更稳定,就不太可能 get stuck in the saturated regime,训练也会加快。
BN作用:当深度网络层次太多后,信号和梯度越来越小,深层难以训练。被称作梯度弥散,也有可能越来越大,又被称作梯度爆炸。batch normalization,可以把过大或过小的信号进行归一化。有效避免上述问题,使得深度学习网络更容易训练。所以效果好。减少梯度对参数大小或初始值的依赖,使网络在使用较大学习速率训练网络参数时,也不会出现参数发散的情况。过高的学习速率会导致梯度爆炸或梯度消失,或者陷入局部极小值,BN可以帮助处理这个问题:通过把梯度映射到一个值大但次优的变化位置来阻止梯度过小变化:比如,阻止训练陷入饱和死区。BN使参数在训练时更加灵活。过大的学习速率会增加参数的规模,导致反向传播时发生梯度爆炸。BN中,反向传播时不会受梯度规模影响。权重越大,梯度越小,BN时参数变化更稳定。可以推测,当输入样本X服从高斯分布且输入元素之间相互独立时,BN可以使层参数的Jacobian拥有接近于1的单值,能够完整保留梯度的值在反向传播时不衰减。
论文中将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数降低,所以要对输入数据少做一些扭曲,让神经网络多看看真实的数据。
说完BN的优势,自然可以知道什么时候用BN比较好。例如,在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。
BN网络的训练和推断:
按照BN方法,输入数据x会经过变化得到BN(x),然后可以通过随机梯度下降进行训练,标准化是在mini-batch上所以是非常高效的。 但是对于推断我们希望输出只取决于输入,而对于输入只有一个实例数据,无法得到mini-batch的其他实例,就无法求对应的均值和方差了。 可以通过从所有训练实例中获得的统计量来代替mini-batch中m个训练实例获得统计量均值和方差 我们对每个mini-batch做标准化,可以对记住每个mini-batch的B,然后得到全局统计量
关于 Weight Normalization和Batch Normalization的比较: