2020-5-26 吴恩达-改善深层NN-w1 深度学习的实用层面(1.13 梯度检验(原理)-检查导数和梯度的逼近值是否相差过大)

274 篇文章 24 订阅
233 篇文章 0 订阅

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

1.13 梯度检验 Gradient Checking

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

假设你的网络中含有这些参数,W[1]和b[1]…W[L]和b[L]

为了执行梯度检验,首先要做的就是,把所有参数转换成一个巨大的向量数据,你要做的就是把矩阵W转换成一个向量。
把所有W矩阵转换成向量之后,做连接运算,得到一个巨型向量 θ \theta θ
现在你得到了一个 θ \theta θ的代价函数J(即 J ( θ ) J(\theta) J(θ)
J ( W [ 1 ] , b [ 1 ] . . . . . W [ L ] , b [ L ] ) : J ( θ ) J(W^{[1]},b^{[1]}.....W^{[L]},b^{[L]}):J(\theta) J(W[1],b[1].....W[L],b[L]):J(θ)

接着,你得到与W和b顺序相同的数据,你同样可以把dW[1]和db[1]……dW[L]和db[L]转换成一个新的向量,用它们来初始化大向量 d θ d\theta dθ,它与 θ \theta θ具有相同维度。

注意dW[1]与W[1]具有相同维度,db[1]与b[1]具有相同维度。

那么 d θ d\theta dθ 和代价函数 J ( θ ) J(\theta) J(θ) 的梯度或坡度有什么关系?
这就是实施梯度检验Gradient Checking的过程。

首先,我们要清楚 J 是超参数 θ \theta θ 的一个函数,不论超级参数 θ \theta θ 向量的维度是多少,你可以将 J函数展开为 J ( θ 1 , θ 2 , θ 3 , . . . . . . ) J(\theta_1,\theta_2,\theta_3,......) J(θ1,θ2,θ3,......)。为了实施梯度检验,你要做的就是循环执行,从而对每个 i i i 也就是对每个 θ \theta θ 组成元素计算 d θ a p p r o x [ i ] d\theta_{approx}[i] dθapprox[i]

上一节已经介绍过,为了更加逼近导数,这里要使用双边误差计算逼近值approximation,即
d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , . . . . . . θ i + ϵ , . . . . . . ) − J ( θ 1 , θ 2 , . . . . . . θ i − ϵ , . . . . . . ) 2 ϵ d\theta_{approx}[i]=\frac{J(\theta_1,\theta_2,......\theta_i+\epsilon,......)-J(\theta_1,\theta_2,......\theta_i-\epsilon,......)}{2\epsilon} dθapprox[i]=2ϵJ(θ1,θ2,......θi+ϵ,......)J(θ1,θ2,......θ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{∂J}{∂\theta_i} dθ[i]=θiJ d θ [ i ] d\theta[i] dθ[i]是代价函数 J J J 的偏导数。

然后你需要对 i i i的每个值都执行这个运算,最后得到两个向量: d θ a p p r o x d\theta_{approx} dθapprox d θ d\theta dθ。这2个向量的维度相同,和 θ \theta θ的维度也相同。

你要做的就是验证这些向量是否彼此接近, d θ a p p r o x ≈ d θ d\theta_{approx} \approx d\theta dθapproxdθ

那么如何定义两个向量是否真的接近彼此?

我们可以这样做。

计算这两个向量的欧式距离 d θ a p p r o x [ i ] − d θ [ i ] d\theta_{approx}[i] - d\theta[i] dθapprox[i]dθ[i]的欧几里得范数(L2范数)。注意这里( ∣ ∣ d θ a p p r o x [ i ] − d θ [ i ] ∣ ∣ 2 ||d\theta_{approx}[i] - d\theta[i]||_2 dθapprox[i]dθ[i]2)没有平方,它是误差平方之和,然后求平方根,得到欧式距离。
在这里插入图片描述

然后使用向量长度的欧几里得范数归一化,得到梯度检验方程式
∣ ∣ d θ a p p r o x [ i ] − d θ [ i ] ∣ ∣ 2 ∣ ∣ d θ a p p r o x [ i ] ∣ ∣ 2 + ∣ ∣ d θ [ i ] ∣ ∣ 2 \frac{||d\theta_{approx}[i] - d\theta[i]||_2}{||d\theta_{approx}[i]||_2+||d\theta[i]||_2} dθapprox[i]2+dθ[i]2dθapprox[i]dθ[i]2
分母只是用于预防这些向量太小或太大。分母使得这个方程式变成比率。

我们实际执行这个方程式, ϵ \epsilon ϵ可能为10-7。使用这个取值范围内的 ϵ \epsilon ϵ

  • 如果你发现计算上述方程式得到的值为10-7或更小,这就很好,因为这意味着导数逼近很有可能是正确的,它的值非常小。
  • 如果它的值在10-5范围内,我就要小心了,也许这个值没问题,但我会再次检查这个向量的所有项,确保没有一项误差过大,可能这里有bug。
  • 如果它的值大于10-3,我就会担心是否存在bug。这时应该仔细检查所有 θ \theta θ项,看是否有一个具体的 i i i值,使得 d θ a p p r o x [ i ] d\theta_{approx}[i] dθapprox[i] d θ [ i ] d\theta[i] dθ[i]差别很大,并用它来追踪一些求导计算是否正确。经过一些调试,直至最终结果是这种非常小的值(10-7),此时你的实施才可能是正确的。
    在这里插入图片描述

在实现NN时,经常需要执行前向传播foreprop和反向传播backprop。
如果你发现这个梯度检验有一个相对较大的值,你就要小心存在bug。然后开始调试,调试,调试,调试一段时间后,直至得到一个很小的梯度检验值,现在你可以很自信的说,NN实施是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值