Knowledge Diffusion for Neural Dialogue Generation
论文:Shuman Liu, Hongshen Chen, Zhaochun Ren, Yang Feng, Qun Liu, Dawei Yin:Knowledge Diffusion for Neural Dialogue Generation. ACL (1) 2018: 1489-1498
论文链接:http://www.nlp.org.cn/2017/Admin/kindeditor/attached/file/20190116/20190116234946_85260.pdf
1 Abstract
没有利用知识来引导的对话系统,往往会产生简短、笼统、没有意义的回复,这篇文章提出了一个NKD模型将知识融入到对话系统中,模型不仅能匹配出用户输入中的事实还能发散到其他的实体中。利用事实匹配和实体发散,保证整个对话系统生成的对话能在知识库中发散并收敛。
2 Introduction
Although answering enquirers is essential for dialogue systems, especially for task-oriented dialogue systems (Eric et al., 2017), it is still far behind a natural knowledge grounded dialogue system, which should be able to understand the facts involved in current dialogue session (so-called facts matching), as well as diffuse them to other similar entities for knowledge-based chitchats (i.e. entity diffusion):
虽然对话系统中问答是至关重要的,特别是对于面向任务的对话系统(Eric et al ., 2017),但它还远达不到一个由自然知识建立的对话系统,该对话系统应该能够理解事实参与对话会议(所谓事实匹配),以及扩散给其他类似的实体知识型闲聊(即实体扩散):
- Facts matching:在对话系统中,将话语与确切的事实相匹配要比明确的事实询问回答困难得多。有些话语是与事实相关的查询,它们的主语和关系很容易被识别,而有些话语的主语和关系比较模糊,这就导致了准确的事实匹配困难。表1给出了一个例子:第1项和第2项谈论的是电影《泰坦尼克号》,而第1项是典型的问答对话,2是一种与知识相关的闲聊,没有任何明确的关系,很难为第2项定义准确的事实匹配。
- Entity diffusion:对话通常从一个实体转移到另一个实体。在表1中,第3项和第4项的话语是关于实体《泰坦尼克号》的,但是系统回复的实体是其他类似的电影,往往这种实体扩散关系很少被当前的知识三元组所捕获。第3项的回复表明,这两个实体为《泰坦尼克号》和《魂断蓝桥》与爱情故事有关联。第4项暗示了另一部类似的《泰坦尼克号》沉船电影。
针对上述挑战,本文提出了一种神经知识扩散(NKD)对话系统,使对话生成在知识库上具有收敛性和发散性思维的能力,同时处理基于事实的问答和基于知识的闲聊。NKD学会将话语与相关事实相匹配;匹配的事实然后扩散到相似的实体;最后,模型生成关于所有检索到的知识项的回复。
3 Model
模型主要由4部分组成:
3.1 Encoder
为了从不同的角度捕捉信息,我们学习了两个独立的RNNs的话语表征,结果是两个最后的隐藏状态 h N X C h^C_{N_X} hNXC 和 h N X K h^K_{N_X} hNXK 。隐藏状态 h N X C h^C_{N_X} hNXC 作为上下文的输入,利用RNN跟踪对话状态。 h N X K h^K_{N_X} hNXK 用于知识检索,用于对输入话语中的知识实体和关系进行编码。
3.2 Knowledge Retriever
知识检索器从知识库中提取一定数量的事实,并指定它们的重要性。通过事实匹配和实体扩散,使基于知识的神经对话系统具有收敛和发散的思维能力。对话系统中的知识由三元组组成:subject - relation - object,其中 subject 和 object 都是实体
3.2.1 Facts Matching
- 给定输入话语 X X X 和 h N X K h^K_{N_X} hNXK,从知识库和对话历史中提取相关事实。通过字符串匹配、实体链接或命名实体识别获得语句中的实体 F = { f 1 , f 2 , . . , f N f } F=\{f_1,f_2,..,f_{N_f}\} F={f1,f2,..,fNf},通过平均实体向量和关系向量,这些实体和知识三元组被转换成向量表示 h f = { h f 1 , h f 2 , . . , h f N f } h_f=\{h_{f_1},h_{f_2},..,h_{f_{N_f}}\} hf={hf1,hf2,..,hfNf}。
- 利用非线性函数或子神经网络计算事实与输入话语之间的相关系数 r f r_f rf,其取值范围为0 ~ 1。这里,我们应用一个多层感知器(MLP): r k f = M L P ( [ h N X K , h f k ] ) r_k^f=MLP([h^K_{N_X},h_{f_k}]) rkf=MLP([hNXK,hfk])
- 对于多轮对话,前面语句中的实体也被继承和保留,如图2中的虚线所示。例如,在图2(右)的第二句话中,没有从输入语句中提取新的事实。因此,有必要对历史实体进行记录和保留,通过事实表示的加权平均将事实总结为相关的事实表示 C f C^f Cf : C f = ∑ k = 1 N f r k f h f k ∑ k = 1 N f r k f C^f=\frac{\sum_{k=1}^{N_f}r_k^fh_{f_k}}{\sum_{k=1}^{N_f}r_k^f} Cf=∑k=1Nfrkf∑k=1Nfrkfhfk
3.2.2 Entity Diffusion
- 为了检索对话话语中通常没有提及的其他相关实体,我们扩散匹配的事实。我们通过一个多层感知器计算知识库中的实体(除了之前话语中出现的实体)与相关事实表示之间的相似性,得到相似性系数re,范围从0到
1: r k e = M L P ( [ h N X K , h f k , e k ] ) r_k^e=MLP([h^K_{N_X},h_{f_k},e_k]) rke=MLP([hNXK,hfk,ek]) e k e_k ek 是实体的词向量 - 选择相似度最高的
n
n
n 个实体
E
=
{
e
1
,
e
2
,
.
.
,
e
N
e
}
E=\{e_1,e_2,..,e_{N_e}\}
E={e1,e2,..,eNe},计算相似的实体表示
C
s
C^s
Cs 形式化为:
C
s
=
∑
k
=
1
N
e
r
k
e
e
k
∑
k
=
1
N
e
r
k
e
C^s=\frac{\sum_{k=1}^{N_e}r_k^ee_k}{\sum_{k=1}^{N_e}r_k^e}
Cs=∑k=1Nerke∑k=1Nerkeek
在图2中的示例中,第一轮对话时,输入话语中直接在事实匹配中具有较高的关联系数。当一个事实被匹配时,直觉上它不需要实体扩散。在这种情况下,从图2中可以看出,“实体扩散”中的实体相似性较低。在第二轮中,没有与话语匹配的三元组,而实体“泰坦尼克”的相关度要高得多,接着实体发散到相似实体:《魂断蓝桥》,并且相似权值比第一轮相对较高。
3.3 Context RNN
上下文RNN记录话语层次的对话状态。它包括话语表征和知识表征。上下文RNN的隐藏状态更新为: h t T = R N N ( h t C , [ C f , C s ] , h t − 1 T ) h_t^T=RNN(h_t^C,[C^f,C^s],h^T_{t-1}) htT=RNN(htC,[Cf,Cs],ht−1T)
3.4 Decoder
解码器通过以
h
t
T
,
C
f
,
C
s
h^T_t , C^f,C^s
htT,Cf,Cs 为条件顺序生成回复。设
C
C
C 为
h
t
T
,
C
f
,
C
s
h^T_t , C^f,C^s
htT,Cf,Cs 的级联。知识项系数
R
R
R 是关联系数
r
f
r^f
rf 和相似系数
r
e
r^e
re 的级联。文章中介绍了单词生成器的两种变体:
Vanilla decoder:其中
y
t
y_t
yt 为检索到的知识项的词汇表或对象实体的嵌入,
s
t
s_t
st 为解码器RNN的隐藏状态
Probabilistic gated decoder : 使用门控变量来指示单词是由词汇表生成的还是由知识实体生成的。
在响应生成期间,如果一个实体被过度使用,回复多样性将会降低。因此,当一个知识项在回复中出现时,当一个知识项出现多次时,相应的系数应该减小。为了跟踪知识项的覆盖率,我们在每一步更新了知识项系数
R
R
R。还探索了两种覆盖跟踪机制:
- Mask coefficient tracker:直接将所选知识项的系数降为0,以保证再也不会被选为回复的字。
- Coefficient attenuation tracker:基于 s t , R 0 , R t − 1 , y t − 1 s_t, R_0,R_{t-1}, y_{t-1} st,R0,Rt−1,yt−1计算一个衰减得分, i t i_t it 从0到1并逐渐减小,并更新系数: i t = D N N ( s t , R 0 , R t − 1 , y t − 1 ) i_t=DNN(s_t, R_0,R_{t-1}, y_{t-1}) it=DNN(st,R0,Rt−1,yt−1) R t = i t ∗ R t − 1 R_t=i_t *R_{t-1} Rt=it∗Rt−1