Bert Trainer 实例中的提前停止

sou*_*uth 26 python neural-network deep-learning huggingface-transformers huggingface

我正在针对多类分类任务微调 BERT 模型。我的问题是我不知道如何向这些 Trainer 实例添加“提前停止”。有任何想法吗?

Tim*_*lin 60

在正确使用EarlyStoppingCallback().

from transformers import EarlyStoppingCallback, IntervalStrategy
...
...
# Defining the TrainingArguments() arguments
args = TrainingArguments(
   f"training_with_callbacks",
   evaluation_strategy = IntervalStrategy.STEPS, # "steps"
   eval_steps = 50, # Evaluation and Save happens every 50 steps
   save_total_limit = 5, # Only last 5 models are saved. Older ones are deleted.
   learning_rate=2e-5,
   per_device_train_batch_size=batch_size,
   per_device_eval_batch_size=batch_size,
   num_train_epochs=5,
   weight_decay=0.01,
   push_to_hub=False,
   metric_for_best_model = 'f1',
   load_best_model_at_end=True)
Run Code Online (Sandbox Code Playgroud)

你需要:

  1. 使用load_best_model_at_end = True(EarlyStoppingCallback()要求这是True)。
  2. evaluation_strategy='steps'IntervalStrategy.STEPS代替'epoch'.
  3. eval_steps = 50(评估之后的指标N steps)。
  4. metric_for_best_model = 'f1'

在你的Trainer()

trainer = Trainer(
    model,
    args,
    ...
    compute_metrics=compute_metrics,
    callbacks = [EarlyStoppingCallback(early_stopping_patience=3)]
)
Run Code Online (Sandbox Code Playgroud)

当然,当您使用 时compute_metrics(),例如它可以是如下函数:

def compute_metrics(p):    
    pred, labels = p
    pred = np.argmax(pred, axis=1)
    accuracy = accuracy_score(y_true=labels, y_pred=pred)
    recall = recall_score(y_true=labels, y_pred=pred)
    precision = precision_score(y_true=labels, y_pred=pred)
    f1 = f1_score(y_true=labels, y_pred=pred)    
return {"accuracy": accuracy, "precision": precision, "recall": recall, "f1": f1}
Run Code Online (Sandbox Code Playgroud)

返回的compute_metrics()应该是一个字典,您可以访问函数内您想要/计算的任何指标并返回。

注意:在较新的transformers版本中,建议使用Enum IntervalStrategy.steps(请参阅参考资料TrainingArguments())而不是纯steps字符串,后者很快就会被弃用。