深度学习——BatchNormalization layer
神经网络在训练过程中往往会遇到一些问题:
问题1: 随着网络训练,浅层的权重发生变化,导致深层的输入变化很大。因此每层必须根据每批输入的不同分布重新调整其权重。这减缓了模型训练。如果我们可以使层的输入分布更相似,那么网络可以专注于学习类别之间的差异。不同批次分布的另一个影响是梯度弥散。梯度弥散是一个大问题,特别是对于S形**函数(sigmoid)。如果g(x)表示sigmoid**函数,随着 |x| 增加,g’(x)趋于0
问题2:当输入分布变化时,神经元输出也会变化。这导致神经元输出偶尔波动到S形函数的可饱和区域。在那里,神经元既不能更新自己的权重,也不能将梯度传递回先前的层。那么我们该如何保证神经元输出到不饱和区域?如果我们可以将神经元输出限制在零附近的区域,我们可以确保每个层在反向传播期间都会返回一个有效的梯度。这将减少训练时间和提高准确率。
使用批量规范(BN)作为解决方案批量标准化减轻了不同层输入对训练的影响。通过归一化神经元的输出,**函数将仅接收接近零的输入。这确保了梯度的有效回传,解决了第二个问题
批量归一化将层输出转换为单位高斯分布。当这些输出通过**功能馈送时,层**也将变得更加正常分布。
由于上一层的输出是下一层的输入,因此层输入的变化在不同批次输间的变化将显着减少。通过减少层的输入的变化分布,我们解决了第一个问题。
数学解释通过批量归一化,我们为每个**函数寻找均值为0,方差为1的分布作为输入。在训练期间,我们将**输入x减去批次均值μ以实现零中心分布。
接下来,我们取x并将其除以批处理方差和一个小数字,以防止除以零σ+ε。这可确保所有**输入分布方差为1。
最后,我们将得到的x进行线性变换。这样尽管在反向传播期间网络发生了变化,但仍能确保保持这种标准化效果。
在测试模型时,我们不使用当前批次均值或方差,因为这会破坏模型。相反,我们计算训练群体的移动均值和方差估计值。这些估计值是训练期间计算的所有批次平均值和方差的平均值。
批标准化的好处1.有助于减少具有可饱和非线性函数的网络中的消失梯度问题。通过批标准化,我们确保任何**函数的输入不会进入饱和区域。批量归一化将这些输入的分布转换为0-1高斯分布。
2.正则化模型Ioffe和Svegeddy提出了这一主张,但没有就此问题进行深入探讨。也许这是归一化层输入的结果?
3.允许更高的学习率通过防止在训练期间消失梯度的问题,我们可以设置更高的学习率。批量标准化还降低了对参数标度的依赖性。大的学习速率可以增加层参数的规模,这导致梯度在反向传播期间被回传时放大。