通过 Huggingface 转换器更新 BERT 模型
Posted
技术标签:
【中文标题】通过 Huggingface 转换器更新 BERT 模型【英文标题】:Updating a BERT model through Huggingface transformers 【发布时间】:2020-02-25 10:50:46 【问题描述】:我正在尝试使用内部语料库更新预训练的 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()
【问题讨论】:
您使用 PyTorch 标记了问题,但您的代码导入了 TensorFlow。你打算使用什么框架?您还用 spacy 标记了这个问题,但我实际上并没有看到 spacy 在哪里使用。你能澄清一下吗? (如果你使用 PyTorch,我很乐意回答这个问题。) Jindrich,我不是 100% 确定,但据我所知,hugging-face 提供 pytorch 代码来提供 API 以使用新的 SOTA NLP 模型。 @user8291021,我不知道如何使用拥抱人脸 API 来做到这一点,但如果你愿意,我可以告诉你如何使用 MLM 在你的自定义数据上微调预训练的 bert 模型。跨度> @Jindřich 抱歉贴错标签 - 当然应该在标签中包含 tensorflow。文档包含在此链接github.com/huggingface/transformers 中,对我来说有点不清楚的主要部分是; tokenizer.add_tokens([SPECIAL_TOKEN_1, SPECIAL_TOKEN_2]) 。我假设特殊标记代表来自新训练数据或“内部”语料库的句子或文本? @AshwinGeetD'Sa 你能告诉我如何使用 MLM 对我的数据进行微调吗? 【参考方案1】:BERT 在 2 个任务上进行了预训练:掩码语言建模 (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
参数默认为True。
【讨论】:
以上是关于通过 Huggingface 转换器更新 BERT 模型的主要内容,如果未能解决你的问题,请参考以下文章
输入文件应该如何格式化以进行语言模型微调(BERT 通过 Huggingface Transformers)?
用于命名实体识别的 PyTorch Huggingface BERT-NLP
如何微调 HuggingFace BERT 模型以进行文本分类 [关闭]