pytorch api文档:torch.nn.GELU()激活函数

需要掌握:激活函数-GELU(平滑的 ReLU 变体)

介绍

PyTorch 中的 nn.GELU() 激活函数,这是当前大语言模型(LLM)、Transformer 架构中最常用的激活函数之一。

语法

是 PyTorch 神经网络模块(torch.nn)中的类,使用时需要先实例化,再作用于张量(区别于纯函数 torch.tanh())。

torch.nn.GELU()

手动实现

import torch
import torch.nn as nn
import matplotlib.pyplot as plt


class GELU(nn.Module):

    def __init__(self):
        super().__init__()

    def forward(self, x):
        return 0.5 * x * (1 + torch.tanh(
            torch.sqrt(torch.tensor(2.0 / torch.pi)) * (x + 0.044715 * torch.pow(x, 3))
        ))

使用:

gelu = GELU()
x = torch.linspace(-3, 3, 100)
y_gelu = gelu(x)
print(y_gelu)

例子

import torch
import torch.nn as nn

# 1. 实例化 GELU 模块(无参数)
gelu = nn.GELU()

# 2. 标量/张量输入(实际中主要用于批量张量)
x_scalar = torch.tensor(1.0)
y_scalar = gelu(x_scalar)
print("标量输出:", y_scalar)  # 输出: tensor(0.8413)(符合正态分布CDF的加权结果)

# 3. 批量张量输入(更贴近实际场景)
x_tensor = torch.tensor([-2.0, 0.0, 2.0, 5.0])
y_tensor = gelu(x_tensor)
print("张量输出:", y_tensor)
# 输出: tensor([-0.0455,  0.0000,  1.9545,  4.9999])
# 可见:负数输出接近0,正数随数值增大趋近于自身,且过渡平滑

# 4. 结合网络层使用(实际应用场景)
class SimpleMLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(10, 20)
        self.gelu = nn.GELU()  # 网络中嵌入 GELU
        self.fc2 = nn.Linear(20, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = self.gelu(x)  # 激活
        x = self.fc2(x)
        return x

# 测试网络
model = SimpleMLP()
input_data = torch.randn(32, 10)  # 批量大小32,输入维度10
output = model(input_data)
print("网络输出形状:", output.shape)  # 输出: torch.Size([32, 1])

总结

  1. nn.GELU() 是 PyTorch 实现的高斯误差线性单元,核心是输入值 × 正态分布累积概率,输出平滑且无边界;
  2. 使用时需先实例化模块,再作用于张量,是 Transformer 大模型的标配激活函数;
  3. 相比 ReLU 更平滑、梯度更稳定,虽计算成本略高,但在深层模型(如 GPT/BERT)中表现远优于 ReLU/tanh。

原文出处:/show_1GW2eQ49XIbw.html