几乎所有的主流神经网络都会使用批量归一化,虽然这个思想早已出现,但是这个层的出现没多久。同事想要做很深的神经网络时,这更是一个不可避免的层。
现存问题
- 正向计算时是从底部向后传播,但计算梯度时是反向传播,越往底层越有可能造成梯度消失。
- 损失出现在最后,后面的层训练较快
- 数据在最底部
- 底部的层训练较慢
- 底部层一变化,所有都得跟着变
- 最后的那些层需要重新学习多次
- 导致收敛变慢
- 我们可以在学习底部层的时候避免变
化顶部层吗?
核心思想
之所以后面的参数会随着前面的参数不停变得原因是方差和均值在不同的层之间在不停地变化,我们可以通过固定住分布来增加数值的稳定性
- 固定小批量里面的均值和方差
μB=1∣B∣∑i∈Bxi\mu_B=\frac{1}{|B|}\sum\limits_{i\in B}x_iμB=∣B∣1i∈B∑xiσB2=∑i∈B(xi−μB)2+ϵ\sigma_B^2=\sum\limits_{i\in B}(x_i-\mu_B)^2+\epsilonσB2=i∈B∑(xi−μB)2+ϵ
然后再作额外的调整(可学习的参数)
xi+1=γxi−μBσB+βx_{i+1}=\gamma\frac{x_i-\mu_B}{\sigma_B}+\betaxi+1=γσBxi−μB+β - 其中γ\gammaγ为方差,β\betaβ是均值,都是可学习的参数。作用是假设分布在某一均值和方差下不合适,就可以通过学习一个新的均值和方法,使得神经网络输出的分布更好,但也不能变化的太剧烈,因此往往限制这两个参数的范围。
批量归一化层
- 可学习的参数为γ\gammaγ和BBB
- 作用在
- 全连接层和卷积层输出上,激活函数前
- 全连接层和卷积层输入上
- 对全连接层,作用在特征维
- 对于卷积层,作用在通道维
批量归一化在做什么
- 最初论文是想用它来减少内部协变量转移
- 后续有论文指出它可能就是通过在每个小批量里加入噪音来控制模型复度(每个批量的数据都要减去均值,除以方差,相对于整体数据而言,它是极其不稳定的,因此可以看作噪音)
- 因此没必要跟丢弃法混合使用
总结
- 批量归一化固定小批量中的均值和方差,然
后学习出适合的偏移和缩放 - 可以加速收敛速度,但一般不改变模型精度