吴恩达深度学习笔记(54)-测试时的 Batch Norm
测试时的 Batch Norm(Batch Norm at test time)
Batch归一化将你的数据以mini-batch的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理,我们来看一下怎样调整你的网络来做到这一点。
回想一下,在训练时,这些就是用来执行Batch归一化的等式。
在一个mini-batch中,你将mini-batch的z^((i))值求和,计算均值,所以这里你只把一个mini-batch中的样本都加起来,我用m来表示这个mini-batch中的样本数量,而不是整个训练集。然后计算方差,再算z_norm^((i)),即用均值和标准差来调整,加上ε是为了数值稳定性。̃z是用γ和β再次调整z_norm得到的。
请注意用于调节计算的μ和σ^2是在整个mini-batch上进行计算,但是在测试时,你可能不能将一个mini-batch中的64,128或256个样本同时处理,因此你需要用其它方式来得到μ和σ^2,而且如果你只有一个样本,一个样本的均值和方差没有意义。
那么实际上,为了将你的神经网络运用于测试,就需要单独估算μ和σ^2,在典型的Batch归一化运用中,你需要用一个指数加权平均来估算,这个平均数涵盖了所有mini-batch,接下来我会具体解释。
我们选择l层,假设我们有mini-batch,X^([1]),X^([2]),X^([3])……以及对应的y值等等,那么在为l层训练X^({1})时,你就得到了μ^([l]),我还是把它写做第一个mini-batch和这一层的μ吧,(μ^([l])→μ^({1}[l]))。
当你训练第二个mini-batch,在这一层和这个mini-batch中,你就会得到第二个μ(μ^({2}[l]))值。
然后在这一隐藏层的第三个mini-batch,你得到了第三个μ(μ^({3}[l]))值。
正如我们之前用的指数加权平均来计算θ_1,θ_2,θ_3的均值,当时是试着计算当前气温的指数加权平均,你会这样来追踪你看到的这个均值向量的最新平均值,于是这个指数加权平均就成了你对这一隐藏层的z均值的估值。
同样的,你可以用指数加权平均来追踪你在这一层的第一个mini-batch中所见的σ^2的值,以及第二个mini-batch中所见的σ^2的值等等。因此在用不同的mini-batch训练神经网络的同时,能够得到你所查看的每一层的μ和σ^2的平均数的实时数值。
最后在测试时,对应这个等式(z_norm^((i))=(z^((i))-μ)/√(σ^2+ε)),你只需要用你的z值来计算z_norm^((i)),用μ和σ^2的指数加权平均,用你手头的最新数值来做调整,然后你可以用左边我们刚算出来的z_norm和你在神经网络训练过程中得到的β和γ参数来计算你那个测试样本的̃z值。
总结一下就是,在训练时,μ和σ^2是在整个mini-batch上计算出来的包含了像是64或128或其它一定数量的样本,但在测试时,你可能需要逐一处理样本,方法是根据你的训练集估算μ和σ^2,估算的方式有很多种,理论上你可以在最终的网络中运行整个训练集来得到μ和σ^2,但在实际操作中,我们通常运用指数加权平均来追踪在训练过程中你看到的μ和σ^2的值。还可以用指数加权平均,有时也叫做流动平均来粗略估算μ和σ^2,然后在测试中使用μ和σ^2的值来进行你所需要的隐藏单元z值的调整。在实践中,不管你用什么方式估算μ和σ^2,这套过程都是比较稳健的,因此我不太会担心你具体的操作方式,而且如果你使用的是某种深度学习框架,通常会有默认的估算μ和σ^2的方式,应该一样会起到比较好的效果。但在实践中,任何合理的估算你的隐藏单元z值的均值和方差的方式,在测试中应该都会有效。
Batch归一化就讲到这里,使用Batch归一化,你能够训练更深的网络,让你的学习算法运行速度更快。