解决阶级失衡问题:缩减对损失和sgd的贡献

Maa*_*lis 32 c++ machine-learning neural-network deep-learning caffe

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

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

最近我遇到了关于班级失衡的问题.我正在使用9216个训练样本,约 5%标记为阳性(1),其余样品标记为阴性(0).

我正在使用SigmoidCrossEntropyLoss图层来计算损失.在训练时,即使在几个时期之后,损失也会减少并且准确度非常高.这是由于不平衡:网络总是预测为负(0).(精确度和召回率均为零,支持此声明)

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

我只向Caffe添加了一个自定义图层:报告其他指标,如精度和召回.我对Caffe代码的经验有限,但我有很多编写C++代码的专业知识.


任何人都可以帮助我或指出我如何调整SigmoidCrossEntropyLossSigmoid层以适应以下变化:

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

提前致谢!


更新

按照Shai的建议加入了InfogainLossLayer.我还添加了另一个自定义层,H根据当前批次中的不平衡构建了infogain矩阵.

目前,矩阵配置如下:

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

我计划将来为矩阵试验不同的配置.

我已经用10:1的不平衡测试了这个.结果表明网络现在正在学习有用的东西:( 30个时期后的结果)

  • 准确度约为.~70%(低于~97%);
  • 精度约为 ~20%(从0%起);
  • 召回是约.~60%(从0%上调).

这些数字在大约20个时期达到,之后没有显着变化.

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

Sha*_*hai 20

为什么不使用InfogainLoss层来补偿训练集中的不平衡?

使用权重矩阵H(在您的情况下为2乘2)定义Infogain损失.其条目的含义是

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

因此,您可以设置条目H以反映预测0或1中的错误之间的差异.

您可以H此主题中找到如何为caffe 定义矩阵.

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


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