Softmax
Softmax преобразует вектор логитов в вероятности, сумма которых равна единице. Рассматриваются формула, температура, численная стабильность, внимание и код.
Softmax — это функция, которая преобразует вектор исходных оценок, называемых логитами, в распределение вероятностей: каждое выходное значение находится между 0 и 1, а их сумма равна ровно 1. Для вектора z она вычисляет softmax(z)ᵢ = e^(zᵢ) / Σⱼ e^(zⱼ): возводит каждую оценку в экспоненту и делит её на сумму всех экспонент. Softmax служит стандартным выходным слоем нейронных сетей, выбирающих один класс из нескольких; она преобразует оценки сходства в веса внутри механизма внимания трансформеров и переводит оценки языковой модели по её словарю в вероятности следующих токенов. Название отражает, что эта функция представляет собой гладкую дифференцируемую версию argmax, которая присваивала бы всю вероятность одной максимальной оценке.
Как работает Softmax#
Экспонента делает каждый выход положительным и усиливает различия между оценками, поэтому наибольший логит получает непропорционально большую долю вероятности. Softmax сохраняет порядок логитов, поэтому наибольшая оценка всегда соответствует наибольшей вероятности. Важны только различия между логитами: добавление одной и той же константы ко всем логитам не меняет результат. Библиотеки используют это свойство для численной стабильности: перед возведением в экспоненту они вычитают максимальный логит, поскольку e¹⁰⁰⁰ приводит к переполнению 32-битного числа с плавающей запятой.
Температура T определяет, насколько выражен пик распределения: softmax(z / T). Значения T меньше 1 делают распределение более выраженным в пользу ведущего класса, а значения больше 1 приближают его к равномерному. Та же формула используется в статистической механике для распределения Больцмана, где T — буквально температура. Пример кода ниже показывает оба эффекта в PyTorch:
import torch
logits = torch.tensor([2.0, 1.0, 0.1])
# Divide logits by a temperature before softmax: low sharpens, high flattens
for temperature in [0.5, 1.0, 2.0]:
probs = torch.softmax(logits / temperature, dim=0)
print(f"T={temperature}: {[round(p, 3) for p in probs.tolist()]}")
# Adding a constant leaves softmax unchanged, so libraries subtract the max to avoid overflow
big = logits + 1000
naive = big.exp() / big.exp().sum()
print(f"Naive: {naive.tolist()}, torch.softmax: {[round(p, 3) for p in torch.softmax(big, dim=0).tolist()]}")При T = 1 логиты 2.0, 1.0 и 0.1 преобразуются в [0.659, 0.242, 0.099]. Уменьшение температуры вдвое делает распределение более выраженным: [0.864, 0.117, 0.019], а её удвоение сглаживает распределение: [0.502, 0.304, 0.194]. Если добавить 1 000 к каждому логиту, наивная формула переполнится и выведет [nan, nan, nan], тогда как torch.softmax по-прежнему вернёт [0.659, 0.242, 0.099].
Softmax при обучении#
Классификаторы обучают, одновременно используя softmax и функцию потерь кросс-энтропии. Функция потерь равна −log(pᵧ), то есть отрицательному логарифму вероятности, присвоенной правильному классу y; её градиент по логитам равен просто p − y — разности между предсказанными вероятностями и меткой в формате one-hot. Поэтому фреймворки объединяют эти операции: CrossEntropyLoss в PyTorch принимает исходные логиты и внутри вычисляет log-softmax, что устойчивее, чем брать логарифм отдельно вычисленных вероятностей. Обученная таким образом модель выдаёт логиты, а softmax применяется только тогда, когда вероятности нужны на этапе инференса.
Где используется Softmax#
- Классификация изображений: Последний слой классификатора выдаёт по одному логиту на каждый класс, а softmax преобразует их в оценки уверенности, которые видит пользователь.
- Механизм внимания: Трансформеры вычисляют softmax(QKᵀ / √dₖ) для оценок сходства между запросом и каждым ключом, поэтому сумма весов внимания для каждого токена равна 1. Деление на √dₖ не даёт оценкам расти вместе с размерностью и приводить softmax к насыщению.
- Генерация текста: На каждом шаге большая языковая модель (LLM) применяет softmax к словарю из десятков или сотен тысяч токенов; температура сэмплирования — это указанное выше значение T. Затем сэмплирование по ядру выбирает токен из минимального набора, вероятности которого в сумме достигают заданного порога.
- Обучение с подкреплением: Применение softmax к значениям действий формирует политику, которая обычно выбирает лучшее действие, но продолжает исследовать и другие варианты; температура задаёт баланс между исследованием и использованием уже известных вариантов.
Модели классификации YOLO26 применяют softmax в классификационной головке на этапе инференса, а атрибут probs каждого результата содержит полное распределение по 1 000 классам ImageNet:
from ultralytics import YOLO
# Load a YOLO26 classification model trained on ImageNet
model = YOLO("yolo26n-cls.pt")
results = model("https://ultralytics.com/images/bus.jpg")
# probs holds the softmax output of the classification head
probs = results[0].probs
for index, conf in zip(probs.top5, probs.top5conf.tolist()):
print(f"{results[0].names[index]}: {conf:.3f}")
print(f"Sum over all 1,000 classes: {probs.data.sum().item():.3f}")Выводятся пять наиболее вероятных классов с их вероятностями, а сумма вероятностей по всем 1 000 классам равна 1.000, поскольку головка возвращает распределение softmax.
Softmax и родственные функции#
- Сигмоида: Независимо сжимает каждую оценку до диапазона от 0 до 1, поэтому сумма выходных значений не обязательно равна 1. Сигмоида подходит для бинарных задач и многометочной классификации, например когда на изображении одновременно есть человек и рюкзак; детекторы объектов часто используют её для оценки каждого класса. Для двух классов softmax в точности сводится к сигмоиде от разности двух логитов.
- Argmax: Возвращает индекс наибольшей оценки — жёсткое решение без градиента. Softmax сохраняет тот же порядок оценок, но остаётся дифференцируемой, поэтому её можно использовать при обучении; argmax от вероятностей softmax даёт тот же результат, что и argmax от логитов.
- Log-softmax: Логарифм softmax, вычисляемый напрямую для обеспечения устойчивости и используемый функцией потерь кросс-энтропии.
- Масштабирование температуры: Метод калибровки, при котором после обучения на валидационных данных подбирается одна температура, чтобы вероятности softmax соответствовали фактической точности модели. Предсказанный класс не меняется, поскольку деление каждого логита на одно и то же положительное значение T сохраняет их порядок.










