Neural network 根据“按比例计算损失值”;“坏”;咖啡馆
我想根据训练期间“当前预测”与“正确标签”之间的距离来缩放每个图像的损失值。例如,如果正确的标签是“猫”,而网络认为它是“狗”,那么惩罚(损失)应该比网络认为它是“车”的情况要小 我的做法如下: 1-我定义了标签之间距离的矩阵,Neural network 根据“按比例计算损失值”;“坏”;咖啡馆,neural-network,deep-learning,caffe,conv-neural-network,Neural Network,Deep Learning,Caffe,Conv Neural Network,我想根据训练期间“当前预测”与“正确标签”之间的距离来缩放每个图像的损失值。例如,如果正确的标签是“猫”,而网络认为它是“狗”,那么惩罚(损失)应该比网络认为它是“车”的情况要小 我的做法如下: 1-我定义了标签之间距离的矩阵, 2-将该矩阵作为底部传递到“softmaxWithLoss”层, 3-将每个日志(prob)乘以该值,以根据forward\u cpu中的不良情况缩放损失 但是,我不知道在backward\u cpu部分应该做什么。我知道梯度(底部差异)必须改变,但不太确定如何在这里合
2-将该矩阵作为底部传递到
“softmaxWithLoss”
层,3-将每个日志(prob)乘以该值,以根据
forward\u cpu中的不良情况缩放损失
但是,我不知道在backward\u cpu
部分应该做什么。我知道梯度(底部差异)必须改变,但不太确定如何在这里合并比例值。根据数学,我必须按比例缩放梯度(因为它只是一个比例),但不知道如何缩放
此外,如果我没有弄错的话,caffe中似乎有一个名为“InfoGainLoss”
的loosLayer,它的工作非常类似,但是该层的后面部分有点混乱:
bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j] / prob;
我不知道为什么infogain\u mat[]
被prob
除,而不是被乘!如果我对infogain\u mat
使用单位矩阵,它在向前和向后两个方向上的行为不应该像softmax loss一样吗
如果有人能给我一些建议,我将不胜感激。您正确地观察到您对日志(prob)
所做的缩放正是“InfogainLoss”
层所做的(您可以阅读更多关于它的信息,并了解更多)
至于导数(后支柱):该层计算的损失为
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”概率。您可以使用这些方程式创建一个比在softmax层上计算infogain损耗更具数值稳定性的“SoftmaxWithInfogainLoss”
层:
PS,
请注意,如果要使用infogain loss进行称重,则应使用标签相似性而不是距离来输入H
(infogain\u mat
)
更新:
我最近实现了这个健壮的梯度计算,并创建了一个。本请购单于2017年4月合并至master branch 导数应该是dL/dprob(j)=-infogain\u mat[label*dim+j]/prob(j)
。