激活函数大汇总(十二)(GLU & ReGLU附代码和详细公式)
更多激活函数见激活函数大汇总列表
一、引言
欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。
在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。
限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。
二、GLU
GLU (Gated Linear Unit) 激活函数是一种通过学习门控机制来动态调节信息流的方法。它在许多深度学习架构中被用来增强模型的表达能力,特别是在序列处理和语言模型中表现出色。
1. 数学定义
GLU激活函数定义为:
GLU
(
a
,
b
)
=
a
⊙
σ
(
b
)
\operatorname{GLU}(a, b)=a \odot \sigma(b)
GLU(a,b)=a⊙σ(b)
其中:
- a a a和 b b b是相同维度的输入向量。
- ⊙ \odot ⊙表示元素乘法。
-
σ
(
b
)
\sigma(b)
σ(b)是对输入
b
b
b应用Sigmoid激活函数,得到的值在0和1之间,用作门控信号。
2. 函数特性
- 动态门控机制:GLU通过学习 b b b的门控信号来动态地调节 a a a中每个元素的激活强度,这种机制允许模型根据上下文信息自适应地过滤或强化特定的信息流。
- 自适应性强:GLU能够让模型自适应地选择它需要强化或忽略的信息,这有助于模型捕获数据中的复杂依赖关系。
- 非饱和性:由于GLU的输出部分取决于Sigmoid函数,它避免了像ReLU那样的饱和问题,有助于减轻梯度消失问题。
3. 导数
GLU函数关于 a a a和 b b b的导数分别为:
- 对于 a a a: ∂ G L U ∂ a = σ ( b ) \frac{\partial \mathrm{GLU}}{\partial a}=\sigma(b) ∂a∂GLU=σ(b)
- 对于 b b b: ∂ G L U ∂ b = a ⋅ σ ( b ) ⋅ ( 1 − σ ( b ) ) \frac{\partial \mathrm{GLU}}{\partial b}=a \cdot \sigma(b) \cdot(1-\sigma(b)) ∂b∂GLU=a⋅σ(b)⋅(1−σ(b))
这意味着, a a a的梯度受到门控信号 σ ( b ) \sigma(b) σ(b)的调节,而 b b b的梯度则与 a a a的值和门控信号的导数 σ ( b ) ⋅ ( 1 − σ ( b ) ) \sigma(b) \cdot(1-\sigma(b)) σ(b)⋅(1−σ(b))有关。
4. 使用场景与局限性
使用场景:
- 语言模型和序列处理:GLU在处理序列数据,尤其是在构建复杂的语言模型和序列到序列的模型时,能够有效地增强模型的性能。
- 特征选择:在需要模型从大量特征中选择相关信息的任务中,GLU的门控机制可以自适应地过滤掉不重要的特征。
局限性:
- 参数增加:由于GLU对于每个输入都需要一对参数 a a a和 b b b,这可能导致模型参数数量的增加。
- 计算复杂性:相比于一些简单的激活函数,GLU的计算更加复杂,特别是在门控信号需要通过Sigmoid函数计算时。
5.代码实现
import numpy as np
def glu(a, b):
"""
计算GLU激活函数的值。
参数:
a -- 输入值,可以是数值、NumPy数组或者多维数组。
b -- 门控信号,维度应与a相同。
返回:
经过GLU激活的结果。
"""
sigmoid_b = 1 / (1 + np.exp(-b)) # 应用Sigmoid函数到b
return a * sigmoid_b # 返回a和Sigmoid(b)的元素乘结果
解读
- Sigmoid门控:
1 / (1 + np.exp(-b))
这行代码对输入b
应用Sigmoid函数,将其转换为一个位于(0, 1)区间内的门控信号。这个信号决定了另一输入a
的每个元素应该被强化还是被抑制。 - 元素乘法:通过
a * sigmoid_b
计算a
和Sigmoid处理后的b
的元素级乘法,实现GLU的核心功能。这一步骤允许a
中的每个元素根据对应的门控信号被按比例调整,实现动态门控。 - 向量化操作:该实现通过使用NumPy,自然地支持向量化操作,使得
glu
函数可以直接作用于整个数组,无需显式循环。这对于高效处理大量数据非常关键。
示例使用
# 示例输入
a = np.array([0.5, -1, 2, -2])
b = np.array([1, -1, 0, 2])
# 应用GLU激活函数
glu_output = glu(a, b)
print("GLU Output:", glu_output)
这个例子展示了如何对两个具有相同维度的输入数组a
和b
应用GLU激活函数。
三、ReGLU
ReGLU(Rectified GLU)激活函数是一个相对较新的概念,融合了GLU(Gated Linear Unit)的思想与ReLU(Rectified Linear Unit)的特性。GLU是一种通过学习到的门控机制来控制信息流的激活函数,而ReGLU则在此基础上添加了ReLU的非线性特性。
1. 数学定义
假设有两个相同维度的输入向量 a a a和 b b b,ReGLU激活函数定义为:
ReGLU
(
a
,
b
)
=
ReLU
(
a
)
⊙
σ
(
b
)
\operatorname{ReGLU}(a, b)=\operatorname{ReLU}(a) \odot \sigma(b)
ReGLU(a,b)=ReLU(a)⊙σ(b)
其中,
⊙
\odot
⊙表示元素乘法,
ReLU
(
a
)
=
max
(
0
,
a
)
\operatorname{ReLU}(a)=\max (0, a)
ReLU(a)=max(0,a)是标准的ReLU函数,
σ
(
b
)
=
1
1
+
e
−
b
\sigma(b)=\frac{1}{1+e^{-b}}
σ(b)=1+e−b1是Sigmoid函数。
2. 函数特性
- 门控机制:ReGLU通过Sigmoid函数 σ ( b ) \sigma(b) σ(b)作用于 b b b来学习一个门控信号,这个门控信号决定了 a a a的激活强度。
- 非线性激活:通过将ReLU应用于 a a a,ReGLU引入了非线性,有助于增加模型的表达能力。
- 自适应特性:ReGLU的门控机制允许模型自适应地调整信息的流动,这可以根据任务的需求学习到最有效的表示。
3. 导数
ReGLU激活函数的导数相对复杂,因为它涉及到两个不同函数的导数。导数可以通过链式法则计算,分别对 a a a和 b b b进行求导。
4. 使用场景与局限性
使用场景:
- 复杂特征提取:在需要模型学习复杂特征表示的任务中,如深度学习中的图像识别、自然语言处理等领域。
- 动态信息流控制:在模型需要根据数据动态调整信息流的场景中,ReGLU提供了一种有效的机制。
局限性:
- 计算复杂度:由于涉及到Sigmoid和ReLU两个不同的函数,ReGLU的计算复杂度高于单一的激活函数,这可能增加训练和推理的计算成本。
- 参数调优:ReGLU的有效性可能依赖于正确的参数设置和模型架构设计,需要进行细致的调优才能达到最佳性能。
5.代码实现
import numpy as np
def reglu(a, b):
"""计算ReGLU激活函数的值。
参数:
a, b -- 输入值,可以是数值、NumPy数组或者多维数组,维度必须相同。
返回:
ReGLU激活后的结果。
"""
relu_a = np.maximum(0, a) # 应用ReLU到a
sigmoid_b = 1 / (1 + np.exp(-b)) # 应用Sigmoid到b
return relu_a * sigmoid_b # 返回元素乘的结果
解读
- ReLU应用:
np.maximum(0, a)
对输入a
应用ReLU函数,即对于a
中的每个元素,如果元素值大于0,则保持不变;否则,将其设置为0。 - Sigmoid应用:
1 / (1 + np.exp(-b))
对输入b
应用Sigmoid函数,将b
中的每个元素映射到(0, 1)区间内,代表门控信号的强度。 - 元素乘法:最后,通过
relu_a * sigmoid_b
计算两个数组的元素级乘法,输出ReGLU激活函数的结果。这个操作实现了一个按元素门控的机制,其中a
的激活强度由b
学习到的门控信号调节。
示例使用
# 示例输入
a = np.array([1, -2, 3, -4])
b = np.array([5, -1, 2, 3])
# 应用ReGLU激活函数
output = reglu(a, b)
print("ReGLU Output:", output)
这个例子展示了如何对两个具有相同维度的输入数组a
和b
应用ReGLU激活函数。
四、参考文献
- Dauphin, Y. N., Fan, A., Auli, M., & Grangier, D. (2017). “Language Modeling with Gated Convolutional Networks.” In Proceedings of the 34th International Conference on Machine Learning (ICML). 这篇论文是GLU在深度学习中应用的重要文献之一,作者展示了在语言模型中使用门控卷积网络(使用GLU)如何有效地提高模型性能。
- Shazeer N. Glu variants improve transformer[J]. arXiv preprint arXiv:2002.05202, 2020.