交叉熵损失及其梯度的实现

Posted

技术标签:

【中文标题】交叉熵损失及其梯度的实现【英文标题】:Implementation of cross-entropy loss and its gradient 【发布时间】:2021-05-29 08:25:45 【问题描述】:

我正在尝试遵循this repository 中概述的多层感知器的实现:

在查看它的交叉熵实现时,我注意到它被定义为:

class CrossEntropy(Loss):
    ...

    def loss(self, y, p):
        # Avoid division by zero
        p = np.clip(p, 1e-15, 1 - 1e-15)
        return - y * np.log(p) - (1 - y) * np.log(1 - p) # What's the part after the first np.log(p)?

    def gradient(self, y, p):
        # Avoid division by zero
        p = np.clip(p, 1e-15, 1 - 1e-15)
        return - (y / p) + (1 - y) / (1 - p) 

在我的理解中,交叉熵是-y * log(p),如果我对其求导,则-(y / p)y为真值,p为预测值

因此,当我看到这个实现有一个额外的 - (1 - y) * log(1 - p) 时,我有点困惑,而且派生类也发生了变化。

这个附加部分是什么,它的用途是什么?

【问题讨论】:

-y * log(p) 仅适用于二进制分类的特殊情况;另一个等式是多类的一般情况。 【参考方案1】:

一个简单的“是/否”问题永远不会有“是”或“否”的答案。他们总是互相恭维,即“是”+“否”= 1。

如果我们在二元交叉熵示例中只有一个问题,那么这是一个简单的分类交叉熵示例,有 2 个选项“是”或“否”。

但是我们有 N 个问题,因此我们取平均值。

让你感到困惑的附加部分实际上是赞美,它适用于每个问题。

【讨论】:

以上是关于交叉熵损失及其梯度的实现的主要内容,如果未能解决你的问题,请参考以下文章

交叉熵 相关链接

损失函数

[损失函数]——交叉熵

softmax交叉熵损失函数求导

什么是交叉熵? [关闭]

为什么LR模型损失函数使用交叉熵不用均方差?