1、对话系统主要分为三类:闲聊型+任务导向型+问答型
闲聊型:就是瞎聊,想聊啥就 聊啥
任务导向型:考虑多轮对话,根据对话的不同状态和槽位值进行回复策略的选择
问答型:一问一答,识别询问者的意图,从知识库中选取答案进行返回
2、任务导向型:pipeline系统+端到端系统
pipeline系统:自然语言理解(槽值意图的识别)+对话状态跟踪+对话策略+自然语言生成
对话状态跟踪和对话策略统称为对话管理模块DM,就是做状态的跳转
优势:可解释性强,易于落地。
缺点:不够灵活,各模块之间独立,难以联合调优,误差会层层累积
端到端系统:自然语言输入 ---> 自然语言输出(中间是整体映射体系,类似于seq2seq)
优势:灵活性强,可拓展性高
缺点:对数据的数量和质量要求高,建模不明确,还在探索中
整体存在的问题:DM通常建立在一个明确的话术体系内,用户的行为如果我们不在我们的话术体系内,有新的意图进来, 怎么办?这就是可拓展性差!还存在冷启动问题+训练效率低
1、可拓展性差:变化的用户意图+变化的槽位和槽值+变化的系统动作
变化的用户意图:用户输入中出现了未在模型中的意图。原模型意图种类20个,模型输出是1*20的one-hot向量,新增意图时模型就要重新训练,输出一个1*21的one-hot向量。
解决1:知识蒸馏:一个“老师-学生”学习架构,之前是为了解决大模型耗时严重准确率高,小模型准确率低耗时少的问题。
- 正常训练大模型
- 训练小模型,计算小模型的两个loss,一个是soft target,一个是hard target,同一个输入,计算大模型的softtarget(软化过,即概率/T)与小模型的soft target计算交叉熵,真实标签和小模型的hard target做交叉熵,这两个交叉熵加权叠加
- 预测时就是常规预测
- 这里的做法是:对于旧的意图集合,旧模型的概率输出直接指导训练新的模型;对于新增的意图,对应的逻辑规则为新的标注数据来训练新模型。但这样做还是明显训练了新的模型,但是减少了训练量,因为使用了旧模型。
解决2:CDSSM:语义相似性匹配(DSSM貌似在推荐方面用的比较多,把两个文本转成向量做相似度计算)
- 利用训练集中用户意图的自然描述直接学习出一个意图向量的编码器(这是不是和小样本学习有点像,里面C-way学习的就是一个类的向量表示)
- 将任意意图嵌入到一个高维语义空间,进而再做意图识别。
- 个人观点:如果进来新的意图,用原来的模型得到新意图的向量表示,这个表示不一定和别的意图有很好的区分性,我们没有训练过它且我们本身就不知道它是什么意图,除非标注过。
解决3:人机协同:解析到新的意图时返回给人工进行处理,人工处理的数据可以转换成文本作为我们新意图的训练数据。
变化的槽位和槽值:
- 槽值不固定:多轮对话中对每个槽位维护一个有限的槽值集合,当前对话轮次时,获取新的槽值,对该槽位的槽值集合进行打分排序,输出概率最高的结果。打分都比较高的话可以发出澄清话术。
- 槽位不固定:槽位描述编码器?对任何槽位(无论见没见过)进行编码,得到该槽位的语义向量,然后和用户语句一起作为输入,采用序列标注的方式得到识别的槽值。(如果是一个新的槽位,用什么当做输入到槽位呢??????)所以论文做了一个假设,任何槽位的自然描述很容易得到。
- 变化的系统动作:略,论文没看过不是很明白,后续再补上吧
2、标注数据少:我当时自己标注样本是真的标注到快崩溃,几万的样本,看的眼都花了。
1、用机器自动标注数据,降低数据标注的成本
2、对话结构挖掘,尽可能高效利用无标注数据
3、加强数据采集策略,高效获取优质的数据
3、训练效率低:增强学习