最近看了一些融入知识的对话生成,总结记录一下~
【一】《Proactive Human-Machine Conversation with Explicit Conversation Goals》 2019ACL 百度
- 提出了DuConv数据集,通过众包的方式收集了30k对话,共270k轮。数据集构建过程如下:
- 知识爬取:领域限定在电影和电影明星,爬取了结构化信息(导演,主演等)和非结构化信息(简介,短评),对于评分,用离散的符号表示
- 知识图谱构建:多个SPO三元组(subject,predicate,object),可以是事实或者非事实的句子(比如评论和概要)。
- (“Harry Potter and the Sorcerer Stone”, ”directed by”, ”Chris Columbus”):现有的知识图,能够直接爬取下来的,包含短评等
- (”Harry Potter and the Sorcerer Stone”, ”directed by Chris Columbus”, ”Home Alone”):如果两个实体存在相同的谓词和宾语,会创建一个虚拟的三元组,比如这两个电影都是被xx执导的
- 对话目标分配:抽样知识路径作为对话目标。
- 对话众包
- 基于该数据集及任务提出了两个baseline,基于检索的模型和基于生成的模型。总结来看,基于检索的模型不管在多样性,还是一致性、流畅性等方面都不如基于生成的模型。
- 基于检索的模型:根据对话X,搜索DuConv中的最佳响应作为答案,主要有两个步骤:从数据库里检索响应、对候选响应排序,选一个最优的。具体来说,模型主要包含四个部分:
- 对话-响应编码器:BERT,对话和响应编码用[SEP]分割,和BERT的训练分割方法一样,然后利用堆叠的self-attention得到对话和响应的联合表示=》xy
- 知识表示编码器:双向GRU,得到每个知识的表示
- 知识推理模块:利用xy和每个知识的表示,以及目标,得到了总的联合知识表示
- 匹配模块:知识表示和xy拼接,计算匹配概率
- 基于生成的模型:一个seq2seq加额外的知识选择器,模型主要包括四个部分:
- 对话编码器:双向GRU,编码对话X和目标G
- 知识编码器:双向GRU,编码知识和响应Y
- 知识管理器:利用KL散度,让模型学习,让先验分布靠近后验分布(先验分布是指模型在只知道x的情况下的知识选择,后验分布是指模型在知道x和y的情况下的知识选择)
- 解码器:分层门控融合单元,基于GRU,生成响应

【二】《KdConv: A Chinese Multi-domain Dialogue Dataset Towards Multi-turn Knowledge-driven Conversation》 2020ACL 清华
- 提出了一个中文多领域知识驱动对话数据集KdConv,包含三个领域(电影、音乐、旅游),共4.5k对话,86k句子,平均轮次19.对话包含了相关话题的深度讨论,以及多个话题之间的自然过渡。构建过程及规模如下:
- 构建知识图谱:起始实体是从豆瓣、去哪儿等网站搜集来的实体;扩展实体是从XLORE里获取的。旅游主题实体是网上爬的,所以大部分都是非结构化知识。
- 众包产生对话:对话双方都能访问知识库(与DuConv不同的点),也会鼓励对话双方进行主题实体的转换,但是不提前设定转换的目标。
- 共众包产生了1500个对话,以及提前按照8:1:1划分好了。根据统计,主题的转换是有的,并且聊的轮次越多,主题的转换越频繁。
- 与DuConv数据集论文类似,评估了数据集在基于检索和基于生成的模型上的效果。
- 基于生成的模型:经典LM,Seq2Seq和HRED(分层循环编码器-解码器结构)
- 基于检索的模型:BERT,训练任务是在给定上下文的情况下预测候选回复是否是真实回复。
【三】《Learning to Select Knowledge for Response Generation in Dialog Systems》 (PostKS)2019IJCAL 百度
-
主要创新点:利用后验知识分布执导知识选择,从而在对话中产生更合适和信息更丰富的响应。
-
之前的知识选择基本都是基于知识与对话之间的相似性,并不能保证选择的知识就是合适的,也没有一个有效的机制来保证知识选择和相应生成。
-
主要有以下四个部件:
-
对话编码器:双向GRU,编码对话
-
知识编码器:双向GRU,编码知识和响应(如果有的话)
-
知识管理:对于x,每个知识的编码k和响应y,计算只用到x的情况下每个k的概率和用到x和y的情况下每个k的分布,希望这两个分布越接近越好,分布使用点积计算的。但是在实际中,后验知识是不能用的,所以只能够用先验知识来选择知识,所以!!让先验知识拟合后验知识不就好了吗!所以用KL散度当作损失来最小化先验和后验之间的距离

-
解码器:使用分层门控融合单元,并不是让k一直参与解码过程(每个token都让k参加解码也不合理)。分别对y和k计算隐藏状态,然后在通过融合单元将其组合在一起。

比较经典的一个融入知识的对话生成模型,用先验分布拟合后验分布的做法很有创新型
-
【四】《Sequential Latent Knowledge Selection For Knowledge-Grounded Dialogue》(SLKS) 2020ICLR 首尔国立大学
- 关注知识选择过程
- 为了减少对话知识选择造成的模糊性,同时增加知识的多样性,这篇文章提出了一个知识选择的顺序潜在变量模型(SKT)。SKT是一个顺序潜在模型,对先前选择的知识进行顺序条件,以生成响应。
- 好处:如果在之前的回合中对知识选择的历史进行顺序建模,可以减少当前可能的候选知识回合的范围;可以更好的利用响应信息,使知识选择更加准确。
- 模型过程:
- 句子嵌入:用BERT获得x和y的编码,然后用GRU得到x和y的联合表示
- 知识选择(顺序知识转换器):将知识选择看作一个连续的过程,而不是单步的决策;因为知识选择需要多样性,所以建模成一个潜在变量(不是说选一个或者几个出来,而是把需要的知识都融合在一个潜在变量里)。如图所示,先利用后验知识(x+y)推断哪些知识被用到了前一轮,再用先验知识(只有x)估计当前轮次要用到的知识。
- 解码生成:Copy机制(防止OOV):给定上下文x和所选择的知识K,拼接之后给解码器用于响应生成

还是在让先验知识拟合后验知识,与PostKS有类似的地方,但是在后验概率基础上加入了对历史对话轮次中挑选过的知识的考虑。
【五】《Augmenting Knowledge-grounded Conversations with Sequential Knowledge Transition》(SKT-KG) 2021ACL 中科院
-
pipeline:基于上下文的知识选择、基于所选择知识的响应生成
-
目前的知识对话生成有问题:知识选择仅仅依赖语境,忽略了伴随对话流的内在知识转换;容易过拟合,产生不连贯的反应;模型有可能忽略所选择的知识,生成无关的响应。=》将知识抽象到主题标签中,显示地建模顺序多回合对话中的知识转换;对知识感知响应生成器进行预训练,以更关注所选的知识。

- 顺序知识转换(知识选择过程):BERT编码历史上下文+Bi-LSTM+CRF建模知识过渡过程,并选择得分最高的知识标签及其相应的知识内容。如上图
- 对话编码:用BERT和Bi-LSTM获得对话的上下文表示
- 知识转换:用CRF对知识标签转换过程进行了建模。将Bi-LSTM和CRF结合,通过BiLSTM有效的利用过去的输入特征,利用CRF有效的利用句子级标签信息。
- 知识匹配:如果有多个相同标签的知识,用BM25打分选择得分最高的知识作为要融入的知识。
- 知识感知响应生成模型(对话生成过程),分为预训练和微调两个过程:
- 根据知识标签和知识,训练让知识感知响应生成模型生成对应的自然句子。学的是结构上的知识,而不是知识本身。
- 将知识的标签,所选择的知识和对话输入知识感知响应生成器进行微调,得到响应


上图是预训练阶段的输入示例,可以看出来预训练阶段只有知识=》自然语言句子,在微调阶段后面还会拼接上对话;对输入用了三种嵌入方式,token embedding,position embedding和relo embedding。
知识和对话都用各自的token当做嵌入,知识标签映射到不同类别,作为token嵌入,在对话和知识之间插入[EOK],末尾添加[EOU],角色嵌入用来区分知识和对话。
注:知识三元组的知识标签是关系边,如果是非结构化文本就用LDA主题模型
【六】《Difference-aware knowledge selection for knowledge grounded conversation generation》(DiffKS) 2020EMNLP 清华
-
关注知识选择过程
-
不同回合的知识选择之间的差异会为知识选择提供潜在的线索,该论文提出了一种基于差异感知的知识选择方法。首先计算当前回合中提供的候选知识句子与前一个回合选择的候选知识句子之间的差异,然后将差异信息与上下文信息进行融合或分离,以促进最终的知识选择。
-
模型结构:
-
编码器:对话(上一轮x,y和当前轮x)使用BiGRU;知识也使用BiGRU,知识还加了一个k0,后面差异计算的时候会用到
-
差异感知知识选择:使用BiGRU比较候选句子之间的相关性,然后计算每个知识句子与前M轮所选择的知识的差值。因为直观来说,当前轮选择的知识主要与上一轮有关,所以这里只用了上一轮
- 融合:将得到的向量O当作知识的额外特性,用对话作为query计算注意力,得到最终的知识选择分布(但是这种方法很难看出对话和O那一部分对知识选择的贡献更大)

- 分离:有两个独立的选择器。上下文选择器用来寻找与上下文具有高度相关性的知识,就是计算上下文和每个知识的相似性;差异选择器主要根据之前选择的知识和差异信息O预测下一个要被选择的知识,用上一轮选择的知识当作query,知识句和差异信息当作KV计算注意力,得到了有差异感知的一个分布。

-
知识选择:两种方法选其一,选注意力得分最高的知识当作结果
-
解码器:GRU
-

【七】《Generating Informative Conversational Response using Recurrent Knowledge-Interaction and Knowledge-Copy》(KIC) 2020ACL 阿里
- 联合模型
- 利用响应解码步骤之间的循环交互来整合知识,在解码过程中动态选择知识,并且将多个知识一致地集成到响应中。引入了copy机制,利用指针网络从外部知识中复制单词,以解决oov问题,保持知识的完整性。
- 模型主要是一个encoder-decoder结构,再加一个指针网络:
- 对话编码器(Ⅰ):单层Bi-LSTM,得到对话的编码,很普通很常规。
- 知识编码器(Ⅱ):2层的transformer的encoder,得到每个知识的编码。
- 循环知识交互解码器(Ⅲ):单层LSTM,生成包含知识表示的对话响应。解码过程中知识注意的动态更新能有效地将多种知识整合到响应中。
- 每一时刻的状态s(t+1)由上一时刻的状态s(t)、当前decoder的输入u(t)和知识编码C(t-k)共同决定;
- 当前decoder的输入则由前一个单词y(t)和对话上下文向量C(t-u)计算得到
- 知识感知指针网络(Ⅳ):使用指针网络,加入了知识的表示,以增强原始指针网络的范围,并且因为加入了知识,再加上输入的对胡,扩展了词汇表。具体的融入比例都是用两个不同的门控机制控制的,最后的比例总额和为1。

未来工作:强化学习分析每个回合,并且避免知识重用以增强多样性。
思考:联合模型在训练过程中,模型能够动态的选择是否融入、融入多少知识,可能比人工设置参数更合理一些。如果用强化学习的方式去做,那reward的设计就很重要,如果是我那我可能还是会把知识选择选择和对话生成分开,然后在知识选择方面,reward我会设计是否与目标主题相关,把知识与目标主题的相关性(模型能否完成主题转换可能就要看这里的设计),以及文章提到的知识重用当作reward。但是在生成方面,如果用一些自动化指标当作reward感觉不合适。
总结
融入知识的对话生成主要有两种解决方法:pipeline方法、端到端方法。各有各的优缺点:
- pipeline:会将任务分解为知识选择和基于所选择知识的对话生成。将任务分解,可解释性更强,并且能够针对某一部分进行优化;可能会有错误传递的问题,且在集成各种知识时,灵活性不强。
- 端到端:不会产生错误传递的问题,但是有可能会因为解码步骤中知识注意力传递导致包含知识越来越少,从而产生不切当的知识搭配。
目前的做法:
- 总的来说,基本都是使用大规模预训练语言模型(BERT为主)去对上下文和知识做一个编码,生成一般是再在后面加一个编码器(大部分都是GRU)。因为预训练模型现在很火热,并且用了海量的数据进行预训练,能够很好的表示语义知识。
- 比较经典的方法就是PostKS,让先验知识去拟合后验知识,用这样的方式做知识选择。后面的很多方法也有借鉴到这个思想,比如SLKS,在设计顺序知识转换器的时候也用到了让先验拟合后验的方法。
- SKT-KG考虑到了知识在对话多轮过程中的流动,设计了顺序知识转换用于知识选择,并且为了让知识更好的融响应,还训练模型以让结构化知识以自然语言句子的方式呈现出来。
- DiffKS更关注知识选择过程中,不同轮次所选知识之间的差异。这样能在一定程度上避免选择重复的知识或者选择不相关的知识(就是既不能相似性太高又不能相似性太低),文章处理的是句子类型的知识,但是我感觉对于结构化的知识也是有一定的效果的(或者可以把结构化的知识变成句子,就像SKT-KS预训练的过程一样)
- KIC是一个端到端的模型,主要解决的问题是相应生成过程中的OOV问题,以及多个知识融合的问题。OOV问题是用pointNet+CopyNet来解决的(要不说经典永不过时呢)。
781

被折叠的 条评论
为什么被折叠?



