生活随笔
收集整理的這篇文章主要介紹了
深度学习网络调试技巧
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
https://zhuanlan.zhihu.com/p/20792837
轉(zhuǎn)載請(qǐng)注明:煉丹實(shí)驗(yàn)室
神經(jīng)網(wǎng)絡(luò)的代碼,比一般的代碼要難調(diào)試不少,和編譯錯(cuò)誤以及運(yùn)行時(shí)程序崩潰相比,神經(jīng)網(wǎng)絡(luò)比較棘手的地方,往往在于程序運(yùn)行正常,但是結(jié)果無(wú)法收斂,這個(gè)檢查起來(lái)可要麻煩多了。下面是根據(jù)我平時(shí)調(diào)試神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn),總結(jié)的一些比較通用的調(diào)試技巧,后續(xù)會(huì)再寫(xiě)一篇文章,專門(mén)介紹一下theano如何進(jìn)行調(diào)試,希望能對(duì)大家調(diào)試神經(jīng)網(wǎng)絡(luò)有所幫助。
遇到Nan怎么辦?
Nan問(wèn)題,我相信大部分人都遇到過(guò),一般可能是下面幾個(gè)原因造成的:
除0問(wèn)題。這里實(shí)際上有兩種可能,一種是被除數(shù)的值是無(wú)窮大,即Nan,另一種就是除數(shù)的值是0。之前產(chǎn)生的Nan或者0,有可能會(huì)被傳遞下去,造成后面都是Nan。請(qǐng)先檢查一下神經(jīng)網(wǎng)絡(luò)中有可能會(huì)有除法的地方,例如softmax層,再認(rèn)真的檢查一下數(shù)據(jù)。我有一次幫別人調(diào)試代碼,甚至還遇到過(guò),訓(xùn)練數(shù)據(jù)文件中,有些值就是Nan。。。這樣讀進(jìn)來(lái)以后,開(kāi)始訓(xùn)練,只要遇到Nan的數(shù)據(jù),后面也就Nan了??梢試L試加一些日志,把神經(jīng)網(wǎng)絡(luò)的中間結(jié)果輸出出來(lái),看看哪一步開(kāi)始出現(xiàn)Nan。后面會(huì)介紹Theano的處理辦法。梯度過(guò)大,造成更新后的值為Nan。特別是RNN,在序列比較長(zhǎng)的時(shí)候,很容易出現(xiàn)梯度爆炸的問(wèn)題。一般有以下幾個(gè)解決辦法。對(duì)梯度做clip(梯度裁剪),限制最大梯度,其實(shí)是value = sqrt(w1^2+w2^2….),如果value超過(guò)了閾值,就算一個(gè)衰減系系數(shù),讓value的值等于閾值: 5,10,15。減少學(xué)習(xí)率。初始學(xué)習(xí)率過(guò)大,也有可能造成這個(gè)問(wèn)題。需要注意的是,即使使用adam之類的自適應(yīng)學(xué)習(xí)率算法進(jìn)行訓(xùn)練,也有可能遇到學(xué)習(xí)率過(guò)大問(wèn)題,而這類算法,一般也有一個(gè)學(xué)習(xí)率的超參,可以把這個(gè)參數(shù)改的小一些。初始參數(shù)值過(guò)大,也有可能出現(xiàn)Nan問(wèn)題。輸入和輸出的值,最好也做一下歸一化。具體方法可以參考我之前的一篇文章:深度學(xué)習(xí)個(gè)人煉丹心得 - 煉丹實(shí)驗(yàn)室 - 知乎專欄?
神經(jīng)網(wǎng)絡(luò)學(xué)不出東西怎么辦?
可能我們并沒(méi)有遇到,或者解決了Nan等問(wèn)題,網(wǎng)絡(luò)一直在正常的訓(xùn)練,但是cost降不下來(lái),預(yù)測(cè)的時(shí)候,結(jié)果不正常。
請(qǐng)打印出訓(xùn)練集的cost值和測(cè)試集上cost值的變化趨勢(shì),正常情況應(yīng)該是訓(xùn)練集的cost值不斷下降,最后趨于平緩,或者小范圍震蕩,測(cè)試集的cost值先下降,然后開(kāi)始震蕩或者慢慢上升。如果訓(xùn)練集cost值不下降,有可能是代碼有bug,有可能是數(shù)據(jù)有問(wèn)題(本身有問(wèn)題,數(shù)據(jù)處理有問(wèn)題等等),有可能是超參(網(wǎng)絡(luò)大小,層數(shù),學(xué)習(xí)率等)設(shè)置的不合理。?
請(qǐng)人工構(gòu)造10條數(shù)據(jù),用神經(jīng)網(wǎng)絡(luò)反復(fù)訓(xùn)練,看看cost是否下降,如果還不下降,那么可能網(wǎng)絡(luò)的代碼有bug,需要認(rèn)真檢查了。如果cost值下降,在這10條數(shù)據(jù)上做預(yù)測(cè),看看結(jié)果是不是符合預(yù)期。那么很大可能網(wǎng)絡(luò)本身是正常的。那么可以試著檢查一下超參和數(shù)據(jù)是不是有問(wèn)題。如果神經(jīng)網(wǎng)絡(luò)代碼,全部是自己實(shí)現(xiàn)的,那么強(qiáng)烈建議做梯度檢查。確保梯度計(jì)算沒(méi)有錯(cuò)誤。先從最簡(jiǎn)單的網(wǎng)絡(luò)開(kāi)始實(shí)驗(yàn),不要僅僅看cost值,還要看一看神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)輸出是什么樣子,確保能跑出預(yù)期結(jié)果。例如做語(yǔ)言模型實(shí)驗(yàn)的時(shí)候,先用一層RNN,如果一層RNN正常,再嘗試LSTM,再進(jìn)一步嘗試多層LSTM。如果可能的話,可以輸入一條指定數(shù)據(jù),然后自己計(jì)算出每一步正確的輸出結(jié)果,再檢查一下神經(jīng)網(wǎng)絡(luò)每一步的結(jié)果,是不是一樣的。參考資料
http://russellsstewart.com/notes/0.html
轉(zhuǎn)載于:https://www.cnblogs.com/DjangoBlog/p/7281491.html
總結(jié)
以上是生活随笔為你收集整理的深度学习网络调试技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。