【DL经典回顾】激活函数大汇总(二十五)(GEGLU附代码和详细公式)
激活函数大汇总(二十五)(GEGLU附代码和详细公式)
更多激活函数见激活函数大汇总列表
一、引言
欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。
在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。
限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。
二、GEGLU
GEGLU (Gated Exponential Linear Unit) 是一个结合了GELU (Gaussian Error Linear Unit) 和GLU (Gated Linear Unit) 特性的激活函数。它利用了GELU提供的非线性以及GLU的门控机制,旨在通过动态调节神经元的激活程度来提高模型的表现力和灵活性。虽然GEGLU的直接文献可能较少,但可以通过分析GELU和GLU的结合来理解其特性。
1. 数学定义
假设我们有两个输入 a a a和 b b b,则GEGLU的数学表达式可以定义为:
GEGLU
(
a
,
b
)
=
a
⊗
GELU
(
b
)
\operatorname{GEGLU}(a, b)=a \otimes \operatorname{GELU}(b)
GEGLU(a,b)=a⊗GELU(b)
这里,
a
a
a和
b
b
b是同形状的输入向量或张量,
⊗
\otimes
⊗表示逐元素乘法,而
GELU
(
b
)
\operatorname{GELU}(b)
GELU(b)是应用在
b
b
b上的GELU函数。
2. 函数特性
- 门控机制:类似于GLU,GEGLU使用一个输入 b b b来控制另一个输入 a a a的激活强度,提供了动态的激活能力。
- 非线性:通过GELU部分,GEGLU引入了基于Gaussian分布的非线性,有助于模型捕获更复杂的数据模式。
- 自适应激活:GEGLU能够根据 b b b的值自适应地调整 a a a的激活程度,这种自适应能力使得模型可以根据数据特征动态调整其行为。
3. 导数
GEGLU的导数涉及到GELU函数的导数,具体形式依赖于GELU的定义。GELU的导数本身涉及到标准正态分布的累积分布函数和概率密度函数,因而GEGLU的导数计算较为复杂。
4. 使用场景与局限性
使用场景:
- 自然语言处理和图像处理:GEGLU的动态激活特性特别适合于处理序列数据和高维度特征的任务,如自然语言处理和图像处理领域。
- 深层网络:在深层网络中,GEGLU的自适应激活能力有助于改善信息流和梯度传播,可能减少梯度消失或梯度爆炸问题。
局限性:
- 计算复杂度:由于GELU函数的计算相对复杂,GEGLU可能增加模型的计算负担。
- 优化难度:GEGLU引入的动态激活机制可能使得模型训练的优化过程更加复杂,需要更细致的调参。
GEGLU通过结合GELU的高级非线性和GLU的门控机制,为深度学习模型提供了一种强大的激活函数选项。然而,其使用需要在模型设计和训练策略上进行仔细考虑,以充分利用其特性并应对其挑战。
5.代码实现
代码
这段代码定义了GEGLU (Gated Exponential Gaussian Linear Unit) 激活函数,并提供了一个示例应用:
import numpy as np
def gelu(x):
"""
实现Gaussian Error Linear Unit (GELU) 激活函数。
"""
return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))
def geglu(a, b):
"""
实现Gated Exponential Gaussian Linear Unit (GEGLU) 激活函数。
参数:
a, b -- 输入的数值或NumPy数组,形状相同。
返回:
GEGLU激活后的输出。
"""
# 计算GELU激活
gelu_b = gelu(b)
# 应用门控机制
output = a * gelu_b
return output
# 示例输入
a = np.array([1, -1, 0.5, -0.5])
b = np.array([0.5, -0.5, 1, -1])
# 应用GEGLU激活函数
output = geglu(a, b)
print("GEGLU Output:", output)
解释
-
GELU激活函数:首先,定义了GELU激活函数
gelu(x)
,这是GEGLU的核心部分之一。GELU使用了一个基于高斯分布的公式,为输入x
提供非线性变换。 -
GEGLU激活函数:随后,定义了GEGLU激活函数
geglu(a, b)
,它接受两个输入a
和b
。b
输入经过GELU激活,然后该激活结果与a
逐元素相乘,实现了门控机制。 -
示例应用:在示例中,
a
和b
是两个形状相同的NumPy数组。它们分别通过GEGLU函数处理,展示了如何在实践中应用GEGLU激活函数。 -
输出:示例输出展示了GEGLU激活后的结果。通过GELU门控的方式,
a
的每个元素根据b
的相应元素经过GELU处理的结果进行调整。 -
优化挑战:引入门控机制可能增加模型训练过程中的优化挑战,需要精细的参数调整和优化策略。
三、参考文献
- Shazeer N. Glu variants improve transformer[J]. arXiv preprint arXiv:2002.05202, 2020.
- GELU激活函数的原始文献:Hendrycks, D., & Gimpel, K. (2016). “Gaussian Error Linear Units (GELUs)”. arXiv preprint arXiv:1606.08415. 这篇论文首次提出了GELU激活函数,提供了关于它是如何被设计出来的详细信息,以及为何它在某些情况下优于其他激活函数。
- 门控线性单元(GLU)相关文献: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-Volume 70 (pp. 933-941). GLU激活函数在这篇论文中被提出,用于构建更复杂的神经网络结构。