首页 > 学院 > 开发设计 > 正文

Batch Normalization

2019-11-06 09:18:03
字体:
来源:转载
供稿:网友

参考博客: 深度学习(二十九)Batch Normalization 学习笔记 谈谈Tensorflow的Batch Normalization 数据处理中白化Whitening的作用图解分析

原论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

归一化后有什么好处呢?

神经网络学习过程本质就是为了学习数据分布,如果训练数据与测试数据的分布不同,那么预训练好的网络无法在测试数据上很好地泛化。很大可能,每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。网络训练过程中,参数会发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的。前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:Internal Covariate Shift。Paper所提出的算法,就是要解决Internal Covariate Shift问题。

白化预处理(whitening)

白化的作用:(1)接触数据之间的相关性。(2)使得数据拥有同一个方差,即为1。白色向量:若一零均值的随机向量Z=(Z1,Z2,….Zm),满足E{Z*Z’}=I,I为单位矩阵,我们称这个向量为白色向量。通常,先对数据进行归一化再进行PCA,最终得到白化后的数据。

Batch Normalization

(1)训练阶段

归一化(零均值,方差为1) 归一化

重构(保持数据值的范围不变,不损失信息) 重构

其中 γ 和 β 是可学习的参数,每一个神经元有一对这样的参数。所以整个BN层就是在做以下的运算: BN层运算

这个运算中的输入 x 是logits(即激活函数的输入)。

(2)测试阶段

模型训练好以后,参数固定不变,那么对于每一个输入的测试样本来说,归一化所用的均值 E 和方差 Var 都应该固定不变。所以,用训练阶段的批的均值的均值和方差的无偏估计来计算: 测试阶段均值和方差估计 重构输出: 测试阶段重构输出

(3)注意事项

原来神经元的偏置bias在增加了BN层以后就不再需要了。BN有一个作用就是可以使得激活函数的作用范围更大,所以在激活函数前操作。

在CNN中应用BN

脑补一下卷积神经网络计算的过程,就知道一张特征图会有几十乘几十个神经元。由于是共享权值,所以可以求取所有样本所对应的一个特定特征图所有神经元的平均值、方差,然后对这个特征图神经元做归一化。

例如,一个batch里的128个图,经过一个64 kernels卷积层处理,得到了128×64个图,再针对每一个kernel所对应的128个图,求它们所有像素(相当于上一段提到的所有神经元)的mean和variance,因为总共有64个kernels,输出的结果就是一个一维长度64的数组啦!

这里写图片描述


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表