如何对 Transformer 模型进行交叉验证微调?

问题描述 投票:0回答:1

我想对 Huggingface Transformer Trainer (UIE) 的微调过程进行 10 倍交叉验证。我正在尝试 UIE 模型,它基本上适用于基本的 Transformer 架构。

为了实现 10 折交叉验证,我需要将数据集分成 10 个不同的折叠,以便训练和评估集得到切换。下图解释了 k=5 的情况(来源):

但是 Trainer 类需要一个

eval_dataset
Code)。

   trainer = ConstraintSeq2SeqTrainer(
        model=model,
        args=training_args,
        train_dataset=train_dataset if training_args.do_train else None,
        eval_dataset=eval_dataset if training_args.do_eval else None,
        tokenizer=tokenizer,
        data_collator=data_collator,
        compute_metrics=compute_metrics if training_args.predict_with_generate else None,
        decoding_type_schema=record_schema,
        decoding_format=data_args.decoding_format,
        source_prefix=prefix,
        task=data_args.task,
    )

我知道验证数据集不是测试集,因为在脚本末尾评估测试结果:

if training_args.do_predict:
    logger.info("*** Test ***")

    test_results = trainer.predict(
        test_dataset,
        metric_key_prefix="test",
        max_length=data_args.val_max_target_length,
        num_beams=data_args.num_beams,
    )
    test_metrics = test_results.metrics
    test_metrics["test_loss"] = round(test_metrics["test_loss"], 4)

    output_test_result_file = os.path.join(training_args.output_dir, "test_results_seq2seq.txt")

当我尝试以 json 形式传递空验证数据集或将

eval_dataset
设置为 None 时,出现错误。所以在我看来,训练器确实需要一个评估数据集。所以我有以下问题:

  1. 我不明白为什么我首先需要验证集,我认为 Transformer 仅在训练集上进行训练,并在测试集上评估训练后的模型。
  2. 如果培训师确实需要验证集,我将如何进行交叉验证?大多数示例显示在 2 个 train_test 分割上进行交叉验证,但不在 train_val_test 分割上进行交叉验证。

我像这样实现并运行它,它工作得很好,但我认为这缺少交叉验证的点,因为测试集总是相同的:

python huggingface-transformers cross-validation
1个回答
0
投票

您可以查看Microsoft NNI。它是一个有助于调整模型并以非常交互式和直观的方式呈现的框架。

© www.soinside.com 2019 - 2024. All rights reserved.