深度模型不work?這有一份超全的Debug檢查清單

本文來自52CV羣友Qiao-Mu Ren的讀書筆記。原載於知乎:

https://zhuanlan.zhihu.com/p/89566632

爲什麼需要討論DL Troubleshooting?

80%-90%時間用於debug和tune,10%-20%時間用於推導數學或者實現。

模型爲什麼會表現糟糕?

  • 實現時的bug,很多深度學習bug不可見,比如模型label順序錯誤

  • 超參數選擇,因爲模型對超參數比較敏感

  • 數據/模型擬合

  • 數據集創建,常見問題如下:

    • 沒有足夠數據

    • 類別不平衡

    • 噪聲標籤

    • 訓練和測試的分佈不同

DL Troubleshooting策略

Start simple:儘可能使用最簡單的模型和數據,比如在數據的一個子集上使用LeNet

  • 選擇簡單結構

  • 使用sensible配置

  • 對輸入歸一化

  • 簡化問題

    • 使用更小的訓練數據

    • 使用更小的圖像尺寸

    • 創建一個更簡單的合成訓練集

Implement & debug:使得模型在一個batch上過擬合或者復現已知結果

最常見的5種深度學習bug:

Get your model to run

常見問題及解決方法:

  • shape mismatch、casting issue等,可以在模型創建階段使用調試器逐步調試,具體地,shape mismatch可能存在未定義形狀、錯誤形狀等問題,比如在錯誤維度求和、取平均等、忘記在卷積層後flatten張量等;casting issue中常見問題:沒有將圖像從uint8轉換到float32等。

  • Out of Memory,逐一去除內存密集型操作,具體地,常見問題如下:tensor過大(batch size過大或者太大的全連接層)、數據過多(將太大的數據集加載到內存中或爲數據集創建分配了太大的緩衝區)、拷貝錯誤(由於在同一會話中創建多個模型而導致的內存泄漏、重複創建操作(例如,在一次又一次調用的函數中))

Overfit a single batch

常見問題:

  • error上升:損失函數的符號錯誤、學習率太高、softmax使用在錯誤維度

  • error爆炸:數值問題、學習率太低

  • error震盪:數據或者標籤有誤、學習率太低

  • error不動:學習率太低、梯度沒有在整個模型傳播、過分正則化、損失函數的輸入錯誤、數據或者標籤有誤

Compare to a known result

  • 在相似數據集上評估官方提供的模型實現

  • 在benchmark上評估官方提供的模型實現

  • 非官方模型實現

  • 參考文章結果(沒有代碼)

  • 自己代碼實現在benchmark上的結果

  • 相似模型在相似數據集上的結果

  • 非常簡單的baseline,如線性迴歸

Evaluate:使用bias-variance decomposition決定下一步措施

Test error = irreducible error + bias + variance (+ distribution shift) + val overfitting (train, val, and test all come from the same distribution)

Improve model/data:如果欠擬合,使得模型更大;如果過擬合,增加數據或者添加正則化

解決欠擬合(使用順序由上到低下):

  • 使得模型變大,比如增加層數或者在每層中使用更多單元

  • 減少正則化

  • 錯誤分析

  • 選擇一個不同結構

  • 調整超參數

  • 增加特徵

解決過擬合(使用順序由上到低下):

  • 增加更多數據

  • 增加歸一化

  • 數據增強

  • 增加正則化(如dropout、L2、weight decay)

  • 錯誤分析

  • 使用一個不同結構

  • 調整超參數

  • 及時停止

  • 去除特徵

  • 減少模型大小

解決分佈轉換(distribution shift):

  • 分析測試-驗證集錯誤 & 收集更多訓練數據

  • 分析測驗-驗證集錯誤 & 合成更多訓練數據

  • 使用領域適應改變訓練和測試分佈(領域適應,使用未標註數據或者有限的標註數據,將source上的訓練結果泛化到target上)

平衡數據集

如果驗證集上的結果好於測試結果,在驗證集上過擬合。上述情況通常發生在小驗證集上或者大規模超參數調整

Tune hype-parameters:由粗到細地隨機搜索

超參數優化面臨如下問題:

網絡:多少層?如何參數初始化?卷積核大小?

優化器:batch size?學習率?beta1,beta 2?

正則化:?

方法1:人工選擇超參數

  • 需要理解算法,訓練/評估網絡,猜測一個更好的超參數值/重新評估,可以和其他方法相結合。

  • 優點:對於經驗豐富的專家,消耗非常小的計算量得到好結果

  • 缺點:需要對算法有很深的見解、非常耗時

方法2:網格搜索

  • 優點:實現非常簡單、能夠產生好結果

  • 缺點:不高效、需要先驗知識

方法3:隨機搜索

方法4:由粗到細搜索

  • 先在大區域中找到使得結果比較好的子區域,重複上述過程

  • 優點:可以縮小非常高性能的超參數、實際使用最多的方法

  • 缺點:somewhat manual process

方法5:貝葉斯方法

  • 從預先估計參數分佈開始,包含超參數值與模型性能之間關係的概率模型,交替如下過程:使用最大化期望結果對應的超參數值進行訓練,根據訓練結果更新概率模型

  • 優點:最高效的hand-off方法以選擇超參數

  • 缺點:從頭開始難以實施、很難與現成的工具集成

結論

  • 由於錯誤種類多,深度學習debugging困難

  • 爲了訓練一個沒有bug的深度學習模型,需要將構造模型看作一個迭代過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章