深度學習激活函數完全指南:在數據科學的諸多曲線上進行現代之旅

2021-01-11 deephub

原文:Towards Data Science

deephub翻譯組:zhangzc

自2012年以來,神經網絡研逐漸成為了人工智慧研究的主流,深度模型迅速取代了之前的各種benchmarks。在這些創新中,激活函數對神經網絡的性能和穩定性起著至關重要的作用。這篇文章將儘可能簡要地概述激活函數研究的最新進展,介紹它們的起源以及何時應該被使用。

內容提要

激活函數有什麼作用?增強函數的非線性能力增強函數特定的數值性質ReLU 類激活函數整流器: ReLU,LeakyReLU,和 PReLU指數類: ELU和SELU非單調類: Swish和SERLU特殊的激活函數線性函數:輸出原始數據或進行融合操作Tanh:回歸 +L1/L2正則項Sigmoid:二分類 + 二元交叉熵。Softmax:多分類+ 多元交叉熵結語為什麼要使用激活函數?

簡而言之,激活函數解決了神經網絡中的兩個關鍵問題:

確保函數是非線性映射確保某些輸出具有我們需要的數值性質,例如,輸出值在 [-1, 1] 範圍內,或保證輸出服從某個概率分布。非線性

要了解為什麼需要非線性激活函數,請考慮以下兩個函數:<Object: word/embeddings/oleObject1.bin> 和<Object: word/embeddings/oleObject2.bin>。前者只有兩個參數a,b,而第二個函數有四個參數c,d,e,f。那麼:它們是兩個不同的函數嗎?

答案是否定的,因為"(c +d)"和"a"實際上是一回事,它們的表達能力相同。例如,如果您選擇c = 10和d = 2,我可以選擇 a= 12,我們得到相同的結果。"(e + f)"和"b"也是如此。為了使<Object: word/embeddings/oleObject3.bin>擁有更強的表示能力,它的四個參數不能那樣組合在一起。在數學中,這意味著這些參數之間的關係必須是非線性的。例如,<Object: word/embeddings/oleObject4.bin>是具有四個參數的非線性模型。

在神經網絡中,如果網絡的每層都是線性映射,那麼這些層組合起來依然是線性的。因此,多層的線性映射複合後實際上只是起到了一層的效果。為了使網絡的映射不是線性的,所有層的輸出都要傳遞到非線性函數中,如 ReLU 函數和 Tanh 函數,這樣作用之後就成為了非線性函數。

數值性質

當回答"圖像中是否有存在人臉"時,false 被建模為0,true被為1。給定一張圖像,如果網絡輸出為 0.88,則表示網絡回答為true,因為 0.88 更接近於 1 而不是0。但是,當網絡的輸出是 2 或 -7時。我們如何保證其答案在 [0, 1] 範圍內?

為此,我們可以設計激活函數來保證輸出滿足這些數值性質。對於二分類,sigmoid函數<Object: word/embeddings/oleObject5.bin>將<Object: word/embeddings/oleObject6.bin>內的值映射到 [0, 1] 範圍內。同樣,雙曲切線函數 (tanh(x))將<Object: word/embeddings/oleObject7.bin>內的值映射到 [-1, 1]。對於使用獨熱編碼的分類數據,softmax函數將所有值壓縮到 [0, 1] 內,並確保它們都加起來為 1。

通常只有網絡的最後一層(輸出層)中需要用到這些數值性質,因為它是唯一需要特殊處理的圖層。對於其他的網絡層,可以使用更簡單的非線性函數,例如 ReLU 。雖然在某些情況下,網絡中間層需要特殊激活函數,例如目標檢測模型和attention層,但這些並不常見,因此不在本文討論範圍之內。

ReLU類

在上一節中,我們說明了為什麼需要激活函數,以及它們可以解決哪些問題。此外,我們注意到所有層都需要獨立的激活函數,但這些激活函數只有很少有特殊的功能。對於大部分中間層,通常使用 ReLU類函數作為激活函數。

在討論細節之前,我想強調的是,選擇ReLU類中哪一個函數作為激活函數並沒有很充分的理由。在實踐中,人們需要在十幾個epochs中嘗試,看看哪些函數在任務上表現最好。

也就是說,根據經驗法則,在建立模型的時候中儘可能先選擇原始 ReLU 作為激活激活。如果模型性能不佳,遵循Tensorflow 2 文檔(對於 PyTorch 用戶也適用)中給出的建議,再選擇 SELU 作為激活函數,並去掉所有的batch normalization。我知道這聽起來有點不可思議,但這很有效,通常可以給網路帶來5%到10%的提升效果。

下圖總結了 ReLU 類中最常用的激活函數圖(左)及其在 CIFAR-10 數據集上的表現(右圖)。

Figure :ReLU類中最常用的函數圖(左)及其各自在CIFAR10數據集上的性能,共訓練了200epochs,沒有用Dropout。圖像來源: Effectiveness of Scaled Exponentially-Regularized Linear Units (SERLUs)

線性整流單元 (The Rectifier Linear Unit ,ReLU)

ReLU的數學定義是:

ReLU(x) = max(0,x)

用文字來表述,如果x為正,則返回x,如果x為負,則返回 0。

這是最簡單的非線性激活函數之一,因為計算最大函數值非常簡單。ReLU 函數最早在AlexNet 體系結構中使用,該網絡使用此激活函數訓練速度幾乎是傳統 Tanh 函數的八倍。直到今天,大多數網絡還是會選擇ReLU,因為它們在計算上簡單有效,這是「雙贏」的選擇。

此外,早期的神經網絡受到梯度爆炸/消失問題的困擾。總的來說,在反向傳播期間,不同層的梯度在網絡反向傳播中時會相乘,因此具有較大數值的梯度會越傳越大(爆炸),接近零的梯度使得後面的梯度會變的更小(消失)。而使用 ReLU 激活,只有兩個可能的情況:正部分的梯度是1,負部分的梯度是0。ReLU有效地解決了梯度爆炸這一問題,但是卻也導致了梯度死亡或者神經元壞死現象。

Leaky單元

大多數人第一次看到ReLU時會提出這樣的問題:負部分真的需要被捨棄掉嗎?對此,研究人員提出了Leaky ReLU,它會弱化負部分的影響,而不是直接扔掉。Leaky ReLU在數學上的表達式如下:

LeakyReLU(x) = max(0, x) + min(0.01 x, 0)

這樣,一個負值信號不會被完全丟棄,在「Leaky因子」的作用下會保留一部分負值信號的特徵。實踐證明了在某些情況下「Leaky因子」是有效的。此外,它緩解了梯度死亡的問題,允許部分負值信號通過。在下面要介紹的激活函數中,一個反覆出現的話題就是如何修正ReLU的負部分。

接下來要介紹的是參數化 ReLU,簡稱 PReLU。通過理性的思考我們會問:為什麼Leaky單元的係數是0.01?所以我們引入一個變量<Object: word/embeddings/oleObject8.bin>,這樣,我們不需要自己定義Leaky因子,而是讓網絡自己學習最合適的變量值。PReLU的表達式如下:

PReLU(x) = max(0,x) = min(<Object: word/embeddings/oleObject9.bin>x,0)

請記住<Object: word/embeddings/oleObject10.bin>變量不是全局變量。每個整流單元都有可訓練的<Object: word/embeddings/oleObject11.bin>。這種激活函數展示了數據科學的思維方式:如果能夠讓模型決定什麼是最佳,為什麼自己要設置?

指數單位

尋找性能更好的激活函數的研究還在繼續,使用指數函數作為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 等激活函數,下面給出了一些例子:

線性激活函數:當您需要網絡的原始輸出時可以用線性函數。線性函數對於融合操作很有用,例如sigmoid 交叉熵和softmax交叉熵函數,它們在數值上更穩定。此外,在理論分析中,這種激活函數對於調試和簡化網絡非常有用。Tanh: 可用於正則化回歸問題,其輸出在 [-1, 1] 範圍內。通常與 L2 損失結合使用。Sigmoid: 用於二分類問題中。將輸出壓縮到 [0, 1] 範圍內。大部分時候都與二元交叉熵損失一起使用。Softmax:在多分類中經常使用,使網絡輸出的是有效的概率分布。這意味著所有值都在 [0, 1] 範圍內,且總和為 1。可與多元交叉熵損失一起使用。正如您所看到的,給出一個問題,選擇使用哪個激活函數是非常簡單的事情。此外,選定激活函數也表明了應使用或考慮哪些損失函數。如前所述,經驗法則告訴我們在大部分情況下都要使用 ReLU 激活函數,然後為輸出層選擇最合適的特殊激活函數,並在以後的訓練中擴大選擇範圍並嘗試替代這些函數。

最後值得一提的是,對於一些分類問題,類別之間不是相互排斥的。在此特殊情況下,單個輸入可能被對應多個類。在這些情況下是應按類使用Sigmoid,而不是用softmax。這樣,所有輸出都被壓縮到 [0, 1] 範圍,但它們的和不是1。

結語

本文回顧了激活函數中的state-of-the-art,並介紹了如何選擇和使用它們。總之,激活函數使網絡變成非線性的映射,使得輸出層具有某些數值性質。對於中間層,使用 ReLU 類的激活函數。並且根據經驗,儘可能地使用 ReLU,然後再考慮用 SELU 激活函數並刪除所有batch normalization操作。對於輸出層,請考慮對非正則化/正則化回歸使用線性/tanh激活函數,對二分類/多分類使用 sigmoid/softmax。

很少有一本指南能面面俱到,有些東西總是會被遺漏。在這裡,我故意遺漏了那些不太為人所知或使用的函數,如softplus, softsign,和relu6函數。我選擇這樣做,是為了使保持文章儘可能簡短的同時,讓大家了解常用的激活函數。如果您未能理解這篇文章中的任何函數,不同意我的論述,或希望看到一些擴展的概念,請在評論部分留言讓我知道,我會儘可能保持本文檔的更新:)

相關焦點

  • 人工智慧-深度學習-激活函數ReLU,Sigmoid,TanH,ELU,MaxOut
    激活函數:在多層神經網絡中,上層節點的輸出和下層節點的輸入之間具有一個函數關係,這個函數稱為激活函數(又稱激勵函數)激活函數的本質:激活函數是來向神經網絡中引入非線性因素的,通過激活函數,神經網絡就可以擬合各種曲線。
  • 深入理解深度學習中的激活函數
    tanh函數函數位於[-1, 1]區間上,對應的圖像是:優點:1.比Sigmoid函數收斂速度更快。2.相比Sigmoid函數,其輸出以0為中心。缺點:還是沒有改變Sigmoid函數的最大問題——由於飽和性產生的梯度消失。sigmoid函數可以很容易地應用在訓練過程中。然而,當你想要處理分類問題時,他們卻無能為力。
  • 深度學習基礎篇:如何選擇正確的激活函數?
    而在深度學習中,我們也需要一種類似的機制來分類傳入的信息。不是所有信息都是有用的,一些只是噪音。激活函數可以幫助神經網絡做這種隔離。它激活有用的信息,並抑制無關的數據點。激活函數如此重要,那麼都有哪些比較熱門呢?它們是如何工作的?又適合解決什麼問題?本文將為你一一解答。以下是本文目錄。1.簡單介紹神經網絡2.什麼是激活函數?
  • 人工神經網絡的驅動者:激活函數是什麼?
    從技術上來講,某個節點的激活函數將其在神經網絡中前一個節點的數據輸入,並輸出一個確定值,這個值繼而指導後續節點如何發動來響應特定輸入信號。本文剖析由激活函數組成的神經網絡,以及神經網絡的生物類似物,並簡要介紹幾種常用的激活函數。神經網絡的結構作為一名數據科學愛好者,你一定見過上面的這張圖片或者與之相似的圖片。這張圖片是對雙層神經網絡工作流程的經典描述。
  • 在深度學習中對正則化的直觀認識
    我不會討論其他方法(例如收集更多數據)如何改變模型的工作方式。所有的圖形和模型都是用標準的科學Python堆棧製作的:numpy、matplotlib、scipy、sklearn,而神經網絡模型則是用PyTorch構建的。開發複雜函數深度學習的核心原則之一是深度神經網絡作為通用函數逼近的能力。
  • 如何選擇神經網絡激活函數:有效的改善模型學習模式的能力
    機器學習是一個使用統計學和計算機科學原理來創建統計模型的研究領域,用於執行諸如預測和推理之類的主要任務。 這些模型是給定系統的輸入和輸出之間的數學關係集。 學習過程是估計模型參數的過程,以便模型可以執行指定的任務。 學習過程會嘗試使機器具有學習能力,而無需進行顯式編程。 這是ANN的作用。什麼是人工神經網絡?
  • 掌握深度學習,數據不足也能進行圖像分類!
    在本文中,小芯將示範如何在數據不足的情況下應用深度學習。現已創建特製汽車和巴士分類器兩個數據集,每個數據集包含100個圖像。其中,訓練集有70個圖像,驗證集有30個。挑戰1. 視點變化:基於相機,單一對象實例可以從多個視角聚焦。2. 尺度變化:視覺分類常常存在尺度變化(這裡的尺度指的是現實世界中的物體的大小,而不僅僅就圖像而言)。
  • 掃盲貼:什麼是深度學習,其工作原理是什麼?
    簡單來說,深度學習就是樣本研究。從最基本的概念上看,深度學習就是機器學習的一種方法,教計算機篩選輸入的信息,進而對信息進行預測和分類。其觀察結果可以通過圖片、文字或聲音的方式呈現。深度學習的靈感來源於人腦過濾信息的方式。
  • 機器學習中的激活函數綜合指南
    為此,已經設計了幾個激活函數來保證某些數值屬性。對於二元分類情況,sigmoid函數(σ(x))接受[-∞,∞]範圍內的輸入,並輸出[0,1]範圍內的值。同樣,雙曲正切函數(tanh(x))將[-∞,∞]映射為[-1,1]。對於one-hot編碼的分類數據,softmax函數將所有值壓縮到[0,1]區間,並確保它們全部加起來為1。
  • 100天學習計劃|一份詳實的數據科學指南
    字幕組雙語原文:100天學習計劃 | 一份詳實的數據科學指南英語原文:A Complete Guide to Learn Data Science in 100 Days翻譯:雷鋒字幕組(不再聯繫791)你是否對學習數據科學感興趣,但不知道從哪裡開始?如果是,那你來對地方了。
  • 深度學習的學習率調節實踐
    除輸出層外的每一層都包含一個偏置神經元,並與下一層完全相連。當一個ANN包含一個很深的隱藏層時,它被稱為深度神經網絡(DNN)。在這項調查中,我們將在MNIST時尚數據集上訓練一個深度MLP,並通過指數增長來尋找最佳學習率,繪製損失圖,並找到損失增長的點,以達到85%以上的準確率。對於最佳實踐,我們將實現早期停止,保存檢查點,並使用TensorBoard繪製學習曲線。
  • 深度學習黑盒可視化指南,從隱藏層開始
    簡而言之,可以將神經網絡的學習方法理解為類似於新生兒通過一段時間的觀察和聆聽來學習辨認父母的方式。一旦神經網絡接收到相當大的所需數據集後,該網絡就會使用其精確的知識「權重」來證明或識別未知數據樣本上的模式。讓我們來思考一下關於面部識別的任務,網絡開始分析來自輸入層圖像的各個像素。在輸入層之後,「隱藏層」反覆學習識別幾何形狀和特徵,這些幾何形狀和特徵由眼睛、嘴唇、疤痕等特定的特徵構成。
  • 人工智慧系列(六) 深度學習中的神經網絡
    原力君在系列的第五篇《人工智慧系列(五) 深度學習簡介》中提到深度學習可以看作是一種更高級的函數擬合方法;人工神經網絡、激活函數、代價函數、梯度下降、反向傳播是深度學習的幾個關鍵點;常見的深度學習神經網絡結構有多層感知機、DNN、CNN、RNN等。
  • 超越ReLU卻鮮為人知3年後被挖掘:BERT、GPT-2等都在用的激活函數
    據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。
  • 深度學習中常見的損失函數
    在深度學習分類任務中,我們經常會使用到損失函數,今天我們就來總結一下深度學習中常見的損失函數。該式就是sigmoid函數的交叉熵,這也是上文說的在分類問題上,交叉熵的實質是對數似然函數。在深度學習中更普遍的做法是將softmax作為最後一層,此時常用的仍是對數似然損失函數,如下所示:
  • 乾貨|不同的損失函數會對深度神經網絡帶來什麼樣的影響?
    但是,如果我們改變權重和偏置的初始值(w=2.00,b=2.00),我們將得到如下的學習曲線:從上圖可以看出,網絡在300epoch同樣達到收斂,但是曲線在起初的時候權重係數初始化後,由《深度學習之c++實現反向傳播算法》知道其更新的變化依賴於損失函數的偏導數。我們說曲線學的很平坦,學習緩慢時,實際上反映出來的結果就是這些對於權重係數的偏導數很小。那麼,為什麼這些偏導數會變得如此的小以至於網絡收斂很慢呢?
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    共4天8節,講解機器學習和深度學習的模型理論和代碼實踐,梳理機器學習、深度學習、計算機視覺的技術框架,從根本上解決如何使用模型、優化模型的問題;每次課中,首先闡述算法理論和少量公式推導,然後使用真實數據做數據挖掘、機器學習、深度學習的數據分析、特徵選擇、調參和結果比較。
  • 完全硬體指南:教你 DIY 一套自己的深度學習機器
    如何才能搭建一套合適的人工智慧,尤其是當今最火的深度學習的硬體呢?為了幫助大家避免一些硬體配置的坑,深度學習的資深玩家Tim Dettmers將自己的經驗教訓總結成了這篇深度學習的完全硬體指南,供各位玩家參考。深度學習是一項非常耗算力的工作,所以你得有一個帶很多內核的CPU,對吧?或者買高速CPU也許是浪費?
  • 利用深度學習進行時間序列預測
    這個notebook可以在Github上找到:https://github.com/Christophe-pere/Time_series_RNN。RNN,LSTM,GRU,雙向,CNN-x那麼我們將在哪個模型上進行這項研究?
  • 深度學習與統計力學(I) :深度學習中的基礎理論問題
    系列預告深度學習統計力學(I) :深度學習中的基礎理論問題深度學習統計力學(IV) :深層網絡的信號傳播和初始化深度學習統計力學(VI) :通過概率模型進行「深度想像」1 介紹深層神經網絡具有多個隱含層[1],在許多領域都取得了顯著的成功,從機器視覺[2]、語音識別[3]、自然語言處理[4]、強化學習[5],到神經科學[6、7]、心理學[8、