中文翻译暂不可用,显示俄语原文。

Что такое SwiGLU и почему он лучше ReLU в LLM?

Краткий тезис

SwiGLU — это функция активации, объединяющая Swish (гладкую нелинейность) и гейтинг (управление потоком информации через элементное умножение). Она превосходит ReLU за счёт отсутствия «мёртвых нейронов», более богатой нелинейности и способности модели контролировать, какую информацию пропускать. Современные LLM (Llama, PaLM, Falcon) используют SwiGLU вместо ReLU или GELU, получая стабильно лучшее качество при тех же вычислительных затратах.


1. Термин: Функция активации

Функция активации — это нелинейное преобразование, применяемое к выходу нейрона (или целого слоя). Без нелинейности нейронная сеть была бы просто линейной комбинацией входов и не могла бы аппроксимировать сложные функции. В LLM активации используются в Feed-Forward Network (FFN) — двухслойной сети, которая идёт после механизма внимания в каждом блоке трансформера.


2. ReLU: классика и её проблемы

ReLU (Rectified Linear Unit) — самая популярная активация до 2020 года:
ReLU(x) = max(0, x)

Плюсы

  • Простота и дешевизна вычисления.
  • Спасает от затухания градиента (градиент для x>0 равен 1).

Минусы

  • Dead Neurons (мёртвые нейроны): если нейрон выдаёт отрицательное значение, градиент равен 0, и нейрон перестаёт обучаться.
  • Неотрицательный выход все значения после ReLU ≥ 0, что ограничивает выразительность.
  • Негладкость в точке 0 производная не определена (хотя на практике это редко проблема).

3. Swish: гладкая альтернатива

Swish (или SiLU) — функция, предложенная Google (Ramachandran et al., 2017):
Swish(x) = x * sigmoid(x)

Свойства

  • Гладкая (бесконечно дифференцируема).
  • Не монотонна имеет небольшой «провал» для отрицательных x (около -0.5), что помогает регуляризации.
  • Ненулевой градиент для отрицательных x sigmoid(x) > 0, поэтому градиент никогда не равен 0 (кроме x → -∞). Нет мёртвых нейронов.

На практике Swish часто даёт лучшее качество, чем ReLU, но требует чуть больше вычислений (sigmoid).


4. GLU (Gated Linear Unit): гейтинг

GLU — это не функция активации, а механизм гейтинга (управления информацией). Введён в (Dauphin et al., 2017) для CNN, позже адаптирован для трансформеров.

Формула:
GLU(x) = (W₁x + b₁) ⊙ σ(W₂x + b₂)

где:

  • — поэлементное умножение (Hadamard product).
  • σ — сигмоида (sigmoid).
  • Первая часть (W₁x + b₁) — «информация».
  • Вторая часть (σ(W₂x + b₂)) — «ворота» (gate), которые решают, какую информацию пропустить.

GLU позволяет модели динамически выбирать, какие признаки важны. Это мощнее, чем просто нелинейность.


5. SwiGLU: объединение Swish и GLU

SwiGLU (Shazeer, 2020) — вариант GLU, где вместо сигмоиды используется Swish (или SiLU). Формула:

SwiGLU(x) = Swish(W₁x + b₁) ⊙ (Vx + c)

где:

  • Swish(z) = z * sigmoid(z).
  • (Vx + c) — вторая линейная проекция (без активации), выполняющая роль «входных ворот».

В оригинальной статье Shazeer также предложил вариант с ReLU вместо Swish (ReGLU), но SwiGLU показал лучшие результаты.

Важно SwiGLU требует три матрицы весов (W₁, V, и выходную проекцию), в то время как стандартный FFN с ReLU использует две. Чтобы сохранить число параметров, в современных LLM (например, Llama) уменьшают скрытую размерность FFN в 2/3 раза (примерно 2/3 * 4 * d_model вместо 4 * d_model).


6. Почему SwiGLU лучше ReLU в LLM?

Сравнение по ключевым аспектам:

АспектReLUSwiGLU
Мёртвые нейроныДа (градиент 0 для x<0)Нет (Swish даёт ненулевой градиент)
НелинейностьПростая кусочно-линейнаяБогатая (гладкая + гейтинг)
Контроль информацииНет (просто max)Да (гейтинг через ⊙)
Вычислительная сложность2 матрицы (W₁, W₂)3 матрицы (W₁, V, W₂), но с уменьшенной размерностью
Качество (perplexity)БазовоеЛучше на 0.5–1.0 пункта при равных параметрах
Использование в LLMУстаревшие модели (GPT-2)Современные (Llama, PaLM, Falcon, Mistral)

Эмпирические результаты (Shazeer, 2020; Touvron et al., 2023 — Llama paper):

  • SwiGLU снижает perplexity на 0.5–1.0 по сравнению с ReLU при одинаковом числе параметров.
  • В Llama 2 замена ReLU на SwiGLU дала улучшение на всех бенчмарках (MMLU, HellaSwag, etc.).
  • SwiGLU стабильнее при обучении: меньше всплесков loss, быстрее сходимость.

Почему гейтинг так важен
В LLM FFN выполняет роль «ключа-значения»: первая проекция создаёт «ключи», вторая — «значения», а гейтинг (умножение) решает, какие ключи активировать. Это похоже на механизм внимания внутри FFN. ReLU просто отсекает отрицательные значения, теряя информацию.


7. Реализация SwiGLU в PyTorch

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

class SwiGLUFFN(nn.Module):
    def __init__(self, d_model, hidden_mult=4):
        super().__init__()
        # Стандартный FFN с ReLU: hidden = 4 * d_model
        # Для SwiGLU hidden = int(2/3 * 4 * d_model) ≈ 2.67 * d_model
        hidden = int(2/3 * hidden_mult * d_model)
        self.w1 = nn.Linear(d_model, hidden, bias=False)
        self.v = nn.Linear(d_model, hidden, bias=False)
        self.w2 = nn.Linear(hidden, d_model, bias=False)

    def forward(self, x):
        # Swish(w1(x)) * v(x)
        gate = F.silu(self.w1(x))   # SiLU = Swish
        value = self.v(x)
        return self.w2(gate * value)

Примечание F.silu — встроенная функция PyTorch, эквивалент x * sigmoid(x).


8. Связь с другими функциями активации

  • GELU (Gaussian Error Linear Unit): x * Φ(x), где Φ — CDF нормального распределения. Похожа на Swish, но чуть более гладкая. Используется в BERT, GPT-3. SwiGLU даёт лучшее качество, чем GELU, по данным Shazeer.
  • SiLU — то же, что Swish (название из PyTorch). SwiGLU использует SiLU.
  • ReGLU — GLU с ReLU вместо Swish. Проще, но хуже SwiGLU.

9. Пет-проект для закрепления

Задача Сравнить SwiGLU и ReLU на маленьком трансформере (2 слоя, d_model=128) при обучении на задаче next-token prediction (например, на датасете TinyStories).

Инструменты PyTorch, Hugging Face Transformers (можно написать свой блок), Weights & Biases (для логов).

Шаги:

  1. Реализовать два варианта FFN: с ReLU (2 линейных слоя, hidden=4*d_model) и с SwiGLU (3 линейных слоя, hidden=int(2/34d_model)).
  2. Собрать маленький трансформер-декодер (2 слоя, 4 головы внимания).
  3. Обучить обе модели на TinyStories (100k шагов, batch size 64, learning rate 3e-4).
  4. Логировать loss и perplexity на валидации.
  5. Построить графики сходимости.

Ожидаемый результат Модель со SwiGLU покажет более низкий perplexity (на 0.5–1.0) и более стабильное обучение (меньше выбросов loss). Вы также можете измерить время шага — SwiGLU будет немного медленнее из-за дополнительного линейного слоя, но качество перевешивает.


10. Связь с другими вопросами

ВопросТема
650Что такое LLM и как они устроены?
651Архитектура трансформера (энкодер-декодер)
652Какие функции активации используются в LLM?
653Layer Normalization и Pre-Norm vs Post-Norm
654Позиционные кодировки (RoPE, AliBi)
656Что такое GQA (Grouped Query Attention)?

11. Навигация


Навигация