Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

2024-05-08 21:24

1. Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

     在使用pytorch深度学习框架,计算损失函数的时候经常回到这么一个个函数:
       该损失函数结合了  和  两个函数。它在做分类(具体几类)训练的时候是非常有用的。在训练过程中,对于每个类分配权值,可选的参数权值应该是一个1D张量。当你有一个不平衡的训练集时,这是是非常有用的。那么针对这个函数,下面将做详细的介绍。
        交叉熵主要是用来判定实际的输出与期望的输出的接近程度 ,为什么这么说呢,举个例子:在做分类的训练的时候,如果一个样本属于第K类,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,….0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果。也就是说用它来衡量网络的输出与标签的差异,利用这种差异经过反向传播去更新网络参数。
   在说交叉熵之前,先说一下 信息量 与 熵 。        信息量: 它是用来衡量一个事件的不确定性的;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。假设X是一个离散型随机变量,其取值集合为X,概率分布函数为  ,我们定义事件  的信息量为:     当  时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。
        熵: 它是用来衡量一个系统的混乱程度的,代表一个系统中信息量的总和;信息量总和越大,表明这个系统不确定性就越大。       举个例子:假如小明和小王去打靶,那么打靶结果其实是一个0-1分布,X的取值有{0:打中,1:打不中}。在打靶之前我们知道小明和小王打中的先验概率为10%,99.9%。根据上面的信息量的介绍,我们可以分别得到小明和小王打靶打中的信息量。但是如果我们想进一步度量小明打靶结果的不确定度,这就需要用到熵的概念了。那么如何度量呢,那就要采用 期望 了。我们对所有可能事件所带来的信息量求期望,其结果就能衡量小明打靶的不确定度:     与之对应的,小王的熵(打靶的不确定度)为:      虽然小明打靶结果的不确定度较低,毕竟十次有9次都脱靶;但是小王打靶结果的不确定度更低,1000次射击只有1次脱靶,结果相当的确定。
        交叉熵: 它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,  为交叉熵,则      那么该公式如何表示,举个例子,假设N=3,期望输出为  ,实际输出  ,  ,那么:     通过上面可以看出,q2与p更为接近,它的交叉熵也更小。
       Pytorch中计算的交叉熵并不是采用  这种方式计算得到的,而是交叉熵的另外一种方式计算得到的:  它是交叉熵的另外一种方式。       Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果。       1、Softmax后的数值都在0~1之间,所以ln之后值域是负无穷到0。       2、然后将Softmax之后的结果取log,将乘法改成加法减少计算量,同时保障函数的单调性       3、NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来(下面例子中就是:将log_output\logsoftmax_output中与y_target对应的值拿出来),去掉负号,再求均值。   下面是我仿真写的一个例子:
   最计算得到的结果为:
       通过上面的结果可以看出,直接使用pytorch中的loss_func=nn.CrossEntropyLoss()计算得到的结果与softmax-log-NLLLoss计算得到的结果是一致的。
   [1]  https://blog.csdn.net/zwqjoy/article/details/78952087    [2]  https://blog.csdn.net/xg123321123/article/details/52864830    [3]  https://www.cnblogs.com/JeasonIsCoding/p/10171201.html    更多自然语言处理、pytorch相关知识,还请关注  AINLPer  公众号,极品干货即刻送达。

Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解