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