Debug神經網路

2021-09-24 21:31:11 字數 2579 閱讀 3475

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

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

對此,在單一的工具之外,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

tensorflow -

pytorch -

mxnet -

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

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

隨機梯度下降(stochastic gradient descent ,sgd):使用動量、自適應學習率、nesterov 更新。

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

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

5. 全程跟蹤工作

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

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

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

神經網路 卷積神經網路

這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...

神經網路 卷積神經網路

1.卷積神經網路概覽 來自吳恩達課上一張,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當畫素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入,左邊的部分明亮,右邊的部分灰暗。這個學到的邊緣是權重大的寬條 都是30 表示是由亮向暗過渡,下面這個圖左邊暗...

神經網路簡介 多層神經網路

如上圖所示,該神經網路有三層。我們標記第一層 也就是輸入層 為a 1 第一層與第二層連線權重為w 1 然後第一層輸入與第一層權重的線性和為z 1 第一層神經元個數為n 1 並依次標記剩餘網路層。可以看出,存在 z l j i 1 n l a l i w l i,j a l w l j a l 1 f...