交叉熵损失函数

403 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

之前博客中有使用过交叉熵损失函数,但是没有单独列出来详细说明,作为神经网络训练过程的一个重要参数指标,我觉得有必要单独拿出来详细说明一下,同时也权当做一个笔记。

交叉熵损失函数(Cross Entropy Loss Function)

数学模型

(1)二分类

二分类相对较为简单,模型最后只需要预测两种结果即可,对于两中结果我们分别记为P和(1-p),则数学表达式可以写为下面的形式:

1.PNG

在上述式子中yi表示类别i的标签值,正类为1,负类为0;pi表示类别i预测正确的概率。

(2)多分类

多分类相比于二分类来说类别变多,因此损失函数中加入了判别类别的因素,其数学模型如下:

3.PNG

上述式子中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)

计算结果如下

5.PNG 从上述计算结果中我们可以很清楚的看到两个模型之间的差异性。