元学习要解决的问题是给你一堆猫狗图片(训练样本较多),然后给你一类黑天鹅图谱(样本少),让你训练一个模型,能够泛化能力好,识别猫狗和黑天鹅。
使用场景:某些AI分类的训练样本很少,数据分布不均衡,例如上面识别猫狗和黑天鹅的情形。
MAML的思想:先训练猫狗样本,得到初始识别模型,其参数为theta,然后根据黑天鹅的task去针对性迭代,产生新的theta*,在迭代过程中,要满足theta*对task很敏感!就是说识别猫狗的元模型要能快速适应识别黑天鹅。
------原文----
以下是本文的主要框架:
通常在机器学习里,我们会使用某个场景的大量数据来训练模型;然而当场景发生改变,模型就需要重新训练。但是对于人类而言,一个小朋友成长过程中会见过许多物体的照片,某一天,当Ta(第一次)仅仅看了几张狗的照片,就可以很好地对狗和其他物体进行区分。
元学习MetaLearning,含义为学会学习,即learntolearn,就是带着这种对人类这种“学习能力”的期望诞生的。MetaLearning希望使得模型获取一种“学会学习”的能力,使其可以在获取已有“知识”的基础上快速学习新的任务,如:
需要注意的是,虽然同样有“预训练”的意思在里面,但是元学习的内核区别于迁移学习(TransferLearning),关于他们的区别,我会在下文进行阐述。
接下来,我们通过对比机器学习和元学习这两个概念的要素来加深对元学习这个概念的理解。
在机器学习中,训练单位是一条数据,通过数据来对模型进行优化;数据可以分为训练集、测试集和验证集。在元学习中,训练单位分层级了,第一层训练单位是任务,也就是说,元学习中要准备许多任务来进行学习,第二层训练单位才是每个任务对应的数据。
二者的目的都是找一个Function,只是两个Function的功能不同,要做的事情不一样。机器学习中的Function直接作用于特征和标签,去寻找特征与标签之间的关联;而元学习中的Function是用于寻找新的f,新的f才会应用于具体的任务。有种不同阶导数的感觉。又有种老千层饼的感觉,你看到我在第二层,你把我想象成第一层,而其实我在第五层。。。
我们先对比机器学习的过程来进一步理解元学习。如下图所示,机器学习的一般过程如下:
其中,红色方框里的“配置”都是由人为设计的,我们又叫做“超参数“。MetaLearning中希望把这些配置,如网络结构,参数初始化,优化器等由机器自行设计(注:此处区别于AutoML,迁移学习(TransferLearning)和终身学习(LifeLongLearning)),使网络有更强的学习能力和表现。
上文已经提到,【元学习中要准备许多任务来进行学习,而每个任务又有各自的训练集和测试集】。我们结合一个具体的任务,来介绍元学习和MAML的实施过程。
MAML的目的是获取一组更好的模型初始化参数(即让模型自己学会初始化)。我们通过(许多)N-ways,K-shot的任务(训练任务)进行元学习的训练,使得模型学习到“先验知识”(初始化的参数)。这个“先验知识”在新的N-ways,K-shot任务上可以表现的更好。
接下来介绍MAML的算法流程:
这里面有几个小问题:
这三个问题是MAML中很核心的问题,大家可以先思考一下,我们将在后文进行解答。我们先看一下MAML的实现代码。
接下来回答一下上面的三个问题:
问题1:MAML的执行过程与modelpretraining&transferlearning的区别是什么?
我们将metalearning与modelpretraining的loss函数写出来。
注意这两个loss函数的区别:
看一下二者的更新过程简图:
从sense上直观理解:
这里有一个toyexample可以表现MAML的执行过程与modelpretraining&transferlearning的区别。
训练任务:给定N个函数,y=asinx+b(通过给a和b不同的取值可以得到很多sin函数),从每个函数中sample出K个点,用sample出的K个点来预估最初的函数,即求解a和b的值。
训练过程:用这N个训练任务sample出的数据点分别通过MAML与modelpretraining训练网络,得到预训练的参数。
如下图,用橘黄色的sin函数作为测试任务,三角形的点是测试任务中sample出的样本点,在测试任务中,我们希望用sample出的样本点还原橘黄色的线。
问题2:为何在meta网络赋值给具体训练任务(如任务m)后,要先更训练任务的参数,再计算梯度,更新meta网络?
问题3:在更新训练任务的网络时,只走了一步,然后更新meta网络。为什么是一步,可以是多步吗?
李宏毅老师的课程中提到:
那么MAML中的训练任务的网络可以更新多次后,再更新meta网络吗?
我觉得可以。直观上感觉,更新次数决定了子任务对于meta网络的影响程度,我觉得这个步数可以作为一个参数来调。
另外,即将介绍的下一个网络——Reptile,也是对训练任务网络进行多次更新的。