GELU 激活函數

Gaussian Error Linerar Units(GELUS)

論文鏈接:https://arxiv.org/abs/1606.08415
最近在看bert源碼,發現裏邊的激活函數不是Relu等常見的函數,是一個新的激活函數GELUs, 這裏記錄分析一下該激活函數的特點。

不管其他領域的鄙視鏈,在激活函數領域,大家公式的鄙視鏈應該是:Elus > Relu > Sigmoid ,這些激活函數都有自身的缺陷, sigmoid容易飽和,Elus與Relu缺乏隨機因素。

在神經網絡的建模過程中,模型很重要的性質就是非線性,同時爲了模型泛化能力,需要加入隨機正則,例如dropout(隨機置一些輸出爲0,其實也是一種變相的隨機非線性激活), 而隨機正則與非線性激活是分開的兩個事情, 而其實模型的輸入是由非線性激活與隨機正則兩者共同決定的。

GELUs正是在激活中引入了隨機正則的思想,是一種對神經元輸入的概率描述,直觀上更符合自然的認識,同時實驗效果要比Relus與ELUs都要好。

GELUs其實是 dropout、zoneout、Relus的綜合,GELUs對於輸入乘以一個0,1組成的mask,而該mask的生成則是依概率隨機的依賴於輸入。假設輸入爲X, mask爲m,則m服從一個伯努利分佈(Φ(x)\Phi(x), Φ(x)=P(X<=x),X\Phi(x)=P(X<=x), X服從標準正太分佈),這麼選擇是因爲神經元的輸入趨向於正太分佈,這麼設定使得當輸入x減小的時候,輸入會有一個更高的概率被dropout掉,這樣的激活變換就會隨機依賴於輸入了。
數學表達如下:
GELU(x)=xP(X<=x)=xΦ(x)GELU(x) = xP(X<=x) = x\Phi(x)
這裏Φ(x)\Phi(x)是正太分佈的概率函數,可以簡單採用正太分佈N(0,1)\N(0,1), 要是覺得不刺激當然可以使用參數化的正太分佈N(μ,σ)\N(\mu,\sigma), 然後通過訓練得到μ,σ\mu,\sigma

對於假設爲標準正太分佈的GELU(x)GELU(x), 論文中提供了近似計算的數學公式,如下:
GELU(x)=0.5x(1+tanh[2/π(x+0.044715x3)])GELU(x) = 0.5x(1+tanh[\sqrt{2/\pi}(x+0.044715x^3)])
翻看bert源碼給出的GELU代碼表示如下:

def gelu(input_tensor):
	cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))
	return input_tesnsor*cdf

感覺bert源碼中的近似計算更簡單,具體怎麼近似的,我猜不出來。

下面貼一些論文的實驗圖,就是證明GELU學習更快且更好:
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章