Рассмотрим вектор, например (5, -0,5, 3, -2). Мы хотим найти такое преобразование, при котором преобразованный вектор представляет собой распределение: каждый компонент находится в диапазоне от 0 до 1, а сумма компонентов равна 1 (чтобы их можно было интерпретировать как вероятности). Каждая вероятность должна отражать — по величине — значение исходного соответствующего компонента (например, 5 должно быть связано с наибольшей вероятностью).

Простое решение находится в два шага.

Первый шаг

Мы попытаемся преобразовать исходный вектор в вектор с положительными компонентами, и эти новые компоненты будут отражать размеры исходных. Для этого нам нужно найти реальную функцию f для преобразования компонентов. Эта функция должна быть определена по всей реальной строке (иначе она не могла бы представлять все значения). Очевидно, мы ищем возрастающую монотонную функцию, потому что этот тип функции сохраняет порядок: если ab, тогда f (a) ≤ f (b).

Первое предположение, для простоты, это линейное преобразование. Но есть проблема... возрастающие линейные преобразования не обязательно возвращают положительные значения. Это также верно для каждой функции вида f (x) = xᵏ с нечетным k. Итак, давайте попробуем полином второго порядка, такой как f (x) = x²… нет, монотонность не гарантируется на всей реальной линии. То же самое верно для функций вида xᵏ с четным k. Поэтому мы не будем рассматривать эти функции и многочлены вообще.

Класс монотонно возрастающих функций — фактически строго возрастающих — представлен функциями вида f (x) = (экспоненциальные функции) с основанием a › 1. Кроме того, эти функции возвращают положительные значения независимо от входных данных. Возьмем за основу a = e, число Нейпира. Оно работает:

Теперь у нас есть вектор с положительными компонентами, где каждый новый компонент отражает величину исходного компонента.

Второй шаг

Нам нужно получить значения от 0 до 1 для наших записей, чтобы в сумме они составляли 1. Но это легко: достаточно разделить каждую запись на сумму всех записей:

Мы могли бы легко проверить, что сумма компонентов равна 1 и что вероятности отражают исходные значения по величине.

Функция softmax

Пусть исходный вектор равен v= ( v₁, v₂, . . ., vₙ ). Предыдущие шаги привели к определению S:

для каждого i = 1, 2, …, n. С помощью S можно определить функцию softmax как векторную функцию:

Softmax — это векторная функция, которая преобразует вектор в другой вектор того же размера, представляющий распределение вероятностей.

Немного кодирования

Попробуйте эти простые фрагменты с NumPy, PyTorch и TensorFlow.

[NumPy]

# NumPy
import numpy as np
def softmax(x):   
     return np.exp(x) / np.sum(np.exp(x))
x = np.array([1., 5, 4])
print(softmax(x))

[ПиТорч]

# PyTorch
import torch
x = torch.tensor([1., 5, 4])
print(torch.softmax(x, dim=0))

[Тензорный поток]

# TensorFlow
import tensorflow as tf
x = [1., 5, 4]
print(tf.nn.softmax(x))

Поддержите этот блог.

Полезные ссылки

Функция Softmax — статья в Википедии [ссылка]

tf.nn.softmax — документы TensorFlow [ссылка]

Softmax — документация по PyTorch [ссылка]