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
\nI\xe2\x80\x99m 试图了解如何在上述两个任务上训练模型。目前,我初始化模型如下:
\nfrom transformers import BertForMaskedLM\nmodel = BertForMaskedLM(config=config)\n
Run Code Online (Sandbox Code Playgroud)\n然而,它仅适用于 MLM,而不适用于 NSP。我怎样才能用 NSP 初始化和训练模型,或者也许我原来的方法就很好?
\n我的假设是
\n初始化BertForPreTraining
(对于 MLM 和 NSP),或者
完成训练后BertForMaskedLM
,初始化相同的模型并再次训练BertForNextSentencePrediction
(但这种方法\xe2\x80\x99s计算和\n资源将花费两倍\xe2\x80\xa6)
I\xe2\x80\x99m 不确定哪一个是正确的方法。任何见解或建议将不胜感激。
\nKha*_*797 28
BertForPretraining
TextDatasetForNextSentencePrediction
DataCollatorForLanguageModeling
您可以使用和的组合轻松地在 MLM 和 NSP 任务上从头开始训练 BERT Trainer
。
我不建议您先训练模型 MLM,然后再训练 NSP,这可能会导致灾难性的遗忘。基本上就是忘记了之前训练中学到的东西。
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)
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)
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)
DataCollatorForLanguageModeling
屏蔽和传递从 生成的标签TextDatasetForNextSentencePrediction
。DataCollatorForNextSentencePrediction
已被删除,因为它正在做同样的事情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)
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
我建议执行以下操作:
首先针对 MLM 目标预训练 BERT。HuggingFace 提供了一个专门用于在您自己的数据上针对 MLM 目标训练 BERT 的脚本。你可以在这里找到它。正如您在脚本中看到的run_mlm.py
,它们使用AutoModelForMaskedLM
,并且您可以指定您想要的任何架构。
其次,如果想要训练下一个句子预测任务,您可以定义一个BertForPretraining
模型(顶部有 MLM 和 NSP 头),然后加载步骤 1 中训练的模型的权重,然后进一步预训练训练它进行下一个句子预测任务。
更新:显然下一个句子预测任务确实有助于提高 BERT 在某些 GLUE 任务上的性能。请参阅BERT 作者的演讲。
归档时间: |
|
查看次数: |
11682 次 |
最近记录: |