CS231n 神經網路 第3部分: 學習和評估(上)

weixin_33890499發表於2018-08-02

神經網路 第3部分: 學習和評估(上)

1.學習

前面的部分討論了神經網路中的靜態內容:如何構建網路、資料和損失函式。這個部分將介紹網路中的動態部分:如何對引數進行學習並找到最優的超引數。

1.1 梯度檢查

理論上,進行梯度檢查就是簡單比較解析梯度和數值梯度,但是實踐中這個過程更加複雜和易出錯。下面是一些關於梯度檢查的提示、技巧和需要注意的問題:

使用中心差分公式

\frac{df(x)}{dx} = \frac{f(x + h) - f(x)}{h} \hspace{0.1in} \text{(前向差分,誤差項為} O(h) \text{)}
\frac{df(x)}{dx} = \frac{f(x) - f(x - h)}{h} \hspace{0.1in} \text{(後向差分,誤差項為} O(h) \text{)}
\frac{df(x)}{dx} = \frac{f(x + h) - f(x - h)}{2h} \hspace{0.1in} \text{(中心差分,誤差項為} O(h^2) \text{)}

上面是三種數值梯度計算方式,其中h的值非常小,實際一般大概為1e-5左右,所以中心差分擁有較小的誤差。

使用相對誤差進行比較
\frac{\mid f'_a - f'_n \mid}{\max(\mid f'_a \mid, \mid f'_n \mid)}
f'_a為解析梯度,f'_n為數值梯度,一般可參考的判斷標準為:

  • f'_a > 10^{-2},算錯了。
  • 10^{-4} < f'_a < 10^{-2},你有些不適,這很尷尬,應該是錯了。
  • 10^{-7} < f'_a < 10^{-4},如果目標函式有不可導點則可以接受,沒有誤差就偏大了。
  • f'_a < 10^{-7},算對了。

記住,當網路層數越深,相對誤差會越大。一個10層的網路,BP到前面幾層10^{-2}的誤差也許是可以接受的。

精度問題

Python3預設使用雙精度,保證17位十進位制精度。

  • 如果不知道哪裡算錯了,可以檢查下是否使用了單精度變數。
  • 當梯度值過小時,比如大概1e-10,相對誤差計算也可能過大。(計算機結構問題
  • h值不要過小,一般在1e-4到1e-6之間。

目標函式的不可導點

目標函式存在不可導點,此處無法計算解析梯度,但是數值梯度有值。比如在ReLU的0點,解析梯度為0,數值梯度則有值。這種情況很常見,ReLU和SVM中都存在不可導點。檢查少一些的資料點有利於避開不可導點,一般幾個資料點正確整批資料都沒問題,這樣使梯度檢查更有效率。

不要讓正則化項壓過資料

有一種情況需要注意,正則化項的損失蓋過了資料的損失。解決方式是每次檢查時,先檢查一次不帶正則化項的梯度,再加上正則化項檢查一次。

記得關掉隨機失活

在進行梯度檢查時,記得關掉隨機失活等不確定的影響,因為這些操作很明顯會使數值梯度產生巨大誤差。關掉這些操作將無法對它們進行梯度檢查(例如隨機失活沒有正確的反向傳播)。一個更好的辦法是在計算f(x+h)和f(x-h)和計算解析梯度前強制使用一個特定的隨機種子。

只檢查少量的維度

在實踐中可能有幾百萬個引數,在這種情況下實際只能檢查其中的一些維度而假設其它的都是正確的。需要注意的是,要保證檢查這些維度中的所有不同引數。比如沒有檢查偏差b的梯度,此時錯誤梯度可能將被忽略。

1.2 在學習之前: 合理性檢查的提示和技巧

從概率表現尋找正確的損失值

弄清楚用隨機初始化後期望的初始損失值是多少並檢驗(此時關掉正則化項)。比如使用Softmax分類器分類CIFAR-10圖片,期望的初始損失值是-ln(0.1) = 2.302。(因為隨機引數分類圖片的正確率是0.1)

第二個合理性檢查是損失值隨著正則化項增大而增大

過擬合一個小資料集

最後也是最重要的,在你訓練整個資料集之前,使用一個小的資料集(例如20個樣本)進行訓練,確保能夠達到0損失。(關掉正則化項,它會阻礙你獲得0損失)

1.3 監控學習過程

在神經網路訓練階段有很多有用的數值需要監控,這些數值的圖表能讓你直觀的感受不同超引數的影響並有效率的調整這些超引數。這些圖表的x軸一般都是epoch數(將所有樣本過一遍是一個epoch)。

損失函式

在訓練中損失值是第一重要的數值,並且在每個batch都記錄它。下面的圖表表現了不同的學習率下損失值的變化情況:

12522150-012f55a5a6321f11.jpeg
image

單獨的損失值隨時間變化的圖表如下:

[圖片上傳失敗...(image-63ceca-1533216471727)]

在上圖中,上下波動的幅度和batch的大小有關(每次梯度更新都會改進損失函式),batch的大小越大波動幅度越小。

訓練/驗證 準確率

在訓練一個分類器時第二重要的數值是訓練/驗證的準確率。這個圖表揭示了你的模型的過擬合程度。

12522150-23eb6027b92ba2e7.jpeg
image

在上圖中,訓練準確率和驗證準確率之間的差距反應了模型的過擬合程度,差距越大過擬合程度越大。在過擬合時,可以增大正則化項、加大隨機失活概率或用更多資料驗證。還有一種情況是模型本身的容量不夠,這時需要增加引數使用更大的模型。

權值變化率

最後一個你可能需要跟蹤的數值是權值變化率,它的計算如下列程式碼,一個合適的變化率大概在1e-3附近。

# W是權值,dW是權值的梯度
param_scale = np.linalg.norm(W.ravel())
update = -learning_rate*dW # SGD
update_scale = np.linalg.norm(update.ravel())
W += update # 權值更新量
print update_scale / param_scale # 應該在 1e-3 附近

每層的啟用/梯度分佈

一個錯誤的初始化可以使學習過程變慢或完全停止。幸運的是,這個問題可以使用所有層的啟用/梯度直方圖觀察到。例如一個tanh神經元應該有[-1,1]的分佈,而不是全0或全部集中在-1或1附近。

視覺化第一層權值

在處理圖片畫素時,將第一層權值視覺化可能會有幫助(在SVM和Softmax作業的最後展示過)。

相關文章