Multi-Agent Task-Oriented Dialog Policy Learning with Role-Aware Reward Decomposition 笔记

目录

一 引入

1.1 论文针对的问题

1.2 论文的贡献

二 算法

2.1 对话中用户与系统的角色

2.2 算法总体结构图

2.3 用户与系统的policy网络(即两个actor)

2.3.1 用户的policy网络

2.3.2 系统的policy网络

2.4 reward 的计算方法

2.5 Hybrid Value Network(即critic)

2.6 Hybrid Value Network的损失函数

2.7 算法训练流程

三 实验

3.1 数据集

3.2 baseline

3.3 实验结果


论文地址: https://arxiv.org/abs/2004.03809v2

论文配套代码地址:https://github.com/truthless11/MADPL

一 引入


1.1 论文针对的问题

目前很多文章在用RL做pipeline式对话系统中的policy learning阶段,但是其中大部分论文都是只将RL用于场景中的“机器人”一方。但是机器人用RL方法训练时需要与“用户”一方交互。

由于训练要求的交互次数很多,而人力成本很贵,让RL机器人训练时与真实用户显然是不可能的。所以大部分论文都将RL机器人与“用户”模拟器进行交互,从而完成训练过程。

但是如何做出“用户”模拟器也是一个大问题。如果是基于规则的模拟器,效果不好,且耗人力。

作者考虑到做一个“用户”模拟器,其实也类似于做一个“对话机器人”。所以作者将RL也用于“用户”一方,基于标注的对话数据,直接学习“用户”模拟器。


1.2 论文的贡献

1.  将RL中的actor-critic方法用于对话系统的“系统”与“用户”两侧,避免费力搭建用户模拟器。

2. 提出了一个Hybrid Value Network,配合提出的reward计算方法(用户、系统的reward计算方法不同),解决了系统与用户角色不同的问题。(注:Hybrid Value Network就是actor-critic中的critic,用于计算state的价值,后文会提到细节)

3. 在多领域、多意图的数据集上做了试验,显示方法有效、合理、可扩展。(注: MultiWOZ数据集)

 

二 算法


2.1 对话中用户与系统的角色

图1 算法结构图
图1 用户与系统的角色

 

双方角色定位参见图1.

用户:带有一个需要完成的goal。比如为了预定餐馆,需要告知系统喜欢的food,需用从系统处得知预定的餐馆的phone、address。

系统:基于可访问的Database,帮助用户完成目标。比如基于Database中拥有的餐馆信息,给用户推荐餐馆,并帮用户完成预定。


2.2 算法总体结构图

该论文使用了RL中的actor-critic算法。在这里贴一下《强化学习》书中actor-critic算法的伪代码(见图2),帮助回忆。

图2 actor-critic算法伪代码
图3 算法总的结构图


该论文的算法结构图如图3:

1. 环境给出起始的状态user_state

2. 用户方的actor基于user_state做出动作user_action

3. 环境接收user_action后生成新的状态system_state

4. 系统方的actor基于system_state做出动作system_action

5. 环境接收system_action后生成新的状态next_user_state,和三个reward:用户动作user_action的奖励user_reward,系统动作system_action的奖励system_reward,还有全局奖励global_reward。

6. 使用state与reward更新双方的critic,之后双方的actor就能基于critic选出更好的action


2.3 用户与系统的policy网络(即两个actor)

2.3.1 用户的policy网络

用户的policy网络输入为user_state,输出为用户可选动作的一个子集(换句话说,用户可能同时输出多个动作,即多标签多分类)。可选动作的集合是提取定义好的,根据不同的Datasets,会提前构建好不同的可选动作的集合。

user_state由四部分组成:

1. 上一轮的system_action

2. 上一轮的user_action

3. goal state(表示了用户还没有说出去的constraint和request)。这goal state光看论文比较难懂,看了代码后我才明白它是什么意思。

举个例子,用户最开始的goal state包含一个需要inform给系统的slot-value,和两个需要request的slot(phone与address):

inform:
    food=Italian
request:
    phone
    address

在某一轮对话中,用户说“我喜欢吃意大利的菜”,那么用户在当前轮就成功inform了一个food-Italian的信息。在之后轮次中,用户的goal state就变为了:

request:
    phone
    address

4. inconsistency vector. (我没懂这点)

user_action就是系统要做的动作。

注意一下,系统和用户的动作都是用一个四元组表示[domain, intent, slot, slot value]。

假如用户的动作为[restaurant, inform, food, Italian],则表示在背景为restaurant的情况下,用户inform系统说他自己喜欢的food为Italian风格。

而[restaurant, inform, food, Italian]与[restaurant, request, phone, ?]为两个不同的动作。

论文代码(torch)中用户policy就是一个含三层全连接层的网络,在类MultiDiscretePolicy中定义了:

elif character == 'usr':
    self.net = nn.Sequential(nn.Linear(cfg.s_dim_usr, cfg.h_dim),
                             nn.ReLU(),
                             nn.Linear(cfg.h_dim, cfg.h_dim),
                             nn.ReLU(),
                             nn.Linear(cfg.h_dim, cfg.a_dim_usr))

2.3.2 系统的policy网络

系统的policy网络输入为system_state,输出为系统可选动作的一个子集(即多标签多分类)

system_state由四部分组成:

1. 系统上一轮的system_action

2. 用户当前轮的user_action

3. belief state。应该就对应于MultiWOZ数据集中对每条system话语标注的metadata

4. Databases的查询结果。(没看懂代码这里如何表示的)

论文代码中的系统policy网络是一个含三层全连接层的简单网络,在类MultiDiscretePolicy中定义了:

if character == 'sys':
    self.net = nn.Sequential(nn.Linear(cfg.s_dim, cfg.h_dim),
                             nn.ReLU(),
                             nn.Linear(cfg.h_dim, cfg.h_dim),
                             nn.ReLU(),
                             nn.Linear(cfg.h_dim, cfg.a_dim))

2.4 reward 的计算方法

太晚了,之后补充。

2.5 Hybrid Value Network(即critic)

这个hybrid value network的作用是计算状态的价值(即critic),用于辅助系统和用户的policy(即actor)选出下一步的action。

公式如下:

其中两个h是状态的中间表示。5个f对应了5个神经网络。计算的三个value依次对应了用户状态价值、系统状态价值、全局状态价值。

用户状态价值辅助用户的policy选动作;系统状态价值辅助系统的policy选动作;全局状态价值只是在“计算总体损失,同时更新5个网络” 时用到了。

hybrid value network的实现对应了论文代码中的HybridValue类:

# 两个用于表示状态的网络
self.net_sys_s = nn.Sequential(nn.Linear(cfg.s_dim, cfg.hs_dim),
                               nn.ReLU(),
                               nn.Linear(cfg.hs_dim, cfg.hs_dim),
                               nn.Tanh())
self.net_usr_s = nn.Sequential(nn.Linear(cfg.s_dim_usr, cfg.hs_dim),
                               nn.ReLU(),
                               nn.Linear(cfg.hs_dim, cfg.hs_dim),
                               nn.Tanh())

# 三个分别关于 system、user、global 的计算状态价值的网络
self.net_sys = nn.Sequential(nn.Linear(cfg.hs_dim, cfg.h_dim),
                             nn.ReLU(),
                             nn.Linear(cfg.h_dim, 1))
self.net_usr = nn.Sequential(nn.Linear(cfg.hs_dim, cfg.h_dim),
                             nn.ReLU(),
                             nn.Linear(cfg.h_dim, 1))
self.net_global = nn.Sequential(nn.Linear(cfg.hs_dim+cfg.hs_dim, cfg.h_dim),
                                nn.ReLU(),
                                nn.Linear(cfg.h_dim, 1))

2.6 Hybrid Value Network的损失函数

hybrid value network的更新是先计算一个总损失,然后总损失反向传播到5个子网络,同时更新5个子网络的参数。损失函数计算公式如下:


2.7 算法训练流程

算法训练流程伪代码如图4.

图4 算法训练流程

讲一下几个难懂的点:

1.  伪代码第2行,如何预训练用户和系统的policy网络?

既然policy网络作用是输入state,输出一个或多个action。那么直接使用(state, actions)作为训练数据,以有监督、多标签多分类的方式预训练policy网络,让其学习state到actions的映射关系。这样网络参数优化过后,之后actor-critic训练时就更加容易收敛。

2. 伪代码第3行中,target network是什么?

这涉及了强化学习中防止网络训练时不收敛的一种技巧。我在莫烦的强化学习课程的Q Learing算法中见到过。

简单来说,由于下列式子涉及了计算当前状态的价值和下一个状态的价值。如果使用同一个网络、相同参数进行计算这两个价值,得到损失后立即更新该网络的参数,会导致训练过程不收敛。为了解决这个问题,就实例化两个架构一模一样的网络(一个称为hybrid value network,一个称为target hybrid value network)。target hybrid value network用于计算下一个状态的价值,参数先保存不变。而hybrid value network用于计算当前状态的价值,使得式子v_state = reward + v_next_state 尽量成立(即使得损失L_v为0),每次计算出损失后立即更新hybrid value network的参数。当hybrid value network参数更新指定次数后,再把hybrid value network的参数复制给target value network。这样一直重复很多轮,直到网络收敛。

 

三 实验


3.1 数据集

使用了MultiWOZ数据集。

按照论文中的参考文献,应该指的是MultiWOZ的1.0版本。但是我发现论文代码配套的对话标注数据,却与MultiWOZ的每个版本都对应不上。比如annotated_user_da_with_span_full_patchName.json文件中用户的话语也标注了action、每条话语都有名为span_info的数据。这应该是作者自己对数据做了一些处理,然后与代码一起发布了。不过在论文中没有说明这些处理是如何做的。


3.2 baseline

比较了四种方法:

1. SL(supervised Imitation Learning)

直接学习state到actions的映射,相当于算法流程伪代码图4中的预训练步骤。没有使用强化学习。

2. RL(Independent Reinforcement Learning)

不是同时训练用户和系统。而是固定一方,训练另外一方。

比如训练系统时,系统使用RL方法,而用户是固定的。(如何固定用户?我没有看懂,也许直接加一个简单的基于规则的用户模拟器)

3.  CRL(Centralized Reinforcement Learning)

类似于本文提出的方法,用户和系统都使用了actor-critic方法,不过用户和系统共用同一个critic实例。而该论文提出的方法使用了两个不同的critic。

4. IterDPL

其他论文提出的一种方法


3.3 实验结果

图5 实验结果

 

其中最下面一行MADPL是该论文提出的方法。Turns 表示测试过程中所有episode的平均对话轮次。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值