3.7批量归一化笔记(Datawhale X 李宏毅苹果书AI夏令营)

本节首先提出一个问题:如果误差表面很崎岖就比较难训练,能不能直接“把山铲平”,让它变得比较好训练呢?批量归一化就是其中一个“把山铲平”的方法。有时候误差表面是凸的,即一个碗的形状,两个参数对损失的斜率差别非常大。在w1这个方向上,斜率变化很小。在w2这个方向上,斜率变化很大。而这种情况是从什么地方来的呢?

对于一个简单的双输入单输出线性神经网络模型,其输入是x1和x2,对应的参数为w1和w2,它是一个线性的模型,没有激活函数。

ŷ=w1x1+w2x2+b

e=ŷ-y

L=∑e

对w1有一个小小的改变,加上Δw1,y会改变Δy,e会改变Δe,从而L也改变了ΔL。而什么时候w1的改变对L的影响很小呢?可能是输入的x1值很小,因此对L的影响就很小。反之,假设x2的值很大,那么L的变化就会很大,就会导致在w这个方向上做变化,我们把w改变一点点误差,表面就会有很大的变化。因此,我们给不同的维度同样的数值范围,这样就可以制造比较好的误差表面,让训练变得容易一点。有很多方法可以做到,这些方法统称为特征归一化。

以下所讲的方法只是特征归一化的一种可能性,即z值归一化。我们把不同特征向量统一维度里面的数值取出来,对于每个维度i计算其平均值mi和标准差σi,接下来我们就可以做一种归一化xri-m/σi,就是把某个数值x减掉这个维度算出来的平均值,再除以这个维度算出来的标准差得到新的数值。此时,所有维度的平均值都是0,方差是1,所有的数值都在0上下变动,可能就可以制造一个比较好的误差表面,在做梯度下降的时候损失收敛更快一点,训练更顺利。

我们将归一化后的特征丢到神经网络里面去做接下来的计算和训练。x经过W1得到z,z通过激活函数得到a1,接着进入W2。而对W2来说,a、z其实也是一种特征,因此,也需要对这些特征做归一化。如果激活函数选择sigmoid,比较推荐对z做特征归一化,而如果使用别的激活函数,可能对a归一化也会有好的结果。

如何对z做特征归一化?首先,计算z1,z2,z3的平均值,接下来计算标准差,最后,根据计算出的平均值和标准差进行归一化。

而在做完特征归一化以后,由于使用了平均值和标准差,三个样本会变得彼此关联,所以有做特征归一化的时候,可以把整个过程当做是网络的一部分。因此,一个量的改变会引起所有量的改变,可能会产生上百万笔数据,GPU的显存无法把整个数据集的数据都加载进去,因此,在实际实现的时候,我们只考虑一个批量里面的样本,只对一个批量里面的数据做归一化,所以技巧称为批量归一化。批量规划适用于批量大小比较大的时候,如果批量大小比较大,这个批量大小里的数据就足以表示整个数据集的分布。这个时候就不需要对整个数据集做特征规划,而改成只在一个批量上做特征规划作为近似。

然而,批量规划在测试的时候,根本就没有批量。假设系统上线做一个真正的线上的应用,比如批量大小设64,等64笔数据都进来才做一次运算,这显然是不行的。而没有批量就无法计算平均值和标准差。而Pytorch会帮助我们处理好。所以实际上的解法是,在训练的时候,每一个批量计算出的平均值和标准差都会拿出来算移动平均pμ+(1-p)μt来取代平均值进行更新,Pytorch里,p设0.1。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值