深度學習的基本原理是基於人工神經網絡,輸入信號經過非線性的active function,傳入到下一層神經元;再經過下一層神經元的activate,繼續往下傳遞,如此循環往復,直到輸出層。正是因為這些active functions的堆砌,深度學習才被賦予了解決非線性問題的能力。當然,僅僅靠active functions還不足於使得深度學習具有"超能力",訓練過程中的優化器對於組織神經網絡中的各個神經元起到了至關重要的角色。本文簡單匯總一些常用的active functions和optimizers,不求最全,但是盡量保證簡單易懂。
Active functions
當然,在介紹這些active functions之前,先簡單匯總下active functions應該具備的性質。
- 非線性
- 可微性:當優化方法是基於梯度的時候,這個性質是必須的。
- 單調性:當激活函數是單調的時候,單層網絡能夠保證是凸函數。
- $f(x)\approx x$:當激活函數滿足這個性質的時候,如果參數的初始化是random的很小的值,那么神經網絡的訓練將會很高效;如果不滿足這個性質,那么就需要很用心的去設置初始值。
- 輸出值的范圍:當激活函數輸出值是有限的時候,基於梯度的優化方法會更加穩定,因為特征的表示受有限權值的影響更顯著;當激活函數的輸出是無限的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate.
1. sigmoid
sigmoid函數是深度學習中最基本,也是最為常見的一種激活函數。sigmoid函數公式如下:
$$f(x) = \frac{1}{1+e^{-x}}$$
sigmoid函數的導函數形式為:$g(x) = f(x)(1-f(x))$
函數曲線和導函數曲線分別如下圖所示:
sigmoid函數的優點在於函數平滑且易於求導,但是其缺點也比較突出,例如:
- 容易出現梯度彌散(具體可參考博文《[Deep Learning] 深度學習中消失的梯度》)
- 輸出不具有zero-centered性質
- 冪運算相對比較耗時
2. tanh
tanh讀作hyperbolic tangent,相對於sigmoid函數的缺點,它具有zero-centered形式的輸出,因此被認為tanh一般總是好於sigmoid,因為函數值介於[-1,1]之間,激活函數的平均值接近於0,這樣可以使得下一層的神經元學習的更好。其公式表示如下:
$$f(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}}$$
對應的導數形式為:$g(x) = 1-f(x)^2$
函數曲線和導函數曲線分別如下圖所示:
實際上tanh是sigmoid平移后的結果。因為tanh總是優於sigmoid,所以sigmoid目前基本不用,但有一個例外的場景,那就是sigmoid更適合於做二分類系統的輸出層。因為sigmoid的輸出值介於[0,1]之間,可以很容易的去表征概率。
3. ReLU
tanh和sigmoid函數的共同缺點就是當輸入特別小或者特別大時,容易引起梯度彌散或梯度爆炸。而ReLU(Rectified Linear Units)可以在一定程度上緩解梯度彌散和梯度爆炸的問題,使得深度神經網絡的訓練可以更快速地達到收斂。因此目前神經網絡中的隱含層中最為常用的默認激活函數就是ReLU了。其函數形式表示如下:
$$f(x) = \max(0, x)$$
函數和導函數曲線如下圖所示:
通過上圖可以發現,ReLU在0點是不可導的,因此ReLU在應用的時候有個小trick,在實踐的時候可以將0點的導數強制賦值為0或者1。
ReLU雖然簡單,但卻是深度學習激活函數方面幾乎最為重要的成果,它有以下幾大優點:
- 解決了梯度彌散的問題(輸出均大於0)
- 計算速度非常快,只需要判斷輸入是否大於0(閾值計算)
- 收斂速度遠快於sigmoid和tanh
但其實ReLU也不是萬能的,它的缺點可以簡單提兩點:
- 輸出不是zero-centered
- 具有dying ReLU problem
dying ReLU problem:由於ReLU特殊的函數形式,在訓練過程中某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新,而且這個問題會隨着訓練的進行持續惡化。
導致dying ReLU problem的原因主要有兩個:
- 初始化,這種概率比較小
- Learning rate太大
dying ReLU problem詳細細節可以參考這里:《What is the "dying ReLU" problem in neural networks?》
即使ReLU存在上述問題,但是ReLU目前是應用最為廣泛和實用的激活函數。
4. Leaky ReLU
Leaky ReLU就是針對dying ReLU problem而進行改進的,相對於ReLU而言,函數前半段不再為0,而是一段線性函數。用公式表達如下:
$$f(x) = \alpha x, if x < 0$$
$$f(x) = x, if x \ge 0$$
其中,參數$\alpha$一般為遠小於1的實數,比如0.01。下圖顯示了Leaky ReLU的兩種函數形式,一種$\alpha$為定值,另外一種$\alpha$為某范圍內的隨機值(也被稱為Randomized Leaky ReLU):
除了具備ReLU的所有優點以外,Leaky ReLU不存在dying ReLU problem。從理論上講,Leaky ReLU應該完全優於ReLU的性能,但是實際應用中並沒有表現可以證明Leaky ReLU絕對優於ReLU。
5. ELU
同Leaky ReLU一樣,ELU(Exponential Linear Unit)也是針對dying ReLU problem提出的。具體公式如下:
$$f(x) = \alpha (e^x-1), if x < 0$$
$$f(x) = x, if x \ge 0$$
具體函數曲線如下:
ELU也可以有效地解決dying ReLU problem,而且是近似zero-centered,但隨之而來的缺點就是ELU不再是簡單的閾值計算,計算相對ReLU稍加復雜。
Active functions匯總
下表匯總了常用的一些active functions:
Optimizers
1. batch GD & SGD & Mini-batch GD
三種梯度下降算法可以參考之前博文《[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD》
上述三種梯度下降的優化算法均存在如下問題:
-
Learning rate如果選擇的太小,收斂速度會很慢,如果太大,loss function就會在極小值處不停地震盪甚至偏離。
-
對所有參數更新時應用同樣的Learning rate,如果我們的數據是稀疏的,我們更希望對出現頻率低的特征進行大一點的更新。
-
對於非凸函數,還要避免陷於局部極小值或者鞍點處,因為鞍點周圍的error 是一樣的,所有維度的梯度都接近於0,純梯度下降很容易被困在這里。
關於鞍點的解釋:
鞍點:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。 例如下圖這個二維圖形,像個馬鞍:在x軸方向往上曲,在y軸方向往下曲,鞍點就是(0,0)。
目前對於優化器的研究基本圍繞上述三個問題進行展開。
2. Momentum
SGD算法的更新公式如下:
$$W:=W-\alpha dW$$
$$b:=b-\alpha db$$
我們可以示意化的畫出SGD優化路線圖如下:
Momentum的改進思想是針對SGD算法波動大、收斂速度慢問題,簡單來說就是防止波動,取前幾次波動的均值作為新的參數值。Momentum利用了梯度的指數加權平均數,引入了一個新的超參數$\beta$(一般取0.9),具體更新公式如下:
$$V_{dW}=\beta V_{dW}+(1-\beta)dW$$
$$V_{db}=\beta V_{db}+(1-\beta)db$$
$$W:=W-\alpha V_{dW}$$
$$b:=b-\alpha V_{db}$$
改進后的Momentum優化路線示意圖如下:
Momentum背后的物理含義可以簡單的這樣理解:
當我們將一個小球從山上滾下來時,沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。 加入這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。
3. RMSprop
RMSprop是Geoff Hinton提出的一種自適應學習率方法,全稱為Root Mean Square Prop,它的基本思想和Momentum類似,同樣引入了額外的超參數$\beta$(一般取值0.999),其更新公式如下:
$$S_{dW}=\beta S_{dW}+(1-\beta)dW^2$$
$$S_{db}=\beta S_{db}+(1-\beta)db^2$$
$$W:=W-\alpha \frac{dW}{\sqrt{S_{dW}}}$$
$$b:=b-\alpha \frac{db}{\sqrt{S_{db}}}$$
針對上述更新公式,為了防止$W$和$b$更新過程中分母項為0,一般在應用中加上特別小的一個實數$\epsilon$(一般取值為$10^{-8}$):
$$W:=W-\alpha \frac{dW}{\sqrt{S_{dW}+\epsilon}}$$
$$b:=b-\alpha \frac{db}{\sqrt{S_{db}+\epsilon}}$$
RMSprop示意圖如下:
具體關於RMSprop更詳細的講解可以參考這篇博文《機器學習中使用的神經網絡第六講筆記》
4. Adam
研究者們其實提出了很多的優化算法,可以解決一些特定的優化問題,但是很難擴展到多種神經網絡。而Momentum,RMSprop是很長時間來最經得住考研的優化算法,適合用於不同的深度學習結構。所以有人就有想法,何不將這倆的方法結合到一起呢?Adam算法,全稱Adaptive Moment Estimation,就隨即問世了。由於Adam是Momentum+RMSprop,所以需要引入兩個超參數,我們表示為$\beta_1=0.9$,$\beta_2=0.999$。
$$V_{dW}=\beta_1 V_{dW}+(1-\beta_1)dW$$
$$V_{db}=\beta_1 V_{db}+(1-\beta_1)db$$
$$S_{dW}=\beta_2 S_{dW}+(1-\beta_2)dW^2$$
$$S_{db}=\beta_2 S_{db}+(1-\beta_2)db^2$$
$$V_{dW}^{corrected}=\frac{V_{dW}}{1-\beta_{1}^t}$$
$$V_{db}^{corrected}=\frac{V_{db}}{1-\beta_{2}^t}$$
$$S_{dW}^{corrected}=\frac{S_{dW}}{1-\beta_{1}^t}$$
$$S_{db}^{corrected}=\frac{S_{db}}{1-\beta_{2}^t}$$
$$W:=W-\alpha \frac{V_{dW}}{\sqrt{S_{dW}^{corrected}}}$$
$$b:=b-\alpha \frac{V_{db}}{\sqrt{S_{db}^{corrected}}}$$
因為Adam結合上述兩種優化算法的優點於一身,所以現在經常用的是Adam優化算法。
5. 各Optimizers優化效果
除了上述三種常用的改進算法,還有例如Adagrad等Optimizer,這里就不一一介紹了,感興趣的可以去了解下各算法改進的motivation。
下面兩個圖分別展示了幾種算法在鞍點和等高線上的表現: