Функции потерь: MSE и кросс-энтропия
Урок разбирает MSE и кросс-энтропию — функции потерь для регрессии и классификации.
Выбор функции потерь определяется задачей: предсказываем число — берём MSE; предсказываем класс — берём кросс-энтропию.
MSE — среднеквадратичная ошибка
Для регрессии (предсказание числа: цена, температура) естественно мерить, насколько предсказание отличается от истины. MSE усредняет квадраты разностей: MSE = среднее((pred - target)^2). Квадрат штрафует крупные промахи сильнее мелких и убирает знак ошибки.
def mse(preds, targets):
n = len(preds)
return sum((p - t) ** 2 for p, t in zip(preds, targets)) / n
preds = [2.5, 0.0, 2.1, 7.8]
targets = [3.0, -0.5, 2.0, 7.5]
print("Предсказания:", preds)
print("Истина: ", targets)
print("MSE:", round(mse(preds, targets), 4))
Вывод:
Предсказания: [2.5, 0.0, 2.1, 7.8] Истина: [3.0, -0.5, 2.0, 7.5] MSE: 0.15
Кросс-энтропия — для классификации
Для классификации сеть выдаёт вероятности классов (через softmax). Кросс-энтропия штрафует за неуверенность в правильном классе: CE = -log(p_верного_класса). Если сеть присвоила правильному классу вероятность около 1, -log(1) = 0 — потеря почти нулевая. Если правильному классу досталась маленькая вероятность, -log(маленькое) — потеря большая.
import math
def cross_entropy(probs, target_index):
return -math.log(probs[target_index])
probs = [0.7, 0.2, 0.1] # сеть выдала такие вероятности 3 классов
print("Вероятности классов:", probs)
print("Верный класс 0 (p=0.7), потеря:", round(cross_entropy(probs, 0), 4))
print("Если бы верным был класс 2 (p=0.1):", round(cross_entropy(probs, 2), 4))
Вывод:
Вероятности классов: [0.7, 0.2, 0.1] Верный класс 0 (p=0.7), потеря: 0.3567 Если бы верным был класс 2 (p=0.1): 2.3026
Уверенность 0.7 в правильном ответе даёт небольшую потерю 0.36, а уверенность всего 0.1 — потерю 2.30. Чем меньше вероятность, назначенная истинному классу, тем резче растёт штраф. Именно это толкает сеть быть уверенной в правильных ответах.
Сравнение
| Свойство | MSE | Кросс-энтропия |
| Задача | регрессия | классификация |
| Что на выходе | число | вероятности (softmax) |
| Штрафует | отклонение значения | неуверенность в верном классе |
Почему не использовать MSE для классификации? Можно, но кросс-энтропия даёт более «здоровые» градиенты: когда сеть сильно неправа, её поправка крупная, и обучение идёт быстрее. С MSE поверх sigmoid градиент в зоне ошибки часто слишком мал.
Среднее по всей выборке
В примерах выше мы считали потерю на одном объекте или одном векторе предсказаний. При обучении потерю усредняют по всему батчу: складывают потери отдельных примеров и делят на их число. Это даёт одно число — насколько плохо сеть справляется с целой порцией данных, — и именно его минимизирует градиентный спуск. Усреднение важно и технически: оно делает масштаб потери (и, значит, градиентов) независимым от размера батча, так что один и тот же learning rate работает и на батче из 32, и из 256 примеров.
Ещё одна тонкость — устойчивость кросс-энтропии. Если сеть присвоит правильному классу вероятность ровно 0, то -log(0) уйдёт в бесконечность и обучение сломается. На практике вероятность чуть «поджимают» от нуля (добавляют крошечное число) или используют готовую связку softmax + кросс-энтропия, где это учтено внутри. Поэтому в реальных фреймворках логиты подают прямо в функцию потерь, а softmax она применяет сама.
Итог
- MSE — среднее квадратов отклонений, для регрессии.
- Кросс-энтропия — минус логарифм вероятности верного класса, для классификации.
- Кросс-энтропия резко штрафует уверенные ошибки и ускоряет обучение классификаторов.