2021-08-09

  • Post author:
  • Post category:其他


@[TOC]pytorch中优化器weight_decay属性(正则化项)对模型训练的影响



pytorch中优化器weight_decay属性(正则化项)对模型训练的影响

这几天在跑一个CNN的时候,本来跑得好好的,有一天突然莫名的出现loss居高不下,准确率也上不来的情况。我很无语,找了半天都没找到原因,检查了很久,最终发现问题是在优化器optimizer上

原本的优化器是:

# 只是一个非常普通的随机梯度下降(SGD)优化器
optimizer = torch.optim.SGD(model.parameters(), lr=args.LR)

由于模型有一些过拟合(overfitting),我按照别人博客上的方法,给优化器增加了weight_decay属性,用它来起到正则化项(regularization或penalty loss)的作用。于是代码变成了:

# 只是一个非常普通的随机梯度下降(SGD)优化器
optimizer = torch.optim.SGD(model.parameters(), lr=args.LR, weight_decay=0.1)

加了这个属性后,会对所有模型参数θ进行惩罚(相当于penalty loss),weight_decay越大,惩罚越高。所以模型倾向于有更小的参数,根据奥卡姆剃刀原理,这有利于防止过拟合。但是在实验中我发现,weight_decay太大会让模型模型欠拟合,反倒不利于模型获得更好的效果。

于是我用相同的模型,使用不同的weight_decay参数,进行了四次实验,结果如下:

λ代表weight_decay的值

图中λ代表weight_decay的值,可以得出结论,λ越大,收敛时的损失越大,模型效果越差。并且这个weight_decay并没有减少过拟合情况(绿色的验证集曲线在训练后期仍旧缓缓下降)所以在我这个模型里这个参数没有起到任何正面作用,反而让模型更垃圾。

综上,大家在用weight_decay时要慎重,即使使用,也要小心的调参,不然可能让训练效果大打折扣。但是我也一直有一个疑问,正则化项在pytorch到底该如何实现,是不是这个weight_decay还不能等同于L2项来使用?如果有看官对此有话说,请务必教教我呜呜呜我菜死了。



版权声明:本文为LCDcompiler原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。