調試機器學習模型的六種方法

  • 2019 年 11 月 1 日
  • 筆記

在傳統的軟件開發中,一個 bug 通常會導致程序崩潰。這對用戶來說是很煩人的,因此解決這些問題對開發人員來說很重要——當程序失敗時,開發人員可以檢查錯誤以了解原因。

在機器學習模型中,開發人員有時會遇到錯誤,但經常會在沒有明確原因的情況下導致程序崩潰。雖然這些問題可以手動調試,但機器學習模型通常由於輸出預測不佳而失敗。更糟糕的是,當模型失敗時,通常沒有信號顯示模型失敗的原因或時間。而使情況更為複雜的是,這可能是由於一些因素造成的,包括糟糕的訓練數據、高損失誤差或缺乏收斂速度。

在這篇博客文章中,我們將討論如何調試這些無聲故障,以便它們不會影響我們機器學習算法的性能。以下是我們將要介紹的內容的簡要概述:

  1. 如何發現輸入數據中的缺陷。
  2. 如何使模型從較少的數據中學到更多。
  3. 如何為訓練準備數據,避免常見陷阱。
  4. 如何尋找最優模型超參數。
  5. 如何安排學習速率以減少過擬合。
  6. 如何用權重和偏差監測訓練進度。

值得注意的是,作為一名數據科學/機器學習實踐者,你需要認識到機器學習項目失敗的原因有很多。大多數與工程師和數據科學家的技能無關(僅僅因為它不起作用並不意味着你有缺陷)。我們的收穫是,如果我們能夠儘早發現常見的陷阱或漏洞,我們可以節省時間和金錢。在金融、政府和醫療等高風險應用領域,這將是至關重要的。

01

如何發現輸入數據中的缺陷

在想知道我們的數據是否能夠勝任訓練一個好模型的任務,可以考慮兩個方面:

  • 數據能預測我們想要預測的結果嗎?
  • 有足夠的數據嗎?

為了弄清楚我們的模型是否包含預測信息,我們可以捫心自問:給定這些數據,人類能做出預測嗎?

如果一個人不能理解一幅圖像或一段文字,那麼我們的模型也不會預測出有意義的結果。如果沒有足夠的預測信息,給我們的模型增加更多的輸入並不會使它變得更好;相反,模型會過擬合,變得不太準確。

一旦我們的數據有足夠的預測信息,我們就需要弄清楚我們是否有足夠的數據來訓練一個模型來提取信號。有幾個經驗法則可以遵循:

  1. 對於分類,我們每類至少應有 30 個獨立樣本。
  2. 對於任何特徵,特別是結構化數據問題,我們至少應該有 10 個樣本。
  3. 數據集的大小與模型中參數的數量成正比。這些規則可能需要根據你的特定應用程序進行調整。如果你能利用遷移學習,那麼你可以大大減少所需樣本的數量。

02

如何使模型從較少的數據中學習更多

在許多情況下,我們只是沒有足夠的數據。在這種情況下,最好的選擇之一是擴充數據。再進一步,我們可以用自動編碼器和生成對抗網絡等生成模型生成自己的數據。

同樣,我們可以找到外部公共數據,這些數據可以在互聯網上找到。即使數據最初不是為我們的目的而收集的,我們也可以潛在地重新標記它或將其用於遷移學習。我們可以在一個大數據集上為不同的任務訓練一個模型,然後使用該模型作為任務的基礎。同樣,我們可以找到一個別人為不同任務訓練過的模型,並將其重新用於我們的任務。

重要的是,要記住,在大多數情況下,數據的質量勝過數據的數量。擁有一個小的、高質量的數據集並訓練一個簡單的模型是在訓練過程早期發現數據中問題的最佳實踐。許多數據科學家犯的一個錯誤是,他們花時間和金錢獲取一個大數據集,但後來發現他們的項目有錯誤的數據類型。

03

如何準備訓練數據並避免常見的陷阱

有三種常用方法可以預處理訓練過程的數據特徵:

  1. 標準化:確保所有數據的平均值為 0,標準偏差為 1。這是減少特徵的最常見方式。如果你懷疑數據中包含異常值,那麼它甚至更有用。
  2. 最小 — 最大重縮放:通過減去最小值,然後除以值的範圍,將所有數據的值縮放到 0 和 1 之間。
  3. 平均值規範化:確保數據的值介於(-1)和 1 之間,平均值為 0。我們減去平均值,除以數據的範圍。

然而,我們在準備特徵時,只測量測試集上的度量因子、平均值和標準差是很重要的。如果我們在整個數據集上測量這些因素,由於信息暴露,算法在測試集上的性能可能會比在實際生產中更好。

04

如何找到最優模型超參數

手動調整神經網絡模型的超參數可能非常繁瑣。這是因為當涉及到超參數調整時,沒有科學的規則可供使用。這就是為什麼許多數據科學家已經轉向自動超參數搜索,使用某種基於非梯度的優化算法。

為了了解如何在權重和偏差的情況下找到模型的最優超參數,讓我們看看 mask r-cnn 計算機視覺模型的這個例子(https://www.wandb.com/articles/mask-r-cnn-hyperparameter-experiments-with-weights-and-biases)。為了實現語義分割任務的 mask r-cnn,connor 和 trent 調整了控制模型運行方式的不同超參數(https://github.com/connorhough/Mask_RCNN/blob/master/mrcnn/config.py):學習速率、梯度剪輯歸一化、權重衰減、比例、各種損失函數的權重……他們想知道圖像的語義分割是如何進行的。由於模型使用不同的超參數進行訓練,因此他們集成了一個 imagecallback()類(https://github.com/connorhough/Mask_RCNN/blob/master/samples/coco/coco.py)來同步到 wandb。此外,他們還寫了一個腳本(https://github.com/connorhough/Mask_RCNN/blob/master/samples/coco/inspect_weights.ipynb),用於運行參數掃描,這些掃描可以適應不同的超參數或同一超參數的不同值。

他們的結果可以在 Wandb Run 頁面上找到(https://app.wandb.ai/trentwatson1/mask-rcnn/runs)。高梯度裁剪集和高學習速率可以提高模型精度,在迭代次數增加的情況下,驗證損失分數會迅速下降。

05

如何安排學習率以減少過度適應

其中最重要的超參數之一是學習速率,這是很難優化的。學習速率小導致訓練速度慢,學習速率大導致模型過度擬合。

在尋找學習速率方面,標準的超參數搜索技術不是最佳選擇。對於學習速率,最好執行一個行搜索並可視化不同學習速率的損失,因為這將使你了解損失函數的行為方式。在進行直線搜索時,最好以指數方式提高學習率。你更可能關心學習速率較小的區域。

一開始,我們的模型可能離最優解很遠,因此,我們希望儘可能快地移動。然而,當我們接近最小損失時,我們希望移動得更慢以避免超調。因此,我們應該定義一個學習速率表,以便在訓練期間根據指定的規則更新速率。

06

如何用權重和偏差監控訓練進度

調試模型的一個重要部分是,在投入大量時間訓練模型之前,先搞清楚什麼時候會出問題。wandb 提供了一種無縫的方式來可視化和跟蹤機器學習實驗。你可以搜索/比較/可視化訓練運行,分析運行時的系統使用指標,複製歷史結果,等等。

安裝完 wandb 之後,我們要做的就是在我們的訓練腳本中包含這段代碼:

import wandb  # Your custom arguments defined here  args = …  wandb.init(config=args, project=」my-project」)  wandb.config[「more」] = 「custom」  def training_loop():  while True:  # Do some machine learning  epoch, loss, val_loss = …  # Framework agnostic / custom metrics  wandb.log({「epoch」: epoch, 「loss」: loss, 「val_loss」: val_loss})

或者,我們可以將 Tensorboard 集成在一行中(https://docs.wandb.com/integrations/tensorboard):

wandb.init(sync_tensorboard=True)

TensorBoard 是 TensorFlow 擴展,它允許我們在瀏覽器中輕鬆監視模型。為了提供一個接口,我們可以從中觀察模型的進程,tensorboard 還提供了一些對調試有用的選項。例如,我們可以在訓練過程中觀察模型的權重和梯度的分佈。如果我們真的想深入研究這個模型,tensorboard 提供了一個可視化的調試器。在這個調試器中,我們可以逐步執行 tensorflow 模型並檢查其中的每個值。如果我們正在研究複雜的模型,比如變分自動編碼器,並且試圖理解複雜事物為什麼會崩潰,這一點尤其有用。

07

結論

我們現在有大量的工具可以幫助我們運行實際的機器學習項目。確保模型在部署之前能夠正常工作是至關重要的,如果不這樣做,我們會損失很多錢。希望這篇博客文章能為你提供實用的技術,使模型具有通用性,易於調試。

via:https://mc.ai/six-ways-to-debug-a-machine-learning-model/