Debug神經網絡的五項基本原則

整理 | 琥珀

出品 | AI科技大本營(公衆號id:rgznai100)

很多情況下,研究人員會遇到一個問題:使用機器學習框架實現的神經網絡可能與理論模型相去甚遠。驗證這款模型是否可靠,直接方式就是不斷修正和調參。例如,在 2018 年 8 月,谷歌大腦的 Ian Goodfellow 等人,通過引入由覆蓋性引導的模糊方法(coverage-guided fuzzing,CGF),推出了一款自動爲神經網絡 debug 的開源庫 TensorFuzz。

想要調試機器學習模型其實並不容易,因爲找 bug 這個過程需要付出的代價實在太高了。即便是對於相對簡單的前饋神經網絡,研究人員也需要經常討論網絡架構、權重初始化和網絡優化等問題。

正如 Chase Robert 此前在 “如何最小化測試機器學習代碼” 的一篇文章中曾描述了這類問題:“神經網絡會繼續訓練,損失會持續減少;訓練幾小時後會收斂,但效果卻很差……”

對此,在單一的工具之外,Cecelia Shao 通過提供一種思路以表達她對調試神經網絡所遵循的五項原則:

從繁就簡

確認模型損失

檢查中間輸出和連接

診斷參數

追蹤工作

1. 從繁就簡

具有正規化和學習率(learning rate)調度器的複雜架構的神經網絡,將單一神經網絡更難調試。

首先,構建一個相對簡單的模型:構建一個具有單個隱藏層的小模型,並進行驗證;然後逐漸添加模型的複雜性,同時檢驗模型結構的每個層面(附加層、參數等)是否有效。

其次,在單個數據節點上訓練模型:可以使用一兩個訓練數據點(data point)以確認模型是否過度擬合。神經網絡應立即過度擬合,訓練準確率爲 100%,這表明模型符合;如果模型無法過度擬合這些數據點,就證明太小或存在 bug。

2. 確認模型損失

模型損失是評估模型性能的主要方式,也是模型設置重要參數以進行評估的依據,因此需要確保:

模型損失適用於任務(使用分類交叉熵損失(cross-entropy los)進行多分類問題或使用 focal loss 以解決不平衡問題);

正確衡量損失函數的重要性。如果你使用多種類型的損失函數,如 MSE、對抗性、L1、feature loss,,那麼請確保所有損失以正確的方式排序。

3. 檢查中間輸出和連接

爲了調試神經網絡,你需要理解神經網絡內部的動態、不同中間層所起的作用,以及層與層之間是如何連接起來的。不過,你可能遇到以下問題:

不正確的梯度更新表達式

權重未得到應用

梯度消失或爆發

如果梯度值爲 0,則意味着優化器中的學習率可能太小,且梯度更新的表達式不正確。

除了關注梯度的絕對值之外,還要確保監視每個層匹配的激活、權重的大小。例如,參數更新的大小(權重和偏差)應爲 1-e3。

需要指出的是,一種稱爲 “Dying ReLU” 或“梯度消失”的現象中,ReLU 神經元在學習其權重的負偏差項後將輸出爲 0。這些神經元不會在任何數據點上得到激活。

你可以採用梯度檢驗(gradient checking)通過數值方法逼近梯度以檢驗這些錯誤。如果它接近計算梯度,則正確實施反向傳播。

關於可視化神經網絡的主要方法,Faizan Shaikh 舉出了三個例子:

初始方法:展現訓練模型的整體結構,這些方法包括展示神經網絡各個層的形狀或過濾器(filters)以及每個層中的參數;

基於激活的方法:破譯單個神經元或一組神經元的激活函數;

基於梯度的方法:在訓練模型時,操作由前向或後向通道形成的梯度。

還有有許多可用的工具可用於可視化各個層的激活和連接,例如 ConX 和 Tensorboard。

4. 診斷參數

神經網絡具有大量彼此相互作用的參數,使得優化也變得非常困難。

Batch size:你希望 batch size 可大到足以準確評估誤差梯度,小到足以使隨機梯度下降(SGD)可以規範網絡。batch size 將導致學習過程在訓練過程中以噪聲成本快速瘦臉,並可能導致優化困難。

學習率(Learning rate):太低會導致收斂緩慢或陷入局部最小值的風險,太高則會導致優化發散。

機器學習框架,如 Keras、Tensorflow、PyTorch、MXNet 現在都有關於使用學習率收斂緩慢文檔或示例:

Keras

https://keras.io/callbacks/#learningratescheduler

Tensorflow -https://www.tensorflow.org/api_docs/python/tf/train/exponential_decay

PyTorch -https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html

MXNet -https://mxnet.incubator.apache.org/versions/master/tutorials/gluon/learning_rate_schedules.html

梯度剪切(Gradient clipping ):在反向傳播中,用於剪切參數梯度的最大值或最大範數。

Batch 標準化(normalization ):用於標準化每層的輸入,以對抗內部協變量移位問題。

隨機梯度下降(Stochastic Gradient Descent ,SGD):使用動量、自適應學習率、Nesterov 更新。

正則化:對於構建可推廣模型至關重要,因爲它增加了對模型複雜性或極端參數值的懲罰。同時,它顯著降低了模型的方差,並且不顯著增加偏差。

Dropout:是另一種規範網絡以防止過度擬合的技術。在訓練時,以某個概率 p(超參數)保持神經元活動來實現丟失,否則將其設置爲 0。結果,網絡必須在每個訓練 batch 中使用不同的參數子集,這減少了特定參數的變化而變得優於其他參數。

5. 全程跟蹤工作

通過對工作更好地跟蹤,可以輕鬆查看和重現之前的試驗,以減少重複工作。

不過,手動記錄信息可能很難做到且進行多次實驗,像 comet.ml 這樣的工具可以幫助自動追蹤數據集、更改代碼、實驗歷史和生產模型,包括關於模型的關鍵信息,如超參數、模型性能指標和環境細節。

神經網絡對數據、參數,甚至 packages 的微小變化都非常敏感,這導致了模型的性能下降。工作跟蹤是標準化環境和建模工作流程的第一步。

(本文爲 AI科技大本營轉載文章,轉載請微信聯繫原作者)

4月13-14日,CSDN將在北京主辦“Python開發者日(2019)”,匯聚十餘位來自阿里巴巴、IBM、英偉達等國內外一線科技公司的Python技術專家,還有數百位來自各行業領域的Python開發者,共同探討Python在不同場景下的的應用優勢和實戰經驗。掃描海報二維碼,即刻購票!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章