模型不收敛——转载
总结一些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不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
————————————————
版权声明:本文为CSDN博主「print_lzp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/print_lzp/article/details/121139876
趁着还在训练,我总结一下可能导致 神经网络不收敛的原因:
1、理论上就不收敛,也就是说你设计的网络本身就存在问题,这也是首先应该考虑的因素:
1) 梯度是否存在,即反向传播有没有断裂;
2、如果确认你的网络应该没有问题,那也就是在假设理论上是收敛的:
1) 学习率设置不合理(大多数情况),学习率设置太大,会造成不收敛,如果太小,会造成收敛速度非常慢;
2) Batchsize太大,陷入到局部最优,无法达到全局最优,故而无法继续收敛;
3) 网络容量,浅层网络完成复杂的任务loss不下降是肯定的,网络设计太简单,一般情况下,网络的层数和节点数量越大,拟合能力就越强,如果层数和节点不够多,无法拟合复杂的情况,也会造成不收敛。
作者:是个可爱的男孩子
链接:https://www.jianshu.com/p/31e295bfe26d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
之前训练网络时,会先编写学习率随训练epoch的增加而逐渐减低的函数,然后选取一个相对较大的学习率(一般从e-2量级开始),选取一个epoch能够接受的batchsize,如果loss稳定下降较快,则开始训练.从未体验过学习率和batchsize搭配之难.
最近新看了一篇论文ABCNN(有空再细讲),采用开源的tensorflow工程训练一下,效果很好,因工程需要,开始将其移植到pytorch框架下,移植完毕后,关于loss函数遇到不少问题,在此记录.
1.学习率随epoch降低的函数
def adjust_learning_rate(learning_rate, learning_rate_decay, optimizer, epoch):
"""Sets the learning rate to the initial LR multiplied by learning_rate_decay(set 0.98, usually) every epoch"""
learning_rate = learning_rate * (learning_rate_decay ** epoch)
for param_group in optimizer.param_groups:
param_group['lr'] = learning_rate
return learning_rate
1
2
3
4
5
6
7
8
2.loss变nan
现象:loss进行一次反传后,loss变nan;
排查顺序:
训练数据(包括label)中有无异常值(nan, inf等);
网络中有无除法,确保分母不会出现0, 分母可以加一个eps=1e-8;
网络中有无开根号(torch.sqrt), 保证根号下>=0, 我的程序即是由此引起的(未保证不出现0或者极小正值的情况),解决也是加一个eps=1e-8.
3.loss不收敛
此处包含两种情况,一种是loss一直在震荡,一种是loss下降一点后不再下降到理想水平,而验证集上的表现保持不变.
1.保持需要的batchsize不变;
2.查看是否有梯度回传,查看代码如下:
for name, parms in model.named_parameters():
print('-->name:', name, '-->grad_requirs:', parms.requires_grad, '--weight', torch.mean(parms.data), ' -->grad_value:', torch.mean(parms.grad))
1
2
3.查看数据是否有问题,如标签错乱等现象;
4.调节学习率,从大向小调,建议每次除以5;我的项目即是因为学习率过大过小都不收敛引起的;
5.如果学习率调好后,需要调节batchsize大小,如batchsize调大2倍,则将学习率对应调大(项目测试调大2~3倍OK),反之,学习率对应调小
————————————————
版权声明:本文为CSDN博主「勤劳的凌菲」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Suan2014/article/details/103157226
本文来自博客园,作者:编程coding小白,转载请注明原文链接:https://www.cnblogs.com/zhenhua1203/p/15895007.html