当前位置:   article > 正文

BERT预训练模型微调_optimizer.pt

optimizer.pt

预训练模型微调:

最近预训练了BertForMaskedLM模型,需要将训练好的模型用到分类任务BertForSequenceClassification中进行微调。
微调时发现在加载优化器状态的时候出现如下的问题:

optimizer.load_state_dict(torch.load(os.path.join(args.model_name_or_path, "optimizer.pt")))
  File "/var/lib/docker/lib/python3.8/site-packages/torch/optim/optimizer.py", line 145, in load_state_dict
    raise ValueError("loaded state dict contains a parameter group "
ValueError: loaded state dict contains a parameter group that doesn't match the size of optimizer's group
  • 1
  • 2
  • 3
  • 4

原因分析:

问题在于optimizer的参数组和从文件optimizer.pt中加载的优化器状态包含的参数不一致。optimizer.pt是预训练模型保存的结果,而此时我的优化器已经

1. 检查模型的参数组

model_param_list = [p[0] for p in model.named_parameters()]
print(model_param_list)
# 打印内容中包括 'classifier.weight', 'classifier.bias' 这两个分类器需要的参数组
  • 1
  • 2
  • 3

2. 查看优化器

当前的模型是BertForSequenceClassification,参数与预训练模型不一致,而此时去加载BertForMaskedLM结果的optimizer.pt,必然会导致优化器不一致的问题。因此对优化器状态自定义,如下:

no_decay = ["bias", "LayerNorm.weight"]
optimizer_grouped_parameters = [
    {"params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], "weight_decay": args.weight_decay},
    {"params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], "weight_decay": 0.0},
]
  • 1
  • 2
  • 3
  • 4
  • 5

可以使用optimizer.state_dict()查看此时的优化器状态

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/342568
推荐阅读
相关标签
  

闽ICP备14008679号