Bootstrap

【模型训练】loss和accuracy变化的调整方向

 

序言

  • 模型训练过程中,loss和accuracy不同的变化趋势是什么原因,如何调整

对loss和accuracy的理解

  • loss可以很大,但accuracy只能是0~1
  • loss评价模型的训练程度,accuracy评价模型的好坏
  • loss是给模型看的,用来优化参数实现梯度下降,accuracy是给人看的,用来衡量网络好坏的指标,同样的 P/R/F1等也都是给人看的
  • 模型的好坏,loss函数定义的好坏,最终都要体现在accuracy上,评估应该主要看accuracy

1. 验证loss先减小后增大,验证acc先上升后下降

  • 训练loss一直下降,训练accuracy一直上升,而验证loss先减小后增大,验证acc先上升后下降

  • 可能原因:这种情况可能是训练集和验证集数据分布不一样,或者训练集过小,未包含验证集中的所有情况。也就是过拟合

    • 即对已知数据预测很好,表现为训练loss不断减小训练acc不断提升,但是验证loss先减小后增大,验证acc也先上升后下降
    • 模型开始学习仅和训练数据有关的模式,而不是学习到了数据本质特征
  • 应对方法:即如何应对过拟合

    • (优先)调整学习率:使用学习率衰减机制,避免陷入局部最优无法进一步减小loss
    • (优先)增加训练样本
    • (优先)调整超参:如batch_size,分类阈值,hidden_size也可以调整
    • (其次)加入early stop:验证loss上升的几个epoch直接停止,侧重验证acc上升即可
    • (其次)增加正则项系数权重,减小过拟合
    • (其次)dropout随机失活:随机失活使得每次更新梯度时参与计算的网络参数减小了,降低了模型容量,所以能防止过拟合
    • (其次)交叉验证:将数据划分为几个子集,使用不同的子集进行训练和验证,以评估模型的泛化能力选择最佳模型
    • (其次)采用focal loss:增加困难样本权重,使模型专注于难分类的样本

2. 验证loss先减小后增大,验证acc先上升后不变

  • 同上,大概率还是过拟合
  • 应对方法:同上,首选调整学习率和增加训练样本,其他的超参如batch_size,分类阈值等也可以调整

3. 训练loss无法进一步下降

  • 增大数据量后(非全量数据),loss无法进一步下降,accuracy无法进一步上升

  • 训练loss无法进一步下降的可能原因:

    • 模型结构和特征工程存在问题:对数据拟合不足。通常可以参考论文设计好的模型进行适应性修改,以更快完成任务
    • 权重初始化方案有问题:最好是参考相关文献,常用可以全零初始化、正态分布初始化、随机均匀分布初始化,建议直接使用xaiver normal或者he normal
    • 正则化过度了:L1/L2正则化和dropout随机失活是防止过拟合用的,一般上来不需要加正则化,过拟合后再根据训练情况调整,否则难以确定模型结构是否正确,调试起来也更加困难
    • 激活和损失函数选择不合理:CNN一般使用ReLU,RNN/LSTM一般使用tanh或ReLU,FC也多使用ReLU,分类任务输出层使用Sigmoid或者softmax这种激活函数;分类任务通常使用交叉熵CE损失函数,回归任务使用均方误差MSE等
    • 优化器或者学习率原因:神经网络一般使用Adam,如果难以训练就选择SGD。学习率一般自动调整,刚开始可以比较大,趋于收敛时应选择较小的学习率来找到更好的最优点,学习率一般 * 10或 / 10来自动调整,也可以使用学习率自动衰减等方式
    • batch_size原因:batch_size过小,模型后期可能摇摆不定难以收敛;而过大的batch_size,前期由于梯度平均导致收敛过慢。一般batch_size选取32或者16,为了充分利用并行计算和分布式资源,也可以使用较大的batch_size如64或者128
    • 训练时间不足:如果无法使用硬件加速的话,就等
    • 数据集未打乱:不打乱数据集可能导致网络学习过程中产生一些偏见,比如总是一起出现的数据,张三和李四同时出现在一批数据中,看到张三就想到李四。那么在梯度更新时可能总是进行张三和李四的梯度平均导致出现梯度走向固定,数据打乱后梯度的走向更加丰富,也能更好的学习到数据集上最有用的隐含特征
    • 数据集有问题:噪声过大或者标注错误等,比如标注既有1+1=2,也有1+1=3,;或者数据不均衡,类别不均,较少类别信息不足等,难以学习到本质特征
    • 未进行归一化:量级比较大的数据可能权重较大,会导致误差变大,模型摇摆不定,可通过归一化前后对比排查该原因;
      • 收敛速度变慢:特征未进行归一化,每次更新时可能以较小的数据进行梯度更新,迭代器在每次迭代时需要更长的时间来找到优化的方向;
      • 梯度消失或梯度爆炸:特征数据范围过大或者过小,可能导致神经元输出饱和,进而引起梯度消失或爆炸问题
      • 参数初始化问题:参数初始化可能与数据分布不匹配,导致上来就陷入局部最优解或无法收敛
      • 影响正则化效果:输入数据尺度不同,正则化对不同特征的影响也会不同,可能导致正则化效果不佳
    • 特征工程中对数据特征选取有问题:数据特征选择不合理会像标注错误一样使得网络难以学习到数据的本质特征;也可能是选择的特征不够,现有特征只能支持模型学到当前的loss和accurancy
    • 模型训练碰到瓶颈:这里的瓶颈一般包括 - 梯度消失、大量神经元失活、梯度爆炸和弥散、学习率过大或过小等
      • 梯度消失时:模型的loss难以下降,就像走在高原上,几乎任何地方都是高海拔。可以通过梯度的检验来验证模型当前所处的状态。有时梯度的更新和反向传播代码存在bug时,也会有这样的问题
      • 神经元失活:使用ReLU激活函数,输入为负输出恒为0,导致失活,梯度为0;可使用LeakyReLU,Y轴左边图线会有一个很小的正梯度,使得神经网络在一定时间后可以得到恢复,不过LeakyReLU并不常用,这种失活的特性可以很好地忽略掉卷积核输出为负相关信息的情况,同时保留相关信息
      • 梯度爆炸/弥散:梯度爆炸的根本原因,根据链式法则,深度学习中的梯度在逐层累积,如1.1的n次方无穷大,0.9的n次方无穷小。网络中某些层过大的输出也会造成梯度爆炸,此时应该为该输出取一个上界,可用最大范数约束

4. 验证loss无法进一步下降

  • 如果训练集的loss也不下降:问题主要在训练集loss上,参考上述原因
  • 如果训练集的loss正常下降,但是验证集loss已经不降了,说明已经出现了过拟合,可能的原因:
    • 训练集和验证集数据分布不一样
    • 模型过于复杂:比如隐藏层层数太多、参数过多等,模型可能过度拟合数据
    • 训练数据量不够:不适用于这里,因为已经增加了足够的数据量
    • 学习率设置不当:过大可能无法收敛,过小可能收敛过慢也可能陷入局部最优
  • 应对方法:如章节1中所示,过拟合的应对方法

5. 验证loss一直在下降,验证accuracy不再进一步上升

  • 首先说明模型的泛化能力是没有问题的,在准确率达到一定程度后,loss在不断减小
  • 这个时候可以结合其他评估指标一起衡量模型好坏,比如PR/F1分数/ROC/AUC
  • 如果训练loss也不下降,只是验证loss在下降,那说明数据集有问题,需要检查数据集

6. 训练和验证loss都不断上升

  • 可能的原因和应对方法:
    • 网络结构设计不合理:模型复杂度不足等,比如层数或神经元太少,无法捕捉数据中的复杂模式。需要增加模型复杂度
    • 学习率设置过高:训练过程中权重更新过大,使得模型在每次迭代后都不能很好地拟合数据,损失函数值上升。这种情况可降低学习率,使用学习率衰减机制等
    • 数据本身有问题:清洗数据,保证数据分布合理
      • 数据质量差:大量噪声或错误标签等,无法学到有用信息
      • 数据分布差异:训练集和验证集/测试集数据分布显著差异
      • 数据太少等
    • 损失函数选择不当正则化过度等:损失函数可能不适合于当前任务,过度正则化则会欠拟合,使得训练和验证损失都上升。可尝试不同的优化器、损失函数、调整正则化参数等
    • 代码实现错误:可能训练代码存在问题,比如数据加载错误、模型结构错误、损失值计算错误等,需要仔细检查

7. loss变化情况总结

  • train loss不断下降,valid loss不断下降,说明网络仍在学习
  • train loss不断下降,valid loss趋于不变,说明网络过拟合。如章节1和章节2中所示
  • train loss趋于不变,valid loss不断下降,说明数据集100%有问题。如章节5中所示
  • train loss趋于不变,valid/test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或batch_size等。如章节3和章节4中所示
  • train loss不断上升,valid/test loss不断上升,说明网络结构设计不合理,训练超参设置不当,数据集未经过清洗等问题。如章节6中所示

 


 
创作不易,如有帮助,请 点赞 收藏 支持
 


 

[参考文章]

[1]. loss和acc不变时什么原因
[2]. 验证loss不下降,验证acc不断上升
[3]. loss和acc的关系
[4]. 验证loss上升,acc也上升
[5]. 过拟合 欠拟合
[6]. 验证loss下降但acc不再上升
[7]. loss下降,acc不变
[8]. loss变化分析,loss不下降的解决办法
[9]. loss不下降,acc很低
[10]. loss和acc不变

created by shuaixio, 2024.05.19

;