神經網絡的 debug 過程着實不容易,這裏是一些有所幫助的 tips。
在面對各種各樣的問題後,有人總結了一些幫助調試神經網絡的實用 tips,希望能夠減少大家調試神經網絡的成本。
檢查梯度問題
有時梯度是引發問題的原因。下面是幾種與梯度相關的調試方法:
數值計算每個權重的梯度。這通常被稱爲「梯度檢查」,有助於確保正確計算梯度,其中一種方法是使用有限差分。
比較每個權重的大小和梯度的大小。要確保大小的比率是合理的。如果梯度大小遠小於權重大小,網絡將花費很長時間進行訓練。如果梯度大小與權重大小大致相同或更大,網絡將非常不穩定,可能根本不會訓練。
檢查梯度爆炸或消失。如果梯度變爲 0 或 nan/infinity,則可以確定網絡沒有被正確訓練。需要首先弄清楚爲什麼會發生爆炸 / 消失梯度,是否步數太大。一旦弄清楚梯度爆炸 / 消失的原因,就有各種解決方案來解決這個問題,例如添加殘差連接以更好地傳播梯度或簡單地使用較小的網絡。
激活函數也會導致梯度爆炸 / 消失。如果 sigmoid 激活函數的輸入太大,梯度將非常接近 0。隨着時間的推移檢查激活函數的輸入,然後確保這些輸入不會導致梯度始終爲 0 或很大。
經常檢查網絡的訓練進度可以節省時間。以訓練貪喫蛇遊戲爲例,不是訓練網絡好幾天,然後再檢查網絡是否學到了什麼,而是每十分鐘用當前學到的權重運行遊戲。幾個小時後,如果我們注意到每次都在做同樣的事情並且獲得零獎勵,就知道可能有問題了,而這節省了幾天的訓練時間。
不要依賴定量輸出
嘗試小數據集
確定代碼是否存在 bug 或數據是否難以訓練的另一種方法是首先擬合較小的數據集,比如將數據集中 100000 個訓練示例修剪成只有 100 個甚至 1 個訓練示例。如果在一個訓練示例的情況下,網絡仍然有很高的測試錯誤,不能夠非常好地擬合數據,那麼幾乎可以肯定網絡代碼有問題。
如果全尺寸網絡在訓練時遇到問題,可以嘗試使用層數較少的較小網絡,這樣可以更快地訓練。如果較小的網絡在全尺寸網絡失敗的情況下成功了,則表明全尺寸模型的網絡架構過於複雜。如果簡單網絡和全尺寸網絡都失敗,則代碼中可能存在 bug。
如果沒有使用機器學習框架編寫神經網絡的代碼,那麼可以通過在機器學習框架中編寫相同的網絡架構來檢查問題何在。然後將打印語句放入非框架版本和框架版本中逐層比較輸出,直到找到打印語句出現差異的位置,即錯誤所在。如果在反向傳播期間發生錯誤,則可以從最後一層開始逐層打印權重的漸變,直到找到差異。但是此方法僅適用於網絡的第一次迭代,因爲由於第一次迭代輸出的差異,第二次及以後的迭代將具有不同的起點。
參考內容:https://towardsdatascience.com/debugging-tips-for-neural-networks-f7dc699d6845
推薦閱讀
(點擊標題可跳轉閱讀)
老鐵,三連支持一下,好嗎?↓↓↓
本文分享自微信公衆號 - 機器學習算法與Python實戰(tjxj666)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。