本文已参与「新人创作礼」活动,一起开启掘金创作之路。
之前博客中有使用过交叉熵损失函数,但是没有单独列出来详细说明,作为神经网络训练过程的一个重要参数指标,我觉得有必要单独拿出来详细说明一下,同时也权当做一个笔记。
交叉熵损失函数(Cross Entropy Loss Function)
数学模型
(1)二分类
二分类相对较为简单,模型最后只需要预测两种结果即可,对于两中结果我们分别记为P和(1-p),则数学表达式可以写为下面的形式:
在上述式子中yi表示类别i的标签值,正类为1,负类为0;pi表示类别i预测正确的概率。
(2)多分类
多分类相比于二分类来说类别变多,因此损失函数中加入了判别类别的因素,其数学模型如下:
上述式子中M表示类别的数量,yic表示样本i真实类别等于c的时候取值为1,否则为0;pic表示观测样本i属于类别c的概率。
所有对于数学模型的描述都必须有实际的例子支撑,不然就容易理解错,下面我用一个简单的例子通过代码来对上述公式进行计算。
假设,当前有一个三分类任务,有两个模型分别对这个分类任务进行了预测,实际见下表。
| 模型一 | ||
|---|---|---|
| 预测概率 | 真实类别 | 是否预测正确 |
| (0.3, 0.3, 0.4) | 0 0 1(人) | 是 |
| (0.3, 0.4, 0.3) | 0 1 0(猫) | 是 |
| (0.1, 0.1, 0.8) | 1 0 0(狗) | 否 |
| 模型二 | ||
|---|---|---|
| 预测概率 | 真实类别 | 是否预测正确 |
| (0.1, 0.2, 0.7) | 0 0 1(人) | 是 |
| (0.1, 0.8, 0.1) | 0 1 0(猫) | 是 |
| (03, 0.4, 0.3) | 1 0 0(狗) | 否 |
从上面的数据来看,我们直观上就能判断哪一个模型更好一些,但是加入数据不像我编造的那么理想,仅是相差非常微小,那么我们就需要借助工具来进行计算了,代码如下:
from sklearn.metrics import log_loss
# 定义例子
ground_true = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]
# 实际预测值
model_1 = [[0.3, 0.3, 0.4], [0.3, 0.4, 0.3], [0.1, 0.1, 0.8]]
model_2 = [[0.1, 0.2, 0.7], [0.1, 0.8, 0.1], [0.3, 0.4, 0.3]]
# 计算损失
model_1_loss = log_loss(ground_true, model_1)
model_2_loss = log_loss(ground_true, model_2)
print("loss_1:", model_1_loss)
print("loss_2:", model_2_loss)
计算结果如下
从上述计算结果中我们可以很清楚的看到两个模型之间的差异性。