文章提出了一种新的元学习 (Meta-learning) 的算法,这种算法与模型无关,也就是说可以用于任何模型,唯一的要求就是模型是使用梯度下降的方式来训练的(至少在我接触的论文大部分都是这样子来训练的)。由于算法与模型无关,所以可以用于大量的学习问题,比如分类、回归和强化学习等。元学习的目标是使用大量的学习任务来学习模型,使得模型可以仅仅使用少量的训练样本就可以解决新的任务。
在文章的方法中,模型的参数被显式的训练,目的是希望使用来自新任务的少量的训练数据然后进行几步梯度下降就可以在这个新任务上取得很好地泛化性能。实际上,目的是为模型学习一个易于微调的初始化参数。
(1)新的任务(新的类);(2)训练样本很少;(3)学习一个易于微调的初始化参数;
这三个特征满足 few-shot learning,meta-learning 的基本特征,而且可以看成属于 meta-learning 中的学习微调 (Learning to Fine-Tune)。
(推荐阅读以下链接,对理解本文很有帮助:https://blog.csdn.net/weixin_37589575/article/details/92801610)
快速学习是人类智能的标志之一,比如只需要几个样本就可以快速识别目标,比如可以体验几分钟就可以快速学习新的技能。这也对我们的人工智能提出了要求:从很少的新样本中快速学习和适应,并且可以随着样本数的增加而进一步调整适应。这种快速灵活的人工智能是很具有挑战性的,因为它必须快速整合来自新样本的信息和先验知识,同事避免在新任务上出现过拟合(overfitting)的情况。此外,先验知识和新数据的形式可能和任务息息相关,为了最大限度的可适用性,学会学习(learning to learn)或者叫做元学习(meta-learning)的机制必须对于任务和完成任务所需要的计算足够通用。
本文提出了一种元学习算法是通用的并且与模型无关的,唯一的要求就是模型是使用梯度下降来训练的。因此算法可以用于满足唯一要求的任何模型、任何问题设置,比如文中的分类问题、回归问题以及策略梯度强化学习问题。元学习中,被训练好的模型应该可以从来自新任务的很好地样本中快速学习这个新的任务。模型被元学习者(meta-learner)训练,可以在大量的不同的任务上学习。MAML 的核心思想就是:训练模型的初始化参数,使得模型在新的任务上使用很少的样本,进行一次或几次梯度下降就可以取得最大化的表现。
模型的特点(优点):
学习好的初始化参数的过程,可以从下面两个角度看:
文章的贡献:
MAML 的问题还是最典型的 few-shot learning 问题的设置,就以 few-shot classification 问题为例,回归和强化问题类似。问题设置参考上面提到的博客或者博客: https://blog.csdn.net/weixin_37589575/article/details/92768668
这里为了方便读者和自己理解,对原论文的这一部分做了修改,用了最 meta-leaning 的解释,其实本质是一样的。
在 few-shot learning 中有一个术语叫做 N N N-way K K K-shot 问题,简单的说就是我们需要分类的样本属于 N N N 个类中一种,但是我们每个类训练集中的样本只有 K K K 个,即一共只有 N ∗ K N * K N∗K 个样本的类别是已知的(其实这就是 Support Set)。
在 Meta-learning 中之前学习的 task 我们称为 meta-training task,我们遇到的新的 task(包含新的类)称为 meta-testing task。因为每一个 task 都有自己的训练集和测试集,因此为了不引起混淆,我们把 task 内部的训练集和测试集一般称为 Support set 和 Query set。简单画了一个示意图,前面三个是三个 meta-training task (当然实际需要很多这样的 meta-training tasks 才能学到我们需要的先验知识),最后一个就是 meta-testing task。我们最后评价我们的 meta-learning 方法的好坏就是在红色标记部分上的 performance。
不同于其他方法,例如有的方法训练一个循环神经网络(RNN)来吸收整个数据集(概述博客中的基于 RNN 记忆的方法)或者结合无参数的特征 embedding 的方法(概述博客中的度量学习),MAML 使用元学习的学习机制学习一个好的初始化参数准备对于新任务的快速适应。
学习的初始化参数(内在特征表示)应该适用于大量的各种的任务,而不是单单某一个任务。
使模型的参数对于任务的改变是敏感的,这样参数上的小的改变可以给新任务的损失带来巨大的改进。
问题是如何使初始化参数具有这种性质呢?
假设模型为 f θ f_{\theta} fθ,参数为 θ \theta θ,并且损失函数对于参数 θ \theta θ 足够光滑,这样就可以使用基于梯度的学习训练策略。对于某一个任务 – meta-training task, T i \mathcal{T}_{i} Ti, 模型的参数使用梯度下降变为 θ ′ \theta^{\prime} θ′。下降的次数可以为一次或者多次,文章和本博客为了简洁,只表示一次梯度下降。多次梯度下降很容易推导出:
θ i ′ = θ − α ∇ θ L T i ( f θ ) \theta_{i}^{\prime}=\theta-\alpha \nabla_{\theta} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta}\right) θi′=θ−α∇θLTi(fθ) (1)
其中 α \alpha α 是学习步长,或者叫做任务学习率(task learning rate),可以是一个超参数,也可以是一个学习得来的参数。 L T i ( f θ ) \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta}\right) LTi(fθ),是使用参数 θ \theta θ 在任务 T i \mathcal{T}_{i} Ti 上的损失函数, ∇ θ L T i ( f θ ) \nabla_{\theta} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta}\right) ∇θLTi(fθ) 是损失函数相对于参数 θ \theta θ 的梯度。
但是最最关键的地方来了,上面只是在一个任务上更新了参数,时时刻刻记住我们的想法:训练模型的初始化参数,使得模型在新的任务上使用很少的样本,进行一次或几次梯度下降就可以取得最大化的表现。学习的初始化参数(内在特征表示)应该适用于大量的各种的任务,而不是单单某一个任务。
因此模型参数的更新是这样子更新的:
θ ← θ − β ∇ θ ∑ T i ∼ p ( T ) L T i ( f θ i ′ ) \theta \leftarrow \theta-\beta \nabla_{\theta} \sum_{\mathcal{T}_{i} \sim p(\mathcal{T})} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta_{i}^{\prime}}\right) θ←θ−β∇θ∑Ti∼p(T)LTi(fθi′) (2)
其中 β \beta β 叫做元学习步长,也叫作元学习率 (meta-learning rate)。 p ( T ) p(\mathcal{T}) p(T) 是 meta-training tasks 的任务分布,其实就是在 meta-training tasks 采样出 task 来 meta-training,因为一次可以采样多个,所以有一个求和。我做了一个简单的参数示意图帮助大家和我自己理解:
比如我们一次学习 3 个任务,然后用最开始的参数参数 θ \theta θ 分别在这三个任务上 T 1 \mathcal{T}_{1} T1, T 2 \mathcal{T}_{2} T2, T 3 \mathcal{T}_{3} T3 进行梯度下降
θ i ′ = θ − α ∇ θ L T i ( f θ ) \theta_{i}^{\prime}=\theta-\alpha \nabla_{\theta} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta}\right) θi′=θ−α∇θLTi(fθ)
获得分别对应于 3 个任务的三个参数 θ 1 ′ \theta_{1}^{\prime} θ1′, θ 2 ′ \theta_{2}^{\prime} θ2′, θ 3 ′ \theta_{3}^{\prime} θ3′。然后使用
θ ← θ − β ∇ θ ∑ T i ∼ p ( T ) L T i ( f θ i ′ ) \theta \leftarrow \theta-\beta \nabla_{\theta} \sum_{\mathcal{T}_{i} \sim p(\mathcal{T})} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta_{i}^{\prime}}\right) θ←θ−β∇θ∑Ti∼p(T)LTi(fθi′)
进行参数更新,得到新一轮的初始化参数 θ \theta θ。反复进行很多次,最终 meta-training 的结果就是初始化参数 θ \theta θ。在面对新的任务的时候,我们还需要对 θ \theta θ 进行一次或几次的梯度更新:
θ i ′ = θ − α ∇ θ L T i ( f θ ) \theta_{i}^{\prime}=\theta-\alpha \nabla_{\theta} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta}\right) θi′=θ−α∇θLTi(fθ)
例如文章中分类问题的例子,其实算法第 5 行中的 D \mathcal{D} D 就是任务 T i \mathcal{T}_{i} Ti 中的 Support Set (支持集),而算法第 8 行中 D ′ \mathcal{D}^{\prime} D′ 就是任务 T i \mathcal{T}_{i} Ti 中的 Query Set (查询集)。
注意:这算法只是 meta-training 的算法,如果要进行 meta-testing 还需要在新任务上的 Support Set (支持集)进行微调 – 因为我们仅仅训练的一个适合于大量任务的初始化参数。你想得到适合这个新任务的某一特定参数,还需要用这个任务的支持集来微调
从第一张图和两个核心公式看出,参数更新可以按照如下方式理解。
先用初始化参数 θ \theta θ 在某个任务上计算损失函数,然后几步梯度下降更新为 θ ′ \theta^{\prime} θ′,我们再用新的参数 θ ′ \theta^{\prime} θ′ 计算一下损失,看看是不是几步梯度下降了是不是改善了效果:这就是 ∇ θ ∑ T i ∼ p ( T ) L T i ( f θ ′ ) \nabla_{\theta} \sum_{\mathcal{T}_{i} \sim p(\mathcal{T})} \mathcal{L}_{\mathcal{T}_{i}}\left(f_{\theta^{\prime}}\right) ∇θ∑Ti∼p(T)LTi(fθ′) 这一部分的直觉表述,然后我们知道了这个初始化参数 θ \theta θ 需要如何调整,使得可以在遇到新的任务上几步梯度下降就可以很大地改善了效果。这就是公式 2 的直觉表达。这样多次执行,我们的初始化参数 θ \theta θ 被反复激励,最后真的可以在新的任务上几步梯度下降就可以很大地改善了效果。
我们一定要记住:我们无论是学习过程中,还是最后 meta-training 完了之后 θ \theta θ 都是相对于任务的初始化参数,它是适合于大量的任务,但是对于某一个确定的任务,还需要进行微调。我们 meta-testing 的时候,要用新任务上的少量的样本使用公式 1 进行梯度下降,得到 θ ′ \theta^{\prime} θ′,这才是我们用来测试学习新任务学习情况的参数。所以 MAML 被我在概述中分类为学习微调 (learning to fine-tuning)中去。
实验,结论,强化学习的相关部分等请参考原论文。
《Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks》:https://www.cs.utexas.edu/~sniekum/classes/RL-F17/papers/Meta.pdf