Lecture6的內容比較多,稍微複雜一點,但是在實際操作中都是非常有用的知識點。
結合視頻課件還有課堂筆記可以比較好的理解這章的內容,我寫這篇文章是爲了梳理一下自己的理解,也方便自己以後回顧。
目錄
Activation Functions
Data Preprocessing
Weight Initialization
Batch Normalization
Babysitting the Learning Process
Hyperparameter Optimization
Activation Functions(激活函數)
Sigmoid
數學公式:
圖形:
優點:可以將數據擠壓到(0,1)的輸出,具有比較好的激活性
缺點:
sigmoid函數飽和使梯度消失。在輸入值比較大或者比較小的情況下sigmoid的導數使趨近於0,使得w梯度消失,從而不能有效的進行梯度下降。所以我們必須小心的初始化w,防止輸入的值過大或者過小。
sigmoid函數輸出不是以0爲中心的。會導致梯度下降時以z字形下降,效率不高。
分析一下爲何函數輸出不是以0爲中心會導致梯度下降效率降低。
假設,表示loss函數,,那麼可以得到
,
我們知道的值在0到1之間,所以肯定大於0,對於而言是常數,所以如果都爲正數(對於sigmoid而言計算出來的下一層的輸入都爲正數,就是非0爲中心的輸出),那麼必定同爲正數或者負數。
假設對這種情況下,我們的最優解是需要增加,需要減少,但是是同符號的,所以必定會以一種類似z的路徑下降。
exp的計算消耗稍微有點大。這個是很小的問題,因爲卷積運算本身計算消耗也是非常大的。
tanh
數學公式:
圖形:
優點:將數據壓縮在了(-1,1)之間,輸出是以0爲中心
缺點:當輸入很大或者很小的時候梯度會消失,exp的計算消耗。
ReLU
數學公式:
圖形:
優點:1.計算簡單,消耗小。2.收斂速度快。3.梯度不會飽和
缺點:1.不是以0爲中心的輸出。2.在訓練中小於0的數據會”死掉“。
如果輸入數據小於了0,那麼這部分數據會死掉也不能再被激活,如果學習率設置的太高可能會導致40%的神經元都死掉。小心的設置學習率可以改善這個問題。
Leaky ReLU
數學公式:,是超參數,可以取值爲0.1或者0.01之類。
圖形:
優點:相對ReLU,多了一個優點,不會有神經元死掉。
還有一個PReLU,就是作爲參數來學習,而不是像Leaky ReLU一樣作爲超參數來預設。
ELU
數學公式:
圖形:
優點:1.所有ReLU的優點。2.類似於0中心化。3.相對Leaky ReLU負數區域的梯度消失前增加了一個魯棒的干擾
缺點:1.計算有指數計算
Maxout ”Neuron“
數學公式:
優點: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會發生什麼情況?
,因爲,所以
如果,那麼,
所以可以推導出,後面的梯度更新也會得到一樣的值,最後的效果是相當於我們只有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,然後給每一層一點自我學習的能力增加了和這兩個可以學習的參數,如果爲輸入數據的標準差,爲輸入數據的均值,那麼就相當於歸一化爲了高斯分佈,但是增加了這兩個參數不爲標準差和均值時,數據就會稍微不同於高斯分佈,這樣每一層數據可以稍微調整,擁有自己的特色。
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下降的影響,然後一點點調整。
所有參數以外的配置都是超參數,需要自己進行調整,比如:網絡結構,學習率,正則化方式等。
就像調音師,需要一點一點的調整來達到最好的效果。
總結:
- 激活函數用ReLU
- 輸入預處理用減去均值的方式
- 參數初始化使用Xavier
- BN要使用