神经网络优化篇:详解梯度检验(Gradient checking)
梯度檢驗
梯度檢驗幫節省了很多時間,也多次幫發現backprop實施過程中的bug,接下來,看看如何利用它來調試或檢驗backprop的實施是否正確。
假設的網絡中含有下列參數,\(W^{[1]}\)和\(b^{[1]}\)……\(W^{[l]}\)和\(b^{[l]}\),為了執行梯度檢驗,首先要做的就是,把所有參數轉換成一個巨大的向量數據,要做的就是把矩陣\(W\)轉換成一個向量,把所有\(W\)矩陣轉換成向量之后,做連接運算,得到一個巨型向量\(\theta\),該向量表示為參數\(\theta\),代價函數\(J\)是所有\(W\)和\(b\)的函數,現在得到了一個\(\theta\)的代價函數\(J\)(即\(J(\theta)\))。接著,得到與\(W\)和\(b\)順序相同的數據,同樣可以把\(dW^{[1]}\)和\({db}^{[1]}\)……\({dW}^{[l]}\)和\({db}^{[l]}\)轉換成一個新的向量,用它們來初始化大向量\(d\theta\),它與\(\theta\)具有相同維度。
同樣的,把\(dW^{[1]}\)轉換成矩陣,\(db^{[1]}\)已經是一個向量了,直到把\({dW}^{[l]}\)轉換成矩陣,這樣所有的\(dW\)都已經是矩陣,注意\(dW^{[1]}\)與\(W^{[1]}\)具有相同維度,\(db^{[1]}\)與\(b^{[1]}\)具有相同維度。經過相同的轉換和連接運算操作之后,可以把所有導數轉換成一個大向量\(d\theta\),它與\(\theta\)具有相同維度,現在的問題是\(d\theta\)和代價函數\(J\)的梯度或坡度有什么關系?
這就是實施梯度檢驗的過程,英語里通常簡稱為“grad check”,首先,要清楚\(J\)是超參數\(\theta\)的一個函數,也可以將J函數展開為\(J(\theta_{1},\theta_{2},\theta_{3},\ldots\ldots)\),不論超級參數向量\(\theta\)的維度是多少,為了實施梯度檢驗,要做的就是循環執行,從而對每個\(i\)也就是對每個\(\theta\)組成元素計算\(d\theta_{\text{approx}}[i]\)的值,使用雙邊誤差,也就是
\(d\theta_{\text{approx}}\left[i \right] = \frac{J\left( \theta_{1},\theta_{2},\ldots\theta_{i} + \varepsilon,\ldots \right) - J\left( \theta_{1},\theta_{2},\ldots\theta_{i} - \varepsilon,\ldots \right)}{2\varepsilon}\)
只對\(\theta_{i}\)增加\(\varepsilon\),其它項保持不變,因為使用的是雙邊誤差,對另一邊做同樣的操作,只不過是減去\(\varepsilon\),\(\theta\)其它項全都保持不變。
之前了解到這個值(\(d\theta_{\text{approx}}\left[i \right]\))應該逼近\(d\theta\left[i \right]\)=\(\frac{\partial J}{\partial\theta_{i}}\),\(d\theta\left[i \right]\)是代價函數的偏導數,然后需要對i的每個值都執行這個運算,最后得到兩個向量,得到\(d\theta\)的逼近值\(d\theta_{\text{approx}}\),它與\(d\theta\)具有相同維度,它們兩個與\(\theta\)具有相同維度,要做的就是驗證這些向量是否彼此接近。
具體來說,如何定義兩個向量是否真的接近彼此?一般做下列運算,計算這兩個向量的距離,\(d\theta_{\text{approx}}\left[i \right] - d\theta[i]\)的歐幾里得范數,注意這里(\({||d\theta_{\text{approx}} -d\theta||}_{2}\))沒有平方,它是誤差平方之和,然后求平方根,得到歐式距離,然后用向量長度歸一化,使用向量長度的歐幾里得范數。分母只是用于預防這些向量太小或太大,分母使得這個方程式變成比率,實際執行這個方程式,\(\varepsilon\)可能為\(10^{-7}\),使用這個取值范圍內的\(\varepsilon\),如果發現計算方程式得到的值為\(10^{-7}\)或更小,這就很好,這就意味著導數逼近很有可能是正確的,它的值非常小。
如果它的值在\(10^{-5}\)范圍內,就要小心了,也許這個值沒問題,但會再次檢查這個向量的所有項,確保沒有一項誤差過大,可能這里有bug。
如果左邊這個方程式結果是\(10^{-3}\),就會擔心是否存在bug,計算結果應該比\(10^{- 3}\)小很多,如果比\(10^{-3}\)大很多,就會很擔心,擔心是否存在bug。這時應該仔細檢查所有\(\theta\)項,看是否有一個具體的\(i\)值,使得\(d\theta_{\text{approx}}\left[i \right]\)與$ d\theta[i]$大不相同,并用它來追蹤一些求導計算是否正確,經過一些調試,最終結果會是這種非常小的值(\(10^{-7}\)),那么,的實施可能是正確的。
在實施神經網絡時,經常需要執行foreprop和backprop,然后可能發現這個梯度檢驗有一個相對較大的值,會懷疑存在bug,然后開始調試,調試,調試,調試一段時間后,得到一個很小的梯度檢驗值,現在可以很自信的說,神經網絡實施是正確的。
總結
以上是生活随笔為你收集整理的神经网络优化篇:详解梯度检验(Gradient checking)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【scikit-learn基础】--『监
- 下一篇: STM32CubeMX教程6 TIM 通