因为一些原因必须使用python2+低版本的pytorch来跑代码,其中就遇到了低版本pytorch没有封装GELU激活函数的情况,所以在网上把该函数的源码找到了,自己构造了一个基于nn.Module的版本:
class GELU(nn.Module):#zengen
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))))
return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0)))
其中第一个注释掉了的return是gelu原文中提出的一种近似计算版本,而下面那一个是pytorch中封装的版本,实测第一种会和nn.GELU计算的值略有差异,因此使用第二种。