《用于任务型对话的全局到局部的记忆指针网络》阅读笔记
题目:GLOBAL-TO-LOCAL MEMORY POINTER NETWORKS FOR TASK-ORIENTED DIALOGUE
来源:ICLR 2019
原文链接:https://arxiv.org/abs/1901.04713.pdf
论文代码:https://github.com/jasonwu0731/GLMP
转载请注明出处:apex&momoco
Abstract
端到端的任务型对话任务系统的实现一直充满挑战,因为知识库的庞大和不断变化以及难以并入一个学习框架里的特性。为解决这些问题,本文提出了GLMP网络:
- 全局记忆编码器:对对话历史进行编码,并且修改全局上下文表示,同时产生一个全局上下文指针。
- 局部记忆解码器:解码器生成一个带有空slots的响应草稿,通过全局记忆指针在外部知识库中过滤出有用的信息,通过局部记忆指针填上这些空slots
全局记忆编码器和局部记忆解码器共享一个外部知识库。
结果表明,GLMP在拷贝准确率和减弱常见的OOV问题的能力上均有提升,并且在simulated bAbI Dialogue dataset 以及human-human Stanford Multi-domain Dialogue dataset 两个数据集上进行自动或手动的测试均比以往表现最好的模型更好。
Introduction
传统Pipeline方法实现任务型对话系统需要耗费精力设计每个单独的模块,基于端到端通过循环神经网络和记忆网络实现任务型对话系统的方法就显得省时省力同时还便于拓展领域。这种方法让对话状态在任务完成过程中的传递被隐藏起来并且不需要手动对每个状态进行标注还消除了对模块之间依赖关系建模和手工解释知识库的需求。
然而,通过记忆网络建模知识库会过度将系统响应的生成和外部知识相结合。引入一个大型复杂的知识库相当于给模型输入附加了一个充满噪声的部分。与闲聊不同,在任务型对话中,需要准确获得知识库中的响应实体,引入大量噪声意味着响应的生成变得不稳定。
综上所述,指针网络或拷贝网络所具备的直接从输入源中拷贝重要信息的能力就变得十分关键,同时这种拷贝方式也和人类获取信息的方式相似。
因此,作者提出了网络。
GLMP Model
GLMP主要包括了三部分:外部知识库External Knowledge、全局记忆编码器Global Memory Encoder、局部记忆解码器Local Memory Decoder。
首先定义:
模型输入为:历史对话序列、知识库的知识信息
系统响应为期望输出
其中为对应的长度
模型工作步骤如下:
- 全局记忆编码器通过一个上下文RNN对历史对话进行编码,并将其隐藏状态写入外部知识。
- 使用最后一个隐藏状态用来读取外部知识并生成一个全局记忆指针。
- 解码过程中,本地记忆解码器通过一个草稿RNN生成草稿响应。
- 将全局记忆指针和草图神经网络的隐藏状态则被作为一个过滤器和query传给外部知识库,最终获得系统响应。
External Knowledge
外部知识库主要包括了一个全局上下文表示,这个表示被编码器和解码器所共享。
通过端到端记忆网络来存储字级别的知识库内容以及具有时间依赖性的对话历史,由于记忆网络有较好的多跳推理能力,故非常适合用来增强拷贝机制。
Global contextual representation
在KB储存模块中每个知识元素都表示一个三元组结构 。其次对话上下文则被存储在对话存储模块中,其结构同样为三元组,可表示为。
对于以上两个存储模块来说,通过一个词袋表示的方法来作为存储空间的嵌入。如推理过程中,通过直接指向一个存储地址来对这个词进行拷贝。被记作是从一个三元组中获得一个object词。
Knowledge read and write
记忆网络参考:论文解读:记忆网络(Memory Network)
外部知识模块由许多可训练的embedding矩阵组成 ;
其中,是记忆网络里最大跳跃次数,是词汇表大小,是embedding的维度。
把外部知识的存储定义为:;
其中,为上述三元组组成成分之一
为了能够访问外部知识库,需要初始化一个query向量,并且这个向量可以在循环遍历次跳跃后计算每次跳跃的注意力权重:
其中,是在embedding矩阵中第个位置存储的embedding;
是第k跳的query向量,而则是词袋函数。
让为一个软存储attention,它决定了查询向量相关的存储空间。然后模型通过对加权求和和并更新query向量来读取存储空间:
Global Memory Encoder
如上图所示,全局记忆编码器首先用一个上下文RNN来建模序列依赖关系并且建模上下文。然后把隐藏状态写入外部知识中。如上一部分图。
然后最后一个编码器隐状态作为query来查询外部只是,并获得两个输出:全局记忆指针,记忆查询结果。
由于用记忆网络来建模外部记忆之间的依赖关系十分困难,则通过写入隐藏状态到外部知识中作为连接边可以提供序列性和上下文性的信息。并且用合理的表示,指针能够正确地从外部知识中拷贝词汇,这样也能减弱OOV的问题。
此外,使用已编码的对话历史作为query能够激励从外部知识中读取与隐藏对话状态或用户意图有关的记忆信息。并且学习了全局记忆分布的全局记忆指针和已编码的对话历史以及KB信息被一并传给解码器。
Context RNN
对话历史首先被一个GRU编码成隐状态序列:
最后一个隐状态用来作为对外部知识进行查询query的对话历史。
此外隐状态序列还被写入外部知识库中的对话历史模块,和该隐状态相关原始记忆表示进行求和:
Global memory pointer
全局记忆指针是一个向量有0和1之间的真值组成。
与传统的attention机制所有权值加和为一不同,中每一个概率都是独立的。
首先通过对外部知识进行查询直到最后一跳,通过执行内积然后是得到每个记忆分布,最终组成全局记忆分布:
为了提升这个全局记忆分布的表现,作者还设置了一个辅助loss来把全局记忆指针当作多分类任务进行训练:
首先设置了一组全局指针的标签:
通过这组标签以检测记忆中的词汇是否存在于预期的系统响应中,全局记忆指针则通过二元交叉熵在和之间进行训练。
Local Memory Decoder
给定已编码的对话历史,已编码的KB信息,以及全局记忆指针。
通过拼接和,局部记忆解码器首先会初始化它的草稿RNN,生成一个草稿响应,该响应排除slot值,但包含草稿标记。
例:sketch RNN会先生成“@poi is @distance away.” 而不是直接生成 “Starbucks is 1 mile away.”
在每一个时间步的解码过程中,sketch RNN的隐状态的有两个作用:
- 从词汇表中预测下一个生成词(token)。
- 作为一个查询向量,用于查询外部知识。
如果一个草稿里的标签被生成了,全局记忆指针则会被传给外部知识,然后局部记忆指针就会选出响应标签位置上期望产生的实体词,否则,这个词就会被sketch RNN直接生成。
@poi标记在第一个时间步生成,因此,Starbucks从局部记忆指针获取作为系统响应输出字的单词。
Sketch RNN
通过一个GRU来生成不带真实slot值的草稿响应
Sketch RNN基于编码的对话历史和KB信息学习生成一个动态的的对话行为模板。
每一个解码的时间步,Sketch RNN的隐藏状态及当前生成词的概率分布为:
并且通过标准交叉熵对Sketch RNN进行训练:
Local memory poiter
局部记忆指针由指针序列组成。
每个时间步,全局记忆指针首先通过它的注意力机制修改全局上下文表示:
然后通过sketch RNN的隐藏状态查询外部知识。
最后一跳中的记忆attention对应的局部记忆指针,它表示为时间步时的记忆分布。
为了训练局部记忆指针,在最后一跳的外部知识记忆注意力的基础上添加一个监督。
首先,在解码时间步,给局部记忆指针定义了位置标签:
同时还设置了一个防止同一个实体词被多次拷贝的记录,中的所有元素最开始都被初始化为1。
在解码过程中,如果一个记忆位置被指向,那么中对应的记忆位置将被掩蔽(masked out)。
在推理时:
最后,所有参数被联合训练,让三个loss加权求和最小化:
其中均为超参数。
Experiment
实验主要基于两个公开数据集:
- the bAbI dialogue
bAbI数据集主要包括了五个关于餐厅领域的模拟任务,任务1到4分别是关于对API的调用、修改API调用、推荐选项和提供附加信息,任务5则是前4个任务的综合测试。
每个任务有两个测试集:一个遵循与训练集相同的分布规律,另一个具有OOV实体值。
- Stanford multi-domain dialogue(SMD)
该数据集是一个人和人之间的多领域对话数据集。
主要包括了3个不同的领域:日历调度,气象信息检索和导航功能。
两者区别在于前者对话轮数较多且对话内容规范;后者则含有相对较少的对话轮数、更多样化的响应内容以及复杂的知识库信息。
Result
Conclusion
这篇论文提出了一个用于任务型对话的端到端的可训练模型,称为全局到局部记忆指针网络。全局记忆编码器和局部记忆解码器的设计目的是将共享的外部知识整合到学习框架中。经验表明,全局和局部记忆指针能够有效地产生系统响应,甚至在词汇表外的情况下,并可视化全局内存指针的帮助。因此,模型在模拟数据集和人-人数据集上都达到了最高的水平,并具有扩展到其他任务如问答和文本摘要的潜力。