(已添加对此问题的更新。)
我是比利时根特大学的研究生;我的研究是关于深度卷积神经网络的情感识别。我正在使用Caffe实施 CNN 的框架。
最近我遇到了一个关于班级不平衡的问题。我正在使用大约 9216 个训练样本。 5% 被标记为阳性 (1),其余样本被标记为阴性 (0)。
我正在使用S形交叉熵损失层来计算损失。训练时,即使经过几个时期,损失也会减少,并且准确率极高。这是由于不平衡造成的:网络总是预测负数 (0)。(准确率和召回率均为零,支持这一说法)
为了解决这个问题,我想根据预测与真实的组合调整对损失的贡献(严厉惩罚假阴性)。我的导师/教练也建议我反向传播时使用比例因子通过随机梯度下降(sgd):该因子将与批次中的不平衡性相关。仅包含负样本的批次根本不会更新权重。
我只向 Caffe 添加了一个定制层:报告其他指标,例如精确度和召回率。我对 Caffe 代码的经验有限,但我在编写 C++ 代码方面拥有丰富的专业知识。
谁能帮助我或为我指出如何调整的正确方向S形交叉熵损失 and Sigmoid层以适应以下更改:
- 根据预测-真值组合(真阳性、假阳性、真阴性、假阴性)调整样本对总损失的贡献。
- 根据批次中的不平衡性(负数与正数)缩放由随机梯度下降执行的权重更新。
提前致谢!
Update
我已经合并了信息增益损失层正如建议的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个epoch后的结果)
- 准确度约为。 〜70%(低于〜97%);
- 精度约为。 ~20%(从 0% 上升);
- 召回率约为~60%(从 0% 上升)。
这些数字在 20 个 epoch 左右达到,此后没有显着变化。
!!上述结果只是概念证明,它们是通过在 10:1 不平衡数据集上训练简单网络获得的。 !!