目录
在深度学习中,LogSoftmax函数是Softmax函数的一个变体,它通常与交叉熵损失函数结合使用,以提高数值稳定性并简化损失函数的计算。LogSoftmax函数实际上是对Softmax函数输出取对数的结果。
数学定义
由上一篇文章可知Softmax函数的函数的定义,而LogSoftmax函数就是对Softmax函数取自然对数。数学公式如下:
化简后得到:
函数特性:
1.数值相对稳定:LogSoftmax函数通过避免直接计算指数的和的方式来提高计算效率(在计算机中指数运算也是十分麻烦的计算,还有可能精度缺失),Softmax函数在计算时会有数值溢出,LogSoftmax函数就不会。
2.简化损失函数运算:当LogSoftmax函数与交叉熵损失函数结合时,可以直接使用LogSoftmax函数的输出(LogSoftmax已经将Softmax的计算过程内嵌在内,它输出的是每个类别的对数概率。这样,在计算损失时,就无需先计算Softmax概率,然后再对这些概率取对数,从而简化了计算过程),简化了损失函数的计算。
3.梯度计算:使用LogSoftmax函数可以简化梯度的计算,因为它避免了反向传播过程中计算Softmax函数导致的计算复杂。
函数的缺陷
1.输出范围:由它的数学定义式可知,LogSoftmax函数的输出范围在0到负无穷之间,这就意味这输出的值都是负数,这个与Softmax函数输出的正概率是不同的。(这个是在某些特殊场景中需要特别注意)。
2.限制损失函数:由数学定义式可知,该函数的输出是负数,那么可供该函数使用的损失函数就有限制,需要可以接收负数。
3.梯度问题:在反向传播过程中,LogSoftmax函数的梯度可能会变得非常小,尤其是在某些输出值很小的情况下(相比于其他值很小),就可能导致梯度消失,尤其在深层神经网络中。
4.计算效率:LogSoftmax函数函数虽然在数值上比Softmax函数更加稳定,但是他依然是需要进行指数运算求和的,也是十分消耗时间的,对于大模型或者是大的数据集来说就是我们需要考虑的问题了。
5.不适合多标签分类的问题:和Softmax函数一样,LogSoftmax函数的输出也是互斥的,这就意味着每一个样本只能属于一个类,这对于多标签问题来说,就不行了,只能使用其他方法。
编码的简单实现
import torch
def log_softmax(x):
#我们先将x中的每一个元素减去最大值,来防止数值溢出
x_max=torch.max(x,dim=-1,keepdim=True).values
x=x-x_max
#计算指数和
exp_x_sum=torch.sum(torch.exp(x),dim=-1,keepdim=True)
#计算LogSoftmax
return x-torch.log(exp_x_sum)
#开始测试
z=torch.tensor([[1,2,3]])
output=log_softmax(z)
print(output)
torch.sum函数建议上官网看看如何使用的。
总结
尽管存在这些缺陷,LogSoftmax
函数仍然是深度学习中处理多分类问题时一个非常有用的工具。在设计模型时,需要根据具体的应用场景来权衡其利弊。如果你的应用场景需要稳定的数值计算并且与交叉熵损失函数兼容,那么LogSoftmax
函数是一个很好的选择。
官网的参考文件
torch — PyTorch 2.4 documentation