Материалы · Практикум · ML / AI

Перекрёстная энтропия в Excel: BCE и CE по шагам

Разбор рабочей тетради: логит → sigmoid или softmax → формула потерь. Что показывает каждый лист и каждая колонка, почему логиты нельзя подавать в формулу напрямую — и тренировка с самопроверкой. Тетрадь можно скачать.

Javharbek Abdulatipov · 35 мин чтения
4 листа2 графика3 задания
$$\begin{gathered}\mathrm{BCE}=-\frac1n\sum_{i=1}^{n}\bigl[y_i\ln\hat y_i+(1-y_i)\ln(1-\hat y_i)\bigr]\\[6pt]\mathrm{CE}=-\sum_{k=1}^{K}y_k\ln\hat y_k\end{gathered}$$

Что в тетради

XLSX
Рабочая тетрадь

4 листа: BCE, Categorical CE, Тренировка, Ответы. Жёлтые ячейки — входы, их можно менять: всё остальное пересчитается само. Открывается в Excel, LibreOffice Calc и Google Таблицах (Файл → Импорт).

Тетрадь учит одной цепочке, которая стоит за выходом любого классификатора: сеть выдаёт логит — любое число от $-\infty$ до $+\infty$, «переводчик» (sigmoid для двух классов, softmax для $K$ классов) превращает его в вероятность, и только вероятность попадает в формулу потерь. Каждый лист проходит эту цепочку слева направо и показывает, что будет, если пропустить средний шаг.

ЛистЧто внутриЧему учит
BCE4 блока: расчёт для 5 объектов; те же логиты без sigmoid; таблица и график двух ветвей штрафа; как sigmoid сжимает логитбинарная перекрёстная энтропия, NaN от логитов, роль sigmoid
Categorical CE3 блока: расчёт для 3 классов; логиты без softmax; таблица и график $-\ln x$категориальная перекрёстная энтропия, отрицательный лосс без дна, роль softmax
Тренировка3 задания: BCE для трёх объектов, CE после softmax, softmax вручнуюпосчитать самому; рядом с ответом — ✓ или ✗ (допуск ±0,005)
Ответыэталонные ответы ко всем заданиям — формуламисверить ход решения

Цвета ячеек везде одни и те же:

  • жёлтые — входы: метки $y$ и логиты $z$, их можно менять
  • голубые — «переводчик» sigmoid или softmax: отдельный шаг, не часть формулы потерь
  • красные — сама формула потерь; чем светлее, тем глубже внутри скобок
  • зелёные и красные зоны в блоках 3 — где логарифмы существуют, а где нет
Как читать этот разбор

Разделы идут в порядке листов и блоков тетради. Все числа на странице посчитаны из тех же входов, что в файле, и совпадают с ним до третьего знака. Под каждым листом — «Тетрадь в браузере»: тот же расчёт, который можно менять прямо здесь. Логарифм всюду натуральный: $\ln$.

Лист BCE: расчёт по шагам

Блок 1 листа — пять объектов бинарной задачи: метка $y=1$ («да») или $y=0$ («нет») и логит $z$, который выдала сеть. Расчёт идёт в три шага, как колонки таблицы: вход → sigmoid → формула BCE.

$$\hat y_i=\sigma(z_i)=\frac{1}{1+e^{-z_i}},\qquad \mathrm{BCE}=-\frac1n\sum_{i=1}^{n}\bigl[y_i\ln\hat y_i+(1-y_i)\ln(1-\hat y_i)\bigr]$$
$y_i$
правильный ответ для объекта $i$: 1 или 0
$z_i$
логит — «сырой» выход сети, любое число
$\hat y_i=\sigma(z_i)$
предсказанная вероятность ответа «да»
$n$
число объектов, здесь $n=5$
$i$$y$логит $z$$\hat y=\sigma(z)$$y\ln\hat y$$(1-y)\ln(1-\hat y)$сумма двух
112,200,900−0,1050,000−0,105
20−1,400,1980,000−0,220−0,220
310,400,599−0,5130,000−0,513
40−0,600,3540,000−0,437−0,437
511,400,802−0,2200,000−0,220
Σ по всем $i$−1,496
$n$5
BCE = −Σ / n0,299
Разбор каждой строки

Шаг 2 (голубая колонка): $\hat y=1/(1+e^{-z})$. Шаг 3 (красные колонки): два слагаемых и их сумма. В каждой строке одно слагаемое обнуляется множителем $y$ или $1-y$.

Строка 1

$$\begin{gathered}\hat y_1 = \frac{1}{1+e^{-2{,}20}} = \frac{1}{1+0{,}1108} = 0{,}900\\y_1\ln\hat y_1 = 1\cdot\ln 0{,}900 = -0{,}105\\(1-y_1)\ln(1-\hat y_1) = 0\cdot\ln 0{,}100 = 0\end{gathered}$$

Строка 2

$$\begin{gathered}\hat y_2 = \frac{1}{1+e^{-(-1{,}40)}} = \frac{1}{1+4{,}0552} = 0{,}198\\y_2\ln\hat y_2 = 0\cdot\ln 0{,}198 = 0\\(1-y_2)\ln(1-\hat y_2) = 1\cdot\ln 0{,}802 = -0{,}220\end{gathered}$$

Строка 3

$$\begin{gathered}\hat y_3 = \frac{1}{1+e^{-0{,}40}} = \frac{1}{1+0{,}6703} = 0{,}599\\y_3\ln\hat y_3 = 1\cdot\ln 0{,}599 = -0{,}513\\(1-y_3)\ln(1-\hat y_3) = 0\cdot\ln 0{,}401 = 0\end{gathered}$$

Строка 4

$$\begin{gathered}\hat y_4 = \frac{1}{1+e^{-(-0{,}60)}} = \frac{1}{1+1{,}8221} = 0{,}354\\y_4\ln\hat y_4 = 0\cdot\ln 0{,}354 = 0\\(1-y_4)\ln(1-\hat y_4) = 1\cdot\ln 0{,}646 = -0{,}437\end{gathered}$$

Строка 5

$$\begin{gathered}\hat y_5 = \frac{1}{1+e^{-1{,}40}} = \frac{1}{1+0{,}2466} = 0{,}802\\y_5\ln\hat y_5 = 1\cdot\ln 0{,}802 = -0{,}220\\(1-y_5)\ln(1-\hat y_5) = 0\cdot\ln 0{,}198 = 0\end{gathered}$$

Сумма по всем строкам $\Sigma = -1{,}496$, объектов $n=5$, поэтому $\mathrm{BCE}=-\Sigma/n = -(-1{,}496)/5 = 0{,}299$. Последняя серая строка листа считает то же другим путём — через СУММПРОИЗВ (SUMPRODUCT) обеих ветвей — и тоже даёт $0{,}299$.

В каждой строке живо одно слагаемое

При $y=1$ остаётся $\ln\hat y$, при $y=0$ — $\ln(1-\hat y)$. То есть штраф строки всегда равен $-\ln$(вероятности, которую модель дала правильному ответу). В блоке 1 эти вероятности равны $0{,}900$, $0{,}802$, $0{,}599$, $0{,}646$ и $0{,}802$. У строк 2 и 5 штраф одинаковый, $-0{,}220$: логиты $-1{,}4$ и $1{,}4$ симметричны, а $\sigma(-z)=1-\sigma(z)$.

Попробуйте (как предлагает лист)

  • Логит строки 1: $2{,}2 \to 6$. Тогда $\hat y_1 = 0{,}998$, штраф строки $0{,}002$ — почти ноль, а BCE падает с $0{,}299$ до $0{,}279$.
  • Логит строки 1: $2{,}2 \to -3$ при $y=1$. Тогда $\hat y_1 = 0{,}047$, штраф строки $3{,}049$ — больше, чем у четырёх остальных строк вместе ($1{,}391$). BCE вырастает до $0{,}888$: одна уверенная ошибка весит больше всего остального.

Логиты без sigmoid

Блок 2 берёт те же метки и логиты и подаёт логиты в формулу BCE напрямую — как будто $z$ уже вероятность. У BCE две ветви, $\ln z$ и $\ln(1-z)$, и в вычислении существовать должны обе, даже та, что потом умножится на ноль.

$i$$y$$z$$\ln z$$\ln(1-z)$$y\ln z+(1-y)\ln(1-z)$
112,20,788нетNaN
20−1,4нет0,875NaN
310,4−0,916−0,511−0,916 (случайно в $(0;1)$)
40−0,6нет0,470NaN
511,40,336нетNaN

Что вышло по строкам:

  • Строка 1, $z=2{,}2$: $\ln 2{,}2 \approx 0{,}788 > 0$ — «штраф» с обратным знаком, а $\ln(1-2{,}2)=\ln(-1{,}2)$ не существует.
  • Строки 2 и 4, $z<0$: не существует $\ln z$; строка 5, $z=1{,}4$: не существует $\ln(1-z)$.
  • Только строка 3 ($z=0{,}4$) «случайно» попала в $(0;1)$ и дала число $\ln 0{,}4\approx-0{,}916$. Но и оно бессмысленно: $0{,}4$ — логит, а не вероятность; настоящая вероятность здесь $\sigma(0{,}4)=0{,}599$.
Почему не спасает нулевой множитель

В строке 1 вторая ветвь умножается на $1-y=0$, и кажется, что её можно не считать. Но компьютер сначала вычисляет логарифм, а потом умножает: в числах с плавающей точкой $\ln(-1{,}2)=\mathrm{NaN}$, $\ln 0 = -\infty$, а $0\cdot\mathrm{NaN}=\mathrm{NaN}$ и $0\cdot(-\infty)=\mathrm{NaN}$. В Excel то же самое выглядит как ошибка #ЧИСЛО! (#NUM!), поэтому лист ловит её через ЕСЛИОШИБКА (IFERROR) и пишет «NaN».

Одной такой строки достаточно: среднее с NaN — NaN, градиенты — NaN, после шага оптимизатора веса сети тоже NaN. Обучение не «плохое», оно мёртвое. Итог блока: BCE без sigmoid — NaN, BCE с sigmoid — 0,299.

Sigmoid решает обе проблемы сразу: $\hat y\in(0;1)$ и $1-\hat y\in(0;1)$, поэтому оба логарифма всегда существуют и оба $\le 0$ — а значит, каждый штраф $\ge 0$.

Тетрадь в браузере

Тот же расчёт, что в листе: меняйте жёлтые ячейки — остальное пересчитается.

Две ветви и две стены

Блок 3 объясняет, почему так: таблица подставляет в обе ветви BCE разные $x$ — и вероятности, и «логитные» значения вне $(0;1)$. Жёлтые $x$ в листе можно менять, а график под таблицей (лист строит его по $\hat y$ от $0{,}02$ до $0{,}98$) показывает обе ветви целиком.

$x$при $y=1$: $-\ln x$при $y=0$: $-\ln(1-x)$зона
−1нет−0,693логит
0нет0,000логит
0,014,6050,010вероятность
0,12,3030,105вероятность
0,50,6930,693вероятность
0,90,1052,303вероятность
0,990,0104,605вероятность
10,000нетлогит
2−0,693нетлогит
10−2,303нетлогит

У BCE две «стены». Ветвь $y=1$ — штраф $-\ln x$ — уходит в бесконечность у нуля: уверенное «нет», когда правильный ответ «да». Ветвь $y=0$ — штраф $-\ln(1-x)$ — уходит в бесконечность у единицы. Между стенами, в точке $x=0{,}5$, обе ветви дают одинаковый штраф $\ln 2 \approx 0{,}693$ — цену полной неуверенности.

Вне $(0;1)$ всё ломается: при $x\le0$ нет $\ln x$, при $x\ge1$ нет $\ln(1-x)$, при $x>1$ ветвь $y=1$ даёт отрицательный штраф (при $x=10$ он равен $-\ln 10\approx-2{,}303$ и дальше падает без дна), а при $x<0$ так же «ломается» ветвь $y=0$: при $x=-1$ её штраф $-\ln 2\approx-0{,}693$. Сеть, которой разрешили отрицательный лосс, будет просто раздувать логит.

Потяните точку: зелёная полоса — вероятности, куда попадает sigmoid; красные — область логитов. Переключатель выбирает, какая ветвь считается штрафом.

Как sigmoid сжимает логит

Блок 4 показывает сам «переводчик». Колонки листа — промежуточные шаги формулы $\hat y = 1/(1+e^{-z})$: сначала $e^{-z}$, потом $\hat y$, потом $1-\hat y$.

$z$$e^{-z}$$\hat y=\dfrac{1}{1+e^{-z}}$$1-\hat y$
−1022026,46580,00001,0000
−320,08550,04740,9526
−12,71830,26890,7311
01,00000,50000,5000
10,36790,73110,2689
30,04980,95260,0474
100,00001,00000,0000

Почему результат всегда в $(0;1)$: $e^{-z}>0$ при любом $z$, значит знаменатель $1+e^{-z}>1$ и $0<\hat y<1$. При $z=0$ ровно $\hat y=0{,}5$ — полная неуверенность; большие положительные $z$ дают уверенное «да», большие отрицательные — уверенное «нет». Таблица симметрична: $\sigma(-z)=1-\sigma(z)$, поэтому строки $z$ и $-z$ меняются колонками $\hat y$ и $1-\hat y$.

Двигайте логит: кривая — $\sigma(z)$, внизу — промежуточные значения, как в колонках листа.
Глубже: «хоть −1000, хоть +1000» — в математике, но не в компьютере

Лист пишет, что при любом логите $\hat y$ остаётся строго между 0 и 1. Математически это так. Но в числах с плавающей точкой при $z \gtrsim 36{,}74$ (float64; в float32 уже при $z \gtrsim 16{,}64$) слагаемое $e^{-z}$ теряется рядом с единицей, $\hat y$ округляется ровно до $1$, а $1-\hat y$ — ровно до $0$. При $y=0$ штраф $-\ln(1-\hat y)$ становится $+\infty$.

С другой стороны, $e^{-z}$ переполняется при $z<-709{,}78$: в самом листе подстановка $z=-1000$ даёт ошибку #ЧИСЛО! (#NUM!) во всей строке, а $z=1000$ — ровно $\hat y=1$ и $1-\hat y=0$.

Поэтому библиотеки не считают sigmoid и логарифм по отдельности. Они сразу считают штраф из логита через устойчивую запись $\max(z,0)-yz+\ln\bigl(1+e^{-|z|}\bigr)$ — так делает nn.BCEWithLogitsLoss. Это ровно то же число, что $-[y\ln\sigma(z)+(1-y)\ln(1-\sigma(z))]$, но без переполнений.

Итог листа BCE

  • BCE — это перекрёстная энтропия для двух классов, записанная через одно число $\hat y$: вероятность «да» равна $\hat y$, вероятность «нет» — $1-\hat y$.
  • Формула знает только про $\hat y\in(0;1)$. Логиты живут на всей прямой: поданные напрямую, они дают NaN или штраф с обратным знаком.
  • Sigmoid сжимает любой логит в $(0;1)$. Softmax для двух классов даёт ровно sigmoid: $\mathrm{softmax}(z_1,z_2)_1=\sigma(z_1-z_2)$ — это одна и та же идея.
  • Деление на $n$ нужно только для того, чтобы лосс не зависел от размера батча; саму форму штрафа задаёт $-\ln$.
  • В коде: nn.BCEWithLogitsLoss ждёт логиты (делает sigmoid сам и численно устойчивее), nn.BCELoss — уже вероятности.
Pythonimport numpy as np

# метки и логиты из листа BCE
y = np.array([1, 0, 1, 0, 1])
z = np.array([2.2, -1.4, 0.4, -0.6, 1.4])

# шаг 2: sigmoid; шаг 3: формула BCE
p = 1 / (1 + np.exp(-z))
bce = -np.mean(y * np.log(p) + (1 - y) * np.log(1 - p))
print(round(bce, 3))       # 0.299

# то же прямо из логитов, устойчиво (так считает nn.BCEWithLogitsLoss)
s = np.maximum(z, 0) - z * y + np.log1p(np.exp(-np.abs(z)))
print(round(s.mean(), 3))  # 0.299

# PyTorch:
# nn.BCEWithLogitsLoss() ждёт логиты
# nn.BCELoss() ждёт вероятности

Лист Categorical CE: расчёт по шагам

Второй лист — та же цепочка для $K=3$ классов. На входе метки в виде «одного горячего» вектора (one-hot: $y_k=1$ только у правильного класса, здесь $k=2$) и три логита. Переводчик — softmax: он превращает логиты в вероятности, которые в сумме дают 1.

$$\hat y_k=\mathrm{softmax}(z)_k=\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}},\qquad \mathrm{CE}=-\sum_{k=1}^{K}y_k\ln\hat y_k$$
$z_k$
логит класса $k$
$\hat y_k=\dfrac{e^{z_k}}{\sum_j e^{z_j}}$
softmax: вероятность класса $k$
$y_k$
1 у правильного класса, 0 у остальных
$K$
число классов, здесь $K=3$
$k$$y$логит $z$$\hat y=\mathrm{softmax}(z)$$\ln\hat y$$y\ln\hat y$
1010,231−1,4640,000
2120,629−0,464−0,464
300,50,140−1,9640,000
$\Sigma\hat y$1,000Σ−0,464
CE = −Σ0,464

Как получаются числа голубой колонки и колонки $\ln\hat y$:

1. Экспоненты логитов и их сумма:

$$\begin{gathered}e^{1}=2{,}718\\e^{2}=7{,}389\\e^{0{,}5}=1{,}649\\\sum_j e^{z_j} = 11{,}756\end{gathered}$$

2. Делим каждую экспоненту на сумму — это softmax. Проверка листа $\Sigma\hat y = 1$ выполняется всегда, при любых логитах:

$$\begin{gathered}\hat y_1=\frac{2{,}718}{11{,}756}=0{,}231\\\hat y_2=\frac{7{,}389}{11{,}756}=0{,}629\\\hat y_3=\frac{1{,}649}{11{,}756}=0{,}140\end{gathered}$$

3. Логарифмы вероятностей. Удобно заметить, что $\ln\hat y_k = z_k - \ln\sum_j e^{z_j}$, а $\ln 11{,}756 = 2{,}464$. Поэтому все три логарифма — это логиты минус одно и то же число:

$$\begin{gathered}\ln\hat y_1=1-2{,}464=-1{,}464\\\ln\hat y_2=2-2{,}464=-0{,}464\\\ln\hat y_3=0{,}5-2{,}464=-1{,}964\end{gathered}$$

4. В колонке $y\ln\hat y$ выживает одно слагаемое — то, где $y=1$. Значит, CE — это $-\ln$ вероятности правильного класса (это и проверяет серая строка листа):

$$\mathrm{CE} = -(0\cdot\ln\hat y_1 + 1\cdot\ln\hat y_2 + 0\cdot\ln\hat y_3) = -\ln 0{,}629 = 0{,}464$$

Отсюда видно, что CE зависит только от того, насколько логит правильного класса выделяется на фоне остальных: $\mathrm{CE}=\ln\sum_j e^{z_j}-z_{\text{правильного}}$.

Попробуйте (как предлагает лист)

  • Логит класса 2: $2 \to 5$. Тогда $\hat y_2=0{,}971$ и $\mathrm{CE}=0{,}029$ — почти ноль.
  • Логит класса 2: $2 \to -2$. Тогда $\hat y_2=0{,}030$ и $\mathrm{CE}=3{,}505$ — большой штраф. Сумма $\hat y$ в обоих случаях остаётся равной 1.

Логиты без softmax

Блок 2 снова подаёт логиты напрямую — теперь в $\mathrm{CE}=-\sum_k y_k\ln z_k$. Здесь все три логита оказались положительными, поэтому логарифмы существуют, но результат хуже ошибки: CE без softmax $= -\ln 2 \approx -0{,}693$ — отрицательный лосс, тогда как с softmax CE $= 0{,}464$.

$k$$y$$z$$\ln z$$y\ln z$
1010,0000,000
2120,6930,693
300,5−0,6930,000
CE без softmax−0,693

Перекрёстная энтропия настоящих распределений вероятностей не бывает отрицательной: $\mathrm{CE}(y,\hat y)=H(y)+\mathrm{KL}(y\,\|\,\hat y)\ge 0$, а для one-hot метки это просто $-\ln$ вероятности, которая не больше 1. Отрицательное число — верный признак того, что в формулу попали не вероятности.

  • Логит правильного класса $\to 100$: без softmax лосс $= -\ln 100 \approx -4{,}605$, при $1000$ — $-6{,}908$, и дальше без дна. Сеть научится только раздувать этот логит. С softmax лосс упирается в 0 снизу.
  • Логит правильного класса $\to -1$: без softmax — ошибка, логарифма отрицательного числа нет. С softmax всё считается, просто лосс большой.

Тетрадь в браузере

Тот же расчёт, что в листе: меняйте жёлтые ячейки — остальное пересчитается.

Почему только $(0;\,1]$

Блок 3 второго листа — та же «карта», что в BCE, но с одной ветвью $-\ln x$: у CE штрафуется только вероятность правильного класса. Зелёная зона — $(0;1]$: от огромного штрафа у нуля до нулевого при $x=1$. Красные зоны — логиты: при $x\le 0$ логарифма нет, при $x>1$ штраф отрицательный и падает без дна.

$x$$-\ln x$зона
−1нетлогит
0нетлогит
0,014,605вероятность
0,12,303вероятность
0,50,693вероятность
0,90,105вероятность
10,000вероятность
2−0,693логит
10−2,303логит
1000−6,908логит
Потяните точку: кривая $-\ln x$ и её зоны. В отличие от BCE стена одна — у нуля.

Итог листа Categorical CE

  • Формула CE знает только про вероятности: числа от 0 до 1 с суммой 1.
  • Логиты — любые числа от $-\infty$ до $+\infty$. Поданные в CE напрямую, они дают либо ошибку, либо отрицательный лосс без дна.
  • Softmax — переводчик: сжимает любые логиты в $(0;1)$ с суммой 1. Поэтому CE и softmax всегда идут парой.
  • В коде смотрите, кто делает softmax: nn.CrossEntropyLoss ждёт логиты (softmax внутри), nn.NLLLoss — уже лог-вероятности (log_softmax).
Pythonimport numpy as np

# логиты из листа Categorical CE; правильный класс k = 2 (индекс 1)
z = np.array([1.0, 2.0, 0.5])
k = 1

lse = np.log(np.sum(np.exp(z)))   # ln Σ e^z
p = np.exp(z - lse)               # шаг 2: softmax
print(np.round(p, 3), round(p.sum(), 3))
# [0.231 0.629 0.14 ] 1.0
print(round(-np.log(p[k]), 3))    # 0.464
print(round(lse - z[k], 3))       # 0.464: CE = ln Σ e^z − z_k

# PyTorch:
# nn.CrossEntropyLoss() ждёт логиты (softmax внутри)
# nn.NLLLoss() ждёт лог-вероятности (log_softmax)
Глубже: почему BCE — это CE для двух классов

Возьмём два класса с логитами $z_1, z_2$. Softmax даёт $\hat y_1=\dfrac{e^{z_1}}{e^{z_1}+e^{z_2}}=\dfrac{1}{1+e^{-(z_1-z_2)}}=\sigma(z_1-z_2)$ и $\hat y_2=1-\hat y_1$.

CE с one-hot меткой $(y,\,1-y)$ равна $-[y\ln\hat y_1+(1-y)\ln(1-\hat y_1)]$ — ровно слагаемое BCE. Значит, бинарный классификатор с одним логитом $z$ — это softmax по паре $(z, 0)$, а BCE — частный случай CE.

Тренировка с самопроверкой

Лист «Тренировка» — три задания на калькулятор: впишите ответ в жёлтую ячейку, и рядом появится ✓ или ✗. Допуск — $\pm 0{,}005$, логарифм натуральный. Ниже — те же задания прямо на странице; числа можно писать через запятую или точку.

Чтобы уложиться в допуск, не округляйте промежуточные значения грубее трёх знаков после запятой. Ответ к слагаемому — отрицательное число (логарифм вероятности), а BCE и CE — положительные: в конце стоит минус.

Ответы и разбор (лист «Ответы»)

Задание 1. Каждое слагаемое — $\ln$ вероятности правильного ответа: при $y=1$ это $\ln\hat y$, при $y=0$ — $\ln(1-\hat y)$.

$$\begin{gathered}i=1:\ 1\cdot\ln 0{,}8 = -0{,}223\\i=2:\ 1\cdot\ln(1-0{,}3) = \ln 0{,}7 = -0{,}357\\i=3:\ \ln 0{,}5 = -0{,}693\end{gathered}$$
$$\mathrm{BCE} = -\frac{(-0{,}223) + (-0{,}357) + (-0{,}693)}{3} = 0{,}424$$

Задание 2. Вероятности уже после softmax; выживает только слагаемое правильного класса $k=3$.

$$\begin{gathered}k=1:\ 0\cdot\ln 0{,}1 = 0\\k=2:\ 0\cdot\ln 0{,}3 = 0\\k=3:\ 1\cdot\ln 0{,}6 = -0{,}511\end{gathered}$$
$$\mathrm{CE} = -(-0{,}511) = 0{,}511$$

Задание 3. Softmax вручную для логитов $z=(0;\,1;\,2)$, правильный класс $k=3$.

$$\begin{gathered}e^0=1{,}000\\e^1=2{,}718\\e^2=7{,}389\\\sum = 11{,}107\end{gathered}$$
$$\hat y = \Bigl(\tfrac{1{,}000}{11{,}107};\ \tfrac{2{,}718}{11{,}107};\ \tfrac{7{,}389}{11{,}107}\Bigr) = (0{,}090;\ 0{,}245;\ 0{,}665)$$
$$\mathrm{CE} = -\ln\hat y_3 = -\ln 0{,}665 = 0{,}408$$

Проверка через логиты: $\mathrm{CE}=\ln\sum_j e^{z_j}-z_3=\ln 11{,}107-2=0{,}408$.

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

  • Логиты в формулу, которая ждёт вероятности. nn.BCELoss или nn.NLLLoss поверх «сырого» выхода сети — это блоки 2 обоих листов: NaN или отрицательный лосс.
  • Двойной переводчик. Sigmoid перед nn.BCEWithLogitsLoss или softmax перед nn.CrossEntropyLoss: функция применит его второй раз. Ошибки не будет, но вероятности окажутся сжаты к середине, лосс почти перестанет меняться, и обучение забуксует.
  • Не тот логарифм. В формулах — натуральный $\ln$. На калькуляторе клавиша log часто означает $\log_{10}$: $\log_{10}0{,}8\approx-0{,}097$ вместо $\ln 0{,}8\approx-0{,}223$.
  • Потерянный минус. Логарифм вероятности отрицателен, поэтому сумма в колонке «сумма двух» отрицательна, а BCE и CE — положительны: $\mathrm{BCE}=-\Sigma/n$.
  • Перепутанная ветвь. При $y=0$ штраф — $-\ln(1-\hat y)$, а не $-\ln\hat y$: штрафуется вероятность ответа «нет».
  • Слишком раннее округление. Если округлить $e^{z}$ или $\hat y$ до одного-двух знаков, ответ выйдет за допуск $\pm0{,}005$.

Итоги

BCE (2 класса)Categorical CE ($K$ классов)
выход сетиодин логит $z$$K$ логитов $z_1,\dots,z_K$
переводчик$\sigma(z)=1/(1+e^{-z})$$\mathrm{softmax}(z)_k=e^{z_k}/\sum_j e^{z_j}$
штраф объекта$-[y\ln\hat y+(1-y)\ln(1-\hat y)]$$-\sum_k y_k\ln\hat y_k=-\ln\hat y_{\text{прав}}$
пример тетради$\mathrm{BCE}=0{,}299$ (5 объектов)$\mathrm{CE}=0{,}464$ (1 объект)
без переводчикаNaN$-\ln 2\approx-0{,}693$ и ниже
PyTorchBCEWithLogitsLoss (логиты)CrossEntropyLoss (логиты)
  • Логит → переводчик → формула: формула потерь понимает только вероятности.
  • Штраф объекта — всегда $-\ln$ вероятности правильного ответа: $0$ при уверенном верном ответе, $\ln 2\approx0{,}693$ при полной неуверенности, $+\infty$ при уверенной ошибке.
  • Подробнее о самих функциях — в шпаргалке: BCE, перекрёстная энтропия, sigmoid, softmax.

Проверь себя

1. Модель дала $\hat y=0{,}9$, а правильный ответ $y=0$. Чему равно слагаемое строки (колонка «сумма двух»)?
2. Почему в BCE нельзя подать логит $z=2{,}2$ напрямую?
3. Логиты $(1;\,2;\,0{,}5)$, правильный класс — второй. Чему равна CE?
4. CE без softmax вышла равной $-0{,}693$. О чём это говорит?
5. Что ждёт на вход nn.CrossEntropyLoss?
6. Чему равна разность $\ln\hat y_2-\ln\hat y_1$ для логитов $(1;\,2;\,0{,}5)$?

← Материалы