参考网址:点击打开链接
一、为什么要使用BatchNormalization?
在深度网络的训练过程中,只要网络的前几层发生微小的变化,就会在后面网络的累积放大下去。一旦网络的某一层的输入数据的分布发生了变化,那么这层网络就需要去适应这个新的数据分布,所以训练过程中,如果训练数据一直在发生改变的话,就会使网络的训练速度很慢。为了解决这个问题就可以使用BatchNormalization算法。
二、BatchNormalization是怎么做的?
首先对应的是一种归一化处理,将数据变化为均值为0,标准差为1的数据。即减去平均值,除以标准差。
只是归一化存在一定的问题,当你进行归一化处理后,数据的差距会减小,导致在使用S型激活函数的时候,会让本来处于两侧的数据都跑到了中间部分,这样提取出来的特征就变弱、或者消失了。所以又引入一个变换重构的方式
参数γ和β是可学习参数
这样当、的时候,就会恢复到原来的特征。
最终有
有一个问题:先进行正则,又变回去,那不是等于没变么?
不会。因为,再变换引入的两个新参数 g 和 b,可以表示旧参数作为输入的同一族函数,但是新参数有不同的学习动态。在旧参数中, 的均值取决于下层神经网络的复杂关联;但在新参数中, 仅由 来确定,去除了与下层计算的密切耦合。新参数很容易通过梯度下降来学习,简化了神经网络的训练。