原文:
www.kdnuggets.com/2021/07/understanding-bert-hugging-face.html
评论
在最近的一篇关于BERT的文章中,我们讨论了 BERT 转换器及其基本工作原理。文章涵盖了 BERT 的架构、训练数据和训练任务。
然而,我们在真正实现之前并不了解某些东西。所以在这篇文章中,我们将使用 BERT 和 Hugging Face 库实现一个问答神经网络。
在这个任务中,我们给定一个问题和一个段落,其中包含答案的段落是我们的BERT 架构,目标是确定答案在段落中的起始和结束跨度。
BERT 微调问答任务示意图
正如上一篇文章中所解释的,在上述示例中,我们向 BERT 架构提供两个输入。段落和问题通过标记分隔。紫色层是 BERT 编码器的输出。
我们现在定义两个向量 S 和 E(在微调过程中将被学习),它们的形状为 (1x768)。然后我们将这些向量与 BERT 的第二句输出向量进行点积,得到一些分数。我们随后对这些分数应用 Softmax 以获得概率。训练目标是正确起始和结束位置的对数似然的总和。在数学上,对于起始位置的概率向量:
其中 T_i 是我们关注的词。结束位置的公式是类似的。
为了预测一个跨度,我们获取所有的分数 — S.T 和 E.T,并选择得分最高的跨度,即在所有 j≥i 中最大化(S.T_i + E.T_j)的跨度。
Hugging Face 提供了一种相当直接的方法来实现这一点。
输出是:
Question: How many pretrained models are available in Transformers?
Answer: over 32 +
Question: What do Transformers provide?
Answer: general purpose architectures
Question: Transformers provide interoperability between which frameworks?
Answer: TensorFlow 2\. 0 and PyTorch
因此,我们仅使用了 Hugging Face 提供的SQuAD 数据集上的预训练分词器和模型来完成这个任务。
tokenizer = AutoTokenizer.from_pretrained(“bert-large-uncased-whole-word-masking-finetuned-squad”)
model = AutoModelForQuestionAnswering.from_pretrained(“bert-large-uncased-whole-word-masking-finetuned-squad”)
一旦我们有了模型,我们只需获取起始和结束概率分数,并预测跨度为起始分数最高的 token 和结束分数最高的 token 之间的那个跨度。
例如,如果段落的起始分数是:
...
Transformers - 0.1
are - 0.2
general - 0.5
purpose - 0.1
architectures -0.01
(BERT - 0.001
...
而结束分数是:
...
Transformers - 0.01
are - 0.02
general - 0.05
purpose - 0.01
architectures -0.01
(BERT - 0.8
...
我们将得到输出为 input_ids[answer_start:answer_end],其中 answer_start 是词“general”(最大开始分数的词)的索引,answer_end 是 BERT(最大结束分数的词)的索引。答案将是“general purpose architectures”。
在大多数情况下,我们将希望在自己的数据集上训练自己的 QA 模型。在这种情况下,我们将从 SQuAD 数据集和 Hugging Face 库中的基础 BERT 模型开始进行微调。
让我们看看在开始微调之前,SQuAD 数据集的样子:
Context:Within computer systems, two of many security models capable of enforcing privilege separation are access control lists (ACLs) and capability-based security. Using ACLs to confine programs has been proven to be insecure in many situations, such as if the host computer can be tricked into indirectly allowing restricted file access, an issue known as the confused deputy problem. It has also been shown that the promise of ACLs of giving access to an object to only one person can never be guaranteed in practice. Both of these problems are resolved by capabilities. This does not mean practical flaws exist in all ACL-based systems, but only that the designers of certain utilities must take responsibility to ensure that they do not introduce flaws. [citation needed]
Question:The confused deputy problem and the problem of not guaranteeing only one person has access are resolved by what?
Answer:['capabilities']
Answer Start in Text:[553]
--------------------------------------------------------------------
Context:In recent years, the nightclubs on West 27th Street have succumbed to stiff competition from Manhattan's Meatpacking District about fifteen blocks south, and other venues in downtown Manhattan.
Question:How many blocks south of 27th Street is Manhattan's Meatpacking District?
Answer:['fifteen blocks']
Answer Start in Text:[132]
--------------------------------------------------------------------
我们可以看到每个示例包含上下文、答案和答案的开始标记。我们可以使用下面的脚本将数据预处理为所需的格式。一旦我们拥有上述格式的数据,脚本将处理很多事情,其中最重要的是答案在 max_length 附近的情况以及使用答案和开始标记索引计算跨度。
一旦我们获得了所需格式的数据,我们就可以从那里对我们的 BERT 基础模型进行微调。
model_checkpoint = "bert-base-uncased"
model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)tokenized_datasets = datasets.map(prepare_train_features, batched=True, remove_columns=datasets["train"].column_names)args = TrainingArguments(
f"test-squad",
evaluation_strategy = "epoch",
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=3,
weight_decay=0.01,
)data_collator = default_data_collator
trainer = Trainer(
model,
args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
tokenizer=tokenizer,
)trainer.train()
trainer.save_model(trainer.save_model("test-squad-trained"))
微调 BERT 基础模型的输出
一旦我们训练了模型,我们可以这样使用它:
在这种情况下,我们也取最大开始分数和最大结束分数的索引,并预测答案为它们之间的内容。如果我们想获得 BERT 论文中提供的精确实现,我们可以稍微调整上述代码,找出最大化(start_score + end_score)的索引。
模型训练中的代码输出
-
Attention Is All You Need:介绍 Transformer 的论文。
-
BERT 论文:请阅读这篇论文。
在这篇文章中,我介绍了如何从零开始使用 BERT 创建一个问答模型。我希望这对理解 BERT 以及 Hugging Face 库都很有用。
如果你想查看本系列中的其他文章,可以查看这些:
我们将来会写更多类似的主题,所以请告诉我们你的想法。我们应该写一些技术性很强的主题,还是更偏向于初学者水平?评论区是你的朋友,使用它吧。
原文。经允许转载。
相关:
-
学习实用 NLP 的最佳方法?
-
如何使用 T5 Transformer 生成有意义的句子
-
如何通过 API 创建和部署简单的情感分析应用
1. Google 网络安全证书 - 快速进入网络安全职业轨道。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你所在组织的 IT 工作