超越ReLU卻鮮為人知後被挖掘:BERT、GPT-2等都在用的激活函數

2020-12-13 騰訊網

機器之心報導

機器之心編輯部

至少在NLP領域裡,GELU已經成為了眾多業內最佳模型的選擇。

作為決定神經網絡是否傳遞信息的「開關」,激活函數對於神經網絡而言至關重要。不過今天被人們普遍採用的 ReLU 真的是最高效的方法嗎?最近在社交網絡上,人們找到了一個看來更強大的激活函數:GELU,這種方法早在 2016 年即被人提出,然而其論文迄今為止在 Google Scholar 上的被引用次數卻只有 34 次。

其實,GELU 已經被很多目前最為領先的模型所採用。據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。

GELU 論文的作者來自 UC Berkeley 和豐田工業大學芝加哥分校:

論文連結:https://arxiv.org/pdf/1606.08415.pdf

「現任」最流行的激活函數 ReLU

在講述 GELU 之前,讓我們先回顧一下目前最為流行的線性整流函數(Rectified Linear Unit, ReLU),它又稱修正線性單元。RELU 是多倫多大學 Vinod Nair 與圖靈獎獲得者 Geoffrey Hinton 等人的研究,其研究被 ICML 2010 大會接收。

RELU 是人工神經網絡中最常用的激活函數(activation function),通常指代以「斜坡」函數及其變種為代表的非線性函數族。這個函數族比較常見的有 ReLU 以及 Leaky ReLU。

通常意義下,線性整流函數指代數學中的斜坡函數,即:

函數圖像如下:

而在神經網絡中,線性整流作為神經元的激活函數,定義了該神經元在線性變換之後的非線性輸出結果。ReLU 可以對抗梯度爆炸/消失問題,相對而言計算效率也很高。因為在 2012 年被著名的計算機視覺模型 AlexNet 應用,ReLU 變得流行開來,目前它被普遍認為是效果最好的激活函數。

激活函數發展史

早期人工神經元使用二元閾值單元(Hopfield, 1982; McCulloch & Pitts, 1943)。這些困難的二元決策通過 Sigmoid 激活函數進行平滑化,從而具有非常快的解碼速度,並可以利用反向傳播進行訓練。但是,隨著網絡深度的不斷增加,利用 Sigmoid 激活函數來訓練被證實不如非平滑、低概率性的 ReLU 有效(Nair & Hinton, 2010),因為 ReLU 基於輸入信號做出門控決策。

儘管 ReLU 缺少統計學意義上的支持,但依然是一種非常有競爭力的工程解決方案,其收斂速度和效果好於 Sigmoid 激活函數。得益於 ReLU 的成功,近來有一個它的改進版——ELU 函數。這種函數可以讓類似 ReLU 的非線性函數能夠輸出負值並提升訓練速度。總之,對於激活函數的選擇也是神經網絡架構設計中重要的一部分。

深度非線性分類器可以和數據擬合地很好,使得設計者需要面對隨機正則化(如在隱層中加入噪聲)或者採用 dropout 機制。這兩個選擇依然是和激活函數割裂的。一些隨機正則化可以讓網絡表現得像是很多個網絡的組合,並可以提升精確度。

因此,非線性和 dropout 共同決定了神經元的輸出,但這兩種創新依然存在區別。此外,非線性和 dropout 彼此也不將對方包含在內,因為流行的隨機正則化在執行時與輸入無關,並且非線性也獲得此類正則化的輔助。

在本文中,研究者提出了一種新的非線性激活函數,名為高斯誤差線性單元(Gaussian Error Linear Unit,GELU)。GELU 與隨機正則化有關,因為它是自適應 Dropout 的修正預期(Ba & Frey, 2013)。這表明神經元輸出的概率性更高。研究者發現,在計算機視覺、自然語言處理和自動語音識別等任務上,使用 GELU 激活函數的模型性能與使用 ReLU 或 ELU 的模型相當或超越了它們。

GELU 激活函數,來點數學

研究者表明,受到 Dropout、ReLU 等機制的影響,它們都希望將「不重要」的激活信息規整為零。我們可以理解為,對於輸入的值,我們根據它的情況乘上 1 或 0。更「數學」一點的描述是,對於每一個輸入 x,其服從於標準正態分布 N(0, 1),它會乘上一個伯努利分布 Bernoulli(Φ(x)),其中Φ(x) = P(X ≤ x)。

隨著 x 的降低,它被歸零的概率會升高。對於 ReLU 來說,這個界限就是 0,輸入少於零就會被歸零。這一類激活函數,不僅保留了概率性,同時也保留了對輸入的依賴性。

好了,現在我們可以看看 GELU 到底長什麼樣子了。我們經常希望神經網絡具有確定性決策,這種想法催生了 GELU 激活函數的誕生。這種函數的非線性希望對輸入 x 上的隨機正則化項做一個轉換,聽著比較費勁,具體來說可以表示為:Φ(x) × Ix + (1 − Φ(x)) × 0x = xΦ(x)。

我們可以理解為,對於一部分Φ(x),它直接乘以輸入 x,而對於另一部分 (1 − Φ(x)),它們需要歸零。不太嚴格地說,上面這個表達式可以按當前輸入 x 比其它輸入大多少來縮放 x。

因為高斯概率分布函數通常根據損失函數計算,因此研究者定義高斯誤差線性單元(GELU)為:

上面這個函數是無法直接計算的,因此可以通過另外的方法來逼近這樣的激活函數,研究者得出來的表達式為:

雖然研究者表示高斯概率分布函數的均值與方差都可以設置為可訓練,但他們簡單地採用均值為 0 方差為 1。看到這樣的表達式,讓人想到了谷歌 2017 年提出來的 Swish 激活函數,它的表達式可以簡單寫為:f(x) = x · sigmoid(x)。

GELU 激活函數的圖像。

在 Quoc V. Le 等人研究的成果中,他們將 Swish 激活函數定義為 x · σ(βx),其中 σ() 是標準的 sigmoid 函數,β可以是常數,也可以是可訓練的參數。這樣的激活函數是「被搜索」出來的,研究者在一系列函數族中做自動搜索,並表示 Swish 激活函數的效果最好。

通過搜索查找到的激活函數,它們效果都還不錯,選自 arXiv: 1710.05941。

不服跑分:GELU vs ReLU

研究者對 GELU 和 ReLU、ELU 三個激活函數進行了性能上的比較。他們選擇了以下任務:

MNIST 圖片分類(10 類,6 萬張訓練圖片和 1 萬張測試圖片);

TIMIT 語音識別(3696 個訓練樣本、1152 個驗證樣本和 192 個測試樣本);

CIFAR-10/100 分類(10/100 個類,5 萬的訓練樣本和 1 萬的測試樣本)。

MNIST 圖片分類任務

研究者在一個全連接網絡中測試了 MNIST 分類任務,其中 GELU 的參數是μ = 0、σ = 1。ELU 則是α = 1。每個網絡都有 8 個層、128 個神經元。

圖 2 左:無 dropout 模型,圖右:模型設置 dropout 為 0.5。

圖 3:MNIST 魯棒性結果。

TIMIT 語音識別任務

研究者需要解決的另一項挑戰是利用 TIMIT 數據集進行音素識別(phone recognition),該數據集包含 680 名說話者在無聲環境中的錄音。該系統是一個包含 2048 個神經元的 5 層寬分類器(Mohamed et al., 2012),包含 39 個輸出語音標籤。

圖 5:TIMIT 語音識別變化曲線圖。

CIFAR-10/100 分類任務

研究者利用 5000 個驗證樣本來對初始學習率 進行微調,然後基於交叉驗證的學習率再次在整個訓練集上進行訓練。他們通過 Adam 對 200 個 epoch 優化,並在第 100 個 epoch 上學習率衰減為零。如下圖 6 所示,每條曲線是三次運行結果取中間值得出的。

圖 6:CIFAR-10 數據集上的結果。

不服跑分:GELU vs Swish

因為表達式差不多,一個是固定係數 1.702,另一個是可變係數 β,Swish 和 GELU 的性質與效果非常類似。在 Swish 論文(SEARCHING FOR ACTIVATION FUNCTIONS)中,研究者對比了不同激活函數的效果,我們可以看到在視覺或語言任務中,Swish 效果要更好一些。

例如在 ImageNet 中訓練 Inception-ResNet-v2,Swish 還是要稍微超過 GELU,其中每一個評估值都記錄了三次運行的結果。

在機器翻譯任務上,研究者在 WMT 2014 EnglishGerman 數據集上測試了 12 層 Transformer 的效果。在不同的測試集上,似乎 Swish 激活函數都是最好的,當然 GELU 的效果也不差,它們相差並不大。

最後,我們在 GELU 的引用文獻中發現了大量序列建模都採用它作為激活函數,不論是語言建模還是聲學建模。也許之前序列建模常採用 tanh() 而不是 ReLU() 作為激活函數,在發現有更好的選擇後,更多的研究者嘗試接受這種非線性單元。

如前文所述,GELU 的近似實現方式有兩種,藉助 tanh() 和藉助σ()。我們在 GPT-2 的官方代碼中也發現,更多研究者採用了 tanh() 的實現方式儘管它看起來要比 xσ(1.702x) 複雜很多。

# GPT-2 的 GELU 實現def gelu(x): return 0.5*x*(1+tf.tanh(np.sqrt(2/np.pi)*(x+0.044715*tf.pow(x, 3))))

不管怎麼樣,作為神經網絡最基礎的模塊,我們總希望在 ReLU 之上,在 GELU 和 Swish 之上能有更多的創新與觀點。

相關焦點

  • 超越ReLU卻鮮為人知3年後被挖掘:BERT、GPT-2等都在用的激活函數
    據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。
  • 超越ReLU卻鮮為人知,3年後被挖掘:BERT、GPT-2等都在用的激活函數
    據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。
  • 這個激活函數超越ReLU卻鮮為人知?3年後被挖掘:BERT、GPT-2等都在用!
    據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。
  • 這個激活函數超越ReLU卻鮮為人知,BERT、GPT-2等都在用!
    據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。
  • TF2.0-五種優化器,激活函數(sigmoid,tanh,relu,leaky relu的優缺點),損失函數,正則化等
    ,採用的激活函數relu第7行:最後的輸出層,採用的激活函數sigmoid第9~11行:compile彙編器中,optimizer優化器用的:Adam,損失函數用的二分類的交叉熵binary_crossentropy。
  • 大貝貝,激活函數 sigmoid、tanh、relu
    激活函數是連續的(continuous),且可導的(differential)。激活函數常見的激活函數:sigmoid,tanh,relu。sigmoidsigmoid是平滑(smoothened)的階梯函數(step function),可導(differentiable)。sigmoid可以將任何值轉換為0~1概率,用於二分類。
  • 如何用 GPT2 和 BERT 建立一個可信的 reddit 自動回復機器人?
    上個月,我嘗試構建一個 reddit 評論機器人,通過結合兩個預先訓練的深度學習模型 GPT-2 和 BERT 生成自然語言回復。在這裡我想一步一步地介紹一下我的工作,這樣其他人就可以用我所建立的東西來工作了。如果願意,可以直接跳轉到項目代碼:https://github.com/lots-of-things/gpt2-bert-reddit-bot 。
  • 2020ECCV|FReLU--曠視提出的超越ReLU的激活函數!
    開源地址:https://github.com/megvii-model/FunnelAct Funnel Activation本文提出的FReLU激活函數超越ReLU及其改進,在圖像分類任務上更加有效,並且遷移到目標檢測和圖像分割任務上泛化性更強,如圖1所示。
  • 總結|激活函數之sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU
    sigmoid 這樣的函數常被稱為非線性函數,因為我們不能用線性的項來描述它。很多激活函數都是非線性或者線性和非線性的組合(有可能函數的一部分是線性的,但這種情況很少見)。儘管我們沒法用大多數工具繪製其圖形,但你可以這樣用圖解釋 ReLU。x 值小於零的一切都映射為 0 的 y 值,但 x 值大於零的一切都映射為它本身。也就是說,如果我們輸入 x=1,我們得到 y=1。
  • Relu函數的優點是啥
    問題引入常見的激活函數有sigmoid, relu,Leaky ReLU等,上次我們介紹了sigmoid
  • 從ReLU到GELU,一文概覽神經網絡的激活函數
    我會在 MNIST 數據集上進行一些小型代碼實驗,為每個激活函數都獲得一張損失和準確度圖。sigmoid 函數是什麼?sigmoid 這樣的函數常被稱為非線性函數,因為我們不能用線性的項來描述它。很多激活函數都是非線性或者線性和非線性的組合(有可能函數的一部分是線性的,但這種情況很少見)。這基本上沒什麼問題,但值恰好為 0 或 1 的時候除外(有時候確實會發生這種情況)。為什麼這會有問題?
  • 為什麼ReLu激活函數要好於tanh和sigmoid?
    當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。多加一句,現在主流的做法,會多做一步batch normalization,儘可能保證每一層網絡的輸入具有相同的分布[1]。
  • NLP中的詞向量對比:word2vec/glove/fastText/elmo/GPT/bert
    (word2vec vs glove vs LSA)7、 elmo、GPT、bert三者之間有什麼區別?(elmo vs GPT vs bert)二、深入解剖word2vec1、word2vec的兩種模型分別是什麼?2、word2vec的兩種優化方法是什麼?它們的目標函數怎樣確定的?訓練過程又是怎樣的?
  • Batch Normalization應該放在ReLU非線性激活層的前面還是後面?
    因此,實際上,無論是放非線性激活之前,還是之後,也許都能發揮這個作用。只不過,取決於具體激活函數的不同,效果也許有一點差別(比如,對sigmoid和tanh而言,放非線性激活之前,也許順便還能緩解sigmoid/tanh的梯度衰減問題,而對ReLU而言,這個平滑作用經ReLU「扭曲」之後也許有所衰弱)。
  • 神經網絡中的激活函數解析:Sigmoid, tanh, Softmax, ReLU, Leaky ReLU
    非線性激活函數非線性激活函數是最常用的激活函數,非線性的圖看起來像下面這樣:所以,它常常用在那些需要預測概率的模型上面,因為概率的範圍就是0到1,sigmoid正好符合。這個函數可微的,意思是,sigmoid曲線上的任意兩點都可以找到一個斜率。這個函數是單調的,不過函數的導數不是單調的。
  • Mish:一個新的SOTA激活函數,ReLU的繼任者
    每條記錄都是用Mish而不是ReLU。我發現Mish在訓練穩定性、平均準確率(1-2.8%)、峰值準確率(1.2% - 3.6%)等方面都有了全面的提高,與本文的結果相匹配或超過。下面是Ranger Optimizer + Mish與FastAI排行榜相比:
  • Pytorch_第九篇_神經網絡中常用的激活函數
    神經網絡中常用的激活函數Introduce理論上神經網絡能夠擬合任意線性函數,其中主要的一個因素是使用了非線性激活函數(因為如果每一層都是線性變換,那有啥用啊,始終能夠擬合的都是線性函數啊)。本文主要介紹神經網絡中各種常用的激活函數。以下均為個人學習筆記,若有錯誤望指出。
  • 文本挖掘從小白到精通(十六)--- 像使用scikit-learn一樣玩轉BERT
    |【文本挖掘系列教程】:上一篇文章談到如何簡便的使用bert,好用是好用,但延展性、靈活性不足,主要是很難加入各種自定義特性(比如pipeline、和數值型特徵混合使用等)。更多關於BERT工作原理的信息,可以閱讀Jay Alamar關於BERT原理(http://jalammar.github.io/illustrated-bert ) 和如何使用BERT(http://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/ )的2篇優秀博客文章。
  • 【DL知識拾貝】Pytorch版本第一篇:激活函數大匯總
    如果沒有激活函數引入的非線性,無論神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,多層神經網絡就相當於單層的神經網絡,從而對數據只是做仿射變換,⽽多個仿射變換的疊加仍然是⼀個仿射變換,網絡的逼近能力就相當有限,這樣是不能學習到複雜關係的。
  • 人工智慧-深度學習-激活函數ReLU,Sigmoid,TanH,ELU,MaxOut
    激活函數:在多層神經網絡中,上層節點的輸出和下層節點的輸入之間具有一個函數關係,這個函數稱為激活函數(又稱激勵函數)激活函數的本質:激活函數是來向神經網絡中引入非線性因素的,通過激活函數,神經網絡就可以擬合各種曲線。