機器之心報導
機器之心編輯部
至少在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 個驗證樣本來對初始學習率 {10^3,10^4,10^5} 進行微調,然後基於交叉驗證的學習率再次在整個訓練集上進行訓練。他們通過 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 English→German 數據集上測試了 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 之上能有更多的創新與觀點。