【问题标题】:Save only best weights with huggingface transformers使用拥抱面变压器只保存最佳重量
【发布时间】:2020-10-12 23:29:36
【问题描述】:

目前,我正在构建一个新的基于 Transformer 的模型,其中包含抱脸变压器,其中注意力层与原来的不同。我使用run_glue.py 来检查我的模型在 GLUE 基准测试中的性能。但是,我发现Huggingface-transformers的Trainer类保存了我设置的所有检查点,我可以在其中设置要保存的最大检查点数。但是,我只想在验证数据集上保存具有 best 性能的权重(或其他东西,如优化器),而当前的 Trainer 类似乎没有提供这样的东西。 (如果我们设置检查点的最大数量,那么它会删除旧的检查点,而不是性能较差的检查点)。 Someone already asked about same question on Github,但我不知道如何修改脚本并做我想做的事。目前,我正在考虑制作一个自定义 Trainer 类,它继承原始类并更改 train() 方法,如果有一种简单易行的方法来做到这一点,那就太好了。提前致谢。

【问题讨论】:

    标签: deep-learning nlp pytorch huggingface-transformers


    【解决方案1】:

    你可以在拥抱脸的训练师那里尝试以下参数

    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)
    

    可能有更好的方法来避免过多的检查点并选择最佳模型。 到目前为止,您不能只保存最佳模型,而是检查评估何时产生比前一个更好的结果。

    【讨论】:

    • 只有一点,如果你使用load_best_model_at_end = True,那么save_stepssave_total_limit 显然会被忽略
    【解决方案2】:

    我还没有看到任何参数。但是,有一个解决方法。

    使用以下组合

        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 以达到您的目的

    【讨论】:

      【解决方案3】:

      This 回答可能有用

      training_args = TrainingArguments(
          output_dir=repo_name,
          group_by_length=True,
          length_column_name='input_length',
          per_device_train_batch_size=24,
          gradient_accumulation_steps=2,
          evaluation_strategy="steps",
          num_train_epochs=20,
          fp16=True,
          save_steps=1000,
          save_strategy='steps', # we cannot set it to "no". Otherwise, the model cannot guess the best checkpoint.
          eval_steps=1000,
          logging_steps=1000,
          learning_rate=5e-5,
          warmup_steps=500,
          save_total_limit=3,
          load_best_model_at_end = True # this will let the model save the best checkpoint
      )
      

      【讨论】:

        【解决方案4】:

        This 应该有助于您将当前验证准确度与最佳验证准确度进行比较,然后保存最佳模型。

        【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2022-06-28
        • 2021-01-10
        • 2020-06-17
        • 1970-01-01
        • 2021-09-15
        • 2020-07-22
        • 2020-07-05
        • 2021-11-24
        相关资源
        最近更新 更多