施峰 周坤晓
(1. 东莞理工学院 计算机科学与技术学院,广东东莞 523808;2. 东莞理工学院 网络空间安全学院,广东东莞 523808)
随着社会的发展,越来越庞大的文本数据,人们为了获取需要的知识需要查阅大量资料,并需对资料进行阅读与思考理解后才能获得自己想要的答案。阅读与检索信息人们需要花费大量时间,以获得自己需要的关键信息解决自己的疑问。随着人工智能技术的发展,使用人工智能的技术手段来解决问题的领域越来越多。若一种高效的机器阅读理解模型,则可以代替人工对检索到的文本进行阅读理解,以回答针对文本信息的疑问,该模型与检索算法结合后即可完成对开放领域自由句式问题的回答的实现对现实生活有着重要意义。
20世纪中期,人们就尝试让机器可以像人类一样回答他人给出的各种问题,典型的代表系统有BASEBALL、LUNAR和ELIZA[1]。但当时机器可以回答的问题十分有限,只能回答一些固定领域的固定问题。为提升机器的问题回答能力,越来越多的研究者们开始考虑提升机器的阅读理解能力,让机器像人类一样拥有学习能力,通过大量阅读与学习知识后应对开放领域的各种问题。如果实现机器阅读理解模型,将其与检索算法相结合便可应对开放领域的各种自由句式问题。
为研究与实现机器阅读理解模型,诞生了许多经典的数据集,这些数据集催生了许多优秀阅读理解模型。2013年MCTest[2]数据集的诞生,使研究者们开始尝试实现高水平机器阅读理解,该数据集包含500篇虚构的故事以及相关的2 000个问题,机器可以依据故事来回答问题,并从多个选项中选择正确的答案,但此时大量的方法均为对数据进行滑动匹配,如滑动窗口的方法仅适用于一些简单的问答,即便是更为优秀的Parallel-Hierarchical模型[3],对于复杂的问答也效果欠佳。
2015年,Hermann等在发布了CNN/Dailymail数据集[4],该数据集的数据包含近一百万条的新闻数据,答案为文中的某个词,需要机器对文本进行阅读理解后完成完形填空。此后,越来越多的研究者开始使用神经网络的方法来实现机器阅读理解,搭建的神经网络模型逐渐显露出优势。
SQuAD数据集发布后,吸引了大量学者展开研究,此数据集有着庞大的数据量,共计有500多篇文章中的十万多个问答配对数据,同时Rajpurkar等人也为它提出了一种基于logistic回归的基线方法[5]。该数据集适合使用端到端的深度学习模型来训练,近几年的研究多是基于该方法,同时也产生了许多优秀模型,较为著名的模型有:R-net[6]、Match-LSTM[7]、BiDAF[8]、DrQA[9]。
Chen[9]所提出的DrQA模型是以循环神经网络(Recurrent Neural Network, RNN)和其变体为基础,与注意力机制结合后对网络进行合理设计,实现高效的机器阅读理解模型。但该模型的RNN版本存在有梯度消失与梯度爆炸的问题,致使准确度较低。笔者将对RNN版本模型进行优化,尝试采用Siren函数优化神经网络结构,以比RNN相关变体网络更简单的结构来缓解RNN模型梯度消失与梯度爆炸问题,以期提升模型回答问题的准确度。
传统的神经网络即前馈神经网络,在处理数据时会经过一层层神经元,最后得到输出。此网络中,同层的各个神经元间相互独立,没有关联,因此对任务中的数据,神经网络会相互独立地进行处理。而对一些如文本信息的序列性数据,上下文间的关系有助于机器的阅读理解。如果仅单纯独立处理各数据,而不考虑数据间的关联及数据的整体性,将会大大削弱机器对文本的处理能力和理解能力。而对学习序列的非线性特征有着独特优势的循环神经网络的出现解决此问题。
1986年和 1990年,Jordan和Elman分别提出了循环神经网络框架,称为简单循环网络,被认为是目前广泛流行的RNN的基础版本[10]。他们的大致结构如图1,可以按照时间线来展开。RNN也被称为递归神经网络,是依据时间序列进行自我调用的特殊神经网络[11]。在RNN网络中,当前时刻的输出可以作为下一时刻的输入,因此当前时刻的输出受到了前面多个时刻的输出影响,甚至有些情况下还会受到后面输出的影响。这就使神经网络可以充分地考虑数据的整体性和全局性,将它应用于文字处理中则表现为神经网络会充分考虑上下文信息,这有助于机器更好地进行阅读理解。
图1 RNN网络
基于此,Mikolov等[12-13]将其应用在语言模型的训练上,可以通过隐含层的循环获得更多的上下文信息,降低模型的参数个数[14]。
RNN网络具有很多优点,但在训练过程中也会遇到各种问题。如它可以使用的历史信息很有限,新输入的信息会覆盖隐藏层的输入,使距离当前时间较早的输入信息随篇幅的扩展而对权重的影响减小[15]。特别是在网络深度不断加深后,使RNN不能很好地处理长距离的依赖[16],产生梯度消失与梯度爆炸问题,梯度在长距离传递中会快速增大或是快速减小,使得梯度的传递效果很差,网络的稳定性也大打折扣。这反映了在文本信息处理中,模型对早期接收到的文本,经过一段时间的处理后,对它是否是答案的判断将会偏向两个极端,要么一定考虑它,要么完全不考虑,又或是在与其他词的竞争中完全获胜或完全失败。该问题大大影响了模型的阅读理解与问题回答能力。
考虑到早期RNN会产生梯度消失与梯度爆炸问题,Hochreiter等对RNN进行改进后提出了长短期记忆(Long Short Time Memory, LSTM)神经网络[17],该网络通过输入门、输出门、遗忘门,可以很好地控制序列中的信息,补足了RNN所存在的一些短板,但结构较为复杂。类似的变体还有门控循环单元(Gated Recurrent Unit, GRU)网络,该网络也是采用门控机制解决相关问题,简化了LSTM网络的复杂结构,将原有的三个门结构简化为两个门:重置门与更新门。但在实际搭建模型时,选取哪个模型更优尚无定论,二者均无绝对的优势,且这两种网络的结构依然复杂,在模型的训练上也无优势。
基于文献[18],笔者成功地将Siren激活函数与注意力机制结合,采用更简单的结构缓解RNN模型的梯度消失或梯度爆炸问题,提升模型的精度。Siren函数最早由Vincent Sitzmann提出并应用在图像处理领域[18],随后被应用于其他领域,如在文献[19]中的音频处理领域,也显现出了独特的优势。考虑到该函数可以快速地将神经网络的初步输出收敛至区间[-1,1],计算简便快速,且拥有可导不变性,笔者尝试将该函数初次用于文本信息的处理。
采用的方法是对于RNN网络的输出,将其通过Siren函数层进行处理后,再通过Softmax分类器与全连接层,输出问题所需答案。Siren函数在经过合理的初始化后,能够很好地处理RNN网络的输出,平衡各元素之间的权重。经过多组对比实验,结果充分证明了方法的有效性和函数的优越性。
现有的机器阅读理解模型在回答问题时与人类进行阅读理解类似,而机器无法模仿人类在学习和成长过程中积累更多的外部知识。人类在阅读理解的同时,可以运用这些积累的外部知识来帮助自己理解与回答问题,但机器无法做到,为了降低难度,机器所使用的数据集是排除了外部知识的,即需要回答的问题答案均在原文中。因此,模型对于问题的回答是采用文中的几个单词或一句话来回答,具体做法是返回每个单词作为答案的开头和结尾的概率,选取概率最高的单词作为答案的开头和结尾。此后,输出开头与结尾之间的所有单词即为模型所认为的答案。
使用的模型是对RNN版本改进的DrQA模型,该模型由Chen[9]所提出,其结构如图2。模型与大多数同类模型有着相似的结构,主要分四层:Embed层、Encode层、Interaction层和Answer层。
Embed层:先采用Spacy工具包对源数据进行预处理,将数据处理成相应格式,做好分词加上标签,提取出一些简单特征,等等。再使用预训练好的词向量(如Glove与Word2vec)来表示文章与问题中的单词,即Embedding过程。同时也增加一些初步特征,如词性、命名体识别等。文章与问题处理后的数据均为矩阵,大小是Batchsize×Textsize×300,其中300取决于使用的词向量。
Encode层:文件与问题进行Embedding后,再对问题采用注意力机制进行初步特征提取,其特征主要为初步计算文章中词句与问题的相关性,它与文件数据、提取的初步特征一起进入循环神经网络进行进一步的特征提取。与此同时,问题数据在Embedding后也进入循环神经网络进行特征提取。由于循环神经网络的特性,在获取当前时刻向量时充分考虑到了上下文信息。在该层中,循环神经网络层数设定为3层,每层神经元数量为128,经过神经网络后的输出大小为Batchsize×Textsize×762。
Interaction层:该层主要任务是尝试挖掘更深层次的信息。经循环神经网络的处理后,给问题提取的特征中加入自注意力机制,目的是从问题自身的角度来提取问题中的重点信息并重新分配权重。该特征是一个Batchsize×Textsize大小的二维矩阵,与原来表示问题的矩阵进入池化层合并后大小为Batchsize×762。合并后的新问题矩阵将与表示文章信息的矩阵同时进入一个双向注意力层,以此来探究文章与问题间的深层次信息。此时文章矩阵与问题矩阵将会变为两个矩阵,一个是文章中所有词作为答案开头的可能性,一个是所有词作为答案结尾的可能性,它们均为Batchsize×252大小的二维矩阵。
图2 模型结构
Answer层:该层将综合前面的输出,给出模型所认为的答案。该层主要由Softmax层构成,Softmax层即Softmax分类器,常用于多分类任务,原理较为简单,是一个概率计算的过程[20]。Softmax函数定义如下(其中为第i个节点的输出值,C为输出节点的个数):
(1)
该函数可以将多分类的输出值转换为范围在[0, 1]和为1的概率分布,具有分类种类多、应用简单、准确率高、好训练等优点[21]。因此只需要输出概率最高的开头单词与概率最高的结尾单词之间的所有单词,即为模型所认为的问题答案。
由于循环神经网络(RNN)存在的梯度消失与梯度爆炸问题,过长的序列往往会影响模型的判断。模型常常会在一开始给比较重要的词过高的权重,而忽视了其他词的可能性,起初可能性较低的词随着训练时间的增加而降低。这会导致一些词被模型过早地视为正确答案,而另外一些词随着时间的累积,难以被模型考虑到,或被考虑到的可能性极低。因此笔者对于该模型的改进是在双向注意力层之前再加一个Siren函数层,即在Interaction层中做了改进,以尝试解决相关问题,结构如图3。
图3 改进后的框架图
该方法目的是用Siren函数对RNN网络的输出进行进一步处理,平衡各个词之间的权重后再交给模型判断,即缩小高概率词与低概率词之间的差异。采用此方法可以让模型考虑更多的词后再做决定,即使是权重很低的词也会被考虑到,由此增加模型的准确度。
Siren函数是一种正弦激活函数,具有周期性和可导不变性,可以快速地将神经网络的初步输出收敛至区间[-1,1]。利用此类特性,可以快速平衡RNN网络输出的各词权重。该激活函数的参数为ω,在对比实验中采用多个ω值进行实验,以求最佳效果。激活函数公式如式(2):
vi=sin(ωxi+b),
(2)
前提是要对Siren函数进行合适的初始化,选取合适的ω,否则该函数将无法起到正面效果,甚至可能会产生负面影响。在进行合适的初始化后,函数可以将较高的权重进行一定程度的缩小,而较低的权重进行小幅度缩小,以此达到平衡各个词之间差异的效果。
由于Siren函数里参数ω的初始化对于数据的处理效果有着很大的影响,所以对于不同的数据,需要选取合适的参数ω,否则Siren函数将起不到该有的作用。考虑其他常用的激活函数后,理论上Tanh激活函数也可以将数据收敛至固定区间,但经过对比实验发现,其收敛效果与速度均不如Siren函数。Tanh激活函数公式如式(3):
.
(3)
Relu函数作为神经网络中常用的激活函数,可以直接过滤掉所有负值,实验中表现为可以小幅提升模型准确度,但依然效果不佳。Relu激活函数公式如式(4):
relu (x)=max(0,x)
.
(4)
本文数据集采用SQuAD英文问答数据集,该数据集是一组阅读数据集,基于英文维基百科中网络群众提出的各种问题,每个问题均可在文中找到答案。它具有庞大的数据量,共计有500多篇文章中的十万多个问答配对数据,该数据集的贡献者为斯坦福Percy Liang等人[4]。
使用Pytorch框架,编程环境为Python3.6,Spacy版本为1.9,硬件环境为英伟达(NVIDA)1080Ti显卡,CPU为Intel E5-2603 v4。模型训练中,隐藏层中神经元数量设置为128,优化器采用Adamax,BatchSize大小设置为32,学习率设置为0.1,Dropout设置为0.4,Epoch设置为40。
在对比实验中,训练数据集采用SQuAD,实验结果主要关注三个指标:EM指数、F1指数和训练时间。对每个模型进行40个批次训练,最终取所有批次中最好的一个批次作为最终结果。以实验结果中两个指数的数值来判断模型与模型的优劣。
EM(Exact Match)指数衡量的是模型精确匹配情况,它是模型预测的答案与问题正确答案相比,完全一致部分所占的百分比。F1指数常作为二分类模型的评价指标,值介于0与1之间,由计算模型精确率与召回率的调和平均值得来,精确率即预测的答案中,预测正确的比例,召回率是问题的正确答案中,被模型成功预测出来的比例。
对Siren函数来说,参数ω的选取至关重要。为寻找一个较为合适的参数ω值参与后续的对比实验,选取了多个值ω进行对比实验,实验结果如表1。
表1 选取不同ω值的效果
由表1可知,Siren函数在参数ω取0.05时效果最好,所以,在后续的实验中选取ω=0.05进行对比实验。
所选取的对照模型(原模型)是DrQA模型的RNN版本,对模型利用本文所述的方法改进后,与原模型进行对比实验,同时我尝试使用其他激活函数,包括雨Tanh函数、Siren函数进行的对比,实验结果如表2。
表2 Siren函数对比实验
在对比实验中,原模型经过本文所提出的方法修改后,精确度有了明显的提升,EM指数提升了6.58,F1指数提升了5.97。Siren函数在与其他函数的对比实验中也展现出了它独特的优势。
前文对比实验中模型采用的分词方法,均为依据英文空格来分词,而现有一些模型也会使用一些更为合理高效的分词工具包,文献[22]中采用了ansj分词器,会在分词后文章中词的数量变少,提升问题回答的准确,如单词natural language按空格分词会成为两个词,即表面上的natural与language,若采用一些工具包来分词,这两个单词可能会被视为一个整体(某种意义上的一个词),即一个意为“自然语言”的名词,可能会作为一句话中的宾语或主语。
在此情形下,模型所要考虑的单词数就会变少,因此,要验证在该情况下本文所述方法的效果,为此进行了一组对比实验,实验所用模型均采用了Spacy工具包中的英文分词功能,其他条件与上一个实验相似,实验结果如表3。
表3 Siren函数对比实验(采用分词工具)
由表3的结果可知,在分词工具的协助下,模型的精度可以得到大幅提升,缩短了训练时间,相比较仅使用空格作为分词标准的模型具有更加优秀的问题回答能力。但在此条件下,本文所述方法依旧奏效,对比原模型,EM指数高出6.1,F1指数高出5.9,同时Siren函数在与其他激活函数的对比实验中也依旧保持优势。
综上多个实验,实验结果验证了将Siren函数与注意力机制结合的方法是成功的,使用该方法对以RNN网络为基础的模型进行优化,能够在一定程度上提升模型的回答准确度。
在循环神经网络的基础模型上,引入一种新型激活函数(Siren激活函数),并将它与注意力机制结合,提出一种更简单的结构来缓解RNN网络的梯度消失与梯度爆炸问题。笔者将该结构应用于机器阅读理解模型之上,对RNN版本的DrQA模型进行改进,经过对比实验后发现该结构可以起到一定的优化作用,虽然效果不及LSTM等更复杂的变体,但其结构更为简单,便于实施与实现,在一些传统模型的改进优化上有一定价值。后续的研究将会继续改进该模型,并探究Siren函数更广泛的应用。