Batch Norm

本文主要是在看完Andrew Ng的Deep Learning Specialization(Coursera链接,网易云课堂官方授权搬运)系列中相关课程后的记录整理和一点思考

1. 什么是Batch-Norm

首先,Batch-Norm(以下简称BN)是一种归一化的方法,不仅可以在深度学习中使用,在很多其他统计学习(比如Logistic Regression)中也适用。归一化的目标都是希望能加速学习过程,一个简单的例子就是:在使用梯度下降求解最优解的时候,如果等高线(或者说等值线?)的形状越近似于圆,算法收敛到最优解的速度越快,而BN就是将原本的椭圆处理成近似圆。

2. 神经网络中Batch-Norm的实现

BN实现过程如下:

μ=1miz(i)(1) (1) μ = 1 m ∑ i z ( i ) ​

σ2=1mi(z(i)μ)2(2) (2) σ 2 = 1 m ∑ i ( z ( i ) − μ ) 2

z(i)norm=z(i)μ(σ2+ϵ)(3) (3) z n o r m ( i ) = z ( i ) − μ ( σ 2 + ϵ )

z~(i)=γz(i)norm+β(4) (4) z ~ ( i ) = γ ∗ z n o r m ( i ) + β

其实就是简单的“减均值除方差”归一化,不过在“除方差”的时候加上了一个 ϵ ϵ ,是为了在方差近似等于0的时候能保持数值计算稳定。这样就得到的所有 z(i) z ( i ) 都是均值为0,方差为1的分布,但是我们并不希望每个隐藏单元的输入都是这样,因此有了最后一行的 γ γ β β ,作用是可以设置 z~ z ~ 的平均值。注意:这是两个需要在学习过程中不断学习调整的参数,可以用比如Adam之类的学习算法调节到其最优值。

BN的使用对象是所有的 z z ,就是隐层神经元的输入,在使用激活函数之前对其进行归一化,发生在 za z → a 的过程之前。本来需要用学习算法更新值的是 w,b w , b ,而由于 b b 只影响均值,但是最终 z z 的均值取决于 γ γ β β 这两个参数,所以 b b 的作用会被 γ γ β β 消除掉。因此,选择不进行 b b 参数的更新 ,或者说,也就不存在 b b 参数了。

3. 实际模型训练中使用Batch-Norm

对于大规模的数据,完全加载到内存中是不可能的,因此,和mini-batch gradient descent一样,也是将整个数据集分成很多个小规模的mini-batch。归一化的过程是针对每个mini-batch,对应公式中的均值和方差也是每个mini-batch的均值和方差。每个mini-batch可以看做是从数据集整体中进行抽样得到的,因此其均值和方差相对整个数据集来说会有一定的差异,这相当于对数据集加上了一些噪声,也就因此会有一点点(真的只有那么一点点)正则化的效果。需要注意的是:由于效果微乎其微,正则化只能作为BN的一点意外收获,并不能完全取代比如Dropout等“专业正则化”方法。

4. 测试时候的Batch-Norm

因为在测试的时候,模型是针对每个单独的样本输入预测其对应的label,而这个时候计算单个样本的均值和方差显然是没有意义的,所以需要一个方法来估算mini-batch的均值和方差,就可以用指数加权平均(exponentiallly weighted average)。当然,在深度学习的框架(比如tensorflow)中会有默认的估算方式。

你可能感兴趣的:(Batch Norm)