MAML主要就是学习一个网络的初始化参数,这个参数对梯度是敏感的,使得它在针对特定任务进行fine tuning时,只需要少数几次的训练就能达到较好的效果。

一般来说,我们可以用公式表示meta learning:

minimize Eτ(Lτ(Uτk(ϕ)))minimize \ E_{\tau}(L_{\tau} (U_{\tau}^k(\phi)))

整条公式所有的数据都来自于tau,最里面的U表示参数phi经过k次训练进行更新,然后再计算模型的损失函数L,我们的目的就是最小化这个损失函数L的期望E。

对于MAML,主要的改变就是参数更新和计算损失函数时用到的数据不同:

minimize Eτ(Lτ,B(Uτ,Ak(ϕ)))minimize \ E_{\tau}(L_{\tau,B} (U_{\tau,A} ^k(\phi)))

MAML的效果不错,主要问题是它需要进行两次求导,所以有很多改进模型都是针对这个问题出发的,比如接下来要介绍的Reptile。

首先想一下,为什么MAML需要计算两次求导,第一次求导是针对各个任务分别进行参数更新,第二次求导是针对模型总的损失函数的求导从而更新模型的初始参数,目的就是使得模型对各个任务都有较好的效果,又不会过于偏向于某个特定任务,所以本质上,MAML的目的就是确定初始化参数,使得模型在各类任务都能取得较好效果。

个人理解,MAML是直接朝着相对各个任务都较优的方向进行梯度下降,而Reptile则是朝着各个任务的最优方向逐个梯度下降,最后近似逼近相对各个任务都较优的位置。

首先,Reptile会从数据中随机抽样,然后进行k次SGD或者ADAM,原文没有详细解释这里是怎样进行k次SGD,个人理解应该是对同一类任务抽取k个样本进行SGD,不然对同一个样本做k次SGD就很容易过拟合了,当然也可以理解成抽取k个不同任务的样本,但是考虑到每一次迭代都会随机抽取不同的任务,所以总的来说,不论具体是哪种方式,其实区别都不大:

ϕ~=Uτk(ϕ)\widetilde \phi = U_\tau ^k (\phi)

这样就完成了一次参数更新,可是实际上Reptile还更进一步,对梯度下降的方向使用像Adam这种自适应算法:

ϕϕ+ϵ(ϕ~ϕ)\phi \leftarrow \phi + \epsilon (\widetilde \phi - \phi)

上式中通过新旧参数之差求出参数更新的方向,个人觉得这样做的目的是调整学习率,避免在后期模型已经接近最优初始点了,还保持着较大的学习率,使得模型一直无法更进一步逼近最优初始点。接下来,就可以继续下一轮的学习。

除此之外,我们还可以每次针对n个任务进行训练,只需要每轮迭代抽取n个任务的数据:

ϕ~i=Uτik(ϕ)\widetilde \phi _i = U_{\tau _i} ^k (\phi)

ϕϕ+ϵ1ni=1n(ϕ~iϕ)\phi \leftarrow \phi + \epsilon \frac{1}{n} \sum_{i=1}^n (\widetilde \phi _i - \phi)

关于为什么Reptile可行,虽然可以从数学公式进行推导,但我画了一幅图像尝试从更简单的角度去分析他的可行性:

元学习系列(八):Reptile

从图像可以看出,MAML从对各个任务同时优化的角度进行梯度下降,当然每一步的迭代都是逼近最优初始参数的,但是像Reptile那样,虽然每次都是朝着某个任务前进,但是总的来说也慢慢逼近了最优初始参数。当然结果上可能没有MAML好,但是优势在于避免了二次求导使得运算量大大降低。

在github写的自然语言处理入门教程,持续更新:NLPBeginner

在github写的机器学习入门教程,持续更新:MachineLearningModels

想浏览更多关于数学、机器学习、深度学习的内容,可浏览本人博客

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-25
  • 2021-04-30
  • 2021-06-24
  • 2022-01-02
  • 2022-02-06
  • 2021-10-20
猜你喜欢
  • 2022-12-23
  • 2022-02-01
  • 2021-12-22
  • 2021-10-12
  • 2021-08-11
  • 2021-06-27
  • 2022-12-23
相关资源
相似解决方案