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] ,為了執行梯度檢驗,首先要做的就是,把所有參數轉換成一個巨大的向量數據,你要做的就是把矩陣 www 轉換成一個向量,把所有 www 矩陣轉換成向量之后,做連接運算,得到一個巨型向量 θ\thetaθ ,該向量表示為參數 θ\thetaθ ,代價函數 JJJ 是所有 www 和 bbb 的函數,現在你得到了一個 θ\thetaθ 的代價函數 JJJ (即 J(θ)J(\theta)J(θ) )。接著,你得到與 www 和 bbb 順序相同的數據,你同樣可以把 dw[1]dw^{[1]}dw[1] 和 db[1]db^{[1]}db[1] …… dw[l]dw^{[l]}dw[l] 和 db[l]db^{[l]}db[l] 轉換成一個新的向量,用它們來初始化大向量 dθd\thetadθ,它與 θ\thetaθ 具有相同維度。
同樣的,把 dw[1]dw^{[1]}dw[1] 轉換成矩陣, db[1]db^{[1]}db[1] 已經是一個向量了,直到把 dw[l]dw^{[l]}dw[l] 轉換成矩陣,這樣所有的 dwdwdw 都已經是矩陣,注意 dw[1]dw^{[1]}dw[1] 與 w[1]w^{[1]}w[1] 具有相同維度, db[1]db^{[1]}db[1] 與 b[1]b^{[1]}b[1] 具有相同維度。經過相同的轉換和連接運算操作之后,你可以把所有導數轉換成一個大向量 dθd\thetadθ ,它與 θ\thetaθ 具有相同維度,現在的問題是 dθd\thetadθ 和代價函數 JJJ 的梯度或坡度有什么關系?
這就是實施梯度檢驗的過程,英語里通常簡稱為“grad check”,首先,我們要清楚 JJJ 是超參數 θ\thetaθ 的一個函數,你也可以將 JJJ 函數展開為 J(θ1,θ2,θ3,?)J(\theta_1,\theta_2,\theta_3,\cdots)J(θ1?,θ2?,θ3?,?) ,不論超級參數向量 θ\thetaθ 的維度是多少,為了實施梯度檢驗,你要做的就是循環執行,從而對每個 iii 也就是對每個 θ\thetaθ 組成元素計算 dθapprox[i]d\theta_{approx}[i]dθapprox?[i] 的值,我使用雙邊誤差,也就是
dθapprox[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θapprox[i]d\theta_{approx}[i]dθapprox?[i] )應該逼近 dθ[i]=?J?θid\theta[i]=\frac{\partial J}{\partial \theta_i}dθ[i]=?θi??J? , dθ[i]d\theta[i]dθ[i] 是代價函數的偏導數,然后你需要對 iii 的每個值都執行這個運算,最后得到兩個向量,得到 dθd\thetadθ 的逼近值 dθapproxd\theta_{approx}dθapprox? ,它與 dθd\thetadθ 具有相同維度,它們兩個與 θ\thetaθ 具有相同維度,你要做的就是驗證這些向量是否彼此接近。
具體來說,如何定義兩個向量是否真的接近彼此?我一般做下列運算,計算這兩個向量的距離, dθappprox[i]?dθ[i]d\theta_{appprox}[i]-d\theta[i]dθappprox?[i]?dθ[i] 的歐幾里得范數,注意這里( ∣∣dθapprox?dθ∣∣2||d\theta_{approx}-d\theta||_2∣∣dθapprox??dθ∣∣2? )沒有平方,它是誤差平方之和,然后求平方根,得到歐式距離,然后用向量長度歸一化,使用向量長度的歐幾里得范數。分母只是用于預防這些向量太小或太大,分母使得這個方程式變成比率,我們實際執行這個方程式, ?\epsilon? 可能為 10?710^{-7}10?7 ,使用這個取值范圍內的 ?\epsilon? ,如果你發現計算方程式得到的值為 10?710^{-7}10?7 或更小,這就很好,這就意味著導數逼近很有可能是正確的,它的值非常小。
如果它的值在 10?510^{-5}10?5 范圍內,我就要小心了,也許這個值沒問題,但我會再次檢查這個向量的所有項,確保沒有一項誤差過大,可能這里有bug。
如果左邊這個方程式結果是 10?310^{-3}10?3 ,我就會擔心是否存在bug,計算結果應該比小 10?310^{-3}10?3 很多,如果比 10?310^{-3}10?3 大很多,我就會很擔心,擔心是否存在bug。這時應該仔細檢查所有 θ\thetaθ 項,看是否有一個具體的 iii 值,使得 dθappprox[i]d\theta_{appprox}[i]dθappprox?[i] 與 dθ[i]d\theta[i]dθ[i] 大不相同,并用它來追蹤一些求導計算是否正確,經過一些調試,最終結果會是這種非常小的值(10?710^{-7}10?7),那么,你的實施可能是正確的。
在實施神經網絡時,我經常需要執行foreprop和backprop,然后我可能發現這個梯度檢驗有一個相對較大的值,我會懷疑存在bug,然后開始調試,調試,調試,調試一段時間后,我得到一個很小的梯度檢驗值,現在我可以很自信的說,神經網絡實施是正確的。
現在你已經了解了梯度檢驗的工作原理,它幫助我在神經網絡實施中發現了很多bug,希望它對你也有所幫助。
課程PPT
| 1.12 梯度的數值逼近 | 回到目錄 | 1.14 關于梯度檢驗實現的注記 |
總結
以上是生活随笔為你收集整理的1.13 梯度检验-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.12 梯度的数值逼近-深度学习第二课
- 下一篇: 1.14 梯度检验应用的注意事项-深度学