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矩陣轉換成向量之後,做連接運算,得到一個巨型向量。
現在你得到了一個的代價函數J(即)
接着,你得到與W和b順序相同的數據,你同樣可以把dW[1]和db[1]……dW[L]和db[L]轉換成一個新的向量,用它們來初始化大向量,它與具有相同維度。
注意dW[1]與W[1]具有相同維度,db[1]與b[1]具有相同維度。
那麼 和代價函數 的梯度或坡度有什麼關係?
這就是實施梯度檢驗Gradient Checking的過程。
首先,我們要清楚 J 是超參數 的一個函數,不論超級參數 向量的維度是多少,你可以將 J函數展開爲。爲了實施梯度檢驗,你要做的就是循環執行,從而對每個 也就是對每個 組成元素計算 。
上一節已經介紹過,爲了更加逼近導數,這裏要使用雙邊誤差計算逼近值approximation,即
只對增加,其它項保持不變。因爲我們使用的是雙邊誤差,對另一邊做同樣的操作,只不過是減去,其它項全都保持不變。
上一節已經介紹過,應該逼近,是代價函數 的偏導數。
然後你需要對的每個值都執行這個運算,最後得到兩個向量:和。這2個向量的維度相同,和的維度也相同。
你要做的就是驗證這些向量是否彼此接近,。
那麼如何定義兩個向量是否真的接近彼此?
我們可以這樣做。
計算這兩個向量的歐式距離,的歐幾里得範數(L2範數)。注意這裏()沒有平方,它是誤差平方之和,然後求平方根,得到歐式距離。
然後使用向量長度的歐幾里得範數歸一化,得到梯度檢驗方程式爲
分母只是用於預防這些向量太小或太大。分母使得這個方程式變成比率。
我們實際執行這個方程式,可能爲10-7。使用這個取值範圍內的
- 如果你發現計算上述方程式得到的值爲10-7或更小,這就很好,因爲這意味着導數逼近很有可能是正確的,它的值非常小。
- 如果它的值在10-5範圍內,我就要小心了,也許這個值沒問題,但我會再次檢查這個向量的所有項,確保沒有一項誤差過大,可能這裏有bug。
- 如果它的值大於10-3,我就會擔心是否存在bug。這時應該仔細檢查所有項,看是否有一個具體的值,使得和差別很大,並用它來追蹤一些求導計算是否正確。經過一些調試,直至最終結果是這種非常小的值(10-7),此時你的實施纔可能是正確的。
在實現NN時,經常需要執行前向傳播foreprop和反向傳播backprop。
如果你發現這個梯度檢驗有一個相對較大的值,你就要小心存在bug。然後開始調試,調試,調試,調試一段時間後,直至得到一個很小的梯度檢驗值,現在你可以很自信的說,NN實施是正確的。