解决班级不平衡问题:扩大对损失和sgd的贡献
c++
caffe
deep-learning
machine-learning
6
0

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

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

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

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

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

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


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

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

提前致谢!


更新资料

我已经按照Shai的建议合并了InfogainLossLayer 。我还添加了另一个自定义层,该层基于当前批次中的不平衡量来构建信息增益矩阵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的不平衡数据集上训练简单网络而获得的。 !!

参考资料:
Stack Overflow
收藏
评论
共 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的条目以反映预测0或1时误差之间的差异。

您可以在此线程中找到如何为caffe定义矩阵H

关于样本权重,您可能会发现这篇文章很有趣:它显示了如何修改SoftmaxWithLoss图层以考虑样本权重。


最近, 林宗义,Priya Goyal,Ross Girshick,Hekaiming He,PiotrDollár 致密物体检测的焦点损失 (ICCV 2017)提出了对交叉熵损失的修改。
焦点损失背后的想法是,根据预测该示例的相对难度(而不是根据班级人数等)为每个示例分配不同的权重。从我开始尝试这种损失的短暂时间起,它感觉优于具有类大小权重的"InfogainLoss"

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号