[Deep Learning] GELU (Gaussian Error Linerar Units)


(轉載請注明出處哦~)

參考鏈接:

1. 誤差函數的wiki百科:https://zh.wikipedia.org/wiki/%E8%AF%AF%E5%B7%AE%E5%87%BD%E6%95%B0

2. 正態分布的博客:https://blog.csdn.net/hhaowang/article/details/83898881

3. StackExchange Mathematics: Why the error function is so similar to the hyperbolic tangent? 

https://math.stackexchange.com/questions/1892553/why-the-error-function-is-so-similar-to-the-hyperbolic-tangent

4. WolframAlpha: y = tanh(x) - \int_{0}^{x}e^{-t^{2}}dt

https://www.wolframalpha.com/input/?i=y+%3D+tanh(x)+-+%5Cint_%7B0%7D%5E%7Bx%7De%5E%7B-t%5E%7B2%7D%7Ddt

前導知識:正態分布(section 1),誤差函數(section 2),ReLU,ELU, dropout, zoneout.

5. GELU 論文:https://arxiv.org/abs/1606.08415

6. Data Science: What is GELU activation?  https://datascience.stackexchange.com/questions/49522/what-is-gelu-activation

7. Logistic vs Gaussian: http://visionlab.harvard.edu/Members/Anne/Math/Logistic_vs_Gaussian.html

8. Normal approximation to logistic distribution: https://www.johndcook.com/blog/2010/05/18/normal-approximation-to-logistic/

$$GELU(x) = \Phi(x) * I(x) + (1 - \Phi(x)) * 0x = x\Phi(x) $$

其近似為:

$$ GELU(x) = 0.5x(1 + tanh[\sqrt{2/\pi} (x + 0.044715x^3)]) $$ 

或者 $x\sigma(1.702x)$ 

TL; NR

GELU激活函數的最大特點是將非線性與依賴輸入數據分布的隨機正則化器相結合在一個激活函數的表達中。與以往dropout指定隨機概率值或ReLU根據輸入值的正負進行mask的方式不同,GELU根據當前input大於其余inputs的概率進行隨機正則化,即為在mask時依賴輸入的數據分布。

Trick:對公式中的正態分布的累積分布函數進行了tanh三階多項式近似,取得了相較於swish用sigmoid近似更好的效果。

博客中section1,2為推導tanh近似表達式的先導知識,不需要的話可以直接跳過,直接看section3.

1. 正態分布

1.1 定義

若隨機變量$X$服從一個數學期望為$\mu$,方差為$\sigma^2$的正態分布,記為$N(\mu, \sigma^2)$。當$\mu = 0$,$\sigma = 1$時的正態分布為標准正態分布。

  

圖1. 正態分布的概率密度函數圖像                                圖2. 正態分布的累積分布函數圖像

 

1.2 概率密度函數

1.3 累積分布函數

累積分布函數是指隨機變量$X$小於或等於$x$的概率,用概率密度函數表示為:

正態分布的累積分布函數可以用“誤差函數” erf 表示:

其中誤差函數的表達式為:

1.4 標准正態分布

標准正態分布的累積分布函數:

用誤差函數表示的公式簡化可得:

它的反函數被稱為反誤差函數:

 

該分位數函數有時也被稱為probit函數。probit函數已被證明沒有初等原函數。

正態分布的累積分布函數$\Phi(x)$沒有解析表達式,它的值可以通過數值積分、泰勒級數、或者漸近序列近似得到。

2. 誤差函數

2.1 定義

1) 誤差函數,也稱高斯誤差函數(Error Function or Gauss Error Function), 是一個非基本函數(即不是初等函數)。

自變量為$x$ 的誤差函數的定義為:

2) 互補誤差函數

2.2 誤差函數與正態分布

誤差函數與標准正態分布的累積分布函數$\Phi$的關系為:

二者本質上是相同的。

2.3 性質(部分)

1) 誤差函數是奇函數 $erf(-z) = -erf(z)$

2) 誤差函數的導數

3) 泰勒級數

泰勒級數(Taylor Series) 的定義:

如果$f(x)$在點$x = x_0$具有任意階導數,則冪函數

稱為$f(x)$在點$x_0$處的泰勒級數。

 

注意區分泰勒公式和泰勒級數:泰勒級數要求在$x = x_0$處具有任意階導數,而泰勒公式要求具有直到$n + 1$階連續導數

泰勒公式

誤差函數的泰勒級數:

4) 與Tanh的關系

$$erf(x) \approx 2/sqrt{\pi}tanh(x)$$

(1) 可以查看 WolframAlpha的關於二者對比的圖像:

https://www.wolframalpha.com/input/?i=y+%3D+tanh(x)+-+%5Cint_%7B0%7D%5E%7Bx%7De%5E%7B-t%5E%7B2%7D%7Ddt

圖3. $tanh(x) - \sqrt{\pi}/2erf(x)$的圖像

可以看出,大約在 x < 0.8,二者非常接近。

(2) 也可以通過分析二者的泰勒級數來計算差距:

 當 $x < 0.809$時,

3. GELU

GELU: Gaussian Error Linear Unit 高斯誤差線性單元

3.1 Abstract

GELU非線性的實現是對神經網絡的輸入進行隨機正則化的變化,為輸入匹配一個或0或1的隨機值。

與ReLU的不同:GELU為其按照輸入的magnitude(等級)為inputs加權值的;ReLUs是根據inputs的sign(正負)來gate(加門限)的。

論文實驗證明GELU在多項計算機視覺, 自然語言處理,語音任務上效果優於ReLU, ELU。

3.2 Introduction

TL; NR:

1) 以往的激活函數為神經網絡進入了非線性(binary threshold, sigmoid, ReLU, ELU, 及特點和優劣)

2) 另外神經網絡中需要在網絡層中加入一些noise,或通過加入dropout等方式進行隨機正則化。

3) 以往的非線性和隨機正則化這兩部分基本都是互不相關的,因為輔助非線性變換的那些隨機正則化器是與輸入無關的。

4) GELU將非線性與隨機正則化結合,是Adaptive Dropout的修改。

3.3 GELU Formulation

GELU的motivation是結合dropout, zoneout, ReLUs。

3.3.1 GELU與ReLU, dropout, zoneout 之間的聯系與區別

1) dropout 與 ReLU:ReLU中Input乘以一個0或者1,所乘的值是確定的;dropout也會乘以一個0或者1,所乘的值是隨機的;

2) zoneout:zoneout是一個RNN正則化器,它會為inputs隨機乘1.

3) GELU:GELU也會為inputs乘以0或者1,但不同於以上的或有明確值或隨機,GELU所加的0-1mask的值是隨機的,同時是依賴於inputs的分布的。可以理解為:GELU的權值取決於當前的輸入input有多大的概率大於其余的inputs.

3.3.2 GELU的表達式

1) 定義:

將input x 乘以一個服從伯努利分布的m。而該伯努利分布又是依賴於輸入Input x的。

$$ m \sim Bernoulli(\Phi(x)) , where \Phi(x) = P(X <= x)$$

$X \sim N(0, 1) $是標准正態分布的累積分布函數。選用正態分布的原因:一般神經元的輸入數據的分布傾向於服從正態分布,尤其是進行了BatchNorm之后。

如何理解呢?

舉個例子:

有一個服從正態分布的隨機變量X,它在不斷地變化,它不停歇的沿着鍾形曲線走來走去。現在網絡中有了 輸入值 input x = x0,就在此刻這個服從正態分布的隨機變量取值為 X = X0,就可以比較 X0 與 x0的大小了。

當然X是服從正態分布的,我們可以依據該概率分布函數的特點,分析出一般情況下 X有多大概率是小於某個確定值x的。(比如P(X < 0.5) = 0.5)就得到了$\Phi(x)$。

正態分布的累積分布函數如上圖2所示,可以看出當x變小時,P(X <= x)的值會減小,也就是當輸入值inpuits 較小時,inputs被drop 的可能性更大。

GELU通過這種方式加mask,既保持了不確定性,又建立了與input的依賴關系

2) GELU的表達式:

$$GELU(x) = \Phi(x) * I(x) + (1 - \Phi(x)) * 0x = x\Phi(x) $$

其近似為:

$$ GELU(x) = 0.5x(1 + tanh[\sqrt{2/\pi} (x + 0.044715x^3)]) $$ 

或者 $x\sigma(1.702x)$ 

3) GELU的圖示:

$$GELU(x):=xP(X<= x) = x\Phi(x) = 0.5x(1 + erf(x / \sqrt{2})) $$

圖4. GELU函數圖像

4) GELU的tanh近似表達的推導過程:

$$GELU(x):=xP(X<= x) = x\Phi(x) = 0.5x(1 + erf(x / \sqrt{2})) $$

$$erf(x) \approx 2/\sqrt{\pi} tanh(x)$$

因為gelu中含有erf項,無解析表達式,這里主要對該項進行近似表達。

(GELU論文中是引用的 Amit Choudhury. A simple approximation to the area under standard normal curve. In Mathematics and Statistics, 2014) (以下推導內容是網上搜集到的兩種方法)

(1) 通過采樣點擬合多項式參數的方法

因為在x = 0處 $erf(2 / \sqrt{2})$的一階導與$tanh(\sqrt{2/\pi})$相同,均為$sqrt{2 / \pi}$,推導見下圖5:

那么我們可以通過尋找

$$tanh(\sqrt{2/\pi}*(x + ax^2 + bx^3 + cx^4 + dx^5))$$

(或更多項的)系數來用tanh近似表示這一系列點的集合$(x_i, erf(x_i / \sqrt{2}))$

圖5. $erf(2 / \sqrt{2})$的一階導與$tanh(\sqrt{2/\pi})$均為$sqrt{2 / \pi}$的推導

之后,可以在https://mycurvefit.com/中輸入erf的一些采樣點,來擬合tanh函數的參數。

https://datascience.stackexchange.com/questions/49522/what-is-gelu-activation中一個answer中采用了在(-1.5, 1.5)之間的20個采樣點,得到的系數為:

圖6. tanh函數內多項式系數

通過設置a = c = d = 0,得到b的估計值為 0.04495641。如果采用更大的范圍或更多的采樣點,b將會更加接近0.044715.

所以可以推導出GELU論文中所給出的

$$ GELU(x) = 0.5x(1 + tanh[\sqrt{2/\pi} (x + 0.044715x^3)]) $$ 

(2) 通過泰勒展開擬合多項式系數

$$erf(x) = 2 / \sqrt{\pi} * (x - x^3 / 3) + o(x^3) $$

$$tanh(x) = x - x^3 / 3 + o(x^3) $$

我們已知:

那么帶入后得到:

   

二者的對應項系數應相同。

解得 $a \approx 0.04553992412252714$ 與paper中的0.044715接近。

$$erf(x/\sqrt{2}) \approx tanh(\sqrt{2/\pi} (x + 0.044715x^3))$$

pretrained-BERT-pytorch/modeling的代碼中:

1 def gelu(x):
2     """Implementation of the gelu activation function.
3         For information: OpenAI GPT's gelu is slightly different (and gives slightly different results):
4         0.5 * x * (1 + torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3))))
5         Also see https://arxiv.org/abs/1606.08415
6     """
7     return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0)))

tensorflow版本的GELU或是GPT使用的是上面紅色注釋中的公式。

其實由上面的推到可以知道,兩段代碼的GELU公式是近似的。

3.4 實驗結果

3.4.1 MNIST 分類

圖7. MNIST實驗結果圖示

。。。其余實驗結果請直接參考論文~ 

3.5 Discussion

3.5.1 GELU, ReLU, ELU形式上的包容

1) GELU 與ReLU

當$\sigma \rightarrow 0$, $\mu = 0$時,GELU將會變成ReLU.

GELU可以看做是對ReLU的平滑。(就像sigmoid是對binary threshold的平滑)

2) GELU與ELU

ELU函數:  

與ReLU 均為非負不同,GELU, ELU 均可正可負。

ELU可以看作是$xP(C <=x),  C \sim Cauchy(0, 1)$ (Cauchy distribution 柯西分布) 的變型,與GELU形式上相近。

3.5.2 GELU, ReLU, ELU的不同

1) GELU這個非凸、非單調的函數在正域內是非線性的,並且在所有點處都有曲率

ReLU, ELU是凸的、單調的函數,並且在正域處是線性的,因此會缺乏曲率。

鑒於此,所增加的曲率部分和非單調性也許可以使GELU表示更為復雜的函數。(相較於ReLU, ELU)

2) ReLU為input加的權重取決於input的正負符號,而當$\mu = 0, \sigma = 1$時,GELU可以理解為其為input加的權值取決於當前的input有多大概率大於其余inputs.

因此,GELU具有概率方面的理解意義,即可以看作是隨機正則化器的期望。

3.5.3 使用GELU的兩條建議

1) 建議與momentum一起使用;

2) 使用高斯分布的累積分布函數的近似表示是非常重要的。

(這里介紹了sigmoid函數也是正態分布的累積分布函數的近似表示,但是Sigmoid Linear Unit (SiLU) xσ(x)的效果雖然比ReLU, ELU的效果好,但不如GELU。因此最終采用的是$0.5x(1 + tanh[ \sqrt{2/\pi}(x + 0.044715x^3 )]))$或者$x\sigma(1.702x)$.

補充:logistic distribution和Gaussian distribution 是非常相近的,見圖8。http://visionlab.harvard.edu/Members/Anne/Math/Logistic_vs_Gaussian.html  相比較而言,Logistic distribution function的圖像在尾處稍厚重一些。

       

圖8. logistic與Gaussian對比                                  圖9. Gaussian $\sigma = 1.6$時 Gaussian與logistic概率密度函數對比

Normal approximation to logistic distribution: https://www.johndcook.com/blog/2010/05/18/normal-approximation-to-logistic/ 這篇博客介紹了一般可以用正態分布改變$\sigma$來擬合logistic分布,(但logistic 可能很難用於擬合正態分布)。

以標准正態分布為例:當$\sigma \rightarrow 1.6$時,二者非常接近,最大相差為0.017.此時二者的圖像見圖9.

3.6 GELU的導數

我在https://www.desmos.com/calculator/l0puzw0zvm中畫了一下GELU的圖像和其對x求導的圖像。

    

圖10. GELU的圖像和其對x求導的函數圖像

由於paper中介紹說xσ(x)的效果不及GELU,所以,也畫了一下swish(x) = xσ(x)的及其導數的圖像:

    

圖11. GELU與swish函數及其導數的函數圖像

在谷歌的另一篇論文中介紹了swish函數,即為$swish(x) =xσ(x)$ 鏈接:https://arxiv.org/pdf/1710.05941.pdf

對比GELU與swish函數,GELU在正值區間的變化更為顯著,因此具有稍高一些的梯度,在反向傳播時可以更有效的更新梯度;

在負值區域,GELU函數的值相較於swish普遍更接近與x軸,因此具有更佳的單邊抑制效果。

比較有意思的是GELU與swish的導數均在負值區間內出現了負數的情況,這與以往的激活函數ReLU, sigmoid, tanh等不同,這些激活函數的導數取值非負。但是GELU導數的負值出現的更早,並且負值更小,swish有較長一段區間都有非常微小的負值,變化並不明顯。個人認為這可能是GELU效果優於xσ(x)及其他激活函數的原因之一。即當input的值在接近-1邊界時,可以通過負的導數的調節,將其拉回較大取值處。GELU相較於swish可能有更好的調節效果。

另外,GELU的導數相較於xσ(x)的導數變化幅度更大一些,對於網絡中權值的更新調節可能更為靈敏。---這只是個人的理解,並非官方論文的結論。


 您願意請我吃一根雪糕嗎?[支付寶] O(∩_∩)O  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM