Функция потерь — это математическая функция, которая принимает на вход предсказание модели и истинное значение, а возвращает число. Чем больше это число, тем хуже модель справилась с задачей. Задача обучения нейросети — подобрать такие параметры (веса), чтобы это число стало как можно меньше.
Простыми словами: это «штраф» за ошибку. Если модель предсказала цену квартиры в 10 млн, а реальная цена — 12 млн, функция потерь посчитает, насколько сильно модель промахнулась, и превратит этот промах в число, с которым можно работать математически.
Как это работает
Обучение нейросети — это итеративный процесс. Модель делает предсказание на обучающих данных, функция потерь сравнивает его с правильным ответом и вычисляет значение ошибки. Затем алгоритм обратного распространения ошибки вычисляет градиент — вектор, показывающий, в каком направлении нужно скорректировать каждый вес, чтобы ошибка уменьшилась.
Градиентный спуск делает шаг в этом направлении, веса обновляются, и цикл повторяется. С каждой итерацией значение функции потерь должно снижаться. Если оно перестаёт снижаться или начинает расти — это сигнал о проблемах: слишком большой шаг обучения, переобучение или неправильно выбранная архитектура.
Важно понимать: функция потерь — это не метрика качества в привычном смысле. Она должна быть дифференцируемой, чтобы можно было вычислить градиент. Метрики вроде accuracy или F1-score не всегда подходят на эту роль, поэтому на обучении используют одну функцию, а на финальной оценке — другую.
Зачем это нужно
Без функции потерь обучение модели превращается в случайный перебор. Именно она даёт числовой ориентир: мы не можем напрямую «улучшить модель», но можем минимизировать конкретную математическую функцию. Это превращает задачу обучения в задачу оптимизации, для которой существуют эффективные численные методы.
Выбор функции потерь напрямую влияет на то, чему научится модель. Если использовать MSE для задачи классификации, модель будет плохо разделять классы. Если использовать кросс-энтропию для регрессии — обучение может вообще не сойтись. Поэтому подбор функции потерь — одна из ключевых задач при проектировании модели.
Примеры
- Регрессия (предсказание цены). Среднеквадратичная ошибка (MSE): модель предсказала 9.5 млн, реальная цена — 10 млн. Функция потерь вернёт (10 − 9.5)² = 0.25. Если предсказание 8 млн — ошибка уже 4.0. Большие промахи штрафуются сильнее.
- Бинарная классификация (спам/не спам). Бинарная кросс-энтропия: модель выдала вероятность спама 0.9, а письмо действительно спам (метка 1). Потеря = −log(0.9) ≈ 0.105. Если модель ошиблась и дала 0.1 при спаме — потеря = −log(0.1) ≈ 2.3. Ошибка наказывается в 20 раз сильнее.
- Мультиклассовая классификация (распознавание цифр). Категориальная кросс-энтропия: модель предсказала вероятности [0.1, 0.7, 0.2] для классов 0, 1, 2. Истинный класс — 1. Потеря = −log(0.7) ≈ 0.357.
- Обнаружение объектов (YOLO). Составная функция потерь: комбинация ошибки локализации (bounding box), ошибки уверенности (objectness) и ошибки классификации. Каждая часть вносит свой вклад в общее значение.
Формула или метрика
Общая запись функции потерь для одного примера:
L(y, ŷ)
где y — истинное значение, ŷ — предсказание модели.
Эмпирический риск — средняя потеря по всей обучающей выборке:
R = (1/n) × Σ L(yᵢ, ŷᵢ)
Задача обучения:
θ* = argmin R(θ)
где θ — параметры модели.
Типичные ошибки
- Использовать accuracy как функцию потерь. Accuracy недифференцируема, градиентный спуск с ней не работает. Нужна дифференцируемая суррогатная функция.
- Не масштабировать данные перед обучением с MSE. Если признаки имеют разный масштаб, большие значения будут доминировать в функции потерь, и модель проигнорирует мелкие, но важные признаки.
- Игнорировать дисбаланс классов при кросс-энтропии. При соотношении классов 99:1 модель может просто предсказывать мажоритарный класс и получать низкую потерю, но быть бесполезной. Нужны веса классов или focal loss.
- Слишком долго ждать снижения потерь на валидации. Если train loss падает, а validation loss растёт — это переобучение, обучение пора останавливать.
Как улучшить
- Подбирайте функцию потерь под задачу. Регрессия — MSE, MAE или Huber. Классификация — кросс-энтропия. Детекция — составные функции. Не используйте универсальное решение.
- Следите за ландшафтом функции потерь. Если потери колеблются или растут, уменьшите learning rate. Если падают слишком медленно — попробуйте другой оптимизатор (Adam вместо SGD).
- Добавляйте регуляризацию. L1 или L2-регуляризация добавляет штраф за большие веса к функции потерь, что снижает переобучение.
- Нормализуйте входные данные. Стандартизация (приведение к нулевому среднему и единичной дисперсии) делает ландшафт функции потерь более гладким и ускоряет сходимость.
- Используйте learning rate scheduler. Постепенное снижение скорости обучения по мере приближения к минимуму позволяет точнее попасть в оптимум и избежать «перепрыгивания».