前言
在深度学习相关的算法当中如果没有激活函数,就算模型结构再复杂都无法对非线性的数据进行相应的处理。而激活函数的加入则可以非常有效的解决这个问题。如今随着大模型时代的到来,不同的模型当中也采用了不同的激活函数,本文将对常见开源大模型中经常使用的激活函数进行简单的总结。
ReLU
ReLU函数,全称为修正线性单元(Rectified Linear Unit),是深度学习中常用的激活函数之一。
公式
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0, x)
f(x)=max(0,x)
当输入的
x
x
x为正数时,输出就等于输入
x
x
x本身;当输入
x
x
x为负数时,输出为0。
图像
优缺点
由上图可以看到,ReLU函数当值小于0时将对应的数据映射为0,而大于0的时候保持不变,这种激活函数运算非常简单,而且不存在饱和问题可以有效缓解梯度消失的问题。但是由于小于0的值会置零,这样容易导致对应的权重无法进行更新,这种现象被称为“神经元死亡”。
GELU
GELU全称为高斯误差线性单元(Gaussian Error Linear Units)在论文《Gaussian Error Lineas Units》(GELUs)中提出,设计灵感来自于随机神经网络和高斯误差函数,通过模仿自然神经元的行为,即输入信号与噪声的交互。
公式
具体的公式可以表示为
G
E
L
U
(
x
)
=
x
P
(
X
≤
x
)
=
x
Φ
(
x
)
=
x
⋅
1
2
[
1
+
e
r
f
(
x
2
)
]
GELU(x) = xP(X\le x) = x\Phi (x) = x·\frac{1}{2} [1+erf(\frac{x}{\sqrt{2} } )]
GELU(x)=xP(X≤x)=xΦ(x)=x⋅21[1+erf(2x)]
其中
e
r
f
(
x
)
erf(x)
erf(x)表示高斯误差函数。
上面这个公式无法直接有效的进行计算,因此该函数也可以被近似的表示为
G
E
L
U
(
x
)
=
0.5
x
[
1
+
t
a
n
h
(
2
π
(
x
+
0.047715
x
3
)
)
]
GELU(x) = 0.5x[1+tanh(\sqrt{\frac{2}{π} }(x+0.047715x^3)) ]
GELU(x)=0.5x[1+tanh(π2(x+0.047715x3))]或者
G
E
L
U
(
x
)
=
x
∗
σ
(
1.702
x
)
GELU(x)=x*\sigma (1.702x)
GELU(x)=x∗σ(1.702x)。
图像
优缺点
GELU函数与ReLU相比,在负值区域添加了一个非零的梯度,可以有效避免死亡神经元的问题。另外,GELU在0附近比ReLU更加平滑,因此在训练过程中更容易收敛,因此GELU比ReLU更加稳定和高效。但是GELU的计算比较复杂,因此需要消耗更多的计算资源。
GELU激活函数在常见的自然语言处理相关的模型中应用得非常广泛,如BERT、GPT、GLM、BLOOM等开源模型中进行了非常广泛的应用
GLU
GLU(Gated Linear Units,门控线性单元),是在论文《Language Modeling with Gated Convolutional Networks》中提出的。这个激活函数具有门控机制,可以帮助网络更好地捕捉序列数据中的长期依赖关系。理解GLU的关键就在于它的门控机制。门控机制使得GLU能够选择性地过了输入向量的某些部分,并根据输入的上下文来调整输出。
公式
GLU激活函数的公式是
h
l
(
X
)
=
(
X
∗
W
+
b
)
⊗
σ
(
X
∗
V
+
c
)
h_l(X) = (X * W + b) \otimes \sigma (X*V + c)
hl(X)=(X∗W+b)⊗σ(X∗V+c)
其中
σ
\sigma
σ为sigmoid函数,
⊗
\otimes
⊗为逐元素相乘。
图像
优缺点
GLU是一种类似LSTM带有门机制的网络结构,同时类似Transformer一样具有可堆叠性和残差连接,它的作用是完成对输入文本的表征,通过门机制控制信息通过的比例,来让模型自适应地选择那些单词和特征对预测下一个词有帮助,通过堆叠来挖掘高阶语义,通过残差连接来缓解堆叠的梯度消失和爆炸。
Swish
Swish是在论文《Swish: a Self-Gated Activation Function》提出的,Swish的设计受到LSTM和highway network中使用sigmoid函数进行门控的启发,使用同样的值进行门控来简化门控机制,称为自门控(self-gating)。自门控的优势是它仅需要一个简单的标量输入,而其他的门控需要多个标量输入。该特性令使用自门控的激活函数能够轻松替换以单个标量作为输入的激活函数(如ReLU),无序改变参数的隐藏容量或数量。
公式
f ( x ) = x ∗ s i g m o i d ( β x ) f(x) = x * sigmoid(\beta x) f(x)=x∗sigmoid(βx)
图像
优缺点
当输入值大于0时和ReLU函数一样没有上边界,因此不会出现梯度饱和的情况,可以有效的避免过拟合;
当输入值小于0时有下边界,可以产生更强的正则化效果;
该函数处处可导,因此在实际训练过程中更加平滑,因此在优化和泛化中可以起到非常重要的作用。
Softplus
Softplus激活函数可以看做是ReLU的平滑版本,属于非线性激活函数的一种,与ReLU相比,Softplus提供了更平滑的过渡从负无穷到正数域。这种平滑性使得Softplus在处理某些问题,特别是在需要连续且可微的函数时可以变得更加稳定。
公式
对应的公式如下所示:
f
(
x
)
=
l
n
(
1
+
e
x
)
f(x) = ln(1+e^x)
f(x)=ln(1+ex)
图像
优缺点
Softplus函数可以看成是ReLU的平滑版本,加上1以后可以保证非负性,在处理相应问题时可以变得更加平滑,可以有效的提高模型的性能和训练效率。
Softplus激活函数在0点处是可导的。不过相对于ReLU而言,Softplus在运算时耗费的时间相比较多。
Mish
Mish激活函数是在论文《A Self Regularized Non-Monotonic Activation Function》中提出的,从Swish激活函数中获得灵感得到的,也让输入变量与其非线性变化后的激活值相乘,只是将非线性变化部分的缩放参数 β \beta β用softplus激活函数来代替。这样无须输入任何标量(缩放参数)就可以更改网络参数。
公式
对应的公式如下:
f
(
x
)
=
x
∗
T
a
n
h
(
S
o
f
t
p
l
u
s
(
x
)
)
=
x
∗
T
a
n
h
(
l
n
(
1
+
e
x
)
)
f(x) = x*Tanh(Softplus(x)) = x * Tanh(ln(1+e^x))
f(x)=x∗Tanh(Softplus(x))=x∗Tanh(ln(1+ex))
图像
优缺点
相比于Swish激活函数,Mish没有参数,使用起来更加方便;同时Mish激活函数没有边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和,可以对负值的轻微允许更好的梯度流;同时采用了平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化性能。
无上界有下界(没有上限),这样可以保证没有饱和区域,因此在训练过程中不会有梯度消失的问题。
非单调性函数,输入较小负数的时候往往梯度回传也会很小,这样会导致收敛较慢,但是如果输入较大负数的时候不缩小的话,又容易梯度爆炸。这种性质有助于小的负值,从而稳定网络梯度流。
无穷阶连续性和光滑性,Mish函数是光滑函数,具有较好的泛化能力和结果的有效优化能力,可以提高结果的质量。
SwiGLU
激活函数SwiGLU是在论文《GLU Variants Improve Transformer》提出的,是目前大语言模型当中经常使用到的激活函数,目前在LLaMA、PALM、Qwen(通义千问)、Baichuan(百川)等开源大模型中使用的都是SwiGLU激活函数。
公式
。该激活函数是将Swish和GLU两个激活函数进行了结合,本质上还是一个GLU,但不是使用Sigmoid作为激活函数,而是采用了
β
=
1
\beta =1
β=1的Swish。因此对应的公式如下
S
w
i
G
L
U
(
x
)
=
S
w
i
s
h
β
(
x
W
+
b
)
⊗
(
x
V
+
c
)
SwiGLU(x) = Swish_\beta(xW+b) \otimes(xV+c)
SwiGLU(x)=Swishβ(xW+b)⊗(xV+c)
图像
优缺点
Swish对于负值的响应较小克服了ReLU在负值上出现“神经元死亡”的情况。GLU的门控特性意味着可以根据输入的情况来决定哪些信息可以通过,使得网络可以更有效的学习到有用的信息,有助于提高模型的泛化能力。
SwiGLU 中的参数 W1,W2,W3,b1,b2,b3W1,W2,W3,b1,b2,b3 可以通过训练学习,使得模型可以根据不同任务和数据集动态调整这些参数,增强了模型的灵活性和适应性。
计算效率相比某些较复杂的激活函数(如 GELU)更高,同时仍能保持较好的性能。这对于大规模语言模型的训练和推理是很重要的考量因素。