深度学习中的Batch Normalization
Batch Normalization
假设我们有两组training data:
当我们利用这组数据进行机器学习的时候,会发现对于第一笔数据,它的梯度会比第二笔数据的梯度要小得多,这时候的训练的收敛过程大致可以由下图表现出来。
两个权重跨度范围不一样,如果使用相同的学习率,则在的学习过程会非常慢,可能都收敛了,而还没有完成学习过程。
那如果我们对输入进行调整,使它们的分布大致相同的话,它们的收敛速度就会变得一致,收敛过程大概如下图:
这个时候两个权重的收敛速度大致可以趋于一致。
上面介绍的这种将数据分布相似化的过程暂且称为数据的规整化,它的做法其实很简单就是将输入数据减去数据的均值然后除掉数据的标准差,保证均值为0,标准差为1
其中,i指的是向量的第i维,指向量第i维的均值,表示第i维的标准差
当然上面介绍只是训练样本的规整,那在神经网络中的规整又该如何进行呢?
神经网络中的Batch Normalization是将每一层网络中**函数之前的输入看作是输入数据,我们要规整的就是这一部分数据,做法和我们刚才提到的一样,将数据减掉均值然后除掉标准差,总结来说就是下面的图片:
现在我们已经解释清楚了神经网络中数据规整的做法,那我们在这种情况下,训练网络时候,如何去更新参数呢?
是否能把我们这里的直接当作一个常数保证下面的式子成立呢:
想一想,貌似是不能的,因为由于前面神经网络的影响,导致网络内部的输入输出会随着参数的更新变化巨大,也会导致我们这里的变化巨大,所以不能简单地将这里的均值和标准差当作一个定值。
所以我们在做梯度递减的时候需要考虑的变化
求偏导的时候运用上面的式子进行求导。
现在还有一个问题,我们的测试数据输入到网络,如何去求解测试数据的,因为测试的时候是单笔数据,和无从谈起
我们理想的解决办法是,找一个能反应样本整体的,但是我们神经网络中每一层的输入输出都千差万别,很难找到每一层合适的,所以我们的做法是,在训练的时候保存下来每一层,测试网络的时候,将的均值作为测试数据的。