Loss-функции на собеседовании Data Scientist
Карьерник — 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() # принимает probabilitiesBCEWithLogitsLoss численно стабильнее (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.
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 даёт тот же результат проще.
Связанные темы
- Регуляризация L1 и L2 на собесе DS
- Class imbalance на собесе DS
- Gradient descent и оптимизаторы
- Что такое precision и recall
- Что такое AUC-ROC
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+ вопросами для собесов.