tensorflow - 通过 Huggingface Transformers 更新 BERT 模型

标签 tensorflow nlp pytorch spacy huggingface-transformers

我正在尝试使用内部语料库更新预训练的 BERT 模型。我查看了 Huggingface Transformer 文档,但正如您将在下面看到的那样,我有点卡住了。我的目标是使用余弦距离计算句子之间的简单相似性,但我需要为我的特定用例更新预训练模型。

如果您查看下面的代码,它恰好来自 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()

最佳答案

BERT 在 2 个任务上进行了预训练:掩码语言建模 (MLM) 和下一句预测 (NSP)。这两者中最重要的是 MLM(事实证明,下一句预测任务对模型的语言理解能力并没有那么大的帮助——例如 RoBERTa 只是在 MLM 上进行了预训练)。
如果你想在你自己的数据集上进一步训练模型,你可以使用 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参数默认为 True。

关于tensorflow - 通过 Huggingface Transformers 更新 BERT 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58620282/

相关文章:

c++ - 如何在 Mac 上使用 IDE(intelJ 或 Xcode)高效调试 tensorflow 内部 C++ 代码?

nlp - 在潜在语义分析中,如何在截断奇异值后重新组合分解矩阵?

python - tensorflow no_grad 概念

python - 如何加载预训练的 PyTorch 模型?

docker - 如何修复类型 "bind": source path must be a directory in Windows docker Container? 的无效挂载配置

python - Tensorflow hub.load 模型到 TFLite

linux - 如何从双语词典构建 4 种语言词典

scikit-learn - eli5 : show_weights() with two labels

c++ - torch C++ : Getting the value of a int tensor by using *. 数据<int>()

python - TensorFlow 如何安全地手动终止训练 (KeyboardInterrupt)