深度学习知识点复习:feature normalization和batch normalization

1 为什么要对input 做normalization:

input上的值差异非常巨大,导致模型训练的很慢,如左图所示,如果差异很小,训练很快,如右图

为了使得loss改变,不同的w的改变的幅度不一样,因此左图纵向上波动很短。右图因为w1和w2的波动对损失的影响差不多,因此是一个对称的圆形。

通常对左边情况的只有将lr 调低一点,使得w2 缓慢调整降低loss。

2 feature normalization

对于每个样本的所有特征,用特征值减去均值除与方差

3 为什么要做batch normalization 

是因为internal covariate shift的原因: 每层中各个维度的均值和方差不一样,分布不一样。可能训练出来的判别方程完全不同。可以调整lr 但是训练更慢。

和feature 的问题一样,因此要对每一层的output 做normalizattion

β和γ的参与:虽然normalization 将每一层的分布都限定在0和1 的区间,但是它们之间的差异还是存在的,通过 β和γ 将这种差异进一步缩小,γ 调节垂直方向上的放大和缩小,β调节水平方向上的移动。使其更加相似。β和γ 和w1,w2 是一样的,可以通过正向传递和反向传播来学习更新.β和γ主要解决internal covariate shift的问题。 均值和方差是根据z计算得到的,在任何一个瞬间是恒定的值,不会被训练。

引入β和γ的好处: 可以让分布伸缩和平移(rescale和 shift),具有灵活性,β和γ能够被训练。使得分布保持稳定。

4 预测时候的batch normalization

预测的时候可能是一个样本一个样本输入进来的,无法计算均值和方差,因此要从训练集中去取有代表性的均值和方差。将完整的训练集用训练好的模型跑一遍,记录每一层的均值和方差,留给test 使用。

问题: 训练集的数据很大,再跑一遍时间耗费很大,解决: 在训练的时候记录每一层的均值和方差。因为存在epoch,每一层都是epoch个均值和方差,因此不同epoch的acc 不同,要取它们的加权平均值。

5 batch normalization 的好处

可以解决 internal covariate shift 的问题,使得输出分布更统一,lr可以更大,训练更快;另外各个w会更均衡,避免梯度和权重过大或者过小,尤其是使用sigmoid 或tanh的时候;做weight 初始化的时候如果过大,batch normalization 可以来平衡

6 初始化可以加速训练:

zero initialization < random initialization < He  initialization

zero initialization  : 模型变成一个线性方程,学习能力大大减弱,难以学习非线性的东西

random initialization: mean=,variance=1,sacle=10,不能避免梯度爆炸和梯度消失,学习慢

He  initialization: 对random的scale 做进一步的限定。sacle=,n 为前一层神经元的个数,限制初始化的大小,避免梯度爆炸和梯度消失,可以将lr 增大,每一步训练可以更平滑。

参考:https://www.bilibili.com/video/av17231148?p=2

https://www.bilibili.com/video/av17203008?from=search&seid=13276136034066605744

猜你喜欢

转载自blog.csdn.net/qq_16236875/article/details/89152541