Перейти к содержанию

Формулы функций потерь

~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)

\[L = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\]

Свойства: - Сильно штрафует большие ошибки - Чувствителен к выбросам - Гладкий, дифференцируемый везде

Градиент: $\(\frac{\partial L}{\partial \hat{y}_i} = \frac{2}{n}(\hat{y}_i - y_i)\)$


Mean Absolute Error (MAE / L1 Loss)

\[L = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|\]

Свойства: - Устойчив к выбросам - Не дифференцируем в нуле - Медленнее сходится для малых ошибок

Градиент: $\(\frac{\partial L}{\partial \hat{y}_i} = \frac{1}{n} \text{sign}(\hat{y}_i - y_i)\)$


Huber Loss (Smooth L1)

\[L = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & |y - \hat{y}| \leq \delta \\ \delta \cdot (|y - \hat{y}| - \frac{\delta}{2}) & |y - \hat{y}| > \delta \end{cases}\]

Свойства: - Квадратичный для малых ошибок (как MSE) - Линейный для больших ошибок (как MAE) - Гладкий и дифференцируемый


Log-Cosh Loss

\[L = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(\hat{y}_i - y_i))\]

Свойства: - Похож на Huber, но гладкий - Второй порядок для малых ошибок - Первый порядок для больших


Quantile Loss

\[L_\tau = \frac{1}{n} \sum_{i=1}^{n} \begin{cases} \tau (y_i - \hat{y}_i) & y_i \geq \hat{y}_i \\ (1-\tau) (\hat{y}_i - y_i) & y_i < \hat{y}_i \end{cases}\]

Свойства: - \(\tau = 0.5\): медиана (= MAE) - \(\tau = 0.9\): 90-й перцентиль - Для предсказания интервалов


Classification Losses

Binary Cross-Entropy (Log Loss)

\[L = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)]\]

Свойства: - Для бинарной классификации - \(\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} [y_i \log(\sigma(z_i)) + (1-y_i) \log(1-\sigma(z_i))]\]

Стабильная формула: $\(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

\[L = -\frac{1}{n} \sum_{i=1}^{n} \sum_{k=1}^{K} y_{ik} \log(\hat{y}_{ik})\]

Свойства: - Для многоклассовой классификации - \(y\) — one-hot вектор - \(\hat{y}\) — вероятности после softmax


Sparse Categorical Cross-Entropy

\[L = -\frac{1}{n} \sum_{i=1}^{n} \log(\hat{y}_{i, y_i})\]

Свойства: - То же, но \(y\) — индекс класса (не one-hot) - Экономит память


Focal Loss

\[L = -\frac{1}{n} \sum_{i=1}^{n} \alpha_t (1 - p_t)^\gamma \log(p_t)\]

где \(p_t = \hat{y}\) если \(y=1\), иначе \(1-\hat{y}\)

Свойства: - Для сильного дисбаланса классов - Уменьшает вес легких примеров - \(\gamma = 2\) — типичное значение - \(\alpha\) — баланс классов


Hinge Loss (SVM)

\[L = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i)\]

где \(y \in \{-1, +1\}\)

Свойства: - Для SVM - Не штрафует правильные с margin > 1 - Не дифференцируем в 1


Squared Hinge Loss

\[L = \frac{1}{n} \sum_{i=1}^{n} [\max(0, 1 - y_i \cdot \hat{y}_i)]^2\]

Свойства: - Гладкая версия hinge - Сильнее штрафует нарушения margin


Label Smoothing

\[y_{smooth} = (1 - \epsilon) \cdot y_{hard} + \frac{\epsilon}{K}\]

Пример: \(\epsilon = 0.1\), \(K = 3\) - Hard: [1, 0, 0] - Smooth: [0.933, 0.033, 0.033]

Свойства: - Улучшает калибровку - Регуляризация - Предотвращает overconfidence


Contrastive & Metric Losses

Contrastive Loss (Siamese)

\[L = (1-y)\frac{1}{2}D^2 + y\frac{1}{2}\max(0, m-D)^2\]

где \(D = \|f(x_1) - f(x_2)\|\), \(y=1\) если разные классы


Triplet Loss

\[L = \max(\|f(a) - f(p)\|^2 - \|f(a) - f(n)\|^2 + \alpha, 0)\]
  • \(a\) — anchor
  • \(p\) — positive (тот же класс)
  • \(n\) — negative (другой класс)
  • \(\alpha\) — margin

InfoNCE / NT-Xent (Contrastive Learning)

\[L = -\log \frac{\exp(\text{sim}(z_i, z_j)/\tau)}{\sum_{k=1}^{2N} \mathbf{1}_{k \neq i} \exp(\text{sim}(z_i, z_k)/\tau)}\]

где \(\text{sim}(u, v) = \frac{u^T v}{\|u\| \cdot \|v\|}\)

Свойства: - Для self-supervised learning (SimCLR) - \(\tau\) — температура


Ranking Losses

Pairwise Ranking Loss

\[L = \max(0, -y(s_i - s_j) + m)\]

где \(y=1\) если \(i\) должен быть выше \(j\)


ListNet Loss

\[L = -\sum_{i=1}^{n} P_{y}(i) \log P_{\hat{y}}(i)\]

где \(P(i) = \frac{\exp(s_i)}{\sum_j \exp(s_j)}\)


Sequence Losses

CTC Loss (Connectionist Temporal Classification)

\[L = -\log P(y|x) = -\log \sum_{\pi \in \mathcal{A}^{-1}(y)} P(\pi|x)\]

Свойства: - Для ASR, OCR - Не требует выравнивания - Обрабатывает разную длину


KL Divergence

\[D_{KL}(p\|q) = \sum_{x} p(x) \log \frac{p(x)}{q(x)}\]

или для непрерывных: $\(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

\[L = 1 - \frac{2|X \cap Y|}{|X| + |Y|} = 1 - \frac{2\sum_i p_i g_i}{\sum_i p_i + \sum_i g_i}\]

Свойства: - Для сегментации - Устойчив к дисбалансу классов - F1-score как loss


IoU Loss (Jaccard)

\[L = 1 - \frac{|X \cap Y|}{|X \cup Y|} = 1 - \frac{\sum_i p_i g_i}{\sum_i p_i + \sum_i g_i - \sum_i p_i g_i}\]

Tversky Loss

\[L = 1 - \frac{\sum_i p_i g_i}{\sum_i p_i g_i + \alpha \sum_i p_i (1-g_i) + \beta \sum_i (1-p_i) g_i}\]

Свойства: - \(\alpha = \beta = 0.5\) → Dice - Контроль FP/FN через \(\alpha\)/\(\beta\)


Object Detection Losses

Smooth L1 (для boxes)

\[L = \begin{cases} 0.5x^2 & |x| < 1 \\ |x| - 0.5 & |x| \geq 1 \end{cases}\]

GIoU Loss

\[L = 1 - IoU + \frac{|C - (A \cup B)|}{|C|}\]

где \(C\) — минимальный bounding box содержащий \(A\) и \(B\)

DIoU Loss

\[L = 1 - IoU + \frac{\rho^2(b, b^{gt})}{c^2}\]

где \(\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)