聊一聊深度学习的activation function
轉(zhuǎn)載自:https://zhuanlan.zhihu.com/p/25110450
TLDR (or the take-away)
優(yōu)先使用ReLU (Rectified Linear Unit) 函數(shù)作為神經(jīng)元的activation function:
背景
深度學習的基本原理是基于人工神經(jīng)網(wǎng)絡,信號從一個神經(jīng)元進入,經(jīng)過非線性的activation function,傳入到下一層神經(jīng)元;再經(jīng)過該層神經(jīng)元的activate,繼續(xù)往下傳遞,如此循環(huán)往復,直到輸出層。正是由于這些非線性函數(shù)的反復疊加,才使得神經(jīng)網(wǎng)絡有足夠的capacity來抓取復雜的pattern,在各個領(lǐng)域取得state-of-the-art的結(jié)果。顯而易見,activation function在深度學習中舉足輕重,也是很活躍的研究領(lǐng)域之一。目前來講,選擇怎樣的activation function不在于它能否模擬真正的神經(jīng)元,而在于能否便于優(yōu)化整個深度神經(jīng)網(wǎng)絡。下面我們簡單聊一下各類函數(shù)的特點以及為什么現(xiàn)在優(yōu)先推薦ReLU函數(shù)。
Sigmoid函數(shù)
Sigmoid函數(shù)是深度學習領(lǐng)域開始時使用頻率最高的activation function。它是便于求導的平滑函數(shù),其導數(shù)為,這是優(yōu)點。然而,Sigmoid有三大缺點:
- 容易出現(xiàn)gradient vanishing
- 函數(shù)輸出并不是zero-centered
- 冪運算相對來講比較耗時
優(yōu)化神經(jīng)網(wǎng)絡的方法是Back Propagation,即導數(shù)的后向傳遞:先計算輸出層對應的loss,然后將loss以導數(shù)的形式不斷向上一層網(wǎng)絡傳遞,修正相應的參數(shù),達到降低loss的目的。 Sigmoid函數(shù)在深度網(wǎng)絡中常常會導致導數(shù)逐漸變?yōu)?,使得參數(shù)無法被更新,神經(jīng)網(wǎng)絡無法被優(yōu)化。原因在于兩點:(1) 在上圖中容易看出,當中較大或較小時,導數(shù)接近0,而后向傳遞的數(shù)學依據(jù)是微積分求導的鏈式法則,當前層的導數(shù)需要之前各層導數(shù)的乘積,幾個小數(shù)的相乘,結(jié)果會很接近0 (2) Sigmoid導數(shù)的最大值是0.25,這意味著導數(shù)在每一層至少會被壓縮為原來的1/4,通過兩層后被變?yōu)?/16,…,通過10層后為1/1048576。請注意這里是“至少”,導數(shù)達到最大值這種情況還是很少見的。
輸出不是zero-centered
Sigmoid函數(shù)的輸出值恒大于0,這會導致模型訓練的收斂速度變慢。舉例來講,對,如果所有均為正數(shù)或負數(shù),那么其對的導數(shù)總是正數(shù)或負數(shù),這會導致如下圖紅色箭頭所示的階梯式更新,這顯然并非一個好的優(yōu)化路徑。深度學習往往需要大量時間來處理大量數(shù)據(jù),模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網(wǎng)絡盡量使用zero-centered數(shù)據(jù) (可以經(jīng)過數(shù)據(jù)預處理實現(xiàn)) 和zero-centered輸出。
冪運算相對耗時
相對于前兩項,這其實并不是一個大問題,我們目前是具備相應計算能力的,但面對深度學習中龐大的計算量,最好是能省則省 :-)。之后我們會看到,在ReLU函數(shù)中,需要做的僅僅是一個thresholding,相對于冪運算來講會快很多。
tanh函數(shù)
tanh讀作Hyperbolic Tangent,如上圖所示,它解決了zero-centered的輸出問題,然而,gradient vanishing的問題和冪運算的問題仍然存在。ReLU函數(shù)
ReLU函數(shù)其實就是一個取最大值函數(shù),注意這并不是全區(qū)間可導的,但是我們可以取sub-gradient,如上圖所示。ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大優(yōu)點:
- 解決了gradient vanishing問題 (在正區(qū)間)
- 計算速度非常快,只需要判斷輸入是否大于0
- 收斂速度遠快于sigmoid和tanh
盡管存在這兩個問題,ReLU目前仍是最常用的activation function,在搭建人工神經(jīng)網(wǎng)絡的時候推薦優(yōu)先嘗試!
Leaky ReLU函數(shù)
人們?yōu)榱私鉀QDead ReLU Problem,提出了將ReLU的前半段設為而非0。另外一種直觀的想法是基于參數(shù)的方法,即Parametric ReLU:,其中可由back propagation學出來。理論上來講,Leaky ReLU有ReLU的所有優(yōu)點,外加不會有Dead ReLU問題,但是在實際操作當中,并沒有完全證明Leaky ReLU總是好于ReLU。
ELU (Exponential Linear Units) 函數(shù)
ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優(yōu)點,以及:
- 不會有Dead ReLU問題
- 輸出的均值接近0,zero-centered
小結(jié)
建議使用ReLU函數(shù),但是要注意初始化和learning rate的設置;可以嘗試使用Leaky ReLU或ELU函數(shù);不建議使用tanh,尤其是sigmoid函數(shù)。
參考資料
- Udacity Deep Learning Courses
- Stanford CS231n Course
總結(jié)
以上是生活随笔為你收集整理的聊一聊深度学习的activation function的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop-2.7.4 八节点分布式集
- 下一篇: 聊一聊深度学习的weight initi