Deep learning 如何从零开始为传销和NSP培训新领域的伯特?

Deep learning 如何从零开始为传销和NSP培训新领域的伯特?,deep-learning,nlp,bert-language-model,huggingface-transformers,transformer,Deep Learning,Nlp,Bert Language Model,Huggingface Transformers,Transformer,我正在尝试使用HuggingFace库使用自己的数据集从头开始训练BERT模型。我想以一种方式来训练模型,使其具有原始伯特模型的精确架构 在最初的论文中,它指出:“伯特接受了两项任务的训练:预测随机蒙面的代币传销和预测两个句子是否相互遵循NSP。SCIBERT遵循与伯特相同的架构,但在科学文本上进行了预训练。” 我试图理解如何在上面的两个任务上训练模型。目前,我对模型进行了如下初始化: from transformers import BertForMaskedLM model = BertFo

我正在尝试使用HuggingFace库使用自己的数据集从头开始训练BERT模型。我想以一种方式来训练模型,使其具有原始伯特模型的精确架构

在最初的论文中,它指出:“伯特接受了两项任务的训练:预测随机蒙面的代币传销和预测两个句子是否相互遵循NSP。SCIBERT遵循与伯特相同的架构,但在科学文本上进行了预训练。”

我试图理解如何在上面的两个任务上训练模型。目前,我对模型进行了如下初始化:

from transformers import BertForMaskedLM
model = BertForMaskedLM(config=config)
然而,这将只是传销,而不是NSP。我如何使用NSP初始化和训练模型,或者我最初的方法可能很好

我的假设是

使用BertForPreTraining对传销和NSP进行初始化,或

在完成BertForMaskedLM的培训后, 初始化相同的模型,然后使用 BERTFORNEXTSENTCEPREDICTION但这种方法的计算和 资源将花费两倍


我不确定哪一个是正确的方法。如果您有任何见解或建议,我们将不胜感激。

我建议您执行以下操作:

首先就传销目标对伯特进行预培训。HuggingFace提供了一个脚本,专门用于根据您自己的数据对BERT进行传销目标培训。你可以找到它。正如您在run_mlm.py脚本中所看到的,它们使用AutoModelForMaskedLM,您可以指定所需的任何体系结构

其次,如果你想在下一个句子预测任务中进行训练,你可以定义一个BertForPretraining模型,该模型的MLM和NSP头部都位于顶部,然后从你在步骤1中训练的模型中加载权重,然后在下一个句子预测任务中对其进行进一步的预训练


更新:显然,下一个句子预测任务确实有助于提高BERT在某些粘合任务上的性能。见《伯特》的作者。

我建议做以下几点:

首先就传销目标对伯特进行预培训。HuggingFace提供了一个脚本,专门用于根据您自己的数据对BERT进行传销目标培训。你可以找到它。正如您在run_mlm.py脚本中所看到的,它们使用AutoModelForMaskedLM,您可以指定所需的任何体系结构

其次,如果你想在下一个句子预测任务中进行训练,你可以定义一个BertForPretraining模型,该模型的MLM和NSP头部都位于顶部,然后从你在步骤1中训练的模型中加载权重,然后在下一个句子预测任务中对其进行进一步的预训练


更新:显然,下一个句子预测任务确实有助于提高BERT在某些粘合任务上的性能。参见BERT的作者。

您可以使用BertForPretraining TEXT DATASETFORNEXTSENTEPREDICTION DATA COLLATOR FOR LANGUAGEMODELING和Trainer的组合,轻松地从零开始就MLM和NSP任务对BERT进行培训

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

加载预先训练的标记器。 使用BertForPretraining初始化模型 从变压器导入BertConfig,BertForPreTraining config=BertConfig 型号=BertForPreTrainingconfig 为NSP任务创建数据集。TextDataSetForNextContencePrediction将标记化句子并为其创建标签。您的数据集应该包含以下内容:或者您可以只修改现有代码 每行一句。理想情况下,这些句子应该是真实的句子 2个文档之间的空白行

从transformers导入TextDataSetforNext内容预测 dataset=textDataSetForNext内容预测 标记器=bert_cased_标记器, 文件路径=/path/to/your/dataset, 块大小=256 使用DataCollatorForLanguageModeling屏蔽和传递从TextDataSetForNextContencePredition生成的标签。DataCollatorForNextContencePredition已被删除,因为它正在对DataCollatorForLanguageModeling执行相同的操作 从transformers导入DataCollatorForLanguageModeling data_collator=DataCollatorForLanguageModeling 标记器=bert_cased_标记器, 传销=真, 传销概率=0.15 训练与拯救 来自变压器进口培训师,培训论证 培训参数=培训参数 output_dir=/path/to/output/dir/for/training/arguments 覆盖\u输出\u目录=真, 数字列车时代=2, 每列gpu批量大小=16, 保存步骤=10\u 000, 保存总限制=2, 预测损失仅为真, 教练 模型=模型, args=训练参数, 数据整理器=数据整理器, 列车数据集=数据集, 教练 trainer.save_modelpath/to/your/model
您可以使用BertForPretraining TextDataSetForNextContentPredition DataCollator ForLanguageModeling和Trainer的组合,轻松地从零开始训练BERT执行MLM和NSP任务

我不建议你先训练你的mo del传销然后NSP,这可能会导致灾难性的遗忘。这基本上是忘记了你从以前的训练中学到的东西

加载预先训练的标记器。 使用BertForPretraining初始化模型 从变压器导入BertConfig,BertForPreTraining config=BertConfig 型号=BertForPreTrainingconfig 为NSP任务创建数据集。TextDataSetForNextContencePrediction将标记化句子并为其创建标签。您的数据集应该包含以下内容:或者您可以只修改现有代码 每行一句。理想情况下,这些句子应该是真实的句子 2个文档之间的空白行

从transformers导入TextDataSetforNext内容预测 dataset=textDataSetForNext内容预测 标记器=bert_cased_标记器, 文件路径=/path/to/your/dataset, 块大小=256 使用DataCollatorForLanguageModeling屏蔽和传递从TextDataSetForNextContencePredition生成的标签。DataCollatorForNextContencePredition已被删除,因为它正在对DataCollatorForLanguageModeling执行相同的操作 从transformers导入DataCollatorForLanguageModeling data_collator=DataCollatorForLanguageModeling 标记器=bert_cased_标记器, 传销=真, 传销概率=0.15 训练与拯救 来自变压器进口培训师,培训论证 培训参数=培训参数 output_dir=/path/to/output/dir/for/training/arguments 覆盖\u输出\u目录=真, 数字列车时代=2, 每列gpu批量大小=16, 保存步骤=10\u 000, 保存总限制=2, 预测损失仅为真, 教练 模型=模型, args=训练参数, 数据整理器=数据整理器, 列车数据集=数据集, 教练 trainer.save_modelpath/to/your/model
我有一个快速跟进的问题。对于您列出的编号2,我需要有标签的数据来培训NSP任务,对吗?例如,哪个句子是A,哪个句子是B,哪个句子跟在另一个后面?是的,尽管在这种情况下,标签很简单。您可以简单地从web上抓取大量页面,并在文档中创建两对真正紧跟在一起的句子,即标记为1的句子和标记为0的随机句子。看看BERT的作者是如何在官方的BERT回购协议中做到这一点的。我有一个关于这一点的快速跟进问题。对于您列出的编号2,我需要有标签的数据来培训NSP任务,对吗?例如,哪个句子是A,哪个句子是B,哪个句子跟在另一个后面?是的,尽管在这种情况下,标签很简单。您可以简单地从web上抓取大量页面,并在文档中创建两对真正紧跟在一起的句子,即标记为1的句子和标记为0的随机句子。看看BERT的作者是如何从官方的BERT回购协议中做到这一点的。
from transformers import BertTokenizer
bert_cased_tokenizer = BertTokenizer.from_pretrained("/path/to/pre-trained/tokenizer/for/new/domain", do_lower_case=False)
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