基于Bert论文构建Question-Answering模型

摘要 本文拜读了提出 Bert 模型的论文,考虑了在 Bert 中算法模型的实现.比较了 Bert 与其他如 Transformer、GPT 等热门 NLP 模型.BERT 在概念上很简单,在经验上也很强大。它推动了 11 项自然语言处理任务的最新技术成果,而这 11 项 NLP 任务可分类为四大自然语言处理下游任务,本文聚焦分析实现一个简单的问答任务,使用了来自 BERT-large 的训练集,测试数据集(作业四爬取的 wiki 数据集),测试结果令人满意。

关键词 Bert; Transformer; GPT; NLP; 问答任务

一、前言

由于本课设用的 BERT-large 真的巨巨巨巨大。有 24 层,1024 大小的 embedding,总共 340M 个参数!总的来说,它是 1.34GB。然而国内下载实在太慢,故使用 Google Colab 提供的 jupyter 来运行相关代码。

想做但没有做出的:利用 bertviz(),一个 Transformer 模型中可视化注意力的工具,时间有些仓促,原本觉得能更好地展示 Bert 的运行过程,种种原因没有细看。

可视化的替代方案:将文本语段中的开始词和结束词分别评分,然后将其可视化。对于简短的文本有较好的效果。

数据集根据课设,一个简单联动作业四的 wiki 数据集中的文本内容(Demo),由于爬取的数据没有答案标签,因此只简单判断答案。

大规模数据集以及部分参考代码来自的 HW7 问答,数据集(包括训练集、验证集和测试集[文章 + 问题 + 答案])。

二、论文的简短介绍

涉及领域,前人工作等

本文主要涉及 NLP 的一种语言模型,之前已经出现了【1】ELMo 和【2】GPT 这些较为强大的模型,ELMo 的特征提取器不是很先进,GPT 没有使用双向,这篇论文结合两者的思想或做法,大大提升了最终效果。

2.1 中心思想

本论文文在前人研究基础上,沿用了 pre-train 和 fine-tuning 结构。使用双向 transformer 结构(不同于 ELMO 的双向,而是"掩蔽语言模型"(MLM)),并加入 Next Sentence Prediction(NSP),在 11 个自然语言处理任务上获得了新的最先进的结果。

2.2 论文思路及创新点

框架图和重要部分如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2sSXXy9p-1654394471007)(https://www.writebug.com/myres/static/uploads/2022/6/4/09b7bbb4656588cfc7943b29b17f0855.writebug)]

主要组成构建有:pre-training:Embedding、Masked LM、Next Sentence Prediction 和 fine-tuning

创新点有:

与 GPT 比较,使用了双向(GPT 只用了单向结构)

与 ELMo 比较,使用了更强的提取器:transformer,而且由于它的双向——使用了独立训练的从左到右和从右到左的 LMs 的浅连接。

论文中做种与 GPT 进行了对比,BERT 和 GPT 的培训方式还有其他一些不同之处:

GPT在BooksCorpus上训练(800M单词);
BERT被训练成书虫维基百科(2500万字)。
GPT使用一个句子分隔符([SEP])和分类器标记([CLS]),它们只在微调时引入;
BERT在在预处理时,学习[SEP], [CLS]和A/B嵌入。
GPT训练1M步,批处理32000字;
BERT被训练1M步,批处理大小为12.8万字。
GPT对所有微调实验使用5e-5相同的学习率;
BERT选择特定于任务的微调学习率,该学习率在开发集上执行得最好。

2.3 BERT 四大下游任务之问答任务

BERT 等预训练模型的提出,简化了我们对 NLP 任务精心设计特定体系结构的需求,我们只需在 BERT 等预训练模型之后下接一些网络结构,即可出色地完成特定任务。BERT 在概念上很简单,在经验上也很强大。它推动了 11 项自然语言处理任务的最新技术成果,而这 11 项 NLP 任务可分类为四大自然语言处理下游任务。下面讲简单分析其中的问答任务。

SQuAD v1.1:Rajpurkar 等人[25]提出的斯坦福问答数据(Stanford Question Answering Dataset)是 10 万个问题/答案对的集合。给定一个问题以及 Wikipedia 中包含答案的段落,任务是预测段落中的答案文本范围(start,end)。

到目前为止,所有提出的 BERT 微调方法都是在预训练模型中添加了一个简单的分类层,并且在下游任务上共同对所有参数进行了微调。然而,并非所有任务都可以轻松地由 BERT 体系结构表示,因此需要添加特定于任务的模型体系结构。如图 8.11(c)所示,阅读理解任务首先需要将问题和文本用“[SEP]”连接起来,并输入模型。然后,我们再将 BERT 最后一层向量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G78IctMX-1654394471010)(https://www.writebug.com/myres/static/uploads/2022/6/4/f1c9bc6a9ea2f33fdced828017d83f23.writebug)]

输入到输出层。具体运算逻辑是初始化输出层的权重矩阵

,并通过如下公式计算答案指针概率向量 logit:

其中 L 为序列的长度,K 为 2,表示 logit 是个 L 行 2 列的矩阵,第 1 列为答案开头 start 的指针概率向量,第 2 列为答案结尾 end 的指针概率向量。

因为 K 为 2,所以我们能分别抽出答案的开头 start_logit 和答案 end_logit 的结尾。并根据两者与真实答案对(start, end)之间的差值计算 start_logit 和 end_logit,最后求出总的 loss,如下公式所示,我们便可以进行梯度下降训练了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oE7cALmf-1654394471011)(https://www.writebug.com/myres/static/uploads/2022/6/4/c52d03fb096251221735fc42be1a7e30.writebug)]

三、基于 Bert 的 QA 模型

四、程序简要说明

模型:

预训练模型 bert-large-uncased-whole-word-masking-finetuned-squad

数据来源:自拟测试语句 + 科比 wiki 英文网介绍 + 自拟问题语句

代码来源:个人编写,由于预训练模型较大和本地环境问题,采用 Colab 线上编程

4.1 BERT 的输入格式

中的图片来源:https://blog.csdn.net/qq_42388742/article/details/113575739

为了向 BERT 提供 QA 任务,我们将问题和文本打包到输入中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRAP4s0n-1654394471011)(https://www.writebug.com/myres/static/uploads/2022/6/4/b98f57af4cf2fc585fae3f08aa9a9372.writebug)]

这两段文本由特殊的标记[SEP]分隔。

BERT 还使用了"Segment Embeddings"来区分问题和文本。这只是 BERT 学习到的两个嵌入(对于片段“A”和“B”),在将它们输入到输入层之前,它将它们添加到 token embeddings 中。

BERT 需要高亮显示包含答案的文本“span”(答案)——这表示为简单地预测哪个 token 标志答案的开始,哪个 token 标志答案的结束。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g5sGHBnv-1654394471012)(https://www.writebug.com/myres/static/uploads/2022/6/4/aa5b06f76830bd5c25e9a1d215ba46f9.writebug)]

  • 对于在文档中的每个单词,返回一个最终的嵌入到分类器中。开始 tokens 的分类器只有一组权值(由上图中的蓝色“strat”矩形表示)它应用于每个单词。
  • 在获取输出嵌入和“开始”权重之间的点积之后,我们应用 softmax 激活来生成所有单词的概率分布。我们选择的是概率最高的单词作为起始 tokens。
  • 我们对结束 token 重复这个过程——我们有一个独立的权值向量。

4.2 简单的一个 QA

加载 Bert 自带的预训练模型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhXkK40E-1654394471013)(https://www.writebug.com/myres/static/uploads/2022/6/4/6f795e062bfa06c0ef737dd84662bfb1.writebug)]

首先定义一个 Question Answering 如下:

期待的答案当然是 321

为了准确地查看标记器(tokenizer)在做什么,让我们打印出带有 id 的标记。

我们拼接 question 和 answer_text 在一起,但 BERT 仍然需要一种方法来区分它们。bert 有两个特殊的"Segment" 嵌入。一个是 A,一个是 B。在单词嵌入进入 BERT 层之前,段 A 嵌入需要添加到 question 标记中,段 B 嵌入需要添加到每个 answer_text 标记中。

这些添加的内容由 transformers 库为我们处理,我们所需要做的就是为每个令牌指定一个’0’或’1’。

以下代码实现查看最有可能的开始词和结束词来突出答案。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7O8yQ3WS-1654394471015)(https://www.writebug.com/myres/static/uploads/2022/6/4/702429d6e3863e18cc6d1e138cae997a.writebug)]

与期待答案一致。

4.3 可视化单词分数

以 2.3 的例子为例,展示可视化的过程

4.3.1 显示每个输入单词作为“start”单词的得分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXPLVwGh-1654394471015)(https://www.writebug.com/myres/static/uploads/2022/6/4/e9e0836d211b87ed4ce25b93b860ee23.writebug)]

4.3.2 显示作为“end”单词的每个输入单词的得分。

4.3.3 合并 start 和 end

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RofflnC-1654394471016)(https://www.writebug.com/myres/static/uploads/2022/6/4/a3fb59ec4f4f7153639a3a8d59745d30.writebug)]

4.4 汇总画图和 QA 模型

详情见附件代码。

4.5 长文本的 QA 例子

我们将英文 wiki 网关于科比的信息获取下来,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3bdRH7W-1654394471018)(https://www.writebug.com/myres/static/uploads/2022/6/4/9d343edcba8403fbb08fb4788558913c.writebug)]

向模型提出了以下问题并都得到了正确答案:

问题 答案 判断
HowmanyNBAchampionships;hasBryantwon? Answer: “five” 正确
HowmanytimeshasBryant;beenanAll-Star? Answer: “18” 正确
Howmanytimeshaskobe;beenontheall-defensiveteam? Answer: “12” 正确
whatdoesKobeBeanBryantdo? Answer:;“an american professional basketball player” 正确

给出最后一个问题的可视化过程:

五、大规模数据集的尝试

5.1 数据来源及展示

① 的 HW7 问答,数据集(包括训练集、验证集和测试集[文章 + 问题 + 答案])

Training set: 26935 QA pairs
Dev set: 3523 QA pairs
Test set: 3492 QA pairs
{train/dev/test} _questions:
List of dicts with the following keys:
id (int)
paragraph_id (int)
question_text (string)
answer_text (string)
answer_start (int)
answer_end (int)
{
    train/dev/test
}
_paragraphs:
List of strings
paragraph_ids in questions correspond to indexs in paragraphs
paragraph may be used by several questions

②JSON 格式

训练集(hw7_train.json)和验证集(hw7_dev.json)的格式如下表

questions; “id”:0,;“paragraph_id”:538,;“question_text”:“哪一個訓練中心的設備被使用來訓練網絡城與媒體城勞工的未來知識?”,;“answer_text”:“杜拜知識村”,;“answer_start”:312,;“answer_end”:316;“id”:2546,;“paragraph_id”:764,;“question_text”:“瑞士近衛隊的制服代表著哪一個時期的風格?”,;“answer_text”:“文藝復興時期”,;“answer_start”:71,;“answer_end”:76
……
paragraphs

测试集(hw7_test.json)格式如下表:

questions “id”:0,;“paragraph_id”:792,;“question_text”:“士官長的頭盔上會有何裝飾物?”,;“answer_text”:null,;“answer_start”:null,;“answer_end”:null
paragraphs

5.2 程序结果及展示

5.2.1 训练模型并保存

如下图,训练出的模型在验证集上有 0.721 的 accuracy。

5.2.2 测试集结果展示

然后我们将训练好的模型,应用于测试集上。以下为相应代码:

print("EvaluatingTestSet...")
result=[]
       model.eval()
       withtorch.no_grad():
           fordataintqdm(test_loader):
           output=model(input_ids=data[0].squeeze(dim=0).to(device),token_type_ids=data[1].squeeze(dim=0).to(device),
                        attention_mask=data[2].squeeze(dim=0).to(device))
                  result.append(evaluate(data,output))

                  result_file="result.csv"
                          withopen(result_file,'w')asf:
                              f.write("ID,Answer\n")
                              fori,test_questioninenumerate(test_questions):
                              f.write(f"{test_question['id']},{result[i].replace(',','')}\n")

                              print(f"Completed!Resultisin{result_file}")

在运行以上代码后,生成结果文件(result.csv)。

如下图,留空的为找不到相应答案,其余的部分预测答案与人工作答相差无异。

六、附录更多操作深入

Bert 实战(Pytorch)----问答 fine-Tuning_名字填充中的博客-CSDN 博客;

【NLP-2019】解读 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding - 忆凡人生 - 博客园;

Pytorch-Bert 预训练模型的使用(调用 transformers) - 最咸的鱼 - 博客园;

;GitHub - jessevig/bertviz: Tool for visualizing attention in the Transformer model (BERT, GPT-2, Albert, XLNet, RoBERTa, CTRL, etc.);

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

Pytorch-Bert 预训练模型的使用(调用 transformers) - 最咸的鱼 - 博客园;

;GitHub - jessevig/bertviz: Tool for visualizing attention in the Transformer model (BERT, GPT-2, Albert, XLNet, RoBERTa, CTRL, etc.);

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125129142