总结一些loss不收敛的解决方法
经常遇到的两种情况:
- loss一直在震荡
- loss下降一点后不再下降到理想水平,而验证集上的表现保持不变。
解决办法:
- 保持需要的batchsize不变,或考虑调整batch size大小
- 查看是否有梯度回传。
- 查看数据是否有问题,如标签错乱,归一化等。
- 调节学习率,从大向小调,每次除以5或者10
- 如果学习率调好后,需要调节batchsize大小,如batchsize调大2倍,则将学习率对应调大,反之,学习率对应调小。
- 权重初始化方案(全零初始化、随机正态分布初始化和随机均匀分布初始化等)
- 正则化过度(当训练集loss下不来时,就要考虑一下是不是正则化过度,导致模型欠拟合了。一般在刚开始是不需要加正则化的,过拟合后,再根据训练情况进行调整。)
- 激活函数、损失函数
- 训练时间不足,网络比较大的时候,孪生网络,容易出现收敛缓慢,要多训练一段时间看看loss收敛情况
知乎上的总结:
train loss 不断下降,test loss不断下降,说明网络仍在学习;
train loss 不断下降,test loss趋于不变,说明网络过拟合;
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
参考:
[1]: https://zhuanlan.zhihu.com/p/36369878
[2]: https://blog.ailemon.me/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/
[3]: https://blog.csdn.net/Suan2014/article/details/103157226
[4]: https://zhuanlan.zhihu.com/p/136786657 几种loss出问题的情况
[5]:https://www.cnblogs.com/XDU-Lakers/p/10557496.html 关于激活函数