本文來自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的深度學習模型,需要將構造模型看作一個迭代過程