机器阅读理解笔记(上)——机器阅读理解模型架构

本文详细介绍了机器阅读理解模型的架构,包括编码层的词表建立、字符编码、上下文编码,交互层的互注意力、自注意力以及输出层的区间式答案生成和自由式答案生成。模型通过编码层理解上下文,交互层建立文章与问题的联系,输出层预测答案。编码层的创新集中在上下文编码,交互层的自注意力机制增强信息传递效率,输出层根据任务类型生成答案。
摘要由CSDN通过智能技术生成

4.1 总体架构

一般分为编码层、交互层和输出层。

机器阅读理解模型的输入为文章和问题。因此,首先要对这两部分进行数字化编码,将其变成可以被计算机处理的信息单元。在编码的过程中,模型需要保留原有语句在文章中的语义。因此,每个单词、短语和句子的编码必须建立在理解上下文的基础上。我们把模型中进行编码的模块称为编码层。

接下来,由于文章和问题之间存在相关性,模型需要建立文章和问题之间的联系。例如,如果问题中出现关键词“河流”,而文章中出现关键词“长江”,虽然两个词不完全一样,但是其语义编码接近。因此,文章中“长江”一词以及邻近的语句将成为模型回答问题时的重点关注对象。这可以通过3.4节介绍的注意力机制加以解决。在这个过程中,阅读理解模型将文章和问题的语义结合在一起进行考量,进一步加深模型对于两者的理解。我们将这个模块称为交互层。

经过交互层,模型建立起文章和问题之间的语义联系,接下来就可以预测问题的答案了。完成预测功能的模块称为输出层。根据1.4.1节的介绍,机器阅读理解任务的答案有多种类型,如区间型、多项选择型等,因此输出层的具体形式需要和任务的答案类型相关联。此外,输出层确定模型优化时的评估函数和损失函数。

下图所示为机器阅读理解模型的一般架构。从图中可以看出,编码层可分别对文章和问题进行底层处理,将文本转化成数字编码。交互层可以让模型聚焦文章和问题的语义联系,借助于文章的语义分析加深对问题的理解,同时借助于问题的语义分析加深对文章的理解。输出层根据语义分析结果和答案的类型生成模型的答案输出,以输出层为区间式答案为例,机器阅读理解模型的总体架构如图所示。
在这里插入图片描述

在基本架构的框架下,不同的机器阅读理解模型在结构的每个计算层中设计和采用各种子结构,以不断提高模型的效率和答案的质量。值得注意的是,大部分阅读理解模型的创新集中在交互层,因为在这一层中对文章和问题语义的交叉分析有很多不同的处理方式,而且这也是使模型最终能产生正确答案的关键步骤。相比之下,编码层和输出层有着较为稳定的模式,但也在不断进行改良和创新。

4.2 编码层

与其他基于深度学习的自然语言处理模型类似,机器阅读理解模型首先需要将文字形式的文章和问题转化为词向量。

编码层一般采用类似的算法对文本进行分词和向量化处理,然后加入字符编码等更丰富的信息,并采用上下文编码获得每个单词在具体语境中的含义。

词表的建立和初始化

我们有两种方式获得词表中的单词向量:

  • 保持词表向量不变,即采用预训练词表中的向量(如为w2v的300维的向量),在训练过程中不进行改变
  • 将词表中向量视为参数,在训练过程中和其他参数一起求导并优化。这里既可以试用预训练此表向量进行初始化,也可以选择随机初始化。

第一种选择的优势是模型参数少,训练初期收敛快;第二种优势是可以根据实际数据调整词向量的值,以达到更好的训练效果。而采用预训练词表向量初始化一般可以使得模型在优化的最初几轮获得明显比随机初始化方法更优的效果。

命名实体和词性编码

在编码层,为了更准确的表示每个单词在语句中的语义,除了词表向量外,还经常对命名实体(named entity)和词性(pard-of-speech)进行向量化处理。如果命名实体有N种,则建立一个大小为N的命名实体表,每种命名实体用一个长度为dN的向量表示;词性同理。然后用文本分析软件包,如spaCy,获得文章和问题中的每个词的命名实体和词性,再将对应向量拼接在词向量之后。由于一个词的命名实体属性与词性和这个词所在的语句有关,因此用这种方式获取的向量编码可以更好的表示单词的语义,在许多模型中对性能有明显的提高。

精确匹配编码

另一种在机器阅读理解种非常有效的单词编码是精确匹配编码。

对文章中的单词w,检查w是否出现在问题中:如果是,w的精确匹配编码为1,否者为0。然后将这个二进制位拼接在单词向量后。由于单词可能有变体(复数、时态),也可以用另一个二进制位表示w的词干(stem)是否和问题中某些词的词干一致。精确匹配编码可以使模型快速找到文章中出现了问题单词的部分,而许多问题的答案往往就在这部分内容的附近。

4.2.2 字符编码

文本处理种时常会出现拼写错误,即一个单词中大部分字符正确,但有几个字符的拼写或顺序与正确方式不同,这时通过字符组合,往往可以识别正确的单词形式。此外,许多语言种存在词根的概念,在单词理解中字符和子词具有很强的辅助作用。

4.2.3 上下文编码

基于词表的单词向量是固定的,不会随着上下文变化,这就会导致同一个词在不同的语句中的语义不同但其向量表示完全相同的情况。因此编码层需要对每个单词生成上下文编码,这种编码会随着单词的上下文不同而发生改变,从而反映出单词在当前语句中的含义。

在深度学习中,为了实现上下文语义的理解,通常采用单词之间的信息传递。RNN是最常用的上下文编码生成结构,因为RNN利用相邻单词间的状态向量转移实现语义信息的传递。为了更有效地利用每个单词左右两个方向的语句信息,采用双向循环神经网络;而许多模型还采用多层RNN,用于提取更高级的上下文语义,获得更好的效果。

以下代码给出了多层双向RNN获得文本单词上下文编码的代码。RNN的输入为每个单词的编码,维度是word_dim。输出维度是2*state_dim,其中2表示RNN共有两个方向。

import torch
import torch.nn as nn

class Contextual_Embedding(nn.Module):
    # word_dim为词向量维度,state_dim为RNN状态维度,rnn_layer为RNN层数
    def __init__(self, word_dim, state_dim, rnn_layer):
        super(Contextual_Embedding, self).__init__()
        #多层双向GRU,输入维度word_dim,状态维度state_dim
        self.rnn = nn.GRU(word_dim, state_dim, num_layers=rnn_layer, bidirectional=True, batch_first=True)  

    # 输入x为batch组文本,每个文本长度seq_len,每个词用一个word_dim维向量表示,输入维度为batch x seq_len x word_dim
    # 输出res为所有单词的上下文向量表示,维度是batch x seq_len x out_dim
    def forward(self, x):
        # 结果维度batch x seq_len x out_dim,其中out_dim=2 x state_dim,包括两个方向
        res, _ = self.rnn(x) 
        return res

batch = 10
seq_len = 20
word_dim = 50
state_dim = 100
rnn_layer = 2
x = torch.randn(batch, seq_len, word_dim)
context_embed = Contextual_Embedding(word_dim, state_dim, rnn_layer)
res = context_embed(x)
print(res.shape) # torch.Size([10, 20, 200])

研究者进一步发现,在大规模自然语言处理任务上进行预训练,然后将预训练模型中的循环神经网络参数用于机器阅读理解,可以获得明显的性能提升。如CoVe模型在大量机器翻译数据上训练seq2seq模型,然后将编码器部分的循环神经网络用于SQuAD数据集,F1分数提高4%左右。

综上所述,在编码层中,每个问题单词由词表向量、命名实体向量、词性向量、字符编码、上下文编码组成,而每个文章单词除了以上五种向量外,还有精确匹配编码。

在这里插入图片描述

4.3 交互层

4.3.1 互注意力

交互层的输入是编码层的输出,即文章的单词向量(p1, p2, …,pm)和问题的单词向量(q1,q2,…qn)。为了对两部分的语义进行交互处理,一般采用注意力机制。

注意力机制最初应用在序列到序列模型中,它的输入包括一个单词向量x和一个单词向量组A=(a1,a2,…an)。注意力机制从向量x的角度对A进行总结,从而获得A所代表的语句与单词x相关的部分的信息。注意力机制的结果为

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值