GLMP:任务型对话中全局到局部的记忆指针网络 论文阅读及代码解析

GLMP是一种针对任务型对话的模型,通过全局记忆编码器和局部记忆解码器共享外部知识。全局记忆指针过滤外部知识,而局部记忆指针从外部知识中复制单词以生成回复。模型在bAbI对话和SMD数据集上表现出色,尤其在处理OOV问题时。GLMP通过多跳推理和软记忆注意机制提高了复制精度。
摘要由CSDN通过智能技术生成

UPDATE

11.6.2020

GLMP

ABSTRACT

面向任务的端到端对话,因为知识库通常很大,动态性强,很难融入学习框架而具有挑战性。
在我们的模型中,我们提出了一个全局记忆编码器和一个局部记忆解码器来共享外部知识。
编码器对对话历史记录进行编码,修改全局上下文表示,并生成全局记忆指针。
解码器首先生成一个带有未填充槽的回复草图,之后传递全局记忆指针来过滤相关信息的外部知识,然后通过本地记忆指针插入插槽。
GLMP可以提高复制精度,并减轻常见的未登录词(out-of-vocabulary)问题。

1.INTRODUCTION

传统的流水线解决方案由自然语言理解、对话管理和自然语言生成三部分组成。
端到端的优点在于对话状态是隐藏的,不需要手工制作标签,并且无需对模块之间的依赖关系建模和手工解释知识库。
但端到端系统通常无法有效地将外部知识合并到系统中,动态的大型KB等同于噪声输入,难以编解码,这使得生成不稳定。不同于闲聊,这对于任务型对话有很大的影响,因为KB信息通常是回复中预期的实体。
因此,指针网络(pointer network)或复制机制(copy mechanis)对于成功生成系统回复至关重要,因为直接将关键字从输入源复制到输出端不仅降低了生成难度,同时也因为如此更符合人类习惯。
我们提出了全局到本地记忆指针(GLMP)网络,它由一个全局记忆编码器、一个本地记忆解码器和一个共享的外部知识库组成。
不同于现有的复制方法:唯一传递给解码器的信息是编码器的隐藏状态,我们的模型共享外部知识,并利用编码器和外部知识来学习全局记忆指针和全局上下文表示。

  1. 全局记忆指针通过软过滤不需要复制的单词来修改外部知识。
  2. 本地存储解码器不再直接生成系统响应,而是首先使用sketch RNN获得没有插槽值但有草图标签的草图回复。这里可以被认为是学习一个潜在的对话管理生成对话行为模板。
  3. 解码器生成本地记忆指针,以从外部知识复制单词并实例化草图标记。

2.GLMP MODEL

我们的模型由三部分组成:全局记忆编码器、外部知识和本地记忆解码器。
在这里插入图片描述

  1. 全局记忆编码器使用context RNN对对话历史进行编码,并将其隐藏状态写入外部知识。
  2. 使用最后一个隐藏状态读取外部知识,同时生成全局记忆指针。
  3. 解码阶段,本地存储器解码器首先通过一个sketch RNN生成草图回复。
  4. 将全局记忆指针和sketch RNN隐藏状态作为一个 filter 和一个 query 传递给外部知识。
    从外部知识返回的本地记忆指针可以从外部知识中复制文本来替换sketch标记,并获得最终的系统回复。

2.1 EXTERNAL KNOWLEDGE

我们的外部知识包含与编码器和解码器共享的全局上下文表示。
为了将外部知识整合到学习框架中,端到端记忆网络(MN)用于存储结构知识库(KB memory)和与临时的对话历史(dialogue memory)的单词级信息。MN以其多跳推理能力(multiple hop reasoning ability)而闻名。这似乎是为了加强复制机制。
全局上下文表示
在KB记忆模块中,每个元素 b i ∈ B bi∈B biB ( S u b j e c t , R e l a t i o n , O b j e c t ) (Subject, Relation, Object) (Subject,Relation,Object) 结构的三元组表示。
对话记忆模块中,对话上下文 X X X 表示为
( $ u s e r , t u r n 1 , I ) , ( $ u s e r , t u r n 1 , n e e d ) , ( $ u s e r , t u r n 1 , g a s ) {(\$user, turn1, I), (\$user, turn1,need), (\$user, turn1, gas)} ($user,turn1,I),($user,turn1,need),($user,turn1,gas)对于这两个记忆模块,使用一个词袋表示作为记忆嵌入。在推理期间,一旦指向某个记忆位置,我们就复制指向的对象单词,例如,如果选择了triplet ( T o m s h o u s e , d i s t a n c e , 3 m i l e s ) (Toms house, distance, 3miles) (Tomshouse,distance,3miles),就会复制 3 m i l e s 3miles 3miles O b j e c t ( . ) Object(.) Object(.)函数的作用是:从三元组中获取目标词。
知识读和写
我们的外部知识是由一系列可训练的嵌入矩阵组成的 C = ( C 1 , . . . , C K + 1 ) C= (C^1,...,C^{K+1}) C=(C1,...,CK+1) , 其中 C k ∈ R ∣ V ∣ × d e m b C^k∈\R^{|V|×d_{emb}} CkRV×demb, K K K 是MN最大的memory hop, ∣ V ∣ |V| V为词汇量, d e m b d_{emb} demb为嵌入维数。我们把外部知识中的记忆表示为 M = [ B ; X ] = ( m 1 , . . . , m n + l ) M= [B;X] = (m_1,...,m_{n+l}) M=[B;X]=(m1,...,mn+l)其中 m i m_i mi是所提到的三元组成分之一。要读取记忆,外部知识需要一个初始查询向量 q 1 q^1 q1。此外,它可以循环遍历 K   h o p s K~hops K hops并用下方公式计算每个 h o p   k hop~k hop k的注意权值
在这里插入图片描述
其中 c i k = B ( C k ( m i ) ) ∈ R d e m b c^k_i=B(C^k(m_i))∈R^{d_{emb}} cik=B(Ck(mi))Rdemb 是 用嵌入矩阵 C k C^k Ck查找到的第 i i i个记忆位置, q k q^k qk 是第 k k k h o p hop hop 的查询向量,而 B ( . ) B(.) B(.)是词袋函数。注意 p k ∈ R n + l p^k∈\R^{n+l} pkRn+l 是一种软记忆注意,它决定了与查询向量的记忆相关度。然后模型通过对 c k + 1 c^{k+1} ck+1 加权求和读取出记忆 o k o^k ok 并更新查询向量 q k + 1 q^{k+1} qk+1
在这里插入图片描述
在这里插入图片描述

2.2 GLOBALMEMORY ENCODER

context RNN用于建立顺序依赖关系,并对上下文 X X X 进行编码。之后将隐藏状态写入外部知识。最后一个编码器隐藏状态作为查询,读取外部知识,得到两个输出:全局记忆指针和记忆读取器。直观地说,MN结构很难对记忆之间的依赖关系进行建模,这是一个严重的缺陷,尤其是在与会话相关的任务中,将隐藏状态写入外部知识可以提供顺序和融合了上下文的信息。通过有意义的表示,我们的指针可以正确地从外部知识中复制单词,并且可以减轻常见的OOV挑战。此外,使用已编码的对话上下文作为查询可以鼓励我们的外部知识读取与隐藏对话状态或用户意图相关的记忆信息。此外,学习全局记忆分布的全局记忆指针与编码的对话历史和KB信息一起传递给解码器。
Context RNN
用于将对话历史记录编码到隐藏状态的双向GRU,最后一个隐藏状态将作为编码的对话历史来对外部知识进行查询。此外,通过将原记忆表示与对应的隐藏状态相加,将隐藏状态重新写入外部知识的对话记忆模块中。
在这里插入图片描述
Global memory pointer
全局记忆指针 G = ( g 1 , . . . , g n + l ) G= (g_1,...,g_{n+l}) G=(g1,...,gn+l) 是一个包含0到1之间的实数的向量。不同于传统的注意机制,所有的权重加起来等于一,每个元素的概率都是独立的。
我们首先使用 h n e h^e_n hne 查询外部知识,直到最后一跳(hop),我们执行一个内积 → \rightarrow Sigmoid函数而不是Softmax函数。我们得到的记忆分布是全局记忆指针G,它被传递给解码器。为了进一步增强全局指向能力,我们增加了一个辅助损失,将全局内存指针训练成一个多标签分类任务。我们在消融研究中发现,增加这种额外的监护确实能提高性能。最后,使用记忆读出器 q K + 1 q^{K+1} qK+1 作为已编码的KB信息。
在辅助任务中,我们通过检查记忆中的目标实体单词是否存在于预期的系统回复 Y Y Y 中,来定义标签 G l a b e l = ( g 1 l , . . . , g n + l l ) G^{label}= (g^l_1,...,g^l_{n+l}) Glabel=(g1l,...,gn+ll) 之后全局记忆指针通过 G G G G l a b e l G^{label} Glabel 的二分类交叉熵来训练。
在这里插入图片描述

2.3 LOCAL MEMORY DECODER

给定已编码的对话历史 h n e h^e_n hne、已编码的KB信息 q K + 1 q^{K+1} qK+1 和全局记忆指针 G G G ,我们的本地记忆解码器首先链接 h n e h^e_n hne q K + 1 q^{K+1} qK+1 来初始化它的草图RNN,生成一个排除槽值但包含草图标记的草图回复。比如, sketch RNN 将生成 “@poi is @distance away”, 而非 “Starbucks is 1 mile away.”在每个解码时间步,草图RNN的隐藏状态用于两个目的:

  1. 预测词汇表中的下一个token,它与标准的Seq2Seq相同
  2. 作为查询外部知识的向量
    如果生成了一个草图标记,全局记忆指针将传递给外部知识,预期的输出单词将从本地记忆指针获得。否则,输出单词就是草图RNN生成的单词。

Sketch RNN
我们使用GRU生成没有真正槽值的草图回复 Y s = ( y 1 s , . . . , y m s ) Y^s= (y^s_1,...,y^s_m) Ys=(y1s,...,yms) Sketch RNN学习生成一个基于对话编码 ( h n e ) (h^e_n) (hne) 和KB信息 q K + 1 q^{K+1} qK+1 的动态对话行为模板,在每个解码时间步,Sketch RNN隐藏状态 h t d h^d_t htd及其输出分布 p t v o c a b p^{vocab}_t ptvocab 定义为
在这里插入图片描述
我们使用标准的交叉熵损失来训练Sketch RNN
在这里插入图片描述
Local memory pointer
本地记忆指针 L = ( L 1 , . . . , L m ) L= (L_1,...,L_m) L=(L1,...,Lm) 包含一个指针序列。每个时间步 t t t ,全局记忆指针首先使用其注意力权重修改全局上下文表示
在这里插入图片描述
然后Sketch RNN隐藏状态 h t d h^d_t htd 对外部知识进行查询。最后一跳中的记忆注意对应于本地记忆指针 L t L_t Lt,表示为时间步 t t t 的记忆分布。为了训练本地记忆指针,在最后一跳记忆注意的外部知识上增加一个监督。我们首先定义解码时间步的本地记忆指针 L l a b e l L^{label} Llabel 的位置标签
在这里插入图片描述
位置 n + l + 1 n+l+1 n+l+1 是记忆中的一个空标记,它允许我们在即使外部知识中不存在该函数时也可以计算损失函数。
在这里插入图片描述
此外,我们利用 R ∈ R n + l \R∈R^{n+l} RRn+l 来防止相同实体被复制多次,所有在 R R R 中的元素在开始时都初始化为1。在解码阶段,如果一个记忆位置被指向,它在 R R R 中的相应位置将被屏蔽。在推理阶段:
在这里插入图片描述
其中 ⨀ \bigodot 是元素对应相乘。最后,通过对三个损失的加权和进行最小化,对所有参数进行联合训练。 ( α , β , γ ) (α,β,γ) (α,β,γ) 是超参数。
在这里插入图片描述

3. EXPERIMENTS

3.1 DATASETS

bAbI dialogue
bAbI dialogue包括五个餐厅领域的模拟任务。任务1到4分别是关于调用API调用、修改API调用、推荐选项和提供附加信息。Task 5是Task 1-4的并集。每个任务有两个测试集:一个遵循与训练集相同的分布,另一个具有OOV实体值。
SMD
一个人-人多领域对话数据集。它有三个不同的领域:日历调度、天气信息检索和兴趣点导航。这两个数据集的关键区别在于,前者的对话周期较长,但用户和系统的行为是常规的,后者只有很少的会话转折,但是有不同的响应,而且知识库信息要复杂得多。

3.2 TRAINING DETAILS

  • Adam lr 1e-3 ~ 1e-4
  • hop K 1,3,6
  • ( α , β , γ ) (α,β,γ) (α,β,γ) summing up the three losses are set to 1
  • embeddings 随机初始化
  • 在解调阶段,仅采用了一种简单的贪婪策略,没有进行beam-search。
  • 超参数如hidden size和dropout是基于开发集(bAbI对话的每回复准确度和SMD的BLEU得分)通过网格搜索来调整的
  • 为了增强模型泛化和模拟OOV设置,我们将少量输入源token随机屏蔽为未知token。

3.3 RESULTS

bAbI Dialogue
在这里插入图片描述
根据每个回复的准确率和任务完成率来衡量表现。
值得注意的是,对于检索式模型,如QRN、MN、GMN等,不能正确地推荐选项(T3)和提供附加信息(T4),并且在OOV设置中泛化能力较差,在Task 5中存在约30%的性能差异。尽管以前的基于生成的方法(Ptr-Unk,Mem2Seq)通过加入复制机制来减少这种差距,但是最简单的情况,比如生成和修改API调用(T1, T2),仍然面临着6-17%的OOV性能下降。另一方面,GLMP在所有对话任务中实现了最高的92.0%的任务完成率,并以较大的优势超过了其他基线,特别是在OOV设置中。仅使用单跳,每个回复的精度在T1、T2、T4上没有损失,在task 5中仅下降7-9%。
Stanford Multi-domain Dialogue
我们遵循之前的对话工作用两个自动评价指标:BLEU和entity F1评分来评价我们的系统
在这里插入图片描述
glmp取得了最高的14.79 BLEU和59.97% entity F1的分数,BLEU增加不多,但在entity F1上是一个巨大的进步。事实上,对于面向任务的对话中的非监督评估指标,我们认为entity F1可能是比每个回复的准确率或BLEU更全面的评估指标。Eric等人(2017)的研究表明,人类能够选择正确的实体,但有非常多样化的反应。注意,基于规则和KVR的结果并不是直接可比较的,因为它们通过使用命名实体识别和链接将实体的表达式映射到标准形式,从而简化了任务。
此外,还报告了人类对产生的反应的评价。我们将我们的工作与先前的最先进的模型mem2seq以及原始数据集的响应进行了比较。我们随机从测试集中选择200个不同的对话场景来评估三种不同的反应。Amazon-Mechanical-Turk用于评估系统的适当性和人类的相似性,范围从1到5。我们可以看到GLMP在这两个方面都优于Mem2Seq,这与之前的观察是一致的。我们还看到,人类在该评估中的表现设置了分数的上限,这与预期一致。关于人体评估的更多细节在附录中有报道。

Ablation Study

全局记忆指针 G 和 历史对话记忆 H 的贡献如图所示。
在这里插入图片描述
我们比较了使用GLMP K = 1 K= 1 K=1 在bAbIOOV和SMD的结果。
GLMP w/o H 表示context RNN在全局记忆编码器中不把隐藏状态写入外部知识。
GLMP w/o G 意味着我们不使用全局记忆指针来修改外部知识。
注意,在task 5中可以观察到0.4%的增长,这表明使用全局记忆指针可能会施加太大的先验实体概率。即使我们只在表中报告一个实验,这个OOV泛化问题也可以通过在训练过程中增加dropout率来缓解。

Visualization and Qualitative Evaluation

分析注意力的权重是解释深度学习模型的常用方法。在下图中,我们显示了每一生成时间步的最后一跳的注意向量。Y轴是我们可以复制的外部知识,包括KB信息和对话历史。根据:“what is the address?”在最后一轮中司机的问题,最佳答案和我们生成的回答在顶部,全局记忆指针 G 显示在左边一栏。可以看到,在右栏中,最后的记忆指针成功地在step 0复制了实体 chevron 及step 3复制了地址783 Arcadia Pl,以填充草稿回复。另一方面,没有全局加权的记忆注意在中间一栏中报告。你会发现,即使注意力集中在step 0和step 3中的多个兴趣点和地址上时,全局记忆指针仍可以像预期的那样缓解这个问题。
在这里插入图片描述

4 RELATED WORKS

Task-oriented dialogue systems
基于机器学习的对话系统主要采用模块化和端到端两种不同的方法进行研究。对于模块化系统, 用到了自然语言理解,对话状态跟踪,对话管理,自然语言生成等一系列模块集。这些方法通过结合领域特定的知识和插槽填充技术来实现良好的稳定性,但是还需要附加的人工标签。另一方面,端到端方法近年来也表现出良好的效果。一些学者把任务看作是下一个话语的检索问题,例如,recurrent entity networks在RNN之间共享参数,query reduction networks修改层间查询,memory net-works通过多跳设计,增强推理能力。此外,一些方法将任务视为一个序列生成问题, Lei et al. (2018) 将显式对话状态跟踪到去模块化序列生成中, Serban et al. (2016); Zhao et al. (2017) 利用RNN生成最终回复,取得了良好的效果。尽管它可能会增加搜索空间,这些方法可以通过token-by-token生成回答的传递机制来鼓励更灵活和更多样的系统响应。
Pointer network
使用注意力作为一个指针,选择输入语句的一个成员作为输出。这种复制机制也被用于其他自然语言处理任务中,比如问答系统,机器翻译,语言模型,文本摘要等。在以任务为导向的对话任务中首先展示了增加复制的Seq2Seq模型的潜力,这表明基于生成的方法与简单的复制策略可以超越基于检索的方法。之后,通过连接知识库注意力来扩展词汇表分布,同时将输出维度添加进来。最近,合并端到端记忆网络生成序列,这表明多跳机制可以用来提高复制注意。这些模型通过从KB中复制相关信息来超越检索方法。
Others
Zhao et al. (2017) 提出实体索引, Wu et al. (2018) i引入了recorded delexicalization,通过手动记录实体表来简化问题。此外,记忆增强神经网络(MANN)中我们利用RNN结构来查询外部记忆的方法可以看作是记忆控制器。类似地,记忆编码器也被用于神经机器翻译和元学习应用。然而,与其他使用单个矩阵表示进行读写的模型不同,GLMP利用端到端内存网络执行多跳注意,这类似于Transformer中的堆叠自我注意策略。

代码阅读及调试

惯例:数字仅代表逻辑层次,方便看清函数进入到了第几层。

myTrain.py

from utils.config import *

标准的argparse定义各项输入参数,本次调试中的设置如下:

{
   'dataset': 'babi', 'task': '1', 'decoder': 'GLMP', 'hidden': '128', 'batch': '8', 'learn': '0.001', 'drop': '0.2', 'unk_mask': 1, 'layer': '1', 'limit': -10000, 'path': None, 'clip': 10, 'teacher_forcing_ratio': 0.5, 'sample': None, 'evalp': 1, 'addName': '', 'genSample': 0, 'earlyStop': 'BLEU', 'ablationG': 0, 'ablationH': 0, 'record': 0}
USE_CUDA: True

额外参数设置

early_stop = args['earlyStop']
if args['dataset']=='kvr':  
    from utils.utils_Ent_kvr import *
    early_stop = 'BLEU'  / 判断提前停止的训练的指标
elif args['dataset']=='babi':  / 训练数据集
    from utils.utils_Ent_babi import *
    early_stop = None 
    if args["task"] not in ['1'
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值