只要神經元足夠,神經網絡可以以任意精度逼近任意函數。為了擬合非線性函數,需要向神經網絡中引入非線性變換,比如使用\(sigmoid\)激活函數:
\(sigmoid(x)\)可簡寫為\(\sigma(x)\),該函數可以將實數壓縮到開區間\((0,1)\)。其導數為:
函數圖像如下:
函數兩側十分平滑,兩端無限接近0和1,只有中間一段導數較大。當\(x=0\)時,其導數取最大值0.25。選擇sigmoid函數作為激活函數的優勢:1)可以引入非線性;2)容易求導;3)可以將實數壓縮至\((0,1)\)
神經網絡主要的訓練方法是BP算法,BP算法的基礎是導數的鏈式法則,也就是多個導數的乘積。而sigmoid的導數最大為0.25,且大部分數值都被推向兩側飽和區域,這就導致大部分數值經過sigmoid激活函數之后,其導數都非常小,多個小於等於0.25的數值相乘,其運算結果很小。隨着神經網絡層數的加深,梯度后向傳播到淺層網絡時,基本無法引起參數的擾動,也就是沒有將loss的信息傳遞到淺層網絡,這樣網絡就無法訓練學習了。這就是所謂的梯度消失。
梯度消失的解決方式主要有:1)使用其它激活函數,如ReLU等;2)層歸一化;3)優化權重初始化方式;4)構建新穎的網絡結構,如highway net,而capsule net意圖取消BP學習過程,釜底抽薪。
其它激活函數
激活函數對神經網絡有顯著的影響,現行常見的激活函數有ReLU、Leaky ReLU。
-
ReLU
\[f(x)=max(0,x) \]負數一側永遠為0,正數一側導數永遠為1。ReLU的優勢在於:1)不飽和;2)計算效率高;3)收斂速度快。
-
Leaky ReLU
Leaky ReLU與ReLU十分類似,只不過在負數一側並不完全抑制,而是給予一個小的導數。
實際上,由於激活函數對於神經網絡的影響巨大,對其改進和研究非常多,比如還有Maxout、PReLU等激活函數,一份實踐指南:
- 使用ReLU,並注意學習速率的調整
- 試試Leaky ReLU / Maxout
- 試試tanh,但不要抱太大希望
- 不要使用sigmoid 😃
僅供參考。這往往和數據相關,一般多試試就知道好壞了:)。參見Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)
說下對ReLU和sigmoid兩者的感悟:
- sigmoid函數在壓縮數據“幅度”方面有優勢,對於深度網絡,使用sigmoid函數可以保證數據幅度不會有問題,幅度穩住后就不會有太大失誤
- sigmoid存在梯度消失的問題,在反向傳播上有劣勢
- ReLU不會對數據做幅度壓縮,所以隨着深度網絡層數加深,數據的幅度會越來越大,最終影響模型的表現
- 但是ReLU在反向傳導時,能夠將梯度信息“完完全全”地傳遞到淺層網絡
層歸一化
也即batch normalization。論文地址:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
主要希望解決的所謂”內部協變量漂移“(internal covariate shift)問題。對於實例集合\((X,Y)\)中的輸入值\(X\)分布不可以經常發生變化,因為這不符合樣本獨立同分布(i.i.d)的假設,使得模型無法捕獲數據中的分布,穩定地學習規律。對於神經網絡這種包含多個隱層的模型,在訓練過程中,各層參數不停變化,所以各個隱層都會面對”covariate shift“的問題,這個問題不僅僅會發生在輸入層,而是在神經網絡內部都會發生,因此是”internal covariate shift“。
Batch normalization的基本思想:深層神經網絡在做非線性變換前的輸入值在訓練過程中,其分布逐漸發生偏移,之所以訓練收斂慢,一般是整體分布逐漸往非線性激活函數的兩端靠近,這導致了反向傳播時淺層神經網絡的梯度消失。而batch normalization就是通過一定的規范化手段,將每個隱層輸入的分布強行拉回到均值為0方差為1的標准正態分布上去,這使得輸入值落回到非線性激活函數”敏感“區域。這使得梯度變大,學習速度加快,大大提高收斂速度。
以sigmoid激活函數為例,說明batch normalization的作用。下圖為均值為0,方差為1的標准正態分布:
這意味着,在1個標准差范圍內,x有64%的概率落在\([-1,1]\)范圍內,x有95%的概率落在\([-2,2]\)的范圍內。
上圖為sigmoid函數的導數,在\([-2,2]\)的范圍內,sigmoid函數的導數很大,而在兩端飽和區,導數接近0。這也就意味着,經過batch normalization規范化后,輸入值x有較大概率獲得大的導數值,遠離導數飽和區,從而使得梯度變大,學習速度加快,避免了梯度消失。
但是歸一化會破壞數據的分布,使網絡的表達能力下降。因此論文中加入了兩個參數\(\gamma,\beta\),對變換后滿足均值為0方差為1的輸出的分布又進行了“恢復”。注意,新添加的兩個參數\(\gamma,\beta\)是通過訓練得到的,意為將標准化的值從標准正態分布左移右移長胖變瘦些,每個實例移動的程度不同,目的在於希望找到一個線性和非線性的平衡點,既得到非線性較強表達能力的好處,又避免太靠近非線性的飽和區域使得收斂速度變慢。
要對每個隱層神經元的激活值做batch normalization,可以想象成每個隱層前又加入了一層batch normalization隱層,其位於激活函數之前,如上圖所示。圖中的“BN”操作如下:
即首先將任意值規范化到標准正態分布\(N(0,1)\),然后利用訓練得到的參數“恢復”數據的分布。
batch normalization的優勢在於:1)大大提高訓練速度,加快收斂過程;2)batch normalization是類似於dropout的正則化方法。關於batch normalization起到正則化效果的解釋有:過擬合一般發生在數據邊緣的噪聲位置,而batch normalization將其歸一化掉了;歸一化的數據引入了噪聲,這在訓練時有一定程度的正則化效果
權值初始化
前置知識
-
方差
表征數據的離散程度。
計算公式:
\[\sigma^2=\frac{\sum(x-\mu)}{N} \]其中\(\mu\)為樣本均值。
若\(x\)服從均勻分布,即\(x\sim U(a,b)\),則\(E(x)=\frac{a+b}{2},D(x)=\frac{(b-a)^2}{12}\)
為了讓信息更好的在網絡中流動,可以使用xavier的參數初始化方法。
假設輸入數據\(x\)和參數\(w\)都滿足均值為0,標准差分別為\(\sigma_x,\sigma_w\),而且各個樣本都是獨立同分布的,則輸出為\(z_j=\sum_{i}^{n}w_i*x_i\)。根據概率公式,\(z\)的均值為0,方差為\(n*\sigma_x*\sigma_w\)。將輸入的方差\(\sigma_x\)遞推展開可得:
其中上標\(k\)表示第\(k\)層的輸入數據,\(\sigma_x,\sigma_w\)分別表示數據\(x\)和參數\(w\)的方差。
如前所述,希望輸入數據獨立同分布,以便收斂的快些,也即是要求\(\sigma_x^k\)對任意\(k\)均不變。即要求連乘內每一項都為1,即\(n^i*\sigma_w^i=1\)對任意\(i\)恆成立,即可推出參數的初始化條件為:\(\sigma_w^k=\frac{1}{n^k}\)
在后向傳播中,也希望方差保持一致,這會使得梯度更好地在神經網絡中流動。回流的梯度公式:
要使回流的方差不變,則\(n^i*\sigma_w^i=1\)對任意\(i\)恆成立,即可推出參數的初始化條件為:\(\sigma_w^k=\frac{1}{n^{k+1}}\)
通過前向和后向分析,獲得兩個參數初始化條件。注意,兩個初始化條件中的\(n\)不同,前向分析得到的\(n^{k}\)表示某隱層輸入維度,后向分析得到的\(n^{k+1}\)表示該隱層的輸出維度。將兩者雜糅,得\(\sigma_w^k=\frac{2}{n^{k+1}+n^k}\)。
希望使用均勻分布初始化權值,初始化范圍是\([-a,a]\),則該均勻分布的方差為:
兩者結合,求出\(a\),則:
則初始化范圍:\(\left[ -\sqrt{\frac{6}{n^{k+1}+n^k}},\sqrt{\frac{6}{n^{k+1}+n^k}} \right]\)
權值初始化方法,參見CNN數值——xavier(上),深度學習——MSRA初始化
調整網絡結構
-
Highway networks
又名高速公路,Highway。Highway Network主要解決的問題是,隨着網絡層數的加深,梯度信息回流造成網絡訓練的困難。論文地址:Highway Networks
上圖為是否添加highway networks結構的對比實驗,左圖是不添加highway networks結構的神經網絡,可以看到,當深度加深,訓練誤差反而上升。而右圖是添加了highway networks結構的神經網絡,深度加深而導致訓練誤差上升的問題得到了緩解。一般而言,深度神經網絡訓練困難主要是由於梯度回流受阻,當梯度傳導到較淺層時已經非常小,對較淺層的權值的擾動很小。
highway networks受LSTM啟發,增加了一個門函數,網絡的輸出由兩部分組成,分別是輸入和輸入的變形。
定義非線性變換\(H(x,W_H)\),門函數\(T(x,W_T)\),攜帶函數\(C(x,W_c)=1-T(x,W_T)\)。其中門函數可采用sigmoid函數:\(T(x)=\sigma(W_Tx+b_T)\)。則整個網絡的輸出為:
\[y=H(x,W_H)*T(x,W_T)+x*(1-T(x,W_T))\\ y=H(x,W_H)*T(x,W_T)+x*C(x,W_c) \]注意此處的乘法為element-wise multiplication。門函數\(T(x)\)、非線性變換\(H(x)\)、\(x\)與\(y\)的維度應該是相同的,如果不足,可以用0補足或者使用卷積層變化。
注意到,當門函數\(T(x)\)取極端情況時,
\[y=\left\{\begin{matrix} x,&\quad if\ T(x,W_T)=0 \\ H(x,W_H),&\quad if\ T(x,W_T)=1 \end{matrix}\right. \]其導數為:
\[\frac{\partial{y}}{\partial{x}}=\left\{\begin{matrix} I,&\quad if\ T(x,W_T)=0 \\ H'(x,W_H), &\quad if\ T(x,W_T)=1 \end{matrix}\right. \]可以看到,門函數\(T(x)\)控制着神經網絡內信息流動。前向傳播時,假設\(T(x)=0.5\)時,輸入中一半被激活轉換,一半直接進入下一層,這就是所謂“高速公路”的概念。反向傳播時,\(T(x)\)同樣控制着傳導到淺層的梯度大小,並且能夠在一定程度上阻止非線性變換的梯度\(H'(x)\)趨向於0。
-
Residual Network
又名殘差網絡,ResNet。論文地址:Deep Residual Learning for Image Recognition 。有文獻稱ResNet是上述Highway的特例,但是我沒有看到有說服力的解釋,下面是兩者的小小對比。
Highway:
\[\begin{align} y&=H(x)*T(x)+x*(1-T(x))\\ &=(H(x)-x)*T(x)+x \end{align} \]ResNet:
\[F(x)=H(x)-x \]這就是residual network,其目的和highway network一致,防止神經網絡加深導致的訓練困難、精度下降的問題。殘差網絡的一個塊如下:
希望學習非線性變換\(H(x)\),但是\(H(x)\)不易學習,增加一個恆等映射(identity mapping),將非線性變換\(H(x)\)轉換為\(F(x)+x\).兩者效果相同,但學習難度不同。
Res塊(Residual block)通過捷徑(shortcut)連接實現,通過shortcut連接將塊的輸入和輸出進行元素級別(element-wise)的疊加即可。
-
另外有直接取消BP算法過程的嘗試,比如Capsule Network,參見Capsule Network
參考文獻
【深度學習】深入理解Batch Normalization批標准化