Функции потерь

Урок объясняет, что такое функция потерь и какую выбирать под задачу.

Функция потерь (loss) — это число, измеряющее, насколько предсказание модели расходится с правильным ответом; обучение стремится её минимизировать.

Loss — это компас обучения. Сеть не «знает», что такое цифра 7 или кошка; она лишь пытается сделать число loss меньше. Поэтому правильный выбор функции потерь определяет, чему именно научится модель.

Под какую задачу какой loss

ЗадачаLossВыход модели
регрессия (число)mean_squared_error (MSE)линейный
бинарная классификацияbinary_crossentropysigmoid
многоклассоваяcategorical_crossentropysoftmax
многоклассовая, метки-числаsparse_categorical_crossentropysoftmax

MSE своими руками

Среднеквадратичная ошибка — средний квадрат разницы между предсказанием и истиной. Код запускается:

y_true = [3.0, -0.5, 2.0, 7.0]
y_pred = [2.5,  0.0, 2.0, 8.0]

mse = sum((t - p) ** 2 for t, p in zip(y_true, y_pred)) / len(y_true)
print("MSE:", round(mse, 4))

Вывод:

MSE: 0.375

Crossentropy своими руками

Кросс-энтропия штрафует за уверенную ошибку: если модель уверенно предсказала неверный класс, loss резко растёт. Посчитаем для одного примера:

import math

# истинный класс — индекс 0
probs = [0.7, 0.2, 0.1]   # предсказанные вероятности
true_index = 0

loss = -math.log(probs[true_index])
print("crossentropy:", round(loss, 4))

# а если модель уверена в неверном классе:
probs_bad = [0.1, 0.8, 0.1]
print("при ошибке:", round(-math.log(probs_bad[true_index]), 4))

Вывод:

crossentropy: 0.3567
при ошибке: 2.3026

В Keras

Loss задают строкой в compile (требует TF):

model.compile(optimizer="adam",
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])

Как работает под капотом

На каждом шаге обучения Keras считает loss по батчу, а затем — градиент loss по всем весам. Градиент показывает, в какую сторону менять каждый вес, чтобы loss уменьшился. Loss обязан быть дифференцируемым: поэтому используют гладкие crossentropy и MSE, а не «долю верных ответов» напрямую (accuracy недифференцируема и служит лишь метрикой для человека).

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

  • Перепутать crossentropy. Если метки — целые числа (0,1,2...), нужен sparse_categorical_crossentropy; если one-hot — обычный categorical_crossentropy.
  • MSE для классификации. Для классов почти всегда лучше crossentropy.
  • Смотреть только на accuracy. Loss точнее отражает уверенность модели; accuracy — лишь удобная для человека метрика.

Итог

  • Loss измеряет ошибку; обучение минимизирует именно его.
  • MSE — для регрессии, crossentropy — для классификации.
  • sparse_ версия — когда метки целые числа, обычная — когда one-hot.
  • Loss должен быть дифференцируемым; accuracy — это метрика, а не loss.
Проверьте себя
1. Какой loss выбирают для регрессии (предсказания числа)?
Abinary_crossentropy
Bmean_squared_error
Ccategorical_crossentropy
Daccuracy
2. Когда нужен sparse_categorical_crossentropy вместо categorical_crossentropy?
AКогда метки заданы целыми числами, а не one-hot
BКогда классов меньше трёх
CКогда выход линейный
DКогда модель маленькая
3. Почему loss обязан быть дифференцируемым, а accuracy — нет?
AAccuracy точнее
BПо loss считают градиенты для обновления весов, по accuracy — нет
CДифференцируемость нужна для красоты
DЭто требование Python