百度Unit 2.0平台学习理解

时间:2024-04-11 20:47:45

参考文献:

[1] https://www.jishux.com/p/d9e1d2bf4c9426ac

[2] https://www.jianshu.com/p/9eafea59bcde

最近根据老师的项目,尝试了百度Unit的一些使用,结合相关参考文献,整理一下,主要是记录一下整个平台训练和使用的个人理解,为后面NLP理论研究做基础,不涉及具体的SDK代码和工程性讨论。

【注】由于UNIT目前有1.0和2.0两个版本,两者还是主要有些差距的,具体有:

1) UNIT1.0 中『场景』的概念调整为UNIT2.0 的『BOT』;
2) UNIT1.0 中的『单元』概念去掉,UNIT2.0 新增了技能的概念,分为自定义技能与系统技能;
3) UNIT1.0 中的『对话单元』、『问答单元』改为了UNIT2.0 的『对话意图』、『问答意图』。

详细请参考百度官方的用户手册https://ai.baidu.com/docs#/UNIT-v2-guide/top。自己主要是使用2.0版,所以一下内容为2.0。

一、UNIT整体结构

UNIT结构如下图所示,对话意图是最主要的自定义功能。通过定义词槽来确定意图,再根据意图里的规则从而执行回应。下面重点说一下词槽和规则的作用。

百度Unit 2.0平台学习理解

1.1 词槽

词槽可以看作用来明确对话目的(意图)的特征,词槽内填充的值可以看作特征值。在UNIT中,新建词槽后会选择词槽词典,包含一些常用词,例如定义usr_bank,词典可以自定义上传txt格式的词典,如果词槽非常通用(如时间、地点),百度也提供了词典可以直接使用。词槽定义如下:

百度Unit 2.0平台学习理解

关于定义过程百度手册已经给出了很详细的的过程,在这里不再赘述。从目前UNIT提供给用户的接口来看,还不涉及到根据语义自动提取词槽,也就是自动学习哪些是特征,必须人工定义。所以针对专门的对话领域(查询天气、酒店预订等),词槽定义比较方便,因为制定者可以根据业务逻辑很快定位对话中哪些词是关键属性,但是对于开放性对话系统、聊天系统,就会比较困难。

词槽的使用地方有四处:意图内、意图规则内、对话样本、对话模板:

1)意图内是指匹配意图后,根据意图内词槽是否为必填,决定需要澄清话术与否。例如,在查询天气意图中,时间和地点设置必填,而在训练对话样本中,有一句“[usr_time:明天]天气怎么样”标注为查询天气意图,训练后输入这句话,识别为查询天气意图,但是缺少地点词槽值,澄清话术就会要求输入地点。

2)意图规则内是指当规则组内所有词槽同时满足某些条件时(一条规则一个词槽),触发该意图的回应。

3)对话样本中的词槽必须标注具体的词才能起到效果,后面的例子会说明这一点。

4)对话模板可以直接使用词槽,而不需要设置具体对应的词槽值。

1.2 规则(组)

根据参考文献 [2],无论是开放域聊天还是封闭域,根据对话样本、对话模板或者问答对识别出意图后,若满足其中的规则就会返回相应的3种动作。UNIT中的规则设置比较灵活,考虑到3种情况,使得意图匹配更加灵活。

· 会话过程中:即在整个session过程中,填充进入了就算,适用于多轮对话

· 当前用户输入:指用户输入的上一句,填充进入了才算,此前隔了几个对话说的内容不算

· 上轮对话意图:即之前的对话满足/不满足某个意图后,才能触发符合这个条件

但是,UNIT的规则是多对一的,即在同一个对话意图内,无论制定多少个规则组,最终都是执行这个意图的唯一回应。这样考虑也有道理,因为人在自然交流中,可能说多句话才能表达出这个意思,也可能一句话就能识别意图,因人而异,因场景而异。

二、训练模式

UNIT中最重要的一部分是训练阶段,该阶段需要三种数据集:对话模板集、对话样本集和问答集。问答集就是设置问答对,要求100%匹配问题才可以返回既定答案,没什么好说的。重点说一下模板和样本。

2.1 对话模板

对话模板要比问答对要灵活一点,因为其中可以放置定义好的词槽和特征值,而词槽值暂时可以空着,但是,定义好的对话模板必须按照这个句式才能匹配上标注的意图,也就是说,词槽和特征值的词序以及固定的普通字必须完全匹配

例如,我们只定义了如下的模板:

百度Unit 2.0平台学习理解

训练后如果输入“北京明天天气怎么样”是不被识别到查询天气意图中的。

所以对话模板有利有弊,若应用场景较小,则人们说话的句式较少,且词槽都是通用语义的,可以利用对话模板来标注,甚至不怎么使用对话样本去训练,但是就会很死板。

2.2 对话样本

对话样本作为UNIT训练的核心,个人理解还是依靠监督学习的大批量标注实现的。对话样本具体形式为某句自然话,如果想要训练效果好,不仅需要标注意图,句内的词槽值也需要人工标注,否则即使识别为意图,还是要靠澄清话术来重新输入的

举个简单的例子,不考虑对话模板,只定义如下对话样本:

百度Unit 2.0平台学习理解

训练后输入如下问句作为测试,后面为返回结果:

1)查询明天天气------》请澄清一下:地点。原因为匹配意图后地点词槽必填,但是问句里没有标注

2)南京后天是什么天气--------》请澄清一下:时间、地点。样本2中两者都没有标注

3)9号天气怎么样啊---------》无法回答。必须为8号才能识别意图。

所以从标注上讲,工作量还是挺大的,但是对话样本可以有较好的灵活性,对词序要求不严格,而且此例样本量太少,并不能反映出训练的效果,比如第3个测试,如果样本中含有大量的“N号天气怎么样啊”(百度Unit 2.0平台学习理解),训练完成后输入该问句可以正确匹配到查询天气意图。

三、总结

只考虑一轮对话匹配意图情况,整个流程如下:

百度Unit 2.0平台学习理解

在匹配阶段,个人理解是优先匹配对话模板,如果句式有完全一致的,则进入该句式标注的意图,若没有,则寻找训练集中最接近的样本。

需要注意的是,若词典中没有澄清的词值,则会一直提醒澄清,直到设定的最大次数,所以总的来说,词典是尽可能要完善的。

总之,UNIT平台对于像我这种刚刚接触NLP/NLU的人还是很友好的,图形界面完好地封装了用户接口,即使不太懂内部机制原理也可以较好地定义对话/问答系统,上手比较容易,但是对于理论研究,就比较吃力,作用不是很大,大体能够了解监督学习的过程。

接下来会看关于CNN、RNN、LSTM、Attention具体机制,深入到NLP理论研究去。