转载自:http://zyzblog.top/article/24
输入归一化
为了加快训练神经网络的速度,我们可以对输入数据进行归一化操作,在测试时,我们也要对测试集进行相同的归一化操作;假设一个训练集有两个特征,输入特征为 2 维,归一化需要两个步骤:
1.零均值
2.归一化方差;
假设初始训练集分布如下图:
image
第一步是零均值化,具体计算方法如下:
image
这是一个向量,X是所有训练集组成的矩阵,令X等于X减去μ, 实际意义是移动训练集,完成零均值化。经过零均值化,训练集的分布变成下图:
image
第二步是归一化方差,具体计算方法如下:
image
它是一个向量,X是所有训练集组成的矩阵,令X等于X / σ 2,经过归一化方差,训练集的分布变成下图:
image
为什么要这么做能够加快训练速度?我们从损失函数 J 说起,代价函数如下:
image
如果没有进行归一化的输入特征,代价函数细长狭窄,如下图所示:
image
在这样的代价函数上运行梯度下降法,必须使用一个非常小的学习率。因为梯度下降法可能需要多次迭代过程,直到最后找到最小值。
如果你归一化特征,代价函数呈现球形轮廓,如下图所示:
image
这种情况下,不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,也可使用较大步长。
Batch归一化
如果我们只对输入的数据进行归一化,却没有在中间层进行归一化处理,随着深度网络的多层运算之后,数据分布的变化将越来越大,因此我们应该对每一个隐藏层的输入a[l-1]也可以进行归一化操作,严格来说,真正归一化的不是a[l - 1],而是z [l - 1] 。主要计算公式如下:
(1) 求上一层输出数据的均值:
image
注:m是当前mini-batch的大小。
(2) 求上一层输出数据的标准差:
image
(3) 归一化处理:
image
注: ε是为了避免分母为0而加进去的接近于0的数
对经过上面归一化处理得到的数据进行重构,得到如下公式:
image
注:γ和β学习参数
将 Batch Norm 拟合进神经网络 ,具体计算方法如图:
image
每一层都一次执行下面的计算过程
image
也就是对每一个隐藏层的输入进行归一化计算,将归一化的结果做为激活函数的输入,最终得出计算结果。
Batch归一化的作用:
-
通过归一化所有的输入特征值x,可以加速学习。
-
Batch 归一化解决了输入值改变的问题,使得所有的输入值在一定的范围内,使得神经网络的所有隐藏层的输入更稳定,它减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习。
-
如果神经元的数据分布改变,我们也许需要重新训练数据以拟合新的数据分布,batch归一化可以确保,无论其怎样变化,其均值和方差将保持不变,避免重新训练数据。
-
Batch 归一化还有一个作用,它有轻微的正则化效果,避免过拟合。
测试时的 Batch Norm
为了将神经网络运用于测试,需要单独估算μ和σ^2 ,在典型的 Batch 归一化运用中,需要用一个指数加权平均来估算,这个平均数涵盖了所有 mini-batch。
假设有 mini-batch:
image
在训练第一个mini-batch,第二个mini-batch,第三个mini-batch……第m个mini-batch时,在第 l 层得到m个不同的mini-batch数据所计算的不同的Z均值(每个mini-batch对应一个均值),如下图所示:
image
计算第 l 层的m个均值的指数加权平均值,这个指数加权平均就是这一隐藏层的z均值的估值。
同样的,用指数加权平均来追踪第 l 层的第一个 mini-batch 中的σ^2 的值,以及第二个 mini-batch 中的σ^2 的值等等,然后计算σ^2的 指数加权平均数。
通过上述计算,可以将神经网络模型的所有层上的指数加权平均数μ、σ^2计算出来,将测试集z带入下面的公式进行测试:
image
注:ε、β、γ为神经网络模型已经训练好的参数。
总结一下就是:在测试时,首先根据训练集获得不同mini-batch的μ和σ^2,然后计算指数加权平均数 ,然后在测试中使用μ和σ^2 的指数加权平均数来进行你所需要的隐藏单元z值的调整。












网友评论