Функции потерь: 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 — среднее квадратов отклонений, для регрессии.
  • Кросс-энтропия — минус логарифм вероятности верного класса, для классификации.
  • Кросс-энтропия резко штрафует уверенные ошибки и ускоряет обучение классификаторов.
Проверьте себя
1. Какую функцию потерь выбрать для предсказания цены квартиры?
AКросс-энтропию
BMSE
CSoftmax
DReLU
2. Чему примерно равна кросс-энтропия, если верному классу назначена вероятность около 1?
AОчень большой
BБлизка к нулю
CРовно 1
DОтрицательной
3. Почему квадрат в MSE удобен?
AОн ускоряет деление
BУбирает знак ошибки и сильнее штрафует крупные промахи
CДелает потерю отрицательной
DНормализует данные
Поддержать проект