【NLP 38、激活函数 ④ GELU激活函数】
别盲目,别着急,慢慢走,没事的
—— 25.2.24
一、定义与数学表达式
GELU(Gaussian Error Linear Unit,高斯误差线性单元)是一种结合概率分布的非线性激活函数,其核心思想是通过输入值服从标准正态分布的概率来决定激活程度。数学表达式为:
GELU(x)=x⋅Φ(x)
其中,Φ(x) 是标准正态分布的累积分布函数(CDF):
实际应用中,常使用近似公式简化计算:
该近似公式在保持性能的同时显著降低计算复杂度
二、核心特点
非线性建模能力:通过高斯分布概率引入非线性,增强模型对复杂数据的拟合能力。
连续可导性:在整个定义域内可微,避免梯度消失问题,适合反向传播优化。
自门控特性:输入值越大,激活概率越高,类似“软开关”机制。
输出范围:(−∞,+∞),适用于需要线性输出的场景
三、优势对比
特性 | GELU | ReLU | Sigmoid/Tanh |
---|---|---|---|
梯度消失问题 | 有效缓解 | 部分区域梯度为0 | 易出现梯度消失 |
输出范围 | 全实数域 | [0,+∞) | (0,1)或(−1,1) |
计算复杂度 | 较高(近似公式可优化) | 低 | 较高(涉及指数运算) |
应用场景 | Transformer、NLP、CV | 计算机视觉、简单任务 | 二分类输出层 |
四、实际应用
Transformer架构:BERT、GPT-2/3等模型均采用GELU作为隐藏层激活函数,显著提升语言建模性能。
计算机视觉:在图像分类、目标检测任务中,GELU的非线性特性优于ReLU。
推荐系统:处理用户行为序列数据时,GELU的随机正则化特性增强模型泛化能力。
五、代码实现
1.torch.nn.GELU()
torch.nn.GELU(): PyTorch 中实现高斯误差线性单元(GELU)激活函数的类。其核心功能是通过高斯分布的累积分布函数(CDF)对输入张量进行非线性变换
数学表达式为:GELU(x)=x⋅Φ(x)
参数名称 | 类型 | 是否必填 | 说明 |
---|---|---|---|
approximate | str | 否 | 近似算法选择,可选值为 'none' (精确计算)或 'tanh' (近似计算,默认为 'none' )。 |
import torch
import torch.nn as nn
# 定义GELU层(默认使用精确计算)
gelu_layer = nn.GELU()
# 输入张量
x = torch.randn(32, 128)
# 前向传播
output = gelu_layer(x)
print(output.shape) # 输出形状与输入一致
2.torch.nn.functional.gelu()
torch.nn.functional.gelu():
PyTorch 中实现高斯误差线性单元(GELU)激活函数的函数。其核心功能是通过高斯分布的累积分布函数(CDF)对输入张量进行非线性变换,
数学表达式为:GELU(x)=x⋅Φ(x)
参数名称 | 类型 | 是否必填 | 说明 |
---|---|---|---|
approximate | str | 否 | 近似算法选择,可选值为 'none' (精确计算)或 'tanh' (近似计算,默认为 'none' )。 |
import torch
import torch.nn.functional as F
# 输入张量
x = torch.randn(32, 128)
# 应用GELU激活函数
output = F.gelu(x)
print(output.shape) # 输出形状与输入一致