[Few-shot learning] MAML: Model-

2023-03-27  本文已影响0人  一位学有余力的同学

论文:[Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks](# Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks)

台大李宏毅老师的视频课程:Meata learning: MAML

1. Meta Learning

Few-shot leanring的方法可以分为三类:

Model-based方法针对few-shot learning问题特别设计了模型,而MAML允许使用任何模型,所以叫做model-agnostic。

Meta learning可以称为是一种"learn to learn"的学习方法。以往的机器学习任务都是教给模型学习一个任务,但在meta learning中,一次让模型处理好几种任务,让模型学习“学习这件事”,未来有新的任务后模型能够很快进行处理。

Machine learning: machine learning的目的是从训练数据中到一个函数f,即f(x)\longrightarrow y
Meta learning: meta learning的目的是从一系列任务中找到一个函数F,该函数F具有找到新任务函数f的能力,这一个函数f其实是目标任务模型的参数,即F(x)\longrightarrow f

Meta learning的方法可以概括为:

  1. 定义一组学习算法F
  2. 定义一个loss function, 用来评价哪一个学习算法比较好(这里的loss就不再是评价预测和标签是否一致,而是预测f与期望f^{*}是否一致)
  3. 使用梯度下降找到最好的学习算法

2.How MAML works

2.1 Define algorithm F

一般在有监督学习中,我们假设模型参数为\phi \in \Phi,目标函数为:
\underset{\phi}{\text{min}} \, \mathcal{L}_\tau (\phi)
梯度更新的表达式为:
\phi \leftarrow \phi - \alpha \nabla_\phi \mathcal{L}_\tau (\phi) ,
但是使用这样的参数更新方法来处理few-shot问题会导致over-fitting,因为训练样本数量太少而模型参数太多。那么我们是否可以做一个假设,用其他相似的任务对模型进行预训练,然后再将预训练模型应用于目标任务。也就是我们想要从大量的任务中训练一个具有较好泛化性的模型,该模型的参数可以快速适应到其它任务,这就是meta learning。

image.png

对于模型而言,不同的初始化参数会得到不同的训练结果,因此不同的初始化参数会被认为是不同模型,我们的目标是找到最好的(optimal)初始化模型参数,这样使用较少的数据就可以微调模型而不会过拟合。

image.png

2.2 Define loss function

在传统的机器学习算法中,我们需要一个loss function来评价预测结果好坏。同样在meta learning中,我们也需要一个loss function来评价初始化参数的好坏。但是模型参数那么多,如何评价呢?我们可以用相同task的测试集的数据,如果测试集的数据得到的loss小,就表明该初始化参数比较好,反之亦然。

我们用task 1来训练学习算法(learning algorithm)F,会得到一个函数f_1。为了评价f_1好不好,我们可以将task 1的测试数据输入到模型中,得到测试结果的loss值l_1。模型在一个任务上表现好还不够,我们希望模型在很多个任务上都有很好的表现,因此,我们还要测试F在task2,task3,task4……的表现。相应的,我们得到了不同任务的l_2l_3l_4……

所有的任务测试完成之后,我们将所有的loss加起来来评估F的好坏:
L(F)=\sum_{n=1}^{N}l_n
其中,N代表task的数量,l_n是第n个任务的test loss。

image.png

由此可以看到meta learning和传统的machine learning有着很大区别。Machine learning有training data和test data,loss是用training data计算得到的。而meta learning有training tasks和test tasks,training tasks和test tasks又包含training data和test data。

Machine Learning:

Meta Learning:

不过在few-shot learning中,我们通常把training data叫做support set,test data叫做query set。为了与传统的machine learning算法中的training data和test data进行区分,我后面都有叫做support set和query set。

在meta learning中我们不仅要寻找对所有任务都最优的初始化参数,当遇到新任务的时候也要可以微调模型适应新的任务(we will not simply use the data from other tasks to find parameters that are optimal for all tasks, but keep the option to fine-tune our model)。因此优化目标就可以写作:
\underset{\theta}{\text{min}} \, \mathbb{E}_\tau [ \mathcal{L}_\tau (F_\tau(\theta)) ] ,
其中,F_\tau: \Phi \rightarrow \Phi是一个将\theta映射到新的参数向量F_\tau(\theta)的一个优化算法,并且F_\tau可以更具梯度下降算法更新。\theta是由一些列任务学习得到的,它可以被认为是优化器F_\tau的初始化参数,因此是目标任务的元参数(meta-parameter),优化元参数的过程叫做元学习(meta learning)。如果我们能找到一个最优的元参数\theta,我们就可以使用很少的数据fine-tune任何任务而不会过拟合。

更简单一点的表示可以记作(来自李宏毅老师):

  1. 定义评价F的损失函数:
    L(F)=\sum_{n=1}^{N}l_n
  2. 找到最优的F^*:
    F^*=\mathrm{arg} \min_F L(F)

将找到的F^*应用到测试任务中,将测试任务的suppor set输入到F^*,模型会找到一个f^*,将query set输入到f^*中进行测试,可以得到query set的loss,这个loss就是meta learning训练完成后模型的好坏。

2. Model-Agnostic Meta-Learning

Few-shot learning的目标函数:
\underset{\theta}{\text{min}} \, \mathbb{E}_\tau [ \mathcal{L}_\tau (F^{n}_\tau(\theta)) ] , n>0
我们令\tau为训练任务,\tau服从分布\tau_i \sim p(\tau)。任务\tau是从数据集中随即选取的任务,因此它是一个随即变量。

MAML算法的流程如下:

  1. 首先初始化参数\theta
  2. 随机选择一部分任务\tau_i \sim p(\tau)
  3. 对每一个任务使用梯度更新方法\theta _{i}^{'}=\theta -\alpha \nabla _{\theta }\mathcal{L} _{\tau _i}f(\theta ),计算得到该任务下的最优的\theta _{i}^{'}作为初始化参数
  4. 现在我们已经得到了每个任务的初始化参数\theta _{i}^{'},我们要评价学习到的初始化参数\theta _{i}^{'}的好坏,需要借助test data。为了评估training data或者说是(support set)训练得到的初始化参数\theta ^{'}的好坏,将每个任务的test data(或者说是query set)输入到训练后的模型f_{\theta^{'}}中,计算损失函数\mathcal{L} _{\tau _i}(f_{\theta ^{'}_{i}})。因此,优化目标就变成了:\min_{\theta }\sum_{\tau _i\sim p(\tau)}\mathcal{L} _{\tau _i}(f_{\theta ^{'}_{i}})根据步骤3中的公式我们可以得到可以看到:\min_{\theta }\sum_{\tau _i\sim p(\tau)}\mathcal{L} _{\tau _i}(f_{\theta ^{'}_{i}})=\sum_{\tau _i\sim p(\tau)}\mathcal{L}_{\tau _i}(f_{\theta -\alpha \nabla _{\theta }\mathcal{L} _{\tau _i}f(\theta )})这是一个关于\theta求两次梯度的目标函数。则meta-gradient update就可以写成:\theta \gets \theta -\beta \nabla _{\theta }\sum_{\tau _i\sim p(\tau )}\mathcal{L} _{\tau _i}(f_{\theta _{i}^{'}})

算法的为代码如下图所示。


image.png

值得注意的是:meta-gradient update更新的是初始值。初始值\theta会影响训练出来的\theta ^{'},求导记作:
\frac{\partial \mathcal{L} (f_{\theta ^{'}})}{\partial \theta _i} =\sum_{j}^{} \frac{\partial \mathcal{L} (f_{\theta ^{'}})}{\partial \theta ^{'}_{j}} \frac{\partial \theta ^{'}_{j}}{\partial \theta _{i}}

Meta-gradient带来的一个问题是增加了一次额外的求导,作者在论文中提到使用了一阶近似来表示黑塞矩阵,结果和求两次导数差不多。

3. MAML的物理意义

maml.png

假设初始化参数为\theta ^{0},的一个task的training set更新后变成\hat{\theta} ^{m},用test set计算第二次梯度会得到另外一个向量,用这个向量的方向来更新\theta ^{0}得到\theta {1}

而模型预训练与它不同,它一次只更新一个梯度,所以计算出来哪个方向就其哪个方向。

上一篇下一篇

猜你喜欢

热点阅读