专栏名称: 微软亚洲研究院
专注科研18年,盛产黑科技
目录
相关文章推荐
量子位  ·  DeepSeek-R1秘籍轻松迁移,最低只需 ... ·  16 小时前  
逆行的狗  ·  搭建属于你自己的AI知识库 ·  2 天前  
逆行的狗  ·  搭建属于你自己的AI知识库 ·  2 天前  
文商资讯  ·  北京大学AI智能高级研修班4月25-27日开学 ·  2 天前  
文商资讯  ·  北京大学AI智能高级研修班4月25-27日开学 ·  2 天前  
爱可可-爱生活  ·  数据量不是问题,选对数据才是关键 ... ·  3 天前  
51好读  ›  专栏  ›  微软亚洲研究院

干货 | 论文解读:基于动态词表的对话生成研究

微软亚洲研究院  · 公众号  · AI  · 2018-01-09 19:25

正文



编者按: 近年来,聊天机器人在飞速发展,很多人也对机器人的对话系统产生了很大兴趣。近期,北京航空航天大学—微软亚洲研究院联合培养博士生吴俣应邀参加了 PaperWeekly优质论文线上直播分享活动,带大家回顾了近几年来聊天机器人的发展,对比了检索式和生成式聊天机器人的优缺点,并以第一作 者的身份解读了北京航空航天大学和微软亚洲研究院在AAAI 2018上发表的 有关基于动态词表对话生成研究的论文 Neural Response Generation with Dynamic Vocabularies。 一起来看看吧!文章转载自公众号“PaperWeekly”。


分享实录回放


浅析对话系统



对话系统主要分为两类,一类是任务型,另一类是非任务型。任务型对话系统主要应用于企业客服、订票、天气查询等场景,非任务型驱动对话系统则是指以微软小冰为代表的聊天机器人形式。


之所以强调这一点,是因为今年我在ACL发表了一篇论文,有同学发邮件问我为什么参考了论文和源代码,还是无法让聊天机器人帮忙订披萨。我只能说,目前聊天机器人实在种类繁多,有的机器人只负责闲聊,有的机器人可以帮你完成某些特定任务。


本次 Talk 会更侧重于介绍闲聊机器人,也就是非任务驱动型对话系统。首先我想给大家推荐一篇关于聊天机器人的综述文章 — A Survey on Dialogue Systems: Recent Advances and New Frontiers。


这篇文章来自京东数据科学团队,是一篇较为全面的对话系统综述,其中引用了 121 篇相关论文,并对论文进行了归类。不仅非常适合初学者,也能让大家对聊天机器人领域有一个更为全面的认识。


面向任务的对话系统主要分为知识库构造、自然语言理解、状态跟踪和策略选择。针对知识库构造,假设我们的使用场景为酒店预订,那首先我们需要构建一些和酒店相关的知识,比如酒店房型、报价以及酒店位置。


具备了这些基础知识之后,接下来就需要展开对话,通过自然语言理解去分辨问题类型(酒店类型、房间类型等)。确认好相关类型后,我们需要借助 policy 模块,让系统切换到下一个需要向用户确认的信息。更直观地说,我们需要循循善诱引导用户将右表信息填写完整。


聊天机器人类型



普遍来说,聊天机器人主要分为两类,我认为准确来说应该分为三类。


比较早期的研究基本属于第一类: 基于模板的聊天机器人,它会定义一些规则,对你的话语进行分析得到某些实体,然后再将这些实体和已经定义好的规则去进行组合,从而给出回复。 这类回复往往都是基于模板的,比如说填空。


除了聊天机器人,这种基于模板的文本形成方式还可以应用于很多其他领域,比如自动写稿机器人。


目前比较热门的聊天机器人应该是另外两类,一类是检索型,另一类则是生成型。 检索型聊天机器人,主要是指从事先定义好的索引中进行搜索。 这需要我们先从互联网上获取一些对话 pairs,然后基于这些数据构造一个搜索引擎,再根据文本相似度进行查找。


生成型聊天机器人目前是研究界的一个热点。 和检索型聊天机器人不同的是,它可以生成一种全新的回复,因此相对更为灵活。但它也有自身的缺点,就像图中的婴儿那样,它有时候会出现语法错误,或者生成一些没营养的回复。



检索型聊天机器人首先需要构建一些文本和回复的 pairs,然后再训练匹配模型,上线之后先做检索再做匹配。 相似度算法有很多种选择,现在一般都采用深度学习,如果是做系统的话,肯定需要融合很多相似度的特征。



生成模型大多都是基于 Seq2Seq 框架进行修改 ,所谓万变不离其宗,不管大家怎么做,都会是以这个框架为基础。文本生成也是如此,在 RNN 语言模型和 Seq2Seq 出来之后,几乎所有生成模型都是基于这个框架。即使把 RNN 换成 CNN 或 Attention is All You Need,也仍然离不开这个框架。



检索型VS生成型


检索型聊天机器人的最大优点在于它的回复多样且流畅,其次,这个系统对编程者的入门门槛较低。 即使你对深度学习和自然语言处理不甚了解,但只要你善于写代码,并且能从网上抓取一定量的数据,就可以搭建一个检索型聊天机器人。


另外,对于研究人员来说,检索型聊天机器人比较易于评测,借助 MAP、MRR、NDCG 等传统信息检索方法即可完成。


检索型聊天机器人的缺点在于它过于依赖数据质量 。如果你抓取的数据质量欠佳,那就很有可能前功尽弃。


就工业界来说,要评估某个检索型聊天机器人,首先我们会看其背后的排序算法,其次不能忽略的则是数据质量和规模,最后再看其回复数据是否足够有趣,以上几个因素共同决定着检索型聊天机器人的整体质量。


生成模型的最大优势在于有一套通用 code,可以忽略语言直接开跑。 只要在某种语言上跑得较为顺利,就可以将其应用到所有语言上。


很多人认为 safe responses 是生成式聊天机器人的一个缺点,但其实从某种角度上来说,这也是它的一个优点。 相比检索型聊天机器人,它生成的回复质量较为稳定。


生成模型的另一个优点是,它非常容易实现多轮对话,并且能够偏向于某种情感。 假设我希望生成一句高兴的话,那么用生成模型会比检索模型更容易实现。


对于早期的研究者来说, 生成模型的最大缺点在于它的回复较为单一 。其次, 由于缺乏自动评评测手段,研究人员难以对生成式聊天机器人进行评估 。一个模型的好坏,更多需要靠人进行标注。此外,对工业界而言,生成式聊天机器人的门槛会相对较高。



怎样提高生成的多样性


第一种方法是将模型做得更复杂 ,比如上图这篇论文使用了 latent variable 来解决 boring responses 这个问题。

上图中的论文,则是 在生成时将概率 bias 到一些特定的主题词 。假设某个词是主题词,我们就在生成过程中相应提高它被选中的概率。


第二个流派是采用重排序方法 ,目前最简单有效的方法是先用生成模型生成大量回复,再用分类器对回复进行排序,排名越靠前效果越好。只要生成的回复数量够多,该方法就一定可行。

第三种方法是基于增强学习的。 增强学习有两种不同方法,一种基于策略,另一种基于价值。


基于策略的代表作来自李纪为,其基本思路是:假设已有生成模型 G,给定一个 input 并生成 20 个回复,利用排序公式 P(S|T) + λP(T|S) 对回复进行评分作为 reward。Reward 值越大,梯度更新则相应越大。


我们再来看看 GAN 的相关方法。 李纪为对 SeqGAN 的模型加以改进,将其用在了回复生成上。


其基本思路是,每生成一个词的同时,用搜索的方法去搜索其最后生成的完整句子,然后用 discriminator D 对其进行评分,分值越高,意味着词的 reward 也越高。之后的思路则跟 SeqGAN 一模一样。


本文思路



我们做这篇论文的初衷,是为了提出一种不借助繁重工具或算法的回复生成方法。 因为无论是复杂模型、后排序、增强学习还是 GAN,都属于一种用时间换精度的方法。


我们希望在避免产生大量时间开销的同时,还能提高回复生成的质量。 提升效率的关键在于 Seq2Seq 的最后一层 — 投影层 ,这个投影往往会是一个大型矩阵。


我们认为其实没有必要形成这个大型矩阵,因为有用词汇仅有很小一部分,而这一小部分词汇就足够生成一句非常流畅、高度相关的话。比如对“的地得”这类功能词和与 input 相关度较高的词做一个并集,就可以仅用一个小规模字典生成极为流畅的有效回复。


详细来说,我们会给每一个 input 构建一个动态词典。这么做的目的是为了减少在线 decoding 时间,同时对不相关词进行剔除。



本文其实是在 Seq2Seq 的基础上加了一个动态词表,每给一个 input,我们会生成两类词。


第一类词的生成完全基于规则,即静态词典。 静态词典主要包含一些功能词,功能词主要起润滑剂的作用,它们能让一句话的语法变得通畅。静态词典是基于词性构建的,主要包含代词和助词,名词和动词不包含在内。


第二类词是内容词,即动态词典。 动态词典是根据 input 猜测与其相关的词,即我们可以用哪些词对 input 进行回复。这个词典的构建不能再像静态词典那样基于词性,而是要借助分类器或词预测模型,预测哪些词和已给定的 input 相关。


有了这两个词之后,我们就可以给每个 input 构建一个词典。 这个词典的规模会很小,很小的概念是指原来的词典规模是 3 万,现在能缩减到 1000-2000 这个量级。


从矩阵乘法角度来看,如果能把一个矩阵从 N 乘以三万的维度,缩减到 N 乘以一千的维度,就可以大大提升矩阵乘法的运算速度。


词预测模型


接下来我们来看如何做词预测,即如何对内容词(content words)进行预测。内容词的 input vector 是 encoder 生成的 vector。有了 vector 后,我们需要过一个回归模型(MLP),继而预测需要用到哪些词。这个预测的损失就是将最后出现在回复里的词作为正例(标签为 1),再随机采样一些负例作为 0 标签的词,从而进行预测。


如何采样负例非常关键。剔除掉一句话中的功能词,大概会剩下 10-15 个正例的词。我们需要通过频率对负例进行采样,如果一个词经常出现,那么它被采样为负例的几率就会很大。


通过对负例进行采样,我们在进行词预测时,可以更准确地预测出内容词是什么。反之,这个词预测模型会跟 Seq2Seq 生成回复模型出现同样的问题,即总是出现高频词。只有利用频率对负例进行采样,才能让高频词在构建词典时就被剔除。



时间复杂度




在介绍完词预测方法后,我们来看时间复杂度的 计算 ,即以什么样的速度进行 decoding。


首先将 Seq2Seq 和本文的 decoding 方法进行对比,可以发现二者在 GRU 和 Attention 上花费的时间完全一致,但是 本文方法在 Projection 上花的时间会少很多


原因在于 Seq2Seq 的 vocabulary size 通常都很大,比如 3 万这种级别乘出来的数。而本文这个 T 可能只有几千,并且 我们无需为每个词建立一个表,而是为每一句话建立一个表 。因此,我们构建词典的时间开销要远小于从全局字典里进行词预测。


当然,这种情况的前提是回复词数需大于 1 。当回复词数等于 1 时,即逐词预测,本文方法反而会比 Seq2Seq 变得更慢。也就是说,在词的数量越多的时候,词典规模越小,节省的时间也就越多。


经实验证明, 这种方法相比 Seq2Seq 能节省约 40% 的时间


模型训练




如果只对动态词典进行训练,将导致训练和预测的时候出现一些 gap。即使在训练的时候就采用动态词表这种方法,也依然会面临一个问题,就是你不知道选词这个过程会对你做回复造成什么影响。


为了解决这个问题, 我们在训练时选择将动态词典作为一个隐变量来处理 。针对公式的详细推导,大家可以参考论文。


由于是隐变量,假设动态词典 T 是完全变例,即一个词有选或者不选这两种可能。如果有 3 万个词,那么 T 就有 2 的三万次方这么大,因此这种方法是不可行的。那我们应该怎么做呢?


我们可以通过蒙特卡洛采样的方法,来估计词典会对回复产生什么影响。我把 变成了真正采样,相当于采样 S 次,且对每次所出结果都进行一次计算,然后对结果进行平均。


这样一来,我们就可以把词典构建和回复生成这两个损失串在一起,相当于放入一同一个公式里表示,而不是将词典和生成分开单独训练。利用逐次采样得出的结果,来评估动态词典在不同情况下,其相对应的回复生成的损失是什么。







请到「今天看啥」查看全文