深度學習網絡調試技巧

 

神經網絡的代碼,比通常的代碼要難調試很多,和編譯錯誤以及運行時程序崩潰相比,神經網絡比較棘手的地方,每每在於程序運行正常,可是結果沒法收斂,這個檢查起來可要麻煩多了。下面是根據我平時調試神經網絡的經驗,總結的一些比較通用的調試技巧,後續會再寫一篇文章,專門介紹一下theano如何進行調試,但願能對你們調試神經網絡有所幫助。html

遇到Nan怎麼辦?

Nan問題,我相信大部分人都遇到過,通常多是下面幾個緣由形成的:算法

    1. 除0問題。這裏實際上有兩種可能,一種是被除數的值是無窮大,即Nan,另外一種就是除數的值是0。以前產生的Nan或者0,有可能會被傳遞下去,形成後面都是Nan。請先檢查一下神經網絡中有可能會有除法的地方,例如softmax層,再認真的檢查一下數據。我有一次幫別人調試代碼,甚至還遇到過,訓練數據文件中,有些值就是Nan。。。這樣讀進來之後,開始訓練,只要遇到Nan的數據,後面也就Nan了。能夠嘗試加一些日誌,把神經網絡的中間結果輸出出來,看看哪一步開始出現Nan。後面會介紹Theano的處理辦法。
    2. 梯度過大,形成更新後的值爲Nan。特別是RNN,在序列比較長的時候,很容易出現梯度爆炸的問題。通常有如下幾個解決辦法。
      1. 對梯度作clip(梯度裁剪),限制最大梯度,實際上是value = sqrt(w1^2+w2^2….),若是value超過了閾值,就算一個衰減繫系數,讓value的值等於閾值: 5,10,15。
      2. 減小學習率。初始學習率過大,也有可能形成這個問題。須要注意的是,即便使用adam之類的自適應學習率算法進行訓練,也有可能遇到學習率過大問題,而這類算法,通常也有一個學習率的超參,能夠把這個參數改的小一些。
    3. 初始參數值過大,也有可能出現Nan問題。輸入和輸出的值,最好也作一下歸一化。具體方法能夠參考我以前的一篇文章:深度學習我的煉丹心得 - 煉丹實驗室 - 知乎專欄

 

神經網絡學不出東西怎麼辦?

可能咱們並無遇到,或者解決了Nan等問題,網絡一直在正常的訓練,可是cost降不下來,預測的時候,結果不正常。網絡

  1. 請打印出訓練集的cost值和測試集上cost值的變化趨勢,正常狀況應該是訓練集的cost值不斷降低,最後趨於平緩,或者小範圍震盪,測試集的cost值先降低,而後開始震盪或者慢慢上升。若是訓練集cost值不降低,有多是代碼有bug,有多是數據有問題(自己有問題,數據處理有問題等等),有多是超參(網絡大小,層數,學習率等)設置的不合理。 
    請人工構造10條數據,用神經網絡反覆訓練,看看cost是否降低,若是還不降低,那麼可能網絡的代碼有bug,須要認真檢查了。若是cost值降低,在這10條數據上作預測,看看結果是否是符合預期。那麼很大可能網絡自己是正常的。那麼能夠試着檢查一下超參和數據是否是有問題。
  2. 若是神經網絡代碼,所有是本身實現的,那麼強烈建議作梯度檢查。確保梯度計算沒有錯誤。
  3. 先從最簡單的網絡開始實驗,不要僅僅看cost值,還要看一看神經網絡的預測輸出是什麼樣子,確保能跑出預期結果。例如作語言模型實驗的時候,先用一層RNN,若是一層RNN正常,再嘗試LSTM,再進一步嘗試多層LSTM。
  4. 若是可能的話,能夠輸入一條指定數據,而後本身計算出每一步正確的輸出結果,再檢查一下神經網絡每一步的結果,是否是同樣的。
參考資料

http://russellsstewart.com/notes/0.htmlide

相關文章
相關標籤/搜索