如何在 MLM 和 NSP 的新领域从头开始训练 BERT?

tlq*_*lqn 12 nlp transformer-model deep-learning bert-language-model huggingface-transformers

我\xe2\x80\x99m 尝试使用我自己的数据集和 HuggingFace 库从头开始训练 BERT 模型。我想以一种与原始 BERT 模型完全相同的架构来训练模型。

\n

在原始论文中,它指出:\xe2\x80\x9cBERT 在两个任务上进行训练:预测随机掩码标记(MLM)和预测两个句子是否相互跟随(NSP)。SCIBERT 遵循与 BERT 相同的架构,但在科学文本上进行了预训练。\xe2\x80\x9d

\n

I\xe2\x80\x99m 试图了解如何在上述两个任务上训练模型。目前,我初始化模型如下:

\n
from transformers import BertForMaskedLM\nmodel = BertForMaskedLM(config=config)\n
Run Code Online (Sandbox Code Playgroud)\n

然而,它仅适用于 MLM,而不适用于 NSP。我怎样才能用 NSP 初始化和训练模型,或者也许我原来的方法就很好?

\n

我的假设是

\n
    \n
  1. 初始化BertForPreTraining(对于 MLM 和 NSP),或者

    \n
  2. \n
  3. 完成训练后BertForMaskedLM,初始化相同的模型并再次训练BertForNextSentencePrediction(但这种方法\xe2\x80\x99s计算和\n资源将花费两倍\xe2\x80\xa6)

    \n
  4. \n
\n

I\xe2\x80\x99m 不确定哪一个是正确的方法。任何见解或建议将不胜感激。

\n

Kha*_*797 28

BertForPretraining TextDatasetForNextSentencePrediction DataCollatorForLanguageModeling您可以使用和的组合轻松地在 MLM 和 NSP 任务上从头开始训练 BERT Trainer

我不建议您先训练模型 MLM,然后再训练 NSP,这可能会导致灾难性的遗忘。基本上就是忘记了之前训练中学到的东西。

  1. 加载预先训练的分词器。
from transformers import BertTokenizer
bert_cased_tokenizer = BertTokenizer.from_pretrained("/path/to/pre-trained/tokenizer/for/new/domain", do_lower_case=False)
Run Code Online (Sandbox Code Playgroud)
  1. 初始化你的模型BertForPretraining
from transformers import BertTokenizer
bert_cased_tokenizer = BertTokenizer.from_pretrained("/path/to/pre-trained/tokenizer/for/new/domain", do_lower_case=False)
Run Code Online (Sandbox Code Playgroud)
  1. 为 NSP 任务创建数据集。TextDatasetForNextSentencePrediction将为句子进行标记并创建标签。您的数据集应采用以下格式:(或者您可以只修改现有代码)

(1) 每行一句。理想情况下,这些应该是实际的句子 (2) 文档之间的空行

Sentence-1 From Document-1
Sentence-2 From Document-1
Sentence-3 From Document-1
...

Sentence-1 From Document-2
Sentence-2 From Document-2
Sentence-3 From Document-2
Run Code Online (Sandbox Code Playgroud)
from transformers import BertConfig, BertForPreTraining
config = BertConfig()
model = BertForPreTraining(config)
Run Code Online (Sandbox Code Playgroud)
  1. 用于DataCollatorForLanguageModeling屏蔽和传递从 生成的标签TextDatasetForNextSentencePredictionDataCollatorForNextSentencePrediction已被删除,因为它正在做同样的事情DataCollatorForLanguageModeling
Sentence-1 From Document-1
Sentence-2 From Document-1
Sentence-3 From Document-1
...

Sentence-1 From Document-2
Sentence-2 From Document-2
Sentence-3 From Document-2
Run Code Online (Sandbox Code Playgroud)
  1. 训练并保存
from transformers import TextDatasetForNextSentencePrediction
dataset = TextDatasetForNextSentencePrediction(
    tokenizer=bert_cased_tokenizer,
    file_path="/path/to/your/dataset",
    block_size = 256
)
Run Code Online (Sandbox Code Playgroud)


Nie*_*els 10

我建议执行以下操作:

  1. 首先针对 MLM 目标预训练 BERT。HuggingFace 提供了一个专门用于在您自己的数据上针对 MLM 目标训练 BERT 的脚本。你可以在这里找到它。正如您在脚本中看到的run_mlm.py,它们使用AutoModelForMaskedLM,并且您可以指定您想要的任何架构。

  2. 其次,如果想要训练下一个句子预测任务,您可以定义一个BertForPretraining模型(顶部有 MLM 和 NSP 头),然后加载步骤 1 中训练的模型的权重,然后进一步预训练训练它进行下一个句子预测任务。

更新:显然下一个句子预测任务确实有助于提高 BERT 在某些 GLUE 任务上的性能。请参阅BERT 作者的演讲。