AI知識點(1)–激活函數

  • 2019 年 12 月 31 日
  • 筆記

2019年第 84 篇文章,總第 108 篇文章 本文大約 5000 字,閱讀大約需要 15 分鐘

AI知識點(AI Knowledge)系列第一篇文章–激活函數。

本文主要的目錄如下:

  • 激活函數的定義
  • 為什麼需要激活函數
  • 常見的激活函數

1. 激活函數的定義

激活函數是神經網絡中非常重要的一個內容,神經網絡是受到生物神經網絡的啟發,在生物神經網絡中也存在着激活函數,而且激活函數決定了神經元之間是否要傳遞信號,而在人工的神經網絡中,激活函數的作用則主要是給網絡添加非線性因素,使得網絡可以逼近任意複雜的函數,一個簡單的神經元如下圖所說,其中 f 表示的就是激活函數。

如果是從數學上來定義的話,在ICML2016的一篇論文 Noisy Activation Functions中,作者將激活函數定義為一個幾乎處處可微的 h : R → R 。

另外還有以下的一些概念:a.飽和當一個激活函數h(x)滿足

時我們稱之為右飽和

當一個激活函數h(x)滿足

時我們稱之為左飽和

當一個激活函數既滿足左飽和又滿足右飽和時,我們稱之為飽和

b.硬飽和與軟飽和對任意的 x,如果存在常數 c,當?>?時恆有 ℎ′(?)=0 則稱其為右硬飽和,當x<c時恆 有ℎ′(?)=0 則稱其為左硬飽和

若既滿足左硬飽和,又滿足右硬飽和,則稱這種激活函數為硬飽和

但如果只有在極限狀態下偏導數等於0的函數,稱之為軟飽和


2. 為什麼需要激活函數

事實上這個問題應該是問為什麼需要非線性的激活函數,因為目前常用的都是非線性激活函數,原因如下:

  1. 激活函數是可以講當前特徵空間通過一定的線性映射轉換到另一個空間,讓數據能夠更好的被分類;
  2. 但神經網絡中,基本的函數 y=wx+b 就是一個線性函數,如果激活函數還是線性函數,那麼線性的組合還是線性,和單獨一個線性分類器沒有差別,是無法逼近任意函數,而實際生活中的很多問題都不是簡單的線性分類問題;
  3. 非線性激活函數可以引入非線性因素,讓神經網絡具有更強大的能力,可以真正做到逼近和表示任意的複雜的函數,解決更多複雜的問題,可以學習解決很多類型的問題,比如圖像、文本、視頻、音頻等,這也是現在深度學習被全面應用到很多傳統的機器學習問題的基礎之一

3. 常見的激活函數

3.1 常見的激活函數定義和其圖像

3.1.1 Sigmoid 激活函數

函數的公式定義, 其值域是 (0, 1)

導數為:

優點

  1. Sigmoid函數的輸出映射在 (0,1) 之間,單調連續,輸出範圍有限,優化穩定,可以用作輸出層。
  2. 求導容易。

缺點

  1. 梯度消失:注意:Sigmoid 函數趨近 0 和 1 的時候變化率會變得平坦,也就是說,Sigmoid 的梯度趨近於 0。神經網絡使用 Sigmoid 激活函數進行反向傳播時,輸出接近 0 或 1 的神經元其梯度趨近於 0。這些神經元叫作飽和神經元。因此,這些神經元的權重不會更新。此外,與此類神經元相連的神經元的權重也更新得很慢。該問題叫作梯度消失。因此,想像一下,如果一個大型神經網絡包含 Sigmoid 神經元,而其中很多個都處於飽和狀態,那麼該網絡無法執行反向傳播。
  2. 不以零為中心Sigmoid 輸出不以零為中心的,值域是 0-1
  3. 計算成本高昂exp() 函數與其他非線性激活函數相比,計算成本高昂。

因為不以 0 為中心,接下來介紹的就是以 0 為中心的一個激活函數。

3.1.2 Tanh 激活函數

公式定義如下所示,值域是 (-1, 1)

其圖像如下所示:

導數為:

在實踐中,Tanh 函數的使用優先性高於 Sigmoid 函數

優點:1.比 Sigmoid函數收斂速度更快。2.相比 Sigmoid 函數,其輸出以0為中心。缺點:

由於飽和性產生的梯度消失問題依然存在。

SigmoidTanh 都存在梯度消失問題,所以又有新的一個激活函數,這個激活函數變得非常常用,並且有了更堵哦的改進版。

3.1.3 ReLU 激活函數

函數的公式定義如下所示,值域是 [0, +∞)

其圖像如下所示:

導數是:

ReLU 激活函數,即修正線性單元函數,相比前兩個激活函數,由於其特點使得它變成目前最常用的激活函數。

優點

  1. 收斂速度更快;
  2. 相比 sigmoidtanh,計算速度更快
  3. 有效緩解了梯度消失的問題
  4. 在沒有無監督與訓練的時候,也能有較好的表現
  5. 提供了神經網絡的稀疏表達能力

缺點

  1. 不以零為中心:和 Sigmoid 激活函數類似,ReLU 函數的輸出不以零為中心。
  2. 前向傳導(forward pass)過程中,**如果 x < 0,則神經元保持非激活狀態,且在後向傳導(backward pass)中「殺死」梯度。這樣權重無法得到更新,網絡無法學習。**當 x = 0 時,該點的梯度未定義,但是這個問題在實現中得到了解決,通過採用左側或右側的梯度的方式。

relu 激活函數實際上在小於0的一邊,還是存在梯度消失問題,所以有了幾個改進版本的函數。

3.1.4 LReLU、PReLU和RReLU

LReLU

第一個改進版的 relu 函數,即 leaky relu,LReLU,函數定義如下所示:

f(x) = max(ax, x)

a=0.1

導數如下:

Leaky ReLU 的概念是:當 x < 0 時,它得到 0.1 的正梯度。

該函數一定程度上緩解了 dead ReLU 問題,但是使用該函數的結果並不連貫。儘管它具備 ReLU 激活函數的所有特徵,如計算高效、快速收斂、在正區域內不會飽和。

PReLU

Leaky ReLU 可以得到更多擴展。不讓 x 乘常數項,而是讓 x 乘超參數,這看起來比 Leaky ReLU 效果要好。該擴展就是 Parametric ReLU,也就是 PReLU,這是 LReLU 的改進。

其公式定義和 LReLU 一樣,但這裡的參數 a 是一個超參數,不需要自定義,而是自適應從數據中學習,也就是可以進行反向傳播,這讓神經元可以選擇負區域最好的梯度

RReLU

公式定義如下所示:

$$a_{ji} sim U(l,u),l<u;;and;;l,uin [0,1)="" $$="" 就是給定範圍內取樣的隨機變量,但在測試中是固定的,該激活函數在一定程度上可以起到正則效果。

在論文《Empirical Evaluation of Rectified Activations in Convolution Network》,作者對比了ReLU激活函數和其三個改進版本 LReLUPReLURReLU 在數據集 CIFAR-10CIFAR-100NDSB 中相同網絡模型的性能。

想了解的可以具體看看這篇論文,當然在實際應用中,初次訓練可以選擇 ReLU 激活函數,然後可以再嘗試這三個改進版來看看對比的結果

3.1.5 ELU

公式定義:

導數如下:

優點

1.ELU減少了正常梯度與單位自然梯度之間的差距,從而加快了學習。2.在負的限制條件下能夠更有魯棒性。

缺點

  1. 由於包含指數運算,所以計算時間更長;
  2. 無法避免梯度爆炸問題;
  3. 神經網絡不學習 α 值。

ELU 激活函數可以參考 ICLR 2016的論文《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》。

3.1.6 Swish

這個函數也叫做自門控激活函數,來自2017年谷歌的論文《Swish: a Self-Gated Activation Function》:https://arxiv.org/abs/1710.05941v1

公式定義如下所示

其圖像如下所示:

從圖中可以看到,在 x<0 的部分和 ReLU 激活函數是不同的,會有一段 x 增大,但輸出值下降的區域;

所以 Swish 函數具備單側有界的特性,它是平滑、非單調的。

具體的介紹可以參考文章–Swish 激活函數的性能優於 ReLU 函數。

3.1.7 Softplus 和 Softsign

Softplus 的公式定義:

Softsign 的公式定義:

這兩個激活函數的使用較少,可以參考 Tensorflow 提供的 api–激活函數相關TensorFlow的官方文檔

3.1.8 Softmax(歸一化指數函數)

公式定義:

該函數主要用於多分類神經網絡的輸出層。

3.1.9 SELU 和 GELU

這兩個激活函數實際上都是最近提出或者最近才使用較多的激活函數,詳細介紹可以查看文章–從ReLU到GELU,一文概覽神經網絡的激活函數,這裡簡單給出公式定義和優缺點。

SELU,即擴展型指數線性單元激活函數,其公式如下所示:

優點

  • 內部歸一化的速度比外部歸一化快,這意味着網絡能更快收斂;
  • 不可能出現梯度消失或爆炸問題,見 SELU 論文附錄的定理 2 和 3。

缺點

  • 這個激活函數相對較新——需要更多論文比較性地探索其在 CNN 和 RNN 等架構中應用。
  • 這裡有一篇使用 SELU 的 CNN 論文:https://arxiv.org/pdf/1905.01338.pdf

GELU,即高斯誤差線性單元激活函數是2016年提出的,但在最近的 Transformer 模型(谷歌的 BERT 和 OpenAI 的 GPT-2)中得到了應用,其公式如下所示:

優點

  • 似乎是 NLP 領域的當前最佳;尤其在 Transformer 模型中表現最好;
  • 能避免梯度消失問題。

缺點

  • 儘管是 2016 年提出的,但在實際應用中還是一個相當新穎的激活函數。

3.2 常見的激活函數的性質

  1. 非線性:當激活函數是線性的,一個兩層的神經網絡就可以基本上逼近所有的函數。但如果激活函數是恆等激活函數的時候,即 ,就不滿足這個性質,而且如果 MLP 使用的是恆等激活函數,那麼其實整個網絡跟單層神經網絡是等價的;
  2. 可微性:當優化方法是基於梯度的時候,就體現了該性質;
  3. 單調性:當激活函數是單調的時候,單層網絡能夠保證是凸函數;
  4. :當激活函數滿足這個性質的時候,如果參數的初始化是隨機的較小值,那麼神經網絡的訓練將會很高效;如果不滿足這個性質,那麼就需要詳細地去設置初始值;
  5. 輸出值的範圍:當激活函數輸出值是有限的時候,基於梯度的優化方法會更加穩定,因為特徵的表示受有限權值的影響更顯著;當激活函數的輸出是無限的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的 Learning Rate。

3.3 如何選擇激活函數

通常選擇一個激活函數並不容易,需要考慮很多因素,最好的做法還是一一實驗所有的激活函數,但需要保證其他因素相同。

一些技巧:(來自深度學習500問第三篇深度學習基礎)

  1. 如果輸出是 0、1 值(二分類問題),則輸出層選擇 sigmoid 函數,然後其它的所有單元都選擇 Relu 函數。
  2. 如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用 Relu 激活函數。有時,也會使用 tanh 激活函數,但 Relu 的一個優點是:當是負值的時候,導數等於 0。
  3. Sigmoid 激活函數:除了輸出層是一個二分類問題基本不會用它。
  4. Tanh 激活函數:tanh 是非常優秀的,幾乎適合所有場合。
  5. ReLU 激活函數:最常用的默認函數,如果不確定用哪個激活函數,就使用 ReLu 或者 Leaky ReLu,再去嘗試其他的激活函數。
  6. 如果遇到了一些死的神經元,我們可以使用 Leaky ReLU 函數。

3.4 激活函數以零為中心的問題

在介紹 Sigmoid 的缺點的時候說到它不是以 0 為中心,這個特點主要是影響收斂速度,因為它的輸出值是恆為正的,那麼在梯度下降,進行參數更新的時候,所有參數每次更新的方向都是同個方向,要不都是正方向,或者要不都是負方向,其更新就是一個 z 字形,如下圖所示:

圖片來自文章https://liam.page/2018/04/17/zero-centered-active-function/

借用文章 cs231n_激活函數 的例子:

假設我們有權值 w=[1,−1,1]],我們需要將權值更新為 w=[−1,1,−1] ,如果梯度是同時有正和有負的,我們可以只更新一次就可得到結果:w=[1,−1,1]+[−2,2,−2]=[−1,1,−1];但是如果梯度只能是正或者只能是負,則需要兩次更新才能得到結果:w=[1,−1,1]+[−3,−3,−3]+[1,5,1]=[−1,1,−1] 。

所以需要選擇以 0 為中心的激活函數,可以提高收斂速度。


參考文章

  1. The Activation Function in Deep Learning 淺談深度學習中的激活函數
  2. 一文概覽深度學習中的激活函數
  3. 深度學習500問第三篇深度學習基礎–3.4激活函數
  4. Swish 激活函數的性能優於 ReLU 函數
  5. 《Empirical Evaluation of Rectified Activations in Convolution Network》:https://arxiv.org/abs/1505.00853
  6. 《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》:https://arxiv.org/pdf/1511.07289v5.pdf
  7. 《Swish: a Self-Gated Activation Function》:https://arxiv.org/abs/1710.05941v1
  8. 激活函數相關TensorFlow的官方文檔
  9. 從ReLU到GELU,一文概覽神經網絡的激活函數
  10. SELU 論文:https://arxiv.org/pdf/1706.02515.pdf
  11. GELU 論文:https://arxiv.org/pdf/1606.08415.pdf
  12. 談談激活函數以零為中心的問題
  13. cs231n_激活函數