GELU 激活函数的核心原理

GELU(Gaussian Error Linear Unit)通过结合输入值的概率分布(高斯分布)与线性变换实现非线性激活。其数学表达式为:
$$
\text{GELU}(x) = x \cdot \Phi(x)
$$
其中 $\Phi(x)$ 是标准正态分布的累积分布函数。实际计算中常使用近似公式:
$$
\text{GELU}(x) \approx 0.5x \left(1 + \tanh\left[\sqrt{2/\pi}(x + 0.044715x^3)\right]\right)
$$

Transformer 中 GELU 的优势

  1. 平滑梯度特性:相比 ReLU,GELU 在负值区域保留微小梯度,缓解梯度消失问题,适合深层网络如 Transformer。
  2. 概率解释性:通过门控机制动态调整激活强度,与自注意力机制的概率分布特性更契合。
  3. 实验表现:在 BERT、GPT 等模型中验证了其优于 ReLU 和 ELU 的效果。

PyTorch 实现方法

import torch
import torch.nn as nn

# 直接调用内置函数
gelu = nn.GELU()

# 自定义实现(近似公式)
def gelu_custom(x):
    return 0.5 * x * (1 + torch.tanh(torch.sqrt(torch.tensor(2 / torch.pi)) * (x + 0.044715 * torch.pow(x, 3))))

场景适配建议

  1. 预训练模型微调:当迁移学习使用 BERT 等预训练模型时,保持 GELU 激活以确保参数兼容性。
  2. 深层网络设计:在超过 12 层的 Transformer 结构中优先选用 GELU,避免梯度稀疏性导致的训练不稳定。
  3. 计算资源权衡:若需极致推理速度,可替换为 ReLU,但需重新校准模型参数。

与其他激活函数的对比

激活函数 计算复杂度 负值处理 适用场景
GELU 较高 部分保留 Transformer/预训练
ReLU 截断 浅层网络/实时推理
Swish 平滑过渡 搜索类模型

调参注意事项

  • 初始化范围:GELU 对初始化敏感,建议使用 He 初始化或 Xavier 初始化配合小幅缩放(如 0.02)。
  • 学习率策略:搭配 Warmup 策略可避免训练早期因高斯累积函数的非线性导致梯度爆炸。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐