(转载请注明出处哦~)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