1. 程式人生 > >聊一聊深度學習的activation function

聊一聊深度學習的activation function

TLDR (or the take-away)

優先使用ReLU (Rectified Linear Unit) 函式作為神經元的activation function:

\text{ReLU} = \max(0, x)

背景

深度學習的基本原理是基於人工神經網路,訊號從一個神經元進入,經過非線性的activation function,傳入到下一層神經元;再經過該層神經元的activate,繼續往下傳遞,如此迴圈往復,直到輸出層。正是由於這些非線性函式的反覆疊加,才使得神經網路有足夠的capacity來抓取複雜的pattern,在各個領域取得state-of-the-art的結果。顯而易見,activation function在深度學習中舉足輕重,也是很活躍的研究領域之一。目前來講,選擇怎樣的activation function不在於它能否模擬真正的神經元,而在於能否便於優化整個深度神經網路。下面我們簡單聊一下各類函式的特點以及為什麼現在優先推薦ReLU函式。

Sigmoid函式

\sigma(x) = \frac{1}{1 + e^{-x}}

Sigmoid函式是深度學習領域開始時使用頻率最高的activation function。它是便於求導的平滑函式,其導數為\sigma(x)(1 - \sigma(x)),這是優點。然而,Sigmoid有三大缺點:

  • 容易出現gradient vanishing
  • 函式輸出並不是zero-centered
  • 冪運算相對來講比較耗時
Gradient Vanishing

優化神經網路的方法是Back Propagation,即導數的後向傳遞:先計算輸出層對應的loss,然後將loss以導數的形式不斷向上一層網路傳遞,修正相應的引數,達到降低loss的目的。 Sigmoid函式在深度網路中常常會導致導數逐漸變為0,使得引數無法被更新,神經網路無法被優化。原因在於兩點:(1) 在上圖中容易看出,當\sigma(x)

x較大或較小時,導數接近0,而後向傳遞的數學依據是微積分求導的鏈式法則,當前層的導數需要之前各層導數的乘積,幾個小數的相乘,結果會很接近0 (2) Sigmoid導數的最大值是0.25,這意味著導數在每一層至少會被壓縮為原來的1/4,通過兩層後被變為1/16,…,通過10層後為1/1048576。請注意這裡是“至少”,導數達到最大值這種情況還是很少見的。

輸出不是zero-centered

Sigmoid函式的輸出值恆大於0,這會導致模型訓練的收斂速度變慢。舉例來講,對\sigma(\sum_i w_i x_i + b),如果所有x_i均為正數或負數,那麼其對w_i的導數總是正數或負數,這會導致如下圖紅色箭頭所示的階梯式更新,這顯然並非一個好的優化路徑。深度學習往往需要大量時間來處理大量資料,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網路儘量使用zero-centered資料 (可以經過資料預處理實現) 和zero-centered輸出。

冪運算相對耗時

相對於前兩項,這其實並不是一個大問題,我們目前是具備相應計算能力的,但面對深度學習中龐大的計算量,最好是能省則省 :-)。之後我們會看到,在ReLU函式中,需要做的僅僅是一個thresholding,相對於冪運算來講會快很多。

tanh函式

\text{tanh}\ x = \frac{e^x - e^{-x}}{e^x + e^{-x}}tanh讀作Hyperbolic Tangent,如上圖所示,它解決了zero-centered的輸出問題,然而,gradient vanishing的問題和冪運算的問題仍然存在。

ReLU函式

\text{ReLU} = \max(0, x)

ReLU函式其實就是一個取最大值函式,注意這並不是全區間可導的,但是我們可以取sub-gradient,如上圖所示。ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:

  • 解決了gradient vanishing問題 (在正區間)
  • 計算速度非常快,只需要判斷輸入是否大於0
  • 收斂速度遠快於sigmoid和tanh
ReLU也有幾個需要特別注意的問題:
  1. ReLU的輸出不是zero-centered
  2. Dead ReLU Problem,指的是某些神經元可能永遠不會被啟用,導致相應的引數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的引數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中引數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設定太大或使用adagrad等自動調節learning rate的演算法。

儘管存在這兩個問題,ReLU目前仍是最常用的activation function,在搭建人工神經網路的時候推薦優先嚐試!

Leaky ReLU函式

f(x) = \max(0.01x, x)

人們為了解決Dead ReLU Problem,提出了將ReLU的前半段設為0.01x而非0。另外一種直觀的想法是基於引數的方法,即Parametric ReLU:f(x) = \max(\alpha x, x),其中\alpha可由back propagation學出來。理論上來講,Leaky ReLU有ReLU的所有優點,外加不會有Dead ReLU問題,但是在實際操作當中,並沒有完全證明Leaky ReLU總是好於ReLU。

ELU (Exponential Linear Units) 函式

f(x)= \begin{cases}   x,& \text{if } x > 0\\           \alpha(e^x - 1),         & \text{otherwise}\end{cases}

ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:

  • 不會有Dead ReLU問題
  • 輸出的均值接近0,zero-centered
它的一個小問題在於計算量稍大。類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。

小結

建議使用ReLU函式,但是要注意初始化和learning rate的設定;可以嘗試使用Leaky ReLU或ELU函式;不建議使用tanh,尤其是sigmoid函式。

參考資料

  • Udacity Deep Learning Courses
  • Stanford CS231n Course
原文地址: https://zhuanlan.zhihu.com/p/25110450