GELU激活函数

论文链接:https://arxiv.org/abs/1606.08415

在神经网络的建模过程中,模型很重要的性质就是非线性,同时为了模型泛化能力,需要加入随机正则,例如dropout(随机置一些输出为0,其实也是一种变相的随机非线性激活), 而随机正则与非线性激活是分开的两个事情, 而其实模型的输入是由非线性激活与随机正则两者共同决定的。

GELUsGELUs正是在激活中引入了随机正则的思想,是一种对神经元输入的概率描述,直观上更符合自然的认识,同时实验效果要比RelusRelusELUsELUs都要好。
GELUsGELUs其实是 dropoutdropoutzoneoutzoneoutRelusRelus的综合,GELUsGELUs对于输入乘以一个0,10,1组成的maskmask,而该maskmask的生成则是依概率随机的依赖于输入。假设输入为X,maskX, maskmm,则mm服从一个伯努利分布(Φ(x),Φ(x)=P(X<=x),X)(\Phi(x), \Phi(x)=P(X<=x), X服从标准正太分布), 这么选择是因为神经元的输入趋向于正太分布,这么设定使得当输入xx减小的时候,输入会有一个更高的概率被dropoutdropout掉,这样的激活变换就会随机依赖于输入了。

数学表达如下:

GELU(x)=xP(X<=x)=xΦ(x) GELU(x)=xP(X<=x)=xΦ(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)])

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

GELU学习更快且更好:
在这里插入图片描述

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