根据caffe中的"badness"来计算损失值

Moe*_*Moe 7 neural-network deep-learning caffe conv-neural-network

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

我正在做的方式如下:

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;
Run Code Online (Sandbox Code Playgroud)

我不确定为什么infogain_mat[]要分开prob而不是乘以!如果我使用单位矩阵infogain_mat是不是它应该像前向和后向的softmax损失一样?

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

Sha*_*hai 6

你是正确的观察到你正在做的缩放log(prob)正是"InfogainLoss"层正在做的事情(你可以在这里这里阅读更多关于它的内容).

至于导数(反支柱):由该层计算的损失是

L = - sum_j infogain_mat[label * dim + j] * log( prob(j) )
Run Code Online (Sandbox Code Playgroud)

如果你将这个表达式与prob(j)(这是该层的输入变量)区分开来,你会发现导数log(x)1/x这就是你看到它的原因

dL/dprob(j) = - infogain_mat[label * dim + j] / prob(j) 
Run Code Online (Sandbox Code Playgroud)

现在,为什么你不在"SoftmaxWithLoss"层的后支柱中看到类似的表达式?
以及,作为该层的名称所暗示的,它实际上是两个层的组合:SOFTMAX从分类器输出计算类的概率在它的上面日志损耗层.组合这两个层使得能够在数值上更稳健地估计梯度.
使用"InfogainLoss"层稍微工作时我注意到有时prob(j)可能会有非常小的值导致不稳定的梯度估计.

下面是向前和向后传递的详细计算"SoftmaxWithLoss""InfogainLoss"层相对于所述原始预测(x),而不是从用Softmax层这些预测导出的"SOFTMAX"概率.您可以使用这些方程式创建一个"SoftmaxWithInfogainLoss"比在softmax图层上计算infogain损失更具数值稳健性的图层:

在此输入图像描述

PS,
请注意,如果你要使用的称重infogain损失,您应该喂H(中infogain_mat)与标签相似,而不是距离.

更新:
我最近实现了这种强大的梯度计算并创建了这个拉取请求.该公关于2017年4月合并为主分公司.