交叉熵损失及其梯度的实现
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 个问题,因此我们取平均值。
让你感到困惑的附加部分实际上是赞美,它适用于每个问题。
【讨论】:
以上是关于交叉熵损失及其梯度的实现的主要内容,如果未能解决你的问题,请参考以下文章