pytorch optim灵活传参

有时候训练模型肯定是需要optim对吧,但是很多情况下,我一个模型,有encoder,有dense等等不同层构成的,而每一层、每一种模型我都想要用不同的学习率,该怎么办?

torch.optim就给我们提供了一个很好的接口,先看看doc:
在这里插入图片描述
比方说这是Adam的参数要求,后面这些lr、beta、weight_decay啥的先不去看他,就先看params这个参数:
params:iterable of parameters to optimize or dicts defining parameter groups
需要被优化的可迭代模型参数对象或者一个定义了所有parameter groups的dict

也就是params不仅可以传model.parameters(),还可以传一个字典,这就可以让我们很灵活地设置参数了,比方说像这样:

params = []
for name, param in self._encoder.named_parameters():
    if param.requires_grad == True:
        if "weight" in name:
            params += [{"params": param, "lr": self._learning_rate, "weight_decay": self._weight_decay}]
        elif "bias" in name:
            params += [{"params": param, "lr": self._learning_rate}]
params += [{"params": list(dense_layer.parameters())[0], "lr": self._learning_rate * 10,
            "weight_decay": self._weight_decay}]
params += [{"params": list(dense_layer.parameters())[1], "lr": self._learning_rate * 10}]
# each task has it's own optimizer
optimizer = Adam(params)

可以看到我设置所有weight有weight_decay,而bias的为0。同时,我的dense层lr是encoder层的10倍。然后把这个dict,也就是parameter groups传给了Adam.

或者再pythonic点吧,和上面的写法一样的效果:

named_params = {name:param for name,param in self.named_parameters() if param.requires_grad == True}
no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
params = []
params += [{"params":[p for n,p in named_params.items() if not any([nd in n for nd in no_decay])],"weight_decay":0.01}]
params += [{"params":[p for n, p in named_params.items() if any(nd in n for nd in no_decay)],"weight_decay":0.0}]

optimizer = Adam(params)
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值