1. 传统端到端学习的弊端:
- 数据驱动型,需要海量数据来学习简单的行为数据驱动型,需要海量数据来学习简单的行为
- 领域迁移时,无法加入领域先验知识
本文提出的HCN(端到端,任务型),不仅可以保留对话状态的潜在表示,还能显著减少训练数据量(结合监督学习和强化学习来优化),同时获得satte-of-art的性能。
2. 端到端和pipeline的对比:
- pipeline需要经过 NUL,DST,动作策略选择和NLG等模块,模块之间的依赖会增加复杂性,并且每个模块都需要专门的标签。而RNN可以推断出潜在的状态表示,不再需要state标签。
- 但端到端的方法缺乏注入领域知识和约束的一般机制,比如仅仅需要几行代码的约束,在RNN个需要上千个对话才能学习到。
本文提出的HCN网络,除了可以学习RNN外,还允许开发人员通过软件和动作模板表示领域知识。既保留了端到端可训练性的优势,又能够实现较少的训练数据量。另外,通过改变梯度更新,可以通过监督学习或者强化学习来训练神经网络(??)
3. 文章结构:
- 第二节描述了模型
- 第三节将模型与相关工作进行对比
- 第四节将HCN应用于bAbI对话数据集
- 第五节将HCN应用于真实客户支持域
- 第六节说明了如何通过强化学习优化HCN
- 第七节总结
4. 模型组成
- RNN
- domain-specific software
- domain-specific action templates
- a conventional entity extraction module(识别文本中的entity mentions??)
RNN和开发代码都用来保持state,每个动作模板可以使文本通信或者是API调用。模型如下图。
流程:
- 用户输入话语时,循环开始(1)
- 话语用多种方式表现出来,首先构建BOW词袋向量(2)
- 然后用预训练的词向量实现语句嵌入(3)
- 之后通过实体提取模块提取实体,例如将“Jennifer Jones”识别为实体(4)
- 再将文本和实体传递给开发者提供的“Entity tracking”代码,用来管理实体,例如将文本“Jennifer Jones”映射到数据库中的特定行(5)该代码可以选择性地返回“动作掩码”,指示在当前时间步长允许的动作,作为位向量。例如,如果尚未识别目标电话号码,则可以屏蔽用于发出电话呼叫的API动作。它还可以选择性地返回“上下文特征”,这些特征是开发人员认为可用于区分动作的特征,例如当前存在哪些实体以及哪些实体不存在
- 来自步骤(1)-(5)的特征组件被连接以形成特征向量(6),传递给RNN(LSTM或GRU)
- RNN计算隐藏状态(向量),其被保留用于下一个时间步(8)
- 同时该隐藏向量被传递到具有softmax激活的Dense层,该层输出维度等于系统action templates数量,即输出一个在action templates上的概率分布(9)
- 接下来,动作掩码被应用为逐元素乘法,并且将结果归一化为一个概率分布(10),这使得非法动作概率为0(如上文提到的电话)
- 从得到的分布(11),选择动作(12)。当RL处于活动状态时,需要进行探索,即在分布中取一个样本,而RL not active时,选择最好的动作即最高概率的动作
- 将选择的action传递给“Entity output” 代码,该代码可以替换实体(13)并生成完整形式的操作 , - 例如,映射模板 “,right?” 到 “Seattle, right?”
- 在(14)中,控制分支取决于动作的类型:如果它是API动作,则调用开发者代码中的相应API调用(15) - 例如,向用户呈现丰富内容
- API可以充当传感器并返回与对话框相关的特征,因此可以在下一个时间步将它们添加到特征向量中(16)
- 如果动作是文本,则将其呈现给用户(17),然后重复循环
- 所采取的行动在下一个时间步长中作为特征提供给RNN(18)
5. 前期工作对比
- 和pipeline以及相关工作相比,之前已有工作将Policy选择用前馈神经网络来完成,但是这里的策略是人工设定的,即通过DST将观察到的对话历史汇总为状态特征,这需要专门的设计和label。
- 相比之下,HCN使用RNN自动推断出状态的表示。为了提高学习效率,HCN使用外部的轻量级流程来跟踪实体值,但策略并不严格依赖于它,若对话文本中不存在明显上下文,例如数据库状态,则可以将其编码为RNN的上下文特征
- 第二个近期工作是应用RNN来学习端到端模型,从对话历史直接映射到词序列,通过添加特殊的API调用,将数据库输出枚举为一系列令牌,然后使用memory network学习RNN,将这些系统应用于任务型对话。
- HCN仍使用RNN来累积对话状态并选择动作,但HCN使用的是开发人员提供的操作模板,降低了学习复杂性。同时首次引入了强化学习。
6. 监督学习评估I
(1)编写了特定的应用于域的代码
- 首先,对于实体提取(步骤4),使用了一个简单的字符串匹配,匹配预定义的实体名称列表,即数据库中可用的餐馆列表
- 其次,在上下文更新(步骤5)中,编写了跟踪实体的简单逻辑。当用户输入中识别出实体时,直接覆盖之前的值。比如第一轮中识别出
price==cheap
,第三轮中识别出price==expensive
,则重写价格值,此时code保存price==expensive
- 第三,系统操作(system action)被模板化,即回复由模板生成,例如,
“<name> is a nice restaurant in the <location> of town in the <price> price range”
,其中任务5有16个模板,任务6有58个模板 - 第四,当数据库结果被接收到实体状态时,它们按照评级排序
- 最后,创建了一个动作掩码,它编码了常识依赖。这些是基于实体值的存在而实现为简单的if-then规则:例如,如果满足前置条件,则仅允许API调用; 如果已收到数据库结果,则仅提供餐厅; 如果实体已知,则不再询问。
(2)实验配置
- 用上述辅助代码在训练集上训练HCN,其中RNN使用了LSTM,optimizer=AdaDelta,hidden units = 128 , epochs = 12。语句嵌入采用对文字嵌入的平均,用word2vec在web data上训练了一个300维的文字向量。word embeddings在LSTM训练时是静态的,不更新。每个对话形成一个mini_batch,训练损失是分类交叉熵。
- 测试实验:四个对比实验,有没有utterance embeddings,有没有action mask。
- 测试数据:
average turn accuracy
–用网络预测和实际的system action做对比,匹配则认为准确;dialog accuracy
–对话的所有turn都正确。
(3)对比实验
- baseline:
baseline是之前纯粹用seq2seq模型或者纯粹手工规则的方法,相比之下,HCN是手工编写规则+学习模型的混合体。
对比如上图,注意,由于Task5是使用规则生成的模拟数据,纯规则方法可以得到完美的准确度(100%),领域知识的添加极大地简化了学习任务,使HCN也能达到100%;而在Task6上,单独的规则表现不佳,HCN优于过去的模型。 - curve
为了防止训练顺序带来的偏置,每5轮随机一次数据集顺序。图2(a)可以看到,在Task5中,动作掩码和话语嵌入大大减少了训练数据量(曲线在横轴较小时,准确率已经较高了)。在Task6中,话语嵌入的优势不是很明显。
实验中还发现,训练集和测试集之间存在若干系统差异。实际上,DSTC2故意对训练和测试集使用不同的对话策略,而我们的目标是模仿训练集中的策略。尽管如此,可以看到HCN效果比较好,而且大大减少了数据量,这在实际环境中很重要。
6. 监督学习评估II
很纯手工方法的对比,从公司客户支持对话系统中获取日志,该系统使用了一个复杂的基于规则的对话管理器(对比)。对该数据集进行处理后,生成的数据集包含完整的和部分(如果提供的解决方案没有满足用户需求,则将其改为正确的并从此部分截断作为训练数据)对话的混合,涉及“重置密码”和“无法访问账户”。数据集状况如下
纯粹依赖于RNN来驱动对话。由于没有足够的数据用于验证,所以进行训练直到在训练集上达到100%的准确度或者达到200个epochs。由于数据集的不平衡,通过比较HCN和rule-based系统在对话中哪个先出现错误作为对比实验度量,如下图。
当△P>0
时,表示HCN产生更多连续的句子。对所有的实验运行5次,每次都将数据集乱序,结果如下图所示,
大约在30个对话数据后,HCN的性能超过了基于规则的系统。HCN相比于pipeline没有,显式状态追踪。
7.强化学习
上面介绍了引用SL来训练LSTM。一旦系统大规模操作,与大量用户交互,系统希望继续使用强化学习进行自主学习。使用RL,每轮都会得到一个reward
,agent探索不同情况下的不同行为序列,并进行调整以最大化奖励,即回报return
,表示为G
。
本文使用了policy gradient
方法,在此RL方法中,模型π
由w
参数化,在每一步对每个选择哪个sample有一个输出。在轨迹的末尾(即对话末尾),计算该轨迹的回报G
,并且计算模型采用该动作的概率分布,然后采用与回报成比例的梯度来调整权重w
,调整公式如下:
其中α
是学习率; at
是在时间t
时采取的行动,ht
是时间t
的对话历史; G
是对话的回报(return),▽xF
是F相对于x的雅克比行列式,b
是下面描述的基线;
使用LSTM+AdDelta,有32个隐藏单元,每次对话后都会用RL进行策略更新。(后面懵逼了,大概就是一边SL一边RL,还可以将RL的加入到train set中?)
8.总结
- 就是可以加 software和端到端,减少了训练数据量;还可以将SL和RL结合?
- 是不是说,因为加了software手动指定的规则,减少了端到端的训练数据量,但是DST还是用端到端,不用显式追踪?和End-to-end dialog有什么区别呢?
End-to-end dialog使用了memory network。 - 数据集分别用了 dialog-bAbI,自己公司的故障排除代码和名称拨号域模拟对话数据。
- 代码实现(搬运工):https://github.com/johndpope/hcn
- 任务型端到端对话系统5篇论文总结(17年前-参考):https://www.jianshu.com/p/4aebac7e3bb9