【问题标题】:scale the loss value according to "badness" in caffe根据 caffe 中的“badness”缩放损失值
【发布时间】:2016-04-26 17:57:39
【问题描述】:

我想根据训练期间“当前预测”与“正确标签”的接近/远近来缩放每张图像的损失值。例如,如果正确的标签是“猫”并且网络认为它是“狗”,则惩罚(损失)应该小于网络认为它是“汽车”的情况。

我的做法如下:

1- 我定义了标签之间的距离矩阵,
2- 将该矩阵作为底部传递给"softmaxWithLoss" 层,
3- 将每个 log(prob) 乘以该值以根据 forward_cpu 中的 badness 缩放损失

但是我不知道我应该在backward_cpu 部分做什么。我了解必须更改渐变(bottom_diff),但不太确定如何在此处合并比例值。根据数学,我必须按比例缩放渐变(因为它只是一个比例)但不知道如何。

此外,如果我没记错的话,似乎 caffe 中有一个名为 "InfoGainLoss" 的 loosLayer,它的工作非常相似,但是这一层的后部有点令人困惑:

bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j] / prob;

我不知道为什么infogain_mat[]prob 除而不是被乘!如果我对infogain_mat 使用单位矩阵,它不应该在前向和后向都像softmax loss一样吗?

如果有人能给我一些指点,将不胜感激。

【问题讨论】:

    标签: neural-network deep-learning caffe conv-neural-network


    【解决方案1】:

    您正确地观察到您为log(prob) 所做的缩放正是"InfogainLoss" 层所做的(您可以阅读更多关于它的信息herehere)。

    至于导数(back-prop):这一层计算的损失是

    L = - sum_j infogain_mat[label * dim + j] * log( prob(j) )
    

    如果您将此表达式与 prob(j)(这是该层的输入变量)区分,您会注意到 log(x) 的导数是 1/x,这就是您看到的原因

    dL/dprob(j) = - infogain_mat[label * dim + j] / prob(j) 
    

    现在,你为什么在 "SoftmaxWithLoss" 层的 back-prop 中没有看到类似的表达式?
    好吧,正如该层的名称所暗示的那样,它实际上是两层的组合:softmax 计算分类器输出的类概率在其之上的日志损失层。将这两层结合起来可以对梯度进行更数值稳健的估计。
    使用"InfogainLoss" 层我注意到有时prob(j) 的值可能非常小,导致梯度估计不稳定。

    这里是 "SoftmaxWithLoss""InfogainLoss" 层关于 原始 预测 (x) 的前向和后向传播的详细计算,而不是从这些预测使用 softmax 层。您可以使用这些方程创建一个"SoftmaxWithInfogainLoss" 层,该层在数值上比在 softmax 层上计算 infogain 损失更加稳健:

    PS,
    请注意,如果您要使用 infogain loss 进行称重,您应该为Hinfogain_mat)提供标签相似性,而不是距离。

    更新:
    我最近实现了这个强大的梯度计算并创建了this pull request。此 PR 于 2017 年 4 月合并到 master 分支。

    【讨论】:

    • 导数应该是dL/dprob(j) = - infogain_mat[label * dim + j] / prob(j)
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2016-08-01
    • 2015-09-14
    • 2015-11-19
    相关资源
    最近更新 更多