一、前言
元学习近几年也算是一个比较热门的研究方向,大部分被用来解决低资源少样本零样本学习的任务场景中。
那么为什么元学习可以提升低资源少样本的学习效果呢?活着说元学习到底是一个什么阳的算法呢?
这里做一个简单的概念阐述。元学习的目标是让模型学会学习,一般传统的训练方法都是让模型直接对所有数据集进行统一的训练,得到了一套对所有数据集泛化能力都不错的模型参数,但这样有个问题,在具体的某种类型的数据集上,可能效果就会比较一般。
我们可以这样理解,同样是文本情感分类任务,假设只需要对文本进行2分类即可(正向情感或者负面情感),现在有个NLP模型,然后我们获取了来自电商的情感数据、来自小说的情感数据还有来自游戏评价的情感文本数据。那么这里就会有个问题,同样都是情感的2分类数据,但是因为背景不同,这3类数据集信息的细节上是存在一定差异的,如果是直接粗暴的把这3类数据集混合在一起训练,那么也能得到一套很不错的模型参数,同样在这3类任务上也能得到一个不错的表现,但是此时如果来了第4种数据源的情感文本数据集(比如美食评价的情感数据),而且第4种数据集很少,那么模型在第4种数据集上进行训练,模型的参数更新的过程可能会比较受限,其原因是第4种数据集太少了,不足以撼动在前3种丰富的数据集上学习到的参数内容。也就是说因为第4种数据集太少,而当前模型的参数主要都是学习的前3种数据集的信息分布,使得转换到第4种数据集上微调得到的参数能够表达的内容比较有限。
现在我们换个思路,我们让模型学会学习,当引入前3种数据集时,我们分别把每种数据集单独送给模型,能模型做的第一件事就是根据当前数据集的内容,能够快速生成一套比较符合当前数据集内容的参数,然后在这套参数的基础上再进行微调,那么这样学习到的模型效果肯定鲁棒性更好,就算第4种数据集来了,虽然第4种数据集很少,但是模型已经具备这种根据数据集内容生成一套合适参数的能力,那么也可以马上根据第4种数据集的数据分布,先生成一套很合适的参数,然后在这套参数的基础上进行微调,那么效果就会更好。这种思路就是元学习,这也就是为啥元学习可以比较好解决低资源少样本任务的原因。
二、元学习的训练方式:外循环和内循环
我们前面已经提到了元学习的基本概念,简单粗暴来说就是模型先根据输入的数据内容自动生成一套新的参数,然后在这套参数的基础上进行具体任务的微调。那么如何做到这个功能呢?这就涉及到元学习的训练方式:外循环训练和内循环训练。因为外循环和内循环是两个不同的训练过程,因此也涉及到两套训练数据,支持集(Support Datasets)和查询集(Query Datasets),你可以理解为把原来本来用来直接训练的同一份数据集一分为2,分成了支持集和查询集。
外循环:它负责优化模型的参数和超参数,以适应不同的任务。外循环的目标是学习如何在多个任务之间快速适应,并生成一个泛化能力更强的模型。外循环需要用到查询集,外循环的目的就是根据当前输入的数据内容快速更新生成一套更加合适当前任务场景的模型参数,所以查询集的名字也是这么来的:用于从模型中查询适用于当前任务场景的模型参数。
内循环:我们在外循环已经更新模型参数得到了一套理论上认为是符合当前任务场景的模型参数。因此现在内循环就是在这套参数的基础上进行更加细化的微调训练,让模型更好的学习当前任务场景数据内容。内循环用到的数据集是支持集。
下面贴一个元学习的训练流程示意图,贴图来源于:Universal Information Extraction with Meta-Pretrained Self-Retrieval。需要注意,内循环和外循环是两个独立的训练过程,使用的学习率这些都不一样。
关于上图的训练流程解释,首先模型是在内循环进行模型参数更新,得到了参数,让模型认为这就是符合当前任务场景最合适的参数。然后在外训练基于这套参数进行训练更新模型参数,让模型学会快熟适应不同任务。
希望我的分享对你有帮助,如果有问题请及时指正,谢谢~