ELUs是“指数线性单元”,它试图将激活函数的平均值接近零,从而加快学习的速度。同时,它还能通过正值的标识来避免梯度消失的问题。根据一些研究,ELUs分类精确度是高于ReLUs的。具有relu
的优势,且输出均值接近零,实际上prelu
和LeakyReLU
都有这一优点。有负数饱和区域,从而对噪声有一些鲁棒性。可以看做是介于relu
和LeakyReLU
之间的一个东西。当然,这个函数也需要计算exp
,从而计算量上更大一些。
bert源码中有一个神奇的激活函数,那就是GeLUs,在激活函数领域,大家公式的鄙视链应该是:Elus > Relu > Sigmoid ,这些激活函数都有自身的缺陷, sigmoid
容易饱和,Elus
与Relu
缺乏随机因素。
bert源码给出的GELU代码表示如下:
def gelu(input_tensor):
cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))
return input_tesnsor*cdf
GeLUs
其实是dropout、zoneout、relus的综合,GeLUs
对于输入乘以一个0,1组成的mask
,而该mask的生成则是依概率随机的依赖于输入。假设输入为X, mask为m,则m服从一个伯努利分布 ( Φ ( x ) , Φ ( x ) = P ( X < = x ) , X 服 从 正 态 分 布 ) (Φ(x),Φ(x)=P(X<=x), X服从正态分布) (Φ(x),Φ(x)=P(X<=x),X服从正态分布) 这么选择是因为神经元的输入趋向于正太分布,这么设定使得当输入x减小的时候,输入会有一个更高的概率被dropout掉,这样的激活变换就会随机依赖于输入了。