本文主要用于归纳整理与对话系统相关的开放意图检测与发现相关的3篇论文。
本文主要参考:https://hanleizhang.github.io/
相关资料介绍:http://aitime-lundao.oss-cn-beijing.aliyuncs.com/AitimeReport/20210312/aaai4.pdf
------------------第一菇 - 研究背景及现状------------------
现阶段的机器学习技术的突破创新,大多还是停留在封闭的知识域内。然而在真实的工业落地场景中,大量的应用场景是开放域的,即,无法预先完全定义线上模型将会面对的数据分布,大量的真实数据可能都不在目标学习范围之内,因此,如何及时发现这些新知识,就成为最新的前沿研究热点。本文将主要聚焦于探讨,中的开放意图检测与发现问题。
任务型对话系统中,能否准确识别用户的意图,直接决定了整套对话系统的服务质量。然而,在真实的工业落地场景中,用户的意图总是会超出预设的范围,大量的域外话术冲击着模型,导致系统的识别率低,准确率低,因此,检测并发现用户开放意图并加以有效利用具有很大的商业前景,能极大的提高整套系统的商业落地价值。
但是具体来说,开放意图的发现其实也可以细分为2个子问题,
1)如何将开放意图与已知意图分离?
a. 本质上是个开放领域的分类问题
b. N类已知意图,开放意图全部归为一类
c. 训练集只包含已知意图
2)如何发现开放意图的细粒度类别?
a. 半监督聚类问题
b. N类已知意图,M类细粒度开放意图
c. 训练集包含少量有标注已知意图+大量未标注意图
------------------第二菇 - 论文解读------------------
01. Deep Open Intent Classification with Adaptive Decision Boundary
论文链接:https://arxiv.org/pdf/2012.10209.pdf
相关代码:https://github.com/HanleiZhang/Adaptive-Decision-Boundary
摘要
在对话系统中,开放域的意图分类是一个富有挑战性的问题。一方面,系统首先得确保“已知”意图的准确识别,另一方面,在没有先验知识的前提下,系统需要去发现那些“未知”的意图。现有的模型需要去寻找合适的决策边界(decision boundary)来平衡对“已知”和“未知”意图的识别能力。在本论文中,我们提出了一种后处理方法来自适应的学习决策边界,该边界能更好的用于开放域的意图分类。我们首先使用了带标签的意图分类数据来预训练模型。然后,我们在训练好的特征辅助下,针对每一个“已知”意图,来自适应的学习决策边界。具体实践过程中,我们还提出了一种新的损失函数来平衡“经验风险”和“开放域风险”(即,同时兼顾“已知”和“未知”意图的识别能力)。该方法不需要未知意图的标签数据,并且模型的架构也是可以更改的。另外,我们惊喜的发现,该方法在只有少量“已知”意图的情况下,依然有很好的表现。从3个基准数据集的测试实验结果反馈来看,我们的方法相比于现有的方法取得了巨大的提升。
背景介绍
在任务型对话系统中,具备发现用户说的是“开放域”意图(open intent)这个能力是十分重要的。如下图所示,
我们已经预先定义好了2个意图(book flight, restaurant reservation)然而,还有更多的话术是我们系统暂时不支持的(与现有意图没有关联性),因此我们需要尽可能的将,“已知”意图和“开放域”意图进行区分。一方面,甄别出这些“开放域”的意图能减少错误回答的情况,另一方面,汇总收集这些“开放域”的意图也能聚焦发现更多用户的潜在需求。
我们将“开放域”的意图分类,当作是,n+1类别的分类任务,其中,n就是“已知”意图的个数。整个任务的核心目标只有2个,
1)准确识别出“已知”意图的数据,并准确分类到他们所属的意图类别。
2)甄别出“开放域”意图数据,即将这些数据识别分类到第n+1个类。
研究现状
现有的一些方法都聚焦于去设计一个专门的域外分类器来甄别这些“开放域”的意图数据,但是这些分类器都需要提前预设一批负样本来选择合适的决策边界。并且,这还是一个耗费人力的活,因为需要人工参与去判断这些阈值的选择是否合理,并且,受到你参与训练的负样本所限制,往往你换一批负样本,可能整个选择的条件就都变化了。我觉得核心问题还是,这些基于统计数据的阈值选择方法,并没有去倒逼模型,真正的学会区分“已知”意图和“开放域”意图。
主要方法
先放一张图,来概览整个方法的流程框架,
步骤1. 意图表征与预训练方法
利用Bert来抽取每一句话的深度意图表征,经过12层Transformer的编码后,取每一个词表征的平均池化作为句向量(注意这里不是只取第一个词)。然后,将其通过一层全连接层,获得意图表征。因为我们缺少“开放域”意图的标签数据,所以我们先用这一部分带标签的“已知”意图来预训练我们的模型,训练目标比较简单,就是分类交叉熵损失,以上步骤总结如下图所示,
步骤2. 决策边界学习
根据过往的资料调研,球形的决策边界能最大程度上的减少“open space”风险,因此,本文也继续沿袭这一思路。首先我们需要计算出每一类意图的“簇中心”,根据上一步提取出的每一句话的意图表征,我们对属于同一类意图(记住哦,对于“未知”的意图,他们现在是一个类别)的句子的意图表征取平均,即代表,该类的,“簇中心”,如下,
然后对于每一类意图的球形决策边界,我们希望满足,
∀z_i ∈Sk, ‖zi −ck‖^2 ≤∆k
即,我们希望该意图下的所有数据,都能被包含在这个,以c_k为中心,∆k为半径的球形空间内。
其中,这个半径,∆k,就是第二步我们需要利用深度神经网络去学习的参数,为了令其可微,我们还采用了softplus激活函数,来做了一层映射,
∆k = log(1 + e^∆k)
利用softplus这个激活函数的好处总结如下,
1)可以求导,反向传播的时候学习到这个参数。
2)可以保证学到的半径,∆k一定是大于0的。
3)也兼顾了ReLU的线形特征(其实他本身就是ReLU的平滑版本),并且允许大数值。
上述表述过程,可以总结如下图,
然后,根据我们上述的定义,我们可以针对性的设计出一个,计算边界的损失函数。
比如,
1)当, ‖z_i −c_yi ‖_2 > ∆yi,的时候,该样本就远离了其本该属于的类别簇中心,肯定是希望模型往近了的方向优化更好,这样才能涵盖该样本。(即,考虑准确率)
2)当,‖z_i −c_yi ‖_2 < ∆yi,的时候,该样本就在这个类别的边界范围内,但我们会希望这个边界范围尽可能的往外扩,这样可以更多的去涵盖本应识别的样本(否则,会出现大量的“未知”意图,即,考虑识别率)
损失函数表述如下图所示,
当我们训练出合理的决策边界以后,就可以利用每句话的表征与各个质心的距离来判断,该句是否为“开放域”意图,如果不是的话,也能同时得到,该句话所属的意图(与哪个质心的距离最近),如下所示,
主要贡献
各实验结果,直接参考原始论文即可。
看完整篇论文,可以得出,本文的主要贡献主要集中在2个方面,
1)针对“开放域”意图的发现,巧妙的转化为,n+1的分类问题。
2)提出了一种训练,决策边界的方法,减少了大量的人工介入干预过程。
a. 定义球形决策边界,通过平衡经验风险和开放空间风险学习紧凑的决策边界。
b. 无需开放域样本参与,自动学习决策边界避免复杂调参。
c. 允许任意神经网络分类器,在不修改模型架构的情况下检测开放意图。
------------------第三菇 - 其他OOD检测方法------------------
另附4篇与OOD检测相关的文章总结,
【腾讯文档】开放意图检测方法
https://docs.qq.com/mind/DVFd1RXlYUmhYRk9O