基于深度神经网络的自动问答系统概述

广而告之

SIGAI-AI学习交流群的目标是为学习者提供一个AI技术交流与分享的平台。操作指引:关注本微信公众号,回复“芝麻开门”,即可收到入群二维码,扫码即可。

同时在本微信公众号中,回复“SIGAI”+日期,如“SIGAI0515”,即可获取本期文章的全文下载地址(仅供个人学习使用,未经允许,不得用于商业目的)。

SIGAI特邀作者

穆文MuWen

NLP从业者

目前兴趣点:问答系统、序列标注、文本生成

个人微信公众号:数据挖掘机养成记

本文受众

对 NLP 感兴趣

想入门阅读理解/自动摘要/自动问答

基于深度神经网络的自动问答系统概述

1.引子

2.门派

2.1.背景

2.2.脉络

3.章法

3.1. GA-Reader

模型结构

杀手锏

3.2. Match-LSTM

模型结构

杀手锏

3.3. Bi-DAF

模型结构

杀手锏

3.4. R-Net

模型结构

杀手锏

3.5. QA-Net

模型结构

杀手锏

3.6. S-Net

模型结构

杀手锏

3.7. R3

模型结构

杀手锏

引子

学术圈的生存之道,无非『挖坑灌水』四字真言。大仙鼻祖挖坑,徒子徒孙灌水。坑越挖越大,水越灌越多,终成一片繁荣的小江湖。而『深度神经网络+自动问答系统』,就是这样一个好坑。而本文,将带着各位读者,趟一趟这个大坑,会一会各路大仙们的套路。作为一篇科普文,

本文会探讨:

模型结构和对比、简单的公式。

本文不会涉及:

复杂的公式,

比赛刷榜的奥义(包括:数据集、特征工程、调参技巧)。

2

门派

2.1. 背景

问答系统的实现机制多种多样,基于信息检索 (IR: Information Retrieval) 的、基于问答知识库 (KB: Knowledge Base) 的、基于知识图谱 (KG: Knowledge Graph) 的等等,一个相对完善的问答系统往往是多种机制的组合。

而本文提到的问答系统,特指:

给定一个问题 Q 和一个与 Q 相关的文档 D,自动得到 Q 对应的答案 A

这样的系统有一个更学术的名字: 机器阅读理解 (MRC: Machine Reading Comprehension),它既可以作为一个独立的问答系统,也可以看成是一个完整问答系统的一部分: 即,在 IR 检索出跟 Q 相关的文档 D 的基础上,机器去阅读并理解 Q 和 D,得到答案 A。

将问答系统用一图以蔽之:

(图片来自网络,侵权请告知)

2.2. 脉络

用简单的数学符号来表达问答系统要做的事情:

f(Q, D) = A

(题外话: 如果我们去掉 Q,便成了 f(D) = A,也就是一个摘要系统。所以,问答系统的模型稍加改造,可以无缝对接到『自动摘要』上去。)

回想一下,我们人类是怎么解决阅读理解问题的?

我们会仔细阅读问题和文章,带着问题去文章里找答案,如果文章里有现成的答案片段,我们直接抽取出来,如果没有,我们需要组织自己的语言去生成一个回答。

机器其实跟我们的套路是一样的:

这,便是深度问答系统、机器阅读理解的『套路』,可以用一个更简单明了的图来表示:

因此,按照模型各个组成部分的不同,可以将其大致分成以下几类『门派』:

每种模型都或多或少融合了不同门派的风格,既有各自的特色,更有相互的传承,且待下文慢慢道来。

这里要说明一下,decoder 的不同主要因为数据集的不同,有些数据集里的答案 A 可以直接从 D 里面抽取出来,比如 SQuAD 数据集, 有些则需要抽取+生成,比如 MS-MARCO 、 DuReader 和最新的 SQuAD 2.0 数据集。(P.S. 我们在 DuReader 比赛中,用单模型(不做特征工程),刷到过第三)

章法

我们将一网打尽当前常见问答系统、阅读理解的各路模型,细数他们套路章法的特别之处。 若有漏网之鱼,读者朋友务必留言指出。

为避免不必要的江湖纷争,特此声明:

模型有门派之异,但无优劣之分。以下模型的排序乃随机抽样的结果,与诞生时间、模型先进性无任何关系。

鉴于每种模型的大框架都是上节提到的 『套路』,所以接下来我们只提及模型的特别之处,具体的公式细节乃至源代码,请各位自行参考相关论文。

3.1. GA-Reader

秘籍传送门: GA-Reader

模型结构

杀手锏

1.) 在每层 encoder 里都加入了一个 『GA (Gated Attentnion)』 结构,其公式如下:

顾名思义,GA 就是用 attention 的思想,用 Q 的 encoding 给 D 里每个词 di 的 encoding 加一个 『gate』 ai,再传入下一层。

2.) 加深 encoder 的深度,在每一层都设置 GA 结构,使得 Q 能在不同粒度上被融合进 D。

3.) decoder 用 softmax 函数来预测答案里的所有词,比如文档 D 是 [ '水', '能', '载舟', '亦', '可', 'citing'], A 是 ['能', '载舟', '亦'],则 label 就是 [0, 1, 1, 1, 0, 0],本质上就是个 multi-label 问题,损失函数用 cross entropy。

3.2. Match-LSTM

秘籍传送门: Match-LSTM

模型结构

杀手锏

1.) encoder 第一部分将 D (图中用 P 表示,代表 Passage) 、Q 分别经过 bi-LSTM 得到的 hp、 hq 拼接在一起,实现 Q 和 D 的第一次融合 2.) encoder 第二部分是重头戏,应用到前人提出的 match-LSTM 模块,公式如下:

通过 attention 机制,得到 D 中每个词 i 关于 Q 里所有词的权重,即公式中的 ai,接着

将 ai 作用到 Q 的 encoding Hq 上,得到一个新的向量,可以认为这个向量是 D 融合了 Q 之后的结果,再跟 Hp 拼接在一起,实现 Q 和 D 的第二次融合。

注意,这里的 attention 机制跟 GA-Reader 有区别,这里得到的是 D 里每个词对 Q 里每个词 两两的权重,而不像 GA-Reader 里 GA 的,得到的是整个 Q 对 D 里每个词的权重。 这也是 Match-LSTM 的特别之处。 输入到下一时刻的向量包含三部分: attention vector, 上一层的 hidden state, 上一时刻的 hidden state,如下所示:

3.) 设计了两种 decoder,即图中的 answer pointer layer 模块:

这两种 decoder 将答案预测看做是一个序列问题,而不是像 GA-Reader 一样看做 multi-label,所以用到了 pointer network 去选择答案。 第一种 decoder 是按顺序预测整个答案序列,仍以 D 是 [ '水', '能', '载舟', '亦', '可', 'citing'], A 是 ['能', '载舟', '亦'] 为例,在第一种 decoder 下,label 是 [1, 2, 3],代表 A 在 D 中的位置,而第二种 decoder 是预测答案边界,即起始位置, label 是 [1, 3]。 文章的实验表明,预测边界效果最好,这也几乎成了后续抽取式模型的『标配』。

(题外话: 关于 pointer network,简言之就是用 attention 的机制,预测目标序列在原文中的位置,每一步解码的概率,就是 attention score 经过 softmax 之后的概率分布。 具体请参考原论文 pointer-network 。)

3.3. Bi-DAF

秘籍传送门: Bi-DAF

模型结构

杀手锏

1.) encoder 跟前面俩模型一样, 考虑到了用 Q 融合进 D、 去 attend D 里的每个词,即图中的 Context2Query 模块,这部分没什么特别的,只是在计算 attention 的时候,多加了 h 和 u 的点乘项,如下:

除此之外,还创新性地用 D 去 attend Q,即图中的 Query2Context 模块,跟 Context2Query 的本质一样,唯一区别是对 attention score 取了 max 后再对 h 加权平均,得到的是单个向量,可以看成是 D 融合进 Q 之后的结果,参与到 encoder 的每个时间步的输入。

2.) encoder 输出层做了个类似 『特征工程』 的 trick,将 h u 等向量进行拼接、两两相乘

3.) decoder 部分看似是新的,但我个人认为本质上还是个 pointer network,即利用 Q 和 D 通过 decoder 每一步出来的 M,去 attend encoder 的输出 G,然后用 softmax 作用,去预测起始位置。 只不过在预测终止位置时,M 又额外经过了一层 LSTM 得到 M2。 损失函数仍然是 cross entropy。

3.4. R-Net

秘籍传送门: R-Net

模型结构

杀手锏

1.) encoder 中加入了一个 Gated Match-LSTM 模块,这也是模型主要 claim 的一个点, 但我认为相对 Match-LSTM,改动并不大。 回顾下 Match-LSTM 里的每步输入:

再看看 Gated Match-LSTM 的输入:

可见唯一的区别就是对输入多加了个 gate gt。 这么做的直观解释是,通过 gt 来过滤掉输入中跟问题和答案不相关的部分。

2.) encoder 中还加入了 self-attention 机制,使得文章内部的词与词之间相互融合,通过自身的上下文信息辅助筛选有价值的词,公式如下:

注意这里的 attention vector ct,是由当前词 vj 和所在文章里的所有词 vt 做 attention 得到的:

3.) decoder 仍然采用 pointer network, 但额外引入了 question 的信息,作为 decoder hidden state 的初始输入,如下图:

3.5. QA-Net

秘籍传送门: QA-Net

模型结构

杀手锏

相信在看过四个 rnn 派的模型后,这个模型一定让大家耳目一新,所以他的杀手锏就是:

1.) encoder 用 cnn 来实现,由多个结构一样的 encoder block 来实现,每个 encoder block 长下面这样:

每个 block 里又包含多个小单元,包含了 layer-norm、 convolution 和 self-attention 等,其中:

a.) layer-norm 可以看做是 batch-norm 的变种,简单理解,batch-norm 是对一个 batch 里 x 的特征进行归一化,而 layer-norm 是对一层的 x 输出归一化。

b.) convolution 采用了 depthwise separable convolution,如下图:

看似复杂,其实简单理解,就是把一个 H x W x D 的卷积核,分解成 H x W x 1 和 1 x D 俩矩阵,从而降低矩阵的秩,减少参数量。 这是模型压缩很常见的一个做法。

2.) encoder 里也有一层 context to query 的 attention,做法与 Bi-DAF 有点类似但不一样,作者说他是借鉴自一个叫 DCN 的模型,计算 attention score 的公式如下,额外加入了 q 和 c 的点乘。

3.) decoder 沿用 Bi-DAF 的,这里不赘述了。

4.) 除了模型层面的改进,QA-Net 还额外做了数据扩充,采用 English-French-English 的双向翻译模型来扩充语料。 作者号称效果变好,对此我表示存疑,毕竟翻译误差的累积会导致语料变差。

3.6. S-Net

秘籍传送门: S-Net

模型结构

杀手锏

前面所有模型都是端到端的抽取式模型,而 S-Net 是分成了两部分的生成式模型:先从文章中抽取出所谓的 evidence snippets, 再通过生成式的 decoder 生成答案,具体如下:

1.) 第一部分: 直接 train 一个抽取式模型,如下:

a.) encoder 部分借鉴了 R-Net 里的 Gated Match-LSTM。

b.) decoder 部分采用了 multi-task training,是一个双任务结构,一个目标是传统的抽取式过程,采用了 R-Net 的 decoder 用来预测答案,一个是 passage ranking,将目标 passage 排序靠前,辅助抽取式 decoder。

2.) 第二部分: 将第一部分预测的答案起始位置作为重要信息放到词的 embedding 里,然后采用 seq2seq 的结构来生成答案。

这里用 seq2seq 的方法比较简单粗暴,encoder 部分直接拿 passage 和 question 的 last hidden state 做个拼接作为 decoder 的初始状态,decoder 就是一个采用了 attention 机制的 GRU。

S-Net 这种设计方式使得模型结构非常灵活,既可以应用在生成式答案的数据集,如 MS-MARCO, SQuAD 2.0,也可以用于传统的抽取式数据集,如 SQuAD。 值得注意的是,虽然 S-Net 号称处理多篇文档,但在 encoder 层面依然是把多篇文档拼接在一起作为一整篇文档,并没有做文档排序。

3.7. R3

秘籍传送门: R3-Net

模型结构

杀手锏

回顾一下我们在前言部分提到的,一个相对完整的问答系统——包含了文章检索、文章排序和答案生成三部分,前面我们讨论的所有问答模型主要集中在答案生成,所针对的数据集都是:

给定一个问题 Q 和一个与 Q 相关的文档 D,自动得到 Q 对应的答案 A

即便是 S-Net,也是基于这样的数据集,文章排序不过是一个辅助任务,但 R3 要解决的问题是,

给定一个问题 Q 和通过 IR 检索出的相关文档集合 Dset,自动得到 Q 对应的答案 A

这是个典型的 open-domain QA 系统,一般都会先对 Dset 排序,再做答案生成,但 R3 用强化学习的框架统一了文章排序 (Ranker) 和答案生成 (Reader) 两部分,是一个端到端的模型。

1.) Ranker 和 Reader share 一个 encoder, 用来对输入文章建模,结构如下:

这里有个小 trick,跟 Bi-DAF 有点类似,对 Hp 和 Hq 做了些类似特征工程的操作—— 将 Hp Hq 进行点乘和相减,再作为下一层 layer 的输入:

2.) 把 Ranker 和 Reader 放到强化学习(RL) 的框架中, Ranker 负责产生 policy,而 Reader 负责执行 policy 并产生 reward。 Ranker 产生 policy 的过程如下图:

对应的公式如下:

最后的 policy 其实就是 Dset 里文章的概率分布。 在得到 policy 后,所要采取的 action 就是根据概率分布抽取文章,作为 Reader 的输入,如下所示:

这部分其实就是典型的阅读理解模型,可以用前面任何一个模型替代,只不过文中的 encoder 和 decoder 来自 Match-LSTM。 注意到除了 sample 概率最高的文章,还额外加进去一些概率不高的文章作为『负样本』,一起输入 Reader,这么做的原因是使得 softmax 出来的正确答案位置更 sharp,加快模型收敛:

Ranker 跟 Reader 分别用 policy gradient 和 supervised gradient 这两种更新策略来训练,这部分没太多好说的,都是典型的强化学习框架。

唯一注意的是这里 reward 不能直接用 reader 的 decoder 出来的 cross entropy:

因为这个 reward 是没有上下界的,梯度变化会很大,所以需要重新设计一个 reward,文中简单采用了真实答案和预测答案序列的 f1 score,如下所示:

当真实答案和预测答案有交集时,用 f1 score 作为 reward;当两者完全一致时,f1 score 是1,但这里 reward 直接设为 2,我理解是为了使收敛更快,更快地找到最优策略;当两者没有交集时,f1 score 是0,但这里 reward 设为 -1 。

参考文献链接

[GA-Reader]

(http://www.aclweb.org/anthology/P17-1168)

[Match-LSTM]

(http://www.aclweb.org/anthology/P17-1018)

[Bi-DAF]

(https://arxiv.org/abs/1611.01603)

[R-Net](https://www.microsoft.com/enus/research/wpcontent/uploads/2017/05/r-net.pdf)

[QA-Net]

(https://arxiv.org/pdf/1804.09541.pdf)

[S-Net]

(https://arxiv.org/pdf/1706.04815.pdf)

[R3-Net]

(https://arxiv.org/pdf/1709.00023.pdf)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803A1DYMJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券