Формулы функций потерь¶
~7 минут чтения
Предварительно: Формулы математического анализа | Формулы теории вероятностей
Функция потерь -- единственный сигнал, по которому модель учится. Выбор loss определяет поведение модели: MSE штрафует выбросы квадратично (ошибка 10 "стоит" в 100 раз больше ошибки 1), MAE -- линейно. Cross-entropy loss при уверенном неправильном предсказании (y=1, y_hat=0.01) даёт loss = -log(0.01) = 4.6, а при y_hat=0.5 только 0.69 -- штраф за overconfidence в 6.7 раз выше. Focal loss с gamma=2 уменьшает вклад "лёгких" примеров в 25 раз (при p=0.9: (1-0.9)^2 = 0.01), что критично при дисбалансе 1:1000 в object detection. Знание формул, градиентов и trade-offs между loss функциями -- одна из самых практичных тем на ML-интервью: спрашивают в 50%+ раундов.
Regression Losses¶
Mean Squared Error (MSE / L2 Loss)¶
Свойства: - Сильно штрафует большие ошибки - Чувствителен к выбросам - Гладкий, дифференцируемый везде
Градиент: $\(\frac{\partial L}{\partial \hat{y}_i} = \frac{2}{n}(\hat{y}_i - y_i)\)$
Mean Absolute Error (MAE / L1 Loss)¶
Свойства: - Устойчив к выбросам - Не дифференцируем в нуле - Медленнее сходится для малых ошибок
Градиент: $\(\frac{\partial L}{\partial \hat{y}_i} = \frac{1}{n} \text{sign}(\hat{y}_i - y_i)\)$
Huber Loss (Smooth L1)¶
Свойства: - Квадратичный для малых ошибок (как MSE) - Линейный для больших ошибок (как MAE) - Гладкий и дифференцируемый
Log-Cosh Loss¶
Свойства: - Похож на Huber, но гладкий - Второй порядок для малых ошибок - Первый порядок для больших
Quantile Loss¶
Свойства: - \(\tau = 0.5\): медиана (= MAE) - \(\tau = 0.9\): 90-й перцентиль - Для предсказания интервалов
Classification Losses¶
Binary Cross-Entropy (Log Loss)¶
Свойства: - Для бинарной классификации - \(\hat{y}\) должен быть вероятностью [0, 1] - Сильно штрафует уверенные неправильные предсказания
Градиент: $\(\frac{\partial L}{\partial \hat{y}_i} = \frac{\hat{y}_i - y_i}{\hat{y}_i(1 - \hat{y}_i)}\)$
BCE with Logits¶
Стабильная формула: $\(L = \frac{1}{n} \sum_{i=1}^{n} [\max(z_i, 0) - z_i \cdot y_i + \log(1 + e^{-|z_i|})]\)$
Свойства: - Численно более стабильна - Принимает logits (до sigmoid)
Categorical Cross-Entropy¶
Свойства: - Для многоклассовой классификации - \(y\) — one-hot вектор - \(\hat{y}\) — вероятности после softmax
Sparse Categorical Cross-Entropy¶
Свойства: - То же, но \(y\) — индекс класса (не one-hot) - Экономит память
Focal Loss¶
где \(p_t = \hat{y}\) если \(y=1\), иначе \(1-\hat{y}\)
Свойства: - Для сильного дисбаланса классов - Уменьшает вес легких примеров - \(\gamma = 2\) — типичное значение - \(\alpha\) — баланс классов
Hinge Loss (SVM)¶
где \(y \in \{-1, +1\}\)
Свойства: - Для SVM - Не штрафует правильные с margin > 1 - Не дифференцируем в 1
Squared Hinge Loss¶
Свойства: - Гладкая версия hinge - Сильнее штрафует нарушения margin
Label Smoothing¶
Пример: \(\epsilon = 0.1\), \(K = 3\) - Hard: [1, 0, 0] - Smooth: [0.933, 0.033, 0.033]
Свойства: - Улучшает калибровку - Регуляризация - Предотвращает overconfidence
Contrastive & Metric Losses¶
Contrastive Loss (Siamese)¶
где \(D = \|f(x_1) - f(x_2)\|\), \(y=1\) если разные классы
Triplet Loss¶
- \(a\) — anchor
- \(p\) — positive (тот же класс)
- \(n\) — negative (другой класс)
- \(\alpha\) — margin
InfoNCE / NT-Xent (Contrastive Learning)¶
где \(\text{sim}(u, v) = \frac{u^T v}{\|u\| \cdot \|v\|}\)
Свойства: - Для self-supervised learning (SimCLR) - \(\tau\) — температура
Ranking Losses¶
Pairwise Ranking Loss¶
где \(y=1\) если \(i\) должен быть выше \(j\)
ListNet Loss¶
где \(P(i) = \frac{\exp(s_i)}{\sum_j \exp(s_j)}\)
Sequence Losses¶
CTC Loss (Connectionist Temporal Classification)¶
Свойства: - Для ASR, OCR - Не требует выравнивания - Обрабатывает разную длину
KL Divergence¶
или для непрерывных: $\(D_{KL}(p\|q) = \int p(x) \log \frac{p(x)}{q(x)} dx\)$
Для нормальных распределений: $\(D_{KL}(\mathcal{N}(\mu_1, \sigma_1^2) \| \mathcal{N}(\mu_2, \sigma_2^2)) = \log\frac{\sigma_2}{\sigma_1} + \frac{\sigma_1^2 + (\mu_1 - \mu_2)^2}{2\sigma_2^2} - \frac{1}{2}\)$
Для VAE (\(q\) vs \(\mathcal{N}(0, I)\)): $\(D_{KL} = -\frac{1}{2} \sum_{j=1}^{J} (1 + \log(\sigma_j^2) - \mu_j^2 - \sigma_j^2)\)$
Segmentation Losses¶
Dice Loss¶
Свойства: - Для сегментации - Устойчив к дисбалансу классов - F1-score как loss
IoU Loss (Jaccard)¶
Tversky Loss¶
Свойства: - \(\alpha = \beta = 0.5\) → Dice - Контроль FP/FN через \(\alpha\)/\(\beta\)
Object Detection Losses¶
Smooth L1 (для boxes)¶
GIoU Loss¶
где \(C\) — минимальный bounding box содержащий \(A\) и \(B\)
DIoU Loss¶
где \(\rho\) — евклидово расстояние центров, \(c\) — диагональ \(C\)
Выбор Loss функции¶
| Задача | Loss |
|---|---|
| Регрессия, без выбросов | MSE |
| Регрессия, есть выбросы | MAE, Huber |
| Бинарная классификация | BCE, Focal |
| Многоклассовая | Cross-Entropy |
| Дисбаланс классов | Focal Loss, weighted BCE |
| Метрическое обучение | Triplet, Contrastive |
| Сегментация | Dice, IoU + BCE |
| Detection boxes | GIoU, DIoU |
| VAE | Reconstruction + KL |
| GAN | Adversarial, Wasserstein |
Типичные заблуждения¶
Заблуждение: CrossEntropyLoss в PyTorch принимает вероятности
torch.nn.CrossEntropyLoss принимает raw logits (до softmax), не вероятности. Внутри она сама применяет log_softmax + NLLLoss. Если передать вероятности после softmax -- модель будет учиться некорректно (double softmax). BCELoss принимает вероятности, а BCEWithLogitsLoss -- logits. Путаница между ними -- один из самых частых багов в PyTorch: модель "учится", но accuracy не растёт выше random.
Заблуждение: MSE и MAE одинаково хороши для регрессии
При выбросах MSE катастрофически хуже. Пример: предсказания [10, 10, 10, 100]. True = [10, 10, 10, 10]. MSE = (0 + 0 + 0 + 8100)/4 = 2025. MAE = (0 + 0 + 0 + 90)/4 = 22.5. Один выброс увеличил MSE в ~90 раз по сравнению с идеальным случаем. MAE -- только в ~4 раза. Huber loss решает проблему: квадратичный для малых ошибок (<delta), линейный для больших. Типичный delta = 1.0, но его нужно подбирать через validation.
Заблуждение: label smoothing = просто регуляризация
Label smoothing y_smooth = (1-epsilon)*y_hard + epsilon/K меняет оптимальное решение модели. Без smoothing оптимум -- бесконечно большие logits (delta-распределение). С epsilon=0.1 и K=1000 классов оптимальный logit разницы = log((1-epsilon)/epsilon * (K-1)) ~ 9.1. Это предотвращает over-confident predictions, улучшает калибровку на 10--30% (ECE), и даёт +0.2--0.5% accuracy в image classification. Но: вредит knowledge distillation, потому что "размывает" teacher distribution.
Интервью¶
Когда использовать Focal Loss вместо Cross-Entropy?
"Focal Loss -- улучшенная версия CE, всегда лучше"
"Focal Loss = -alpha_t * (1-p_t)^gamma * log(p_t). Ключевой параметр gamma: при gamma=0 это обычная CE. При gamma=2 (стандарт): для 'лёгкого' примера с p_t=0.9 множитель (1-0.9)^2 = 0.01, вклад уменьшается в 100 раз. Для 'сложного' p_t=0.1 множитель = 0.81, почти без изменений. Применять нужно при сильном дисбалансе классов (1:100 и более), особенно в object detection (RetinaNet), где 99%+ -- background. При сбалансированных данных Focal Loss не даёт преимущества и может даже навредить, заставляя модель фокусироваться на noisy hard examples."
Объясните разницу между Triplet Loss и Contrastive Loss.
"Triplet Loss использует тройки, Contrastive -- пары"
"Contrastive Loss работает с парами: L = (1-y)*D^2/2 + y*max(0, m-D)^2/2 -- сближает одинаковые, отдаляет разные на margin m. Triplet Loss работает с тройками (anchor, positive, negative): L = max(||a-p||^2 - ||a-n||^2 + alpha, 0) -- расстояние до positive должно быть меньше, чем до negative, на margin alpha. Triplet Loss сложнее в обучении (нужен mining: hard, semi-hard, easy negatives), но даёт лучшие embeddings. Современный подход: InfoNCE (used in CLIP, SimCLR) -- contrastive loss с N-1 negative pairs из mini-batch, temperature tau=0.07, не требует явного mining."
Почему в VAE используется комбинация reconstruction loss + KL divergence?
"KL нужен для регуляризации"
"VAE loss = E_q[log p(x|z)] - KL(q(z|x) || p(z)). Первый член -- reconstruction loss (обычно MSE для images или BCE для binary). Второй -- KL между learned posterior q(z|x) = N(mu, sigma^2) и prior p(z) = N(0, I). KL = -0.5 * sum(1 + log(sigma^2) - mu^2 - sigma^2). Без KL автоэнкодер запоминает данные (z -- произвольное). С KL latent space становится structured: можно семплировать z ~ N(0,I) и генерировать. Beta-VAE использует beta*KL для контроля: beta>1 -- более disentangled но хуже reconstruction, beta<1 -- наоборот. Типичная проблема: KL collapsing (KL -> 0, decoder игнорирует z) -- решается KL annealing."
See Also¶
- Metrics Cheatsheet -- метрики vs loss: loss для оптимизации, метрики для оценки качества
- PyTorch Cheatsheet -- реализация loss функций в PyTorch (CrossEntropyLoss, BCEWithLogitsLoss)
- Linear Algebra -- градиенты и матричное дифференцирование для backpropagation
- Probability & Statistics -- KL-дивергенция, cross-entropy, MLE -- все из теории вероятностей
- Vision Transformers -- contrastive loss (CLIP), Dice loss (SAM)