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]])