Функции активации
Активация — та самая нелинейность между слоями, без которой нейросеть схлопывается в линейную модель. Выбор активации определяет, как течёт градиент, поэтому вопрос «sigmoid или ReLU и почему» — из числа обязательных на собеседовании.
Интуиция
Линейный слой умеет только поворачивать, растягивать и сдвигать пространство. Функция активации (activation function) добавляет «изломы» и «изгибы» — именно из них сеть складывает сложные границы решений. Второй, менее очевидный смысл: активация управляет градиентом. На обратном проходе градиент умножается на производную активации в каждой точке — если производная близка к нулю, обучение слоя останавливается.
Как это работает: зоопарк активаций
Sigmoid — σ(x) = 1 / (1 + e−x). Сжимает вход в (0, 1), исторически первая «гладкая ступенька». Две беды: во-первых, насыщение (saturation) — при |x| > 4–5 производная почти нулевая (её максимум всего 0.25 в нуле), и градиент через такой нейрон не проходит; во-вторых, выход не центрирован вокруг нуля (not zero-centered) — все выходы положительны, из-за чего градиенты весов следующего слоя имеют одинаковый знак и спуск идёт зигзагом.
Tanh — tanh(x), диапазон (−1, 1). Центрирован вокруг нуля (это лучше для оптимизации), но насыщается точно так же, как sigmoid.
ReLU (rectified linear unit) — max(0, x). Дёшев, не насыщается справа (производная там ровно 1), с ним глубокие сети впервые стали нормально обучаться. Минус — «мёртвые нейроны» (dead neurons): если нейрон попал в отрицательную область на всех входах, его градиент — тождественный ноль, и он уже никогда не выберется.
Leaky ReLU — max(αx, x) с малым α ≈ 0.01: в отрицательной области остаётся маленький наклон, поэтому нейрон не умирает окончательно.
GELU / SiLU — гладкие «размытые ReLU»: GELU(x) = x·Φ(x) (Φ — функция распределения нормального закона), SiLU(x) = x·σ(x). Именно они стоят в современных трансформерах (BERT, GPT, LLaMA): гладкость и небольшой «провал» ниже нуля на практике дают чуть лучшее качество.
Отдельно стоит softmax — это не поэлементная активация, а нормировка вектора логитов в распределение вероятностей: softmax(z)i = ezi / Σj ezj. Каждая компонента зависит от всех входов, сумма выходов равна 1. Место softmax — выходной слой многоклассовой классификации (и внимание в трансформерах), а не скрытые слои.
Как выбирать на практике
Правило по умолчанию простое. Скрытые слои: ReLU — дёшево и сердито для MLP и CNN; GELU/SiLU — стандарт трансформеров. Выходной слой диктуется задачей: регрессия — без активации (линейный выход), бинарная классификация — sigmoid + binary cross-entropy, многоклассовая — softmax + cross-entropy. Sigmoid и tanh в скрытых слоях глубоких сетей сегодня почти не встречаются — именно из-за насыщения: цепочка производных, каждая ≤ 0.25, за десяток слоёв превращает градиент в пыль (подробнее — в теме про backprop).
Поиграй с интерактивом: увеличив «масштаб входа», ты видишь, как большие по модулю входы загоняют sigmoid и tanh в насыщение — почти вся ось краснеет. Это же объясняет, зачем нормализуют входы и активации (batchnorm/layernorm): держать значения в «живой» зоне активации. Обрати внимание и на ReLU: у него «краснеет» ровно вся отрицательная полуось — это та самая зона, где нейрон рискует умереть, — зато справа производная равна единице при любом масштабе входа, и градиент проходит без ослабления.
- «Чем плоха sigmoid в скрытых слоях?» — насыщение (максимум производной 0.25 → затухающие градиенты) и нецентрированный выход (зигзаг спуска).
- «Что такое dead ReLU и как лечить?» — нейрон навсегда в нуле; Leaky ReLU/GELU, аккуратный learning rate, разумная инициализация.
- «Почему softmax — не обычная активация?» — она связывает все компоненты вектора: выход i зависит от всех логитов, сумма равна 1.
- «Что стоит в трансформерах?» — GELU/SiLU в FFN-блоках; softmax — в механизме внимания.