这篇论文提出了经典的BiDAF模型,即使现在BERT出现,但这篇论文提出的模型仍是具有参考价值,并且这篇论文中对模型和注意力机制进行了详细的探究,帮助我们加深理解整个机器阅读理解过程。
1.介绍
在2017年,注意力机制已经被很广泛地应用,在机器阅读理解( machine comprehension,MC)中,注意力机制被用于聚焦上下文中与问题最相关的一段,从而实现一种信息提取的作用。
在其他论文中的另一种表述是,注意力机制具有软对齐的作用,能让两项不同长度(或其他属性)的信息进行对齐,从而结合他们的信息,或者是用一项信息去提取另一项中的关键信息。实际上这两种表述相同,但描述的是不同方面。
作者认为当时在端对端的MC任务中,注意力机制主要有三种方式:
- 使用所谓的“动态注意力”,意思是对当前的time-step时间步骤,注意力的计算中包括之前时间步骤的注意力输出。这通常是将LSTM与注意力机制相结合。
- 只计算一次注意力权重,并将它们送入输出层进行预测。(这里作者可能是指将注意力权重与输入序列结合变为一个固定长度向量这种方式)
- 在多层之间反复计算一个问题和上下文之间的注意力向量,通常称为多跳结合内存网络和强化学习,以动态控制跳数。(论文:Iterative alternating neural attention for machine reading,Gated-attention readers for text comprehension, Reasonet: Learning to stop reading in machine comprehension)
而作者提出BiDAF,计算了两种注意力(从上下文到问题,以及从问题到上下文),将这种计算方式称为“双向的”。
另外,作者在计算注意力时没有使用动态注意力,认为这减少了内存消耗。
这种方式在实验中与动态注意力相比,带来了准确率的提升,作者推论这是由于让注意力层和建模层(指在注意力层之后的LSTM)的分工更加明确,让建模层更专注从表示中学习交互模式,让注意力层不受前一时间步骤错误信息的误导,并且,作者认为由于使用了这种分离加双向的模式,能够让问题和上下文的信息相互“流动”。
2.模型
先放图:
模型实际上有很多博客已经详细描述了,在这里我只简单描述结构供下文分析。
如需详细了解模型,建议直接从作者的github查看源码,TensorFlow版: allenai.github.io/bi-att-flow/
其他人对BiDAF的PyTorch版本的实现:https://github.com/galsang/BiDAF-pytorch
2.1 Character Embedding Layer
对原文使用了Char-CNN,进行了字符级的词嵌入。
Char-CNN 相关论文:Yoon Kim. Convolutional neural networks for sentence classification. In EMNLP, 2014.
2.2 Word Embedding Layer
使用GloVe进行词嵌入。并且与上文的Character Embedding进行拼接,输入两层Highway网络。
2.3 Contextual Embedding Layer
将刚才的表示使用Bi-LSTM进行编码,得到文本序列的上下文相关表示。
形式化的表示,这一层的输出是 H ∈ R 2 d × T H \in R^{2d×T} H∈R2d×T 和 U ∈ R 2 d × J U \in R^{2d×J} U∈R2d×J 两个矩阵。
其中 d d d是词嵌入和字符嵌入得到的表示的长度, T T T和 J J J分别表示上下文和问题的长度。到这一步位置,问题和上下文是分开并行处理的。
2.4 Attention Flow Layer
这一层进行注意力的计算,首先得到相似度矩阵 S ∈ R T × J S \in R^{T×J} S∈RT×J,其中
S t , j = α ( H : , t , U : , j ) S_{t,j}=\alpha(H_{:,t}, U_{:,j}) St,j=α(H:,t,U:,j)
α \alpha α是一个计算两个向量之间相似度的可训练的标量函数。在论文中,作者选取:
α ( h , u ) = w S T [ h ; u ; h ○ u ] \alpha(h,u)=w^{T}_{S}[h;u;h○u] α(h,u)=wST[h;u;h○u]
其中";"代表拼接向量,"○"代表按位乘。
在计算Context-to-query Attention时,作者令
a t