摘要:神經(jīng)網(wǎng)絡(luò)的調(diào)試基本上難于絕大多數(shù)的程序,因?yàn)榇蟛糠值纳窠?jīng)網(wǎng)絡(luò)的錯(cuò)誤不會(huì)以類型錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤顯現(xiàn),他們只是使得網(wǎng)絡(luò)難以收斂??偨Y(jié)調(diào)試神經(jīng)網(wǎng)絡(luò)花費(fèi)的勞力比調(diào)試傳統(tǒng)程序要多,因?yàn)閹缀跛械腻e(cuò)誤都會(huì)反應(yīng)成一個(gè)問題網(wǎng)絡(luò)的表現(xiàn)不夠好。
神經(jīng)網(wǎng)絡(luò)的調(diào)試基本上難于絕大多數(shù)的程序,因?yàn)榇蟛糠值纳窠?jīng)網(wǎng)絡(luò)的錯(cuò)誤不會(huì)以類型錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤顯現(xiàn),他們只是使得網(wǎng)絡(luò)難以收斂。
如果你是一個(gè)新人,這可能會(huì)讓你非常沮喪。一個(gè)有經(jīng)驗(yàn)的網(wǎng)絡(luò)訓(xùn)練者可以系統(tǒng)的克服這些困難,盡管存在著大量似是而非的錯(cuò)誤信息,比如:
你的網(wǎng)絡(luò)訓(xùn)練的不太好。
對缺少經(jīng)驗(yàn)的人來說,這個(gè)信息令人卻步;但對有經(jīng)驗(yàn)的人來說,這是一個(gè)非常好的錯(cuò)誤消息。它意味著樣板代碼已經(jīng)偏移了正確道路,而且是時(shí)候去深入發(fā)掘一下原因了。
如何應(yīng)對NaN
“為什么出現(xiàn)了NaN?”有時(shí)候,這個(gè)問題的答案很復(fù)雜。但大多數(shù)情況是,NaN在前100輪迭代中就出現(xiàn)了,這時(shí)候這個(gè)答案就非常簡單:學(xué)習(xí)率太高了。當(dāng)學(xué)習(xí)率很高的時(shí)候,在訓(xùn)練的前100輪迭代中就會(huì)出現(xiàn)NaN。嘗試不斷的把學(xué)習(xí)率除以三,直到前一百輪迭代中不再得到NaN,當(dāng)這樣的嘗試起作用的時(shí)候,就得到了不錯(cuò)的初始學(xué)習(xí)率。我的經(jīng)驗(yàn)是,最優(yōu)的學(xué)習(xí)率一般在你得到NaN的學(xué)習(xí)率的1-10倍以下。
如果是在100輪迭代后出現(xiàn)了NaN,可能有兩個(gè)更深層的原因
如果你訓(xùn)練的是RNN,請確保使用的是“梯度剪裁(clip gradient )”,這可以把全局的梯度二范數(shù)限制在一定的范圍內(nèi)。RNN傾向于在訓(xùn)練早期產(chǎn)生梯度,其中10%或者更少的batch會(huì)出現(xiàn)學(xué)習(xí)尖峰,這些尖峰上的梯度值非常大。如果沒有限制幅度,這些尖峰就可能導(dǎo)致NaN。
clip gradient工作的具體細(xì)節(jié)如下:
在solver中先設(shè)置一個(gè)clip_gradient
訓(xùn)練中會(huì)把所有權(quán)值的梯度diff相加,如果這個(gè)值大于clip gradient,就會(huì)求一個(gè)縮放因子 s = clip_gradient/sum_diff
最后將所有的權(quán)值梯度乘以這個(gè)縮放因子,這時(shí)得到的梯度才是最后的梯度信息。
如果你寫了定制化的later,這個(gè)問題很可能是由這些定制化的layer中一些除零錯(cuò)誤引發(fā)的。還有一個(gè)著名的產(chǎn)生NaN的layer就是softmax layer。 softmax的計(jì)算在分母和分子中都含有指數(shù)函數(shù)exp(x),當(dāng)inf除以inf時(shí)就會(huì)產(chǎn)生NaN。所以要確定你用的是一個(gè)穩(wěn)定版本的softmax的實(shí)現(xiàn)。
當(dāng)神經(jīng)網(wǎng)絡(luò)不再學(xué)習(xí)的時(shí)候該怎么做?
當(dāng)你不再碰到NaN的時(shí)候,很可能就會(huì)遇到這樣一種情況,你的網(wǎng)絡(luò)平滑的訓(xùn)練的幾千次,但是loss卻在前幾百個(gè)回合后不再減小。如果你是初次構(gòu)建代碼庫的話,超過2000次的等待很難給出答案。這不是因?yàn)樗芯W(wǎng)絡(luò)都能在2000次迭代內(nèi)開始學(xué)習(xí),而是因?yàn)槟阍诰幋a中引入bug的幾率很高,與其等待長時(shí)間的迭代,不如早早的進(jìn)入調(diào)試模式?,F(xiàn)在你應(yīng)該不斷縮小問題的范圍,直到你的網(wǎng)絡(luò)可以在2000次迭代內(nèi)開始學(xué)習(xí)。幸運(yùn)的是,有兩個(gè)不錯(cuò)的維度來減小復(fù)雜度:
把訓(xùn)練集的樣本量減小到10。任何一個(gè)可用的網(wǎng)絡(luò)通暢都能在幾百個(gè)迭代后過擬合十個(gè)樣本。而bug則會(huì)阻止過擬合發(fā)生。如果網(wǎng)絡(luò)仍然不能過擬合十個(gè)樣本,再次確認(rèn)樣本和label是正確對應(yīng)的。然后把batch size設(shè)為1 來檢查batch計(jì)算中的錯(cuò)誤。在code中加入一些log輸出以確保是以你期望的方式運(yùn)行的。一般來說,通過暴力排查總會(huì)找到這些錯(cuò)誤。一旦網(wǎng)絡(luò)可以擬合10個(gè)樣本,它也可以擬合100個(gè)。如果現(xiàn)在可以訓(xùn)練但不如預(yù)期,則可以進(jìn)入下一個(gè)步驟了。
解決你感興趣的問題的最簡單版本。如果你在做句子翻譯,先建立一個(gè)目標(biāo)語言的語言模型。當(dāng)上一步成功了,只給出三個(gè)源語言的單詞,嘗試著去預(yù)測翻譯的第一個(gè)詞。如果你打算從圖像中檢測物體,訓(xùn)練回歸網(wǎng)絡(luò)之前試著去分類圖像中有多少個(gè)物體。在得到網(wǎng)絡(luò)可以解決的好的子問題以及花費(fèi)最少的時(shí)間來使用代碼掛接數(shù)據(jù)之間存在著平衡點(diǎn)。創(chuàng)造力可以起到幫助作用。
為一個(gè)新的想法擴(kuò)大網(wǎng)絡(luò)的小技巧就是緩慢的縮小上述兩步中的簡化。這是坐標(biāo)上升法的一種形式,而且十分有用。一開始,你可以證明這個(gè)網(wǎng)絡(luò)可以記住少量的樣本,然后可以證明它在一個(gè)簡化版的子問題中可以在驗(yàn)證集上具有泛化能力。緩步提升難度,穩(wěn)步前進(jìn)。
有些時(shí)候你會(huì)發(fā)現(xiàn)有些問題本身十分困難,難以在2000次迭代內(nèi)完成學(xué)習(xí)。這很棒,但這也很少需要以前那些難度的問題訓(xùn)練時(shí)間的十倍以上的時(shí)間。如果真需要這么多時(shí)間,可以嘗試尋找一個(gè)中間的復(fù)雜度。
微調(diào)超參數(shù)
也許你的網(wǎng)絡(luò)現(xiàn)在開始學(xué)習(xí)東西了,但你可能發(fā)現(xiàn)它不能解決這個(gè)問題中最困難的部分。超參數(shù)的調(diào)整就是其中的關(guān)鍵。也許有人下載了一個(gè)cnn包然后在上面跑自己的數(shù)據(jù)集,并告訴你超參數(shù)的調(diào)整并不會(huì)帶來改變。你要認(rèn)識(shí)到他們在用已有的框架解決已有的問題。如果你在使用新架構(gòu)解決新問題,則必須調(diào)試超參數(shù)來獲得一個(gè)良好的配置。
可視化是關(guān)鍵。不要怕浪費(fèi)時(shí)間去寫一些好用的訓(xùn)練過程中的可視化工具。如果你還是從terminal中打印出來的loss裸眼的做可視化,那那你該考慮一下升級(jí)了。
權(quán)值初始化很重要。一般來說,大一點(diǎn)幅度的初始化權(quán)值會(huì)好一些,但太大了就會(huì)導(dǎo)致NaN。因此初始化權(quán)值應(yīng)該要和學(xué)習(xí)率一起調(diào)試。
確保權(quán)值看起來是“健康的”。要了解這是什么意思,我推薦ipython notebook打開現(xiàn)有網(wǎng)絡(luò)的權(quán)值?;ㄒ恍r(shí)間來熟悉在標(biāo)準(zhǔn)數(shù)據(jù)集(如ImageNet或Penn Tree Bank)上訓(xùn)練的成熟網(wǎng)絡(luò)中的組件的權(quán)值直方圖應(yīng)該是什么樣子。
神經(jīng)網(wǎng)絡(luò)不是對輸入的尺度不敏感的,尤其當(dāng)它使用SGD訓(xùn)練而不是其他的二階方法訓(xùn)練,因?yàn)镾GD不是一個(gè)尺度無關(guān)的方法。在確定縮放尺度之前,花點(diǎn)時(shí)間來嘗試多次縮放輸入的數(shù)據(jù)和輸出。
在訓(xùn)練結(jié)束之前減小學(xué)習(xí)率總能帶來提升。較佳的decay策略是:在k個(gè)epoch后,每n個(gè)epoch之后學(xué)習(xí)率除以1.5(k > n)。
使用超參數(shù)配置文件,也可以把超參數(shù)寫在code里。我使用https://github.com/Russell91/tensorbox 中的json文件,使用命令行加載。應(yīng)該避免因?yàn)槌瑓?shù)的問題來重構(gòu)代碼。
隨機(jī)的搜索超參數(shù)。隨機(jī)搜索可以組合出你想不到的超參數(shù)組合,?
并且能減少你考慮在已有超參數(shù)訓(xùn)練帶來什么樣的影響時(shí)花費(fèi)的大量精力。
總結(jié)
調(diào)試神經(jīng)網(wǎng)絡(luò)花費(fèi)的勞力比調(diào)試傳統(tǒng)程序要多,因?yàn)閹缀跛械腻e(cuò)誤都會(huì)反應(yīng)成一個(gè)問題:網(wǎng)絡(luò)的表現(xiàn)不夠好。盡管如此,二分查找仍然起作用。
調(diào)整問題的難度
使用少量的樣本
這兩個(gè)方法可以幫助你找到最初的問題。然后超參數(shù)調(diào)整和長時(shí)間的等待就可以解決你剩下的問題了。
原文鏈接:http://russellsstewart.com/notes/0.html
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/4449.html
摘要:斯坦福宣布使用作為計(jì)算機(jī)課程的首選語言近日,某位有年教學(xué)經(jīng)驗(yàn)的斯坦福教授決定放棄,而使用作為計(jì)算機(jī)入門課程的教學(xué)語言。斯坦福官方站點(diǎn)將它們新的課程描述為是最流行的構(gòu)建交互式的開發(fā)語言,本課程會(huì)用講解中的實(shí)例。 前端每周清單第 11 期:Angular 4.1支持TypeScript 2.3,Vue 2.3優(yōu)化服務(wù)端渲染,優(yōu)秀React界面框架合集 為InfoQ中文站特供稿件,首發(fā)地址為...
閱讀 1484·2019-08-30 15:55
閱讀 1189·2019-08-30 15:52
閱讀 1306·2019-08-29 13:53
閱讀 1479·2019-08-29 11:19
閱讀 2990·2019-08-26 13:29
閱讀 540·2019-08-26 11:33
閱讀 2609·2019-08-23 17:20
閱讀 1035·2019-08-23 14:14