Функции активации в 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
Где:
- $W_1, W_2$ -- матрицы весов
- $\sigma$ -- сигмоидная функция (gate)
- $\otimes$ -- поэлементное умножение
SwiGLU¶
SwiGLU -- стандарт LLM 2024-2026
Полная форма с выходной проекцией:
$$\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¶
ReGLU¶
Сравнение архитектур¶
Стандартный 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¶
-
Feature-wise gating. SwiGLU выбирает, какие признаки пропускать дальше -- это "внимание" на уровне нейронов. Повышает representational capacity по сравнению с простым ReLU.
-
Гладкие градиенты. Swish -- гладкая функция (в отличие от ReLU в нуле), нет vanishing gradient как у sigmoid. Лучше динамика оптимизации.
-
Немонотонность. Swish имеет "провал" для отрицательных входов, что позволяет моделировать более сложные паттерны. Самогейтинг: выход зависит от амплитуды входа.
-
Снижение галлюцинаций. 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."
Самопроверка
- Вычислите \(\text{Swish}(x)\) для \(x = \{-2, -1, 0, 1, 2\}\). Почему Swish(-1) не равен 0 (в отличие от ReLU)?
- Модель имеет dim=4096. Посчитайте количество параметров FFN-блока для: (a) стандартного FFN (hidden=4d), (b) SwiGLU FFN (hidden=8d/3). Убедитесь что бюджет одинаковый.
- Объясните, почему нельзя заменить GELU на SwiGLU в pretrained GPT-4 без дообучения. Что произойдет с активациями?
Sources¶
- arXiv — "GLU Variants Improve Transformer" (Shazeer, 2020)
- Medium — "SwiGLU: The Activation Function Powering Modern LLMs" (Mehrang, 2025)
- Dev.to — "SwiGLU: The FFN Upgrade I Use to Get Free Performance" (Shojaei, 2025)
- xFormers — "SwiGLU Activation Documentation" (Meta Research)
- ResearchGate — "SwiGLU Activation Function for Large Language Models"
- LinkedIn — "Discovering SwiGLU: The Activation Function Powering Modern LLMs" (Singh, 2025)
- NeurIPS 2025 — "Qwen's Systematic Exploration of Attention Gating"
- cosmo.tardis.ac — "A Note on Activation Functions" (Jan 2026)
- MetricCoders — "SwiGLU: The Gated Activation Fueling Modern LLMs"
- 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 и другие архитектурные оптимизации