前言
Batch normalization 批次标准化
(训练技巧)
一、训练中遇到的问题
feature normalization
当error surface崎岖的时候,训练比较难,能不能移平error surface从而简化训练。
二、Batch normalization-training
当w1和w2斜率差很多的情况
假设一个model
当w1改变时L改变,当x1很小时,w1有一个变化时,对L的变化很小。当x2都很大时,w2有一个小变化时,L的变化都很大。就会产生不同方向斜率非常不同的error surface。
如果能给dimension同样的数值范围,就可以制造比较好的error surface,让training更好一点。
如何让不同的dimension,有接近的数值范围。有多种不同的方法,这些方法统称feature normalization。
其中一种方法是,把所有训练资料的特征向量集合起来,把所有向量中各个维度的数值集合起来,计算每个维度的平均值,将原来向量中的xi-i维度的平均值,再除以这个维度的标准差,这个过程叫做标准化。并将新生成的数值写回向量中。
做完这个过程后,这个维度上的平均值是0,差异是1。会让做梯度下降时,Loss收敛的更快。
在做接下来的计算时,但对于W2来说生成的zi和ai也是一种输入,如果zi不同维度之间的分布依然有很大的差异的话,在训练第二层W2时,也会出现困难。所以,也应该对zi或ai做feature normalization。对z做feature normalization或对a做feature normalization的结果差异不大。如果用sigmoid做feature normalization,对z做feature normalization好一点。
假设对z做feature normalization,
但是zi的均值和标准差都是根据z1,z2,z3算出来的。不做feature normalization的时候,改变z1,只会改变1。但是做了feature normalization之后,z1,z2,z3之间有关联了,改变z1时,2,3都会改变。这就会形成一个大的network,有很多输入,计算均值和标准差,输出一堆。当训练资料里面data太多时,丢到一个network,gpu的存储无法把所有都加载,那只会考虑一个batch里面的data。每次对一个batch里面的数据,算均值、标准差,算着一个batch的feature normalization。
做batch normalization的时候还会进行一个运算,算出后,进行如下操作
2.Batch normalization-testing
在testing时,有时候不是把所有测试资料一次性给你,这时你无法分为一个一个的batch,每次传进来并累计到一个batch在计算时不现实的(线上实时系统),而你使用Batch normalization的时候是一个一个batch的进行的,你算平均值和标准差是基于一个batch的。在pytorch中,他的处理方法是,在训练时,你每个batch算出来的平均值和标准差,都会去算moving average。
这个p也是要调的参数(0.1)。
用这个新的平均值和新的标准差,代替之前的。
总结
学习视频地址:https://www.bilibili.com/video/BV1zA411K7en/?p=13&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=3a369b537e1d34ff9ba8f8ab23afedec