使用神經網路:調試清單

使用神經網路:調試清單

機器學習軟體產品的程式碼通常很複雜且相當混亂。 檢測並消除其中的錯誤是一項資源密集型任務。 即使是最簡單的 前饋神經網絡 需要認真看待網路架構、權重初始化和網路優化。 一個小錯誤可能會導致不愉快的問題。

本文介紹的是一種用於調試神經網路的演算法。

技能箱推薦: 實踐課程 從零開始的Python開發者.

提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。

此演算法由五個階段組成:

  • 輕鬆開始;
  • 確認損失;
  • 檢查中間結果和連接;
  • 參數診斷;
  • 對工作的控制。

如果您覺得某些內容比其他內容更有趣,您可以立即跳到這些部分。

輕鬆開始

具有複雜架構、正則化和學習率調度器的神經網路比常規網路更難調試。 我們在這裡有點棘手,因為這一點本身與調試間接相關,但這仍然是一個重要的建議。

一個簡單的開始是創建一個簡化的模型並在一組(點)資料上進行訓練。

首先我們創建一個簡化的模型

為了快速開始,我們創建一個具有單一隱藏層的小型網絡,並檢查一切是否正常運作。 然後我們逐漸使模型複雜化,檢查其結構的每個新面向(附加層、參數等),然後繼續。

我們在一組(點)資料上訓練模型

作為對專案的快速健全性檢查,您可以使用一到兩個資料點進行訓練,以確認系統是否正常運作。 神經網路必須在訓練和測試中表現出 100% 的準確性。 如果情況並非如此,則要么模型太小,要么您已經存在錯誤。

即使一切順利,也要在繼續之前為一個或多個時期準備好模型。

損失評估

損失估計是完善模型效能的主要方法。 您需要確保損失適合問題,並且損失函數按照正確的尺度進行評級。 如果您使用多種損失類型,請確保它們的階數相同且比例正確。

注意初始損失很重要。 如果模型以隨機猜測開始,請檢查實際結果與預期結果的接近程度。 在 安德烈·卡帕蒂 (Andrey Karpathy) 的研究顯示::「當您從少量參數開始時,請確保獲得預期的結果。 最好立即檢查資料遺失情況(將正則化程度設為零)。 例如,對於具有 Softmax 分類器的 CIFAR-10,我們預期初始損失為 2.302,因為每個類別的預期擴散機率為 0,1(因為有 10 個類別),而 Softmax 損失是正確類別的負對數似然as − ln (0.1) = 2.302。”

對於二進位範例,只需對每個類別進行類似的計算。 例如,這裡的數據是:20% 為 0,80% 為 1。 預期初始損失將高達 –0,2ln (0,5) –0,8ln (0,5) = 0,693147。 如果結果大於1,則可能表示神經網路權重未適當平衡或數據未標準化。

檢查中間結果和連接

要調試神經網絡,有必要了解網絡內過程的動態以及各個中間層連接時的作用。 以下是您可能遇到的常見錯誤:

  • gradle 更新的表達式不正確;
  • 不應用權重更新;
  • 梯度爆炸。

如果梯度值為零,這表示優化器中的學習速率太慢,或者您遇到更新梯度的不正確表達式。

此外,還需要監控每一層的激活函數、權重和更新的值。 例如,參數更新的幅度(權重和偏差) 應該是 1-e3.

有一種現象稱為“Dying ReLU”或 “梯度消失問題”,當 ReLU 神經元在學習其權重的大負偏差值後將輸出零。 這些神經元在數據中的任何點都不會再次被激發。

您可以使用梯度檢查來透過使用數值方法近似梯度來識別這些錯誤。 如果它接近計算的梯度,則反向傳播已正確實現。 若要建立梯度檢查,請查看 CS231 中的這些優秀資源 這裡 и 這裡,以及與 安德魯·恩加(Andrew Nga)談到了這個話題。

費贊·謝赫 表示可視化神經網路的三種主要方法:

  • 預備部分是簡單的方法,向我們展示訓練模型的一般結構。 其中包括神經網路各層的形狀或濾波器的輸出以及每層內的參數。
  • 基於激活。 在其中,我們破解單一神經元或神經元組的活化以了解它們的功能。
  • 基於梯度。 這些方法傾向於操縱由模型訓練的前向和後向傳遞形成的梯度(包括顯著性圖和類別激活圖)。

有幾種有用的工具可用於視覺化各個層的激活和連接,例如 康X и 張量板.

使用神經網路:調試清單

參數診斷

神經網路有很多相互影響的參數,這使得最佳化變得複雜。 實際上,本節是專家積極研究的主題,因此以下建議僅應被視為建議和建構的起點。

包裝尺寸 (批量大小)- 如果您希望批量大小足夠大以獲得準確的誤差梯度估計,但又足夠小以便隨機梯度下降 (SGD) 能夠正則化您的網路。 小批量會因為訓練過程中的雜訊而導致快速收斂,導致最佳化困難。 這有更詳細的描述 這裡.

學習率 - 太低將導致收斂緩慢或陷入局部最小值的風險。 同時,高學習率會導致最佳化發散,因為你可能會跳過損失函數深而窄的部分。 在訓練神經網路時嘗試使用速度調度來減少它。 已更新至 CS231n 有很大一部分專門討論這個問題.

漸變剪裁  — 在反向傳播期間以最大值或邊際範數修剪參數梯度。 對於解決第三點中可能遇到的任何梯度爆炸問題很有用。

批量歸一化 - 用於對每一層的輸入資料進行歸一化,這使我們能夠解決內部協變量偏移的問題。 如果您同時使用 Dropout 和 Batch Norma, 查看這篇文章.

隨機梯度下降 (SGD) — SGD 有多種使用動量、自適應學習率和 Nesterov 方法的變體。 然而,它們在學習效率和泛化能力方面都沒有明顯的優勢(詳細資訊在這裡).

正規化 - 對於建立可推廣的模型至關重要,因為它會增加模型複雜性或極端參數值的懲罰。 這是一種減少模型變異數而不顯著增加其偏差的方法。 更多的 詳細資訊 - 這裡.

要自行評估一切,您需要停用正規化並自行檢查資料遺失梯度。

輟學 是簡化網路以防止擁塞的另一種方法。 在訓練期間,僅透過以一定機率p(超參數)維持神經元的活動或在相反情況下將其設為零來進行dropout。 因此,網路必須為每個訓練批次使用不同的參數子集,從而減少某些成為主導參數的變化。

重要提示:如果您同時使用 dropout 和批次歸一化,請注意這些操作的順序,甚至將它們一起使用。 這一切仍在積極討論和補充中。 以下是關於這個主題的兩個重要討論 在 Stackoverflow 上 и 的arXiv.

工作控制

這是關於記錄工作流程和實驗。 如果您不記錄任何內容,您可能會忘記例如使用的學習率或類別權重。 透過控制,您可以輕鬆查看和重現先前的實驗。 這可以讓您減少重複實驗的數量。

然而,在工作量很大的情況下,手動記錄可能會成為一項艱鉅的任務。 這就是像 Comet.ml 這樣的工具可以幫助您自動記錄資料集、程式碼變更、實驗歷史記錄和生產模型的地方,包括有關模型的關鍵資訊(超參數、模型效能指標和環境資訊)。

神經網路可能對微小的變化非常敏感,這將導致模型效能下降。 追蹤和記錄您的工作是標準化您的環境和建模的第一步。

使用神經網路:調試清單

我希望這篇文章可以成為您開始調試神經網路的起點。

技能箱推薦:

來源: www.habr.com

添加評論