(已添加此问题的更新。)

我是比利时根特大学的研究生;我的研究是关于深度卷积神经网络的情感识别。我正在使用Caffe框架来实现CNN。

最近,我遇到了有关类(class)不平衡的问题。我使用的是9216个训练样本。 5%标记为正面(1),其余 sample 标记为负面(0)。

我正在使用SigmoidCrossEntropyLoss层来计算损失。训练时,即使经过几个纪元,损失也会减少,并且准确性非常高。这是由于不平衡造成的:网络仅总是预测负数(0)。 (精确度和召回率均为零,支持此主张)

为了解决这个问题,我想根据预测真相组合(严重惩罚假阴性)来扩展对损失的贡献。我的导师/教练还建议我在通过随机梯度下降(sgd)向后传播时,使用比例因子:该因子将与批次中的不平衡相关。仅包含阴性 sample 的批次根本不会更新重量。

我仅在Caffe中添加了一个定制层:报告其他指标,例如精度和召回率。我对Caffe代码的经验有限,但是我在编写C++代码方面有很多专业知识。

任何人都可以帮助我或为我指出正确的方向,如何调整SigmoidCrossEntropyLossSigmoid图层以适应以下更改:

  • 根据预测与真实的组合(真阳性,假阳性,真阴性,假阴性)调整样本对总损失的贡献。
  • 可以根据批次中的不平衡量(负数与正数)来缩放通过随机梯度下降执行的权重更新。

  • 提前致谢!

    更新资料

    我已经按照InfogainLossLayer
    的建议合并了 Shai。我还添加了另一个自定义层,该层基于当前批次中的不平衡量来构建信息增益矩阵H

    当前,矩阵配置如下:
    H(i, j) = 0          if i != j
    H(i, j) = 1 - f(i)   if i == j (with f(i) = the frequency of class i in the batch)
    

    我计划将来尝试对矩阵使用不同的配置。

    我已经在10:1的不平衡上进行了测试。结果表明,该网络正在学习有用的东西:(30个纪元后的结果)
  • 精度约为。 〜70%(从〜97%下降);
  • 精度约为。 〜20%(从0%上升);
  • 召回率约为。 〜60%(从0%上升)。

  • 这些数字在大约20个纪元时就达到了,此后没有明显变化。

    !!上述结果只是概念上的证明,它们是通过在10:1的不平衡数据集上训练简单网络而获得的。 !!

    最佳答案

    您为什么不使用InfogainLoss层来弥补训练集中的不平衡?
    使用权重矩阵H(在您的情况下为2×2)定义信息增益损失,其含义是

    [cost of predicting 1 when gt is 0,    cost of predicting 0 when gt is 0
     cost of predicting 1 when gt is 1,    cost of predicting 0 when gt is 1]
    
    因此,您可以设置H的条目以反射(reflect)预测0或1时错误之间的差异。
    您可以在this thread中找到如何为咖啡定义矩阵H
    关于样本权重,您可能会发现this post很有趣:它显示了如何修改 SoftmaxWithLoss 层以考虑样本权重。

    最近,Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár Focal Loss for Dense Object Detection, (ICCV 2017)提出了对交叉熵损失的修改。
    焦点损失背后的想法是,根据预测该示例的相对难度(而不是根据类(class)人数等)为每个示例分配不同的权重。从我开始尝试这种损失的短暂时间起,它感觉优于具有类大小权重的"InfogainLoss"

    08-19 20:17