引言:

在使用pytorch中的损失函数时,经常会使用到:

nn.CrossEntropyLoss()

该损失函数整合了nn.LogSoftmax()和nn.NLLLoss(),常用于训练分类任务。特别是在神经网络做分类问题时,经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。

我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:

  1. 神经网络最后一层得到每个类别的得分scores(也叫logits)
  2. 该得分经过sigmoid(或softmax)函数获得概率输出;
  3. 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵

 交叉熵主要是用来度量实际的输出与期望的输出的接近程度。要理解交叉熵,首先需要知道什么是信息量。

信息量

信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。

信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大。

设某一事件发生的概率为

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_02

,其信息量表示为:

pytorch的交叉熵 pytorch中交叉熵函数_概率分布_03

信息熵

信息熵也被称为熵,用来表示所有信息量的期望。

期望是试验中每次可能结果的概率乘以其结果的总和。

所以信息量的熵可表示为:(这里的

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_04

是一个离散型随机变量)

pytorch的交叉熵 pytorch中交叉熵函数_pytorch_05

使用明天的天气概率来计算其信息熵:

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_06

 

pytorch的交叉熵 pytorch中交叉熵函数_概率分布_07

 对于0-1分布的问题,由于其结果只用两种情况,是或不是,设某一件事情发生的概率为P ( x ) ,则另一件事情发生的概率为1 − P ( x ),所以对于0-1分布的问题,计算熵的公式可以简化如下:

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_08

相对熵(KL散度)

如果对于同一个随机变量

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_04

有两个单独的概率分布

pytorch的交叉熵 pytorch中交叉熵函数_pytorch的交叉熵_10


pytorch的交叉熵 pytorch中交叉熵函数_pytorch_11

,则我们可以使用KL散度来衡量这两个概率分布之间的差异。下面直接列出公式,再举例子加以说明。

pytorch的交叉熵 pytorch中交叉熵函数_pytorch_12

 在机器学习中,常常使用

pytorch的交叉熵 pytorch中交叉熵函数_pytorch的交叉熵_10

来表示样本的真实分布,

pytorch的交叉熵 pytorch中交叉熵函数_pytorch_11

表示模型所预测的分布,比如在一个三分类任务中(例如,猫狗马分类器),

pytorch的交叉熵 pytorch中交叉熵函数_pytorch的交叉熵_15

分别代表猫,狗,马,例如一张猫的图片真实分布P ( X ) = [ 1 , 0 , 0 ] , 预测分布Q ( X ) = [ 0.7 , 0.2 , 0.1 ] ,计算KL散度: 

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_16

 KL散度越小,表示P ( x ) 与Q(x)的分布更加接近,可以通过反复训练Q ( x )来使Q ( x ) 的分布逼近P ( x ) 。

交叉熵

首先将KL散度公式拆开:

pytorch的交叉熵 pytorch中交叉熵函数_机器学习_17

 

前者H ( p ( x ) )表示信息熵,后者即为交叉熵,KL散度 = 交叉熵 - 信息熵

交叉熵公式表示为:

pytorch的交叉熵 pytorch中交叉熵函数_机器学习_18

 在机器学习训练网络时,输入数据与标签常常已经确定,那么真实概率分布P ( x ) 也就确定下来了,所以信息熵在这里就是一个常量。由于KL散度的值表示真实概率分布P ( x ) 与预测概率分布Q ( x )之间的差异,值越小表示预测的结果越好,所以需要最小化KL散度,而交叉熵等于KL散度加上一个常量(信息熵),且公式相比KL散度更加容易计算,所以在机器学习中常常使用交叉熵损失函数来计算loss就行了。

交叉熵在二分类问题中的应用

在线性回归问题中,常常使用MSE(Mean Squared Error)作为loss函数,而在分类问题中常常使用交叉熵作为loss函数。

下面通过一个例子来说明如何计算交叉熵损失值。

假设我们输入一张狗的图片,标签与预测值如下:

 

pytorch的交叉熵 pytorch中交叉熵函数_pytorch_19

那么loss

pytorch的交叉熵 pytorch中交叉熵函数_pytorch的交叉熵_20

 一个batch的loss为:

pytorch的交叉熵 pytorch中交叉熵函数_交叉熵_21

 其中m为样本的个数。

总结:
1.交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。

2.交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。