报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

阿里云小蜜对话机器人背后的核心算法

  • 2019-09-27
  • 本文字数:4981 字

    阅读完需:约 16 分钟

阿里云小蜜对话机器人背后的核心算法

0. 对话系统简介

对话系统的一般架构如图:



图 1:对话系统一般架构


这是我们所熟知的对话系统框架,这里面主要有:NLU 自然语言理解,DM 对话管理,NLG 自然语言生成 3 个主要模块,DM 里面有 dialog state tracking 用于对话状态追踪,policy 用于对话策略管理。


当我们在执行一个对话任务时,例如“开发票”,系统不仅要识别用户的需求,还需要与外部系统对接,进行订单号的合法性校验,调用开发票接口等,这时候 DM 不仅要完成与用户的交互、管理槽位信息,还需要访问外部接口,管理调用的结果。



图 2:完整的对话系统架构


当构建好一个机器人后,还需要进行对话的诊断,效果评测,才能发布上线,如果这些工作全都让人来完成,整个过程会非常费力,于是我们引入了用户模拟器来提高整体交付效率。



图 3:用户模拟器应用到对话系统


云小蜜对话机器人核心算法主要包括三部分:1. 自然语言理解;2. 对话管理;3. 用户模拟器。

1. 自然语言理解

由于云小蜜对话机器人需要满足各行各业各种场景下的对话服务需求,所以我们的自然语言理解是平台视角下的自然语言理解。根据训练样本的多少,我们把它分为 3 种不同的情况:无样本、小样本、多样本。在没有样本的情况下,我们提供了一套简单易懂的规则表示语法,帮助用户实现快速冷启动。以查天气为例,用户只需写 1 条规则,就能表示 100 多个句子。



图 4:无样本自然语言处理解决方案


在小样本的情况下,比如共 10 个类别的意图,每个意图下有十多个样本,这种情况下还不足以训练一个有监督模型,但我们可以借助平台数据积累的优势,当只有少量样本的情况下,也可以做出比较好的结果。


实现思路:我们先整理出一个大数量级的数据(十万级别),每一个类目几十条数据,为它建立 meta-learning 任务。对于一个具体任务来说:构建支撑集和预测集,通过 few-shot learning 的方法训练出 model,同时与预测集的 query 进行比较,计算 loss 并更新参数,然后不断迭代让其收敛。这只是一个 meta-learning 任务,我们可以反复抽样获得一系列这样的任务,不断优化同一个模型。在线预测阶段,用户标注的少量样本就是支撑集,将 query 输入模型获得分类结果。实验表明,few-shot learning 的效果优于无监督相似度匹配的方法。



图 5:小样本自然语言处理方案


具体是怎么实现的呢?我们借鉴了图像领域的工作,图像领域大多数工作都只考虑了样本的信息,但是在 NLP 领域样本的信息可能会存在噪声或冗余,比如说“开发票”场景,用户在表述开发票这个事情,除了常见的“我要开发票“、”帮忙开一张发票“以外,他还可能会说:“你好,我前两天在你们店里买了一条裙子,请问现在能帮我开下发票吗?”而这样的句子是普遍存在的,我们需要对这些句子进行归纳,得到类别的信息,然后再与要预测的 query 比较语义相似度。它的神经网络结构分为 3 部分,首先是 Encoder 将句子变成句子向量,然后再通过 Induction Network 变成类向量,最后通过 Relation Network 计算向量距离,输出最终的结果。



图 6:小样本训练算法


Memory-based Induction Network 是我们在 Induction Network 的基础上引入了 memory 机制,目的是模仿人类的记忆和类比能力,在效果上又有进一步提升。


Induction Network 很关键的一部分就是怎么把样本向量抽象到类向量,我们采用的是 matrix transformation 的方法,下图显示的是 1 个 5-way 10-shot 的数据,转换前,几个类很难区分,类中心不够内聚,转换后,类边界更清晰,更利于下游 relation 的计算。



图 7:样本空间转换


当业务方有一定标注数据的情况下,我们就考虑上监督模型了。在云小蜜实际业务场景中,企业相关的标注数据的获取成本是比较高的,因此有监督模型的目标是希望让业务方能够在标注数据量不是很大的情况下达到很好的效果,因此我们构建了一个三层的模型,最底层是具有较强迁移能力的通用模型 BERT,在此基础上构建不同行业的模型,最后用相对较少的企业数据来训练模型。这样构建出来的企业的 NLU 分类模型,F1 基本都在 90%+。


这种模型也有缺点,就是它的结构比较复杂,在线预测的时候延时会比较长,在真实生成环境中应用落地有困难,所以我们通过知识蒸馏的方法来进行模型压缩,在效果相当的同时预测效率更快了。


在实际业务场景的多数情况下,任务型对话和 FAQ 型问答一般都是同时存在的,我们也引入了多任务学习(multi-task learning),能让任务共享底层的信息并互相增强,使得模型具有更强的泛化能力。在政务场景里,我们通过多任务学习, acc 提升两个点以上。



图 8:大规模标注集上的多任务学习


简单小结一下,这是 NLU 的整体能力输出的能力版图:



图 9:NLU 的整体能力输出。

2. 平台视角下的对话管理

对话管理成功的三要素


  1. 业务建模:能够对不同行业不同场景的业务进行抽象,能够用一套统一的表示体系建模,保证业务逻辑的正常运行;

  2. 具备鲁棒性:能够很好的处理业务未定义的通用对话需求和各种异常情况;

  3. 持续学习的能力:能够在与用户交互的过程中,不断的学习,不断适应新场景,根据用户的反馈调整系统的对话策略。



图 10:平台级对话管理的应用需求

2.1 基于 TaskFlow 的业务建模

我们以“火车票”场景为例,一个有经验的卖火车票的售票员在指导一个新售票员的时候,他会把常见的对话样例描述出来,让新售票员知道用户怎么问,我该怎么答,同时他还会告诉新售票员需要查询哪些系统才能获得票务信息,以及有票和无票的情况下分别怎么回复用户。


基于对上述真实场景的观察,我们对整个交互过程进行抽象,我们认为对话的基本单元是一个 turn ( 一轮 ),它可以拆解为 3 部分:用户说、机器人思考和机器人回复,分别对应三个基础节点:触发节点、函数节点和回复节点。上面说的是单轮的情形,如果把所有的后一轮的触发节点接到前一轮的回复节点后面,就构成了一个多轮交互 ( multi-turn ) 的对话。



图 11:基于 TaskFlow 的建模框架


为了让 TaskFlow 在平台上执行,我们设计了一种双层状态机的方案,上层是对话逻辑,底层是一套通用的对话引擎,通过这种解耦的设计,不论上层的业务逻辑如何变化,下层都用一套统一的引擎在支撑,如果想赋能上层业务,只需要不断升级底层的能力,上层的所有业务都会受益。



图 12:基于双层状态机的方案

2.2 具备鲁棒性

如果对话管理只能保证用户已定义的业务逻辑正确运行,它的鲁棒性还不够,还需要考虑更多情形,包括:通用对话能力和异常处理能力,如图:



图 13:对话系统的鲁棒性


总体的实现思路是,通过系统内置 TaskFlow 实现对话鲁棒性。以“流量包业务”的对话中模糊澄清为例,我们采用插件化的方式实现,在用户定义的 TaskFlow 基础上,增加澄清 TaskFlow,它的功能包括:


  1. 判定是否需要触发澄清;

  2. 选择澄清的策略:是隐式澄清还是显示澄清,是单意图澄清还是多意图澄清;

  3. 澄清话术的生成。


在上线之前,系统会把这两部分的 Taskflow 进行编译和链接,变成一个可执行的 Taskflow,然后放进执行引擎提供在线服务。其他的功能,比如重听,个性化拒识等都是采用同样的方法实现。



图 14:通过系统内置 TaskFlow 引擎增强系统鲁棒性

2.3 可持续学习

以上的两部分能力都是解决对话中高频、确定的部分问题。如果希望用户在实际对话中越聊越好,仅有以上部分是不够的,需要利用好对话数据,建立对话模型,去 cover 中长尾对话行为,并且基于反馈快速调整对话策略,从而获得更好高价值的智能。



图 15:可持续学习的对话系统


持续学习



图 16:对话系统增强学习技术架构


总体分为 3 步:


  1. 构建 DM 模型,保证它是可学习的;

  2. 让模型可交互学习;

  3. 支持在线学习。


训练模型得先有数据,我们构建了一个用户模拟器,让它与机器人对话,从而获得大量的带标注的数据,然后分别训练 DST 模型和 Policy 模型,这一步完成了机器人知识的蒸馏,可以获得一个与规则系统效果上等价的 DM 模型。接下来,对 User Goals 进行采样,通过用户模拟器对 DM 模型进行交互,利用 Reward Evaluator 模型进行 Reward 打分,从而获得大量的 Transition 四元组:


<state(t),act(t),state(t+1),reward(t)>


利用增强学习 A2C 算法训练,直至收敛。然后发布到线上,进行在线学习。

2.4 Dialog State Tracking(DST)


图 17:阿里与学术界在 DST 的差异


真实场景下,我们的 DST 与学术界相比,有以下几点主要差异:


  1. 多智能体建模:DM 不仅跟用户交互,还跟多个外部服务交互,这些服务都可以看做是一个个智能体;

  2. 追踪变量:外部返回的结果会存储在变量中,我们的 DST 扩展了数据形式;

  3. slot-value 假设:学术界假设 slot value 都是离散可枚举的,哪怕是“时间”类型的值,会通过静态化处理进行简化,这显然和实际情况不符,我们不做这样的假设;

  4. 追踪次数:我们对每轮对话中 tracking 的次数不做约束。



图 18:约会议的追踪过程


如上图所示,一共有两轮对话,每一轮有两次对话追踪。


DST 模型的输入是上一轮对话的状态、上一轮系统行为、当前轮用户 utterance、API 返回,输出是当前轮的对话状态。



图 19:DST 的状态跟踪流程


这个模型的核心是 operator。在“约会议”场景中,工号的 slot value 一直在变化,开会时间也是不可枚举,如果把 slot value 加入到模型中训练,在预测的时候就会遇到未知的 slot value,此时模型效果就变差。operator 的操作对象是 slot 本身,它只关心信息的流转,而不关心具体 value 是什么,它摆脱了对 value 具体值的依赖,因此具备更强的适应能力。

2.5 Policy: A2C-ER with TaskFlow bootstrapping

下图表示的是增强学习的数据收集和训练的过程。首先,用户输入 user act(t),进入一个对话状态 state(t),经过 feature generator 模块,得到 b(t),接着把它输入到 policy 网络获得 act(t),这个 act 会和对话状态一起输入到一个 Reward Evaluator 模型进行打分,得到 reward(t),然后进入下一个对话状态 state(t+1),这时候会得到一个 experience,它包括:


<state(t),act(t),state(t+1),reward(t)>


四元组,然后通过 off-policy 的方式进行训练,而这里收集到的样本分布和 policy 真正输出的样本分布存在偏差,可以利用重要性采样 ( Importance Sampling ) 的方法进行修正,这样能训出一个比较好的 policy 模型。



图 20:Policy 的学习过程

3. 用户模拟器

3.1 Simulation System


图 21:Simulation System 的实现原理


从上面所说的 DM 模型的训练过程,我们可以看到用户模拟器起到非常重要的作用,这里我们介绍一下用户模拟器的实现原理。


我们的用户模拟器是以 Taskflow 为根基构建的,触发节点展开后形成的抽样树对应用户策略,函数节点+回复节点的串联对应用户状态管理,这是实现用户模拟器的基础。


它由 3 部分组成:User State Tracker、User Policy 和 User Model。其中 User Model 可以针对不同的任务设定不同的参数,比如:生成对话数据,对话评测,它们的 Goal 和 Profile 都可以不一样,这样既保证是一套统一的建模框架,同时又保证了系统的灵活性。



图 22:User Simulator - 实现框架


具体的应用场景如下:



图 23:User Simulator - 应用

3.2 User Simulator - 对话诊断

这是一个公积金查询的对话流,它一共有 175 条路径,如果要去覆盖需要输入 1000 次以上,这个过程耗时耗力。



图 24:对话系统的对话诊断难度


为了解决这个问题,我们提出了利用一个机器人诊断另外一个机器人的想法,具体的实现架构如下图所示:



图 25:对话诊断机器人架构


它的基本逻辑是,首先有一个对话系统,它加载的是 Taskflow,对话系统与用户模拟器交互,产生对话日志,这里面有成功的 session 也有失败的 session,如果是失败的,会把它送到一个诊断分析的模块,进行错误分析和路径统计,得到错误详情及问题产生原因,反馈给业务人员,业务人员根据提示修正 Taskflow,然后重新诊断,以此往复直到所有的问题都解决。

4. 总结


总结如上,这是本次分享的主要内容,谢谢大家!


作者介绍


唐呈光 ( 蒽竹 ),阿里巴巴算法专家。2017 年初加入阿里,对话工厂对话引擎负责人,主导人机对话相关技术在真实商业场景的应用,主要研究方向为用户模拟器和对话系统。此前曾在百度从事搜索推荐系统的算法研发工作,发表国家发明专利 8 项,国际发明专利 2 项。


本文来自 DataFun 社区


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247493895&idx=1&sn=b1ca4f7ad4c135bbb891a8e76eb1ea66&chksm=fbd75b6bcca0d27d166d0e0885da7cdc93c38886cfba406930307d2551ab409bf0de0401aa87&scene=27#wechat_redirect


2019-09-27 08:003976

评论

发布
暂无评论
发现更多内容

Rust从0到1-函数式编程-性能比较

rust 函数式编程 Performance 性能比较

如何做好IT项目管理?

万事ONES

IT 项目经理 项目管理工具

漏洞都有哪些分类

网络安全学海

网络安全 信息安全 渗透测试 漏洞 漏洞分析

中层管理者的工作五步法

石云升

读书笔记 职场经验 管理经验 6月日更

聊聊知乎订单系统迁移

知一

监控 软件开发 系统架构 重构 订单系统

SQL 居然还能在 Apache ShardingSphere 上实现这些功能?

SphereEx

【源码系列】Spring 过滤器和拦截器

Alex🐒

spring 源码 Spring Framework

如何实施 SCRUM ?

万事ONES

项目管理 Scrum 敏捷开发 看板 ONES

13万张表+数亿行代码,迁移只需数小时,还是异构数据库

华为云开发者联盟

数据库迁移 DRS 华为云数据库 异构数据库 华为云UGO

视频 QoE 的平衡之道—揭秘网易云信 NERTC 视频质量控制系统

网易云信

视频 Qoe

区块链:从根儿上解决2%的人拥有80%的财富全球社会问题

CECBC

解析对偶理论与对偶单纯性法

华为云开发者联盟

模型 对偶理论 对偶单纯性法 对偶 线性规划

《面试补习》- Java集合知识梳理

九灵

Java 面试 集合

开源商业化:满足各方底层需求

茶陵後

开源 开源社区 开源文化

Linux之head命令

入门小站

Linux

在线图片转base64工具

入门小站

工具

卢卡开专栏了

卢卡多多

数据库 MySQL 高可用 6月日更

2021,云原生避坑经验分享|CIC 阵容官宣

青云技术社区

容器 云原生

Camtasia实用技巧之视频剪辑

淋雨

视频剪辑 Camtasia 录屏软件

视赏家短视频系统软件开发详情

我们常说的算法时间复杂度和空间复杂度到底是什么?

编程三昧

编程 算法复杂度

vue keep-alive(1):vue router如何保证页面回退页面不刷新?

zhoulujun

Vue vue-router keep-alive 页面缓存

华为云原生媒体网络,升级传统,赋能未来

华为云开发者联盟

云原生 直播 TechWave 媒体网络 云视频

推荐系统之数据与特征工程(二十三)

Databri_AI

数据 推荐系统 技术特征

智能运维(AIOps)系列之一:个人对智能运维的理解

micklongen

AIOPS 智能运维

vue keep-alive(2):剖析keep-alive的实现原理—学习笔记整理

zhoulujun

Vue vue源码解读 keep-alive实现原理

并发王者课-铂金05:致胜良器-无处不在的“阻塞队列”究竟是何面目

MetaThoughts

Java 多线程 并发 并发王者课

网络攻防学习笔记 Day60

穿过生命散发芬芳

网络攻防 6月日更

【LeetCode】传递信息Java题解

Albert

算法 LeetCode 7月日更

【Flutter 专题】129 图解 ToggleButtons 按钮切换容器组

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

“区块链贸易融资生态”应用案例发布

CECBC

阿里云小蜜对话机器人背后的核心算法_AI&大模型_DataFunTalk_InfoQ精选文章