Multitask指多任务学习,大致意思是一个NLP的模型可以完成多种任务。
一、单任务学习的局限和特点 由于{dataset,task,model,metric}等的发展,近年来single-task取得了很好的效果当训练集足够大,能够很容易局部最优对于通常更常用的AI,需要针对single-model的持续的学习(continus-learning),即很多时候不需要从头开始,顺着上次的结果接着训练模型很多时候随机初始化,或者仅仅是采用部分的预训练(partly)上述特点或者局限决定了需要一种更为通用的预训练或者分享知识的手段,于是就提出了Muliti-task learning。
Pre-training and sharing knowledge is great在计算机视觉中:
imagenet +cnn取得巨大的成功同时,classifcation也作为视觉中的一个常用的块,可以用于计算机视觉领域中的其他任务在NLP中:
Word2Vec, GloVe, CoVe, ELMo, BERT等迁移学习的思想也开始逐渐成功但是没有这种single blocking task所以在NLP中有发展multi-task的必要。
Why has weight & model sharing not happened as much in NLP?课程解释了一下为什么NLP中sharing不是很广泛,总结如下:
NLP任务所需求的类型多:包括逻辑,语法,情绪,视觉等等,不容易用一个通用的模型来表达。由于语言的特点,需要长期或者短期不同的记忆很多NLP任务被划为多个任务来进行简化,以取得更好的进展。NLP比较复杂,不太容用一个简单的无监督模型来解决相关问题,因此multi-task也应该是有监督的。
Why a unified multi-task model for NLP?课程认为一个multi-task model应该具备以下条件:
它应该是一个通用的blocker块在NLP系统中(对应于cv中的imagenet+cnn)这个统一的模型至少决定了如何进行transfer knowlege(domain adaptation,weight sharing, transfer and zero shot learning)
剩下的如图所示:
进行Multi-task任务的第一个问题就是如何用一个通用的task来表达很多tasks,课程首先总结了,常见的nlp任务分类:
课程认为这些task都可以等效成下面这些task中的一个,称为equivalent supertasks ,如图所示:
课程把整合后task的形象称为:Natural Language Decathlon(decaNLP),整合的例子如图所示:
上面整合的十项任务是:
课程做了一些说明:
对于decalNLP的设计,应该符合以下要求:
并不是针对特定任务的,即通用的,t输入到模型里面并不做task的分类,而是直接用,因为一般认为task id是不可用的。应当能在内部进行调整,去执行不同的任务应当由留有一定的零次推理(zero-shot inference)的能力(具有高度拓展性) A Multitask Question Answering Network for decaNLPsuozuo课程介绍了他们的工作,就这篇论文,论文的主要思路如下:
其模型结构如图所示:
首先是一个Fixed Glove+Character 的n-gram embeddings(固定是为了防止某些task数据量太小,对词向量产生负面影响。)
之后进入一个Linear,再之后输入到一个Shared BiLSTM with skip connection层中,如图:
其中这个Shared BiLSTM前面采用了co-attention机制,如图中的红色块(以前的课程讲过)。再之后,将question和context分开,分别输入到transfomer中进行编码,再输入到另外一个 BiLSTM中得到最终编码final encode。如图所示:
接着使用transformer中的具有自回归倾向的解码器进行解码,解码头(head)采用的是lstm decode去计算attention distributions over the context and question(which are used as pointers),如图所示:
通过计算question attention和context attention去确定两个开关,gamma和lambda来决定生成的vocabulary从哪个词分布中选择生,如图:
作者选取了多个任务多个数据集和多个评价指标,最终的评价指标得分是所有得分的和,如图:
接着和普通的single-task做对比,绘制成了如图所示的表,表的左侧是single-task有40个模型,表的右侧是multitask只用了4个模型。
课程仔细分析了以下这个表,总结出了一些特点:
课程继续将了训练策略,采用fully joint的方法进行训练效果比较好,即将每个task的数据集处理成一个batch,然后依次送入模型训练,如图:
后来发现,输入训练数据集的顺序也会对模型的效果产生影响,比如如果前面训练的数据太简单的话,有可能会使模型陷入局部优化,难以爬出来。对于多任务模型,不同任务的数据集的影响就会更大。所以采用了Anti-Curriculum Pre-training的训练策略。
Curriculum是从简单到复杂,Anti-Curriculum就是从复杂到简单,这种训练策略就是对任务从复杂到简单排一个序,对任务里面的数据也从复杂到简单排一个序,依次制作成batch输入到模型中进行训练,如图:
batch1 :A,batch2 :B,batch3 :A,batch4 :B,batch5 :C…
这种训练方式带来了一定模型的效果的提升,如图:
课程又介绍了一些其他的实验,也对模型起到了一定的效果,如图:
课程对输出的结果进行分析,比如将输出的词的分布来源统(vocab,context,quesiont)计下来,如图所示:
可以看到该模型针对不同任务的输出的词的分布基本上都是正确的,说明该模型能够区分不同的任务。
decaNLP 确实对模型的预训练起到了很好的效果,比如,这里新加入了一个任务IWSLT language pairs,采用decaNLP的预训练和随机初始化效果很不同,如图所示:
这个模型有助改善零次学习,如图所示: