GELU(Gaussian Error Linear Unit,高斯误差线性单元)是一种非线性激活函数,由Dan Hendrycks和Kevin Gimpel于2016年提出。它是深度学习模型中广泛使用的激活机制之一,尤其在Transformer架构(如BERT、GPT系列)中扮演关键角色。GELU的设计灵感来源于高斯分布的累积分布函数(CDF),旨在解决传统激活函数(如ReLU)的一些局限性,例如“死亡ReLU”问题(负输入被完全抑制,导致梯度为零)和非平滑性,从而提升模型的训练稳定性和性能。
下面从定义、数学原理、历史背景、与其他激活函数的比较、实现方式、优势及应用等方面进行详细介绍。
1. 数学定义
GELU的核心公式是基于输入值
x
x
x 与标准正态分布累积分布函数
Φ
(
x
)
\Phi(x)
Φ(x) 的乘积:
GELU
(
x
)
=
x
⋅
Φ
(
x
)
\text{GELU}(x) = x \cdot \Phi(x)
GELU(x)=x⋅Φ(x)
其中:
- x x x 是输入(标量或张量元素)。
- Φ ( x ) = 1 2 π ∫ − ∞ x e − t 2 / 2 d t \Phi(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x} e^{-t^2/2} \, dt Φ(x)=2π1∫−∞xe−t2/2dt 是标准正态分布(均值0,方差1)的CDF,表示从负无穷到 x x x 的概率累积。
这个公式使得GELU在正输入时接近线性(类似于ReLU),而在负输入时允许小幅“泄漏”(非零输出),从而保留一些负值信息,避免梯度完全消失。
图形特性:
- GELU的曲线类似于ReLU,但更平滑:在 x > 0 x > 0 x>0 时快速上升,在 x < 0 x < 0 x<0 时有轻微的S形弯曲(负值输出约为 0.16 x 0.16x 0.16x 的比例)。
- 它是非单调的(在负区有轻微下降),但整体保持单调递增。
2. 近似公式与计算优化
直接计算
Φ
(
x
)
\Phi(x)
Φ(x) 涉及积分,计算开销较大。因此,在实际实现中常用基于误差函数(erf)的近似:
GELU
(
x
)
≈
1
2
x
(
1
+
e
r
f
(
x
2
)
)
\text{GELU}(x) \approx \frac{1}{2} x \left(1 + \\erf\left(\frac{x}{\sqrt{2}}\right)\right)
GELU(x)≈21x(1+erf(2x))
- e r f ( z ) = 2 π ∫ 0 z e − t 2 d t \\erf(z) = \frac{2}{\sqrt{\pi}} \int_{0}^{z} e^{-t^2} \, dt erf(z)=π2∫0ze−t2dt 是高斯误差函数,在数学库中高效支持。
- 这个近似误差很小(<0.0001),且计算速度快,常用于深度学习框架。
另一种更快的sigmoid近似(用于移动设备):
GELU
(
x
)
≈
x
⋅
σ
(
1.702
x
)
\text{GELU}(x) \approx x \cdot \sigma(1.702 x)
GELU(x)≈x⋅σ(1.702x)
其中
σ
\sigma
σ 是sigmoid函数。这在保持精度的前提下进一步加速推理。
3. 历史背景
- 提出时间:2016年6月,发表于arXiv论文《Gaussian Error Linear Units (GELUs)》,作者证明GELU在各种网络架构中优于ReLU、ELU等。
- 发展:最初用于一般神经网络,但2018年BERT论文中首次大规模应用,推动其流行。随后在GPT、Vision Transformer等Transformer模型中成为标准激活函数。
- 灵感来源:GELU源于Dropout的随机正则化思想——它可以视为对输入的“期望”变换,其中 Φ ( x ) \Phi(x) Φ(x) 表示“保持”该神经元的概率,类似于随机丢弃负值。
4. 与其他激活函数的比较
GELU与其他常见激活函数在形状、梯度行为和适用性上存在差异。下面用表格总结比较(基于典型特性):
| 激活函数 | 公式 | 图形特点 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|---|
| ReLU | max ( 0 , x ) \max(0, x) max(0,x) | 折线,负区为0 | 计算快、缓解梯度消失 | “死亡ReLU”(负区梯度0,导致神经元失效) | CNN早期层 |
| Leaky ReLU | max ( α x , x ) \max(\alpha x, x) max(αx,x) ( α ≈ 0.01 \alpha \approx 0.01 α≈0.01) | ReLU的负区斜线泄漏 | 缓解死亡问题 | 需调参 α \alpha α,仍不平滑 | 图像任务 |
| Sigmoid | 1 1 + e − x \frac{1}{1 + e^{-x}} 1+e−x1 | S形,输出[0,1] | 输出概率化 | 梯度饱和(两端梯度趋0) | 二分类输出 |
| Tanh | tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x | S形,输出[-1,1] | 零中心化 | 梯度饱和 | RNN早期 |
| ELU | x x x (if x ≥ 0 x \geq 0 x≥0) else α ( e x − 1 ) \alpha(e^x - 1) α(ex−1) | 平滑负区 | 负区均值接近0,加速学习 | 计算稍复杂 | 通用网络 |
| GELU | x ⋅ Φ ( x ) x \cdot \Phi(x) x⋅Φ(x) | 平滑S形,负区轻微泄漏 | 平滑、零中心、随机正则化效果 | 计算稍慢于ReLU | Transformer、NLP/CV |
从表格可见,GELU结合了ReLU的稀疏性和Sigmoid的平滑性,在负输入时输出非零(约16%的信号通过),这改善了梯度流。
5. 优势
GELU在深度学习中的优势主要体现在:
- 平滑性和连续导数:不像ReLU的尖角,GELU的导数连续,避免优化中的不稳定性,提高收敛速度。
- 负值处理:允许负输入贡献小信号,减少“死亡神经元”问题,同时保持稀疏性(负区输出小)。
- 零中心化:输出均值接近0,有助于梯度传播和训练稳定性。
- 与Dropout的兼容:数学上等价于带概率的线性变换,增强泛化能力。
- 实证性能:在ImageNet、GLUE等基准上,GELU模型准确率提升1-2%,尤其在深层网络中。
缺点:计算开销略高于ReLU(因erf函数),但在现代GPU上可忽略。
6. 应用场景
- Transformer模型:BERT、GPT-3/4、ViT等中,用于前馈层(MLP),提升注意力机制的表达力。
- 计算机视觉:Swin Transformer、EfficientNet变体中替代ReLU。
- 其他:强化学习、生成模型(如Stable Diffusion),因其平滑性改善样本效率。
截至2025年,GELU仍是SOTA模型的标准选择,并在多模态模型中广泛采用。
7. 代码实现示例
在PyTorch中,GELU内置支持,非常简单:
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
# 使用内置GELU
gelu = nn.GELU()
x = torch.linspace(-3, 3, 100)
y = gelu(x)
# 绘制曲线
plt.plot(x, y)
plt.title('GELU激活函数曲线')
plt.xlabel('x')
plt.ylabel('GELU(x)')
plt.grid(True)
plt.show()
- 输出:一条从负区轻微上升到正区线性的平滑曲线。
- 自定义实现(基于erf近似):
def gelu_approx(x):
return 0.5 * x * (1 + torch.erf(x / (2 ** 0.5)))
# 等价于 nn.GELU(approximate='erf')
在TensorFlow/Keras中类似:tf.keras.activations.gelu。
总结
GELU作为一种优雅的激活函数,通过高斯误差的数学美感,桥接了非线性和随机正则化,推动了深度学习从CNN向Transformer的范式转变。它不是万能的,但对于需要高性能和稳定性的现代模型而言,是首选。
2264

被折叠的 条评论
为什么被折叠?



