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