2021-08-09

@[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项来使用?如果有看官对此有话说,请务必教教我呜呜呜我菜死了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值