神经网络 – 根据caffe中的“坏”来衡量损失值

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

我正在做的方式如下:

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

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

此外,似乎在caffe中有loosLayer称为“InfoGainLoss”,如果我没有弄错的话,它的工作非常相似,但是这一层的后面部分有点令人困惑:

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

我不确定为什么infogain_mat []除以概率而不是乘以!如果我对infogain_mat使用单位矩阵,它是否应该像前向和后向的softmax损失一样?

如果有人能给我一些指示,我们将不胜感激.

你是正确的观察到你为日志(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)的值很小,导致梯度估计不稳定.

这里是关于原始预测(x)的“SoftmaxWithLoss”和“InfogainLoss”层的前向和后向通道的详细计算,而不是使用softmax层从这些预测得出的“softmax”概率.您可以使用这些方程式创建一个“SoftmaxWithInfogainLoss”图层,它比在softmax图层上计算信息损失更具数值稳健性:

enter image description here

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

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

相关文章
相关标签/搜索