BN原理、可训练参数、训练预测的时候分别怎么做
出处:
《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
IID假设:
独⽴同分布假设:训练数据和测试数据的分布相同是训练的模型能够在测试集上获得好效果的保障
⽽BN就是使得在训练过程中每⼀层的输⼊都保持相同的分布
再者,随着⽹络的加深,训练变得更加困难,收敛越来越慢,⽽BN、ReLU、残差结构本质上都是为了解决这个问题的
ICS
从论⽂名字看BN只要是为了解决ICS问题,Internal Covariate Shift
Covariate Shift的概念:如果ML系统实例集合<X,Y>中的输⼊值X的分布⽼是变,这不符合IID假设,⽹络模型很难稳定的学规律
在训练过程中,隐层的输⼊分布⽼是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层⽹络的隐层,是发⽣在⽹络内部的事情,⽽不是covariate shift问题只发⽣在输⼊层。
eval是做什么的BN本质
因为深层神经⽹络在做⾮线性变换前的激活输⼊值随着⽹络深度加深或者在训练过程中,其分布逐渐发⽣偏移或者变动,之所以训练收敛慢,⼀般是整体分布逐渐往⾮线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输⼊值WU+B是⼤的负值或正值),所以这导致反向传播时低层神经⽹络的梯度消失,这是训练深层神经⽹络收敛越来越慢的本质原因
BN的本质是对于每个隐层神经元,把逐渐向⾮线性函数映射后向取值区间极限饱和区靠拢的输⼊分布强制拉回到均值为0⽅差为1的⽐较标准的正态分布,使得⾮线性变换函数的输⼊值落⼊对输⼊⽐较敏感的区域,以此避免梯度消失问题。
因为梯度能保持⽐较⼤的状态,所以对神经⽹络的参数调整效率⽐较⾼,也就是说收敛地快,经过BN后,⽬前⼤部分Activation的值落⼊⾮线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
训练中的BN
对于Mini-batch SGD来说,这⾥x指的是W*input+b,变换公式是:
变换后某个神经元的激活x形成了均值为0,⽅差为1的正态分布,⽬的是把值往后续要进⾏的⾮线性变换的线性区拉动,增⼤导数值,增强反向传播信息流动性,加快训练收敛速度。但是这样会导致⽹络表达能⼒下降
所以,增加两个学习来的参数,⽤来对变换后的激活反变换,使得⽹络表达能⼒增强
在训练过程中,只能计算当前batch样本上的mean和var。但是我们做的normalization是对于整个输⼊样本空间,因此需要对每
个batch的mean, var做指数加权平均来将batch上的mean和var近似成整个样本空间上的mean和var.
训练过程
测试时的操作
在训练结束后,⽹络的mean和std就固定住了,对于pytorch,执⾏model.eval()
因为测试时计算batch的均值⽅差不适合(单样本的时候),因此会直接拿训练过程中对整个样本空间估算的mean和var直接来⽤。
BN的优点,为什么有效?
不仅仅极⼤提升了训练速度,收敛过程⼤⼤加快;
还能增加分类效果,⼀种解释是这是类似于Dropout的⼀种防⽌过拟合的正则化表达⽅式,所以不⽤Dropout也能达到相当的效果;
另外调参过程也简单多了,对于初始化要求没那么⾼,⽽且可以使⽤⼤的学习率等
《How Does Batch Normalization Help Optimization?》中的结论:
BN可以防⽌梯度爆炸或弥散、可以提⾼训练时模型对于不同超参(学习率、初始化)的鲁棒性、可以让⼤部分的激活函数能够远离其饱和区域
BN能够work的真正原因在于BN重新改变了优化问题,使得优化空间变得⾮常平滑。
很多normalization的⽅法都可以达到BN的效果,甚⾄更好
BN与过拟合
BN并不能阻⽌过拟合,在某些情况下可以抑制
BN的本意是为了加速训练和收敛过程,⽽不是过拟合
在训练中,BN的使⽤使得⼀个mini-batch中的所有样本都被关联在了⼀起,⼀个batch数据中每张图⽚对应的输出都受到⼀个batch所有数据影响,这样相当于⼀个间接的数据增强,达到防⽌过拟合作⽤.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论