原文:Towards Data Science
deephub翻譯組:zhangzcmarkdown
自2012年以來,神經網絡研逐漸成爲了人工智能研究的主流,深度模型迅速取代了以前的各類benchmarks。在這些創新中,激活函數對神經網絡的性能和穩定性起着相當重要的做用。這篇文章將盡量簡要地概述激活函數研究的最新進展,介紹它們的起源以及什麼時候應該被使用。網絡
簡而言之,激活函數解決了神經網絡中的兩個關鍵問題:app
要了解爲何須要非線性激活函數,請考慮如下兩個函數:f(x)=ax+b和g(x) = (c+d)x + (e + f)。前者只有兩個參數a,b,而第二個函數有四個參數c,d,e,f。那麼:它們是兩個不一樣的函數嗎?函數
答案是否認的,由於"(c +d)"和"a"其實是一回事,它們的表達能力相同。例如,若是您選擇c = 10和d = 2,我能夠選擇 a= 12,咱們獲得相同的結果。"(e + f)"和"b"也是如此。爲了使g(x)擁有更強的表示能力,它的四個參數不能那樣組合在一塊兒。在數學中,這意味着這些參數之間的關係必須是非線性的。例如,h(x) = sin(cx + d) + fx + e是具備四個參數的非線性模型。性能
在神經網絡中,若是網絡的每層都是線性映射,那麼這些層組合起來依然是線性的。所以,多層的線性映射覆合後實際上只是起到了一層的效果。爲了使網絡的映射不是線性的,全部層的輸出都要傳遞到非線性函數中,如 ReLU 函數和 Tanh 函數,這樣做用以後就成爲了非線性函數。學習
當回答"圖像中是否有存在人臉"時,false 被建模爲0,true被爲1。給定一張圖像,若是網絡輸出爲 0.88,則表示網絡回答爲true,由於 0.88 更接近於 1 而不是0。可是,當網絡的輸出是 2 或 -7時。咱們如何保證其答案在 [0, 1] 範圍內?編碼
爲此,咱們能夠設計激活函數來保證輸出知足這些數值性質。對於二分類,sigmoid函數σ(x)將[-∞,-∞]內的值映射到 [0, 1] 範圍內。一樣,雙曲切線函數 (tanh(x))將[-∞,-∞]內的值映射到 [-1, 1]。對於使用獨熱編碼的分類數據,softmax函數將全部值壓縮到 [0, 1] 內,並確保它們都加起來爲 1。人工智能
一般只有網絡的最後一層(輸出層)中須要用到這些數值性質,由於它是惟一須要特殊處理的圖層。對於其餘的網絡層,可使用更簡單的非線性函數,例如 ReLU 。雖然在某些狀況下,網絡中間層須要特殊激活函數,例如目標檢測模型和attention層,但這些並不常見,所以不在本文討論範圍以內。翻譯
在上一節中,咱們說明了爲何須要激活函數,以及它們能夠解決哪些問題。此外,咱們注意到全部層都須要獨立的激活函數,但這些激活函數只有不多有特殊的功能。對於大部分中間層,一般使用 ReLU類函數做爲激活函數。設計
在討論細節以前,我想強調的是,選擇ReLU類中哪個函數做爲激活函數並無很充分的理由。在實踐中,人們須要在十幾個epochs中嘗試,看看哪些函數在任務上表現最好。
也就是說,根據經驗法則,在創建模型的時候中儘量先選擇原始 ReLU 做爲激活激活。若是模型性能不佳,遵循Tensorflow 2 文檔(對於 PyTorch 用戶也適用)中給出的建議,再選擇 SELU 做爲激活函數,並去掉全部的batch normalization。我知道這聽起來有點難以想象,但這頗有效,一般能夠給網路帶來5%到10%的提高效果。
下圖總結了 ReLU 類中最經常使用的激活函數圖(左)及其在 CIFAR-10 數據集上的表現(右圖)。
Figure 1:ReLU類中最經常使用的函數圖(左)及其各自在CIFAR10數據集上的性能,共訓練了200epochs,沒有用Dropout。圖像來源: Effectiveness of Scaled Exponentially-Regularized Linear Units (SERLUs)
ReLU的數學定義是:
ReLU(x) = max(0,x)
用文字來表述,若是x爲正,則返回x,若是x爲負,則返回 0。
這是最簡單的非線性激活函數之一,由於計算最大函數值很是簡單。ReLU 函數最先在AlexNet 體系結構中使用,該網絡使用此激活函數訓練速度幾乎是傳統 Tanh 函數的八倍。直到今天,大多數網絡仍是會選擇ReLU,由於它們在計算上簡單有效,這是「共贏」的選擇。
此外,早期的神經網絡受到梯度爆炸/消失問題的困擾。總的來講,在反向傳播期間,不一樣層的梯度在網絡反向傳播中時會相乘,所以具備較大數值的梯度會越傳越大(爆炸),接近零的梯度使得後面的梯度會變的更小(消失)。而使用 ReLU 激活,只有兩個可能的狀況:正部分的梯度是1,負部分的梯度是0。ReLU有效地解決了梯度爆炸這一問題,可是卻也致使了梯度死亡或者神經元壞死現象。
大多數人第一次看到ReLU時會提出這樣的問題:負部分真的須要被捨棄掉嗎?對此,研究人員提出了Leaky ReLU,它會弱化負部分的影響,而不是直接扔掉。Leaky ReLU在數學上的表達式以下:
LeakyReLU(x) = max(0, x) + min(0.01⋅ x, 0)
這樣,一個負值信號不會被徹底丟棄,在「Leaky因子」的做用下會保留一部分負值信號的特徵。實踐證實了在某些狀況下「Leaky因子」是有效的。此外,它緩解了梯度死亡的問題,容許部分負值信號經過。在下面要介紹的激活函數中,一個反覆出現的話題就是如何修正ReLU的負部分。
接下來要介紹的是參數化 ReLU,簡稱 PReLU。經過理性的思考咱們會問:爲何Leaky單元的係數是0.01?因此咱們引入一個變量 ,這樣,咱們不須要本身定義Leaky因子,而是讓網絡本身學習最合適的變量值。PReLU的表達式以下:
PReLU(x) = max(0,x) = min( x,0)
請記住 變量不是全局變量。每一個整流單元都有可訓練的 。這種激活函數展現了數據科學的思惟方式:若是可以讓模型決定什麼是最佳,爲何本身要設置?
尋找性能更好的激活函數的研究還在繼續,使用指數函數做爲ReLU負部分的想法出如今2015年底。指數函數對負數是飽和的,這意味着它平滑地趨向於一個常數。使用指數函數咱們能夠更好地模擬原始的ReLU函數,同時在必定程度上保留負部分。下面是ELU的數學公式:
ELU(x) = max(0, x) + min(eˣ — 1, 0)
在許多狀況下,ELU函數比原始 ReLU 函數有更好的表現。相比之下,Leaky單元的加入並不必定使ReLU有更好的表現。
縮放指數線性單元(Scaled Exponential Linear Unit,SELU)是該領域的最新進展之一,其主要創新是self-normalizing。當訓練時,它的輸出均值是0,方差是1。實際上,這種self-normalizing會使batch normalization變得冗餘。所以,使用 SELU 的模型會更簡單,須要的操做更少。self-normalizing是用常數縮放正負部分來實現的,其數學表達式:
SELU(x) ≈ 1.0507 ⋅ max(0, x) + 1.7580 ⋅ min(eˣ — 1, 0)
有關這個激活函數的使用和係數推導的更多細節,請參閱論文和Tensorflow文檔。上述常數是經過將最初的SELU簡化爲更緊湊的形式獲得的。
到目前爲止,ReLU類的全部激活函數都是單調遞增的。用文字來表述,這意味着函數值只會增加。標誌性的非單調函數如,拋物線(x²)先降低後增加,正弦函數(sin (x))週期性的上升和降低。第一個成功提出非單調激活函數的是Google Brain team,他們提出的非單調激活函數叫作Swish函數,它被定義爲:
F(x) = x ⋅ σ(x)
σ(x)表明的是sigmoid 函數。雖然此表達式與 ReLU 函數不一樣,但他們的函數圖像 是明顯類似的,其正部分基本相同,而Swish函數在負部分有一個「凹陷」且在負無窮除趨近於零(Fig1)。這是經過"自控"機制實現的:假設x是"信號",σ(x)是一個「門函數」(一個飽和於0的函數),σ(x)乘以x是就是讓信號進行自我控制。在實驗中,他們發現這種激活函數在很是深的網絡(30 層)中優於 ReLU 函數。
最後,SERLU 激活函數是對 SELU 的改進,在保留self-normalizing的同時,引入了「自控機制」使負值極限於零。做者沒有用sigmoid函數,而是使用指數函數做爲「門函數」,並從新計算常係數來實現self-normalizing。這致使函數的負部分相似於 Swish 函數,出現了比Swish 函數更明顯的"凹陷"(圖 1,紅色曲線)。SERLU 的數學表達式爲:
SERLU(x) ≈ 1.0786 ⋅ max(0, x) + 3.1326 ⋅ min(x⋅ eˣ — 1, 0)
請注意 x ⋅ eˣ 和x ⋅ σ(x)之間的類似性,二者都實現了自控機制。
雖然如今已是2020 年,但判斷這些非單調函數是否能經受時間考驗,是否能替代ReLU 或 SELU做爲通用的激活函數還爲時過早。不過我敢打賭,self-normalizing這個操做將會一直存在。
如前所述ReLU並不是萬能的,神經網絡有些層須要特殊的激活函數,對於這些層,可使用線性、sigmoid、tanh 和 softmax 等激活函數,下面給出了一些例子:
正如您所看到的,給出一個問題,選擇使用哪一個激活函數是很是簡單的事情。此外,選定激活函數也代表了應使用或考慮哪些損失函數。如前所述,經驗法則告訴咱們在大部分狀況下都要使用 ReLU 激活函數,而後爲輸出層選擇最合適的特殊激活函數,並在之後的訓練中擴大選擇範圍並嘗試替代這些函數。
最後值得一提的是,對於一些分類問題,類別之間不是相互排斥的。在此特殊狀況下,單個輸入可能被對應多個類。在這些狀況下是應按類使用Sigmoid,而不是用softmax。這樣,全部輸出都被壓縮到 [0, 1] 範圍,但它們的和不是1。
本文回顧了激活函數中的state-of-the-art,並介紹瞭如何選擇和使用它們。總之,激活函數使網絡變成非線性的映射,使得輸出層具備某些數值性質。對於中間層,使用 ReLU 類的激活函數。而且根據經驗,儘量地使用 ReLU,而後再考慮用 SELU 激活函數並刪除全部batch normalization操做。對於輸出層,請考慮對非正則化/正則化迴歸使用線性/tanh激活函數,對二分類/多分類使用 sigmoid/softmax。
不多有一本指南能面面俱到,有些東西老是會被遺漏。在這裏,我故意遺漏了那些不太爲人所知或使用的函數,如softplus, softsign,和relu6函數。我選擇這樣作,是爲了使保持文章儘量簡短的同時,讓你們瞭解經常使用的激活函數。若是您未能理解這篇文章中的任何函數,不一樣意個人論述,或但願看到一些擴展的概念,請在評論部分留言讓我知道,我會盡量保持本文檔的更新:)
原文地址:https://imba.deephub.ai/p/3d3daf8068ba11ea90cd05de3860c663