【问题标题】:how to train a bert model from scratch with huggingface?如何用拥抱脸从头开始训练一个伯特模型?
【发布时间】:2022-05-04 03:29:18
【问题描述】:

我在这个问题中找到了从头开始训练模型的答案: How to train BERT from scratch on a new domain for both MLM and NSP?

一个答案使用 Trainer 和 TrainingArguments,如下所示:

from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
    output_dir= "/path/to/output/dir/for/training/arguments"
    overwrite_output_dir=True,
    num_train_epochs=2,
    per_gpu_train_batch_size= 16,
    save_steps=10_000,
    save_total_limit=2,
    prediction_loss_only=True,
)

trainer = Trainer(
    model=model,
    args=training_args,
    data_collator=data_collator,
    train_dataset=dataset,
)

trainer.train()
trainer.save_model("path/to/your/model")

但是 huggingface 官方文档Fine-tuning a pretrained model 也同样使用 Trainer 和 TrainingArguments 来进行微调。 那么当我使用 Trainer 和 TrainingArguments 训练模型时,我是从头开始训练模型还是只是微调?

【问题讨论】:

  • 取决于您设置为 model 的内容。也许你会关注这篇 [博客文章]9https://huggingface.co/blog/how-to-train)。
  • 从您发布的代码和您提供的链接中的代码来看,我认为该代码用于微调模型。
  • @cronoik 我看过博客,但它只描述了如何使用 run_language_modeling.py 之类的脚本而不是使用 Trainer。如果您解释了有关“取决于您设置为模型的内容”的更多详细信息,会有帮助的。
  • run_language_modeling 脚本也在使用训练器。微调和预训练之间的区别不在于你对你的训练器做了一些特定的事情(也许你会调整学习率)。不同之处在于您随机初始化权重或加载一些权重并针对不是您的最终任务(预训练)的目标训练它们,或者为您想要解决的下游任务(例如情绪分析)训练模型(微调)。
  • 我有同样的问题,我真的很迷失阅读他们的文档

标签: huggingface-transformers bert-language-model transformer fine-tune


【解决方案1】:

嘿,首先感谢您链接我的问题,我会尽力澄清它:)

首先,预训练和微调之间没有太大区别。唯一的区别是在预训练中你从头开始训练你的模型,换句话说你通过初始值初始化权重(它可以是随机的或零)但是在微调中你实际上加载了一个预训练的模型然后训练它再次用于下游任务,所以基本上你正在做的是通过预训练模型初始化权重。因此,您可以使用预训练模型捕获的知识。

让我们尝试了解微调和预训练架构。 下图向我们展示了预训练架构的概述。

当您微调 BERT 模型时,您会更改该任务的特定区域和标签。当您更改任务特定区域时,您会更改整体架构。你换个头。此更改还影响了您在 Transformers 中使用的模型的命名。例如,BertForPreTraining 同时使用 MLM 和 NSP 头,而 BertForSequenceClassification 使用线性层作为头,就像在 NSP 中一样。但它们的共同点是都封装了 BERT 模型。因此,我们只需更改“特定于任务”的区域(架构)。这就是他们所说的“预训练架构和最终的下游架构之间的差异很小”的意思。在BERT paper

如果你想改变BERT的预训练任务,你必须像我在“Same Sentence Prediction: A new Pre-training Task for BERT”(Github Repo)中所做的那样改变任务特定区域的架构和输入标签。微调过程也是如此。如果您想为下游任务定制微调架构,您只需要更改任务特定区域的架构即可。

因此,使用 Trainer 进行预训练或微调并不重要。 Trainer 基本上会根据训练损失来更新模型的权重。如果您使用带有下游任务特定头的预训练 BERT,它将更新 BERT 模型和任务特定头中的权重(除非您通过冻结 BERT 模型的权重来告知它)。如果您使用带有特定任务头的未经训练的 BERT 模型,它也会更新权重。

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2021-12-21
    • 2021-10-07
    • 2022-01-23
    • 2021-12-17
    • 2021-08-08
    • 2021-12-06
    • 2022-01-17
    • 2021-12-07
    相关资源
    最近更新 更多