激活函数:从ReLU到SwiGLU

本文主要介绍常用的激活函数

image 1

ReLU激活函数**

最初的 Transformer 中 FFN 层使用的就是ReLU激活函数。

1
2
def relu(x):
return np.maxinum(0,x)

优点:计算简单,输出具有稀疏性。

缺点:

GELU激活函数

论文《Gaussian Error Linear Units(GELUs)》提出了GELU,这是ReLU的平滑版本。

1
2
def gelu(x):
return x * norm.cdf(x)

这是一个处处可微的非线性函数。

优点:具有更光滑的导数,避免梯度消失,提高模型的性能,加速收敛。

Swish激活函数

论文《Swish: a Self-Gated Activation Function》提出了Swish,这也是对带有非零负值梯度的ReLU平滑版本。

1
2
def swish(x, beta=1):
return x * (1 / (1 + np.exp(-beta * x)))

Swish同样是个处处可微的非线性函数,且有一个参数beta用于控制函数的形状。

GLU及其变体

GLU(Gated Linear Units)其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个sigmoid函数(可以替换成其他激活函数)用来控制信息能够通过多少。