2016-01-20 29 views
7

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

,我做的方式是如下:

1-我所定义的标记物之间的距离的矩阵,
2-通该矩阵作为一个底部到"softmaxWithLoss"层,
3-乘以每个日志(概率),以此值按比例缩放损失forward_cpu

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

而且,好像有loosLayer在朱古力称为"InfoGainLoss"如果我没有记错的话,做非常类似的工作,然而,这层的向后部分是有点混乱:

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

我不知道为什么infogain_mat[]除以prob而不是乘以!如果我使用身份矩阵infogain_mat是不是应该像softmax在向前和向后方面的损失一样?

如果有人能给我一些建议,我们将非常感谢。

回答

6

你在观察,你正在做的log(prob)缩放正是"InfogainLoss"层是做正确的(你可以阅读更多关于它herehere)。

至于衍生物(背面丙):由该层中计算出的损失是

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"层的背托类似的表达?
好吧,因为该图层的名称表明它实际上是两层的组合:softmax用于计算来自分类器的类概率输出在其之上的对数损失层。结合这两层可以对梯度进行更加数字稳健的估计。
"InfogainLoss"工作一点点我注意到,有时prob(j)可能有一个非常小的值,导致不稳定的梯度估计。

下面是"SoftmaxWithLoss""InfogainLoss"层前后通行证相对于所述原料预测x),而不是从用Softmax层这些预测导出的“SOFTMAX”概率的详细计算。您可以使用这些方程来创建一个"SoftmaxWithInfogainLoss"层比上一SOFTMAX层顶部计算infogain损失数值上更稳固:

enter image description here

PS,
请注意,如果你要使用infogain损失称重时,应喂Hinfogain_mat)与标签相似,而不是距离。

更新:
最近我实现了这个强大的梯度计算和创建this pull request。该公关合并到2017年4月的主分公司。

+1

衍生产品应该是'dL/dprob(j)= - infogain_mat [label * dim + j]/prob(j)'。 – nn0p

+0

@ nn0p嗯...谢谢! – Shai