描述
最近做项目出现过拟合的情况,具体表现为,使用简单模型的时候需要迭代十几个epoch之后才能达到一个理想的结果,并且之后loss趋于稳定,f1也趋于稳定;后来使用复杂的模型后,两三个epoch后能达到更好的结果但是之后随着loss下降f1值反而下降了。这是一个比较明显的的过拟合现象。
解决方案
对于深度学习网络的过拟合,一般的解决方案有:
1.Early stop
在模型训练过程中,提前终止。这里可以根据具体指标设置early stop的条件,比如可以是loss的大小,或者acc/f1等值的epoch之间的大小对比。
2.More data
用更多的数据集。增加样本也是一种解决方案,根据不同场景和数据有不同的数据增强方法。
3.正则化
常用的有L1、L2正则化
4.Droup Out
以一定的概率使某些神经元停止工作
5.BatchNorm
对神经元作归一化
实现
这里主要讲述一下在pytorch中的过拟合解决方案,early stop和more data都是对于特定的任务去进行的,不同的任务有不同的解决方案,这里不做进一步说明。在pytorch框架下后面几种解决方案是有统一的结构或者解决办法的,这里一一道来。
1.正则化
torch.optim集成了很多优化器,如SGD,Adadelta,Adam,Adagrad,RMSprop等,这些优化器中有一个参数weight_decay,用于指定权值衰减率,相当于L2正则化中的λ参数,注意torch.optim集成的优化器只有L2正则化方法,api中参数weight_decay 的解析是:weight_decay (float, optional): weight decay (L2 penalty) (default: 0),这里可以看出其weight_decay就是正则化项的作用。可以如下设置L2正则化:
optimizer