cs231n-lecture6 神經網絡的訓練Part1

Lecture6的內容比較多,稍微複雜一點,但是在實際操作中都是非常有用的知識點。

結合視頻課件還有課堂筆記可以比較好的理解這章的內容,我寫這篇文章是爲了梳理一下自己的理解,也方便自己以後回顧。

目錄

Activation Functions

Data Preprocessing

Weight Initialization

Batch Normalization

Babysitting the Learning Process

Hyperparameter Optimization

 

Activation Functions(激活函數)

Sigmoid

數學公式\sigma (x) = \frac{1}{1+e^{-x}}

圖形

優點:可以將數據擠壓到(0,1)的輸出,具有比較好的激活性

缺點

sigmoid函數飽和使梯度消失。在輸入值比較大或者比較小的情況下sigmoid的導數使趨近於0,使得w梯度消失,從而不能有效的進行梯度下降。所以我們必須小心的初始化w,防止輸入的值過大或者過小。

sigmoid函數輸出不是以0爲中心的。會導致梯度下降時以z字形下降,效率不高。

分析一下爲何函數輸出不是以0爲中心會導致梯度下降效率降低

假設L = f(\sigma (w_1x_1+w_2x_2+b))f表示loss函數,z=w_1x_1+w_2x_2+b,那麼可以得到

dw_1 = \frac{\partial L}{\partial \sigma } \frac{\partial \sigma}{\partial z}\frac{\partial z }{\partial w_1}=\frac{\partial L}{\partial \sigma }\sigma (1-\sigma )x_1dw_2 = \frac{\partial L}{\partial \sigma } \frac{\partial \sigma}{\partial z}\frac{\partial z }{\partial w_2}=\frac{\partial L}{\partial \sigma }\sigma (1-\sigma )x_2

我們知道\sigma的值在0到1之間,所以\sigma (1-\sigma )肯定大於0,對於w_1,w_2而言\frac{\partial L}{\partial \sigma }是常數,所以如果x_1,x_2都爲正數(對於sigmoid而言計算出來的下一層的輸入都爲正數,就是非0爲中心的輸出),那麼w_1,w_2必定同爲正數或者負數。

假設對這種情況下,我們的最優解是w_1需要增加,w_2需要減少,但是w_1,w_2是同符號的,所以必定會以一種類似z的路徑下降。

exp的計算消耗稍微有點大。這個是很小的問題,因爲卷積運算本身計算消耗也是非常大的。

tanh

數學公式tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}

圖形

優點:將數據壓縮在了(-1,1)之間,輸出是以0爲中心

缺點:當輸入很大或者很小的時候梯度會消失,exp的計算消耗。

ReLU

數學公式f(x) = max(0, x)

圖形

優點:1.計算簡單,消耗小。2.收斂速度快。3.梯度不會飽和

缺點:1.不是以0爲中心的輸出。2.在訓練中小於0的數據會”死掉“。

如果輸入數據小於了0,那麼這部分數據會死掉也不能再被激活,如果學習率設置的太高可能會導致40%的神經元都死掉。小心的設置學習率可以改善這個問題。

Leaky ReLU

數學公式f(x) = max(\alpha x, x)\alpha是超參數,可以取值爲0.1或者0.01之類。

圖形

優點:相對ReLU,多了一個優點,不會有神經元死掉。

還有一個PReLU,就是\alpha作爲參數來學習,而不是像Leaky ReLU一樣作爲超參數來預設。

ELU

數學公式

圖形

優點:1.所有ReLU的優點。2.類似於0中心化。3.相對Leaky ReLU負數區域的梯度消失前增加了一個魯棒的干擾

缺點:1.計算有指數計算

Maxout ”Neuron“

數學公式f(x) = max(w_1^Tx+b_1,w_2^Tx+b_2)

優點:1.線性計算。2.不會梯度消失。3.神經元不會死掉。

缺點:參數的數量會double

總結

1.如果使用ReLU,需要小心的設置學習率

2.可以試試Leaky ReLU/Maxout/ELU

3.如果嘗試tanh不要期待太好

4.不要用sigmoid

 

數據處理

均值減法

減去數據的均值,相當於把數據雲移到以原點爲中心的位置。對於圖片而言可以對RGB分別求出均值,然後用RGB分別減去對應的均值。如果要歸一化還可以減去數據的標準差。代碼實現方式可以從下面的圖片中看到。

PCA和白化

常見的數據預處理的方式,但是在圖像中使用的很少。下面的圖片中可以看到PCA處理後的數據雲(2)和白化處理後的數據雲(3)。

總結

對圖像處理而言一般只需要中心化即可,一般不做其他的操作。

但是需要注意的是,我們的操作步驟應該是選對數據集分出train/val/test,然後通過訓練集計算出RGB的mean,在對train/val/test這些數據集都減去這個mean的值。

 

Weights初始化

不應該全0初始化。如果我們對w全部初始化爲0,就會陷入網絡對稱化的問題,使得每一層的輸入都相同,並且反向傳播的導數都相同,這樣更新也相同,如果有n個神經元就相當於縮減成了1個神經元。

下面舉個例子來說明。

有一個兩層的神經網絡,w11,w12,w13是與x1,x2,x3分別相乘輸出是a1,w21,w22,w23是與x1,x2,x3分別相乘輸出a2。h11,h12是與a1,a2分別相乘輸出y。

現在假設x是x1,x2,x3列出來的列向量。w1是將w11,w12,w13列出來的列向量,w2是將w21,w22,w23列出來的列向量。a是a1,a2的列向量,h是h11,h12的列向量。

如果w1=w2,h11=h12會發生什麼情況?

a_1=x^{T}w_1+b,a2 = x^{T}w_2+b,因爲w_1=w_2,所以a_1=a_2

dw_1=\frac{\partial L}{\partial a_1}\frac{\partial a_1}{\partial w_1}=\frac{\partial L}{\partial a_1}x

dw_2=\frac{\partial L}{\partial a_2}\frac{\partial a_2}{\partial w_2}=\frac{\partial L}{\partial a_2}x

如果L= a1*h_{11}+a2*h_{12}+b,那麼\frac{\partial L}{\partial a_1}=h_{11},\frac{\partial L}{\partial a_2}=h_{12}

所以可以推導出dw_1=dw_2,後面的梯度更新也會得到一樣的值,最後的效果是相當於我們只有a1或者a2這一個神經元。

可以用小的隨機數初始化。代碼是:W=np.random.randn(D, H) * 0.01,randn表示隨機生成的數據是符合高斯分佈的(均值爲0,標準差爲1的分佈),然後與0.01相乘後將數據縮小100倍,就生成了比較小的隨機數。爲什麼最好用比較小的隨機數呢?如果W的指都比較大,會使計算出來的結果可能接近一些激活函數的梯度飽和區域,導致梯度下降失去活性。

並不是小數值一定會有好的結果。如果神經網絡中權重值很小,那麼計算出來的梯度也會很小,這樣在很深的網絡中也會失去梯度下降的活性。

如果輸入的數據量很大,可能與W計算後輸出值的分佈的方差會增大,因此可以初始化W的時候稍作變化,W=np.random.randn(fan_in, fan_out)/sqrt(fan_in),實驗證明這種初始化方式可以提高收斂速度,推導過程參考課程筆記。另外對於ReLU激活函數有一個特殊初始化方式,W=np.random.randn(fan_in, fan_out)/sqrt(2.0/n),如果使用ReLU激活,推薦這種方式進行初始化。這種方式的初始化都叫做Xavier初始化。

偏置bias一般初始化爲0.

 

Batch Normalization

歸一化相當於對每一層的數據都進行歸一預處理,使數據均值接近0,標準差接近1,爲什麼說是接近,因爲我們會給每一層自我學習的能力帶來一點靈活性。

第一個公式將數據歸一爲均值爲0,方差爲1,然後給每一層一點自我學習的能力增加了\gamma ^{k}\beta ^{k}這兩個可以學習的參數,如果\gamma ^{k}爲輸入數據的標準差,\beta ^{k}爲輸入數據的均值,那麼就相當於歸一化爲了高斯分佈,但是增加了這兩個參數不爲標準差和均值時,數據就會稍微不同於高斯分佈,這樣每一層數據可以稍微調整,擁有自己的特色。

BN一般放在全連接或者卷積運算之後,而在激活函數之前

好處

  • 促進梯度在網絡中的傳播
  • 允許更高的學習率
  • 減少對參數初始化的強依賴
  • 有輕微的正則化效果

注意:測試階段均值和標準差不是由測試的batch計算出來的,而是使用訓練時平均均值和標準差。所以代碼中我們需要對BN接口指定是training還是test階段。否則很可能預測的結果非常不準確(在這個細節上吃過虧)

 

訓練步驟

1.預處理數據:X -= np.mean(X, axis=0), X /= np.std(X, axis=0)

2.選擇模型:定義神經網絡的層數,每一層寬度,激活函數,loss等

3.開始訓練:先迭代比較少的次數,對一些超參數做一些調整,比如learning rate等。

 

超參數的優化

用比較小的epoch來研究超參數對loss下降的影響,然後一點點調整。

所有參數以外的配置都是超參數,需要自己進行調整,比如:網絡結構,學習率,正則化方式等。

就像調音師,需要一點一點的調整來達到最好的效果。

總結:

  1. 激活函數用ReLU
  2. 輸入預處理用減去均值的方式
  3. 參數初始化使用Xavier
  4. BN要使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章