阅读本文前,可以先阅读上篇深度学习-DataPreprocessing,学习下Normalization相关内容。
BatchNormalization简介
batch normalization的是指在神经网络中激活函数的前面,将按照特征进行normalization,这样做的好处有三点:
1、提高梯度在网络中的流动。Normalization能够使特征全部缩放到[0,1],这样在反向传播时候的梯度都是在1左右,避免了梯度消失现象。
2、提升学习速率。归一化后的数据能够快速的达到收敛。
3、减少模型训练对初始化的依赖。
2、提升学习速率。归一化后的数据能够快速的达到收敛。
3、减少模型训练对初始化的依赖。
就像激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。
我们知道网络一旦训练起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为归一化了),后面网络每一层的输入数据分布一直是在变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。我们把网络中间层在训练过程中数据分布的改变称为:"Internal Covariate Shift"。Batch Normalization就是为了解决在训练过程中,中间层数据分布发生改变的情况。
这个时候我们可能就会想,如果在每一层输入的时候,再加个预处理操作那该有多好啊,比如网络第三层输入数据X3(X3表示网络第三层的输入数据)把它归一至:均值0、方差为1,然后再输入第三层计算,这样我们就可以解决前面提到的“Internal Covariate Shift”的问题了。
而事实上,paper的算法本质原理就是这样:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理,然后再进入网络的下一层。不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数的网络层。
TensorFlow中的Batch Normalization:
batch_normalization(
x,
mean,
variance,
offset,
scale,
variance_epsilon,
name=None
)
TensorFlow计算卷积神经网络某层的的mean和variance:
假定我们需要计算数据的形状是 [batchsize, height, width, kernels],熟悉CNN的都知道,这个在tensorflow中太常见了,例子 程序如下:
参考:
《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现
深度学习中 Batch Normalization为什么效果好