【发布时间】:2019-05-29 16:21:25
【问题描述】:
我正在尝试针对二元分类问题训练网络。 (这是一个卷积网络,使用 R 中的 keras 进行图像识别,具体来说是 kaggle 的人类蛋白质图像分类挑战赛,但我认为这里的细节并不重要。这发生在一个完全不同的问题上之前已经研究过文本数据和不同软件(Spark)的多分类问题,所以我会保持这个问题非常笼统。)
我的训练示例被标记为“0”和“1”。训练数据中的 0 多于 1。我训练的网络(同时使用二元交叉熵作为我的损失函数)不断复制基线分类器;也就是说,无论测试输入如何,始终预测“0”的分类器。
我一点也不奇怪为什么有时会发生这种情况。首先,有很多很多的网络配置可以重现这个分类器;例如,设计一个无论输入如何都始终输出“0”的网络并不难。其次,任何这样的配置无疑是损失函数的局部最小值,而找到损失函数的局部最小值正是我们要求这些神经网络做的事情。所以,我们很难责怪他们有时会在训练后提出这种“有点好的”配置。但是,这个问题一直困扰着我。
我的问题:这种“回归基线”是深度学习中的常见问题吗?有哪些“最佳实践”方法可以避免或解决它?
为了激发讨论,我会提到一些我已经想到的可能的行动方案,其中一些我已经尝试过(没有成功):
1) 增加网络复杂性(添加更多层、每层更多神经元、在卷积网络的情况下使用更多过滤器等)。这是显而易见的第一步;也许网络不够“智能”,即使经过最好的训练,也无法区分“0”和“1”,因此基线确实是你希望这个网络架构能够实现的最好的。
这个我试过了。我什至尝试了一个具有两个密集连接层和 4100 万个可训练参数的预训练卷积网络。结果相同。
2) 改变损失函数。我试过这个,它没有帮助。值得注意的是,当我使用 loss = binary_crossentropy 进行训练时(当您的指标是准确度时),它会为该指标生成基线分类器(预测所有“0”)。当我使用 loss = F1_score 进行训练时,它会为该指标生成基线分类器(预测所有“1”)。再说一遍,这件事显然在做它应该做的事情,找到一个好的局部最小值;这只是一个可怕的解决方案(显然)。
3) 重新训练整个过程(使用不同的随机初始配置)。我试过这个,但没有帮助;它不断复制基线。所以基线不只是因为运气不好而突然出现,它似乎无处不在。
4) 调整学习率。试过这个,没有运气。真的,没有理由期望这会有所帮助。如果它之前找到了基线,放慢学习率可能无助于“找到”它。
还有其他人遇到过这个问题吗?你是怎么处理的?
【问题讨论】:
-
你的班级有多不平衡?
-
不是很好,大约是 40/60 的分割。
标签: keras deep-learning classification