前言:本筆記是對近日閲讀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順序錯誤
  • 超參數選擇,因為模型對超參數比較敏感

deepseek 工作流_deepseek 工作流

  • 數據/模型擬合

deepseek 工作流_數據_02

  • 數據集創建,常見問題如下:
  • 沒有足夠數據
  • 類別不平衡
  • 噪聲標籤
  • 訓練和測試的分佈不同

deepseek 工作流_數據集_03

DL Troubleshooting策略

deepseek 工作流_數據集_04

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

  • 選擇簡單結構

deepseek 工作流_數據集_05

  • 使用sensible配置

deepseek 工作流_數據_06

  • 對輸入歸一化

deepseek 工作流_deepseek 工作流_07

  • 簡化問題
  • 使用更小的訓練數據
  • 使用更小的圖像尺寸
  • 創建一個更簡單的合成訓練集

deepseek 工作流_數據集_08

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

deepseek 工作流_數據_09

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

deepseek 工作流_數據_10


deepseek 工作流_數據集_11

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:網格搜索

deepseek 工作流_deepseek 工作流_12


  • 優點:實現非常簡單、能夠產生好結果
  • 缺點:不高效、需要先驗知識

方法3:隨機搜索

方法4:由粗到細搜索

  • 先在大區域中找到使得結果比較好的子區域,重複上述過程
  • 優點:可以縮小非常高性能的超參數、實際使用最多的方法
  • 缺點:somewhat manual process

方法5:貝葉斯方法

  • 從預先估計參數分佈開始,包含超參數值與模型性能之間關係的概率模型,交替如下過程:使用最大化期望結果對應的超參數值進行訓練,根據訓練結果更新概率模型
  • 優點:最高效的hand-off方法以選擇超參數
  • 缺點:從頭開始難以實施、很難與現成的工具集成

結論

  • 由於錯誤種類多,深度學習debugging困難
  • 為了訓練一個沒有bug的深度學習模型,需要將構造模型看作一個迭代過程