Что такое SwiGLU и почему он используется вместо ReLU в современных LLM?
Краткий тезис
SwiGLU (Swish‑Gated Linear Unit) — это функция активации, объединяющая GLU (Gated Linear Unit) с Swish (SiLU). Она заменяет ReLU в современных LLM (PaLM, Llama), потому что гейтинг (вентильное управление) позволяет сети динамически выбирать, какую информацию пропускать, что даёт более богатую выразительность и лучший поток градиентов. Несмотря на увеличенное вдвое количество параметров за счёт второй матрицы, SwiGLU стабильно даёт лучшие результаты на этапе масштабирования.
1. Проблема ReLU в больших языковых моделях
ReLU (Rectified Linear Unit) — f(x) = max(0, x) — простая и быстрая функция, но в LLM она имеет два недостатка:
- Мёртвые нейроны при отрицательном входе производная строго нулевая → градиент не обновляет нейрон, он «умирает» навсегда.
- Ограниченная выразительность ReLU — кусочно-линейная функция, не способная моделировать сложные нелинейные зависимости, важные для представления языка.
В современных LLM с миллиардами параметров даже малая потеря нейронов критична. Поэтому инженеры начали искать альтернативы, которые сохраняют нелинейность и улучшают обучение.
2. GLU — Gated Linear Unit (механизм гейтинга)
GLU (предложен в 2017 г. для NLP) — это не простая функция, а слой с двумя линейными проекциями:
GLU(x) = (W·x + b) ⊙ σ(V·x + c)
где:
W,V— матрицы весов (разные);b,c— смещения;⊙— поэлементное умножение (Hadamard product);σ— сигмоидная функция (в оригинале), управляющая «вентилем».
Идея: одна линейная проекция (W·x+b) — это «содержание», вторая (V·x+c) после сигмоиды — «вентиль» (0…1), который решает, какую долю содержания пропустить. Это даёт динамическое управление потоками информации.
Почему это хорошо
- Позволяет модели выбирать, какие признаки активировать для каждого токена;
- Градиенты проходят через вентиль, даже когда содержание близко к нулю (нет «мёртвого» режима).
3. Swish — Smooth ReLU с самовентилем
Swish (также SiLU — Sigmoid Linear Unit) — это f(x) = x · σ(β·x), где σ — сигмоида, β — обучаемый или фиксированный (обычно 1.0). Свойства:
- Гладкая (в отличие от ReLU) → градиенты везде определены;
- Не монотонна при
β > 1→ может как усиливать, так и ослаблять отрицательные значения; - Не имеет мёртвых нейронов — при больших отрицательных
xзначение стремится к 0, но градиент остаётся ненулевым.
В LLM Swish (или GELU — его аппроксимация) часто использовался как альтернатива ReLU в FFN-слоях (но без гейтинга).
4. SwiGLU = Swish + GLU (улучшенный гейтинг)
Определение
SwiGLU — это комбинация GLU, где в качестве нелинейности в вентиле вместо сигмоиды используется Swish (SiLU):
SwiGLU(x) = Swish(W·x + b) ⊙ (V·x + c)
Или, в более простой записи (как в Llama):
FFN_SwiGLU(x) = (Swish(x·W_gate) ⊙ (x·W_up)) · W_down
где:
W_gate— матрица для вычисления вентиля (gate);W_up— матрица для «содержания» (up projection);W_down— матрица обратной проекции (down projection).
Почему Swish, а не сигмоида?
- Swish даёт нелинейность без насыщения на отрицательной части (сигмоида быстро насыщается до 0, убивая градиент);
- Производная Swish более информативна — вентиль не бинарный (0/1), а мягкий, что улучшает обучение.
Параметры
В стандартном FFN (feed‑forward network) с ReLU: W1 (d_model → d_ff), W2 (d_ff → d_model).
В SwiGLU‑FFN: три матрицы — W_gate (d_model → d_ff), W_up (d_model → d_ff), W_down (d_ff → d_model).
Чтобы число параметров не выросло в 1.5×, в архитектурах обычно уменьшают d_ff в 2/3 относительно базового FFN (например, 8/3*d_model вместо 4*d_model). Но на практике SwiGLU даёт лучшее качество при равном количестве параметров.
5. Математика и код реализации
Формула SwiGLU (для одного токена x):
gate = Swish(x @ W_gate + b_gate)
value = x @ W_up + b_up
output = (gate * value) @ W_down + b_down
Пример на PyTorch:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SwiGLUFFN(nn.Module):
def __init__(self, d_model, d_ff, dropout=0.1):
super().__init__()
self.w_gate = nn.Linear(d_model, d_ff, bias=False)
self.w_up = nn.Linear(d_model, d_ff, bias=False)
self.w_down = nn.Linear(d_ff, d_model, bias=False)
self.dropout = nn.Dropout(dropout)
def forward(self, x):
# Swish: x · sigmoid(x)
gate = self.w_gate(x)
gate = gate * torch.sigmoid(gate) # Swish (SiLU)
value = self.w_up(x)
hidden = gate * value # поэлементное умножение
out = self.w_down(hidden)
return self.dropout(out)
Сравнение с ReLU-FFN:
| Характеристика | ReLU-FFN | SwiGLU-FFN |
|---|---|---|
| Выразительность | Ограниченная (кусочно-линейная) | Богатая (гейтинг + нелинейность) |
| Мёртвые нейроны | Есть (при отрицательном входе) | Нет (градиент всегда течёт через gate) |
| Параметры | 2 матрицы | 3 матрицы (при уменьшенном d_ff сопоставимо) |
| Тренировочная стабильность | Менее стабильна (возможен срыв) | Стабильна, лёгкая настройка |
| Использование в LLM | GPT-2, GPT-3 | PaLM, Llama, Mistral, Qwen |
6. Почему SwiGLU лучше для LLM (основные причины)
6.1. Экспрессивность гейтинга
- GLU позволяет модели адаптивно «выключать» нерелевантные признаки. Это критично для языковых задач, где один и тот же нейрон может быть полезен в одном контексте и вреден в другом.
- В отличие от ReLU, который либо включает, либо выключает признак «жёстко», SwiGLU делает это плавно (soft‑gating).
6.2. Лучший поток градиентов
- Производная Swish ненулевая на всей оси (кроме 0, но предел есть). Градиенты распространяются даже через отрицательные значения.
- В ReLU градиент = 0 для x ≤ 0 → блокировка обратного распространения.
6.3. Масштабируемость
- В экспериментах (например, в статье PaLM) SwiGLU стабильно показывает более низкий loss при одинаковом количестве параметров, чем ReLU или GELU.
- Особенно заметно на больших моделях (от 1B параметров) — SwiGLU даёт прирост качества без увеличения вычислительной стоимости (при оптимизированной реализации).
6.4. Совместимость с остаточной нормализацией
- В LLM типа Llama используется RMSNorm и pre‑normalization. SwiGLU хорошо сочетается с этими техниками, не вызывая расходимости.
7. Использование в современных архитектурах
| Модель | Активация в FFN | Примечание |
|---|---|---|
| GPT-2, GPT-3 | GELU (Gaussian Error Linear Unit) | GELU — гладкая аппроксимация ReLU, но без гейтинга |
| PaLM (2022) | SwiGLU | Впервые масштабно применили для 540B параметров |
| Llama (Meta, 2023) | SwiGLU | Взяли из PaLM, уменьшили d_ff в 2/3 |
| Mistral, Qwen, DeepSeek | SwiGLU | Стандартная практика для современных LLM |
- Лучшее качество на перплексии (ppl) при равном количестве параметров;
- Гладкая нелинейность хорошо работает с квантизацией (меньше outliers).
8. Экспериментальные результаты (кратко)
- В статье PaLM: Scaling Language Modeling with Pathways авторы сравнивают SwiGLU, ReLU и GELU на моделях 8B и 62B.
- В Llama 2 (Touvron et al.) SwiGLU используется без пояснения альтернатив (стандартный выбор).
- На датасете C4 (Colossal Clean Crawled Corpus) SwiGLU даёт -0.13 nats улучшение loss относительно GELU при 0.5B параметров.
9. Сравнение с другими активациями
| Функция | Формула | Сильные стороны | Слабые стороны |
|---|---|---|---|
| ReLU | max(0, x) | Простота, скорость | Мёртвые нейроны |
| GELU | x·Φ(x) (Φ — нормальное CDF) | Гладкая, без мёртвых | Нет гейтинга, средняя выразительность |
| Swish (SiLU) | x·σ(x) | Гладкая, самовентиль | Меньше нелинейности, чем гейтинг |
| SwiGLU | Swish(Wx+b) ⊙ (Vx+c) | Гейтинг + гладкость | Больше параметров (∼1.33×) |
Вывод SwiGLU — компромисс между выразительностью и параметрами. Для LLM этот компромисс оправдан: улучшение качества перевешивает увеличение весов.
10. Выводы
SwiGLU стал стандартом в современных LLM по трём причинам:
- Гейтинг (GLU) даёт модели способность динамически выбирать релевантную информацию.
- Swish (вместо сигмоиды) обеспечивает гладкую нелинейность с ненулевыми градиентами.
- Эмпирические результаты — стабильно лучшее качество на перплексии и задачах few‑shot.
Хотя ReLU проще и быстрее в вычислениях, его ограничения (мёртвые нейроны, слабая выразительность) делают его непрактичным для моделей с сотнями миллиардов параметров. SwiGLU — пример того, как комбинация двух идей (гейтинг + гладкая активация) может дать синергетический эффект.
11. Пет-проект для закрепления
Задача Сравнить SwiGLU, ReLU и GELU на небольшом Transformer‑моделе на задаче классификации текста (например, SST-2). Цель — убедиться, что SwiGLU даёт более низкое perplexity и лучшую accuracy.
Инструменты PyTorch, Hugging Face transformers, datasets.
Шаги:
- Сборка кастомного Transformer используйте
nn.TransformerEncoderLayer(замените FFN на свою реализацию SwiGLU, ReLU, GELU). - Данные SST-2 (бинарная классификация) из
datasets.load_dataset("glue", "sst2"). - Обучение Зафиксируйте число параметров (например, 1M) — для SwiGLU уменьшите
d_ffтак, чтобы общее число параметров было равно ReLU‑версии. - Метрики: Перплексия на валидации, accuracy, время сходимости.
- Результат Постройте таблицу и графики loss / accuracy.
Ожидаемый результат
- SwiGLU сойдётся быстрее (по шагам) к более высокой accuracy.
- Перплексия у SwiGLU будет ниже, чем у ReLU (на 0.05–0.1).
- Убедитесь, что мёртвых нейронов (по гистограмме активаций) у ReLU много, у SwiGLU — нет.
12. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | Что такое функция активации и зачем она нужна в нейросетях? |
| 2 | Как устроена архитектура Transformer (Attention Is All You Need)? |
| 23 | Что такое GELU и чем он отличается от Swish? |
| 278 | Какие функции активации используются в современных LLM? |
| 280 | Как работает нормализация (LayerNorm, RMSNorm) в LLM? |
13. Навигация
- Предыдущий: 278
- Следующий: 280
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 278
- Следующий: 280
- Индекс: 00. Индекс разборов