Углубленный взгляд на кросс-энтропию, интуицию и доводы, лежащие в основе ее необходимости и полезности.

Вступление.

Долгое время я не полностью понимал потерю кросс-энтропии. Почему мы взяли экспоненты (softmax)? Зачем мы тогда взяли бревно? Почему мы сняли отрицательный результат с этого журнала? Как мы закончили с положительным убытком, который мы должны минимизировать?

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

Недавно я начал проходить курс Fastai 2020, где Джереми объяснял кросс-энтропию, и хотя я думаю, что он проделал хорошую работу, на мои предыдущие вопросы не было дано хорошего ответа. Итак, я начал размышлять и играть с записными книжками и, наконец, понял это.

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

Какова цель функции потерь?

Цель функции потерь - просто вывести одно число (скоро станет ясно, как мы получим это число), и это число имеет 2 требования.

  1. Число должно быть положительным.
  2. Число должно быть тем больше, чем точнее наша модель.

Наша цель - минимизировать это число. Чем ближе наши потери к нулю, тем точнее наша модель.

Примечание: я не буду объяснять, почему это так, я предполагаю, что вы знаете, что цель нейронных сетей - минимизировать потери. Если вы хотите узнать больше, перейдите на сайт fast.ai и следуйте замечательному курсу Джереми по глубокому обучению. Это относится ко всем вопросам, не связанным с кросс-энтропией, однако я готов ответить на них в комментариях.

Первая остановка, активации.

Наша первая остановка - активации. Это выходы последнего слоя нейронной сети и предположения, которые наша сеть делает для метки нашего изображения. Чем ближе активации к этикеткам, тем точнее наша модель.

давайте рассмотрим изображение теннисного мяча. Мы пытаемся выяснить, является ли изображение одним из трех:

  1. баскетбол
  2. теннисный мячик
  3. футбол

Метка теннисного мяча будет [0,1,0]. Это прогнозы, которые будут точными на 100%. Предположения соответственно соответствуют 0% баскетболу, 100% теннисному мячу и 0% футболу.

Теперь предположим, что наши активации [0.001, 4.334, 2.90]. Это просто случайные числа, которые я вынул из своего воображения. Однако, если мы предположим, что это активации, мы ясно увидим, что активация теннисного мяча самая высокая, однако как мы можем это количественно оценить? Или как это выразить с точки зрения вероятности в процентах?

Также, если бы у нас был другой набор активаций, скажем [4,334, 2,90, 0,01], теперь самая высокая активация - для баскетбола. Но наше изображение - теннисный мяч, как количественно определить, насколько неверна наша модель?

Вот тут-то и появляется кросс-энтропия.

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

В основном это безумие состоит из трех шагов (хотя, как только вы поймете, что это очень просто и интуитивно понятно).

1. Софтмакс

Первый шаг - сделать наши значения активаций между 0 и 1. Мы делаем это, все значения активаций соответствуют вероятности принадлежности изображения к определенному классу, теперь мы можем просто максимизировать одно значение, соответствующее правильному классу, что автоматически уменьшите значения, соответствующие неправильному классу. Этот процесс был бы намного сложнее, если бы мы работали с необработанными активациями.

Примечание. Не запутайтесь, когда я скажу, что мы хотим максимизировать количество активаций. МЫ ХОЧЕМ МАКСИМИЗИРОВАТЬ АКТИВАЦИИ, мы хотим минимизировать только потери.
АКТИВАЦИИ ЯВЛЯЮТСЯ УГАДАМИ НАШЕЙ МОДЕЛИ, ПОТЕРЯ ЯВЛЯЕТСЯ МЕРОМ НЕПРАВИЛЬНОСТИ НАШЕЙ МОДЕЛИ.
Мы хотим уменьшить ошибочность (потери) и повысить правильность прогнозов (активация, соответствующая правильной метке).

Как мы делаем softmax?
ДЛЯ КАЖДОГО ПУНКТА: возьмите показатель степени каждого элемента и разделите его на сумму показателей всех элементов.

Для наших активаций [4.334, 2.90, 0.01] давайте вычислим показатель степени каждого элемента.

действует = [4,334, 2,90, 0,01]

exp_acts = [76.2487, 18.1741, 1.0101]

сумма (exp_acts) = 95,4329

act_softmax = [0,7990, 0,1904, 0,0106]

Посмотрите, как самая высокая активация соответствует самой высокой вероятности, поэтому мы делаем softmax

Боковая панель: Почему бы нам просто не выполнить действия = действия / сумма (действия)?
Давайте попробуем:
действия / сумма (действия) = [0,5983, 0,4003, 0,0014]
сравните это с softmax более высокая активация соответствует более высокой вероятности с softmax, чем с нормализацией. Эта функция желательна в большинстве случаев при классификации, поэтому мы используем softmax.

2. Журнал

Рассмотрим 2 значения кросс-энтропии: одно - 0,99, а второе - 0,999. Они кажутся относительно близкими, и если мы посчитаем наши потери на основе softmax, потери для этих двух не будут сильно отличаться. Однако это нежелательно.
Рассмотрим 10 000 элементов, при первом softmax, равном 0,99, 100 элементов классифицируются неверно, но при втором softmax, равном 0,999, неверно классифицируются только 10 элементов. По сути, softmax 0,999 в 10 раз лучше, а не просто немного лучше. Эта разница в качестве лучше всего выражена с помощью бревна.

журнал (0,01) = -4,6051
журнал (0,001) = -6,9077

Разница в приведении значений журнала, несмотря на близкие значения softmax, очень полезна.
Также log (1) = 0, поэтому, когда вероятность softmax равна 100% для правильного класса, потеря (если просто log (softmax) равна 0).

Мы вычисляем потерю, где label == 1, мы берем -log (softmax), который представляет собой потерю.

3. Почему отрицательная потеря журнала?

В нашем случае, когда softmax равен 1, log softmax равен 0, поэтому потери равны нулю. Это правильно.

Но когда наш softmax равен 0,01, наш log softmax равен - 4,6, но мы знаем, что наша потеря должна быть большим положительным числом, которое мы должны минимизировать, поэтому мы берем отрицательное значение, делая наш - log (softmax) положительный, что является правильным значением для потери.

Лог отрицательный из-за характера кривой.

И поскольку значения softmax всегда меньше или равны единице, логарифм всегда отрицательный, следовательно, -log (softmax) положительный.

Повторюсь: -Log (softmax) - это наша величина потерь. Мы берем среднее значение каждого значения потерь в наборе данных или мини-пакете, чтобы получить общие потери, которые мы стараемся минимизировать.

Мысли на вынос

  1. Мы берем показатель активаций, чтобы увеличить разрыв между предсказанными вероятностями.
  2. Мы берем логарифм softmax, чтобы приравнять небольшие различия softmax к большой разнице в потерях, которая должна существовать. В некотором смысле мы уменьшаем количество активаций с помощью softmax, чтобы помочь спрогнозировать, но мы устраняем их с помощью журнала, чтобы точно оценить потери.
  3. Мы берем отрицательное значение журнала, чтобы получить положительную потерю, поскольку журнал возвращает отрицательные значения для значений меньше 1 (как в случае со значениями softmax).

Кредиты

  1. Многие идеи здесь были взяты из курса Джереми Ховарда Fastai, я просто попытался объяснить, что я понял лучше, и добавил несколько своих идей.
  2. Https://saylordotorg.github.io/text_intermediate-algebra/s10-03-logarithmic-functions-and-thei.html - вот откуда я взял изображение логарифма.