如图1 所示,机器学习的目标是要找一个函数f,这个函数可以是一个分类器,把几百张图 片输入进去,分类器就告诉我们分类的结果。元学习一样是找一个函数,但它要找的是一个学 习算法Fϕ∗,这个学习算法可以接受训练数据,然后输出一个分类器f。这个Fϕ∗ 将训练数据 作为输入,它直接输出训练的分类结果f,这个f 就是我们想要的分类器。
图1 元学习和机器学习的目标
从训练数据角度分析,在机器学习里面,我们是拿某一个任务里面的训练数据进行训练, 而在元学习中我们是拿训练的任务来进行训练。这个很容易搞混,所以在文献中,我们会把任 务里面的训练数据叫做支持(support),把测试数据叫做查询(query)。在元学习里面,我们 是拿查询来进行训练,而在机器学习里面,我们是拿支持来进行训练。
那在机器学习里面,我们需要手动设置一个学习算法,而在元学习里面,我们是有一系列 的训练任务,所以我们也将元学习中的学习算法部分的学习称为跨任务学习。而对应的机器 学习中的学习称为单一任务学习,因为我们是在一个任务里面进行学习。
我们再看一下两者的完整框架,如图2所示。在机器学习中,完整的框架就是把训练 数据拿去产生一个分类器,接着再把测试数据输入到这个分类器里面得出分类的结果。而在 元学习中,我们是有一些训练的任务,把这些训练的任务拿来产生一个学出来的学习算法叫 做Fϕ∗。对于接下来的测试任务,测试任务里面有支持数据和查询数据,我们再把这个测试任务里面的训练数据输入到学习出来的学习算法里面,得到一个分类器后,再把测试数据输入 进去,得到分类的结果。我们把元学习里面的这个测试叫做跨任务测试,因为它不是一般的测 试。一般的机器学习,我们的这个测试叫做单一任务测试,因为我们是在一个任务里面进行测 试。在元学习里面,我们要测试的不是一个分类表现的好坏,而是一个学习算法的表现的好 坏,所以在元学习里面为跨任务的测试。那有时候我们也在一些论文中会看到整个流程中一 次单一任务的训练和一次跨任务的测试,我们把这个流程叫做一个回合。所以在元学习里面, 我们是在一个回合里面进行训练和测试,而在机器学习里面,我们是在一个任务里面进行训 练和测试。
图2 元学习和机器学习的框架对比
对于损失,在机器学习中我们使用 表示损失函数,其中 表示第k 个 训练样本的损失,其中的加和为所有训练数据在一个任务中的损失总和。在元学习里面,我们 使用 表示损失函数,其中的 表示第n个测试样本中的损失,其中的加和 为在所有任务中的损失总和。
对于训练的过程两者也有一些差异,元学习的训练需要算ln,也就是计算每一个小任务 的损失函数,在这个过程中,我们需要做一次单一任务的训练+测试,也就是一个回合。现在假设我们的优化算法中,要找一个ϕ让L(ϕ)最小,那做这件事情的时候,我们需要算这个 L 很多次,也就是跨任务的训练包含了很多次的单一任务的训练+测试。这个是非常复杂的 且耗时的。所以在文献中,学习如何去初始化整个过程的工作中,往往把跨任务训练叫做外循 环,把单一任务训练叫做内循环。这是因为在跨任务训练里要跑好几次单一任务训练,所以跨 任务训练是外循环,单一任务训练是内循环。不过,外循环和内循环这些称呼通常只有在学习 初始化的工作中才会有,其他时候通常也不会这样叫。
刚才介绍的都是元学习和机器学习的差别,他们其实也有很多的共同之处,事实上很多 在机器学习那边学到的知识和基本概念都可以直接搬到元学习来。举例来说,在机器学习上 面你会害怕训练数据上可能会有过拟合的问题,那在元学习里面也有可能会有过拟合的问题, 比如机器学习到了一个学习算法,这个学习算法在训练任务上做得很好,面对一个新的测试 的任务反而会做得不好,所以元学习也有可能有过拟合的问题。如果遇到过拟合问题应该怎 么办呢?我们类比一下机器学习,在机器学习里面,最直观的方法就是收集更多的训练数据, 所以在元学习里面也可以做一样的事——收集更多的训练任务。也就是如果训练的任务越多, 就代表训练的数据样本越多,那学习算法就越有机会可以泛化并用到新的任务上面。
另外,我们在机器学习上会做数据增强,也就是在训练的时候,我们会把训练数据做一些 变化,比如说把图片做一些旋转、平移、缩放等等,这样可以让训练数据更多。在元学习里面 我们同样也可以做数据增强,也可以想一些方法来增加训练任务,比如说我们可以把训练任 务做一些变化,比如说把训练任务的类别做一些变化,或者把训练任务的数据做一些变化等 等。此外,我们在做元学习的时候还是要做优化,我们还是要想办法去找一个ϕ让l(ϕ)越小 越好。假设我们最小化l(ϕ) 的方法是梯度下降法,那我们在做梯度下降法的时候,我们还是 要去调学习率,只不过与机器学习不同,我们需要调整的参数是可学习的学习算法的参数。有 人可能会问,既然都要调整参数,那我何必还要用元学习,直接讲每一个机器学习的问题调整 参数不就可以了吗?其实并不是,因为在元学习里面,我们只需要把学习算法的参数调整好, 其就可以一劳永逸的使用到其他的任务当中,而不需要每一个任务都去调整参数。这样的话, 我们就可以节省很多的时间,也可以让我们的学习算法更加的有效率。
那既然说到要调参数就遇到另一个问题了,在机器学习中我们不仅仅有训练样本和测试 样本,同时还有验证集的样本,用验证集样本中的表现来选择你的模型。所以元学习中也应该 要有用于验证的任务,也就是说在元学习中,我们应该要有训练任务、验证任务和测试任务。 其中验证任务来决定训练学习算法的时候的一些超参数,然后才跑在测试的任务中。