Reptile算法和MAML一样,是Meta-Learning在学习一种初始化参数上的算法。MAML有二阶和简化版本——一阶FOMAML(First-order MAML)2种形式,而Reptile类似于FOMAML,是一种新型的一阶Gradient-Based 元学习算法。从实现上来看,Reptile比FOMAML还要简单,并且实验结果和FOMAML、MAML相差无几。
Reptile是一篇2018年的论文,作者是Nichol,发布时间在MAML之后。
参考列表:
①Reptile原论文(On First-Order Meta-Learning Algorithms)
②从MAML到Reptile
③Reptile深度解析
④LiI’log-Meta Learning综述
On First-Order Meta-Learning Algorithms
MAML
标准的MAML算法是一种二阶算法,也就是说算法中需要计算二阶偏导数,因此比较耗时耗资源。谈到MAML,第一个想到的就是著名的二次更新,即内更新(
θ
′
←
θ
\theta'\gets\theta
θ′←θ)和外更新(
θ
←
θ
′
\theta\gets\theta'
θ←θ′)。内更新用于Meta-Learner到Learner的Fast-Adaptation;外更新用于训练Meta-Learner。
如上图所示,灰色线代表着不同tasks所产生的梯度值(方向);黑色线代表着最终算法选择更新的方向,可以看出来黑色方向应该是几个tasks产生方向的平均值;虚线代表着Fast-Adaptation,即
θ
→
θ
′
\theta\to\theta'
θ→θ′,不同的方向代表着不同的task应该更新的方向。
这张图我们对照着内外更新的公式来看:
①内更新:
θ
i
′
=
θ
−
α
∇
θ
L
τ
i
(
f
θ
)
\theta_i'=\theta-\alpha\nabla_\theta\mathcal{L}_{\tau_i}(f_\theta)
θi′=θ−α∇θLτi(fθ)
②外更新:
θ
=
θ
−
β
∇
θ
∑
τ
i
∼
p
(
τ
)
L
τ
i
(
f
θ
i
′
)
\theta=\theta-\beta\nabla_\theta\sum_{\tau_i\sim p(\tau)}\mathcal{L}_{\tau_i}(f_{\theta_i'})
θ=θ−β∇θ∑τi∼p(τ)Lτi(fθi′)
第一次更新(绿色方向)得到
θ
′
\theta'
θ′,第二次更新虽然是对
θ
\theta
θ求导,但是经过简化之后可以转为对
θ
′
\theta'
θ′的求导,因此就好像说外更新就像继续对
θ
′
\theta'
θ′做更新一样(
θ
n
e
w
′
←
θ
o
l
d
′
−
β
∇
θ
′
L
\theta'_{new}\gets\theta'_{old}-\beta\nabla_{\theta'}\mathcal{L}
θnew′←θold′−β∇θ′L),于是就有了长一点的黄色线。由于梯度本身就是个向量,因此进行平移就可以达到外更新的效果,再加上学习率
β
\beta
β,因此
θ
\theta
θ的更新如短一点的黄色线所示。
由于这篇笔记主要讲Reptile,因此关于更多MAML的细节请参考我的另一篇关于MAML的笔记,点这里。
FOMAML
FOMAML,即First-Order MAML,标准的MAML算法需要涉及到二阶导数,既浪费时间又消耗计算资源,因此一阶的MAML就有必要引出。
FOMAML伪代码如下:
一句话概括就是在外更新中,只使用Fast-Weights
θ
′
\theta'
θ′最后一次的梯度更新结果,详细推导如下图:
在代码实现是这样做的:
其中losses_q[-1]指的是最后一个task里最后一次更新的
L
o
s
s
Loss
Loss值,通过它的backward来更新Meta-Learner的参数,即Slow-Weights。
Reptile
和MAML一样,Reptile也是旨在学习到一种合适的初始化策略。
上图和MAML那张很像,只不过Reptile更简单,可以看出,就是用Meta-Learner的参数
ϕ
\phi
ϕ连续做几次更新到达Learner的参数
θ
m
\theta^m
θm,然后
ϕ
\phi
ϕ的更新方向就是沿着
ϕ
→
θ
m
\phi\to\theta^m
ϕ→θm的方向前进,当然还要乘以学习率。可以看出和MAML的区别在于,
θ
\theta
θ参数的获得可以更新好几次,而MAML里是只有1次,这也是MAML的一个特点(需要注意的是,MAML也是可以更新好几次的,并不是只能1次)。
Reptile的伪代码如下:
Note:
- 对于Meta-Learner参数的更新,Reptile并没有去求梯度,而是通过一种软更新的方式,这里 ϵ \epsilon ϵ是学习率。
- Reptile并没有像MAML一样去搞Support-set和Query-set。
- 关于 U U U的解释:这里指的就是Reptile更新图中深绿色部分,意思就是通过Adam或SGD这种优化算法,其实就相当于MAML里的内更新, ϕ ~ \tilde{\phi} ϕ~就相当于Fast-Weights,从 ϕ \phi ϕ开始连续做几次梯度下降,给定一堆tasks,进行采样,更新 k k k次: ϕ ~ = ϕ − g 1 − g 2 ⋯ − g k \tilde{\phi}=\phi-g_1-g_2\cdots-g_k ϕ~=ϕ−g1−g2⋯−gk,如下图所示:
- 软更新使得 ϕ \phi ϕ朝着 ϕ ~ − ϕ \tilde{\phi}-\phi ϕ~−ϕ的方向前进,这就是Reptile,简单粗暴!至于为什么选择这个更新方向,作者进行了一系列复杂的数学推导才得出。
Reptile&MAML&Pre-training
上图是Reptile、MAML、Pre-training三种方法更新参数的示意图,这里Reptile选择了2次更新,仅仅只是为了容易和MAML进行比较而已。可以看出在这种情况下,Reptile几乎就是MAML和Pre-training的合体。
下图是Reptile原论文中做的比较实验:
- 从上图可以看出Pre-training(g1)的效果是最差的。
- MAML是g2,效果处于中间的位置。
- 效果最好的是 k = 4 k=4 k=4的时候,即 g 1 + g 2 + g 3 + g 4 g_1+g_2+g_3+g_4 g1+g2+g3+g4,比MAML要好上一些。因此Reptile虽然简单,但是还是比较实用的。