(轉載請註明出處哦~)html
參考連接:git
1. 偏差函數的wiki百科:https://zh.wikipedia.org/wiki/%E8%AF%AF%E5%B7%AE%E5%87%BD%E6%95%B0github
2. 正態分佈的博客:http://www.javashuo.com/article/p-stznnoeh-em.html網絡
3. StackExchange Mathematics: Why the error function is so similar to the hyperbolic tangent? app
4. WolframAlpha: y = tanh(x) - \int_{0}^{x}e^{-t^{2}}dtui
前導知識:正態分佈(section 1),偏差函數(section 2),ReLU,ELU, dropout, zoneout..net
5. GELU 論文:https://arxiv.org/abs/1606.084153d
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)$
GELU激活函數的最大特色是將非線性與依賴輸入數據分佈的隨機正則化器相結合在一個激活函數的表達中。與以往dropout指定隨機機率值或ReLU根據輸入值的正負進行mask的方式不一樣,GELU根據當前input大於其他inputs的機率進行隨機正則化,即爲在mask時依賴輸入的數據分佈。
Trick:對公式中的正態分佈的累積分佈函數進行了tanh三階多項式近似,取得了相較於swish用sigmoid近似更好的效果。
博客中section1,2爲推導tanh近似表達式的先導知識,不須要的話能夠直接跳過,直接看section3.
若隨機變量$X$服從一個數學指望爲$\mu$,方差爲$\sigma^2$的正態分佈,記爲$N(\mu, \sigma^2)$。當$\mu = 0$,$\sigma = 1$時的正態分佈爲標準正態分佈。
圖1. 正態分佈的機率密度函數圖像 圖2. 正態分佈的累積分佈函數圖像
累積分佈函數是指隨機變量$X$小於或等於$x$的機率,用機率密度函數表示爲:
正態分佈的累積分佈函數能夠用「偏差函數」 erf 表示:
其中偏差函數的表達式爲:
標準正態分佈的累積分佈函數:
用偏差函數表示的公式簡化可得:
它的反函數被稱爲反偏差函數:
該分位數函數有時也被稱爲probit函數。probit函數已被證實沒有初等原函數。
正態分佈的累積分佈函數$\Phi(x)$沒有解析表達式,它的值能夠經過數值積分、泰勒級數、或者漸近序列近似獲得。
1) 偏差函數,也稱高斯偏差函數(Error Function or Gauss Error Function), 是一個非基本函數(即不是初等函數)。
自變量爲$x$ 的偏差函數的定義爲:
2) 互補偏差函數
偏差函數與標準正態分佈的累積分佈函數$\Phi$的關係爲:
兩者本質上是相同的。
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的關於兩者對比的圖像:
圖3. $tanh(x) - \sqrt{\pi}/2erf(x)$的圖像
能夠看出,大約在 x < 0.8,兩者很是接近。
(2) 也能夠經過分析兩者的泰勒級數來計算差距:
當 $x < 0.809$時,
GELU: Gaussian Error Linear Unit 高斯偏差線性單元
GELU非線性的實現是對神經網絡的輸入進行隨機正則化的變化,爲輸入匹配一個或0或1的隨機值。
與ReLU的不一樣:GELU爲其按照輸入的magnitude(等級)爲inputs加權值的;ReLUs是根據inputs的sign(正負)來gate(加門限)的。
論文實驗證實GELU在多項計算機視覺, 天然語言處理,語音任務上效果優於ReLU, ELU。
TL; NR:
1) 以往的激活函數爲神經網絡進入了非線性(binary threshold, sigmoid, ReLU, ELU, 及特色和優劣)
2) 另外神經網絡中須要在網絡層中加入一些noise,或經過加入dropout等方式進行隨機正則化。
3) 以往的非線性和隨機正則化這兩部分基本都是互不相關的,由於輔助非線性變換的那些隨機正則化器是與輸入無關的。
4) GELU將非線性與隨機正則化結合,是Adaptive Dropout的修改。
GELU的motivation是結合dropout, zoneout, ReLUs。
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.
將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的依賴關係。
$$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)$
$$GELU(x):=xP(X<= x) = x\Phi(x) = 0.5x(1 + erf(x / \sqrt{2})) $$
圖4. GELU函數圖像
$$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.1 MNIST 分類
圖7. MNIST實驗結果圖示
。。。其他實驗結果請直接參考論文~
1) GELU 與ReLU
當$\sigma \rightarrow 0$, $\mu = 0$時,GELU將會變成ReLU.
GELU能夠看作是對ReLU的平滑。(就像sigmoid是對binary threshold的平滑)
2) GELU與ELU
與ReLU 均爲非負不一樣,GELU, ELU 都可正可負。
ELU能夠看做是$xP(C <=x), C \sim Cauchy(0, 1)$ (Cauchy distribution 柯西分佈) 的變型,與GELU形式上相近。
1) GELU這個非凸、非單調的函數在正域內是非線性的,而且在全部點處都有曲率。
ReLU, ELU是凸的、單調的函數,而且在正域處是線性的,所以會缺少曲率。
鑑於此,所增長的曲率部分和非單調性也許可使GELU表示更爲複雜的函數。(相較於ReLU, ELU)
2) ReLU爲input加的權重取決於input的正負符號,而當$\mu = 0, \sigma = 1$時,GELU能夠理解爲其爲input加的權值取決於當前的input有多大機率大於其他inputs.
所以,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.
我在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