前言:本筆記是對近日閲讀keynote“Troubleshooting Deep Neural Networks”的總結。
keynote來源:
http://josh-tobin.com/troubleshooting-deep-neural-networks
為什麼需要討論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的深度學習模型,需要將構造模型看作一個迭代過程