6

GELU由来:从狄拉克函数到GELU激活函数

 3 years ago
source link: https://allenwind.github.io/blog/14721/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Mr.Feng Blog

NLP、深度学习、机器学习、Python、Go

GELU由来:从狄拉克函数到GELU激活函数

Transformer兴起后,GELU激活函数流行起来,即便在CNN模型中,也常见GELU替代RELU。这篇文章从数学角度理解GELU是怎样来的。

从狄拉克函数始

狄拉克函数(Dirac delta function),

δ(x)={+∞x=00x≠0

要求满足积分,

∫∞−∞δ(x)dx=1

这个函数看起来及其诡异难理解,这怎么能行?我们可以从极限的思路来理解它,假设有分段函数,

τ(x)={12l,−l≤x≤l0,x<−l,x>l liml→0∫+∞−∞τ(x)dx=1

于是δ(x)的分段式成立。

在量子力学中使用非常广,如Delta位势阱。在概率论上也有应用,例如有离散分布为,

p=(x1,x2,⋯,xnp1,p2,⋯,pn)

其概率密度函数可以使用狄拉克函数紧凑地表示,

p(x)=n∑i=1piδ(x−xi)

显然δ(x)​是一个非常怪异的函数,在数值计算运用时,我们常常寻找其近似形式。

“钟形”曲线近似

狄拉克函数的逼近形式具有两个特点:

  • 关于y​​轴对称的偶函数,函数图形是“钟形”曲线
  • 在R上的积分为1

这两点最容易让人想到的是概率密度函数,因为它的积分一定为1。注意到,正态分布概率密度函数逼近,

δσ(x)≈1√πσ2e−(x/σ)2

这是最容易想到的形式,因为概率密度全定义域积分为1,密度函数对称。取极限,

limσ→01√πσ2e−(x/σ)2=δ(x)

σ不同取值下的可视化,

δα(x)=limα→∞√απe−αx2

此外,还有逼近形式,只不过并不优雅,且存在不不可导点,

δε(x)≈max(0,1−|xε|)ε δ(x)=1πlima→0ax2+a2 δ(x)=limα→∞1πsin(αx)x

如果对δ(x)求积分,得到阶跃(Heaviside step)函数,

H(x)=∫x−∞δ(x)dx≈∫x−∞1√πσ2e−(x/σ)2dx=Φσ(x)=12[1+erf(xσ√2)]

这里σ控制1√πσ2e−(x/σ)2逼近δ(x)的程度,也就是相当于控制12[1+erf(xσ√2)]逼近H(x)​​的程度,σ越小,逼近程度越好。

于是有近似,

H(x)≈12[1+erf(xσ√2)]

类似于从δ(x)​到H(x)​的思路,对H(x)​​再次求积分会如何呢?其实我们得到max0,x​,这个从几何直观容易理解,​

∫x−∞H(x)dx=max{0,x}={0 for x≤0x for x>0

max0,x不就是relu(x)激活函数!同时也注意到,max0,x=x×H(x)。

回顾以上思路,我们似乎找到gelu(x)激活函数的由来。​完整推导如下,

relu(x)={0 for x≤0x for x>0=max{0,x}=x×H(x)=x×∫x−∞δ(x)dx≈x×∫x−∞1|σ|√πe−(x/σ)2dx=x×Φσ(x)=x×12[1+erf(xσ√2)]σ=1=gelu(x)=x×12[1+erf(x√2)]≈x×12[1+tanh(ax+bx3)]

根据论文Gaussian Error Linear Units (GELUs)有结论a=√2π,b=√2π×0.044715。以上推导用到正态分布的累积分布函数Φσ(x)与误差函数erf(x)的关系,

Φσ(x)=∫x−∞1|σ|√πe−(x/σ)2dx=∫0−∞1|σ|√πe−(x/σ)2dx+∫x01|σ|√πe−(x/σ)2dx=12+12erf(xσ√2)

类似的思路获得relu(x)的其他逼近,

relu(x)={0 for x≤0x for x>0=max{0,x}=∫x−∞H(x)dx≈∫x−∞11+e−2kxdx=12kln(1+e2kx)

取k=12​​​​​,有relu(x)≈ln(1+ex)​​,得Softplus函数。

本文从狄拉克函数δ(x)​的光滑近似出发,导出了Transformer中常用的激活函数gelu(x)。

转载请包括本文地址:https://allenwind.github.io/blog/14721
更多文章请参考:https://allenwind.github.io/blog/archives/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK