【问题标题】:Truly understanding Cross-Entropy-Loss真正理解交叉熵损失
【发布时间】:2020-10-09 12:40:50
【问题描述】:

我有一个机器学习课程,我必须在其中实现 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 个声望)

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

【问题讨论】:

    标签: machine-learning neural-network statistics loss-function cross-entropy


    【解决方案1】:

    它们是一样的。

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

    至于为什么会发生这种情况,让我们从单个训练示例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变成了

    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 关联的正确标签输出的分数。

    【讨论】:

    • 非常感谢您的澄清,这真的很有帮助:)
    猜你喜欢
    • 2018-09-03
    • 2021-08-25
    • 2016-08-01
    • 2019-06-19
    • 2017-03-14
    • 2021-11-25
    • 2018-04-14
    • 2020-06-15
    • 2018-05-31
    相关资源
    最近更新 更多