機器學習軟體產品的程式碼通常很複雜且相當混亂。 檢測並消除其中的錯誤是一項資源密集型任務。 即使是最簡單的
技能箱推薦: 實踐課程
從零開始的Python開發者 .提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。
此演算法由五個階段組成:
- 輕鬆開始;
- 確認損失;
- 檢查中間結果和連接;
- 參數診斷;
- 對工作的控制。
如果您覺得某些內容比其他內容更有趣,您可以立即跳到這些部分。
輕鬆開始
具有複雜架構、正則化和學習率調度器的神經網路比常規網路更難調試。 我們在這裡有點棘手,因為這一點本身與調試間接相關,但這仍然是一個重要的建議。
一個簡單的開始是創建一個簡化的模型並在一組(點)資料上進行訓練。
首先我們創建一個簡化的模型
為了快速開始,我們創建一個具有單一隱藏層的小型網絡,並檢查一切是否正常運作。 然後我們逐漸使模型複雜化,檢查其結構的每個新面向(附加層、參數等),然後繼續。
我們在一組(點)資料上訓練模型
作為對專案的快速健全性檢查,您可以使用一到兩個資料點進行訓練,以確認系統是否正常運作。 神經網路必須在訓練和測試中表現出 100% 的準確性。 如果情況並非如此,則要么模型太小,要么您已經存在錯誤。
即使一切順利,也要在繼續之前為一個或多個時期準備好模型。
損失評估
損失估計是完善模型效能的主要方法。 您需要確保損失適合問題,並且損失函數按照正確的尺度進行評級。 如果您使用多種損失類型,請確保它們的階數相同且比例正確。
注意初始損失很重要。 如果模型以隨機猜測開始,請檢查實際結果與預期結果的接近程度。 在
對於二進位範例,只需對每個類別進行類似的計算。 例如,這裡的數據是:20% 為 0,80% 為 1。 預期初始損失將高達 –0,2ln (0,5) –0,8ln (0,5) = 0,693147。 如果結果大於1,則可能表示神經網路權重未適當平衡或數據未標準化。
檢查中間結果和連接
要調試神經網絡,有必要了解網絡內過程的動態以及各個中間層連接時的作用。 以下是您可能遇到的常見錯誤:
- gradle 更新的表達式不正確;
- 不應用權重更新;
- 梯度爆炸。
如果梯度值為零,這表示優化器中的學習速率太慢,或者您遇到更新梯度的不正確表達式。
此外,還需要監控每一層的激活函數、權重和更新的值。 例如,參數更新的幅度(權重和偏差)
有一種現象稱為“Dying ReLU”或
您可以使用梯度檢查來透過使用數值方法近似梯度來識別這些錯誤。 如果它接近計算的梯度,則反向傳播已正確實現。 若要建立梯度檢查,請查看 CS231 中的這些優秀資源
- 預備部分是簡單的方法,向我們展示訓練模型的一般結構。 其中包括神經網路各層的形狀或濾波器的輸出以及每層內的參數。
- 基於激活。 在其中,我們破解單一神經元或神經元組的活化以了解它們的功能。
- 基於梯度。 這些方法傾向於操縱由模型訓練的前向和後向傳遞形成的梯度(包括顯著性圖和類別激活圖)。
有幾種有用的工具可用於視覺化各個層的激活和連接,例如
參數診斷
神經網路有很多相互影響的參數,這使得最佳化變得複雜。 實際上,本節是專家積極研究的主題,因此以下建議僅應被視為建議和建構的起點。
包裝尺寸 (批量大小)- 如果您希望批量大小足夠大以獲得準確的誤差梯度估計,但又足夠小以便隨機梯度下降 (SGD) 能夠正則化您的網路。 小批量會因為訓練過程中的雜訊而導致快速收斂,導致最佳化困難。 這有更詳細的描述
學習率 - 太低將導致收斂緩慢或陷入局部最小值的風險。 同時,高學習率會導致最佳化發散,因為你可能會跳過損失函數深而窄的部分。 在訓練神經網路時嘗試使用速度調度來減少它。 已更新至 CS231n
漸變剪裁 — 在反向傳播期間以最大值或邊際範數修剪參數梯度。 對於解決第三點中可能遇到的任何梯度爆炸問題很有用。
批量歸一化 - 用於對每一層的輸入資料進行歸一化,這使我們能夠解決內部協變量偏移的問題。 如果您同時使用 Dropout 和 Batch Norma,
隨機梯度下降 (SGD) — SGD 有多種使用動量、自適應學習率和 Nesterov 方法的變體。 然而,它們在學習效率和泛化能力方面都沒有明顯的優勢(
正規化 - 對於建立可推廣的模型至關重要,因為它會增加模型複雜性或極端參數值的懲罰。 這是一種減少模型變異數而不顯著增加其偏差的方法。 更多的
要自行評估一切,您需要停用正規化並自行檢查資料遺失梯度。
輟學 是簡化網路以防止擁塞的另一種方法。 在訓練期間,僅透過以一定機率p(超參數)維持神經元的活動或在相反情況下將其設為零來進行dropout。 因此,網路必須為每個訓練批次使用不同的參數子集,從而減少某些成為主導參數的變化。
重要提示:如果您同時使用 dropout 和批次歸一化,請注意這些操作的順序,甚至將它們一起使用。 這一切仍在積極討論和補充中。 以下是關於這個主題的兩個重要討論
工作控制
這是關於記錄工作流程和實驗。 如果您不記錄任何內容,您可能會忘記例如使用的學習率或類別權重。 透過控制,您可以輕鬆查看和重現先前的實驗。 這可以讓您減少重複實驗的數量。
然而,在工作量很大的情況下,手動記錄可能會成為一項艱鉅的任務。 這就是像 Comet.ml 這樣的工具可以幫助您自動記錄資料集、程式碼變更、實驗歷史記錄和生產模型的地方,包括有關模型的關鍵資訊(超參數、模型效能指標和環境資訊)。
神經網路可能對微小的變化非常敏感,這將導致模型效能下降。 追蹤和記錄您的工作是標準化您的環境和建模的第一步。
我希望這篇文章可以成為您開始調試神經網路的起點。
技能箱推薦:
- 兩年實踐課程
“我是專業網頁開發人員” .- 在線課程
《C#開發從0開始》 .- 實踐年課程
《PHP 開發者從 0 到 PRO》 .
來源: www.habr.com