2020-5-26 吳恩達-改善深層NN-w1 深度學習的實用層面(1.13 梯度檢驗(原理)-檢查導數和梯度的逼近值是否相差過大)

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(W[1],b[1].....W[L],b[L]):J(θ)J(W^{[1]},b^{[1]}.....W^{[L]},b^{[L]}):J(\theta)

接着,你得到與W和b順序相同的數據,你同樣可以把dW[1]和db[1]……dW[L]和db[L]轉換成一個新的向量,用它們來初始化大向量dθd\theta,它與θ\theta具有相同維度。

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

那麼 dθd\theta 和代價函數 J(θ)J(\theta) 的梯度或坡度有什麼關係?
這就是實施梯度檢驗Gradient Checking的過程。

首先,我們要清楚 J 是超參數 θ\theta 的一個函數,不論超級參數 θ\theta 向量的維度是多少,你可以將 J函數展開爲J(θ1,θ2,θ3,......)J(\theta_1,\theta_2,\theta_3,......)。爲了實施梯度檢驗,你要做的就是循環執行,從而對每個 ii 也就是對每個 θ\theta 組成元素計算 dθapprox[i]d\theta_{approx}[i]

上一節已經介紹過,爲了更加逼近導數,這裏要使用雙邊誤差計算逼近值approximation,即
dθapprox[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}
只對θi\theta_i增加ϵ\epsilon,其它項保持不變。因爲我們使用的是雙邊誤差,對另一邊做同樣的操作,只不過是減去ϵ\epsilonθ\theta其它項全都保持不變。

上一節已經介紹過,dθapprox[i]d\theta_{approx}[i]應該逼近dθ[i]=Jθid\theta[i]=\frac{∂J}{∂\theta_i}dθ[i]d\theta[i]是代價函數 JJ 的偏導數。

然後你需要對ii的每個值都執行這個運算,最後得到兩個向量:dθapproxd\theta_{approx}dθd\theta。這2個向量的維度相同,和θ\theta的維度也相同。

你要做的就是驗證這些向量是否彼此接近,dθapproxdθd\theta_{approx} \approx d\theta

那麼如何定義兩個向量是否真的接近彼此?

我們可以這樣做。

計算這兩個向量的歐式距離dθapprox[i]dθ[i]d\theta_{approx}[i] - d\theta[i]的歐幾里得範數(L2範數)。注意這裏(dθapprox[i]dθ[i]2||d\theta_{approx}[i] - d\theta[i]||_2)沒有平方,它是誤差平方之和,然後求平方根,得到歐式距離。
在這裏插入圖片描述

然後使用向量長度的歐幾里得範數歸一化,得到梯度檢驗方程式
dθapprox[i]dθ[i]2dθapprox[i]2+dθ[i]2\frac{||d\theta_{approx}[i] - d\theta[i]||_2}{||d\theta_{approx}[i]||_2+||d\theta[i]||_2}
分母只是用於預防這些向量太小或太大。分母使得這個方程式變成比率。

我們實際執行這個方程式,ϵ\epsilon可能爲10-7。使用這個取值範圍內的ϵ\epsilon

  • 如果你發現計算上述方程式得到的值爲10-7或更小,這就很好,因爲這意味着導數逼近很有可能是正確的,它的值非常小。
  • 如果它的值在10-5範圍內,我就要小心了,也許這個值沒問題,但我會再次檢查這個向量的所有項,確保沒有一項誤差過大,可能這裏有bug。
  • 如果它的值大於10-3,我就會擔心是否存在bug。這時應該仔細檢查所有θ\theta項,看是否有一個具體的ii值,使得dθapprox[i]d\theta_{approx}[i]dθ[i]d\theta[i]差別很大,並用它來追蹤一些求導計算是否正確。經過一些調試,直至最終結果是這種非常小的值(10-7),此時你的實施纔可能是正確的。
    在這裏插入圖片描述

在實現NN時,經常需要執行前向傳播foreprop和反向傳播backprop。
如果你發現這個梯度檢驗有一個相對較大的值,你就要小心存在bug。然後開始調試,調試,調試,調試一段時間後,直至得到一個很小的梯度檢驗值,現在你可以很自信的說,NN實施是正確的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章