Loss-функции на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем разбирать loss

Loss — то, что модель минимизирует. Выбор loss напрямую влияет на свойства решения. На собесе DS обязательно спросят: «Чем MSE отличается от MAE?», «Почему cross-entropy в классификации, а не accuracy?». Это базовая интуиция, без которой кандидат не может объяснить, что делает model.fit().

Главная боль без понимания loss — DS использует MSE на регрессии, в которой 5% выбросов. Модель «убегает» к ним. Аналитик не понимает, почему предсказания плохие на 95% случаев. Замена на MAE/Huber решает.

Регрессия: MSE, MAE, Huber

MSE (Mean Squared Error) — среднеквадратичная ошибка:

MSE = mean((y - ŷ)²)

Свойства: дифференцируема везде, штрафует большие ошибки квадратично. Соответствует MLE при гауссовских остатках. Выбросы тянут модель.

MAE (Mean Absolute Error) — средняя абсолютная ошибка:

MAE = mean(|y - ŷ|)

Свойства: робастна к выбросам, недифференцируема в нуле. MLE при Лапласе. Не наказывает крупные ошибки сильнее мелких → меньшее «убегание» к выбросам.

Huber loss — гибрид: MSE для маленьких ошибок, MAE для больших.

L = ½ · e²,                 если |e| ≤ δ
L = δ · (|e| - ½ · δ),      иначе

δ — порог. Дифференцируема везде, робастна.

Когда что:

  • Чистые данные, нормальные остатки → MSE (стандарт)
  • Много выбросов или тяжёлые хвосты → MAE / Huber
  • В sklearn у Linear Regression — MSE. У XGBoost — reg:squarederror (MSE), reg:absoluteerror (MAE), reg:pseudohubererror (Huber).

MAPE (Mean Absolute Percentage Error) — относительная ошибка:

MAPE = mean(|y - ŷ| / |y|)

Минусы: ломается на y=0, асимметрична (наказывает under-prediction сильнее). Заменяется на sMAPE или MASE для прогноза временных рядов.

Бинарная классификация: log-loss

Log loss / binary cross-entropy:

L = -mean(y · log(p) + (1-y) · log(1-p))

p — предсказанная вероятность класса 1.

Зачем log: log сильно штрафует уверенно неправильные предсказания. Если модель сказала p=0.99 для класса 0 — log(0.01) = -4.6, big penalty. Если p=0.51 — small penalty.

Связь с MLE: log-loss = -log-likelihood под Бернулли. Минимизация log-loss = MLE для логистической регрессии.

Почему не accuracy в loss:

  • Accuracy не дифференцируема (step function)
  • Модель не получает «направления» улучшения
  • Log-loss даёт градиент
import torch.nn as nn
loss = nn.BCEWithLogitsLoss()  # принимает logits, не probabilities
# или
loss = nn.BCELoss()  # принимает probabilities

BCEWithLogitsLoss численно стабильнее (sigmoid + log объединены).

Многоклассовая: cross-entropy

L = -mean(Σ_c y_c · log(p_c))

y_c — one-hot истинный класс, p_c — предсказанная вероятность класса c.

Softmax + cross-entropy — стандарт для multi-class. Softmax преобразует logits в вероятности, cross-entropy измеряет разрыв с истинным распределением.

loss = nn.CrossEntropyLoss()  # принимает logits + class indices (не one-hot)

Label smoothing: регуляризация cross-entropy — вместо one-hot (1, 0, 0) использовать (1-ε, ε/(K-1), ε/(K-1)). Помогает модели не становиться overconfident.

Multi-label (несколько классов одновременно): использовать BCEWithLogitsLoss с sigmoid на каждый класс независимо.

KL-divergence — обобщение cross-entropy. Минимизация KL ≡ минимизация cross-entropy при фиксированном target.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Hinge loss и SVM

L = max(0, 1 - y · ŷ)

y ∈ {-1, 1}, ŷ — score модели.

Свойства:

  • Если предсказание уверенно правильное (y · ŷ > 1) — loss = 0
  • Иначе — линейный штраф

Hinge даёт maximum margin classifier — это SVM. Sklearn SGDClassifier(loss='hinge') — это linear SVM.

Squared hinge: max(0, 1 - y·ŷ)² — ещё сильнее штрафует за уверенные ошибки.

В нейросетях hinge встречается реже cross-entropy, но в metric learning (triplet loss) — вариация hinge.

Focal loss

Модификация cross-entropy для сильного дисбаланса:

FL = -α · (1 - p_t)^γ · log(p_t)

(1 - p_t)^γ — фокусирующий множитель. Уверенно правильные предсказания (p_t близко к 1) → множитель близок к 0 → loss маленький. Трудные → loss большой.

γ=2 — типичное. γ=0 — обычная cross-entropy.

α — class weight. На сильном дисбалансе (1:1000) дополнительно балансирует.

Применение: object detection (RetinaNet), сильный imbalance в классификации, медицинская диагностика редких заболеваний.

В torchvision доступна torchvision.ops.sigmoid_focal_loss.

Частые ошибки

MSE на сильно несимметричном таргете. Если y экспоненциально распределён — MSE «убегает» к большим. Логарифмировать y или использовать log_loss для positive regression.

Cross-entropy без softmax. В torch CrossEntropyLoss ожидает logits, не probabilities. Двойной softmax (sigmoid внутри модели + cross-entropy) ломает обучение.

Использовать accuracy как loss. Accuracy не дифференцируема. Минимизировать proxy (cross-entropy), оценивать accuracy на val.

Нормализация только некоторых выходов в multi-task. Если loss = MSE_task1 + cross_entropy_task2, разные масштабы. Балансировать через коэффициенты или uncertainty weighting.

Class weights без необходимости. На сбалансированных данных class weights делают модель overconfident на редких классах.

Игнорировать calibration. Минимизация log-loss даёт калиброванные вероятности, hinge — нет. Если важно «p=0.7 значит 70%» — log-loss; если только argmax — можно hinge.

Focal loss без причины. На умеренном дисбалансе обычная cross-entropy с class_weight даёт тот же результат проще.

Связанные темы

FAQ

MSE или MAE — что выбирать в дефолте?

Для большинства задач MSE: дифференцируемая, согласована с гауссовскими остатками, эффективна. MAE — когда есть выбросы, которые не нужно «учитывать сильно».

Cross-entropy и log-loss — это одно и то же?

В бинарном случае — да. В мультиклассовом log-loss обычно называют cross-entropy (отрицательный log-likelihood под категориальным распределением).

Как добавить кастомный loss в sklearn?

В sklearn ограниченный набор. Кастом — через partial_fit с своим градиентом, или переход на pytorch/lightgbm/xgboost с custom_objective.

Триплет loss что это?

Loss для metric learning: на тройке (anchor, positive, negative) штрафуем расстояние anchor-positive больше anchor-negative. Используется в face recognition, similarity search.

Что такое Dice loss?

Loss для сегментации, основан на коэффициенте Дайса. Хорош на дисбалансе пикселей (мало foreground). 1 - 2·|A∩B|/(|A|+|B|).

Это официальная информация?

Нет. Статья основана на классических работах по loss-функциям и документации PyTorch / sklearn / XGBoost.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.