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()的整合, 能够间接应用它来替换网络中的这两个操作。上面看一下官网的解释: