最近,我在斯坦福大学(Stanford)通过深度学习(CS224N)完成了一门关于NLP的课程,我非常喜欢这段经历。学了一大堆新东西。在我的期末项目中,我研究了一个基于斯坦福问答数据集(SQuAD)的问答模型。在这篇文章中,我将介绍问答模型的主要组成部分。
你可以在我的Github repo上找到完整的代码:
https://github.com/priya-dwivedi/cs224n-Squad-Project
我最近还为这个模型添加了一个web演示,您可以在其中放入任何段落并询问与之相关的问题。点击链接查看:
https://deeplearninganalytics.org/demos/
斯坦福问答数据集(Stanford Question answer Dataset, SQuAD)是一个新的阅读理解数据集,由一组维基百科文章上的众包工作者提出的问题组成,其中每个问题的答案都是从相应的阅读文章的一段文字,或跨度。在500多篇文章中有超过10万个问题-答案对,这个小组比以前的阅读理解数据集要大得多。
在这个数据集上有一个快速的进展,一些最新的模型在回答问题的任务中达到了人类水平的准确性!
举一个带有原文,问题以及回答的例子:
【原文】阿波罗号从1961年到1972年运行,并由1962年到1966年与之同时运行的双子星计划支持。双子座任务发展了一些太空旅行技术,这对阿波罗任务的成功是必要的。阿波罗使用土星家族火箭作为运载火箭。阿波罗/土星运载工具也被用于阿波罗应用计划,其中包括天空实验室,一个在1973-74年支持三次载人任务的空间站,以及阿波罗-联盟测试项目,一个在1975年与苏联联合的地球轨道任务。
【问题】1973-1974年间,哪个空间站支持了三次载人飞行任务?
【答案】——太空实验室
主要特点:
嵌入层 (Embedding Layer)
该模型的训练数据集由上下文和相应的问题组成。这两个词都可以被分解成单独的单词,然后这些单词可以被转换成单词嵌入,使用的是预先训练好的向量,比如GloVe向量。词嵌入比为每个词使用一个热向量更好地捕获词周围的上下文。对于这个问题,我使用了100维度GloVe词嵌入,我们没有调整他们在培训过程中,因为我们没有足够的数据。
编码器层 (Encoder Layer)
RNN编码器我们在模型中添加的下一层是基于RNN的编码器层。我们希望上下文中的每个单词都能意识到它之前和之后的单词。一个双向的GRU/LSTM可以帮助实现这一点。RNN的输出是一系列前向和后向的隐藏向量,我们将它们串联起来。类似地,我们可以使用相同的RNN编码器来创建问题隐藏向量。
注意力层 (Attention Layer)
到目前为止,我们已经有了上下文的隐藏向量和问题的隐藏向量。为了找出答案,我们需要把这两个放在一起看。这就是注意力的用武之地。它是答疑系统的关键部分,因为它帮助我们决定,给定的问题,我应该“注意”上下文中的哪些词。
输出层 (Output Layer)
模型的最后一层是softmax输出层,它帮助我们决定答案范围的开始和结束索引。我们的损失函数是开始和结束位置的交叉熵损失的和。并使用Adam优化器最小化。
大家如果感兴趣,可以跟随Github链接去跑一下程序。
参考:
https://towardsdatascience.com/nlp-building-a-question-answering-model-ed0529a68c54