- Softmax算法本质上也是一种激活函数。
1. 什么是Softmax?
- 如果判断输入属于某一个类的概率大于属于其他类的概率,那么这个类对应的值就逼近与1,其他类的值就逼近与0.
- 该算法主要应用应用于多分类问题,而且要求分类值是互斥的,即一个值只能属于其中的一个类。
- 与Sigmoid之类的激活函数函数不同的是,一般的激活函数只能分两类,因此,可以将Softmax理解为Sigmoid类的激活函数的拓展:
Softmax = exp(logits) / reduce_sum(exp(logits), dim)
- 把所有值用e的n次方计算出来,求和计算某个值占的比率,保证总和为1.
- 这里的exp(logits)值得就是elogits
- 这里的exp表示自然指数函数exp(x) = ex,logits是一个向量,这部分可以理解为对logits中的每个元素都进行指数化。
- 这里的reduce_sum表示对指定维度进行求和。
- exp(logits)得到的结果是一个向量。
- dim表示对哪个维度进行求和。
- 如果多分类任务中的每个类彼此之间不是互斥关系,则可以使用多个二分类来组成。
- 一般可以认为通过Softmax计算出来的就是概率。
2. Softmax原理
- Softmax网络模型输入X1,X2,要准备生成Y1,Y2,Y3三个类别 (w是权重, b为偏置)。
- 对于属于Y1类的概率,可以转化为输入X1满足某个条件的概率与X2满足某个条件概率的乘积。
- 在网络模型中,我们把等式两边都进行In运算。
- 这样,进行In运算后属于Y1类的概率值可以转换为:In运算后的X1满足某个条件的概率加上In运算后的X2满足某个条件的概率。
- 这样Y1 = X1 * W11 + X2 * W12等于In运算后的Y1的概率了。
- 这也是在Softmax中要计算一次e的logits次方的原因。
等式两边进行In运算是神经网络中常用的技巧,主要用来将概率的乘法转变为加法,即In(xy) = Inx + Iny。在后续的计算中,再将其转换为e的X次方,还原成原来的值。 - 举例:某个样本经过神经网络所生成的值为Y1,Y2,Y3,其中Y1为5,Y2为3,Y3为2,对应的结果就为Y1=5/10=0.5, Y2=3/10=0.3,Y3=2/10=0.2,于是取值最大的Y1为最终的分类。
3. 常用的Softmax接口
- Pytorch中,Softmax接口是以类的形式提供的。
Softmax接口 | 描述 |
---|---|
torch.nn.Softmax(dim) | 计算Softmax,参数dim代表计算的维度。 |
torch.nn.Softmax2d() | 对每个图片进行Softmax处理 |
torch.nn.LogSoftmax(logits, name=None) | 对Softmax取对数,常与NLLLoss联合使用,实现交叉熵损失的计算。 |
4. Softmax与交叉熵的应用
- 假设有一个标签labels和一个网络输出值logits,模拟神经网络中计算损失的过程,将其进行交叉熵的计算。
- 这里使用两种方法进行交叉熵计算:
- 使用LogSoftmax和NLLLoss的方法计算交叉熵。
- 使用CrossEntropyLoss方法计算交叉熵。
import torch
# Define simulated data
logits = torch.tensor([[2.0, 0.5, 6.0], [0.1, 0.0, 3.0]], requires_grad=True)
labels = torch.tensor([2, 1])
print(logits)
print(labels)
# Compute Softmax
print('Softmax:', torch.nn.Softmax(dim=1)(logits))
# Compute LogSoftmax
logsoftmax = torch.nn.LogSoftmax(dim=1)(logits)
print('logSoftmax:', logsoftmax)
# Compute NLLLoss
output = torch.nn.NLLLoss()(logsoftmax, labels)
print('NLLLoss:', output)
# Compute CrossEntropyLoss
print('CrossEntropyLoss:', torch.nn.CrossEntropyLoss()(logits, labels))
运行结果:
- 首先定义了模拟数据logits与labels。
- logits:神经网络的计算结果,一共有两个数据,每个数据的结果中包括了3个数值,代表3种分类的结果。
- labels:神经网络的计算结果对应的标签,一共有两个数值,每个数值代表对应数据的所属分类。
- 从最后的结果看,使用LogSoftmax和NLLLoss的方法与直接使用CrossEntropyLoss所计算的损失值是一样的。
5. 总结:更好地认识SoftMax
在搭建神经网络模型时,需要使用Softmax将目标分成几类,就在最后一层放几个节点。