Softmax: вероятности для классификации

Урок объясняет softmax — слой, превращающий выходы сети в вероятности классов.

Softmax — это функция, которая берёт вектор произвольных чисел (логитов) и превращает его в набор положительных чисел, сумма которых равна 1.

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

Для классификации на несколько классов (кот / собака / птица) выходной слой выдаёт по одному числу на класс — это логиты, сырые «очки». Но очки трудно интерпретировать: они могут быть отрицательными, большими, несравнимыми. Softmax приводит их к вероятностям: каждое число в (0, 1), а вся сумма равна 1. Тогда самый большой выход — самый вероятный класс.

Формула словами

Для каждого логита берём экспоненту, затем делим на сумму всех экспонент: p_i = exp(z_i) / сумма(exp(z_j)). Экспонента делает все значения положительными и резко усиливает разрыв между большими и малыми логитами — сеть становится «увереннее» в лидере.

Устойчивая реализация

Прямое exp(большое число) переполняется. Стандартный приём — вычесть из всех логитов их максимум: результат softmax от этого не меняется, но переполнение исчезает.

import math

def softmax(scores):
    m = max(scores)                       # сдвиг для устойчивости
    exps = [math.exp(s - m) for s in scores]
    total = sum(exps)
    return [e / total for e in exps]

logits = [2.0, 1.0, 0.1]
probs = softmax(logits)
print("Логиты:", logits)
print("Вероятности:", [round(p, 3) for p in probs])
print("Сумма:", round(sum(probs), 3))
print("Предсказанный класс:", probs.index(max(probs)))

Вывод:

Логиты: [2.0, 1.0, 0.1]
Вероятности: [0.659, 0.242, 0.099]
Сумма: 1.0
Предсказанный класс: 0

Логит 2.0 превратился в вероятность 0.659 — больше половины уверенности на класс 0. Сумма ровно 1.0, как и положено распределению.

Свойства, которые стоит запомнить

  • Softmax усиливает различия: разрыв 2.0 против 0.1 даёт уверенность 66% против 10%.
  • Он чувствителен к «температуре»: если поделить логиты на большое число, распределение станет более ровным; на маленькое — более резким (этот приём используют при генерации текста в LLM).
  • Для двух классов softmax сводится к одной sigmoid — это её многоклассовое обобщение.

Softmax + кросс-энтропия

На практике softmax почти всегда идёт в паре с функцией потерь кросс-энтропии (следующий раздел). Эта пара удобна математически: их совместная производная вычисляется на удивление просто — p - y. Это сильно упрощает обучение классификаторов.

Температура: как менять «уверенность»

У softmax есть полезный параметр — температура T: логиты делят на неё перед экспонированием. При T < 1 распределение становится резче (модель «увереннее»: лидер забирает почти всю вероятность), при T > 1 — ровнее (вероятности выравниваются, ответы разнообразнее). Именно температурой регулируют «креативность» при генерации текста в языковых моделях: низкая температура даёт предсказуемый, почти детерминированный текст, высокая — более неожиданный. При T → 0 softmax вырождается в выбор строго самого вероятного класса (argmax).

Обратите внимание и на интерпретацию: вероятности softmax — это уверенность модели, а не истинная вероятность правоты. Хорошо обученная сеть может быть уверенно неправа на необычном входе. Поэтому высокий выход softmax — повод доверять ответу, но не гарантия его корректности.

Итог

  • Softmax превращает логиты в вероятности классов, сумма которых равна 1.
  • Вычитание максимума делает вычисление устойчивым к переполнению.
  • Softmax — обобщение sigmoid на много классов, работает в паре с кросс-энтропией.
Проверьте себя
1. Что softmax делает с вектором логитов?
AСортирует их по убыванию
BПревращает в вероятности: положительные числа с суммой 1
CОбнуляет отрицательные значения
DСчитает их среднее
2. Зачем в softmax вычитают максимум логитов?
AЧтобы сменить класс-победитель
BДля численной устойчивости — иначе exp может переполниться
CЧтобы сумма стала равна максимуму
DЭто ускоряет деление
3. С какой функцией потерь softmax обычно работает в паре?
AMSE
BКросс-энтропией
CMAE
DHinge-loss
Поддержать проект