- Вопрос или проблема
- $$H(p,q) = -\sum_{\forall x} p(x) \log(q(x))$$
- $$L = – \mathbf{y} \cdot \log(\mathbf{\hat{y}})$$
- $$J = – \frac{1}{N}\left(\sum_{i=1}^{N} \mathbf{y_i} \cdot \log(\mathbf{\hat{y}_i})\right)$$
- Ответ или решение
- Объяснение потерь кросс-энтропии
- Основы кросс-энтропии
- Пример расчета потерь кросс-энтропии
- Важные аспекты кросс-энтропии
- Заключение
Вопрос или проблема
Предположим, я строю нейронную сеть для классификации. Последний слой – это плотный слой с активацией Softmax. У меня есть пять различных классов для классификации. Предположим, для одного примера обучения истинная метка
равна [1 0 0 0 0]
, в то время как предсказания составляют [0.1 0.5 0.1 0.1 0.2]
. Как бы я рассчитал потери кросс-энтропии для этого примера?
Формула кросс-энтропии принимает две распределения, $p(x)$, истинное распределение, и $q(x)$, оцененное распределение, определенное над дискретной переменной $x$, и представлено как
$$H(p,q) = -\sum_{\forall x} p(x) \log(q(x))$$
Для нейронной сети расчет не зависит от следующего:
-
Какой тип слоя был использован.
-
Какой тип активации был использован – хотя многие активации не будут совместимы с расчетом, потому что их выходные данные не интерпретируемы как вероятности (т.е. их выходные значения отрицательные, больше 1 или не складываются до 1). Softmax часто используется для многоклассовой классификации, потому что гарантирует хорошо поведение функции распределения вероятностей.
Для нейронной сети вы обычно увидите уравнение, записанное в форме, где $\mathbf{y}$ – это вектор истинных данных, а $\mathbf{\hat{y}}$ (или какое-то другое значение, взятое напрямую из выходных данных последнего слоя) – это оценка. Для одного примера это будет выглядеть так:
$$L = – \mathbf{y} \cdot \log(\mathbf{\hat{y}})$$
где $\cdot$ – это скалярное произведение.
Ваша истинная метка $\mathbf{y}$ присваивает всю вероятность первому значению, а остальные значения равны нулю, поэтому мы можем игнорировать их и просто использовать соответствующий термин из ваших оценок $\mathbf{\hat{y}}$
$L = -(1\times log(0.1) + 0 \times \log(0.5) + …)$
$L = – log(0.1) \approx 2.303$
Важный момент из комментариев
Это означает, что потери будут одинаковыми, независимо от того, являются ли предсказания $[0.1, 0.5, 0.1, 0.1, 0.2]$ или $[0.1, 0.6, 0.1, 0.1, 0.1]$?
Да, это ключевая особенность многоклассовой кросс-энтропии, она поощряет/наказывает вероятности правильных классов только. Значение независимо от того, как оставшаяся вероятность распределяется между неверными классами.
Вы часто увидите это уравнение, усредненное по всем примерам, как функцию стоимости. Не всегда строго в описаниях, но обычно функция потерь более низкого уровня и описывает, как один экземпляр или компонент определяет значение ошибки, в то время как функция стоимости более высокого уровня и описывает, как полная система оценивается для оптимизации. Функция стоимости, основанная на многоклассовой кросс-энтропии для набора данных размером $N$, может выглядеть так:
$$J = – \frac{1}{N}\left(\sum_{i=1}^{N} \mathbf{y_i} \cdot \log(\mathbf{\hat{y}_i})\right)$$
Многие реализации требуют, чтобы ваши значения истинных данных были закодированы в формате one-hot (с единственным истинным классом), потому что это позволяет добиться дополнительной оптимизации. Однако, в принципе, потерю кросс-энтропии можно рассчитать – и оптимизировать – когда это не так.
Ответ Нила верный. Однако я считаю важным отметить, что хотя потери не зависят от распределения между неверными классами (только распределение между правильным классом и остальными), градиент этой функции потерь воздействует на неверные классы по-разному в зависимости от того, насколько они ошибочны. Поэтому, когда вы используете кросс-энтропию в машинном обучении, вы будете изменять веса по-разному для [0.1 0.5 0.1 0.1 0.2] и [0.1 0.6 0.1 0.1 0.1]. Это происходит потому, что оценка правильного класса нормализуется по рейтингам всех остальных классов, чтобы превратить его в вероятность.
Давайте начнем с понимания энтропии в теории информации: предположим, вы хотите передать строку алфавитов “aaaaaaaa”. Вы можете легко сделать это как 8*”a”. Теперь возьмите другую строку “jteikfqa”. Есть ли более компактный способ передачи этой строки? Нет, не так ли. Мы можем сказать, что энтропия второй строки больше, поскольку для её передачи нам нужно больше “бит” информации.
Этот аналог применим и к вероятностям. Если у вас есть набор предметов, например, фруктов, двоичное кодирование этих фруктов будет $log_2(n)$, где n – количество фруктов. Для 8 фруктов вам нужно 3 бита и так далее. Другой способ взглянуть на это: если вероятность того, что кто-то выберет фрукт случайным образом, равна 1/8, то уменьшение неопределенности, если фрукт выбран, составляет $-\log_{2}(1/8)$, что равно 3. Более конкретно,
$$-\sum_{i=1}^{8}\frac{1}{8}\log_{2}(\frac{1}{8}) = 3$$
Эта энтропия говорит нам об неопределенности, связанной с определенными распределениями вероятностей; чем больше неопределенность/вариация в распределении вероятностей, тем больше энтропия (например, для 1024 фруктов это было бы 10).
В “кросс”-энтропии, как следует из названия, мы сосредотачиваемся на количестве бит, необходимых для объяснения различия в двух различных распределениях вероятностей. Наилучший сценарий – это когда оба распределения идентичны, в этом случае требуется наименьшее количество бит, то есть простая энтропия. В математических терминах,
$$H(\bf{y},\bf{\hat{y}}) = -\sum_{i}\bf{y}_i\log_{e}(\bf{\hat{y}}_i)$$
Где $\bf{\hat{y}}$ – это предсказанный вектор вероятности (выход Softmax), а $\bf{y}$ – это вектор истинных значений (например, one-hot). Причина использования натурального логарифма заключается в том, что его легко дифференцировать (ссылаясь на вычисление градиентов), а причина, по которой мы не берем логарифм вектора истинных данных, заключается в том, что в нем много нулей, что упрощает суммирование.
В конечном счете: простыми словами, кросс-энтропию можно рассматривать как расстояние между двумя распределениями вероятностей в терминах объема информации (бит), необходимого для объяснения этого расстояния. Это удобный способ определения потерь, который уменьшается, когда распределения вероятностей становятся ближе друг к другу.
Давайте посмотрим, как ведет себя градиент потерь… У нас есть кросс-энтропия как функция потерь, которая представлена как
$$
H(p,q) = -\sum_{i=1}^n p(x_i) \log(q(x_i)) = -(p(x_1)\log(q(x_1)) + \ldots + p(x_n)\log(q(x_n))
$$
Отсюда… мы хотели бы знать производную по некоторому $x_i$:
$$
\frac{\partial}{\partial x_i} H(p,q) = -\frac{\partial}{\partial x_i} p(x_i)\log(q(x_i)).
$$
Поскольку все другие термины устраняются из-за дифференцирования. Мы можем сделать это уравнение на шаг дальше до
$$
\frac{\partial}{\partial x_i} H(p,q) = -p(x_i)\frac{1}{q(x_i)}\frac{\partial q(x_i)}{\partial x_i}.
$$
Из этого мы можем видеть, что мы все еще наказываем только истинные классы (для которых есть значение для $p(x_i)$). В противном случае у нас просто градиент ноль.
Мне интересно, как программные пакеты справляются с предсказанным значением 0, в то время как истинное значение было больше нуля… Поскольку в этом случае мы делим на ноль.
Я хотел бы добавить несколько аспектов к приведенным выше ответам:
true label = [1 0 0 0 0]
predicted = [0.1 0.5 0.1 0.1 0.2]
Кросс-энтропия (CE) сводится к взятию логарифма единственного положительного предсказания. Итак, CE = -ln(0.1), что равно 2.3.
Это означает, что отрицательные предсказания не играют роли в расчете CE. Это сделано намеренно.
В редких случаях может потребоваться учитывать отрицательные значения. Это можно сделать, рассматривая приведенный выше пример как серию бинарных предсказаний. Итак:
true labels = [1,0], [0,1], [0,1], [0,1], [0,1]
predicted = [0.1, 0.9], [.5, .5], [.1, .9], [.1, .9], [.2, .8]
Теперь мы можем вычислить 5 различных кросс-энтропий – по одной для каждой из 5 комбинаций истинной метки/предсказанного значения и сложить их. Затем:
CE = -[ ln(.1) + ln(0.5) + ln(0.9) + ln(0.9) + ln(0.8)] = 3.4
CE имеет другую шкалу, но продолжает быть мерой различия между ожидаемыми и предсказанными значениями. Единственное отличие заключается в том, что в этой схеме отрицательные значения также наказываются/поощряются вместе с положительными значениями.
Все фреймворки по умолчанию используют первое определение CE, и это правильный подход в 99% случаев. Однако если ваша проблема такова, что вы собираетесь использовать выходные вероятности (как положительные, так и отрицательные) вместо того, чтобы использовать max(), чтобы предсказать только один положительный класс, то вы можете рассмотреть эту версию CE.
Последняя ситуация может быть многометочной. Что если несколько классов “могут” присутствовать в одном образце – что-то вроде –
true label = [1 0 0 0 1]
and predicted is = [0.1 0.5 0.1 0.1 0.9]
По определению, CE измеряет разницу между двумя распределениями вероятностей. Но приведенные выше два списка не являются распределениями вероятностей. Распределения вероятностей всегда должны в сумме давать 1. Как мы это решаем?
Решение: сначала в многоклассовой проблеме есть более одного “1” на выходе. Поэтому мы должны избавиться от softmax и ввести сигмоиды – по одной для каждого нейрона в последнем слое (учтите, что количество нейронов = количество классов). Во-вторых, мы используем подход, описанный выше, для расчета потерь, в котором мы разбиваем ожидаемые и предсказанные значения на 5 индивидуальных распределений вероятностей:
true labels = [1,0], [0,1], [0,1], [0,1], [1,0]
predicted = [.1, .9], [.5, .5], [.1, .9], [.1, .9], [.9, .1]
Теперь, как и прежде, мы продолжаем брать кросс-энтропию для вышеупомянутых 5 истинных меток и 5 предсказанных распределений вероятностей и складываем их. Затем:
CE = -[ ln(.1) + ln(0.5) + ln(0.9) + ln(0.9) + ln(0.9)] = 3.3
Иногда количество классов может быть очень высоким – скажем, 1000, и в каждом образце может быть только пара из них. Таким образом, истинная метка выглядит примерно так: [1,0,0,0,0,0,1,0,0,0…..990 нулей]. Предсказанное может быть примерно таким: [.8, .1, .1, .1, .1, .1, .8, .1, .1, .1…..990 0.1’s]
В этом случае CE =
- [ ln(.8) + ln(.8) для 2 положительных классов и 998 * ln(0.9) для 998 отрицательных классов]
= 0.44 (для положительных классов) + 105 (для отрицательных классов)
Вы можете увидеть, как отрицательные классы начинают создавать помехи при расчете потерь. Голос положительных образцов (которые могут быть нам важны) затмевается. Что нам делать? Мы не можем использовать категориальную CE (версию, где учитываются только положительные образцы). Это связано с тем, что мы вынуждены разбивать вероятностные распределения на несколько бинарных вероятностных распределений, иначе это вообще не было бы вероятностным распределением. Как только мы разбиваем его на несколько бинарных вероятностных распределений, у нас нет выбора, кроме как использовать бинарную CE, и это, конечно, придает вес отрицательным классам.
Одним из вариантов является заглушить голос отрицательных классов с помощью множителя. Facebook сделали это и многое другое в статье, которую они опубликовали в 2018 году, и вы можете обратиться к focal loss для получения дополнительной информации
Для более глубокого изучения этой темы вы можете обратиться к: https://towardsdatascience.com/cross-entropy-classification-losses-no-math-few-stories-lots-of-intuition-d56f8c7f06b0
Проблема в том, что вероятности поступают из ‘сложной’ функции, которая включает в себя другие выходы в данное значение. Результаты взаимосвязаны, поэтому мы не выводим по фактическому результату, а по всем входам последней активационной функции (softmax) для каждого отдельного исхода.
Я нашел очень хорошее описание здесь, где автор показывает, что фактическая производная – это $p_i – y_i$.
Другие хорошие описания можно найти здесь.
Я думаю, что использование простой сигмоиды в качестве последнего слоя активации приведет к одобренному ответу, но использование softmax предполагает другой ответ.
Ответ или решение
Объяснение потерь кросс-энтропии
Когда вы строите нейронную сеть для классификации, использование потерь кросс-энтропии в сочетании с активацией Softmax на последнем слое — это стандартный подход для многоклассовой классификации. Данная статья предназначена для детального объяснения концепции потерь кросс-энтропии на примере, который вы привели.
Основы кросс-энтропии
Кросс-энтропия — это мера различия между двумя вероятностными распределениями: истинным распределением (настоящей меткой) и оцененным распределением (предсказанием модели). Она рассчитывается по следующей формуле:
[
H(p,q) = -\sum_{i} p(x_i) \log(q(x_i))
]
где:
- ( p ) — истинное распределение вероятностей (например, вектора одной метки),
- ( q ) — предсказанное распределение вероятностей, полученное выходом модели.
Пример расчета потерь кросс-энтропии
В вашем примере представлен вектор истинной метки:
[
\text{true label} = [1, 0, 0, 0, 0]
]
и предсказанные вероятности:
[
\text{predictions} = [0.1, 0.5, 0.1, 0.1, 0.2]
]
Согласно формуле кросс-энтропии, потери для одного примера можно выразить следующим образом:
[
L = – (\mathbf{y} \cdot \log(\mathbf{\hat{y}}))
]
где ( \mathbf{y} ) — вектор истинной метки, а ( \mathbf{\hat{y}} ) — вектор предсказанных вероятностей. Поскольку только первая метка является истинной (равной 1), остальные элементы вектора можно игнорировать, и расчет сводится к:
[
L = – \log(0.1)
]
[
L \approx 2.303
]
Этот результат говорит о том, что, несмотря на то, что сеть сделала предсказания для всех классов, для расчета потерь учитывается только предсказание для истинного класса.
Важные аспекты кросс-энтропии
-
Игнорирование неправильных классов: Потери кросс-энтропии фокусируются на вероятностях правильного класса. Это означает, что распределение вероятностей всех остальных классов не влияет на окончательный расчет потерь, хотя оно может быть важным для выполнения оптимизации.
-
Влияние градиентов: Хотя для расчета потерь используются только вероятности правильного класса, градиенты, полученные при обратном распространении, будут учитывать значения неправильных классов. Это позволяет корректировать веса сети более детально по сравнению с простым использованием одной метки.
-
Метод применения: Часто кросс-энтропия применяется в качестве функции потерь на этапе обучения, тогда как для оценки хорошей работы модели может использоваться функция стоимости, усредняющая потери по всем примерам в наборе данных:
[
J = – \frac{1}{N}\left(\sum_{i=1}^{N} \mathbf{y}_i \cdot \log(\mathbf{\hat{y}}_i)\right)
]
где ( N ) — общее количество примеров.
Заключение
Потери кросс-энтропии предоставляют эффективный способ количественно оценить, насколько хорошо модель прогнозирует вероятности классов. Это снижает значение энергии функции, способствуя обучению модели, которая в ходе итераций профессионально предсказывает различные классы. Понимание этой концепции является ключевым для достижения успеха в области машинного обучения и глубокого обучения. Надеюсь, данная информация была для вас полезной и поможет в вашем обучении и практике.