深度學習的基本原理是基於人工神經網絡,輸入信號通過非線性的active function,傳入到下一層神經元;再通過下一層神經元的activate,繼續往下傳遞,如此循環往復,直到輸出層。正是由於這些active functions的堆砌,深度學習才被賦予瞭解決非線性問題的能力。固然,僅僅靠active functions還不足於使得深度學習具備"超能力",訓練過程當中的優化器對於組織神經網絡中的各個神經元起到了相當重要的角色。本文簡單彙總一些經常使用的active functions和optimizers,不求最全,可是儘可能保證簡單易懂。html
固然,在介紹這些active functions以前,先簡單彙總下active functions應該具有的性質。算法
sigmoid函數是深度學習中最基本,也是最爲常見的一種激活函數。sigmoid函數公式以下:網絡
$$f(x) = \frac{1}{1+e^{-x}}$$app
sigmoid函數的導函數形式爲:$g(x) = f(x)(1-f(x))$dom
函數曲線和導函數曲線分別以下圖所示:iphone
sigmoid函數的優勢在於函數平滑且易於求導,可是其缺點也比較突出,例如:機器學習
tanh讀做hyperbolic tangent,相對於sigmoid函數的缺點,它具備zero-centered形式的輸出,所以被認爲tanh通常老是好於sigmoid,由於函數值介於[-1,1]之間,激活函數的平均值接近於0,這樣可使得下一層的神經元學習的更好。其公式表示以下:函數
$$f(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}}$$post
對應的導數形式爲:$g(x) = 1-f(x)^2$性能
函數曲線和導函數曲線分別以下圖所示:
實際上tanh是sigmoid平移後的結果。由於tanh老是優於sigmoid,因此sigmoid目前基本不用,但有一個例外的場景,那就是sigmoid更適合於作二分類系統的輸出層。由於sigmoid的輸出值介於[0,1]之間,能夠很容易的去表徵機率。
tanh和sigmoid函數的共同缺點就是當輸入特別小或者特別大時,容易引發梯度彌散或梯度爆炸。而ReLU(Rectified Linear Units)能夠在必定程度上緩解梯度彌散和梯度爆炸的問題,使得深度神經網絡的訓練能夠更快速地達到收斂。所以目前神經網絡中的隱含層中最爲經常使用的默認激活函數就是ReLU了。其函數形式表示以下:
$$f(x) = \max(0, x)$$
函數和導函數曲線以下圖所示:
經過上圖能夠發現,ReLU在0點是不可導的,所以ReLU在應用的時候有個小trick,在實踐的時候能夠將0點的導數強制賦值爲0或者1。
ReLU雖然簡單,但倒是深度學習激活函數方面幾乎最爲重要的成果,它有如下幾大優勢:
但其實ReLU也不是萬能的,它的缺點能夠簡單提兩點:
dying ReLU problem:因爲ReLU特殊的函數形式,在訓練過程當中某些神經元可能永遠不會被激活,致使相應的參數永遠不能被更新,並且這個問題會隨着訓練的進行持續惡化。
致使dying ReLU problem的緣由主要有兩個:
dying ReLU problem詳細細節能夠參考這裏:《What is the "dying ReLU" problem in neural networks?》
即便ReLU存在上述問題,可是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。
同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:
三種梯度降低算法能夠參考以前博文《[Machine Learning] 梯度降低法的三種形式BGD、SGD以及MBGD》
上述三種梯度降低的優化算法均存在以下問題:
Learning rate若是選擇的過小,收斂速度會很慢,若是太大,loss function就會在極小值處不停地震盪甚至偏離。
對全部參數更新時應用一樣的Learning rate,若是咱們的數據是稀疏的,咱們更但願對出現頻率低的特徵進行大一點的更新。
對於非凸函數,還要避免陷於局部極小值或者鞍點處,由於鞍點周圍的error 是同樣的,全部維度的梯度都接近於0,純梯度降低很容易被困在這裏。
關於鞍點的解釋:
鞍點:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不一樣邊。 例以下圖這個二維圖形,像個馬鞍:在x軸方向往上曲,在y軸方向往下曲,鞍點就是(0,0)。
目前對於優化器的研究基本圍繞上述三個問題進行展開。
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背後的物理含義能夠簡單的這樣理解:
當咱們將一個小球從山上滾下來時,沒有阻力的話,它的動量會愈來愈大,可是若是遇到了阻力,速度就會變小。 加入這一項,可使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就能夠加快收斂並減少震盪。
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更詳細的講解能夠參考這篇博文《機器學習中使用的神經網絡第六講筆記》
研究者們其實提出了不少的優化算法,能夠解決一些特定的優化問題,可是很難擴展到多種神經網絡。而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優化算法。
除了上述三種經常使用的改進算法,還有例如Adagrad等Optimizer,這裏就不一一介紹了,感興趣的能夠去了解下各算法改進的motivation。
下面兩個圖分別展現了幾種算法在鞍點和等高線上的表現: