深度学习-LogSoftmax函数

目录

数学定义

函数特性:

函数的缺陷

编码的简单实现

总结

官网的参考文件


在深度学习中,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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值