机器阅读理解技术初探&Bi-DAF

推一下个人技术微信公众号:浪漫主义AI
说起阅读理解,大家应该很快都会想到英语试卷上的阅读理解题,根据试卷上给出的文章中表现的信息回答若干个问题,这种题需要学生能读懂英文文章,从中提取与问题有关的关键信息,选择与文章信息最为匹配的选项。
机器阅读理解与之颇为相似。
机器做阅读理解,也需要掌握(并不是理解)给定文章或段落中的信息。我们是要将英文映射到中文(或许有人是映射到实体世界?),而机器将自然语言映射到机器码(目前来说几乎全是向量),按某种方式完成与文章或段落的若干问题。
目前,机器阅读理解主要完成两类问题:完形填空和文本段选择。完形填空任务与英语试卷上的完形填空略有不同,往往是给出完整的一段文字,让机器阅读后再填上相关语句上的实体词空位,其难度较低,已经能做得比较好。而文本段选择问题是目前的热点,这种任务是要根据问题在文章或者若干选项中选择一段文字,最开始是斯坦福提出的SQuAD数据集,逻辑简单,限定范围较小,没有什么实用价值,而目前已经出现了很多难度更大、更贴近真实情况的数据集。
而现在,有出现了新的题型。在百度开放的dureader数据集中,采用百度搜索和百度知道上的真实用户问答数据,不仅有之前最常出现的实体描述问题,还有很多没有事实标准的建议性问题,使得难度又提高了,也更接近真实语境了。
那么,机器要如何才能做到阅读理解呢?
如果是在狭窄领域或者特定语境下的问题,可以采用基于规则的方法,直接解析语句获取答案,但是这显然适用范围太小,人工成本太高,所以人们关注的大多是端到端的模型。目前较为先进的模型一般都由这几部分构成:
1)文本和问题的encoding过程。包括自然语言到向量表示的embeding过程和从词向量到文章信息向量和问题信息向量的过程(当然,也可能不是用向量表示,而是矩阵等),是一个从文本上提取信息的过程。
2)根据encoding层提取的文章信息和问题信息进行信息匹配,挖掘出文本中的那些内容与问题相关,哪些更重要。
3)生成答案,一般都是生成多种答案,然后对每种答案计算得分取分数最高的答案。
下面来看一种较为流行的具体的阅读理解系统。

Bi-DAF

即Bi-Directional Attention Flow network。
整体架构:
机器阅读理解技术初探&Bi-DAF_第1张图片

Word Emded Layer

虽然该图中最底层架构是character embed layer,但在中文中一般不采用,即使在英文中也很少用到字符级信息,所以视最低层为word embed layer,将文章(Context)和问题(Query)语句中的词映射到语义向量空间,相当于把自然语言翻译成机器能接受的数字语言。图中采用GLOVE获取词向量,也可以使用word2vec,一般是最终性能哪个最好用哪个。假设词向量维度为d,那么现在我们有了含T个词向量的文章矩阵(或许称之为向量序列更为直观)这里写图片描述,含J个词向量的问题矩阵这里写图片描述

Contextual Embed Layer

这层利用双向LSTM进行更高层面的信息提取。将X和Q分别输出双向LSTM网络,将LSTM网络的正向输出和反向输出拼接起来作为输出,那么我们就得到了综合整个文章的信息向量序列这里写图片描述 和整个问题的综合向量序列这里写图片描述

Attention Flow Layer

本层是最重要的一层,要综合H和U得到答案的信息,具体可分为两个过程:match 和 fuse。
match即为使用attention机制对H和U进行双向匹配,这也是Bi-Directional Attention Flow名字的由来。在运用注意力机制时,定义一个匹配矩阵这里写图片描述 ,其中这里写图片描述 代表H中第t个向量与U中第j个向量的相似度,且这里写图片描述 ,这个相似度通过一个可训练的标量函数来计算。用h代表H中的一个向量,u代表U中的一个向量,将[h,u,h*u]拼接成一个6d维度的向量(其中*代表内积’),乘上一个可训练的权值向量w即可得到对应的s。
Context-to-query Attention:计算文章到问题的attention。定义这里写图片描述 为对于文章中第t个向量,J个问题向量的重要程度,那么,对于每一个t,这里写图片描述这里写图片描述 ,那个就有了T个不同的对于问题向量的J维权值,由注意力机制加权后的问题向量序列为:这里写图片描述
Query-to-context Attention :问题到文章的attention。定义这里写图片描述 为T个文章向量序列的权值向量。注意到,衡量文章向量重要程度时,使用了max处理,这就意味着模型并不在意该文章向量对于哪一个问题向量比较重要,只在意该文章向量是否对于某一个问题向量比较重要,只要在J维的重要性中,存在一维比较大,就认为该文章向量是重要的。那么加权后的文章向量为:这里写图片描述
至此,基于双向注意力机制的match过程结束,我们又获得了两个2d*T维的向量序列。
match过程的代码:

        sim_matrix = tf.matmul(passage_encodes, question_encodes, transpose_b=True)
        context2question_attn = tf.matmul(tf.nn.softmax(sim_matrix, -1), question_encodes)
        b = tf.nn.softmax(tf.expand_dims(tf.reduce_max(sim_matrix, 2), 1), -1)
        question2context_attn = tf.tile(tf.matmul(b, passage_encodes),
                                     [1, tf.shape(passage_encodes)[1], 1])
        concat_outputs = tf.concat([passage_encodes, context2question_attn,
                                    passage_encodes * context2question_attn,
                                    passage_encodes * question2context_attn], -1)

这份代码计算S时采用了简化算法。
fuse过程将上面获得的两个注意力向量序列和之前获得的文章信息向量序列H综合起来,求得文章向量序列上的query-aware representations,定义为这里写图片描述 ,其中每一个向量由这里写图片描述 直接拼接而成,则G的维度为8d*T。

Modeling Layer

利用双向LSTM将8d*T的G中的信息综合,生成2d*T的M,则M中包含了非常多的信息,一方面体现了问题与文章之间的交互,另一方面将这种交互输入到LSTM网络后得到了交互的上下文信息。

Output Layer

利用蕴含了庞大信息G和M,我们可以获得我们需要的各种输出。例如,对于文本段选择问题,我们需要一个文章中的起始索引和结束索引,这就要计算T个向量上的对于两个索引的T维概率分布。
对于起始索引:
这里写图片描述
为了获得更好的表达能力,我们将M再一次输入双向LSTM网络得到维度相同的M2向量序列。对于结束索引:
这里写图片描述
最后,利用cross entropy函数构建loss function 进行训练:
这里写图片描述
推一下个人技术微信公众号:浪漫主义AI

你可能感兴趣的:(NLP,机器学习,深度学习,机器阅读理解)