HuggingFace 训练器中的步数是如何计算的?

Gag*_*ari 8 machine-learning deep-learning huggingface-transformers

我有一个大小为 4107 的火车数据集。

DatasetDict({
    train: Dataset({
        features: ['input_ids'],
        num_rows: 4107
    })
    valid: Dataset({
        features: ['input_ids'],
        num_rows: 498
    })
})
Run Code Online (Sandbox Code Playgroud)

在我的训练参数中,批量大小为 8,纪元数为 2。

from transformers import Trainer, TrainingArguments

args = TrainingArguments(
    output_dir="code_gen_epoch",
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    eval_steps=100,
    logging_steps=100,
    gradient_accumulation_steps=8,
    num_train_epochs=2,
    weight_decay=0.1,
    warmup_steps=1_000,
    lr_scheduler_type="cosine",
    learning_rate=3.0e-4,
    # save_steps=200,
    # fp16=True,
    load_best_model_at_end = True,
)

trainer = Trainer(
    model=model,
    tokenizer=tokenizer,
    args=args,
    data_collator=data_collator,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["valid"],
)
Run Code Online (Sandbox Code Playgroud)

当我开始训练时,我可以看到步数是128。

在此输入图像描述

我的假设是 1 epoch 的步数应该是 4107/8 = 512(大约)。2 个纪元 512+512 = 1024。

不明白怎么变成128了

Kur*_*ica 9

由于您指定gradient_accumulation_steps=8,有效步数也除以8。这是因为您不是对每个批次进行向后传递,而是对一定数量的累积批次进行向后传递。

\n

因此,一个纪元中的步骤数将是:4107 个实例 \xc3\xb7 8 个批量大小 \xc3\xb7 8 个梯度累积 \xe2\x89\x88 128 个步骤。当禁用梯度累积 ( gradient_accumulation_steps=1) 时,您将获得 512 个步骤 (4107 \xc3\xb7 8 \xc3\xb7 1 \xe2\x89\x88 512)。

\n