目录
摘要
一.介绍
二.方法
2.1单层
2.2多层
三.相关工作
四.综合问答实验
4.1模型的细节
4.2训练细节
4.3基线
4.4结果
五.语言建模实验
5.1训练细节
5.2结果
六.结论和未来工作
摘要
我们引入一种神经网络,在可能较大的外部存储器上建立一个反复注意模型。该架构是记忆网络[23]的一种形式,但与该工作中的模型不同,它是端到端训练的,因此在训练期间需要的监督大大减少,使其更适用于现实环境。它还可以被视为RNNsearch[2]的扩展,以实现对每个输出符号执行多个计算步骤(跃点)的情况。该模型的灵活性允许我们将其应用于各种各样的任务,如(综合)回答[22]问题和语言建模。对于前者,我们的方法是与内存网络竞争,但较少监督。对于后者,在Penn TreeBank和Text8数据集上,我们的方法展示了与rnn和LSTMs相当的性能。在这两种情况下,我们表明,多计算跳的关键概念产生改进的结果。
一.介绍
人工智能研究面临的两大挑战是,构建能够通过多个计算步骤来回答问题或完成任务的模型,以及能够描述序列数据长期依赖关系的模型。
最近,使用显式存储和注意力概念的计算模型再次兴起[23,8,2];操作这样的存储提供了解决这两种挑战的方法。在[23,8,2]中,存储被赋予了连续表示;读取和写入存储,以及其他处理步骤,由神经网络的动作建模。
在这项工作中,我们提出了一种新的递归神经网络(RNN)结构,递归从一个可能很大的外部存储器中读取多次,然后输出一个符号。我们的模型可以被认为是在[23]中实现的内存网络的连续形式。该工作中的模型不容易通过反向传播进行训练,并且需要对网络的每一层进行监督。我们在这里提出的模型的连续性意味着它可以从输入输出对训练到端,因此适用于更多的任务,即没有监督的任务,如在语言建模或实际监督的问题回答任务。我们的模型也可以看作是RNNsearch[2]的一个版本,每个输出符号有多个计算步骤(我们称之为“跳”)。我们将通过实验证明,长期记忆中的多跳对我们的模型在这些任务上的良好表现至关重要,而且训练记忆表征可以以可扩展的方式集成到我们的端到端神经网络模型中。
二.方法
我们的模型取一组离散的输入x1,…, xn,将被存储在内存中,一个查询q,输出一个答案a。每个xi, q和a都包含来自一个包含V个单词的字典的符号。该模型将所有的x写入内存,直到一个固定的缓冲区大小,然后为x和q找到一个连续的表示,然后通过多个跃点处理这个连续表示,输出a。这允许错误信号在训练期间通过多次内存访问反向传播回输入。
2.1单层
我们首先在单层情况下描述我们的模型,它实现了单个内存跳操作。然后,我们展示了它可以被堆叠以在内存中提供多个跳跃。
输入内存表示:
假设我们给定一个输入集x1, .., xi被存储在内存中。整个{xi}集合被转换成d维的内存向量{mi},通过将每个xi嵌入一个连续空间,在最简单的情况下,使用一个嵌入矩阵a(大小为d×V)。查询q也被嵌入(同样,在最简单的情况下,通过另一个与A相同维数的嵌入矩阵B)以获得一个内部状态u。在嵌入空间中,我们通过内积后接softmax来计算u和每个内存mi之间的匹配:
式中Softmax(zi) = ezi/ P j ezj。这样定义p是输入上的概率向量。
输出内存表示法:
每个xi都有一个对应的输出向量ci(在最简单的情况下,由另一个嵌入矩阵C给出)。内存o的响应向量是经过转换的输入ci的和,由输入的概率向量加权:
因为从输入到输出的函数是平滑的,我们可以很容易地计算梯度和反向传播通过它。最近提出的其他记忆或注意力的形式也采用了这种方法,特别是Bahdanau等人[2]和Graves等人[8],参见[9]。
生成最终预测:
在单层情况下,输出向量o和输入嵌入向量u的和然后通过最终的权重矩阵W(大小为V × d)和softmax产生预测标签:
整体模型如图1(a)所示。在训练过程中,通过最小化ˆA和真标签A之间的标准交叉熵损失,共同学习所有三个嵌入矩阵A、B和C,以及W。使用随机梯度下降进行训练(详见第4.2节)。
图1:(a):我们模型的单层版本。(b):我们的模型的三层版本。在实践中,我们可以约束几个嵌入矩阵是相同的(参见第2.2节)。
2.2多层
我们现在扩展我们的模型来处理K跳操作。内存层的堆叠方式如下:
第一层以上各层的输入是输出ok和来自第k层的输入uk的和(后面提出了结合ok和uk的不同方法):
每一层都有自己的嵌入矩阵Ak, Ck,用来嵌入输入{xi}。然而,正如下面所讨论的,它们受到限制,以简化训练和减少参数的数量。
在网络的顶部,对W的输入也结合了顶级内存层的输入和输出:ˆa = Softmax(W uK+1) = Softmax(W (oK + uK))。
我们在模型中探索了两种类型的权重绑定:
1.邻近的:
一层的输出嵌入是上面一层的输入嵌入,即Ak+1 = Ck。我们还约束(a)答案预测矩阵与最终输出嵌入相同,即W T = CK; (b)问题嵌入匹配第一层的输入嵌入,即b = A1。
2.Layer-wise (RNN-like):
不同层的输入和输出嵌入是相同的,即A1 = A2 =…= AK和C1 = C2 =…= CK。我们发现给u的更新添加一个线性映射H是很有用的;也就是说,uk+1 = Huk + ok。这个映射与其他参数一起学习,并在整个实验中用于分层权重绑定。
我们的内存模型的三层版本如图1(b)所示。总的来说,它类似于[23]中的内存网络模型,只是每一层中的硬max操作都被替换为来自softmax的连续加权。
注意,如果我们使用分层权重绑定方案,我们的模型可以被转换为传统的RNN,其中我们将RNN的输出分为内部输出和外部输出。发出内部输出对应于考虑内存,而发出外部输出对应于预测标签。从RNN的角度来看,图1(b)和Eqn. 4中的u是一个隐藏状态,模型使用a产生一个内部输出p(图1(a)中的注意权重),然后模型使用C摄取p,更新隐藏状态,以此类推1。这里,与标准的RNN不同,我们显式地在K跳期间对存储在内存中的输出设置条件,并且我们保持这些输出为软的,而不是对它们进行采样。因此,我们的模型在产生“外部世界”可以看到的输出之前,需要进行几个计算步骤。
三.相关工作
最近的一些研究已经探索了使用rnn或基于lstm的模型捕获序列中的长期结构的方法[4,7,12,15,10,1]。这些模型中的内存是网络的状态,它是潜伏的,在长时间内内在地不稳定。基于lstm的模型通过本地存储单元解决这一问题,该存储单元锁定过去的网络状态。在实践中,与经过精心训练的rnn相比,性能提高并不大(参见Mikolov et al.[15])。我们的模型与这些不同,它使用全局内存,并具有共享的读写函数。然而,通过分层权重绑定,我们的模型可以被视为RNN的一种形式,它只在固定的时间步数(对应于跳数)后产生输出,中间步骤涉及更新内部状态的内存输入/输出操作。
Steinbuch和Piske[19]和Taylor在神经网络方面的一些早期工作考虑了一种内存,它对存储的输入向量执行最近邻操作,然后将参数模型拟合到检索到的集合中。这与我们的模型的单层版本相似。
20世纪90年代的后续研究探索了其他类型的记忆[18,5,16]。例如,Das等人[5]和Mozer等人[16]引入了一个带有推和弹出操作的显式堆栈,[11]最近在RNN模型的上下文中重新访问了这个堆栈。
与我们的模型密切相关的是Graves等人[8]的神经图灵机,它也使用连续内存表示。NTM内存同时使用基于内容和基于地址的访问,与我们的内存不同,我们的内存只显式地允许基于内容的访问,尽管我们将在4.1节中引入的时态特性允许一种基于地址的访问。然而,由于我们总是按顺序写入每个内存,所以我们的模型稍微简单一些,不需要像锐化这样的操作。此外,我们将我们的记忆模型应用于文本推理任务,这与NTM处理的更抽象的排序和回忆操作有本质上的区别。
我们的模型也与Bahdanau等[2]有关。在该工作中,采用了基于双向RNN的编码器和基于门控RNN的解码器进行机器翻译。解码器使用一个注意力模型,从编码中找出哪些隐藏状态对输出下一个翻译词最有用;注意力模型使用一个小的神经网络,将解码器的当前隐藏状态和每个编码器的隐藏状态串联起来作为输入。Xu等人[24]也使用了类似的注意力模型来生成图像标题。我们的“记忆”类似于它们的注意力机制,尽管[2]只在一个句子上,而不是像我们这样在很多句子上。此外,我们的模型在输出之前在内存上进行了几次跳跃;下面我们将看到,这对于良好的性能非常重要。与我们的评分方法相比,用于记忆评分的小网络的结构也存在差异;我们使用简单的线性层,而它们使用更复杂的门控架构。
我们将把我们的模型应用到语言建模中,这是一项广泛研究的任务。Goodman[6]展示了将n-gram与缓存结合起来的简单而有效的方法。Bengio等人[3]激发了人们对使用基于神经网络的模型完成任务的兴趣,与传统方法相比,rnn[14]和LSTMs[10,20]显示了明显的性能提升。事实上,目前最先进的是这些模型的变体,例如具有Dropout[25]的非常大的lstm或对权矩阵[15]具有对角约束的rnn。通过适当的权重绑定,我们的模型可以被视为一种改进的RNN,其中递归是通过内存查找词序列索引,而不是由序列本身索引。
四.综合问答实验
我们对[22]中定义的合成QA任务(使用数据集的1.1版本)进行实验。给定的QA任务由一组陈述组成,后面是一个问题,其答案通常是一个单词(在一些任务中,答案是一组单词)。模型在训练时可以得到答案,但必须在测试时进行预测。总共有20种不同类型的任务,探索不同形式的推理和演绎。以下是其中三个任务的例子:
请注意,对于每个问题,只有一些语句子集包含答案所需的信息,其他基本上是无关的干扰(例如,第一个例子中的第一个句子)。在Weston等人[22]的记忆网络中,该支持子集在训练过程中明确地指示给模型,而该工作与此工作的关键区别在于不再提供该信息。因此,模型必须在训练和测试时自己推断出哪些句子是相关的,哪些是不相关的。
形式上,对于20个QA任务中的一个,我们给出了示例问题,每个问题都有一组I句子{xi},其中I≤320;设句子i的第j个单词为xij,用一个长度为V的热门向量表示(其中词汇量大小为V = 177,反映了QA语言的简单化性质)。问题q和答案a使用了相同的表示。使用了两个版本的数据,一个每个任务有1000个训练问题,另一个更大的版本每个任务有10,000个训练问题。
4.1模型的细节
除另有说明外,所有实验均采用K = 3跳模型,并采用相邻权值分担方案。对于所有输出列表的任务(即答案是多个单词),我们将每个可能输出的可能组合记录为一个单独的答案词汇单词。
句子表示:
在我们的实验中,我们探索了句子的两种不同表述。第一个是词袋(BoW)表示,它采用句子xi = {xi1, xi2,…, xin},嵌入每个词,并对结果向量求和:如mi = P j Axij和ci = P j Cxij。表示问题的输入向量u也被嵌入到一个单词包中:u = P j Bqj。这种方法的缺点是它不能捕捉句子中单词的顺序,这对于一些任务来说是很重要的。
因此,我们提出了第二种表示法,对单词在句子中的位置进行编码。它采用的形式是:mi = P j lj·Axij,其中·是元素级乘法。lj是一个列向量,结构为lkj =(1−j/ j)−(k/d)(1−2j/ j)(假设索引为1),其中j为句子的字数,d为嵌入维数。这个句子表示,我们称之为位置编码(PE),这意味着单词的顺序现在会影响mi。同样的表示也用于问题、记忆输入和记忆输出。
时间编码:
许多QA任务都需要一些时间背景的概念,例如在第2部分的第一个例子中,模型需要理解Sam在厨房之后是在卧室。为了使我们的模型能够解决这些问题,我们修改了内存向量,使mi = P j Axij + TA(i),其中TA(i)是编码时间信息的特殊矩阵TA的第i行。输出嵌入用矩阵Tc以同样的方式增强(例如ci = P j Cxij + Tc (i))。TA和TC都是在培训中学习的。它们也受到与A和c相同的共享约束。注意,句子的索引顺序是相反的,反映了它们与问题的相对距离,因此x1是故事的最后一句话。
通过注入随机噪声学习时不变性:
我们发现添加“虚拟”记忆来规范TA是有帮助的。也就是说,在训练的时候,我们可以在故事中随机增加10%的空白记忆。我们将这种方法称为随机噪声(RN)。
4.2训练细节
将10%的bAbI训练集抽出形成验证集,用于选择最优的模型结构和超参数。模型的学习速率为η = 0.01,每25个η/2次退火,直到100个η/2次。没有使用动量或重量衰减。权值由平均为0、σ = 0.1的高斯分布随机初始化。用1k训练样本(10k训练样本)同时训练所有任务,使用60个epoch(20个epoch),每15个epoch(5个epoch)学习速率退火η/2。所有训练使用的批大小为32(但在批中不计算平均成本),且“2”范数大于40的梯度除以一个标量得到范数40。在我们的一些实验中,我们探索了在开始训练时去除每个记忆层中的softmax,使模型除用于答案预测的最终softmax外完全线性化。当验证损失停止减少时,重新插入softmax层,并重新开始训练。我们称之为线性开始(LS)训练。在LS训练中,初始学习率设置为η = 0.005。记忆容量仅限于最近的50句话。由于句子的数量和每个句子的单词数量在问题之间有所不同,所以使用一个空符号将它们填充到一个固定的大小。零符号的嵌入被约束为零。
在一些任务中,我们观察到我们的模型的性能有很大的差异(例如,有时失败得很严重,有时不会,这取决于初始化的情况)。为了弥补这一点,我们用不同的随机初始化重复训练10次,并选择训练误差最低的那个。
4.3基线
我们将我们的方法2(缩写为MemN2N)与一系列替代模型进行比较:
MemNN:
[22]中提出的强监督AM+NG+NL内存网络方法。这是那篇论文中报道的最好的方法。它在每一层使用一个max操作(而不是softmax),它是用支持事实(强监督)直接训练的。它采用n元建模、非线性层和自适应跳数每查询。
MemNN-WSH:
一种弱监督启发式MemNN,在训练中不使用支持句子标签。由于我们无法通过每一层的max操作反向传播,我们强制第一个内存跳应该与问题共享至少一个单词,第二个内存跳应该与第一个跳共享至少一个单词,与答案共享至少一个单词。所有符合条件的记忆被称为有效记忆,训练的目标是使用与强监督训练相同的排名标准,将它们排名高于无效记忆。
LSTM:
一个标准的LSTM模型,只使用问题/答案对训练(也就是弱监督)。有关详细信息,请参见[22]。
4.4结果
我们报告了多种设计选择:(i) BoW vs Position Encoding (PE)句子表示;(ii)所有20个任务的独立训练vs联合训练(联合训练的嵌入维度为d = 50,而独立训练的嵌入维度为d = 20);(iii)两阶段训练:线性开始(LS),初始去除软最大vs从一开始就使用软最大训练;(iv)从1到3变化内存跳数。
表1给出了所有20个任务的1k训练集的结果,以及10k训练集3的平均表现。它们展示了一些有趣的观点:
最好的MemN2N模型与监督模型相当接近(例如,1k: 6.7%的MemNN vs 12.6%的MemN2N与位置编码+线性开始+随机噪声,联合训练和10k: 3.2%的MemNN vs 4.2%的MemN2N与位置编码+线性开始+随机噪声+非线性4,尽管监督模型仍然是更好的。
我们提出的模型的所有变体都轻松地击败了弱监督基线方法。
位置编码(PE)比单词袋(BoW)更好,这在任务4,5,15和18中得到了明显的改进,在这些任务中单词排序特别重要。
训练的线性开始(LS)似乎有助于避免局部最小值。参见表1中的task 16,其中PE单独获得53.6%的错误,而使用LS将其降低到1.6%。
在4.1节中描述的使用随机空内存抖动时间指数(RN)可以在性能上获得小但持续的提高,特别是对于较小的1k训练集。
所有任务的联合训练都有帮助。
重要的是,更多的计算跳跃可以提高性能。在图2和附录B中,我们给出了一些示例(通过eq.(1)的值)执行的跳的例子。
表1:使用1k训练示例的模型在20个QA任务上的测试错误率(%)(10k训练示例的平均测试错误显示在底部)。关键词:BoW =词袋表征;PE =位置编码表示;LS =线性开始训练;RN =随机注入时间指数噪声;LW = rnn式逐层压紧法(如未说明,采用相邻压紧法);联合=对所有任务进行联合训练(相对于单任务训练)。
五.语言建模实验
语言建模的目标是在给定前一个单词x的情况下预测文本序列中的下一个单词。现在我们解释如何将我们的模型轻松地应用于这项任务。
图2:[22]QA任务的示例预测。我们展示了MemN2N在训练过程中不使用的数据集的标记支持事实(支持),以及模型在推理过程中使用的每一跳的概率p。MemN2N成功地学会了把注意力集中在正确的支持句上。
表2:Penn Treebank和Text8语料库测试集的困惑度。请注意,增加内存跳数可以提高性能。
图3:6次内存跳跃中内存位置的平均激活权重。白色表示在第k跳时模特所在的位置。为了清晰起见,每一行都被规范化为最大值为1。模型在(左)Penn Treebank和(右)Text8数据集上训练。
我们现在是在单词层面进行操作,而不是在句子层面。因此,序列中的前N个单词(包括当前的)分别嵌入到内存中。每个存储单元只包含一个单词,因此不需要QA任务中使用BoW或线性映射表示。我们采用了第4.1节的时间嵌入方法。
由于不再有任何问题,图1中的q固定为常数向量0.1(不嵌入)。输出softmax预测词汇表(大小为V)中哪个单词在序列中是下一个。采用与QA任务相同的方式,通过跨存储层反向传播错误,使用交叉熵损失来训练模型。为了辅助训练,我们将ReLU操作应用到每层的一半单位。我们采用分层(类似于rnn)权值共享,即每层的查询权值相同;每一层的输出权值相同。正如在2.2节中提到的,这使得我们的架构与传统上用于语言建模问题的RNN密切相关;然而,在这里,网络循环的“序列”不在文本中,而在内存跳中。此外,权重绑定限制了模型中参数的数量,有助于推广更深入的模型,我们发现这是有效的任务。我们使用了两个不同的数据集:
宾州数库:
它由929k/73k/82k训练/验证/测试单词组成,分布在10k单词的词汇表中。使用了与[25]相同的预处理。
Text8:
这是前1亿个字符的预处理版本,从维基百科上丢弃。这被分为93.3M/5.7M/1M字符训练/验证/测试集。所有出现次数少于5次的单词都被替换为标记,导致词汇量约为44k。
5.1训练细节
我们使用的培训程序与QA任务相同,除了以下几点。对于每个小批量更新,测量所有参数的整个梯度的' 2范数5,如果大于L = 50,则将其缩小为范数L。这对于良好的性能至关重要。我们使用[15]的学习率退火计划,即,如果在一个epoch之后验证成本没有下降,那么学习率按比例减小1.5。当学习率低于10−5时,即50个epoch之后,培训终止。权重使用N(0, 0.05)初始化,批大小设置为128。在Penn树数据集上,我们使用不同的随机初始化重复每个训练10次,并选择验证成本最小的那个。然而,由于时间限制,我们只在Text8数据集上进行了一次训练。
5.2结果
表2将我们的模型与RNN、LSTM和结构约束循环网(SCRN)[15]基线在两个基准数据集上进行了比较。注意,基线架构在[15]中进行了调优,以提供最优的困惑6。我们的MemN2N方法在两个数据集上都实现了较低的perplexity(在Penn上RNN/SCRN为111 vs115,在Text8上LSTM为147 vs154)。注意,MemN2N的参数比rnn多1.5倍,而LSTM的参数比rnn多4倍。我们还改变了MemN2N的跳数和内存大小,以显示两者对性能的贡献;特别要注意的是,增加跳跃的数量会有所帮助。在图3中,我们展示了MemN2N如何通过多跳操作内存。它显示了测试集中每个内存位置激活的平均权重。我们可以看到,一些跃点只关注最近的单词,而其他的跃点则更广泛地关注所有的内存位置,这与成功的语言模型由平滑的n元模型和缓存[15]组成的想法是一致的。有趣的是,这两种啤酒花似乎是交替出现的。还需要注意的是,与传统的RNN不同,缓存不会呈指数衰减:它在整个内存中有大致相同的平均激活。这可能是观察到的语言建模改进的来源。
六.结论和未来工作
本研究表明,具有外显记忆和阅读记忆的反复注意机制的神经网络可以通过反向传播在从回答问题到语言建模的不同任务上成功训练。与[23]的内存网络实现相比,没有支持事实的监督,因此我们的模型可以在更广泛的设置中使用。我们的模型接近该模型的相同性能,并且显著优于具有相同监督级别的其他基线。在语言建模任务上,它比调优后的rnn和LSTMs稍好一些。在这两个任务中,我们可以看到增加内存跳数可以提高性能。
然而,仍有许多工作要做。我们的模型仍然无法精确匹配在强监督下训练的记忆网络的性能,并且两者在几个1k QA任务中都失败了。此外,平滑查找可能不适用于需要较大内存的情况。对于这些设置,我们计划探索注意或哈希的多尺度概念,就像[23]中提出的那样。