一、原理
,其实就是x乘以标准正态分布的分布函数,这个积分公式不好计算,所以近似等于下面的公式:
几个激活函数的对比如下图:
由上图可知:GELU激活函数具有以下优点:
1.与RELU相比,函数不会对所有小于等于0的x一视同仁全取为0,全取为0后会导致导数恒等于0,从而导致梯度消失,从而GELU激活函数消除了梯度消失的问题。
2.在x=0处,RELU激活函数不可导,而GELU激活函数在x=0处是光滑的曲线,是可导的。
3.GELU函数在激活函数的非线性变换中引入了类似于sigmoid函数的变换,这使得GELU函数的输出可以落在一个更广的范围内,有助于加速模型的收敛速度。
二、代码
具体代码如下:
# Gelu激活函数的实现 # 利用近似的数学公式 #--------------------------------------# class GELU(nn.Module): def __init__(self): super(GELU, self).__init__() def forward(self, x): return 0.5 * x * (1 + torch.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * torch.pow(x,3))))