NLP | Softmax详解

发布时间 2023-07-05 17:44:36作者: 张Zong在修行

Softmax是一种数学函数,通常用于将一组任意实数转换为表示概率分布的实数。其本质上是一种归一化函数,可以将一组任意的实数值转化为在[0, 1]之间的概率值,因为softmax将它们转换为0到1之间的值,所以它们可以被解释为概率如果其中一个输入很小或为负,softmax将其变为小概率,如果输入很大,则将其变为大概率,但它将始终保持在0到1之间。

Softmax是逻辑回归的一种推广,可以用于多分类任务,其公式与逻辑回归的sigmoid函数非常相似。只有当分类是互斥的,才可以在分类器中使用softmax函数,也就是说只能是多元分类(即数据只有一个标签),而不能是多标签分类(即一条数据可能有多个标签)。

许多多层神经网络输出层的最后一层是一个全连接层,输出是一个实数向量,这个向量通常代表了每个类别的得分或置信度。为了将这些得分转换为概率分布,通常会使用softmax函数。因为它将分数转换为规范化的概率分布,可以显示给用户或用作其他系统的输入。所以通常附加一个softmax函数在神经网络的最后一层之后。

Softmax图像

Softmax函数的公式

image-20230705171422013

softmax函数的输入是一个包含K个元素的向量,其中不带箭头的z表示向量的一个元素:

例如:使用一个3元素向量[5,7,10]作为输入,也就是上面公式带箭头的z。

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

运行结果:

 tensor([[0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652]])

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

说明我们的实现是没有问题的,但是还要说明一点,尽量使用框架提供的计算,因为这样会经过优化,速度会比我们手动实现快很多