引言

这是Bi-DAF1论文的阅读笔记,人们对Bi-DAF评价很高,说它是阅读理解的开山之作。

作者提出了双向注意力流网络(Bi-Directional Attention Flow,BiDAF),是一种层级架构的多粒度文本表示建模方法,可以表示不同粒度级别的上下文,使用双向注意流机制获取查询感知(query-aware)的上下文表示,而不是压缩上下文到定长向量。

核心思想

BiDAF包含字符级、单词级和上下文嵌入,并使用双向注意力流获取查询感知的上下文表示。

  • 这里的注意力层没有将上下文压缩到定长向量,而是在每个时间步上计算注意力,并允许每层的向量表示能传递到后续层,减少了信息损失。

  • 采用无记忆的注意力机制,在当前时间步的注意力并不依赖之前(时间步)的注意力的值。这可以强制注意力层专注于在查询和上下文间学习注意力,并使建模层专注于学习查询感知的上下文表示内的交互(注意层的输出)。

  • 采用的注意力是双向的,既有从上下文(文章)到查询(问题)的注意力,又有从查询到上下文的注意力。

作者提出的模型是一种多阶段的层级架构,由六层组成(如上图所示)。我们来详细看下每层。

字符级嵌入层(Character Embedding Layer)

使用字符级CNN映射每个单词到高维向量空间。主要用于解决未登陆词问题,和BERT时代的BBPE有异曲同工之妙。

假设{x1,⋯,xT}\{x_1,\cdots,x_T\}{x1,,xT}{q1,⋯,qJ}\{q_1,\cdots,q_J\}{q1,,qJ}分别代表输入的上下文和查询中的单词。使用CNN网络获取每个单词的字符级嵌入向量。

把上下文和查询中的每个单词输入到1D-CNN后,我们会分别得到下上文和查询的嵌入矩阵,这些矩阵的长度与上下文或查询的长度相同,矩阵的高度依赖于1D-CNN中应用的卷积核数量。

本小节图片来自于https://nlp.seas.harvard.edu/slides/aaai16.pdf

为了更好的理解字符级CNN,我们一起看一个例子。

假设我们想要在单词“absurdity”(荒谬)上应用1D-CNN。首先单词中的每个字符表示为ddd维的向量,这些向量可以是随机初始化的。单词中的所有字符会形成一个d×ld \times ld×l的矩阵CCClll是单词中字符数量。

假设我们这里的d=4d=4d=4,我们刚开始得到如下矩阵。

然后,我们应用一个卷积核HHH来扫描单词,卷积核的高度与CCC相同,它的宽度通常小于lll,并且不同的卷积核是不同的。卷积核中的值也是随机初始化,并且可学习的。这里假设该卷积核的宽度为w=3w=3w=3

把卷积核HHH覆盖到矩阵CCC的最左边,应用卷积运算得到一个标量。

如上图所示,我们框住了该矩阵中前三个字符,经过卷积运算得到标量0.10.10.1,作为输出的新向量fff的第一个元素值。

把卷积核向右移动一步,得到第二个标量0.70.70.7,作为fff向量的第二个元素。

重复该步骤,直到卷积核移动到了最右端,这样就得到完整的fff向量,它的长度是l−w+1l-w+1lw+1。该向量时我们通过这个卷积核得到的单词数值表示。

接着,再应用一个最大池化操作到fff上,最大池化可以看成是取最重要的信息。我们这里最大池化后的输出为0.70.70.7

假设我们再应用另一个宽度w=2w=2w=2的卷积核H′H^\primeH,又可以得到另一个向量f′f^\primef

虽然f′f^\primef的长度和fff不同,但是经过最大池化后还是得到一个标量。

我们可以使用不同宽度的卷积核重复这种扫描操作,每个卷积核可以得到一个标量。把这些标量拼在一起就可以看成是该单词的嵌入向量。

这里获得了一个单词的嵌入向量,把整个上下文或问题的单词都操作一遍,就可以得到它们的嵌入矩阵。嵌入矩阵的高度和卷积核的数量相同,宽度等同于上下文或问题中的单词数量。

至此,字符级嵌入层分析完毕,我们来看单词级嵌入层。

单词级嵌入层(Word Embedding Layer)

使用预训练的词嵌入模型映射单词到高维向量空间。作者使用的预训练词嵌入模型是GloVe。

得到了GloVe输出的定长词嵌入向量之后。燃料后将上面得到的字符级嵌入和这里的单词级嵌入进行垂直拼接(叠加),输入到一个两层的高速网络(Highway network)2,该网络的输出是两个矩阵,分别是对应上下文的X∈Rd×TX \in \Bbb{R}^{d \times T}XRd×T和对应问题的Q∈Rd×JQ \in \Bbb{R}^{d \times J}QRd×J

整个过程如上图所示,我们来看下高速网络。

其实思想很简单,启发于LSTM中,使用门阀函数来选择性的传递信号到下一层。
y=H(x,WH)y = H(x,W_H) y=H(x,WH)
通常HHH是普通前馈神经网络中的仿射变换(affine transform),然后输入到非线性激活函数中。

xxx是输入,WHW_HWH是权重。

仿射变换:线性变换+平移

如果此时将该值输入到非线性激活函数然后继续传递到下一层,就是普通的前馈网络。

而高速网络引入了一个门T(x)=σ(WTTx+bT)T(x)=\sigma(W^T_T x + b_T)T(x)=σ(WTTx+bT),与LSTM中的门一样,经过Sigmoid函数将输出压缩到[0,1][0,1][0,1]之间。

引入了TTT之后,上式yyy的计算方式变成了:
y=H(x,WH)⋅T(x,WT)+x⋅(1−T(x,WT))y = H(x, W_H) \cdot T(x,W_T) + x \cdot (1 - T(x,W_T)) y=H(x,WH)T(x,WT)+x(1T(x,WT))
使用高速网络,可以让模型学习到在遇到未登录词的时候,抑制GloVe的输出,而增强CNN的输出。

上下文嵌入层(Contexual Embedding Layer)

使用来自周围单词的上下文来改善单词的嵌入。前三层同时应用于查询和上下文。

使用LSTM在第二层提供的词嵌入之上来模拟单词之间的时间交互。这里使用了双向LSTM,同时拼接了两个方向上的输出。因此,我们基于下文词向量XXX上得到H∈R2d×TH \in \Bbb{R}^{2d \times T}HR2d×T,基于问题词向量QQQ得到了U∈R2d×JU \in R^{2d \times J}UR2d×J

这里的2d2d2d是拼接两个方向上的输出得来的。

值得一提的是,模型的前三层是基于查询和上下文从不同层级、不同粒度计算特征表示,类似于计算机视觉领域中卷积网络多阶段特征计算。

注意力流层(Attention Flow Layer)

融合查询和上下文向量,并为上下文中的每个单词生成一组查询感知特征向量。

注意力流层负责连接并融合上下文和查询中单词的信息,注意力流层并没有将查询和上下文编码到单个特征向量中,而是在每个时间步,和来自前一层的嵌入向量,都可以流向后续的建模层。这减少了由于过早压缩导致的信息丢失。

该层的输入是下上文HHH和查询UUU的向量表示。该层的输出是上下文单词GGG的查询感知的向量表示,以及来自前一层的嵌入向量。

在本层中,我们以两个方向计算注意力:从上下文到查询以及从查询到上下文。这些注意力都是由上下文嵌入向量HHH和查询嵌入向量UUU计算的共享相似矩阵S∈RT×JS \in \Bbb{R}^{T \times J}SRT×J计算而来的。其中StjS_{tj}Stj表示第ttt个上下文单词和第jjj个查询单词之间的相似度。相似度矩阵计算公式为:
Stj=α(H:t,U:j)∈RS_{tj} = \alpha(H_{:t},U_{:j}) \in \Bbb{R} Stj=α(H:t,U:j)R
其中α\alphaα是可学习的基于两个输入向量的编码函数;H:tH_{:t}H:tHHH的第ttt列向量;U:jU_{:j}U:jUUU的第jjj列向量。

作者选择的函数α(h,u)=w(S)T[h;u;h∘u]\alpha(h,u)=w^T_{(S)}[h;u;h \circ u]α(h,u)=w(S)T[h;u;hu],其中w(S))∈R6dw_{(S)}) \in \Bbb{R}^{6d}w(S))R6d是可训练的权重向量,∘\circ是元素相乘;[;][;][;]是沿着行的向量拼接。这里h=H:t∈R2d×1h=H_{:t} \in \Bbb{R}^{2d \times 1}h=H:tR2d×1u=U:j∈R2d×1u=U_{:j} \in \Bbb{R}^{2d \times 1}u=U:jR2d×1[h;u;h∘u]∈R6d×1[h;u;h\circ u] \in \Bbb{R}^{6d \times 1}[h;u;hu]R6d×1,与w(S)Tw_{(S)}^Tw(S)T相乘刚好得到一个标量。

我们就可以使用SSS来计算两个方向上的注意力。

上下文到查询注意力(Context-to-query Attention, C2Q) C2Q注意力代表对于每个上下文单词,哪个查询单词与之最相关。令at∈RJa_t \in \Bbb{R}^JatRJ表示第ttt个上下文单词上所有查询单词的注意力权重,∑jatj=1\sum_{j}a_{tj}=1jatj=1。注意力权重计算为:at=softmax(St:)∈RJa_t =\text{softmax}(S_{t:}) \in \Bbb{R}^Jat=softmax(St:)RJ,接着用ata_tatUUU计算加权和,得到注意的查询向量U~:t=∑jatjU:j\tilde U_{:t} =\sum_j a_{tj} U_{:j}U~:t=jatjU:j。因此U~\tilde UU~是一个2d×T2d \times T2d×T的矩阵,包含整个上下文的注意的查询向量,我们相当于把查询信息融入到上下文当中了。

查询到上下文注意力(Query-to-context Attention,Q2C) Q2C注意力代表哪个上下文单词与某个查询单词最相关,然后对回答查询(问题)最重要。我们基于上下文单词获得注意力权重为b=softmax(max⁡col(S))∈RTb= \text{softmax}(\max_{col}(S)) \in \Bbb R^{T}b=softmax(maxcol(S))RT,其中max⁡col\max_{col}maxcol是沿着SSS矩阵列的方向计算最大值。然后注意的上下文向量是h~=∑tbtH:t∈R2d\tilde h=\sum_t b_t H_{:t} \in \Bbb{R}^{2d}h~=tbtH:tR2d。该向量表示上下文中与查询相关的最重要单词的加权和。h~\tilde hh~沿着列复制TTT次,得到H~∈R2d×T\tilde H \in \Bbb{R}^{2d \times T}H~R2d×T

最终,上下文嵌入向量和注意力权重结合生成GGG,其中每列向量可以看成每个上下文单词查询感知的表示。我们定义GGG为:
G:t=β(H:t,U~:t,H~:t)∈RdGG_{:t} = \beta(H_{:t},\tilde U_{:t},\tilde H_{:t}) \in \Bbb{R}^{d_G} G:t=β(H:t,U~:t,H~:t)RdG
其中G:tG_{:t}G:t是第ttt列向量(对应第ttt个上下文单词),β\betaβ是可学习的向量函数,融合了它的三个输入向量,dGd_GdGβ\betaβ函数的输出维度。尽管β\betaβ函数可以用任意的神经网络,比如多层感知机,但如下这种简单的拼接仍然可得到好的表现:
β(h,u~,h~)=[h;u~;h∘u~;h∘h~]∈R8d×T\beta(h,\tilde u, \tilde h) = [h;\tilde u;h \circ \tilde u;h \circ \tilde h] \in \Bbb{R}^{8d \times T} β(h,u~,h~)=[h;u~;hu~;hh~]R8d×T
这里dG=8dd_G=8ddG=8d

建模层(Modeling Layer)

应用一个RNN来提取上下文中的信息。

输入到建模层的是GGG,它编码了上下文单词查询感知的表示。该层的输出捕获了基于查询的上下文单词之间的交互。这与上下文嵌入层不同,上下文嵌入层捕获的是独立于查询的上下文单词之间的交互。这里使用了两层双向LSTM,每个方向上的输出大小为ddd。因此我们得到了一个矩阵M∈2d×TM \in \Bbb{2d \times T}M2d×T,它会传递到输出层去预测答案。

M的每个列向量包含关于关于整个上下文和查询信息的上下文信息表示。

输出层(Output Layer)

生成基于查询的答案。

输出层是应用相关的。BiDAF 的模块化特性允许我们轻松地基于任务改变输出层,而保存其他层不变。这和现在的BERT有点像了。

这里我们以问答任务为例来描述输出层,问答任务需要模型从文章中找到一个连续的片段来回答问题,通过预测答案的开始和结束位置来从文章中抽取答案。我们通过一下公式在整个文章上计算开始位置的概率分布:
p1=softmax(w(p1)T[G;M])p^1 = \text{softmax}(w^T_{(p^1)}[G;M]) p1=softmax(w(p1)T[G;M])
其中w(p1)∈R10dw_{(p^1)} \in \Bbb{R}^{10d}w(p1)R10d是可训练的权重向量。对于答案的结束位置,我们将MMM传递到另一个双向LSTM以得到M2∈R2d×TM^2 \in \Bbb{R}^{2d \times T}M2R2d×T。然后以类似的方式用M2M^2M2来获得结束位置的概率分布:
p2=softmax(w(p2)T[G;M2])p^2 = \text{softmax}(w^T_{(p^2)}[G;M^2]) p2=softmax(w(p2)T[G;M2])
训练 定义训练损失为预测分布对应的真实开始和结束位置的负对数似然的之和,并求所有样本上的均值:
L(θ)=−1N∑iNlog⁡(pyi11)+log⁡(pyi22)L(\theta) = -\frac{1}{N} \sum_i ^N \log(p^1_{y^1_i}) + \log(p^2_{y_i^2}) L(θ)=N1iNlog(pyi11)+log(pyi22)
其中θ\thetaθ是模型的可训练权重参数集合,NNN是数据集的样本总数,yi1y^1_iyi1yi2y_i^2yi2是第iii个样本的真实开始和结束位置,pkp_kpk表示向量ppp的第kkk个值。

测试 答案片段(k,l)(k,l)(k,l),其中k≤lk \leq lkl,是最大的pk1pl2p_k^1p_l^2pk1pl2,可以用动态规划以线性时间计算出来。

Reference


  1. BI-DIRECTIONAL ATTENTION FLOW FOR MACHINE COMPREHENSION ↩︎

  2. Highway Networks ↩︎

[论文笔记]BI-DIRECTIONAL ATTENTION FLOW FOR MACHINE COMPREHENSION相关推荐

  1. 机器阅读理解系列文章-BiDAF(Bi-Directional Attention Flow for Machine Comprehension)

    0. 简介 BiDAF采用多阶段的.层次化处理,使得可以捕获原文不同粒度的特征.同时使用双向的attention流机制以在without early summarization的情况下获得相关问句和原 ...

  2. Bi-Direction attention flow for machine reading(原理篇)

    文章目录 1.Attention Summary 2.Model Architecture 2.1.Input embedding layer 2.2.Embedding encoder layer ...

  3. 【论文笔记】Multi-Interactive Attention Network for Fine-grained Feature Learning in CTR Prediction

    <Multi-Interactive Attention Network for Fine-grained Feature Learning in CTR Prediction>论文学习 ...

  4. [论文笔记-1]Aspect-based Sentiment Analysis as Machine Reading Comprehension

    题目.作者 一.Abstract 1. 现有的研究通常通过堆叠多个神经模块来处理基于方面的情感分析,这不可避免地导致严重的错误传播 2. 本文提出了MRCOOL: MRC-PrOmpt mOdeL框架 ...

  5. (论文笔记)An Attention Enhanced Graph Convolutional LSTM Network for Skeleton-Based Action Recognition

    An Attention Enhanced Graph Convolutional LSTM Network for Skeleton-Based Action Recognition 文章目录 An ...

  6. 论文笔记--Fine-Grained Service-Level Passenger Flow Prediction for Bus Transit Systems

    Fine-Grained Service-Level Passenger Flow Prediction for Bus Transit Systems Based on Multitask Deep ...

  7. 【论文笔记】Supervised Attentions for Neural Machine Translation

    2016年的文章,还是在attention机制上的改进. 核心思路"监督":计算注意力和真实对齐情况的举例,并将其作为模型损失进行训练 简介 Introduce Given the ...

  8. 【论文笔记】Knowledgeable Reader_ Enhancing Cloze-Style Reading Comprehension with External Commonsense Kg

    Abstract和介绍 论文特点:引入了external commonsense knowledge, encode as key-value memory,并把知识和context represen ...

  9. Attention Is All You Need 论文笔记

    Attention Is All You Need 论文笔记 文章目录 Attention Is All You Need 论文笔记 背景 Tansformer模型简介 Attention & ...

  10. 光流 速度_[论文笔记] FlowNet 光流估计

    [论文笔记] FlowNet: Learning Optical Flow with Convolutional Networks 说在前面 个人心得: 1. CNN的光流估计主要是速度上快,之后的v ...

最新文章

  1. 人工智能正在引领全球企业的创新
  2. Redhat linux5.5下Oracle 10g 安装配置手册一
  3. linux 挂载网络文件系统,[arm-linux-FL2440挂载网络文件系统共享文件]
  4. SpringBoot简单使用ehcache
  5. foxmail 服务器备份 立刻删除_PC整机备份与还原教程 Active Backup for Business
  6. ML in Action 决策树
  7. Linux RHEL6 x64 命令行静默安装 Oracle 12c - 2
  8. css 这个特性,你敢信
  9. 那些设计出来就不希望别人看懂的C代码——IOCCC国际模糊C代码大赛
  10. 松江区企业技术中心认定条件及奖励政策解读
  11. Vue组件通信(父传子、子传父、兄弟传值)
  12. JAVA 逆向工程技术研究日志
  13. iphone快捷指令蚂蚁森林能量_iPhone「快捷指令」怎么玩?玩法太多,别让这个功能吃灰...
  14. 美国高校代理服务器地址
  15. SCANV团队提供APPCMS安全漏洞独立补丁
  16. java中报出异常java.net.MalformedURLException: unknown protocol: jrt
  17. window10 多桌面切换快捷键 win+tab
  18. 猫眼 — 破解数字反爬获取实时票房
  19. MongoDB3:复制集
  20. 爬取网易云音乐评论《安河桥》,进行分析

热门文章

  1. [转帖] 国产x86-海光禅定 2018年营收过亿?
  2. 想要接触人工智能吗?先要学会如何阅读论文
  3. nginx反向代理解决跨域
  4. 深度学习模型的可视化技术总结
  5. Qt5.3.2(VS2010)_调试_进入Qt源码
  6. 常见排序算法以及对应的时间复杂度和空间复杂度
  7. 获取css样式的方法
  8. vmware 下centos7配置网络
  9. 单利计算与复利计算程序
  10. HDU-3729 I'm Telling the Truth