最新综述:对话系统之用户模拟器

640
作者丨唐呈光、戴音培、李永彬、孙健 单位丨阿里巴巴智能服务事业部小蜜北京团队

用户模拟器基础


用户模拟器产生背景
近几年来,强化学习在任务导向型对话系统中得到了广泛的应用,对话系统通常被统计建模成为一个马尔科夫决策过程(Markov Decision Process)模型,通过随机优化的方法来学习对话策略。
任务导向型对话系统用于帮助用户完成某个任务如查电影、找餐馆等,它一般由四个模块组成:自然语言理解模块(Natural Language Understanding, NLU)、对话状态跟踪模块(Dialog State Tracking, DST)、对话策略模块(Dialog Policy, DP)和自然语言生成模块(Natural language Generation, NLG),其中 DST 和 DP 合称为对话管理模块


在和用户的每轮交互过程中,对话系统利用 NLU 将用户的语句解析成为机器可理解的语义标签,并通过 DST 维护一个内部的对话状态作为整个对话历史的紧凑表示,根据此状态使用 DP 选择合适的对话动作,最后通过 NLG 将对话动作转成自然语言回复。对话系统通过和用户进行交互得到的对话数据和使用得分则可用于进行模型的强化学习训练。


然而在实际中,和真实用户的交互成本昂贵,数据回流周期慢,不足以支持模型的快速迭代,因此研究者们通常会构建一个用户模拟器(User Simulator, US)作为对话系统的交互环境来进行闭环训练。有了用户模拟器产生任意多的数据,对话系统可以对状态空间和动作空间进行充分地探索以寻找最优策略。


一个效果良好的用户模拟器,我们期望它具备以下 3 个特征:


  • 有一个总体的对话目标,能够生成上下文连贯的用户动作;
  • 有足够的泛化能力,在语料中未出现的对话情形里也能生成合理的行为;
  • 可以给出定量的反馈评分用于指导模型学习优化。

为了实现以上目标,学术界做了大量的研究工作,从最基础的 bi-gram 模型 [4],到经典实用的 Agenda-based的方法 [2],再到最近基于深度学习的用户模型 [9, 10],用户模拟器的效果得到了显著提升,也为对话模型的训练提供了有效的方法。


用户模拟器的基本结构
图 1 是一个比较典型的用户模拟器 [1],对话开始时用户模拟器基于 User Goal(用户目标)发出一个话术:“Are there any action movies to see this weekend?”(这个周末有什么动作片可以看的吗?),这句话进到对话系统的自然语言理解模块和对话管理模块后,生成一句系统动作:“request_location”(询问地点)。
简便起见,这里省略掉系统的 NLG 模块,系统回复直接送到用户模拟器的用户模型(User Model),通过用户状态更新和行为策略选择,生成用户对话行为:“inform(location=San Francisco)”(告知地点为旧金山),接下来经过 Error Model(可选)和 NLG 模块,生成对应的自然语言,比如:“San Francisco, please.”(帮我订旧金山的)。以此往复,用户模拟器和对话系统持续多轮交互,直到对话结束。


640  图1. 用户模拟器(蓝色部分)和对话系统(红色部分)


从上面的过程我们可以看到,典型的用户模拟器和对话系统的结构比较相似,包含以下 4 个基本组成部分:
1. 用户目标(User Goal):用户模拟的第一步就是生成一个用户对话的目标,对话系统对此是不可知的,但它需要通过多轮对话交互来帮助用户完成该目标。一般来说,用户目标的定义和两种槽位相关: 可告知槽(informable slots)和可问询槽(requestable slots),前者形如“槽=值”是用户用于查询的约束条件,后者则是用户希望向系统问询的属性。
例如:用户目标是 “inform(type=movie, genre=action, location=San Francisco, date=this weekend),request(price)”表达的是用户的目标是想要找一部本周在 San Francisco 上映的动作片,找到电影后再进一步问询电影票的价格属性。有了明确的对用户目标的建模,我们就可以保证用户的回复具有一定的任务导向,而不是闲聊。
2. 用户模型(User Model):用户模型对应着对话系统的对话管理模块,它的任务是根据对话历史生成当前的用户动作。用户动作是预先定义好的语义标签,例如“inform, request, greet, bye”等等。用户动作的选择应当合理且多样,能够模拟出真实用户的行为。用户模型是用户模拟器的核心组成部分,在接下来的章节里我们将会详细介绍各种具体模型和方法。
3. 误差模型(Error Model):它接在 User Model 下游,负责模拟噪声,对用户行为进行扰动以模拟真实交互环境下不确定性。简单的方式有:随机用不正确的意图替换正确的意图、随机替换为不正确的槽位、随机替换为不正确的槽值等;复杂的方式有模拟基于 ASR 或 NLU 混淆的错误。


4. 自然语言生成(NLG):如果用户模拟器需要输出自然语言回复,就需要 NLG 模型将用户动作转换成自然语言表述。例如用户动作标签“inform(type=movie, genre=action, date=this weekend)” 进行 NLG 模块后生成自然语句“Are there any action movies to see this weekend?”。

用户模拟器的实现方法


我们将用户模拟器的实现方法大致分成两类:基于规则的方法基于模型学习的方法。我们将介绍这些方法中各自具有代表性的论文。

基于规则的方法


基于规则的方法需要专家手动构建,它的优点是可以冷启动,用户行为完全可控;缺点是代价大,覆盖度不够,在对话行为灵活性和多样性上比较不足,适用于话术简单清晰的填槽式对话任务。


基于规则的方法中使用最为广泛的是基于议程(Agenda-based)的方法 [2, 3],该方法对用户状态表示、状态转移、Agenda 更新、Goal 更新进行了精细建模,逻辑清晰,可落地性强,业界很多工作 [1, 15] 都基于该方法进行扩展和优化。
基于议程的方法通过一个栈的结构把对话的议程定下来,对话的过程就变成进栈和出栈的动作,上下文关联性很强,保证了用户动作生成的一致性,一般不会出现异常用户行为。但是,该方法在对话行为灵活性和多样性比较欠缺,在实操层面可以通过引入一些随机性提升灵活度。
基于议程的方法

代表论文:The Hidden Agenda User Simulation Model


论文链接:https://ieeexplore.ieee.org/document/4806280/?arnumber=4806280


640?wx_fmt=png


首先,作者认为人机对话可以形式化为一系列状态转换和对话行为序列。在任意时刻 t  ,用户在状态 S,采取动作640?wx_fmt=png ,过渡到中间状态 S',收到对话系统回复的动作640?wx_fmt=png,然后转换到下一个状态 S'',然后以此往复,循环下去。


640


根据马尔科夫假设,用户行为可以分解为三个模型:640?wx_fmt=png 用于建模用户动作选择,640?wx_fmt=png用于建模发出用户动作 640?wx_fmt=png 后用户状态转移到 S' 的概率,640?wx_fmt=png用于建模接收到系统动作 640?wx_fmt=png 后用户状态转移到 S'' 的概率。


用户状态 S 被分为 2 部分表示:Agenda 的内容 A 和用户目标 G。


640?wx_fmt=png


G 由约束条件 C 和问询内容 R 组成。在对话的过程中,G 能保证用户行为是一致的且是任务导向的。


用户 Agenda 是一个类似堆栈的结构,它存储着待执行的用户对话行为(user dialogue act)。在对话开始时,使用系统数据库随机生成新的用户目标,然后会将用户目标中所有目标约束转换为告知行为(inform acts),所有的目标问询转换为问询行为(request acts)填充到用户 Agenda。在 Agenda 的底部,会添加一个 bye act 用于结束对话。


随着对话的进行,Agenda 和 Goal 会动态更新,并从 Agenda 的顶部弹出用户对话行为以形成本轮用户动作640?wx_fmt=png在接收到系统回复640?wx_fmt=png后,根据写好的规则新的用户动作会被压入到 Agenda 的栈顶,不相关的用户动作会被删除。当需要考虑动作的优先级时,栈顶的用户动作也可以临时被缓存起来先执行优先级高的动作,从而为模拟器提供简单的用户记忆模型。图 2 给出了用户目标和 Agenda 变化的示例。


640  图2. 表示用户目标和agenda的状态变化的示例
用户动作选择模型640?wx_fmt=png ,其中 δ 为狄拉克函数,A[N] 代表栈顶的元素, A[1] 代表栈底的元素, A[N-n+1..N] 代表在 Agenda 栈顶的 top-n 的用户动作 acts,该模型的直观理解是如果 640?wx_fmt=png 在 top-n 的 acts 里,那么 P 趋于 1,此时
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
x86模拟器编程实践是指通过编写程序来模拟执行x86指令集的过程。x86指令集是一种常见的处理器指令集架构,被广泛应用于个人电脑和服务器等领域。 在进行x86模拟器编程实践时,我们首先需要了解x86指令集的基本知识。x86指令集包括一系列的指令,用于实现不同的操作,比如算术运算、数据传输、条件判断等。了解这些指令的特点和功能对于编写模拟器程序非常重要。 其次,我们需要选择合适的编程语言。常用的编程语言包括C、C++和Python等,它们都提供了丰富的库和工具,方便我们进行模拟器编程实践。选择合适的编程语言能够提高编程效率,并且能够更好地与底层硬件交互。 在编写模拟器程序时,我们可以使用虚拟机技术来模拟x86处理器的执行过程。虚拟机是一个软件实现的计算机系统,它可以在一个物理计算机上运行多个操作系统。通过使用虚拟机,我们可以在模拟器中运行x86指令,从而了解指令的具体执行过程。 在实践中,我们可以编写一个简单的x86模拟器,用于模拟特定的指令执行过程。我们可以通过读取和解析指令,模拟各种操作,如计算、内存读写、条件跳转等。通过不断的实践和测试,我们可以逐步完善模拟器的功能,并优化其性能。 总之,x86模拟器编程实践是一项重要的计算机系统基础技能。通过编写模拟器程序,我们可以深入了解x86指令集的执行过程,提高我们的编程能力,并为后续的系统开发和调试工作打下基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值