Softmax нормализует входной вектор в распределение вероятностей, используя экспоненциальную функцию.

Обзор

Согласно DeepAI:

Функция softmax — это функция, которая превращает вектор K действительных значений в вектор K вещественных значений, которые сумма равна 1. Входные значения могут быть положительными, отрицательными, нулевыми или больше единицы, но softmax преобразует их в значения от 0 до 1, чтобы их можно было интерпретировать как вероятности. Если один из входных данных мал или отрицателен, softmax превращает его в маленькую вероятность, а если вход большой, то превращает его в большую вероятность, но она всегда будет оставаться между 0 и 1.

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

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

Компоненты функции Softmax

Ввод

Входными данными для функции softmax является вектор из K элементов, где z без стрелки представляет собой элемент вектор:

Пример можно увидеть ниже:

Числитель

Softmax применяет экспоненциальную функцию к каждому элементу вектора, возвращая самое высокое выходное значение для самого высокого входного значения. Любые отрицательные значения также становятся положительными, поскольку их диапазон равен (0, ∞). Это можно увидеть на графике выше или на интервале ниже.

Знаменатель

Суммирование в знаменателе нормализует каждый элемент, гарантируя, что функция будет равна 1 и создаст распределение вероятностей. Все возведенные в степень элементы складываются вместе, поэтому, когда каждый возведенный в степень элемент делится на эту сумму, это будет процент от нее. Суммирование возведенных в степень элементов [5, 7, 10] можно увидеть ниже:

Пример с вектором

В этом примере будет использоваться трехэлементный вектор [5, 7, 10], чтобы продемонстрировать возможности нормализации softmax.

i указывает, что каждый элемент вектора передается сам по себе для создания вектора из K элементов в виде выход.

Поскольку K = 3, функция будет вычисляться трижды:

Результатом будет [0,006, 0,047, 0,946], что равно примерно 1. Технически это 0,999 из-за усечения. Наименьшее значение, 5, имеет наименьшую вероятность, а наибольшее значение, 10, имеет наибольшую вероятность. .

В PyTorch есть функция softmax, которую можно использовать для автоматического вычисления, но ее также можно вычислить с помощью функций возведения в степень и суммирования.

import torch

# set the vector to a tensor
z = torch.Tensor([5, 7, 10])

# apply softmax
softmax = torch.exp(z) / torch.sum(torch.exp(z))
tensor([0.0064, 0.0471, 0.9465])

Пример с матрицей

Чтобы суммировать значения каждого вектора в приведенной выше матрице, torch.sum должен иметь axis = 1 чтобы суммировать каждую строку, и keepdims = True, чтобы сохранить ее форму. Это создает матрицу из 3 одноэлементных векторов, которые можно транслировать во время деления:

Это можно увидеть в коде ниже.

x = torch.Tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

torch.sum(x, axis=1, keepdims=True)
tensor([[ 6.],
        [15.],
        [24.]])

Если keepdims = False, на выходе будет один вектор с тремя элементами: [6, 15, 24]. Это можно увидеть ниже.

torch.sum(x, axis=1, keepdims=False)
tensor([ 6., 15., 24.])

Имея это в виду, почти такой же расчет можно использовать для вычисления softmax на матрице:

# apply softmax
softmax = torch.exp(x) / torch.sum(torch.exp(x), axis=1, keepdims=True)
tensor([[0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652]])

Теперь каждый вектор в сумме составляет примерно 1. Однако все три вектора одинаковы, хотя входные векторы были разными. Почему это? Оказывается, пока возведённые в степень значения имеют одинаковое расстояние между ними, результат будет таким же:

Реализация факела

Такой же результат можно получить с помощью nn.Softmax.

import torch.nn as nn

x = torch.Tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

# sum each row
softmax_layer = nn.Softmax(dim=1)

output = softmax_layer(x)
tensor([[0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652]])

Рекомендации

  1. Функция Softmax от DeepAI
  2. Функция Softmax от PyTorch