自2012年以來,神經網絡研究的進展主導了大多數人工智慧(AI)文獻。激活函數對神經網絡的效率和穩定性起著至關重要的作用。在這篇文章中,將儘可能簡要地概述激活函數的最新發展,並關注為什麼需要它們以及何時應用它們。
為什麼需要激活函數?
簡而言之,激活函數解決了神經網絡中的兩個關鍵問題:
確保激活映射是非線性的,因此彼此獨立;確保某些輸出具有基本的數值特性,例如,在[- 1,1]範圍內或為有效的概率分布。非線性
為了理解非線性激活映射的需要,考慮以下兩個函數:f(x) = ax + b和g(x) = (c+d)x + (e + f).前者只有兩個常數,而後者有四個。問題是:它們實際上是兩個不同的函數嗎?
答案是否定的,「(c + d)」和「a」具有相同的表達能力。如果你選擇c = 10且d = 2,我可以選擇a = 12,我們會得到相同的結果。e + f和b也是一樣的。為了有效地擁有四個獨立的參數,它們必須是不能組合的。在數學中,這意味著參數之間的關係必須是非線性的。例如,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]。對於one-hot編碼的分類數據,softmax函數將所有值壓縮到[0,1]區間,並確保它們全部加起來為1。
通常,這些「數值特性」激活用於網絡的最後一層,即輸出層,因為這通常是唯一需要特殊處理的層。對於其他參數,使用更簡單的非線性,例如ReLU系列。雖然在某些情況下,網絡中間需要特殊的激活,例如用於對象檢測的模型和attention層,但這些並不是規範,不在本文的討論範圍之內。
ReLU系列
在前一節中,我們了解了為什麼需要激活以及它們解決了哪些問題。此外,我們注意到所有層都需要激活函數是獨立的。對於所有普通層,通常使用ReLU系列的激活。
在類似ReLU系列的激活中,使用其中一種而不是另一種並沒有特定的理由。在實踐中,只需要循環嘗試十幾個epochs,看看哪個執行得最好。
也就是說,經驗法則是在開發過程中儘可能長時間地使用原始ReLU激活,如果您的模型執行得不好,則按照Tensorflow 2文檔中給出的建議(也適用於PyTorch用戶)跳到SELU激活,並去掉所有的批歸一化。這可能會給你帶來5%到10%的提升。
下圖總結了ReLU系列中最知名的激活。
ReLU
數學定義為:
ReLU(x) = max(0, x)
如果為正,則返回x,如果為負,則返回0。
這是最簡單的非線性之一。計算max函數非常簡單。ReLU函數的一個較早的用法來自於AlexNet體系結構,它使用這種激活比更傳統的Tanh函數快了近8倍。直到今天,ReLU系列的激活實際上是大多數層的選擇,因為它們在計算上很簡單,但是很有效。
另外,早期的神經網絡受到稱為梯度爆炸/梯度消失的問題的困擾。總而言之,在反向傳播期間,梯度會彼此相乘,因此大梯度會導致梯度爆炸,而接近零的梯度會導致梯度消失。使用ReLU激活,只有兩個可能的梯度:一個為正,另一個為零,負梯度。因此,關於激活函數在該問題上的作用,ReLU有效地解決了爆炸問題,同時也產生了dead gradients問題。
LeakyReLU
大多數人第一次看到ReLU函數時首先要擔心的是:負的部分真的被丟掉了嗎?研究人員提出了LeakyReLU。不是丟掉負的部分,而是返回它的縮小版本。數學上:
LeakyReLU(x) = max(0, x) + min(0.01 x, 0)
這樣,信號不會完全丟失,但會因leak係數而大大降低。實際上,這在某些情況下被證明是有效的。而且,它減輕了dead gradients問題,允許至少一部分信號通過。在下一次激活時,反覆出現主題是否定部分。
為什麼為是0.01呢?讓我們引入一個α變量並使它可訓練。這樣,我們不需要自己定義leak因子;我們讓網絡自己學習最合適的值。表達形式:
PReLU(x) = max(0, x) + min(αx, 0)
請記住,α變量不是全局變量。每個單元都有其可訓練的α。這種激活演示了數據科學的思維方式:如果可以讓機器學習模型決定什麼是最好的,為什麼要自己設置呢?
ELU
為了繼續追求更好的激活效果,在2015年下半年,人們產生了將指數函數用於負部分的想法。指數函數在負值處趨於飽和,這意味著它平穩地趨向於一個固定的常數。使用它,我們可以更接近地模擬原始的ReLU函數,它在0處飽和,但仍然保留了一定程度的負部分。其數學公式如下:
在許多情況下,ELU函數比原來的ReLU函數有明顯的改進。相反,洩漏的變體並沒有始終如一地更好。
該領域的最新進展之一是縮放指數線性單位,即SELU,其主要創新是自歸一化。這意味著,經過培訓後,它將趨向於以零均值和單位方差輸出結果。實際上,這使批標準化層過時了。因此,使用SELU激活的模型更簡單,需要的操作更少。最後,通過使用魔術常數簡單地縮放正負部分來實現自歸一化屬性。正式地:
這一領域的最新進展之一是SELU,其主要創新是自歸一化。這意味著,當訓練時,它將收斂於以零均值和單位方差的輸出結果。在實踐中,這會使批歸一化層變得過時了。因此,使用SELU激活的機器學習模型更簡單,需要的操作更少。數學公式如下:
非單調激活
到目前為止,來自ReLU系列的所有激活都在單調增加。這意味著函數值只會不斷增長。標誌性的非單調函數是使它們下降的拋物線(x)和周期性地上升和下降的正弦函數(sin(x))。
非單調激活的第一個成功建議是Google Brain小組的Swish函數,其簡單定義為:
F(x)= xσ(x)
σ(x)是sigmoid函數。儘管此表達式與ReLU函數並不相似,但它們的圖非常相似,具有接近一致的正部分,負部分在0處飽和,負部分的「dip」或「belly」接近於0(上圖中的藍色部分)。這是通過「self-gating 」機制實現的。基本上,x是「信號」,σ(x)是「gating function」(飽和為零的函數),將σ應用於x並乘以x就是獲取信號並對其自身進行控制。在實驗中,他們發現這種激活在非常深的網絡(30層以上)中優於ReLU函數。
最後,SERLU激活是對SELU函數的改進,保留了自歸一化特性,同時包括一個self-gating機制,可將負值飽和為零。作者將指數函數作為gating operation,而不是sigmoid函數,並重新計算了常數,從而實現了這一目的。這將導致函數的負端出現較大的「傾斜」,類似於Swish函數,但更明顯(上圖中的紅色部分)。SERLU的正式定義為:
注意xe(x)和xσ (x)之間的相似性。兩者都是self-gating機制。
到2020年,現在判斷這些非單調函數是否會經受住時間的考驗並取代ReLU或SELU作為良好的通用替代品還為時過早。
特殊系列
如前所述,一些層需要特殊處理,而不是像ReLU。對於這些層,使用linear、sigmoid、tanh和softmax激活,它們的用例如下:
linear:在需要神經網絡的原始輸出時使用。這對於融合操作很有用,例如sigmoid-cross - sentropy和softmax-cross - sentropy,它們在數值上更穩定,對於非歸一化回歸也很有用。此外,在理論分析中,這種激活對於調試和簡化非常有用。Tanh:用於歸一化回歸問題,其輸出在[-1,1]範圍內。通常與L2損失一起使用。Sigmoid:在二分類問題中將輸出壓縮到[0,1]範圍內。幾乎總是與二元交叉熵損失一起使用。Softmax:在分類語境中,以確保網絡輸出是一個有效的概率分布。這意味著所有的值都在[0,1]範圍內,並且總和為1。與分類交叉熵損失一起使用。正如您所看到的,給定一個問題,很容易選擇應該使用哪個激活。如前所述,經驗法則是始終使用ReLU激活,為最後一層選擇最合適的特殊函數,然後在以後的迭代中擴展這些初始選擇並嘗試進行替換。
最後,值得一提的是,對於某些問題,類並不相互排斥。在這種特殊情況下,單個輸入可能會標記多個類。在這些情況下,sigmoid用於每個類,而不是softmax激活。這樣,所有的輸出都壓縮到[0,1]範圍,但不強制它們加起來等於1。
最後
在本文中,對激活函數的最新技術進行了回顧,並給出了使用方法。總而言之,激活用於使網絡非線性,並對輸出層強制執行特殊屬性。對於內部層,使用ReLU系列,並且根據經驗,儘可能長時間地使用ReLU激活,然後切換到SELU激活並刪除所有批歸一化操作。對於輸出層,請考慮將線性/ tanh激活用於非歸一化/歸一化回歸,將Sigmoid / softmax用於二元/類別分類。