Функция PyTorch torch.nn.GELU

PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn


torch.nn.GELUЭто функция активации Gaussian Error Linear Unit в PyTorch.

Это функция активации по умолчанию архитектуры Transformer, обеспечивающая лучшую производительность и более гладкие градиенты по сравнению с ReLU.

Определение функции

torch.nn.GELU(approximate='none')

Описание параметров:

  • approximate(str): алгоритм аппроксимации. Необязательно'none'、'tanh'. По умолчанию —'none'。

Математический принцип

Математическая формула GELU:

GELU(x) = x * Φ(x)

где Φ(x) — кумулятивная функция распределения (CDF) стандартного нормального распределения.

При использовании аппроксимации tanh:

GELU(x) ≈ 0.5x * (1 + tanh(√(2/π) * (x + 0.044715 * x³)))

Примеры использования

Пример 1: Базовое использование

Создайте и используйте активацию GELU:

Пример

import torch
import torch.nn as nn

# Создание слоя активации GELU
gelu = nn.GELU()

# Тестовый ввод
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# Прямой проход
output = gelu(x)

print("Input:", x.tolist())
print("Вывод:", output.tolist())
print("nНаблюдение: отрицательные значения имеют небольшую активацию (ненулевую), положительные значения продолжают расти")

Пример 2: Сравнение различных функций активации

Сравнение GELU, ReLU, Sigmoid:

Пример

import torch
import torch.nn as nn

x = torch.linspace(-4, 4, 21)

# Различные функции активации
gelu = nn.GELU()
relu = nn.ReLU()
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()

print("x       GELU      ReLU      Sigmoid   Tanh")
print("-" * 50)
for i in range(0, 21, 3):
    xi = x[i:i+3]
    print(f"{xi[0]:6.2f} {gelu(xi)[0]:8.4f} {relu(xi)[0]:8.4f} {sigmoid(xi)[0]:8.4f} {tanh(xi)[0]:8.4f}")

Пример 3: Использование в Transformer

Типичный слой FFN Transformer:

h2 class="example">Пример
import torch
import torch.nn as nn

class FeedForward(nn.Module):
    def __init__(self, d_model, dim_feedforward=2048, dropout=0.1):
        super(FeedForward, self).__init__()
        self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.activation = nn.GELU()
        self.linear2 = nn.Linear(dim_feedforward, d_model)

    def forward(self, x):
        x = self.linear1(x)
        x = self.activation(x)
        x = self.dropout(x)
        x = self.linear2(x)
        return x

# Тест FFN
ffn = FeedForward(d_model=512, dim_feedforward=2048)
x = torch.randn(32, 100, 512)  # (batch, seq, d_model)

output = ffn(x)
print("Форма входа:", x.shape)
print("Форма выхода:", output.shape)

Пример 4: Использование tanh-аппроксимации

Используйте tanh-аппроксимацию для ускорения вычислений:

Пример

import torch
import torch.nn as nn

# Точная версия
gelu_exact = nn.GELU(approximate='none')

# Версия с tanh-приближением
gelu_approx = nn.GELU(approximate='tanh')

x = torch.randn(1000)

output_exact = gelu_exact(x)
output_approx = gelu_approx(x)

# Вычислить разницу
diff = (output_exact - output_approx).abs().max().item()
print(f"Максимальная разница: {diff:.8f}")

# Сравнение производительности
import time

for _ in range(100):
    _ = gelu_exact(x)

start = time.time()
for _ in range(1000):
    _ = gelu_exact(x)
time_exact = time.time() - start

start = time.time()
for _ in range(1000):
    _ = gelu_approx(x)
time_approx = time.time() - start

print(f"Время точной версии: {time_exact:.4f}s")
print(f"Время приближенной версии: {time_approx:.4f}s")

Сравнение функций активации

Функция активации Особенности Применимые сценарии
nn.GELU Гладкая, ненулевые отрицательные значения, по умолчанию в Transformer Transformer、BERT、GPT
nn.ReLU Простая, разреженная активация, мертвые нейроны CNN, общее глубокое обучение
nn.SiLU Гладкая, самогейтинговая MobileNet、EfficientNet

Часто задаваемые вопросы

Вопрос 1: Каковы преимущества GELU по сравнению с ReLU?

  • Отрицательные значения имеют небольшую активацию, информация не теряется
  • Более гладкие градиенты, полезно для обучения
  • Лучшая производительность в Transformer

Вопрос 2: Когда использовать приближённую версию?

Когда требуется скорость инференса и требования к точности не строгие, tanh-аппроксимация работает быстрее.

Вопрос 3: Можно ли использовать GELU в выходном слое?

Обычно не используется в выходном слое. Используйте Softmax для задач классификации и тождественную функцию для задач регрессии.


Сценарии использования

nn.GELUОсновные сценарии применения включают:

  • Архитектура Transformer: модели, такие как BERT, GPT
  • Глубокие нейронные сети: ситуации, требующие гладкой активации
  • Предобученные модели: современные модели NLP

Совет: GELU — самая часто используемая функция активации в области NLP и стандартный компонент Transformer.


PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn

Другие расширения