Batch Normalization

深度神经网络难训练一个重要的缘由就是深度神经网络涉及不少层的叠加,每一层的参数变化都会致使下一层输入数据分布的变化,随着层数的增长,高层输入数据分布变化会很是剧烈,这就使得高层须要不断适应低层的参数更新。为了训练好模型,咱们须要谨慎初始化网络权重,调整学习率等。网络

原理分析

为了解决这个问题,一个比较直接的想法就是对每层输入数据都进行标准化。Batch Normalization确实就是这样作的。Batch Normalization的基本思想就是:将每一批次数据输入下一层神经元以前,先对其作平移和伸缩变换,将输入数据的分布规范为固定区间范围内的标准分布。Batch Normalization的公式表示以下:函数

 

这时咱们可能会有些疑问,第一步不是已经获得标准化分布了吗,为何还要再使用第二步变回去呢? 性能

答案是:为了保证模型的表达能力,第二步是必不可少的学习

咱们发现,第一步将每一层的输入数据都规范化为均值为0,标准差为1的分布。那么咱们仔细想一下,这样作会带来什么问题?orm

每一层神经元都在不断的学习,可是不管其如何努力(参数如何变化),其输出的结果在交给下一层神经元以前都会被强制规范化到均值为0,标准差为1的分布。那咱们还学个鬼啊!这样训练出来的神经网络模型表达能力天然不好。blog

因此,咱们须要使用第二步将规范化后的数据再平移缩放到均值为$\beta $,标准差为$\gamma $的分布,充分考虑每一层神经元的学习结果。固然,这两个参数是可学习的,每一层的和会有所不一样。io

总结

训练快,还能提高性能,为啥不用。TensorFlow、Keras和Pytorch都集成了Batch Normalization的函数,可直接调用。原理

相关文章
相关标签/搜索