Softmax 是一种数学函数,通常用于将一组任意实数转换为示意概率分布的实数。其本质上是一种归一化函数,能够将一组任意的实数值转化为在 [0, 1] 之间的概率值,因为 softmax 将它们转换为 0 到 1 之间的值,所以它们能够被解释为概率。如果其中一个输出很小或为负,softmax 将其变为小概率,如果输出很大,则将其变为大概率,但它将始终保持在 0 到 1 之间。
Softmax 是逻辑回归的一种推广,能够用于多分类工作,其公式与逻辑回归的 sigmoid 函数十分类似。只有当分类是互斥的,才能够在分类器中应用 softmax 函数,也就是说只能是多元分类(即数据只有一个标签),而不能是多标签分类(即一条数据可能有多个标签)。
许多多层神经网络输入层的最初一层是一个全连贯层,输入是一个实数向量,这个向量通常代表了每个类别的得分或置信度。为了将这些得分转换为概率分布,通常会应用 softmax 函数。因为它将分数转换为规范化的概率分布,能够显示给用户或用作其余零碎的输出。所以通常附加一个 softmax 函数在神经网络的最初一层之后。
Softmax 函数的公式
softmax 函数的输出是一个蕴含 K 个元素的向量,其中不带箭头的 z 示意向量的一个元素:
上面是一个例子:
其中分子的函数可视化如下:
Softmax 的分子将指数函数利用于向量的每个元素,对于最高的输出值返回最高的输入值。因为它的范畴是(0,∞),所以任何正数也变成负数。这能够从下面的图和上面的的区间中看出。
Softmax 分母中的求和是通过确保函数的和为 1 来标准化每个元素,创立一个概率分布。所有的指数元素加在一起,所以当每个指数元素除以这个和时,它将是它的一个百分比。[5,7,10]的指数元素之和如下:
上面这个例子将应用一个 3 元素向量 [5,7,10] 来演示 softmax。
i 示意向量的每个元素独自传入,这样会创立一个蕴含 K 个元素的向量作为输入。因为 K = 3,函数将被计算三次:
输入为[0.006,0.047,0.946],总和约为 1。
咱们能够应用框架中曾经实现的 softmax 函数能够用来主动计算,例如 PyTorch 中:
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])
对于矩阵来说,也是一样的,咱们上面先手动计算矩阵的 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。然而这里有一个问题:输出向量不同然而后果是雷同的。为什么会这样?
因为只有指数值之间的间隔雷同,后果就是是雷同的,看看上面的计算:
为了验证咱们的计算,能够应用框架内置的函数,比方 torch 的 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]])
阐明咱们的实现是没有问题的,然而还要阐明一点,尽量应用框架提供的计算,因为这样会通过优化,速度会比咱们手动实现快很多。
https://avoid.overfit.cn/post/2d318bac9289468db61c8510c4e3b613
作者:Hunter Phillips