目录
目录
1、简介
最近学习代码,在打印loss和acc曲线的时候,发现了一些问题(val_loss先下降后上升,val_acc变化同val_loss。。。)。而正确的情况应该是:一个好的loss的定义应该使得模型在训练集上随着loss的下降accuracy渐渐提高
2、不同情况的分析
val_loss和val_acc一起上升
【loss和acc关系】
交叉熵是(负的)模型输出正确标签的似然度对数。和准确度有一定关系,但交叉熵的取值范围很大。有可能损失上升准确度也上升,毕竟准确度只是看预测概率最高的那个标签。准确度和交叉熵会出现以下情况:
- 如果正确标签的概率降低,但这个标签依然是概率最高的,会出现损失增加单准确度不变的结果。
- 如果数据集的标签很不平均,比如90%是类别A,那么模型一味增加预测A的比例,可能会让准确度上升,但loss可能也会以更大幅度上升(cross entropy的幅度可以很大)
- 如果模型非常自信,大多数正确标签的概率都接近1,那如果出现一个错误,准确率可能只会降低很少,但交叉熵可能会非常高。
- 模型在回答错误的example上过于自信,导致一个错误的loss拉高了所有正确的loss
【可能是样本分布有问题,而非过拟合】
假设一个二分类问题,对于一个样本,你的模型的输出的概率(0.6,0.4) vs (0.99, 0.01),假设正确的label是第一个,两者的accuracy是一样的,但是loss明显后者更小。
- loss上升,但是accuracy也跟着上升,这时候可能是你的模型对于某些label的输出的confidence降低,但是在其他label的预测上得到了补偿。这种情况下,我认为不属于overfitting,但是dev set的样本分布可能有skew,可以观察一下
验证集loss上升,准确率却上升该如何理解?+验证集精确度和损失同时上升
【验证集最高准确率出现在验证集loss下降后再上升的+区间内,这是怎样的一种情况?】
原因是过拟合或者训练验证数据分布不一致导致
- 过拟合:训练集过小,未包含验证集中所有情况,也就是过拟合导致的。
- 训练集验证集数据分布不一致:即在训练后期,预测的结果趋向于极端,使少数预测错的样本主导了loss,但同时少数样本不影响整体的验证acc情况。
- 应该就是验证集里一些hard case导致的。在训练阶段就关注hard case可能是一个思路,比如有答主提到的focal loss。
而解决这种现象可以尝试以下几种策略:
- 增加训练样本
- 增加正则项系数权重,减小过拟合
- 加入早停机制,ValLoss上升几个epoch直接停止
- 采用Focal Loss
- 加入Label Smoothing
不过个人感觉主要还是增加训练样本比较靠谱..而且不用太关心ValLoss,关注下ValAccuracy就好。