Перейти к содержанию

Функции активации в LLM

~7 минут чтения

Предварительно: Реализация внимания с нуля | Нормализация в LLM


Зачем функции активации в LLM

Каждый слой трансформера содержит FFN-блок -- "думающую" часть, где модель обрабатывает информацию после attention. Функция активации внутри FFN определяет, какие нейроны "зажигаются" и как сильно. ReLU работает как выключатель: вкл/выкл. SwiGLU -- как диммер с привратником: плавно регулирует сигнал И решает, какие сигналы важны. Это дает 5-7% лучше perplexity при тех же параметрах -- поэтому SwiGLU стал стандартом во всех современных LLM.

Ключевой инсайт: SwiGLU побеждает не потому что "новее", а потому что добавляет gating -- один путь вычисляет gate (какие признаки важны), другой -- значения. Модель учится что пропускать на уровне отдельных нейронов. На фиксированном бюджете параметров это дает 5-7% лучше perplexity (Shazeer 2020).

Распространенность (2026)

Активация Используется в Преимущество
SwiGLU LLaMA, Mistral, Qwen, PaLM Лучший overall, гладкие градиенты
GeGLU Gemma, T5 variants GELU-based gating
ReLU Legacy BERT, GPT-2 Простой, быстрый
GELU BERT, GPT-¾ Гладкий, вероятностный
SiLU/Swish Некоторые архитектуры Гладкий, немонотонный

Эволюция функций активации

Хронология

graph TD
    RELU["2017: ReLU<br/>f(x) = max(0, x)<br/>Simple, fast, dead neurons"] --> GELU["2018-2019: GELU<br/>f(x) = x * Phi(x)<br/>Smooth, probabilistic"]
    GELU --> GLU["2020: GLU<br/>Gated Linear Unit<br/>Feature selection via gating"]
    GLU --> SWIGLU["2020-2022: SwiGLU / GeGLU<br/>Swish/GELU gate instead of sigmoid<br/>SOTA for LLMs"]

    style RELU fill:#fce4ec,stroke:#c62828
    style GELU fill:#fff3e0,stroke:#ef6c00
    style GLU fill:#f3e5f5,stroke:#9c27b0
    style SWIGLU fill:#e8f5e9,stroke:#4caf50

Формулы семейства GLU

Original GLU

GLU -- Gated Linear Unit

\[\text{GLU}(x) = (W_1 x + b_1) \otimes \sigma(W_2 x + b_2)\]

Где:

- $W_1, W_2$ -- матрицы весов
- $\sigma$ -- сигмоидная функция (gate)
- $\otimes$ -- поэлементное умножение

SwiGLU

SwiGLU -- стандарт LLM 2024-2026

\[\text{SwiGLU}(x) = \text{Swish}(W_1 x) \otimes (W_2 x)\]
\[\text{Swish}(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}}\]
Полная форма с выходной проекцией:

$$\text{SwiGLU}(x, W, V, W_2) = \text{Swish}(xW) \otimes (xV) \cdot W_2$$

Числовой пример: для \(x = 2.0\):

- $\text{Swish}(2) = 2 \cdot \sigma(2) = 2 \cdot 0.88 = 1.76$ (гладкое прохождение)
- $\text{Swish}(-1) = -1 \cdot \sigma(-1) = -1 \cdot 0.27 = -0.27$ (почти заблокировано, но не ноль -- в отличие от ReLU)

GeGLU

\[\text{GeGLU}(x) = \text{GELU}(W_1 x) \otimes (W_2 x)\]
\[\text{GELU}(x) = x \cdot \Phi(x) \approx x \cdot \frac{1}{2}\left[1 + \tanh\left(\sqrt{\frac{2}{\pi}}(x + 0.044715x^3)\right)\right]\]

ReGLU

\[\text{ReGLU}(x) = \text{ReLU}(W_1 x) \otimes (W_2 x)\]

Сравнение архитектур

Стандартный FFN vs GLU-FFN

graph TD
    subgraph std["Standard FFN: 2 matrices, 8d^2 params"]
        I1["Input (d)"] --> W1["Linear d -> 4d"] --> ACT["GELU"] --> W2["Linear 4d -> d"] --> O1["Output"]
    end
    subgraph glu["SwiGLU FFN: 3 matrices, ~8d^2 params"]
        I2["Input (d)"] --> WG["W1: d -> 8d/3"] --> SW["Swish gate"]
        I2 --> WV["W2: d -> 8d/3"]
        SW --> MUL["element-wise multiply"]
        WV --> MUL
        MUL --> W3["W3: 8d/3 -> d"] --> O2["Output"]
    end

    style std fill:#e8eaf6,stroke:#3f51b5
    style glu fill:#e8f5e9,stroke:#4caf50

3 матрицы вместо 2, но hidden dim меньше. Общее количество параметров сохраняется для честного сравнения.

Эквивалентность параметров

Архитектура Матрицы Hidden Dim Всего параметров
Standard FFN 2 \(4d\) \(8d^2\)
SwiGLU FFN 3 \(\frac{8}{3}d\) \(\approx 8d^2\)
LLaMA FFN 3 \(\frac{2}{3} \times 4d\) \(8d^2\)

Почему SwiGLU доминирует

Преимущества SwiGLU

  1. Feature-wise gating. SwiGLU выбирает, какие признаки пропускать дальше -- это "внимание" на уровне нейронов. Повышает representational capacity по сравнению с простым ReLU.

  2. Гладкие градиенты. Swish -- гладкая функция (в отличие от ReLU в нуле), нет vanishing gradient как у sigmoid. Лучше динамика оптимизации.

  3. Немонотонность. Swish имеет "провал" для отрицательных входов, что позволяет моделировать более сложные паттерны. Самогейтинг: выход зависит от амплитуды входа.

  4. Снижение галлюцинаций. GLU-варианты показывают снижение галлюцинаций в LLM -- гейтинг предотвращает spurious активацию признаков.

SwiGLU = 3 матрицы, а не 2

SwiGLU FFN использует три проекции (W1, W2, W3) вместо двух в стандартном FFN. Чтобы сохранить бюджет параметров ~\(8d^2\), hidden dim уменьшается с \(4d\) до \(\frac{8}{3}d\). Если забыть уменьшить hidden dim, модель будет на ~50% больше по параметрам.

ReLU не устарел для всех задач

SwiGLU -- стандарт для LLM, но ReLU все еще работает в RL, простых MLP, inference-оптимизированных моделях. При fine-tuning: не меняй активацию на SwiGLU в модели, обученной с GELU/ReLU.

Свойства Swish

Свойство Значение Преимущество
Гладкость Да (\(C^\infty\)) Лучшие градиенты
Немонотонность Да Больше выразительности
Самогейтинг \(f(x) = x \cdot \sigma(x)\) Адаптивность
Диапазон \((-\infty, +\infty)\) Без насыщения
Производная \(f'(x) = f(x) + \sigma(x)(1-f(x))\) Простая

Бенчмарки

Производительность в Language Modeling

Активация WikiText-103 (PPL) Бюджет compute Примечание
ReLU 24.0 1x Baseline
GELU 23.5 1x Slight improvement
GLU 22.8 1x Gating helps
SwiGLU 22.2 1x Best performer
GeGLU 22.4 1x Close second
ReGLU 22.6 1x Good but not best

Доля в LLM (2026)

Активация Доля % Ключевые модели
SwiGLU ~70% LLaMA, Mistral, Qwen, PaLM
GeGLU ~15% Gemma, T5-XXL
GELU ~10% GPT-4, legacy models
Other ~5% Various

Реализация на PyTorch

SwiGLU модуль

import torch
import torch.nn as nn
import torch.nn.functional as F

class SwiGLU(nn.Module):
    """SwiGLU activation for LLM FFN layers."""

    def __init__(self, dim: int, hidden_dim: int = None, dropout: float = 0.0):
        super().__init__()
        hidden_dim = hidden_dim or dim * 4 // 3 * 2  # LLaMA-style

        self.w1 = nn.Linear(dim, hidden_dim, bias=False)  # Gate projection
        self.w2 = nn.Linear(dim, hidden_dim, bias=False)  # Value projection
        self.w3 = nn.Linear(hidden_dim, dim, bias=False)  # Output projection
        self.dropout = nn.Dropout(dropout)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        # SwiGLU(x) = Swish(xW1) ⊗ (xW2) · W3
        gate = F.silu(self.w1(x))  # Swish = SiLU
        value = self.w2(x)
        output = self.w3(gate * value)
        return self.dropout(output)


class GeGLU(nn.Module):
    """GeGLU activation for LLM FFN layers."""

    def __init__(self, dim: int, hidden_dim: int = None):
        super().__init__()
        hidden_dim = hidden_dim or dim * 4 // 3 * 2

        self.w1 = nn.Linear(dim, hidden_dim, bias=False)
        self.w2 = nn.Linear(dim, hidden_dim, bias=False)
        self.w3 = nn.Linear(hidden_dim, dim, bias=False)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        # GeGLU(x) = GELU(xW1) ⊗ (xW2) · W3
        gate = F.gelu(self.w1(x))
        value = self.w2(x)
        return self.w3(gate * value)

Интеграция с трансформером

class TransformerBlock(nn.Module):
    def __init__(self, dim: int, n_heads: int):
        super().__init__()
        self.attention = nn.MultiheadAttention(dim, n_heads)
        self.ffn = SwiGLU(dim)  # Modern LLM style
        self.norm1 = nn.RMSNorm(dim)
        self.norm2 = nn.RMSNorm(dim)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        # Pre-norm architecture
        x = x + self.attention(self.norm1(x))
        x = x + self.ffn(self.norm2(x))
        return x

Гайд по выбору

Когда что использовать

Сценарий Рекомендация Причина
Новая LLM с нуля SwiGLU Лучшая производительность, стандарт
Google экосистема GeGLU Консистентно с Gemma/T5
Fine-tuning Оставить оригинал Не менять активацию
Ограниченные ресурсы SwiGLU (меньший hidden) Те же параметры, лучше perplexity
Исследования Пробовать варианты Тестировать ReGLU, GLU

Выбор Hidden Dimension

Архитектура Отношение Hidden/Dim Эффективные параметры
Standard 4 \(8d^2\)
SwiGLU (LLaMA) \(\frac{8}{3}\) \(\approx 8d^2\)
SwiGLU (PaLM) 4 \(12d^2\) (more params)

Полное сравнение

Матрица активаций

Свойство ReLU GELU GLU SwiGLU GeGLU
Гладкость Нет Да Нет Да Да
Гейтинг Нет Нет Да Да Да
Немонотонность Нет Да Нет Да Да
Доля в LLM Низкая Средняя Низкая Высокая Средняя
Параметры \(8d^2\) \(8d^2\) \(8d^2\) \(8d^2\) \(8d^2\)
Улучшение PPL Baseline +2% +5% +7% +6%

Находка NeurIPS 2025

"Sigmoid outperforms SiLU when used in the best-performing configuration for attention gating." — Qwen systematic exploration


Ключевые числа

Улучшение по сравнению с ReLU

Активация vs ReLU Снижение PPL Скорость обучения
GELU -2% Same
GLU -5% -5% (extra matmul)
SwiGLU -7% -5%
GeGLU -6% -5%

Эффективность параметров

Модель Dim SwiGLU Hidden Параметры (FFN)
LLaMA-7B 4096 11008 150M
LLaMA-70B 8192 22016 1.2B
Mistral-7B 4096 14336 200M

Влияние на память

Активация Память активаций Память обучения
ReLU 1x 1x
GELU 1x 1.1x
SwiGLU 1.5x 1.15x

Статистика (2026)

Факт Значение
Доля SwiGLU 70% из top 20 LLM
Доля GeGLU 15%
Цитирований SwiGLU 500+
Улучшение perplexity 5-10%

Interview Questions

1. Почему LLM используют SwiGLU вместо GELU?

❌ Red flag: "SwiGLU новее, поэтому лучше"

✅ Strong answer: "SwiGLU добавляет gating mechanism к FFN: один путь вычисляет Swish-активацию (gate), другой -- линейную проекцию (value), их произведение подается на выход. Это дает feature-wise selection -- модель учится, какие признаки пропускать. На фиксированном бюджете параметров SwiGLU дает 5-7% лучше perplexity, чем GELU. Результат подтвержден в Shazeer 2020 и всеми крупными LLM."

2. Как SwiGLU сохраняет тот же бюджет параметров?

❌ Red flag: "SwiGLU просто добавляет третью матрицу"

✅ Strong answer: "Стандартный FFN: 2 матрицы \(d \to 4d\) и \(4d \to d\) = \(8d^2\) параметров. SwiGLU: 3 матрицы, но hidden dim уменьшен до \(\frac{8}{3}d\). Итого: \(3 \times d \times \frac{8}{3}d \approx 8d^2\) -- тот же бюджет. LLaMA использует именно эту конфигурацию."

3. В чем разница между SiLU/Swish и SwiGLU?

❌ Red flag: "Это одно и то же"

✅ Strong answer: "SiLU/Swish -- это функция активации: \(f(x) = x \cdot \sigma(x)\). SwiGLU -- это архитектура FFN, которая использует Swish в gating mechanism: \(\text{SwiGLU}(x) = \text{Swish}(xW_1) \otimes (xW_2)\). SwiGLU = Swish + GLU (Gated Linear Unit). Можно заменить Swish на GELU и получить GeGLU, на ReLU -- ReGLU."

4. Когда НЕ стоит использовать SwiGLU?

❌ Red flag: "SwiGLU всегда лучше"

✅ Strong answer: "Fine-tuning существующей модели -- не менять активацию. Inference-критичные задачи -- SwiGLU требует дополнительный matmul. Маленькие модели (< 100M параметров) -- разница с GELU минимальна. Google-экосистема -- Gemma/T5 используют GeGLU, лучше оставаться consistent."


Самопроверка

  1. Вычислите \(\text{Swish}(x)\) для \(x = \{-2, -1, 0, 1, 2\}\). Почему Swish(-1) не равен 0 (в отличие от ReLU)?
  2. Модель имеет dim=4096. Посчитайте количество параметров FFN-блока для: (a) стандартного FFN (hidden=4d), (b) SwiGLU FFN (hidden=8d/3). Убедитесь что бюджет одинаковый.
  3. Объясните, почему нельзя заменить GELU на SwiGLU в pretrained GPT-4 без дообучения. Что произойдет с активациями?

Sources

  1. arXiv — "GLU Variants Improve Transformer" (Shazeer, 2020)
  2. Medium — "SwiGLU: The Activation Function Powering Modern LLMs" (Mehrang, 2025)
  3. Dev.to — "SwiGLU: The FFN Upgrade I Use to Get Free Performance" (Shojaei, 2025)
  4. xFormers — "SwiGLU Activation Documentation" (Meta Research)
  5. ResearchGate — "SwiGLU Activation Function for Large Language Models"
  6. LinkedIn — "Discovering SwiGLU: The Activation Function Powering Modern LLMs" (Singh, 2025)
  7. NeurIPS 2025 — "Qwen's Systematic Exploration of Attention Gating"
  8. cosmo.tardis.ac — "A Note on Activation Functions" (Jan 2026)
  9. MetricCoders — "SwiGLU: The Gated Activation Fueling Modern LLMs"
  10. TechLife Blog — "Activation Functions: The Secret Sauce of Deep Learning"

See Also

  • Normalization Deep Dive -- RMSNorm + SwiGLU = стандартная пара для FFN в современных LLM
  • Calculus for ML -- производные sigmoid, GELU, Swish для backpropagation
  • Normalization Comparison -- сводная таблица нормализаций
  • Flash Attention 3 -- вычислительные оптимизации attention, рядом с FFN
  • Efficient Transformers -- MoE, sparse attention и другие архитектурные оптимизации