Шпаргалка формул нейросетей · Функции активации

Softmax: от логитов к вероятностям

Функция, которая превращает сырые баллы нейросети в распределение вероятностей на K классах. Разбираем её по косточкам: зачем экспонента, почему важны только разности логитов, что делает температура, как устроена матрица Якоби diag(s) − ssᵀ, почему softmax — это градиент гладкого максимума и как не получить NaN в коде.

Javharbek Abdulatipov · 35 мин чтения
$$\operatorname{softmax}(z)_i=s_i=\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}$$

Зачем он нужен

Классификатор на $K$ классов в конце выдаёт $K$ чисел — логитов (logits): например, $(2;\,1;\,0)$ для «кошка», «собака», «птица». Это просто баллы: они бывают отрицательными, не складываются в 1, и по ним не видно, насколько модель уверена. Softmax превращает такой вектор в распределение вероятностей: все числа положительны, в сумме дают 1, а порядок сохраняется — у кого балл больше, у того и вероятность больше.

Где он встречается:

  • выход многоклассового классификатора — от логистической регрессии до ResNet и ViT: $\hat y=\operatorname{softmax}(Wx+b)$;
  • языковые модели — на каждом шаге LLM выдаёт логиты для всех токенов словаря (десятки и сотни тысяч), softmax делает из них распределение следующего токена, а температура регулирует «смелость» генерации;
  • механизм внимания (attention) в трансформерах — веса $\operatorname{softmax}(QK^\top/\sqrt d)$ решают, на какие токены смотреть;
  • смесь экспертов (MoE) — маршрутизатор распределяет токен между экспертами через softmax;
  • обучение с подкреплением — больцмановская политика выбирает действие $a$ с вероятностью, пропорциональной $e^{Q(a)/T}$;
  • статистическая физика — это распределение Больцмана — Гиббса $p_i\propto e^{-E_i/(kT)}$; отсюда и слово «температура».
Главное за минуту

$s_i=e^{z_i}/\sum_j e^{z_j}$: экспонента делает все числа положительными и превращает разности в отношения, деление на сумму нормирует. Softmax не меняется, если прибавить одну константу ко всем логитам (поэтому в коде вычитают максимум), его производная — матрица $\operatorname{diag}(s)-ss^\top$, а для двух классов он совпадает с сигмоидой разности логитов.

Интуиция: голосование с усилением

Представьте, что классы — кандидаты, а логиты — их баллы. Чтобы получить доли «голосов», баллы нужно сделать положительными и нормировать. Просто разделить на сумму нельзя: баллы бывают отрицательными, а сумма — нулевой. Экспонента решает обе проблемы: $e^{z}$ всегда положительна, а разница баллов превращается в отношение: каждая единица преимущества делает долю кандидата в $e\approx2{,}718$ раза больше доли соперника.

Потяните верхушки столбиков-логитов слева и посмотрите, как меняются вероятности справа. Потом нажмите «+1 ко всем логитам»: столбики слева поднимутся, а справа ничего не изменится.

Рисунок 1. Логиты и вероятности. Для логитов $(2;\,1;\,0)$ получаем $(0{,}665;\,0{,}245;\,0{,}090)$, сумма экспонент $11{,}11$. Кнопки ±1 сдвигают все логиты — вероятности стоят на месте. Ползунок температуры: при $T=0{,}1$ первому классу достаётся больше $0{,}9999$, при $T=10$ распределение почти равномерное, $(0{,}367;\,0{,}332;\,0{,}301)$. Пунктир — уровень $1/K$.
Что заметить

Логиты $(2;\,1;\,0)$ отличаются на единицу, а вероятности — в $e$ раз: $0{,}665/0{,}245\approx0{,}245/0{,}090\approx2{,}718$. Softmax смотрит только на разности логитов. Температура $T$ делит логиты: при $T<1$ разности растут и распределение заостряется, при $T>1$ — сглаживается.

Формула по косточкам

$$s_i=\operatorname{softmax}(z)_i=\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}},\qquad i=1,\dots,K$$
$z=(z_1,\dots,z_K)$
вектор логитов — сырые выходы последнего слоя, любые действительные числа;
$e^{z_i}$
экспонента: делает число положительным и превращает разности логитов в отношения;
$\sum_{j}e^{z_j}$
нормирующая сумма (в физике — статистическая сумма, partition function $Z$);
$s_i$
вероятность $i$-го класса: $s_i\in(0;\,1)$ и $\sum_i s_i=1$.

Пройдём сквозной пример шпаргалки — логиты $z=(2;\,1;\,0)$:

$$\begin{gathered}e^{2}\approx7{,}389,\quad e^{1}\approx2{,}718,\quad e^{0}=1,\quad\textstyle\sum\approx11{,}107\\ \Longrightarrow\;s\approx\Bigl(\frac{7{,}389}{11{,}107};\,\frac{2{,}718}{11{,}107};\,\frac{1}{11{,}107}\Bigr)=(0{,}665;\,0{,}245;\,0{,}090)\end{gathered}$$

Температура

Часто логиты перед softmax делят на число $T>0$ — температуру:

$$s_i(T)=\frac{e^{z_i/T}}{\sum_j e^{z_j/T}}$$

Таблица показывает, что температура делает с тем же вектором $(2;\,1;\,0)$:

$i$$z_i$$e^{z_i}$$s_i,\ T=1$$s_i,\ T=0{,}5$$s_i,\ T=2$
127,3890,6650,8670,506
212,7180,2450,1170,307
301,0000,0900,0160,186
Σ11,107111

Два предела объясняют название. При $T\to0$ выигрывает только наибольший логит: softmax стремится к one-hot вектору $\operatorname{argmax}$ (если максимум единственный). При $T\to\infty$ разности исчезают, и распределение становится равномерным, $s_i\to1/K$. Softmax — «мягкий» (soft) argmax: промежуточное состояние между жёстким выбором и полным безразличием.

О названии

Строго говоря, softmax гладко приближает не функцию max, а one-hot вектор argmax. Гладкий максимум — это log-sum-exp, и softmax — его градиент (см. раздел о LSE).

Свойства

  • Распределение: $s_i>0$ и $\sum_i s_i=1$ при любых логитах. Ровно 0 или 1 не получается никогда — только в пределе (а на компьютере — из-за округления).
  • Сохраняет порядок: $z_i>z_j\iff s_i>s_j$, поэтому $\operatorname{argmax}s=\operatorname{argmax}z$. Чтобы просто предсказать класс, softmax можно не считать.
  • Отношения: $s_i/s_j=e^{z_i-z_j}$ — разность логитов равна логарифму отношения вероятностей. Обратно, $z_i=\ln s_i+C$: логиты восстанавливаются по вероятностям с точностью до общей константы.
  • Инвариантность к сдвигу: $\operatorname{softmax}(z+c\mathbf 1)=\operatorname{softmax}(z)$ для любого числа $c$. Из $K$ логитов значимы только $K-1$ разностей.
  • Нет инвариантности к масштабу: $\operatorname{softmax}(az)$ при $a>1$ острее, при $0<a<1$ — площе. Это та же температура, $a=1/T$.
  • Конкуренция: рост одного логита увеличивает его вероятность и уменьшает все остальные — масса перераспределяется, а не создаётся.
Почему сдвиг ничего не меняет
$$\frac{e^{z_i+c}}{\sum_j e^{z_j+c}}=\frac{e^{c}\,e^{z_i}}{e^{c}\sum_j e^{z_j}}=\frac{e^{z_i}}{\sum_j e^{z_j}}$$

Множитель $e^c$ сокращается. Именно это позволяет в коде вычесть $\max_j z_j$ из всех логитов: результат тот же, а экспонента больше не переполняется.

Два класса — это сигмоида

$$\operatorname{softmax}(z_1,z_2)_1=\frac{e^{z_1}}{e^{z_1}+e^{z_2}}=\frac{1}{1+e^{-(z_1-z_2)}}=\sigma(z_1-z_2)$$

Для двух классов softmax — это сигмоида разности логитов, поэтому бинарному классификатору хватает одного выхода. Похожая формула верна и для $K$ классов, если смотреть на один класс против всех остальных:

$$s_i=\sigma\Bigl(z_i-\ln\sum_{j\ne i}e^{z_j}\Bigr)$$

Каждая вероятность — сигмоида от отрыва своего логита от «гладкого максимума» остальных. Чтобы проверить, разделите числитель и знаменатель $s_i$ на $e^{z_i}$.

Рисунок 2. $s_1$ как функция $z_1$ при фиксированных $z_2=1$, $z_3=0$. Синяя кривая — сигмоида, сдвинутая в точку $m=\ln(e^{1}+e^{0})\approx1{,}313$: при $z_1=2$ получаем $\sigma(0{,}687)\approx0{,}665$. Оранжевая и бирюзовая кривые — $s_2$ и $s_3$: они убывают, отдавая массу первому классу. Снимите галочку «Есть третий класс» — останется обычная сигмоида $\sigma(z_1-z_2)$.

Геометрия: симплекс вероятностей

Все распределения на $K$ классах образуют вероятностный симплекс:

$$\Delta^{K-1}=\Bigl\{s\in\mathbb R^{K}:\ s_i\ge0,\ \textstyle\sum_i s_i=1\Bigr\}$$

Для $K=3$ это равносторонний треугольник. Вершины — уверенные ответы $(1;\,0;\,0)$, $(0;\,1;\,0)$, $(0;\,0;\,1)$, центр — равномерное распределение $(\tfrac13;\,\tfrac13;\,\tfrac13)$, а точка внутри — «смесь» вершин с весами $s_i$ (барицентрические координаты).

Softmax отображает всё пространство логитов $\mathbb R^K$ на внутренность симплекса: границы и вершины недостижимы. Все точки прямой $z+c\mathbf 1$ переходят в одну точку, поэтому по сути softmax — взаимно однозначное соответствие между $(K-1)$-мерным пространством разностей логитов и внутренностью симплекса. Обратное отображение — логарифм: $z=\ln s$ с точностью до сдвига.

Рисунок 3. Распределение на трёх классах — точка треугольника; заливка показывает, какой класс побеждает и насколько уверенно. Перетащите чёрную точку: справа те же вероятности столбиками, под рисунком — логиты, которые дают эту точку. Чёрный пунктир — путь при изменении температуры: от вершины-победителя ($T\to0$) к центру ($T\to\infty$). Синяя линия — путь, если менять только $z_1$: от противоположной стороны к вершине 1. При $z=(2;\,1;\,0)$ центрированные логиты равны $(1;\,0;\,-1)$, энтропия $0{,}832$.
Энтропия — удалённость от вершин

Энтропия $H(s)=-\sum_i s_i\ln s_i$ измеряет неуверенность: она стремится к 0 у вершин и максимальна в центре, где равна $\ln K$. Для $(0{,}665;\,0{,}245;\,0{,}090)$ получаем $0{,}832$ при максимуме $\ln3\approx1{,}099$.

Производная: матрица Якоби

У softmax $K$ входов и $K$ выходов, поэтому его производная — не число, а матрица $K\times K$: элемент $J_{ij}=\partial s_i/\partial z_j$ показывает, как $i$-я вероятность откликается на $j$-й логит.

Вывод по правилу частного

Обозначим $S=\sum_k e^{z_k}$; тогда $\partial S/\partial z_j=e^{z_j}$. Для $i=j$:

$$\frac{\partial s_i}{\partial z_i}=\frac{e^{z_i}S-e^{z_i}e^{z_i}}{S^{2}}=s_i-s_i^{2}=s_i(1-s_i)$$

Для $i\ne j$ числитель $e^{z_i}$ от $z_j$ не зависит:

$$\frac{\partial s_i}{\partial z_j}=\frac{0\cdot S-e^{z_i}e^{z_j}}{S^{2}}=-s_is_j$$
Вывод через логарифм (короче)

$\ln s_i=z_i-\ln S$. Производная логарифма суммы экспонент — снова softmax: $\partial\ln S/\partial z_j=e^{z_j}/S=s_j$. Значит,

$$\frac{\partial\ln s_i}{\partial z_j}=\delta_{ij}-s_j\quad\Longrightarrow\quad\frac{\partial s_i}{\partial z_j}=s_i(\delta_{ij}-s_j)$$

Здесь $\delta_{ij}$ — символ Кронекера: 1 при $i=j$ и 0 иначе.

$$J=\frac{\partial s}{\partial z}=\operatorname{diag}(s)-s\,s^{\top},\qquad J_{ij}=\begin{cases}s_i(1-s_i),&i=j\\-s_is_j,&i\ne j\end{cases}$$

Свойства этой матрицы:

  • диагональ $s_i(1-s_i)$ — ровно производная сигмоиды: не больше $\tfrac14$, максимум при $s_i=\tfrac12$;
  • вне диагонали все элементы отрицательны: подняв один логит, мы отнимаем вероятность у остальных;
  • симметрична, и каждая строка (и столбец) в сумме даёт 0: $J\mathbf 1=s-s\,(s^\top\mathbf 1)=0$. Это производная равенства $\sum_i s_i=1$, а вектор $\mathbf 1$ — направление сдвига, который ничего не меняет. Поэтому $J$ вырождена;
  • неотрицательно определена: $v^\top Jv=\sum_i s_iv_i^2-\bigl(\sum_i s_iv_i\bigr)^2$ — дисперсия величины $v$ при распределении $s$, а дисперсия не бывает отрицательной;
  • затухает при уверенности: когда $s$ близок к вершине симплекса, все элементы $J$ близки к нулю — насыщение, как у сигмоиды.
Рисунок 4. Слева — матрица Якоби при $z=(2;\,1;\,0)$: диагональ $(0{,}223;\,0{,}185;\,0{,}082)$ положительна (красный), вне диагонали — отрицательные $-0{,}163$, $-0{,}060$, $-0{,}022$ (синий); каждый столбец в сумме даёт 0, след $1-\sum s_i^2\approx0{,}4895$. Справа — элементы выбранного столбца как функции $z_j$: диагональный — колокол $s_j(1-s_j)$ с вершиной $0{,}25$ там, где $s_j=0{,}5$; остальные — отрицательные «ямы».

Обратный проход без матрицы

В backprop нужна не сама $J$, а произведение $J^\top g$, где $g=\partial L/\partial s$ пришёл сверху. Благодаря структуре $\operatorname{diag}(s)-ss^\top$ это стоит $O(K)$ операций вместо $O(K^2)$:

$$\frac{\partial L}{\partial z}=J^{\top}g=s\odot\bigl(g-\langle g,s\rangle\,\mathbf 1\bigr)$$

Для словаря LLM с $K\approx10^5$ токенов это разница между $10^5$ и $10^{10}$ чисел на каждую позицию. А в паре с кросс-энтропией всё ещё проще: $\partial L/\partial z=s-y$ (вывод — на странице кросс-энтропии).

3D-картина: softmax над плоскостью логитов

Зафиксируем $z_3=0$ — это не теряет общности, ведь сдвигом любой логит можно сделать нулём, — и нарисуем $s_1$ как функцию двух переменных $z_1$ и $z_2$. Получается «рампа»: поверхность близка к 1 там, где $z_1$ больше и $z_2$, и нуля, и близка к 0 там, где первый класс проигрывает. Поперёк границы она поднимается по сигмоиде — это формула «один против всех» в действии.

Рисунок 5. Слева — $s_k(z_1,z_2,0)$ в 3D (поверхность можно вращать), чёрная точка — $z=(2;\,1;\,0)$ с $s_1\approx0{,}665$. Справа — плоскость логитов: заливка показывает класс-победитель и уверенность, линии — уровни $0{,}1$, $0{,}5$, $0{,}9$ выбранной функции (для производной — $0{,}05$, $0{,}15$, $0{,}24$). Точку можно перетаскивать. Переключитесь на $\partial s_1/\partial z_1$: это гребень высотой $0{,}25$ вдоль линии $s_1=0{,}5$.

Вид сверху делит плоскость логитов на три области. Границы — множества равных логитов: луч $z_1=z_2\ge0$ разделяет классы 1 и 2, луч $z_1=0$, $z_2\le0$ — классы 1 и 3, луч $z_2=0$, $z_1\le0$ — классы 2 и 3. Все три луча выходят из начала координат, где $s=(\tfrac13;\,\tfrac13;\,\tfrac13)$.

Где течёт градиент

Поверхность $\partial s_1/\partial z_1=s_1(1-s_1)$ почти плоская и почти нулевая в глубине «своей» и «чужой» областей. Градиент через softmax течёт только там, где модель сомневается, — вблизи границ.

Log-sum-exp: гладкий максимум

У softmax есть «первообразная» — функция log-sum-exp:

$$\operatorname{LSE}(z)=\ln\sum_{j=1}^{K}e^{z_j},\qquad\frac{\partial\operatorname{LSE}}{\partial z_i}=\frac{e^{z_i}}{\sum_j e^{z_j}}=s_i,\qquad\nabla\operatorname{LSE}(z)=\operatorname{softmax}(z)$$

LSE — гладкий максимум: наибольшая экспонента доминирует в сумме, и логарифм возвращает почти её показатель. Точнее,

$$\max_j z_j\;\le\;\operatorname{LSE}(z)\;\le\;\max_j z_j+\ln K$$

Левое неравенство верно, потому что сумма не меньше своего наибольшего слагаемого, правое — потому что каждое из $K$ слагаемых не больше наибольшего. Для $(2;\,1;\,0)$: $\operatorname{LSE}=\ln11{,}107\approx2{,}408$ — между $2$ и $2+\ln3\approx3{,}099$. С температурой $\operatorname{LSE}_T(z)=T\ln\sum_j e^{z_j/T}$ зазор сжимается до $T\ln K$: при $T\to0$ LSE становится обычным максимумом, а его градиент $\operatorname{softmax}(z/T)$ — one-hot вектором argmax.

Рисунок 6. Сверху — $\operatorname{LSE}_T(x,0)=T\ln(e^{x/T}+1)$ и $\max(x,0)$; зазор не больше $T\ln2$ и максимален при $x=0$. При $T=1$, $x=1$: $\operatorname{LSE}\approx1{,}3133$, зазор $0{,}3133$. Снизу — производная по $x$: это $\sigma(x/T)$, первая компонента $\operatorname{softmax}(x/T,\,0)$, гладкая ступенька. Уменьшайте $T$ — LSE прижимается к ломаной, а softmax — к ступеньке.
Выпуклость LSE и кросс-энтропии

Гессиан LSE — это производная softmax, то есть та же матрица Якоби: $\nabla^2\operatorname{LSE}=\operatorname{diag}(s)-ss^\top$. Она неотрицательно определена, значит LSE — выпуклая функция. Отсюда выпуклость кросс-энтропии по логитам: $-\ln s_y=\operatorname{LSE}(z)-z_y$ — выпуклая функция минус линейная.

Три формулы, которые стоит связать

$\operatorname{softmax}=\nabla\operatorname{LSE}$; $\ln s_i=z_i-\operatorname{LSE}(z)$ (log-softmax); $\mathrm{CE}=\operatorname{LSE}(z)-z_y$. Для примера шпаргалки: $2{,}408-2=0{,}408$. А при $K=2$ и $z=(x;\,0)$ LSE превращается в softplus $\ln(1+e^{x})$ — гладкую версию ReLU.

Softmax в обучении

Простейшая модель с softmax — многоклассовая логистическая (softmax-) регрессия: $K$ линейных функций дают логиты, softmax — вероятности, потеря — кросс-энтропия:

$$s=\operatorname{softmax}(Wx+b),\qquad L=-\ln s_y,\qquad\frac{\partial L}{\partial W}=(s-y)\,x^{\top},\qquad\frac{\partial L}{\partial b}=s-y$$

Здесь $y$ — one-hot вектор правильного класса. Вся матрица Якоби в паре с логарифмом сократилась до разности «предсказание − правда».

Рисунок 7. Три класса по 30 точек. Модель начинает с $W=0$, $b=0$: все вероятности равны $\tfrac13$, $\mathrm{CE}=\ln3\approx1{,}099$, точность $33{,}3\%$. Нажмите «Пуск»: градиентный спуск с шагом $0{,}15$ по всей выборке. Уже после первого шага точность $94{,}4\%$, после 200 шагов $\mathrm{CE}\approx0{,}181$ и точность $95{,}6\%$. Яркость заливки — уверенность модели; наведите курсор, чтобы увидеть вероятности в любой точке.
Границы — прямые

Граница между классами $i$ и $j$ — множество, где $z_i=z_j$, то есть $(w_i-w_j)^\top x+b_i-b_j=0$: прямая (в общем случае гиперплоскость). Softmax не делает модель нелинейной — он только переводит баллы в вероятности. Кривые границы появляются, когда логиты считает нейросеть.

Softmax внутри трансформера: внимание

$$\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\Bigl(\frac{QK^{\top}}{\sqrt{d}}\Bigr)V$$

Каждая строка $\operatorname{softmax}(\cdot)$ — распределение внимания одного токена по токенам последовательности (включая его самого), сумма весов 1. Деление на $\sqrt d$ — это температура: скалярное произведение $d$-мерных векторов с независимыми компонентами нулевого среднего и единичной дисперсии имеет дисперсию $d$. Без масштабирования логиты внимания велики, softmax насыщается до почти one-hot, а матрица Якоби — и с ней градиенты — почти обнуляется.

Температура при генерации текста

Языковая модель выбирает следующий токен из $\operatorname{softmax}(z/T)$. При $T\to0$ (жадный выбор) берётся самый вероятный токен, при $T<1$ текст предсказуемее, при $T>1$ — разнообразнее и рискованнее. Температура $T>1$ работает и при дистилляции знаний (Хинтон и др., 2015): «мягкие» вероятности учителя несут больше информации, чем one-hot метки.

Откуда название

Формула пришла из статистической физики: распределение Больцмана — Гиббса $p_i\propto e^{-E_i/(kT)}$ задаёт вероятность состояния с энергией $E_i$ при температуре $T$; логит играет роль энергии со знаком минус. Слово «softmax» предложил Джон Брайдл в 1990 году, описывая вероятностную интерпретацию выходов сети. В эконометрике та же модель называется мультиномиальным логитом.

В коде: устойчивость, log-softmax и PyTorch

Наивная формула ломается на больших логитах: $e^{1000}\approx2\cdot10^{434}$ не помещается ни во float32, ни во float64 и превращается в бесконечность, а дальше получается $\infty/\infty=\text{NaN}$. Во float32 (и в bfloat16 с тем же диапазоном порядков) предел ближе: $e^{x}$ переполняется уже при $x>88{,}72$ (наибольшее число float32 $\approx3{,}4\cdot10^{38}$). На очень отрицательных логитах беда обратная: экспоненты обнуляются, и выходит $0/0$.

Рисунок 8. Логиты $(2+c;\,1+c;\,c)$ при $c$ от $-800$ до $800$; правильный ответ всегда $(0{,}665;\,0{,}245;\,0{,}090)$. Наивная формула во float32 верна только при $-99\le c\le86$: при $c=87$ число $e^{89}$ не помещается во float32 и получается NaN; при $c\le-106$ все экспоненты равны нулю, $0/0$; а между ними денормализованные числа теряют точность — при $c=-105$ выходит уверенный, но ложный ответ $(1;\,0;\,0)$. Во float64 запас больше ($-741\le c\le707$), но предел тоже есть. С вычитанием максимума ответ верен везде.

Лекарство — инвариантность к сдвигу: вычтем $m=\max_j z_j$. Наибольший показатель станет равен 0, $e^0=1$, знаменатель окажется между 1 и $K$ — ни переполнения, ни деления на ноль:

$$s_i=\frac{e^{z_i-m}}{\sum_j e^{z_j-m}},\qquad\ln s_i=(z_i-m)-\ln\sum_j e^{z_j-m}$$
pythonimport numpy as np
np.set_printoptions(precision=3)

def softmax(z, axis=-1, T=1.0):
    """Устойчивый softmax: вычитаем максимум, результат не меняется."""
    z = np.asarray(z, dtype=float) / T
    z = z - z.max(axis=axis, keepdims=True)
    e = np.exp(z)
    return e / e.sum(axis=axis, keepdims=True)

def log_softmax(z, axis=-1):
    # log s_i = z_i − logsumexp(z): без log(0) даже для крошечных вероятностей
    z = np.asarray(z, dtype=float)
    m = z.max(axis=axis, keepdims=True)
    return z - m - np.log(np.exp(z - m).sum(axis=axis, keepdims=True))

def softmax_backward(s, g):
    # J^T g = s * (g − <g, s>): O(K) вместо матрицы K×K
    return s * (g - (g * s).sum(axis=-1, keepdims=True))

z = np.array([2.0, 1.0, 0.0])
print(softmax(z))            # [0.665 0.245 0.09 ]
print(softmax(z + 1000))     # [0.665 0.245 0.09 ] — сдвиг не важен
print(softmax(z, T=0.5))     # [0.867 0.117 0.016] — острее
print(log_softmax([0.0, -800.0]))  # [   0. -800.], а np.log(softmax(...)) даст -inf
pythonimport torch
import torch.nn.functional as F

z = torch.tensor([2.0, 1.0, 0.0], requires_grad=True)
s = F.softmax(z, dim=-1)          # tensor([0.6652, 0.2447, 0.0900])
s[0].backward()                   # первая строка матрицы Якоби
print(z.grad)                     # tensor([ 0.2227, -0.1628, -0.0599])

# Для обучения softmax отдельно не нужен:
logits = torch.randn(4, 3)        # батч: 4 примера, 3 класса
target = torch.tensor([0, 2, 1, 0])
loss = F.cross_entropy(logits, target)   # внутри — log_softmax + NLL
log_p = F.log_softmax(logits, dim=-1)    # если нужны логарифмы вероятностей
Правило

Если дальше идёт логарифм, не считайте $\ln(\operatorname{softmax}(z))$ в два шага: маленькая вероятность округлится до 0, и получится $-\infty$. Используйте log_softmax или сразу потерю на логитах: F.cross_entropy / nn.CrossEntropyLoss в PyTorch, from_logits=True в Keras.

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

  1. Softmax перед nn.CrossEntropyLoss. Эта потеря ждёт логиты и сама применяет log-softmax. Двойной softmax зажимает вероятности: для трёх классов второй softmax не даёт больше $e/(e+2)\approx0{,}576$, потеря не опускается ниже $0{,}551$, градиенты искажены.
  2. Не та ось. Для батча формы $(N,K)$ нормировать нужно по классам (dim=-1), а не по примерам (dim=0). Исключения не будет — модель просто учит бессмыслицу.
  3. Наивная экспонента без вычитания максимума — NaN на больших логитах, особенно в смешанной точности: во float16 $e^{x}$ переполняется уже при $x>11{,}09$.
  4. Softmax для multi-label. Если у объекта может быть несколько меток сразу (кот и собака на фото), классы не конкурируют — нужна сигмоида на каждом выходе и BCE.
  5. Вероятность softmax как гарантия. $s_{\max}=0{,}99$ не значит «прав в 99% случаев»: глубокие сети часто переуверены. Калибровка — отдельная задача; простейший способ — temperature scaling, подбор одного $T$ на валидации.
  6. Сравнение логитов разных примеров. Логиты определены с точностью до сдвига, поэтому «логит 5 у одного примера больше, чем 3 у другого» ничего не значит. Сравнивайте вероятности или разности логитов внутри одного примера.
  • Сигмоида: $\operatorname{softmax}(z_1,z_2)_1=\sigma(z_1-z_2)$, а диагональ якобиана $s_i(1-s_i)$ — производная сигмоиды.
  • Кросс-энтропия: естественная пара softmax; вместе дают градиент $s-y$, а $\mathrm{CE}=\operatorname{LSE}(z)-z_y$.
  • BCE: частный случай кросс-энтропии для двух классов, где softmax сводится к сигмоиде.
  • Focal Loss: домножает $-\ln p_t$ на $(1-p_t)^\gamma$, где $p_t$ — softmax-вероятность правильного класса.
  • ReLU: softplus $\ln(1+e^{x})=\operatorname{LSE}(x,0)$ — гладкий вариант $\max(x,0)$.

Итоги

1) $s_i=e^{z_i}/\sum_je^{z_j}$ превращает любые логиты в распределение на $K$ классах и сохраняет порядок. 2) Важны только разности логитов: $s_i/s_j=e^{z_i-z_j}$, сдвиг ничего не меняет — отсюда устойчивая формула с вычитанием максимума. 3) Температура управляет остротой: $T\to0$ — argmax, $T\to\infty$ — равномерное распределение. 4) Якобиан $\operatorname{diag}(s)-ss^\top$ симметричен, вырожден и затухает при уверенности; обратный проход стоит $O(K)$. 5) Softmax — градиент гладкого максимума LSE, а в паре с кросс-энтропией даёт градиент $s-y$.

Проверь себя

1. Логиты $(2;\,1;\,0)$ дают $s\approx(0{,}665;\,0{,}245;\,0{,}090)$. Что даст $(102;\,101;\,100)$?
2. Что происходит с $\operatorname{softmax}(z/T)$ при $T\to0$?
3. Чему равен $\operatorname{softmax}(z_1,z_2)_1$?
4. Чему равна сумма элементов любого столбца матрицы Якоби softmax?
5. Зачем в устойчивом softmax вычитают $\max_j z_j$?