《文本上的算法》学习笔记
个人认为NLP领域最难的方向可以说是阅读理解与文本生成/摘要,而对话系统,尤其是闲聊常常基于这两个方向。对话作为一个既学术前沿又与工程紧密连接的方向,复杂而迷人。
之后的博客也会介绍一下闲聊方向比较好的微软小冰和任务型对话比较成功的阿里小蜜。
从完成的任务来说,对话系统主要有这 3 个方面 : 问答型、任务型和闲聊型。
1、问答型
问答型主要有问答系统,可以视为单轮的对话系统。 问答系统研究有很长时间了(该有的“坑”还是“坑”,因为语言的理解和表示有待突破),它解决的更多的是知识型的问题。目前研究最多的是答案是一个实体的客观性知识的任务(这 算是一 种定义),比如“中国的首都是哪儿?一一“北京”,对于答案是一句话或者一段话,或者是主观性的,甚至是个性化的问题,那就更是困难了。 所以问答系统比较困难也比较复杂,涉及的技术点也很多,因此,要 想做一个还可用的问答系统,就要针对某个具体场景去解决相应的问答需求,要做通用的自动问答系统,还是很困难的。问答系统的另一个应用就是客服系统,即使用机器来辅助人回答高频经常被问到的问题,提高客服人员的效率。问答系统目前主要有如下几类方法 。
1.1、基于语义分析的方法
该方法的思路就是来一个 Query 之后首先语义分析出逻辑表达式,然后根据 这个逻辑表达式去知识库中推理查询出答案。既使用知识图谱解决。这个方法的重点就在于语义分析。
1.2、基于信息抽取的方法
这种方法的思想就是来一个问题之后,首先是问题的各种分析,包括抽取关键词、关系词、焦点词以及问题的各种分类信息,然后从海量文档中检索出可能包含答案的文档段落,再在证据库中找到相关的证据支撑, 最后根据许多模型对结果排序找到最终的答案。
1.3、端对端的方法
这种方法是基于深度学习的模型,它首先将问题表征成一个向量(这个过程缺省略了问题分析步骤),然后将答案也表征成向量,最后计算这 两个向量的关联度,值越高那么就越可能是答案 。 它的核心就是在表征答案的时候如何把候选知识(无结构化段落或者结构化子图〉表征进来。
然而一个真正的问答系统一般都是根据要解决的问题融合多种方法来处理。
2、任务型
任务型对话系统更多的是完成一些任务,比如订机票、订餐等等。这类任务有个较明显的特点,就是需要用户提供 一 些明显的信息( slot, 槽位), 如订机票就需要和用户交互得到出发地、目的地和出发时间等槽位, 然后有 可能还要和用户确认等等,最后帮用户完成一件事情。
系统会根据当前状态 Cstate)和相应的动作( action)来决定下一步的状态和反馈,即求状态转移概率P(r,s’|s,a),这其实就是马尔科夫决策 过程 的思想 CMDP)。 首先是 得到用户的 Query。 然后是自然语言理解模块(NaturalLanguageUnderstanding),主要是槽位识别和意图识别,而且这时候识别的意图有可能是有多个的,对应的槽位也会不 同,都会有个置信度 。 然后就是对话管理模块,它包括 Dialog State Tracking (DST) 和 Dialog Policy。 DST 就是根据之前的 信息得到它的 state, state 其实就是 slot 的信息 :得到了多少 slot,还差什么 slot,以及它 们的得分等等。 Dialog Policy 就是根据 state 做出 一个决策,叫 action,如 还需要什么 slot,是否要确认等等。最后就是自然语言生成模块(Natural Language Generation),把相应的 action 生成一句话回复给用户。 Dialog Policy就是根据 state做一个决策,只要有了 state,就比较容易了,所以 DST 就比较关键。目前 DST 主要有这么几种方法 。
2.1、生成式模型( Generative Model )
生成式模型把对话状态抽象成有关系统 action 和用户 SLU 结果的贝叶 斯网络,所以它的求解可以使用贝叶斯推理
其中, b’(s’)就是要求解的新的对话状态概率,是 SLU 的结果,这个是可观察到的,s是上一轮对话状态,是个不可观察变量, u 是上一轮用户的真实 action,也是个不可观察变量,α 是系统 action,是可观察到的 。 加一撇的都是本轮的表示, P(u’|的是给定用户真实action下SLU结果的 概率, P(u’|s’,α)是给定系统 action 和本轮对话状态下用户选择 action 为u’ 的概率, P(s’|s,α)是给定上一轮对话状态和系统 action下对话状态转变成 b(s)是之前的对话状态概率
2.2、判别式模型( Discrimitive Model )
判别式模型是把问题抽象成一个分类问题,根据之前对话的一些特征来预测新的 state的概率
其中,f’是从 SLU 结果和历史对话信息中抽取出来的特征。
这其实就是个分类问题,当然也可以把 slot打分看成序列标注问题, 这也就可以使用CRF等序列标注模型来处理了。只要是分类模型或者序列标注问题,那么也就可以使用深度学习了。
而且只要是有明确action的地方,也就可以融入强化学习的激励惩罚机制。
2.3、规则系统
规则系统其实很好理解了,也是一种很可控的方法。对话管理主要有两个关键因素: state和 action。我们知道 NLU模块会分析出句子意图和相关 slot,意图和 slot都是有置信度的,那么 state 其实就是意图和 slot, action就是根据 state 的一些回复。 对于某一个具体任务来说,需要询问的slot其实是可以预先知道的,那么缺哪些 slot 就询问哪些 slot就可以了,不确定的slot和意图就和用户进行确认。对置信度低的不确定的进行确认并影响到之后相似的情况其实就是强化学习的思想了 。 当然还有一些细节需要考虑到系统里面,如对 slot 的范围限定、 slot和slot之间的冲突 ,以及用户有意捣乱的情况等等。举个例子,对于订机票任务, 用户回复出发时间的时候,这个时间不能是当前时间之前的时间,否则就要和用户进一步确认:出发地点和到达地点也不能是同一个地点,否则也要确认。
所以规则系统就是有一个配置文件,写一些规则,然后线上把意图和 slot 的相关宇段传过来进行解析处理就可以了 。
针对任务型对话系统的这 3 类方法各有特点,基于模型的方法需要 有标注 的训练数据,而在数据缺失的情况下,规则系统会比较有效。规则系统突出了NLU的重要性,因为它用到了NLU的1-best 结果,而不是 N-best 结果。
3、闲聊型
闲聊型的对话系统更多地是人和机器没有明确限定的聊天,如果前两个类型是打机器的“智商”牌的话,那么这个类型就是打机器的“情商” 牌,让人感觉机器更加亲切,而不是冷冰冰的完成任务(如果回复语句自然且有意思的话,其实也不那么冷冰冰)。
闲聊型对话系统主要有 3 种方法:规则方法、生成模型和检索方法。
3.1、规则方法
规则系统关键是如何写一堆规则和线上的快速匹配。目前没有哪个系统是纯规则的了,规则方法顶多只是在 一些其他方法处理不好的情况下的一个补充 。
3.2、生成模型
生成模型是随着深度学习的热潮而提出的比较火热的方向。举例:可以首先使用一个RNN模型把输入句子“ ABC”表示成一个向量 ,然后把这个向量作为另一个RNN模型的输入,最后使用语言模型生成目标句子“ WXYZ”。 这种方法的优点是省去了中间的模块,缺点是生成的大多是泛泛的无意义的回复、前后回复不一致 ,或者有句子不通顺的问题( 一句话不通顺其实都很难解决) 。好多人也在融合上下文、 Topic、互信息等来解决多样性问题,但遗憾的是,只使用这种方法效果并不尽人意( 而且非常依赖于大量高质量的训练语料),它可以结合其他模型和策略来处理。
3.3、检索方法
检索方法的思想是,如果机器要给人回复一句话 ,假设这句话或相似的话之前有人说过,只需要把它找出来就可以了。这种方法就需要事先挖掘很多的语料。它最基本的流程就是首先进行 NLU, 然后从语料库中召回一些可能的回复,最后使用更精细和丰富的模型(语义相似度、上下文模型等 )找出最合适的回复给用户,期间一定要注意处理“答非所问”的现象。 语义相似度的技术前面也介绍过了。对话还少不了这几个核心技术 :意图识别、上下文模型、个性化模型和自学习。意图识别其实是语言量化的问题,目前是通过分类、聚类、语义相似度和模板等多个技术来解 决。上下文模型就需要省略补全,把缺失的信息补全了,那其实就是单轮对话了 ,否则就要结合上下文的 Topic 和 Keyword 来处理,主要的宗旨就 是不能语义跑偏了。个性化模型不光要考虑用户画像,还要考虑场景(时间、 地点等) 。 个性化我觉得重点在机器能否记住用户的状态并给出相应 的回复 ,就像朋友之间一样,假如你感冒了,然后又想去打球;那么朋友 就会 问:“你感冒了还去打球啊”?是不是感觉很亲切,这就需要进行话题识别 ,自然就会引出话题的关系识别,如话题冲突、话题连贯等等。自学习需要结合用户聊天过程中的反馈(情感分析)来对当前的对话进行评估是否可再利用 。