Bidirectional attention flow for machine comprehension论文笔记

##Bidirectional attention flow for machine comprehension论文笔记

attention可以让系统重点关注一个部分,这和QA相关。之前的attention的特征有:计算特征的权值是为了提取上下文中最相关的信息;attention的权值是变化的,是前一个时间点向量的函数;通常是单向的。

BIDAF用到了字符级,单词级,以及上下文级别的embedding,是细粒度的。主要的提高:

  • attention层不是用来把上下文归结为一个固定大小的向量,而是每个时间点都会计算attention,attention和先前层的表示都会在模型里向后流动,这可以减少过早的总结带来的信息损失

  • 内存更少,每个时间计算attention是现在的问题+上下文的函数,而不是直接依赖于先前的attention,这可以减小attention和模型层的计算量。这样可以使得模型层专注于理解问题。

  • 双向的attention提供互补的信息

模型包含六层:

  1. 字符级embedding,用字符级CNN把每个单词映射成一个向量。用 { x 1 , x 2 , ⋯   , x n } \{x_1,x_2,\cdots,x_n\} {x1,x2,,xn} { q 1 , q 2 , ⋯   , q n } \{q_1,q_2,\cdots,q_n\} {q1,q2,,qn}表示context和query中的单词,用Kim的方法使用CNN获得每个单词的字符级embedding,这些embedding vector的大小就是CNN的input channel,然后可以做卷积,max-pool池化,得到固定长度的vector。

  2. 单词级embedding,用预训练的模型(glove),把每个单词word映射成向量。character和word embedding连接起来,跑一个两层的highway network(没看过),得到两个d维向量,实际上就是一个 d × T d\times T d×T的矩阵 X X X(context)和一个 d × J d\times J d×J维的矩阵 Q Q Q(query),其中 T T T J J J是context和query的长度。

  3. 上下文embedding,从上下文单词中提取线索(cue)优化word embedding,这三层既用在问题也用在上下文。更具体的,对 X X X Q Q Q 都用一个BiLSTM,得到 2 d × T 2d\times T 2d×T H H H 2 d × J 2d\times J 2d×J U U U

    前三层是在对上下文和问题做不同粒度的特征提取,类似于CV中多个阶段的CNN提取不同特征。

  4. attention flow,把问题和上下文的向量组合,形成query-aware特征向量集合。之前提到,每个时间点上的attention向量,还有之前层的embedding,都可以去到下面的模型层。所以这一层,输入是 H H H U U U,输出是上下文的特征向量 G G G,还有之前层的embedding。

    attention分为context-to-query和query-to-context两部分。他们都需要用到一个相似性矩阵 S S S,它是 T × J T\times J T×J维的,其中 S t j S_{tj} Stj表示第t个context word和第j个query word的相似度。公式是:

    S t j = α ( H : t , U : j ) S_{tj}=\alpha(H_{:t},U_{:j}) Stj=α(H:t,U:j)

    其中 α \alpha α是一个可训练的标量函数, H : t H_{:t} H:t H H H的第t列, U : j U_{:j} U:j U U U的第j列。我们让 α ( h , u ) = w S T [ h ; u ; h ∘ u ] \alpha(h,u)=w^T_{S}[h;u;h\circ u] α(h,u)=wST[h;u;hu],其中 w s w_{s} ws是可训练的6d维权值向量(2d+2d+2d), ∘ \circ 是矩阵的元素乘法, [ ; ] [;] [;]是横向的向量连接。下面就可以用 S S S得到两个方向的注意力了。

    Context-to-query:表明对每个context word哪些query word和它最相关。即 a t = s o f t m a x ( S t : ) ∈ R J a_t=softmax(S_{t:})\in R^J at=softmax(St:)RJ。然后可以计算 U ~ : t = ∑ j a t j U : j \widetilde{U}_{:t}=\sum_j a_{tj}U_{:j} U :t=jatjU:j,是一个 2 d × T 2d\times T 2d×T维矩阵。

    Query-to-context:表明对每个query word,哪些context word和它最相关。寻找方法是,先确立 b = s o f t m a x ( m a x c o l ( S ) ) ∈ R T b=softmax(max_{col}(S))\in R^T b=softmax(maxcol(S))RT h ~ = ∑ t b t H : t ∈ R 2 d \widetilde{h}=\sum_tb_tH_{:t}\in R^{2d} h =tbtH:tR2d。这个向量表明了context中和query相关的最重要的单词的加权和。 h ~ \widetilde{h} h 列向量横向堆叠T次,生成 H ~ ∈ R 2 d × T \widetilde{H}\in R^{2d\times T} H R2d×T

    最后把这两个attention向量合并。定义

    G : t = β ( H : t , U ~ : t , H ~ : t ) ∈ R 8 d G_{:t}=\beta(H_{:t},\widetilde{U}_{:t},\widetilde{H}_{:t})\in R^{8d} G:t=β(H:t,U :t,H :t)R8d

    β \beta β还是可训练的向量, β ( h , u ~ , h ~ ) = [ h ; u ~ ; h ∘ u ~ ; h ∘ h ~ ] ∈ R 8 d × T \beta(h,\widetilde{u},\widetilde{h})=[h;\widetilde{u};h\circ \widetilde{u};h\circ \widetilde{h}]\in R^{8d\times T} β(h,u ,h )=[h;u ;hu ;hh ]R8d×T,得到了输出 G G G

  5. 模型层,输入是上一层的 G G G,也就是query-aware向量。用一个两层的BiLSTM,每个方向的output dim都是d,那么可以得到一个 M ∈ R 2 d × T M\in R^{2d\times T} MR2d×T M M M的每一列都包含了这个词关于context和query的上下文信息。

  6. 输出层,输出答案。QA任务要求模型要找到context的一个部分来回答问题(起始和结束索引),获得开始索引的方法是:

    p 1 = s o f t m a x ( w p 1 T [ G ; M ] ) p^1=softmax(w^T_{p^1}[G;M]) p1=softmax(wp1T[G;M])

    w p 1 T w^T_{p^1} wp1T是可训练的权值向量。找到结束索引是类似的,但需要先把 M M M跑一个BiLSTM,获得 M 2 ∈ R 2 d × T M^2\in R^{2d\times T} M2R2d×T。然后用和上面类似的公式:

    p 2 = s o f t m a x ( w p 2 T [ G ; M 2 ] ) p^2=softmax(w^T_{p^2}[G;M^2]) p2=softmax(wp2T[G;M2])

最后关于损失函数:

L ( θ ) = − 1 N ∑ i N log ⁡ ( p y i 1 1 ) + log ⁡ ( p y i 2 i ) L(\theta)=-\frac{1}{N}\sum_i^N\log(p^1_{y_i^1})+\log(p^i_{y_i^2}) L(θ)=N1iNlog(pyi11)+log(pyi2i)

其中 y i 1 y_i^1 yi1 y i 2 y_i^2 yi2是第i个样本真实的起始、结束索引。

关于测试:为了选择出概率最大的answer对应范围 ( k , l ) (k,l) (k,l),即要求max value of p k 1 p l 2 p_k^1p_l^2 pk1pl2,可以线性时间内用dp完成。

你可能感兴趣的:(Bidirectional attention flow for machine comprehension论文笔记)