吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.6-3.7

第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)

第三周: 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)

3.6 Batch Norm 为什么奏效?(Why does Batch Norm work?)

为什么 Batch 归一化会起作用呢?

一个原因是,你已经看到如何归一化输入特征值𝑥,使其均值为 0,方差 1,它又是怎样加速学习的,有一些从 0 到 1 而不是从 1 到 1000 的特征值,通过归一化所有的输入特征值𝑥,以获得类似范围的值,可以加速学习。所以 Batch 归一化起的作用的原因,直观的一点就是,它在做类似的工作,但不仅仅对于这里的输入值,还有隐藏单元的值,这只是 Batch归一化作用的冰山一角,还有些深层的原理,它会有助于你对 Batch 归一化的作用有更深的理解,让我们一起来看看吧。

Batch 归一化有效的第二个原因是,它可以使权重比你的网络更滞后或更深层,比如,第 10 层的权重更能经受得住变化,相比于神经网络中前层的权重,比如第 1 层,为了解释我的意思,让我们来看看这个最生动形象的例子。

在这里插入图片描述
这是一个网络的训练,也许是个浅层网络,比如 logistic 回归或是一个神经网络,也许是个浅层网络,像这个回归函数。或一个深层网络,建立在我们著名的猫脸识别检测上,但假设你已经在所有黑猫的图像上训练了数据集,如果现在你要把此网络应用于有色猫,这种情况下,正面的例子不只是左边的黑猫,还有右边其它颜色的猫,那么你的 cosfa 可能适用的不会很好。

在这里插入图片描述

如果图像中,你的训练集是这个样子的,你的正面例子在这儿,反面例子在那儿(左图),但你试图把它们都统一于一个数据集,也许正面例子在这,反面例子在那儿(右图)。你也许无法期待,在左边训练得很好的模块,同样在右边也运行得很好,即使存在运行都很好的同一个函数,但你不会希望你的学习算法去发现绿色的决策边界,如果只看左边数据的话。

所以使你数据改变分布的这个想法,有个有点怪的名字“Covariate shift”,想法是这样的,如果你已经学习了𝑥到𝑦 的映射,如果𝑥的分布改变了,那么你可能需要重新训练你的学习算法。这种做法同样适用于,如果真实函数由𝑥到𝑦 映射保持不变,正如此例中,因为真实函数是此图片是否是一只猫,训练你的函数的需要变得更加迫切,如果真实函数也改变,情况就更糟了。

在这里插入图片描述
“Covariate shift”的问题怎么应用于神经网络呢?试想一个像这样的深度网络,让我们从这层(第三层)来看看学习过程。此网络已经学习了参数 w [ 3 ] w^{[3]} w[3] b [ 3 ] b^{[3]} b[3],从第三隐藏层的角度来看,它从前层中取得一些值,接着它需要做些什么,使希望输出值 y ^ \hat{y} y^接近真实值𝑦。

在这里插入图片描述
让我先遮住左边的部分,从第三隐藏层的角度来看,它得到一些值,称为 a 1 [ 2 ] , a 2 [ 2 ] , a 3 [ 2 ] , a 4 [ 2 ] a_1^{[2]},a_2^{[2]},a_3^{[2]},a_4^{[2]} a1[2]a2[2]a3[2]a4[2],但这些值也可以是特征值 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1x2x3x4,第三层隐藏层的工作是找到一种方式,使这些值映射到 y ^ \hat{y} y^,你可以想象做一些截断,所以这些参数 w [ 3 ] w_{[3]} w[3] b [ 3 ] b_{[3]} b[3] w [ 4 ] w_{[4]} w[4] b [ 4 ] b_{[4]} b[4] w [ 5 ] w_{[5]} w[5] b [ 5 ] b_{[5]} b[5],也许是学习这些参数,所以网络做的不错,从左边我用黑色笔写的映射到输出值 y ^ \hat{y} y^

在这里插入图片描述

现在我们把网络的左边揭开,这个网络还有参数 w [ 2 ] w_{[2]} w[2] b [ 2 ] b_{[2]} b[2] w [ 1 ] w_{[1]} w[1] b [ 1 ] b_{[1]} b[1],如果这些参数改变,这些 a [ 2 ] a^{[2]} a[2]的值也会改变。所以从第三层隐藏层的角度来看,这些隐藏单元的值在不断地改变,所以它就有了“Covariate shift”的问题,上张幻灯片中我们讲过的。
在这里插入图片描述
Batch 归一化做的,是它减少了这些隐藏值分布变化的数量。如果是绘制这些隐藏的单元值的分布,也许这是重整值z,这其实是 z 1 [ 2 ] z_1^{[2]} z1[2] z 2 [ 2 ] z_2^{[2]} z2[2],我要绘制两个值而不是四个值,以便我们设想为 2D,Batch 归一化讲的是 z 1 [ 2 ] , z 2 [ 2 ] z_1^{[2]},z_2^{[2]} z1[2]z2[2]的值可以改变,它们的确会改变,当神经网络在之前层中更新参数,Batch 归一化可以确保无论其怎样变化 z 1 [ 2 ] , z 2 [ 2 ] z_1^{[2]},z_2^{[2]} z1[2]z2[2]的均值和方差保持不变,所以即使 z 1 [ 2 ] , z 2 [ 2 ] z_1^{[2]},z_2^{[2]} z1[2]z2[2]的值改变,至少他们的均值和方差也会是均值 0,方差 1,或不一定必须是均值 0,方差 1,而是由 β [ 2 ] \beta^{[2]} β[2] γ [ 2 ] \gamma^{[2]} γ[2]决定的值。如果神经网络选择的话,可强制其为均值 0,方差 1,或其他任何均值和方差。但它做的是,它限制了在前层的参数更新,会影响数值分布的程度,第三层看到的这种情况,因此得到学习。

Batch 归一化减少了输入值改变的问题,它的确使这些值变得更稳定,神经网络的之后层就会有更坚实的基础。即使使输入分布改变了一些,它会改变得更少。它做的是当前层保持学习,当改变时,迫使后层适应的程度减小了,你可以这样想,它减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习。

在这里插入图片描述
所以,希望这能带给你更好的直觉,重点是 Batch 归一化的意思是,尤其从神经网络后层之一的角度而言,前层不会左右移动的那么多,因为它们被同样的均值和方差所限制,所以,这会使得后层的学习工作变得更容易些。

Batch 归一化还有一个作用,它有轻微的正则化效果,Batch 归一化中非直观的一件事是,每个 mini-batch,我会说 mini-batch X t X^{{t}} Xt的值为 z [ t ] , z [ l ] z^{[t]},z^{[l]} z[t]z[l],在 mini-batch 计算中,由均值和方差缩放的,因为在 mini-batch 上计算的均值和方差,而不是在整个数据集上,均值和方差有一些小的噪声,因为它只在你的 mini-batch 上计算,比如 64 或 128 或 256 或更大的训练例子。因为均值和方差有一点小噪音,因为它只是由一小部分数据估计得出的。缩放过程从 z [ l ] z^{[l]} z[l] z ^ [ l ] \hat{z}^{[l]} z^[l],过程也有一些噪音,因为它是用有些噪音的均值和方差计算得出的。

在这里插入图片描述
所以和 dropout 相似,它往每个隐藏层的激活值上增加了噪音,dropout 有增加噪音的方式,它使一个隐藏的单元,以一定的概率乘以 0,以一定的概率乘以 1,所以你的 dropout含几重噪音,因为它乘以 0 或 1。

对比而言,Batch 归一化含几重噪音,因为标准偏差的缩放和减去均值带来的额外噪音。这里的均值和标准差的估计值也是有噪音的,所以类似于 dropout,Batch 归一化有轻微的正则化效果,因为给隐藏单元添加了噪音,这迫使后部单元不过分依赖任何一个隐藏单元,类似于 dropout,它给隐藏层增加了噪音,因此有轻微的正则化效果。因为添加的噪音很微小,所以并不是巨大的正则化效果,你可以将 Batch 归一化和 dropout 一起使用,如果你想得到 dropout 更强大的正则化效果。

也许另一个轻微非直观的效果是,如果你应用了较大的 mini-batch,对,比如说,你用了 512 而不是 64,通过应用较大的 min-batch,你减少了噪音,因此减少了正则化效果,这是 dropout 的一个奇怪的性质,就是应用较大的 mini-batch 可以减少正则化效果。

说到这儿,我会把 Batch 归一化当成一种正则化,这确实不是其目的,但有时它会对你的算法有额外的期望效应或非期望效应。但是不要把 Batch 归一化当作正则化,把它当作将你归一化隐藏单元激活值并加速学习的方式,我认为正则化几乎是一个意想不到的副作用。

所以希望这能让你更理解 Batch 归一化的工作,在我们结束 Batch 归一化的讨论之前,我想确保你还知道一个细节。Batch 归一化一次只能处理一个 mini-batch 数据,它在 minibatch 上计算均值和方差。所以测试时,你试图做出预测,试着评估神经网络,你也许没有mini-batch 的例子,你也许一次只能进行一个简单的例子,所以测试时,你需要做一些不同的东西以确保你的预测有意义。

在下一个也就是最后一个 Batch 归一化视频中,让我们详细谈谈你需要注意的一些细节,来让你的神经网络应用 Batch 归一化来做出预测。

3.7 测试时的 Batch Norm(Batch Norm at test time)

Batch 归一化将你的数据以 mini-batch 的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理,我们来看一下怎样调整你的网络来做到这一点。

在这里插入图片描述

回想一下,在训练时,这些就是用来执行 Batch 归一化的等式。在一个 mini-batch 中,你将 mini-batch 的在 z ( i ) z^{(i)} z(i)值求和,计算均值,所以这里你只把一个 mini-batch 中的样本都加起来,我用 m 来表示这个 mini-batch 中的样本数量,而不是整个训练集。然后计算方差,再算 z n o r m ( i ) z_{norm}^{(i)} znorm(i) ,即用均值和标准差来调整,加上 ϵ \epsilon ϵ是为了数值稳定性。 z ^ \hat{z} z^是用 γ \gamma γ β \beta β再次调整 z n o r m z_{norm} znorm 得到的。

请注意用于调节计算的 μ \mu μ σ 2 \sigma^2 σ2是在整个 mini-batch 上进行计算,但是在测试时,你可能不能将一个 mini-batch 中的 6428 或 2056 个样本同时处理,因此你需要用其它方式来得到 μ \mu μ σ 2 \sigma^2 σ2,而且如果你只有一个样本,一个样本的均值和方差没有意义。那么实际上,为了将你的神经网络运用于测试,就需要单独估算 μ \mu μ σ 2 \sigma^2 σ2,在典型的 Batch 归一化运用中,你需要用一个指数加权平均来估算,这个平均数涵盖了所有 mini-batch,接下来我会具体解释。

在这里插入图片描述
我们选择𝑙层,假设我们有 mini-batch,𝑋[1],𝑋[2],𝑋[3]……以及对应的𝑦值等等,那么在为𝑙层训练X^{{1}}时,你就得到了 u [ l ] u^{[l]} u[l],我还是把它写做第一个 mini-batch 和这一层的𝜇吧,( u [ l ] u^{[l]} u[l] u [ 1 ] [ l ] u^{[1][l]} u[1][l])。当你训练第二个 mini-batch,在这一层和这个 mini-batch 中,你就会得到第二个𝜇( u [ 2 ] [ l ] u^{[2][l]} u[2][l])值。然后在这一隐藏层的第三个 mini-batch,你得到了第三个𝜇( u [ 3 ] [ l ] u^{[3][l]} u[3][l])值。正如我们之前用的指数加权平均来计算 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2 θ 3 \theta_3 θ3的均值,当时是试着计算当前气温的指数加权平均,你会这样来追踪你看到的这个均值向量的最新平均值,于是这个指数加权平均就成了你对这一隐藏层的𝑧均值的估值。同样的,你可以用指数加权平均来追踪你在这一层的第一个 mini-batch 中所见的 σ 2 \sigma^2 σ2的值,以及第二个 mini-batch 中所见的 σ 2 \sigma^2 σ2的值等等。因此在用不同的 mini-batch 训练神经网络的同时,能够得到你所查看的每一层的 μ \mu μ σ 2 \sigma^2 σ2的平均数的实时数值。

在这里插入图片描述
最后在测试时,对应这个等式( z n o r m ( i ) = z ( i ) − μ σ 2 + ϵ z_{norm}^{(i)} =\frac{z^{(i)}−\mu} {\sqrt{\sigma^2+\epsilon}} znorm(i)=σ2+ϵ z(i)μ),你只需要用你的𝑧值来计算 z n o r m ( i ) z_{norm}^{(i)} znorm(i),用 μ \mu μ σ 2 \sigma^2 σ2的指数加权平均,用你手头的最新数值来做调整,然后你可以用左边我们刚算出来的 z n o r m z_{norm} znorm和你在神经网络训练过程中得到的 β \beta β γ \gamma γ参数来计算你那个测试样本的 z ^ \hat{z} z^值。

总结一下就是,在训练时, μ \mu μ σ 2 \sigma^2 σ2是在整个 mini-batch 上计算出来的包含了像是 64 或28 或其它一定数量的样本,但在测试时,你可能需要逐一处理样本,方法是根据你的训练集估算 μ \mu μ σ 2 \sigma^2 σ2,估算的方式有很多种,理论上你可以在最终的网络中运行整个训练集来得到 μ \mu μ σ 2 \sigma^2 σ2,但在实际操作中,我们通常运用指数加权平均来追踪在训练过程中你看到的 μ \mu μ σ 2 \sigma^2 σ2的值。还可以用指数加权平均,有时也叫做流动平均来粗略估算 μ \mu μ σ 2 \sigma^2 σ2,然后在测试中使用 μ \mu μ σ 2 \sigma^2 σ2的值来进行你所需要的隐藏单元𝑧值的调整。在实践中,不管你用什么方式估算 μ \mu μ σ 2 \sigma^2 σ2,这套过程都是比较稳健的,因此我不太会担心你具体的操作方式,而且如果你使用的是某种深度学习框架,通常会有默认的估算 μ \mu μ σ 2 \sigma^2 σ2的方式,应该一样会起到比较好的效果。但在实践中,任何合理的估算你的隐藏单元𝑧值的均值和方差的方式,在测试中应该都会有效。

Batch 归一化就讲到这里,使用 Batch 归一化,你能够训练更深的网络,让你的学习算法运行速度更快,在结束这周的课程之前,我还想和你们分享一些关于深度学习框架的想法,让我们在下一段视频中一起讨论这个话题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值