【CCSNLP会议汇报:初探迁移学习在任务型对话系统的应用】学习记录

【CCSNLP会议汇报:初探迁移学习在任务型对话系统的应用】学习记录

人机对话得到了越来越多的关注,有越来越多关于人机对话的研究。

如果按照功能来说,人机对话可以分为以下几个类型。有的大型的对话系统可能将以下四个功能全部包含,今天讲者汇报的方面是任务型对话方面。

主要的对话系统的结构有两种:一种是Pipeline,一种是端到端的结构。Pipeline结构是在剑桥大学提出之后开始风行的,他的模块中会包含一些子模块。比如输入一个问题“帮我订一张去北京的机票”,之后会经过很多子模块,比如自然语言理解模块、对话管理模块,各个子模块之间会有信息传递与交互,最后生成一个句子“请问您从哪里出发”。

近些年学术界也在关注端到端的模块,端到端是指不关注里面的子模块,而是让输入进入到一个神经网络的黑盒,直接生成回答。

接下来详细介绍一下Pipline系统的一个例子,比如我们向系统中输入“帮我订一张去北京的机票”之后,会经历自然语言理解(NLU)模块,会进行领域识别、意图识别、语义槽填充,其中领域是“机票领域”、意图是“订购机票”、语义槽是“到达地为北京”。之后交给对话管理模块(DM),可以发现当前的对话状态只有语义槽到达地是“北京”,而其他语义槽都是空的状态,追踪到对话状态后,我们和知识库进行沟通,得到对话策略,之后再进入自然语言生成模块(NLG),生成理想的答句。

Pipline的结构的缺点在于:

1,错误级联:先头子任务有错的话,便会影响后续的子任务;

2,各模块数据标注代价大:既然已经将一个大任务分解为各个子任务,那么便需要对各个子任务进行数据标注,代价很大。

正因如此,我们希望是一个端到端的系统,即我们输入一个句子之后,直接得到对该句话的回答。

任务型对话系统已经由于深度学习技术的帮助下取得了较大的进步,但是仍然存在一定的问题。基于深度学习的网络需要大量的标注数据,但是大规模、高质量的标注数据是很难获得的,尤其对话领域需要大量的领域知识、常识知识等。

在之前的数据集MultiWOZ中,8k的数据就许哟啊1k的工人去标注,而且具有很多的错误。

然而对话系统又涉及不同的领域与多种的语言。在这么多变量的情况下,我们缺少很多的训练数据。

讲者在解决任务型对话系统中数据不足问题的解法是”迁移学习“。

在之前的综述中已经说明了,基于预训练范式的模型可以让对话系统取得较好的效果。讲者将主要针对于跨领域与跨语言的迁移学习进行讲解。

讲者介绍的第一份工作是Pipline结构对话系统中自然语言理解模块的工作。

我们可以将自然语言理解模块中语义槽填充理解为”序列标注“任务,可以将意图分类任务理解为”分类问题“。这两个子任务是紧密相关的,如果意图识别准确的话,可以在语义槽填充任务中获得很好的指导作用。比如上例"watch action movie",由于先将意图识别为"看电影",最后才将action识别为"电影类型",而不是"音乐类型"。所以如果意图识别做的很好的话,可以大大的帮助槽位填充任务减少歧义。

讲者介绍了一下意识识别和槽位填充这两个任务合并的前人工作。

2016年发表在IJCAI的工作首次将意识识别和槽位填充两个任务一起进行训练,之后就再也没有人将两个任务分开训练了,因为人们了解两个任务同时训练会得到不错的效果。该任务是用一个GRU框架作为encoder,之后训练两个decoder分别作为意识识别和槽位填充的输出。其中每一个时刻出来的向量作为槽值填充的输出;编码句子后通过max-pooling的输出作为意识识别的输出。

另一个前人的工作认为意图识别和槽位填充两个任务既然是相辅相成的关系,那么应该用一个显式的去构建其中的关系。涉及一个Slot-gate机制计算intent向量和slot向量的关系g,如果g约大则意识和槽位的关联程度则越大。

讲者自己的方法:以往的联合学习的方法是一个encoder,两个decoder。作者的想法是既然意图识别对槽位填充具有很大的价值,那先进行意图识别,之后再把意图识别的输出作为槽位填充的输入,让意图识别的输出去显式的指导槽位填充。

讲者是如此涉及模型的。首先用一个Self-Attentive Encoder去建模各个词向量,之后进行意识识别,最后将意识识别的输出作为槽位填充的输入。

讲者创新性的提出了一个Token-level的意图识别。为什么可以在token级别进行意图识别呢?是因为讲者用的是self attentive encoder,这样每一个token的embedding就包含了其他词语的embedding。在句子级别的意图识别时,讲者采用的是token级别的意图进行投票,将投票结果作为最终的句子级别的意图。这样设计的另一个好处就是原来句子级别的意图识别如果预测错了,那么会影响到后续的预测,但是投票的规则具有一定的容错性,即使有的预测错了,但是也可以通过其他预测正确的拉回来。

讲者认为对话情感分析和对话行为识别是两个相关性很强的任务。比如说user A所说的话的情感是Negative的,User B的对话act是同意,这就对预测user B的情感有很重要的任务。

前人的工作是用一个Bi-LSTM模型去encoder这个句子,之后用两个decoder去输出句子的情感和对话act,但是仍旧没有让两个任务交互。

讲者显式的建模两个任务之间的联系,并且提出三种交互方式。

讲者将用双向LSTM去建模这个句子,之后用句子级的自注意力机制得到句子的embedding,之后显示的将两个任务进行交互,最终得到两个任务的输出。

讲者认为之前DCR-Net的工作利用了历史信息,利用了交互信息,可以认为两者是一种pipeline的方式,之前没有工作将历史信息和交互信息相互影响的,那么能不能有模型可以显示的建模两种信息,并且让这两种信息相互的进行更新呢?

首先用双向LSTM建模user说的话,之后用Speaker-Aware Encoder建模对话者说话的前后逻辑,之后再利用GAT对图结构进行更新,利用图结构去显示的建模上下文信息和任务之间的交互信息,最后生成对话act的预测和对话情感的分类。

接下来看一下讲者团队在跨领域迁移学习的工作。

讲者的应用背景是端到端的任务型对话系统。

端到端的任务型对话系统会根据对话历史去知识库中对问题进行查询,之后再输出话语。根据对话历史去知识库中进行知识查询是任务型对话系统的重要特征。

假设我们具有大量标注数据的电影领域和机票领域,但是任务中音乐领域却存在很少的标注数据,那么我们有什么方法可以从大量标注的领域中迁移知识到少量标注的领域,让少量标注领域的性能高一些呢?

现有的方法是用两个领域的数据一起放入到model中,从而得到一个可以在两个领域都表现不错的模型,这样做一定是可行的,但是这样做忽略了该领域的私有特征。

也有人将每个领域的数据单独剥离出来,从而训练各个领域的model,这样做无法利用领域之间的知识,也无法利用领域共享的特征。

基础的方法是设计一个共享的模型去学习混合的数据,再设计另外几个私有的模型学习各自领域的数据,最后将他们进行融合。

但是这样做也是有一定缺陷的:

1,如果某一领域数据十分匮乏,那么匮乏的数据是非常难以训练出好模型的

2,忽略了领域之间的联系,比如电影领域和音乐领域非常相关,但是电影领域和订机票领域却没有什么关联。也就是领域之间是存在相关性的。

讲者提出动态的聚合网络去细粒度的建模领域之间的关系,讲者期待可以把领域之间的相关性表示出来,之后再通过专家机制得到领域的私有特征。

数据进入模型以后,会进入到所有领域模块,然后通过一种类似于子注意力网络的机制计算出其和各个领域之间的相关性,再加权求和,同时也会对私有的模块进行对抗性的训练。

之后是关于跨语言迁移的对话系统。

跨语言框架的应用背景是Zero-shot的框架。我们只会在源语言中有标注语料库,然后通过学习算法去学习好我们的模型,而在目标语言中没有任何的标注数据。

前任的工作使用mBERT模型将多个语言的数据进行混合输入,但是对于单一的句子而言,仍然是单语言的环境,其缺点在于并没有对两个语言的数据进行对齐。

前人的工作就是设计算法将两种语言之间进行对齐。

其缺陷在于任何两种语言都需要进行对齐,如果是十种语言的话,则要对十种语言都进行对齐,比较复杂。那么有没有方法可以不进行对齐也可以拥有比较好的效果呢?

讲者提出的方法非常简单有效。讲者并没有对模型进行更改和优化,讲者是对输入进行更改,讲者随机的将源数据中的部分单词更改为目的语言的单词,之后再进入到模型中进行训练。

方法流程就是:选择句子、选择单词、对单词进行替换。

方法示例就是通过单词替换后对齐进行训练,在测试任务中,用目标语言进行测试。

为什么该方法如此有效呢?以情感识别作为例子,"I like you"是一个正向的句子,我们仅仅替换其中一个单词,“I 喜欢 you”也是一个正向的句子,其他上下文的影响是不变的,这无形中就对齐了替换单词在两种语言中的表示。

发布于 2020-12-27 22:53