首页 > 解决方案 > 真正理解交叉熵损失

问题描述

我有一个机器学习课程,我必须在其中实现 CELoss 的前向和后向方法:

class CELoss(object):
    @staticmethod
    def forward(x, y):
        assert len(x.shape) == 2 # x is batch of predictions   (batch_size, 10)
        assert len(y.shape) == 1 # y is batch of target labels (batch_size,)
        # TODO implement cross entropy loss averaged over batch
        return


    @staticmethod
    def backward(x, y, dout):
        # TODO implement dx
        dy = 0.0 # no useful gradient for y, just set it to zero
        return dx, dy

此外,我被赋予了 CELoss 作为

CELoss(x,y) = - log\frac{exp(x_y)}{\sum_{k}exp(x_k)}

(它说我不能使用公式创建器,因为我需要至少 10 个声望)

但是,这不是您可以在 wikipedia 上找到的 CELoss(例如https://en.wikipedia.org/wiki/Cross_entropy)。据我了解,CELoss 需要目标和预测。x 是否代表这里的目标而 y 是预测?如果是这样,x_y 指的是什么?谢谢您的帮助!

标签: machine-learningneural-networkstatisticsloss-functioncross-entropy

解决方案


他们是一样的。

您在问题中给出的交叉熵损失对应于您的标签为1或的交叉熵的特定情况0,我假设您正在进行基本分类时就是这种情况。

至于为什么会发生这种情况,让我们从单个训练示例的交叉熵损失开始x

Loss = - sum_j P(x_j) log(Q(x_j)) #j is the index of possible labels 

其中P是“真实”分布,“Q”是您的网络学习的分布。“真实”分布P由您的硬标签给出,也就是说,假设真正的标签是t,您将拥有:

P(x_t) = 1
P(x_j) = 0   if j!=t   

这意味着上面的损失变为

Loss= - log(Q_t)

在您的情况下,似乎分布Q_s是根据 logits 计算的,softmax 或成本函数之前的最后一层,它为每个标签输出一组分数:

scores= [s_1 , ..., s_N]

如果你通过 softmax 运行它,你会得到:

distribution = [exp(s_1)/(sum_k exp(s_k)), ..., exp(s_N)/(sum_k exp(s_k))]

t到目前为止,我们已经表示的真实标签的分布由Q下式给出

Q(s_t)=exp(s_t)/(sum_k exp(s_k))

这让我们回到了损失,它可以表示为

Loss= - log(Q_t) = - log (exp(s_t)/(sum_k exp(s_k))

这是您在问题中给出的那个。因此,在您的问题中,x_y网络为与 关联的正确标签输出的分数是x


推荐阅读