自然语言处理:bert 用于问答系统
原文:Question Answering with a Fine-Tuned BERT
本文介绍了bert用于问答系统的原理,还有实践的代码,可以参考下,以下是原文的翻译:
BERT 在问答系统中的表现达到人类水平意味着什么?BERT 是否有史以来最好的搜索引擎,可以找到任何我们抛出的问题的答案?
在本文第一部分,我会解释 BERT 用于 QA 的真正含义,并展示一些细节.
第二部分包含了示例代码,我们下载一个已经在问答系统中微调好的模型,在我们的文本中测试
在文本分类中,你会想在自己的数据集对BERT进行微调。但是对问答系统,可能会觉得使用已经在SQuAD benchmark微调好的模型会有性能的下降。本篇我们会尝试一下,并展示即使不是SQuAD 数据集,bert一样表现得很好.
相关链接
- My video walkthrough on this topic.
- The blog post version.
- The Colab Notebook.
内容
Part 1: BERT 如何用于问答系统
The SQuAD v1.1 Benchmark
当某人提及 “问答系统” 作为 BERT 的应用,他们实际指的是将 BERT 用于Stanford 问答数据集 (SQuAD).
SQuAD benchmark 给出的问答任务可能与你想象的有点不同。指定一个问题,和一个包含回答的文本片段,BERT 需要将相应的答案文本的范围高亮出来。
SQuAD 主页上有个不错的工具,可以展示此数据集的问题与相应文本,并显示最佳模型的预测结果
例如 interesting examples 有关于 超级碗 50 的相关例子.
BERT 输入格式
要将问答任务交给 BERT,我们将问题与相关文本打包作为输入
两份文本用特殊符号 [SEP]
间隔.
BERT 用 “Segment Embeddings” 来讲问题与相关文本区分开(问题作为segment1,文本作为segment2)。这是bert学习的两个embedding (segments “A” and “B”), 并加入到token embeddings 再交给输入层(bert 有token 、segment、position embedding).
开始结束词分类器
BERT 需要高亮包含问题回答的文本片段– 就是预测那个词标志回答的开始,那个词标志回答的结束。
对文本中每个词,我们将它最终输出的embedding 放入起始词分类器. 起始词分类器只有一套权重 (图中蓝色的矩形 “start” ) 作用于每个单词.
在每个词的输出embeddings 与起始词分类器权重点乘后,我们运用softmax 激活函数对所有词生成一个概率。概率最高的词作为我们选择的起始词,作为回答的开头.
对于结束词,重复这个过程(用结束词分类器的权重,下图的红色end矩形表示)
Part 2: 示例代码
这里使用的是transformers 库,有问答模块 BertForQuestionAnswering 和分词器模块 BertTokenizer,还可以对开始结束词的位置判断可视化:
感兴趣可以阅读下 原文
更多推荐
所有评论(0)