乾貨 | 深度學習基礎——化直為曲:激活函數

曲徑通幽處,禪房花木深 —— 《題破山寺後禪院》

唐.常建

1 引言

作為一個學通信的人來說,對激活函數的啟蒙恐怕要從《信號與系統》中的階躍函數談起,階躍信號作為一種特殊的時間函數,是一個從0跳變為1的過程。在電路分析中,階躍函數是研究動態響應電路的基礎,利用階躍函數可以進行信號處理積分變換


乾貨 | 深度學習基礎——化直為曲:激活函數

單位階躍函數

在信號處理中,可以通過階躍信號及其時延信號的線性組合進行復雜信號的表達。由於階躍函數將小於0的信號輸入置為0,大於零的信號輸入置為1,其本質也是一個非線性的變換,神經網絡的鼻祖感知機就是運用階躍函數作為其激活函數來進行模式分類。再進一步,如果將輸入信號通過級聯的方式通過多個階躍函數就構成了多層感知機模型,也就是我們所熟悉的深度神經網絡的雛形。

2 為什麼需要激活函數(激活層)?

這個在很多博客中都有介紹,首先深度學習想要學習到的函數不是簡單的線性關係,而是複雜的非線性關係,需要有非線性變換,而深度神經網絡中的卷積層和池化層都是線性變換(乘的是權重矩陣,矩陣的幾何意義就是線性變換,無論經過多少卷積層都是線性的),因此要給深度學習增加非線性的話,就需要非線性層,就是我們所說的激活層。

3 理想激活函數

很多博客,上來就是介紹幾種激活函數,還有他們的優缺點,沒有從一個更高的視角來審視激活函數本質。我也是看了CS231n上的解釋才徹底明白不同激活函數所遵從的設計思想,明白了設計思想就能對不同激活函數進行分析,同時也可以根據自己的任務特點選用甚至是設計自己的激活函數。本文從以下兩個方面介紹激活函數:什麼樣的函數可以做激活函數、什麼樣的函數是好的激活函數。

3.1 什麼樣的函數可以做激活函數?

  • 有界、單增且連續

前面已經說過,激活函數是為了增加深度學習的非線性,因此激活函數必須要是非線性函數。訓練深度神經網絡目的就是找到一個複合函數,有足夠的建模能力。實踐證明,其實只要激活函數選擇得好,神經元足夠多,包含一個隱層的3層神經網絡就可以實現對輸入信號到輸出信號映射關係的逼近,這符合萬能逼近定理。對於萬能逼近定理,其要求函數必須是

非常數、有界、單調遞增並且連續

  • 幾乎處處可導

然而只滿足有界、單增且連續可不行,由於在神經網絡中往往使用BP算法進行參數更新,因此激活函數又必須是可導的。理論和工程實現總是需要相互權衡,在實際應用中,往往只需要要求激活函數“幾乎處處可導”就可以了,比如常用的ReLU函數在零點處就不可導。

3.2 什麼樣的函數是好的激活函數?

  • 零對稱性

我們都知道,tanh激活函數是以0為中心的中心對稱函數,sigmoid函數是以0.5為中心的中心對稱函數。因此tanh在後來取代了sigmoid函數。那麼為什麼零對稱要更好呢?可以參考談談激活函數以零為中心的問題(
https://liam.page/2018/04/17/zero-centered-active-function/),主要原因是非零中心的函數sigmoid函數輸出總為正值,即所有維度的輸出都為正值,所有梯度的更新方向總是向正或者向負,導致梯度更新的Z字走向,更新緩慢。

乾貨 | 深度學習基礎——化直為曲:激活函數

梯度更新Z字走向

從反面看,這也是為什麼我們期望每層的輸入的信號都是零對稱的原因,從而有了批歸一化層的提出。(題外話)

  • 無飽和區域

BP算法計算誤差項時每一層都要乘以激活函數的導數。如果激活函數導數的絕對值小於1,那麼多次連乘後誤差項就會很快衰減到0,從而導致權重沒有得到有效更新,這就是所謂的梯度消失

乾貨 | 深度學習基礎——化直為曲:激活函數

sigmoid函數的飽和區


對於sigmoid和tanh激活函數而言,都存在左右飽和區,從而有梯度消失的問題。

  • 梯度計算高效

對於深度學習,訓練速度一直是個痛點。因此設計梯度計算高效的激活函數對訓練速度的提升有較大的幫助。對於sigmoid和tanh函數而言,它們的梯度計算需要涉及指數運算,計算複雜度高,相反ReLU函數就相當簡單。

4 常見激活函數優缺點

我們如果從上文的零對稱非飽和區域梯度計算高效三個特性來看常見的激活函數,就比較容易理解激活函數的發展史。

  • sigmoid


乾貨 | 深度學習基礎——化直為曲:激活函數


乾貨 | 深度學習基礎——化直為曲:激活函數

sigmoid


缺點:非零對稱、有飽和區(容易梯度消失)、梯度計算複雜度高


  • tanh


乾貨 | 深度學習基礎——化直為曲:激活函數


乾貨 | 深度學習基礎——化直為曲:激活函數

tanh


優點:零對稱

缺點:有飽和區(容易梯度消失)、梯度計算複雜度高

  • ReLU


乾貨 | 深度學習基礎——化直為曲:激活函數


乾貨 | 深度學習基礎——化直為曲:激活函數

ReLU


優點:右半軸無飽和區(不會梯度消失)、梯度計算高效(收斂快)

缺點:非零對稱、負半軸永遠不會被激活(權重初始化不好會導致某些神經元dead)

  • Leaky ReLU


乾貨 | 深度學習基礎——化直為曲:激活函數


乾貨 | 深度學習基礎——化直為曲:激活函數

Leaky ReLU


優點:不會飽和(兩邊都不會)、梯度計算高效(收斂快)、不會出現dead神經元


5 激活函數使用建議

  • 使用ReLu,設定合適的學習率
  • 嘗試Leaky ReLU
  • 嘗試tanh,但不期待它
  • 不使用sigmoid


分享到:


相關文章: