1.13 梯度检验-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授


←上一篇↓↑下一篇→
1.12 梯度的数值逼近回到目录1.14 关于梯度检验实现的注记

梯度检验 (Gradient Checking)

梯度检验帮我们节省了很多时间,也多次帮我发现backprop实施过程中的bug,接下来,我们看看如何利用它来调试或检验backprop的实施是否正确。

假设你的网络中含有下列参数, w [ 1 ] w^{[1]} w[1] b [ 1 ] b^{[1]} b[1] …… w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l] ,为了执行梯度检验,首先要做的就是,把所有参数转换成一个巨大的向量数据,你要做的就是把矩阵 w w w 转换成一个向量,把所有 w w w 矩阵转换成向量之后,做连接运算,得到一个巨型向量 θ \theta θ ,该向量表示为参数 θ \theta θ ,代价函数 J J J 是所有 w w w b b b 的函数,现在你得到了一个 θ \theta θ 的代价函数 J J J (即 J ( θ ) J(\theta) J(θ) )。接着,你得到与 w w w b b b 顺序相同的数据,你同样可以把 d w [ 1 ] dw^{[1]} dw[1] d b [ 1 ] db^{[1]} db[1] …… d w [ l ] dw^{[l]} dw[l] d b [ l ] db^{[l]} db[l] 转换成一个新的向量,用它们来初始化大向量 d θ d\theta dθ,它与 θ \theta θ 具有相同维度。

同样的,把 d w [ 1 ] dw^{[1]} dw[1] 转换成矩阵, d b [ 1 ] db^{[1]} db[1] 已经是一个向量了,直到把 d w [ l ] dw^{[l]} dw[l] 转换成矩阵,这样所有的 d w dw dw 都已经是矩阵,注意 d w [ 1 ] dw^{[1]} dw[1] w [ 1 ] w^{[1]} w[1] 具有相同维度, d b [ 1 ] db^{[1]} db[1] b [ 1 ] b^{[1]} b[1] 具有相同维度。经过相同的转换和连接运算操作之后,你可以把所有导数转换成一个大向量 d θ d\theta dθ ,它与 θ \theta θ 具有相同维度,现在的问题是 d θ d\theta dθ 和代价函数 J J J 的梯度或坡度有什么关系?

在这里插入图片描述

这就是实施梯度检验的过程,英语里通常简称为“grad check”,首先,我们要清楚 J J J 是超参数 θ \theta θ 的一个函数,你也可以将 J J J 函数展开为 J ( θ 1 , θ 2 , θ 3 , ⋯   ) J(\theta_1,\theta_2,\theta_3,\cdots) J(θ1,θ2,θ3,) ,不论超级参数向量 θ \theta θ 的维度是多少,为了实施梯度检验,你要做的就是循环执行,从而对每个 i i i 也就是对每个 θ \theta θ 组成元素计算 d θ a p p r o x [ i ] d\theta_{approx}[i] dθapprox[i] 的值,我使用双边误差,也就是

d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , θ 3 , ⋯   , θ i + ϵ , ⋯   ) − J ( θ 1 , θ 2 , θ 3 , ⋯   , θ i − ϵ , ⋯   ) 2 ϵ d\theta_{approx}[i]=\frac{J(\theta_1,\theta_2,\theta_3,\cdots,\theta_i+\epsilon,\cdots)-J(\theta_1,\theta_2,\theta_3,\cdots,\theta_i-\epsilon,\cdots)}{2\epsilon} dθapprox[i]=2ϵJ(θ1,θ2,θ3,,θi+ϵ,)J(θ1,θ2,θ3,,θiϵ,)

只对 θ i \theta_i θi 增加 ϵ \epsilon ϵ ,其它项保持不变,因为我们使用的是双边误差,对另一边做同样的操作,只不过是减去 ϵ \epsilon ϵ θ \theta θ 其它项全都保持不变。

在这里插入图片描述

从上节课中我们了解到这个值( d θ a p p r o x [ i ] d\theta_{approx}[i] dθapprox[i] )应该逼近 d θ [ i ] = ∂ J ∂ θ i d\theta[i]=\frac{\partial J}{\partial \theta_i} dθ[i]=θiJ d θ [ i ] d\theta[i] dθ[i] 是代价函数的偏导数,然后你需要对 i i i 的每个值都执行这个运算,最后得到两个向量,得到 d θ d\theta dθ 的逼近值 d θ a p p r o x d\theta_{approx} dθapprox ,它与 d θ d\theta dθ 具有相同维度,它们两个与 θ \theta θ 具有相同维度,你要做的就是验证这些向量是否彼此接近。

在这里插入图片描述

具体来说,如何定义两个向量是否真的接近彼此?我一般做下列运算,计算这两个向量的距离, d θ a p p p r o x [ i ] − d θ [ i ] d\theta_{appprox}[i]-d\theta[i] dθappprox[i]dθ[i] 的欧几里得范数,注意这里( ∣ ∣ d θ a p p r o x − d θ ∣ ∣ 2 ||d\theta_{approx}-d\theta||_2 dθapproxdθ2 )没有平方,它是误差平方之和,然后求平方根,得到欧式距离,然后用向量长度归一化,使用向量长度的欧几里得范数。分母只是用于预防这些向量太小或太大,分母使得这个方程式变成比率,我们实际执行这个方程式, ϵ \epsilon ϵ 可能为 1 0 − 7 10^{-7} 107 ,使用这个取值范围内的 ϵ \epsilon ϵ ,如果你发现计算方程式得到的值为 1 0 − 7 10^{-7} 107 或更小,这就很好,这就意味着导数逼近很有可能是正确的,它的值非常小。

在这里插入图片描述

如果它的值在 1 0 − 5 10^{-5} 105 范围内,我就要小心了,也许这个值没问题,但我会再次检查这个向量的所有项,确保没有一项误差过大,可能这里有bug

如果左边这个方程式结果是 1 0 − 3 10^{-3} 103 ,我就会担心是否存在bug,计算结果应该比小 1 0 − 3 10^{-3} 103 很多,如果比 1 0 − 3 10^{-3} 103 大很多,我就会很担心,担心是否存在bug。这时应该仔细检查所有 θ \theta θ 项,看是否有一个具体的 i i i 值,使得 d θ a p p p r o x [ i ] d\theta_{appprox}[i] dθappprox[i] d θ [ i ] d\theta[i] dθ[i] 大不相同,并用它来追踪一些求导计算是否正确,经过一些调试,最终结果会是这种非常小的值( 1 0 − 7 10^{-7} 107),那么,你的实施可能是正确的。

在这里插入图片描述

在实施神经网络时,我经常需要执行forepropbackprop,然后我可能发现这个梯度检验有一个相对较大的值,我会怀疑存在bug,然后开始调试,调试,调试,调试一段时间后,我得到一个很小的梯度检验值,现在我可以很自信的说,神经网络实施是正确的。

现在你已经了解了梯度检验的工作原理,它帮助我在神经网络实施中发现了很多bug,希望它对你也有所帮助。

课程PPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


←上一篇↓↑下一篇→
1.12 梯度的数值逼近回到目录1.14 关于梯度检验实现的注记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值