Deep learning 使用huggingface transformers仅保存最佳权重

Deep learning 使用huggingface transformers仅保存最佳权重,deep-learning,nlp,pytorch,huggingface-transformers,Deep Learning,Nlp,Pytorch,Huggingface Transformers,目前,我正在使用huggingface transformers构建一个新的基于transformer的模型,其中的注意层与原来的不同。我使用run_glue.py在glue基准上检查我的模型的性能。然而,我发现huggingface transformers的培训师课程保存了我设置的所有检查点,我可以设置要保存的最大检查点数。然而,我只想在验证数据集上以最佳性能保存权重(或其他类似优化器的东西),而当前的培训师课程似乎没有提供这样的功能。(如果我们设置了检查点的最大数量,那么它将删除较旧的检查

目前,我正在使用huggingface transformers构建一个新的基于transformer的模型,其中的注意层与原来的不同。我使用
run_glue.py
在glue基准上检查我的模型的性能。然而,我发现huggingface transformers的培训师课程保存了我设置的所有检查点,我可以设置要保存的最大检查点数。然而,我只想在验证数据集上以最佳性能保存权重(或其他类似优化器的东西),而当前的培训师课程似乎没有提供这样的功能。(如果我们设置了检查点的最大数量,那么它将删除较旧的检查点,而不是性能较差的检查点),但是我不知道如何修改脚本并做我想做的事情。目前,我正在考虑创建一个自定义的Trainer类,继承原来的类并更改
train()
方法,如果有一种简单易行的方法来实现这一点,那就太好了。提前感谢。

如果您将当前验证精度与最佳验证精度进行比较,然后保存最佳模型,应该会有所帮助。

您可以从培训师的怀抱中尝试以下参数

training_args = TrainingArguments(
    output_dir='/content/drive/results',          # output directory
    do_predict= True, 
    num_train_epochs=3,              # total number of training epochs
    **per_device_train_batch_size=4,  # batch size per device during training
    per_device_eval_batch_size=2**,   # batch size for evaluation
    warmup_steps=1000,                # number of warmup steps for learning rate  
    save_steps=1000,
    save_total_limit=10,
    load_best_model_at_end= True,
    weight_decay=0.01,               # strength of weight decay
    logging_dir='./logs',            # directory for storing logs
    logging_steps=0, evaluate_during_training=True)
可能有更好的方法来避免过多的检查点并选择最佳模型。
到目前为止,您无法仅保存最佳模型,但您可以检查评估何时产生比前一个更好的结果。

我还没有看到任何相关参数。然而,有一个解决办法

使用以下组合

    evaluation_strategy =‘steps’,
    eval_steps = 10, # Evaluation and Save happens every 10 steps
    save_total_limit = 5, # Only last 5 models are saved. Older ones are deleted.
    load_best_model_at_end=True,

当我尝试使用上述组合时,在任何时候,5个以前的模型都会保存在输出目录中,但如果最好的模型不是其中之一,它也会保留最好的模型。因此将是1+5型号。您可以更改save_total_limit=1,这样就可以达到您的目的

请避免。如果您使用
load_best_model\u at_end=True
,则只需一点,而不是
save_steps
,显然,
save_total_limit
将被忽略