Небольшое руководство или введение об общих функциях потерь, используемых в машинном обучении, включая потерю перекрестной энтропии, потерю L1, потерю L2 и потерю шарнира. Практические детали включены для PyTorch.

Перекрестная энтропия

Перекрестная потеря энтропии обычно используется в задачах классификации как в традиционном машинном обучении, так и в глубоком обучении.

Примечание. logit здесь используется для обозначения ненормализованного вывода NN, как в Глоссарии Google ML. Однако, надо признать, этот термин перегружен, о чем говорится в этом посте.

На этом рисунке необработанные ненормализованные выходные данные нейронной сети преобразуются в вероятность функцией softmax.

Теперь предположим, что у нас есть обучающая выборка, которая представляет собой собаку, целевая метка будет [1,0,0,0], в то время как исходный результат NN - [3.2, 1.3, 0.2, 0.8], выход вероятности softmax - [0.775, 0.116, 0.039, 0.07], каковы будут потери перекрестной энтропии?

Подставляя значения, мы получаем значение потерь:

Примечание. Обычно используется натуральный логарифм.

После некоторого обновления весов у нас есть новые необработанные выходные данные для той же выборки, вероятность softmax становится [0.9, 0.05, 0.03, 0.02], новое значение потерь:

Эта новая потеря ниже, чем предыдущая, что указывает на то, что NN обучается. Интуитивно мы также можем заметить, что вероятность softmax ближе к истинному распределению.

Идеальные потери будут равны 0, когда выходы softmax идеально соответствуют истинному распределению. Однако это означало бы чрезмерную переоснащение.

Еще одно практическое замечание: в Pytorch, если используется nn.CrossEntropyLoss входное значение должно быть ненормализованным необработанным значением (также известным как logits), целью должен быть индекс класса вместо одного вектора с горячим кодированием.

См. Документацию Pytorch на CrossEntropyLoss.

Тот же расчет ручки и бумаги был бы

from torch import nn
criterion = nn.CrossEntropyLoss()
input = torch.tensor([[3.2, 1.3,0.2, 0.8]],dtype=torch.float)
target = torch.tensor([0], dtype=torch.long)
criterion(input, target)
Out[55]: tensor(0.2547)

Обратите внимание, что ввод - это необработанные логиты, а целью является индекс класса от 0 до 3 в этом случае, представляющий собаку, кошку, лошадь, гепарда соответственно.

Также в этом примере мы рассматривали только одну обучающую выборку, на самом деле мы обычно делаем мини-партии. И по умолчанию PyTorch будет использовать среднюю потерю кросс-энтропии для всех образцов в пакете.

Кто-то может задаться вопросом, каково хорошее значение потери кросс-энтропии, как мне узнать, насколько хорошо я потерял в тренировках?

Некоторые интуитивно понятные рекомендации из Поста MachineLearningMastery для натурального журнала на основе средней потери:

  • Кросс-энтропия = 0,00: идеальные вероятности.
  • Кросс-энтропия ‹0,02: большие вероятности.
  • Кросс-энтропия ‹0,05: на правильном пути.
  • Кросс-энтропия ‹0,20: отлично.
  • Кросс-энтропия ›0,30: не очень хорошо.
  • Кросс-энтропия ›1,00: ужасно.
  • Кросс-энтропия ›2,00 Что-то не работает.

Двоичная кросс-энтропия - это особый случай, когда количество классов равно 2. На практике это часто реализуется в разных API. В PyTorch есть nn.BCELoss и nn.BCEWithLogitsLoss. Первый требует, чтобы на входе была нормализованная сигмовидная вероятность, тогда как второй может принимать необработанные ненормализованные логиты.

Среднеквадратичная ошибка и другие

MAE - для средней абсолютной ошибки, MSE - для среднеквадратичной ошибки и RMSE - для среднеквадратичной ошибки.

Этот пост представляет собой краткий обзор MAE, MSE и RMSE.

MAE также известен как L1 Loss, а MSE также известен как L2 Loss.

Потеря шарнира

Потери на шарнирах обычно используются для SVM.

Эта потеря используется для классификатора максимальной маржи, такого как SVM. Предположим, что граница находится в начале координат:

  • Если экземпляр классифицирован правильно и с достаточным запасом (расстояние ›1), для потерь устанавливается значение 0.
  • Если экземпляр классифицирован правильно , но очень близко к границе (0 ‹расстояние‹ 1)
  • Если экземпляр классифицирован как промах, положительный убыток используется в качестве штрафа, пропорционального расстоянию.

где t представляет истинную метку (в SVM мы используем -1 и +1 для обозначения двух разных классов), y представляет оценку прогноза (необработанные выходные данные модели, аналогично logit), который можно интуитивно понять как расстояние от границы прогноза.

Если и t, и y имеют один и тот же знак (t * y ›0), результаты классификации верны. однако, как объяснялось, для этих 0 ‹t * y‹ 1 мы все равно налагаем небольшой штраф, потому что они находятся слишком близко к границе.

Если t * y ‹0, что означает неправильную классификацию, положительный убыток используется в качестве штрафа, пропорционального расстоянию y.

Примечания

  1. Часть этого блога, посвященная кросс-энтропии, черпает вдохновение из: https://towardsdatascience.com/cross-entropy-loss-function-f38c4ec8643e
  2. В части потери шарнира в качестве ссылки используется https://towardsdatascience.com/a-definitive-explanation-to-hinge-loss-for-support-vector-machines-ab6d8d3178f1.