NLP-阅读理解-2016:BiDAF(BiAttention+PointerNet)【片段抽取式任务;双向注意力机制】【最终输出答案所在片段的start、end索引】【SQuAD、CNNDaily】

在这里插入图片描述
《原始论文:Bidirectional Attention Flow for Machine Comprehension》

  • 作者想要研究的问题是什么?一一在当下注意力机制迅速发展的时代,Attention机制在一定成都 上存在问题,比如都是最后得到一个固定的vectors,或者只有单向的。

  • 如何对Attention机制进行改进,使其捕获更加丰富的语义信息。

  • 针对单向的Attention机制,作者提出了双向Attention注意力机制用于MRC任务。

  • 实验的结果在两个数据集上取得了好的效果。

一、概述

1、研究背景

在2016年,注意力机制已经被很广泛地应用,在机器阅读理解(machine comprehension, MC)中,注意力机制被用于聚焦上下文中与问题最相关的一段,从而实现一种信息提取的作用。以前工作中的attention机制通常具有以下一个或多个特征。

  • 计算出的注意力权重通常用于从上下文中提取最相关的信息,通过将上下文汇总成固定大小的向量来回答问题。(比如论文《Teaching Machines to Read and Comprehend》,用Attention最后得到的向量表达对候选实体进行分类,从候选实体里面选出一个打分最高的实体)
  • 对文本而言,它们通常是时间动态的,即当前时间步的注意力权重是根据上一时刻的向量进行计算的,如下图: s t s_t st 的计算是依赖于上一个时间步的 s t − 1 s_{t-1} st1
    在这里插入图片描述
  • 本论文之前的Attention它们通常是单向的,即用query来关注上下文(Match LSTM只考虑了融入问题的文档信息);

2、抽取式阅读理解

MRC模型主要包括 Embeeding层、Encoder编码层、Interaction交互层、Answer作答层。

抽取式MRC是要在文档中定位问题的答案。模型输入是【Passage,Question】,模型输出是【start_idx,end_idx】∈ [ 0, len(passage) ]。
在这里插入图片描述
在这里插入图片描述

3、前人工作:Match-LSTM + Pointer-Net模型结构

在这里插入图片描述

4、本论文创新点

  • 同时引入了Char 和 Word Embdeeing.
  • 在interaction交互层引入了双向注意力机制,我们在两个方向上使用attention机制,query-to-context and context-to-query,它们之间会彼此补充信息。
    • Match-LSTM只有Passage对Question的注意力,即:Passage中每个单词关注Question中的哪些单词。
    • BiDAF引入了Question看Passage的注意力在哪,这样可以计算得到Question眼中的Passage哪些单词重要哪些不重要。
  • 使用无记忆的注意力机制。每个时间步的attention仅是当前时间步的query和上下文段落的函数,并不直接依赖于前一时间步的向量

5、历史意义

在这里插入图片描述

三、BiDAF 模型结构

在这里插入图片描述
BiDAF共有6层,分别是Character Embedding Layer、Word Embedding Layer、Contextual Embedding Layer、Attention Flow Layer、Modeling Layer和Output Layer。

  • 其中前三层是一个多层级上下文不同粒度的表征编码器。
  • 第四层则是双向注意流层,这是原文的核心层。
  • 第五层是一个编码层,编码第四层输出的问题感知的上下文表征。
  • 第六层就是一个预测答案的范围。

在这里插入图片描述

假设context为 { x 1 , … , x T } \left\{ \boldsymbol { x } _ { 1 } , \dots , \boldsymbol { x } _ { T } \right\} {x1,,xT} ,query为 { q 1 , … q J } \left\{ \boldsymbol { q } _ { 1 } , \ldots \boldsymbol { q } _ { J } \right\} {q1,qJ}

1、Character Embedding Layer

为context和query中每一个词使用字符级嵌入, 使用的是字符级的CNN,具体做法是:字符嵌入到向量中,可以将其视为CNN的1D输入,其大小是CNN的输入信道大小。CNN的输出在整个宽度上max-pooling,以获得每个字的固定大小的嵌入向量。

Character embedding组成一个word的话是一个matrix,对这个matrix进行卷积+池化操作就可以得到对应word的embedding了。

在这里插入图片描述

2、Word Embedding Layer

词嵌入层就是普通的词嵌入方法,这里使用的是Glove的预训练词向量。

然后将字符级的嵌入和词嵌入拼接在一起(按每一个词拼接)经过一个两层的Highway Network,从而得到context vector X ∈ R d × T \mathbf { X } \in \mathbb { R } ^ { d \times T } XRd×T 和 query vector Q ∈ R d × J \mathbf { Q } \in \mathbb { R } ^ { d \times J } QRd×J。这时我们得到了问题和上下文中每一个词的 embedding。

对于Highway Network可以这么理解:
原本是y=f(x)
现在是y=αf(x)+(1-α)x
类似于一个Residual,据说ResNet有抄袭Highway Network之嫌。
在这里插入图片描述
Highway Network使得所有原始信息部分激活进入下一层、部分不激活直接进入下一层,保留了更多原始信息。同时反向传播的时候,可以避免梯度消失。
Highway Network的结构一般用在将char embedding卷积成word embedding时候,可以获得更好地词向量。

3、Contextual Embedding Layer

该层其实是一个编码器,分别对上一步得到的X和Q分别编码,编码的是X和Q句子内部的联系,与Match-LSTM类似,这一层是一层BiLSTM,输入上述embedding,输出hidden states,使得每个位置上获得上下文信息。

这样的到了上下文编码 H ∈ R 2 d × T \mathbf { H } \in \mathbb { R } ^ { 2 d \times T } HR2d×T 以及问题编码 U ∈ R 2 d × J \mathbf { U } \in \mathbb { R } ^ { 2 d \times J } UR2d×J

到这层为止,上下文和问题原始文本已经整合成具有多层级不同粒度的表征(character, word, phrase)。

步骤1、2、3 使得Passage和Question同时具备了Word、Char、Sentence三层信息。

4、Attention Flow Layer

原文是这样介绍BiDAF:

The attention flow layer is not used to summarize the query and context into single feature vectors. instead, the attention vector at each time step, along with the embedding from previous layers, are allowed to flow through to the subsequent modeling layer. This reduces the information loss caused by early summarization.

在这里插入图片描述

交互层,用于融合Paasge和Question的信息。包括:

  • 从文本视角看问题的Context2Query,用于获取针对这个文本,问题中哪些单词更重要(单向注意力机制一般用这种);
  • 从问题视角看文本的Query2Context,用于获取针对这个答案,文本中哪些单词更重要

该层输入是 H H H U U U,输出是具有问题感知的上下文表征 G G G

首先计算 H H H U U U 的相似度矩阵 S ∈ R T × J \mathbf { S } \in \mathbb { R } ^ { T \times J } SRT×J

S t j = α ( H t , U i j ) ∈ R \mathbf { S } _ { t j } = \alpha \left( \mathbf { H } _ { t } , \mathbf { U } _ { i j } \right) \in \mathbb { R } Stj=α(Ht,Uij)R

  • S t j \mathbf { S } _ { t j } Stj 表示的是上下文 H H H 中第 t t t 列向量 h h h 和问题 U U U 中第 j j j 列向量 u u u 的相似度值,它是一个实值。
  • α \alpha α 表示的是可训练的是指映射函数,其中 α ( h , u ) = w ( S ) ⊤ [ h ; u ; h ∘ u ] \alpha ( \mathbf { h } , \mathbf { u } ) = \mathbf { w } _ { ( \mathbf { S } ) } ^ { \top } [ \mathbf { h } ; \mathbf { u } ; \mathbf { h } \circ{\mathbf { u }}] α(h,u)=w(S)[h;u;hu] , 其中 w ( S ) ∈ R 6 d \mathbf { w } _ { ( \mathbf { S } ) } \in \mathbb { R } ^ { 6 d } w(S)R6d

后面用得到的 S S S 作为共享相似矩阵context-to-query(C2Q)以及query-to-context(Q2C)两个方向的 attention,其中每 i i i 行表示的是上下文文本中第 i i i 个词与问题文本中每一个词之间的相似度,第 j j j 列表示的是问题中第j个词与上下文文本中每一个词的相似度。

下面是两个方向的注意力的计算方式:

  • Context-to-Query Attention(C2Q)
    计算的是对每一个 context word 而言哪些 query words 和它最相关。计算如下:
    a t = softmax ⁡ ( S t : ) ∈ R J U ~ : t = ∑ j a t j U : j \begin{aligned} &a _ { t } = \operatorname { softmax } \left( S _ { t : } \right) \in R ^ { J }\\ &\widetilde{ U } _ { : t } = \sum _ { j } a _ { t j } U _ { : j }\\ \end{aligned} at=softmax(St:)RJU :t=jatjU:j
    • t t t 表示 Context 中的 第 t t t 个 token;“ t : t: t:” 表示 Context 中的 第 t t t 个 token 与 Query中的每一个 token 进行 相似度计算(计算score);
    • a t a_t at 表示 Context 中的第 t t t 个 token 在Query的每一个 token 上的Attention权重(总和为1);
    • U ~ : t \widetilde{ U } _ { : t } U :t 表示经过了Attention后的Query表示;
    • 具体讲,就是将 S S S 相似度矩阵每一行经过softmax层直接作为注意力值,因为S中每一行表示的是上下文文本中第 i i i 个词与问题文本中每一个词之间的相似度,C2Q表示的是文本对问题的影响,所以得到 a t a_t at 就直接与 U U U 中的每一列加权求和得到新的 U ~ : t \widetilde{ U } _ { : t } U :t,最后拼成新的问题编码 U ~ \widetilde{U} U ,它是一个 2 d × T 2d\times{T} 2d×T 的矩阵。
  • Query-to-Context Attention(Q2C)
    计算的是对每一个 query word 而言哪些 context words 和它最相关,因为这些 context words 对回答问题很重要,故直接取相关性矩阵中最大的那一列,对其进行 softmax 归一化计算 context 向量加权和,然后重复 T T T 次得到 H ~ ∈ R 2 d ∗ T \widetilde{ H } \in R ^ { 2 d * T } H R2dT,计算公式如下:
    b = softmax ⁡ ( max ⁡ c o l ( S ) ) ∈ R T h ~ = ∑ t b t H : t ∈ R 2 d \begin{aligned} &b = \operatorname { softmax } \left( \max _ { c o l } ( S ) \right) \in R ^ { T }\\ &\widetilde{ h } = \sum _ { t } b _ { t } H _ { : t } \in R ^ { 2 d }\\ \end{aligned} b=softmax(colmax(S))RTh =tbtH:tR2d
    在这里插入图片描述

这时就得到了 U ~ \widetilde{U} U H ~ \widetilde{H} H ,这两个矩阵都是 2 d × T 2d\times{T} 2d×T 的。

得到了 U ~ \widetilde{U} U H ~ \widetilde{H} H 两个注意力方向的新的问题编码文本编码之后,添加上第3层得到的上下文编码 H : t H_{:t} H:t,经过一个MLP的函数 β \beta β 将两者拼接起来得到问题感知的上下文文本表示 G G G,即
G : t = β ( H : t , U ~ t , H ~ : t ) ∈ R d G G _ { : t } = \beta \left( H _ { : t } , \widetilde{ U } _ { t } , \widetilde{ H } _ { : t } \right) \in R ^ { d G } G:t=β(H:t,U t,H :t)RdG

实验中尝试比较好的拼接方式为 β ( h , u ~ , h ~ ) = [ h ; u ~ ; h ⊙ u ~ ; h ⊙ h ~ ] ∈ R 8 d ∗ T \beta ( h , \widetilde{ u } , \widetilde{ h } ) = [ h ; \widetilde{ u } ; h \odot \widetilde{ u } ; h \odot \widetilde{ h } ] \in R ^ { 8 d * T } β(h,u ,h )=[h;u ;hu ;hh ]R8dT

5、Modeling Layer

编码层输入是上层的输出 G G G,再经过一次 Bi-LSTM 得到 M ∈ R 2 d ∗ T M \in R ^ { 2 d * T } MR2dT,这一层的作用和第三层的作用一样,都是来捕获输入矩阵的在时序上依赖关系,从结果上看则是一层编码降维的过程,与第三层不同的是,这一层的编码向量里面是与问题相关的表征。

6、Output Layer(Pointer-Net 指针网络)

这一层和以往的QA任务使用的一样,输出层就是用来预测答案起始位置 p 1 \mathbf {p}^1 p1 和结束位置 p 2 \mathbf {p}^2 p2 的,起始位置计算公式如下:

p 1 = softmax ⁡ ( W ( p 1 ) T [ G ; M ] ) p ^{ 1 } = \operatorname { softmax } \left( W _ { \left( p ^ { 1 } \right) } ^ { T } [ G ; M ] \right) p1=softmax(W(p1)T[G;M])

预测终止位置时M需要经过另一个双向LSTM得到 M 2 = B i L S T M ( M ) ∈ R 2 d × T \mathbf { M } ^ { 2 } =BiLSTM(M)\in \mathbb { R } ^ { 2 d \times T } M2=BiLSTM(M)R2d×T

p 2 = softmax ⁡ ( W ( p 2 ) T [ G ; M 2 ] ) p ^{ 2 } = \operatorname { softmax } \left( W _ { \left( p ^ { 2 } \right) } ^ { T } \left[ G ; M ^ { 2 } \right] \right) p2=softmax(W(p2)T[G;M2])

最后训练时的损失函数为:

L ( θ ) = − 1 N ∑ i N [ log ⁡ ( p y i 1 1 ) + log ⁡ ( p y i 2 2 ) ] L ( \theta ) = - \frac { 1 } { N } \sum _ { i } ^ { N } \left[ \log \left( p _ { y _ { i } ^ { 1 } } ^ { 1 } \right) + \log \left( p _ { y _ { i } ^ { 2 } } ^ { 2 } \right) \right] L(θ)=N1iN[log(pyi11)+log(pyi22)]

其中 y i 1 y _ { i } ^ { 1 } yi1 y i 2 y _ { i }^2 yi2 是真实的起始终止位置。

四、BiDAF实验结果

这篇阅读笔记关注点在于模型的实现,因为时间较早,实验自然结果比以往模型取得的性能要好但是毕竟过去一年了尤其BERT出来以后,,,,它的结果更加。。。不再赘述。

在提交时,我们的BIDAF模型在竞争激烈的斯坦福问答数据集(SQuAD)测试集排行榜上的表现 优于以前的所有方法。

实验数据集使用的是SQuAD还有一个完形填空阅读理解任务(这里不在列出,有兴趣可以看原文)。SQuAD是斯坦福问题回答数据集,这是一个阅读理解数据集,最大特点是所回答的答案是给出段落的一个片段(现在已经出了SQuAD2.0,详细需要访问The Stanford Question Answering Dataset,比较详细而且给出了目前较新的性能)。

实验结果如图1所示:
在这里插入图片描述
目前该模型在SQuAD1.0的排行是42名,最高的如BERT的 F 1 F_1 F1 已经达到91.221,但是需要明白该模型的亮点在于双向注意力机制的提出,这种双向注意力机制在QA任务中充当编码器或者推理单元中的一环对后续的性能产生更大的影响,这才是最为重要的。

通过只修改输出层(将Pointer-Net改为一个线性层+Softmax用于Cloze Text的答案分类),BIDAF在CNN/DailyMail完形填空测试中获得了最先进的结果。

五、论文总结

关键点:

  • 如何以不同的粒度设计一个多阶 段的层级处理的结构
  • 针对目前的attention机制,怎么 设计一个novel的双向注意力机制 的结构

创新点:

  • 以不同的粒度提出了一个多阶段的层级处理的上下文编码器
  • 提出了BIDAF模型,考虑了C2Q和Q2C两个方向的注意力流

启发点:

  • 这一篇文章是针对抽取式的阅读理解。生成的任务应该怎么做?
  • 抽取阅读理解中的假设:每个问题都能被回答,那么现实并不是这样的。
  • 针对设计的双向机制,虽然能够取得很好的效果,但是在WHY这一类的问题上,效果还是很差。



参考资料:
Match-LSTM & BiDAF
机器阅读理解系列文章-BiDAF(Bi-Directional Attention Flow for Machine Comprehension)
基于R-Net、QA-Net和BiDAF实现中文观点型问题机器阅读理解
独家 | 图解BiDAF中的单词嵌入、字符嵌入和上下文嵌入(附链接)
阅读理解-bidaf模型
机器阅读理解之BiDAF模型
阅读理解之(bidaf)双向注意力流网络
BiDAF:机器理解之双向注意力流

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值