通过Huggingface变压器更新BERT模型

时间:2019-10-30 07:19:24

标签: tensorflow nlp pytorch spacy spacy-pytorch-transformers

我正在尝试使用内部语料库更新预训练的BERT模型。我看了看Huggingface转换器文档后,有点困惑,您将在下面看到。我的目标是使用余弦距离计算句子之间的简单相似性,但是我需要针对我的特定用例更新经过预先训练的模型。

如果您看下面的代码,这些代码正是来自Huggingface文档。我试图“重新训练”或更新模型,并假设special_token_1和special_token_2代表我“内部”数据或语料库中的“新句子”。它是否正确?总之,我喜欢已经经过预训练的BERT模型,但是我想使用另一个内部数据集对其进行更新或重新训练。任何线索将不胜感激。

import tensorflow as tf
import tensorflow_datasets
from transformers import *

model = BertModel.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

SPECIAL_TOKEN_1="dogs are very cute"
SPECIAL_TOKEN_2="dogs are cute but i like cats better and my 
brother thinks they are more cute"

tokenizer.add_tokens([SPECIAL_TOKEN_1, SPECIAL_TOKEN_2])
model.resize_token_embeddings(len(tokenizer))
#Train our model
model.train()
model.eval()

1 个答案:

答案 0 :(得分:2)

BERT接受了两项任务的预训练:掩盖语言建模(MLM)和下一句预测(NSP)。这两个中最重要的是MLM(事实证明,下一个句子预测任务实际上对模型的语言理解能力没有太大帮助,例如RoBERTa仅在MLM上进行了预训练)。

如果您想在自己的数据集上进一步训练模型,可以使用Transformers信息库中的BERTForMaskedLM进行。这是BERT,顶部是语言建模,可让您对自己的数据集执行屏蔽的语言建模(即预测屏蔽的令牌)。使用方法如下:

from transformers import BertTokenizer, BertForMaskedLM 
import torch   

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') 
model = BertForMaskedLM.from_pretrained('bert-base-uncased', return_dict=True) 

inputs = tokenizer("The capital of France is [MASK].", return_tensors="pt") 
labels = tokenizer("The capital of France is Paris.", return_tensors="pt")["input_ids"]

outputs = model(**inputs, labels=labels) 
loss = outputs.loss 
logits = outputs.logits

您可以使用loss.backward()更新BertForMaskedLM的权重,这是训练PyTorch模型的主要方法。如果您不想自己执行此操作,则Transformers库还提供了Python脚本,该脚本可让您真正地对自己的数据集执行MLM。请参见here(“ RoBERTa / BERT / DistilBERT和掩码语言建模”一节)。您只需要提供培训和测试文件即可。

您不需要添加任何特殊标记。特殊标记的示例是[CLS]和[SEP],它们用于序列分类和问答任务(以及其他)。这些由tokenizer自动添加。我怎么知道由于BertTokenizer继承自PretrainedTokenizer,因此,如果您查看其__call__方法here的文档,则可以看到add_special_tokens参数默认为是的。