写在前面
hello大家好,我是fantasy,今天起打算在这里分享自己在NLP上的所学所得,第一篇博客相当于对整篇论文的翻译,并不能算严格意义上的论文“笔记”,希望之后可以越写越好,加上更多的个人理解吧。
Abstract
现有的对话系统大多是依靠数据驱动来学习,并不能够去对额外的专家知识图谱进行编码。这篇文章提出了一个端到端的知识路由关系对话系统,该系统将丰富的医学知识图谱无缝的融入到对话管理中的主题切换,并且使其与NLU和NLG相协作。这里使用了一种新奇的知识路由DQN(DQN是RL中的一种算法)来管理主题切换,它集成了一个关系细化分支来编码不同症状和症状疾病对之间的关系,以及一个知识路由图谱分支,用于主题决策。大量的实验研究表明这里提出的KR-DS(Knowledge-routed Relational Dialogue System)打败了主流的方法(以8%的优势)。
Introduction
之前提出的DQN仅仅是用DM来进行对话状态追踪(dialogue state tracking)和策略学习(policy learning),再利用额外的基于模板的模型来进行自然语言处理,这往往不能很好的匹配真实世界中的自动对话场景。
为了解决这个问题,文章提出了KR-DS,可以无缝地将丰富的医学知识图谱融入到DM中的主题切换,并且使其与NLU和NLG相协作。实际中医生给出诊断是基于其掌握的医学知识和诊断经验,受此启发文章提出了 KR-DQN,充分发挥了医学知识和历史诊断示例的优势,将 知识路由图谱分支(knowledge-routed graph branch)和关系细化分支(relational refinement branch) 结合到一块。relational refinement branch是用来细化DQN产生的粗略结果,而knowledge-routed graph branch则是用来决策。
此外文章创建了 新的数据集(保留了患者原始的self-reports以及患者和医生的交谈内容)来构建系统。
Proposed Method
文章提出的端到端的知识路由关系对话系统(KR-DS)是一个任务型对话系统,依然包括老三样:NLU, DM和NLG。其中:
- NLU是用来从对话中辨别用户的意图和槽位值(slot指槽位,及约束条件) 。
- DM则是根据当前的对话状态(current dialogue state)进行主题切换,DM中的代理(agent)会学着去向用户询问症状瞅瞅究竟是何种疾病,从而执行诊断任务。
- 基于以上,NLG部分使用一些基于模板的模型生成语句。
此外通过强化学习 以端到端的方式来训练整个系统,还要添加一个用户模拟器(user simulator)执行以生成用户目标(user goal)为条件的对话交换。
Natural Language Understanding
因为数据集是从中文网站收集的,所以NLU的主要任务是对用户意图进行分类以及填补汉语槽位。这里提到了4种用户行为(user action),包括:request+disease, confirm+symptom, deny+symptom 和 not-sure+symptom.
因为这里的数据集中症状和意图已经被打过label,所以可以使用监督学习去训练 双向LSTM模型。此外,在预训练之后,也可以通过强化学习将NLU同KR-DS中的其余部分一起训练。
Policy Learning with KR-DQN
文章中使用了强化学习(RL)框架来设计DM模块,实际上这里的DM就是一个通过对话策略(dialogue policy)与环境(用户模拟器)进行交互的代理(agent),最优对话策略是选择一个能使future reward最大化的action,假设有M种疾病和N种症状,那么agent action space size D可以表示为:
D=num_greeting+M+ND=num\_greeting+M+N D=num_greeting+M+N
注:num_greeting应该是代表你好谢谢之类的行为(num_greeting = 2)。
这里提到了4种代理行为(agent action),包括:inform+disease, request+symptom, thanks 和 closing. 还有4种症状状态(symptom state):positive, negative, not-sure 和 not mentioned 在症状向量中分别以1,-1,-2,0来表示。
奖励机制在策略学习中也非常的重要,很简单的道理:当agent给出正确的诊断便给予奖励,反之则给予处罚。此外还鼓励精简对话以及询问更精确的症状。文章中给出了如下的 奖励机制 :
成功的诊断+44,错误的诊断-22,以及在每一轮对话中若未达到现有症状要求的(existed symptom request)也会给予-1的惩罚。
DQN是一个许多问题中常用的策略网络(policy network),文章是在DQN(使用简单MLP(多层感知机))的基础上,提出了一种新颖的DQN:KR-DQN(Knowledge-routed Relational DQN),会考虑先验医疗知识和行为间的建模关系,从而产生更为合理的行为。
Basic DQN Branch
首先用basic DQN branch产生一个粗略的行为结果atra_t^ratr?(rough action result),这里MLP(只有一个隐层)用状态sts_tst?作为输入,采用的激活函数是ReLU:
atr=MLP(st)(1)a_t^r=MLP(s_t)\tag{1} atr?=MLP(st?)(1)
Relational Refinement Branch
一个关系模块可以通过聚合一系列其他元素(e.g.other symptom and diseases)的信息来影响一个独立元素(e.g.a symptom or a disease),所以这里建立了一个关系矩阵R∈RD×DR\in R^{D\times D}R∈RD×D来表示所有行为之间的依赖关系,之后再用之前得到的粗略行为结果atra_t^ratr?乘上关系矩阵RRR得到一个细化的行为结果atfa_t^fatf?(refined action result):
atf=atr?R(2)a_t^f=a_t^r\cdot R\tag{2} atf?=atr??R(2)
这样atfa_t^fatf?向量的每个元素恰是atra_t^ratr?元素的加权和。
关于关系矩阵的初始化问题:从数据集的统计信息得到的条件概率初始化关系矩阵,矩阵的每一项RijR_{ij}Rij?表示xjx_jxj?在xix_ixi?条件下的概率,其通过反向传播算法来获得行为之间的依赖关系。(实验显示了这种初始化方法比随机初始化的效果要好,凸显了先验知识的作用)
注:如果不能理解所谓的action是什么的话,可以这么理解:这里RRR中初始的每个元素笼统的来说就是每个symptoms和每个diseases之间的条件概率。
Knowledge-routed Graph Branch
这个部分是受到医生看病的启发,即医生在拿到病人报告时会在心里列出几种可能的病情,再通过询问与这这些病情相关的症状去做排除法,直到作出诊断。
这里首先计算疾病和症状之间的条件概率来作为定向的医学知识路由图谱的权重,其中有病症和症状两种节点,节点之间则是由两种条件概率相联系:P(dis∣sym)∈RM×NP(dis|sym)\in R^{M\times N}P(dis∣sym)∈RM×N和P(sym∣dis)∈RN×MP(sym|dis)\in R^{N\times M}P(sym∣dis)∈RN×M
这里给出了P(dis)∈RMP(dis)\in R^MP(dis)∈RM和P(sym)∈RNP(sym)\in R^NP(sym)∈RN的计算方法:
P(dis)=P(dis∣sym)?Pprior(sym)(3)P(dis) = P(dis|sym)\cdot P_{prior}(sym)\tag{3} P(dis)=P(dis∣sym)?Pprior?(sym)(3)
其中Pprior(sym)P_{prior}(sym)Pprior?(sym)基于如下规则计算得来:
positive symptom设为1,negative symptom设为-1,其余的symptom(不确定或者未提及的)则根据数据集求得其先验概率。于是可计算P(sym)P(sym)P(sym):
P(sym)=P(sym∣dis)?P(dis)(4)P(sym) = P(sym|dis)\cdot P(dis)\tag{4} P(sym)=P(sym∣dis)?P(dis)(4)
将P(dis)P(dis)P(dis)和P(sym)P(sym)P(sym)填零(因为还有greeting action)拼接到一块,得到 知识路由行为概率atk∈Da_t^k\in Datk?∈D
最后,将三者放到一块计算得到 预测行为分布ata_tat?:
at=sigmond(atr)+sigmond(atf)+atk(5)a_t = sigmond(a_t^r) + sigmond(a_t^f) + a_t^k\tag{5} at?=sigmond(atr?)+sigmond(atf?)+atk?(5)
User Simulator
为了训练对话系统需要一个用户模拟器。
如上图所示,这里的用户模拟器维持着一个用户目标(user goal),其一般由四个部分组成:disease_tag, self-report, implicit_symptoms, request_slots.
End-to-End Training With Deep Q-Learning
这里使用了Deep Q-Learning(DQN)去训练DM,NLU和NLG。
用Q(st,at∣θ)Q(s_t,a_t|\theta)Q(st?,at?∣θ)表示在基于状态sts_tst?采取行为ata_tat?后,期待的衰减奖励和,通过贝尔曼方程得到Q值:
Q(st,at∣θ)=rt+γmaxat+1Q?(st+1,at+1∣θ′)(6)Q(s_t,a_t|\theta) = r_t + \gamma max_{a_{t+1}}Q^*(s_{t+1},a_{t+1}|\theta^{'})\tag{6} Q(st?,at?∣θ)=rt?+γmaxat+1??Q?(st+1?,at+1?∣θ′)(6)
其中θ′\theta^{'}θ′是旧参数,γ\gammaγ是衰减率。
Experiments
实验中用到了这里建立的新的数据集(from丁香园),起了个名字叫DX dataset,处理后得到覆盖5种疾病(1.过敏性鼻炎 2.上呼吸道感染 3.肺炎 4.小儿手足口病 5.小儿腹泻)和41种症状,一共有527组对话,选择了423个作为训练集,104个作为测试集。另外又用到了另一篇文章1提出的MZ dataset(from 拇指医生),其中包含710个user goals覆盖了4种疾病和66种症状。
Experimental Results
相对于basic DQN,KR-DS的优势在于:DQN通常会猜测正确的疾病,但由于没有症状和疾病关系的限制,会在对话过程中询问一些不合理和重复的症状。
一些实验结果如下:
其中,Table 5中:
rewards | value |
---|---|
R1R1R1 | +22, -11, -1 |
R2R2R2 | +11, -6, -1 |
R1?R1^*R1? | +22, -11, -0.5 |
R2?R2^*R2? | +11, -6, -0.25 |
DX dataset的两个user goal results的可视化示例:
conclusion
这篇文章提出的KR-DS很有借鉴意义,这个任务型问答系统也仍然有改进的空间,医疗问答系统的研究与完善依然还有很长的路要走。
文章链接:
[1]End-to-End Knowledge-Routed Relational Dialogue System for Automatic Diagnosis
[2]Task-oriented Dialogue System for Automatic Diagnosis
注:该篇文章在DX dataset上的复现可见github主页:
https://github.com/fantasySE
Task-oriented Dialogue System for Automatic Diagnosis ??