(深度学习)Batch

it2022-05-05  150

Batch_normalization是什么?

传统的神经网络,只是在将样本x进入到输入层之前对x进行0-1标准化处理(减均值,除标准差),以降低样本间的差异性,如下图所示:

BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化,如下图所示: 加了一个batch_normalization层后,输入x首先乘以权重加上偏置得到s1,对s1进行归一化后,再进行伸缩和平移,控制伸缩和平移的参数是网络自己学习的,之后再采用激活函数。

为什么要用Batch_normalization?

训练过程中,各层输入的分布随着前面几层参数的变化而变化,使得训练深度神经网络变得复杂。这通过较低的学习速率,和仔细的参数初始化来减慢训练,使得训练具有饱和非线性的模型变得非常困难。们将这种现象称为 internal covariate shift。 在train网络之前,会对数据进行归一化处理,为的是保持训练和测试数据的分布相同,而在神经网络内部,每一层我们都需要有输出和输出,除了对原始数据的标准化处理,在经过网络每一层计算后的数据,它们的分布是不同的。网络的训练,需要去学习适应不同的数据分布,造成的后果就是收敛慢,效果不佳。 另一方面,网络前面的参数变更,会随着网络的深度,其影响不断累积增大,所以说只要有某一层的数据分布发生变化,后面层的数据输入分布也会不同,结合前面说的,为了解决中间层数据分布改变的情况。 换一个角度来说,一般来说,如果模型的输入特征不相关且满足标准正态分布时,模型的表现一般较好。在训练神经网络模型时,我们可以事先将特征去相关并使得它们满足一个比较好的分布,这样,模型的第一层网络一般都会有一个比较好的输入特征,但是随着模型的层数加深,网络的非线性变换使得每一层的结果变得相关了,且不再满足分布。甚至,这些隐藏层的特征分布或许已经发生了偏移

为什么归一化后还要伸缩和平移?

如果只是简单的进行归一化,则会改变网络层学习到的分布,加入可学习的伸缩和平移参数,可以让网络在对输入找到一个在正态分布后不破坏原特征分布的平衡。

参考链接:https://www.jianshu.com/p/86530a0a3935 https://www.jianshu.com/p/94f7985a957d


最新回复(0)