Выбор активации и функции потерь кажется мелочью, но именно здесь живут частые баги: двойной softmax, MSE для классификации, переполнение exp. На собесе спрашивают и теорию, и эти практические ловушки.
Функции активации
| Активация | Формула | Где |
|---|---|---|
| Сигмоида | 1 / (1 + e⁻ˣ) | выход бинарной классификации, гейты |
| tanh | (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ) | гейты и состояние RNN |
| ReLU | max(0, x) | скрытые слои CNN и MLP |
| LeakyReLU | max(αx, x) | против мёртвых нейронов |
| GELU, SiLU | x·Φ(x), x·σ(x) | трансформеры |
| SwiGLU | SiLU(xW)⊙(xV) | MLP-блоки современных LLM |
- Сигмоида насыщается, её производная не больше 0.25: в глубоких сетях градиент затухает.
- ReLU не насыщается справа и дешёвая, но в нуле излом, а при отрицательных входах градиент ноль.
- GELU и SiLU гладкие и пропускают немного отрицательных значений.
Выход и потеря под задачу
| Задача | Выход | Потеря |
|---|---|---|
| Регрессия | линейный | MSE, MAE, Huber |
| Бинарная классификация | 1 логит | BCEWithLogitsLoss |
| K классов, один верный | K логитов | CrossEntropyLoss |
| Multi-label | K логитов | BCEWithLogitsLoss по каждому |
Главная ловушка PyTorch: CrossEntropyLoss принимает логиты, внутри у неё log_softmax и NLL. Если подать вероятности после softmax, softmax применится дважды: модель будет учиться, но хуже.
Устойчивый softmax
import math
def softmax(z):
m = max(z)
e = [math.exp(v - m) for v in z]
s = sum(e)
return [v / s for v in e]
Сдвиг на константу не меняет результат, но спасает от переполнения exp(1000). Кросс-энтропию считают через log-sum-exp:
CE = logsumexp(z) - z_y
Так она конечна даже при огромных логитах.
Почему не MSE для классификации
С сигмоидой градиент MSE по логиту равен 2(p - y)·σ'(z). При уверенной ошибке сигмоида насыщена, σ' ≈ 0, и модель почти не учится на своих худших ошибках. У кросс-энтропии множитель σ' сокращается, градиент равен p - y.
Huber и выбросы
MSE возводит ошибки в квадрат, и выбросы тянут модель. Huber квадратичен при малых ошибках и линеен при больших. MAE ещё устойчивее, но негладкая в нуле.
Температура
softmax(z / T): при T → 0 распределение стремится к argmax, при большом T к равномерному. Применяется в генерации текста, дистилляции и калибровке. Порядок классов не меняется.
Частые ошибки
- softmax перед CrossEntropyLoss.
- Sigmoid + BCELoss вместо BCEWithLogitsLoss.
- softmax для multi-label задачи.
- ReLU на выходе регрессии, где цель бывает отрицательной.
Что спросят на собесе
- Почему ReLU лучше сигмоиды в скрытых слоях, какие активации в трансформерах.
- Какой выход и потерю взять для регрессии, multi-class и multi-label.
- Зачем вычитать максимум в softmax.
- Почему MSE плохо подходит для классификации.