【问题标题】: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) 仅适用于二进制分类的特殊情况;另一个等式是多类的一般情况。

标签: python numpy machine-learning loss-function


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2021-08-25
    • 2018-09-03
    • 2016-08-01
    • 2019-06-19
    • 2019-08-08
    • 1970-01-01
    • 2020-08-13
    • 2023-03-29
    相关资源
    最近更新 更多