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损失一样?
如果有人能给我一些指示,我们将不胜感激.
你是正确的观察到你正在做的缩放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月合并为主分公司.