本文介绍PyTorch优化器相关的使用方法和trick。
PyTorch优化器官方文档:torch.optim — PyTorch 1.13 documentation
最近更新时间:2023.1.9
最早更新时间:2022.12.7
1. 优化器种类
- SGD
- Adam
2. 对不同的模型参数使用不同的优化策略
2.1 同一个模型实例,不同的模型参数
都使用Adam优化器,在同一个模型实例里,根据关键词筛选出不同的模型参数:
decoder_params=[]
for pname, p in model.named_parameters():
if 'key' in pname:
key_params += [p]
params_id = list(map(id, key_params))
optimizer=torch.optim.Adam([{"params":key_params,"lr":0.001},
{"params":list(filter(lambda p:id(p) not in params_id,model.parameters()))}],lr=0.0001)
另一种写法(参考https://github.com/DQ0408/R-former/blob/main/pretraining.py:
params = [(k, v) for k, v in model.named_parameters() if v.requires_grad]
non_bert_params = {'params': [v for k, v in params if not k.startswith('bert.')]}
bert_params = {'params': [v for k, v in params if k.startswith('bert.')], 'lr': 1e-5}
optimizer = torch.optim.Adam([non_bert_params, bert_params], lr=1e-5)
2.2 同时优化不同模型实例的参数
都使用Adam优化器,但是同时优化两个模型(如多模态场景中,分别对文本和图像进行嵌入,互相使用对方得到的中间数据)。在完成嵌入后,计算得到损失函数,可以通过一个优化器实现梯度更新
optimizer=torch.optim.Adam([{"params":text_encoder.parameters(),"lr":1e-5},{"params":picture_encoder.parameters()}],lr=1e-4)