首頁 > 科技

神經網路debug太難了,這裡有六個實用技巧

2021-06-11 15:52:15

機器之心報道

編輯:Liyuan、蛋醬

神經網路的 debug 過程著實不容易,這裡是一些有所幫助的 tips。

基於神經網路的項目瓶頸通常並非對網路的實現。有時候,在編寫了所有程式碼並嘗試了一大堆超參數配置之後,網路就是無法正常工作。尤其是面對著數百萬的參數, 任何一個小變動都有可能前功盡棄。

在面對各種各樣的問題後,有人總結了一些幫助偵錯神經網路的實用 tips,希望能夠減少大家偵錯神經網路的成本。

檢查梯度問題

有時梯度是引發問題的原因。下面是幾種與梯度相關的偵錯方法:

數值計算每個權重的梯度。這通常被稱為「梯度檢查」,有助於確保正確計算梯度,其中一種方法是使用有限差分。 比較每個權重的大小和梯度的大小。要確保大小的比率是合理的。如果梯度大小遠小於權重大小,網路將花費很長時間進行訓練。如果梯度大小與權重大小大致相同或更大,網路將非常不穩定,可能根本不會訓練。檢查梯度爆炸或消失。如果梯度變為 0 或 nan/infinity,則可以確定網路沒有被正確訓練。需要首先弄清楚為什麼會發生爆炸 / 消失梯度,是否步數太大。一旦弄清楚梯度爆炸 / 消失的原因,就有各種解決方案來解決這個問題,例如新增殘差連線以更好地傳播梯度或簡單地使用較小的網路。啟用函數也會導致梯度爆炸 / 消失。如果 sigmoid 啟用函數的輸入太大,梯度將非常接近 0。隨著時間的推移檢查啟用函數的輸入,然後確保這些輸入不會導致梯度始終為 0 或很大。

檢查訓練過程

經常檢查網路的訓練進度可以節省時間。以訓練貪吃蛇遊戲為例,不是訓練網路好幾天,然後再檢查網路是否學到了什麼,而是每十分鐘用當前學到的權重運行遊戲。幾個小時後,如果我們注意到每次都在做同樣的事情並且獲得零獎勵,就知道可能有問題了,而這節省了幾天的訓練時間。

不要依賴定量輸出

如果只檢視定量輸出,我們可能會錯過有用的偵錯資訊。例如,在訓練語音翻譯網路時,比起只檢查評估函數是否在減少,更重要的是閱讀翻譯後的語音以確保它有意義;當訓練一個用於影象識別的網路時,一定要確保手動檢查網路提供的標籤。

不應該依賴定量輸出的原因有兩個:首先,評估函數中可能存在錯誤。如果只檢視錯誤評估函數輸出的數字,可能需要數週時間才能意識到出現問題。其次,在神經網路輸出中可能存在無法定量顯示的錯誤模式。我們可能會意識到某個特定單詞總是被錯誤翻譯,或者在左上象限的影象識別網路總是錯誤的。這些觀察結果反過來可以幫助找到資料處理部分的程式碼 bug,否則這些 bug 將被忽視。

嘗試小資料集

確定程式碼是否存在 bug 或資料是否難以訓練的另一種方法是首先擬合較小的資料集,比如將資料集中 100000 個訓練示例修剪成只有 100 個甚至 1 個訓練示例。如果在一個訓練示例的情況下,網路仍然有很高的測試錯誤,不能夠非常好地擬合數據,那麼幾乎可以肯定網路程式碼有問題。

嘗試更簡單的網路

如果全尺寸網路在訓練時遇到問題,可以嘗試使用層數較少的較小網路,這樣可以更快地訓練。如果較小的網路在全尺寸網路失敗的情況下成功了,則表明全尺寸模型的網路架構過於複雜。如果簡單網路和全尺寸網路都失敗,則程式碼中可能存在 bug。

試著使用框架

如果沒有使用機器學習框架編寫神經網路的程式碼,那麼可以通過在機器學習框架中編寫相同的網路架構來檢查問題何在。然後將列印語句放入非框架版本和框架版本中逐層比較輸出,直到找到列印語句出現差異的位置,即錯誤所在。如果在反向傳播期間發生錯誤,則可以從最後一層開始逐層列印權重的漸變,直到找到差異。但是此方法僅適用於網路的第一次迭代,因為由於第一次迭代輸出的差異,第二次及以後的迭代將具有不同的起點。


IT145.com E-mail:sddin#qq.com