nn.CrossEntropyLoss()

1.引言

在使用pytorch深度学习框架做多分类时,计算损失函数通常会使用交叉熵损失函数nn.CrossEntropyLoss()

2. 信息量和熵

信息量:它是用来衡量一个事件的不确定性的;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。假设$X$是一个离散型的随机变量,其取值集合为$X$ = $x_0,x_1,,,x_n$,其概率分布函数为$p(x) = Pr(X = x),x\in X$,则定义事件$X = x_0$的信息量为:

$$ I(x_i) = -log(p(x_i)) $$

当$p(x_0) = 1$ 时,该事必定发生,其信息量为0。


熵用来衡量一个系统的混乱程度,代表系统中信息量的总和;熵值越大,表明这个系统的不确定性就越大。

信息量是衡量某个事件的不确定性,而熵是衡量一个系统(所有事件)的不确定性。

熵的计算公式:

$$ H(x) = -\sum_{i=1}^np(x_i)log(p(x_i)) $$

其中,$p(x_i)为事件X = x_i的概率,-log(p(x_i))为事件X = x_i 的信息量。$
可以看出,熵是信息量的期望值,是一个随机变量(一个系统,事件所有可能性)不确定性的度量。熵值越大,随机变量的取值就越难确定,系统也就越不稳定;熵值越小,随机变量的取值也就越容易确定,系统越稳定。

交叉熵 Cross Entropy

交叉熵主要是用来判定实际的输出与期望的输出的接近程度,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,$H(p,q)$为交叉熵,则表达式:
(1)二分类

$$ H(p,q) = \frac{1}{N}\sum_{i=1}^N H(p(x_i),q(x_i)) = \frac{1}{N}\sum_{i=1}^N -(p(x_i)log(q(x_i)))+(1-p(x_i))log(1-q(x_i)) $$

其中:
N表示一个batch的样本数
$p(x_i)$ 表示样本i的label,正类为1,负类为0
$q(x_i)$ 表示样本i预测为正的概率

(2)多分类

$$ H(p,q) = \frac{1}{N}\sum_{i=1}^N H(p(x_i),q(x_i)) = - \frac{1}{N}\sum_{i=1}^N \sum_{j=1}^M p(x_{ij})log(q(x_{ij})) $$

其中:
M表示类别数
$p(x_{ij})$ 表示变量(0或1),如果该类别和样本i的类别相同就是1,否则是0;
$q(x_{ij})$ 表示对于观测样本i属于类别$j$的预测概率。

举例

x
Label 0 0 1
Pred 0.1 0.1 0.8

那么一个样本的loss为:
$loss= -(0 * log(0.1)+0*log(0.1)+1*log(0.8)) = 0.22$

pytorch中的交叉熵
在pytorch中,和我理解的交叉熵不一样。nn.CrossEntropyLoss()是nn.logSoftmax()和nn.NLLLoss()的整合,可以直接使用它来替换网络中的这两个操作。下面看一下官网的解释:

11.png

yuan
26 声望6 粉丝

每天做点喜欢和不喜欢的事