gpt4 book ai didi

c++ - 解决类不平衡 : scaling contribution to loss and sgd

转载 作者:IT老高 更新时间:2023-10-28 12:39:44 24 4
gpt4 key购买 nike

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

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

最近我遇到了一个关于类(class)不平衡的问题。我正在使用大约 9216 个训练样本。 5% 标记为阳性 (1),其余样本标记为阴性 (0)。

我正在使用 SigmoidCrossEntropyLoss层来计算损失。训练时,即使经过几个 epoch,损失也会减少,准确率非常高。这是由于不平衡造成的:网络总是简单地预测负数(0)。 (准确率和召回率都为零,支持这一说法)

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

我只为 Caffe 添加了一个定制层:用于报告其他指标,例如准确率和召回率。我对 Caffe 代码的经验有限,但我在编写 C++ 代码方面拥有丰富的专业知识。


任何人都可以帮助我或为我指出如何调整 SigmoidCrossEntropyLoss 的正确方向和 Sigmoid层以适应以下变化:

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

提前致谢!


更新

我已经合并了 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 epochs 后的结果)

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

这些数字是在大约 20 个 epoch 时达到的,之后没有显着变化。

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

最佳答案

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

Infogain 损失是使用权重矩阵 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 中找到如何为 caffe 定义矩阵 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"

关于c++ - 解决类不平衡 : scaling contribution to loss and sgd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com