LSTM用于元学习-"Learning to learn by gradient descent by gradient descent"-笔记详解

Andrychowicz, Marcin, et al. “Learning to learn by gradient descent by gradient descent.” Advances in neural information processing systems. 2016.

1 简介

这篇文章主要讲用一个额外的LSTM学习出优化算法中以前需要手工设置的超参数。相比于MAML元学习的是模型的初始参数表示,这篇文章则着眼于元学习出一个优化算法。 现在很多方法是针对特定任务来设计优化算法,比如:RMSprop, Adagrad, ADAM等等。但是根据世上没有免费的午餐定律,没有一个特定的优化算法适用于所有的情形。而这篇文章则设计了一个optimizer gg (本文中使用LSTM)来学习出不同的优化方法。因此参数的更新方法如下:
θt+1=θt+gt(f(θt),ϕ) \theta_{t+1}=\theta_t + g_t(\nabla f(\theta_t),\phi)
其中,ϕ\phi是模型gg自身的参数,f(θt)\nabla f(\theta_t)是optimizee ff的loss值。

在这里插入图片描述

图1:optimizee与optimizer之间的关系

上图展示了optimizer和optimee的关系。optimizer在本文中就是一个LSTM,它为optimizee学习出一个优化方法。而optimizee可以是任意一种使用梯度更新的模型。以下将使用θ\theta来表示optimizee中的参数,使用ϕ\phi来表示optimizer中的参数。

2 如何对optimizee进行参数更新?

简单来说就是,一开始,optimizee有一个初始的θ0\theta_0,然后我们会从一系列任务中取出一个任务作为一个batch,然后根据这个batch和初始参数θ0\theta_0,optimizee根据每一个输入的**(x,y)(x,y)**计算出梯度L(x,y,θ)\nabla L(x,y,\theta),然后将梯度传递给optimizer。optimizer将会输出一个值,记作g(L,ϕ)g(\nabla L,\phi),这个值将被返回给optimizee用于更新梯度(如式(1)所示)。

在这里插入图片描述

图2:计算图

所以optimizer其实就是一个梯度更新方法的“学习器”,通过训练,optimizer将会告诉optimizee如何进行梯度更新。所以optimizer自身的参数更新方法其实就很关键了。

3 如何对optimizer进行参数更新?

在这篇文章中optimizer其实是一个LSTM,一个典型的LSTM有两个输入一个是每个batch的数据xtx^t,另一个是前一个单元的隐张量ht1h^{t-1} 。图4展示了经典的LSTM模型中的一个子单元。将其中的xtx_t替换成为L(x,y,θ)\nabla L(x,y,\theta)就构成了本文中optimizer的输入。

在这里插入图片描述

图3:经典的LSTM

不妨问自己一个问题:什么样的optimizer算是“好”的optimizer呢?当然是让optimizee的loss值越最小的optimizer最好。所以optimizer的loss值应该是基于optimizee的loss值的。L(ϕ)L(\phi)可以记为:
L(ϕ)=Ef[t=1Twtf(θt)] L(\phi)=E_f [\sum^{T}_{t=1}{w_t f(\theta_t)}]
其中T是时间步数,一般情况下wtw_t均取1。

本文中L(ϕ)L(\phi)取的是optimizee的loss之和。optimizer自身也需要一个优化方法来优化自身的参数,在本文中作者采用的是ADAM。然后我们就可以利用L(ϕ)\nabla L(\phi)和ADAM方法进行反向传播来更新自身的参数。

对于一个输入的参数张量θ=θ1,θ2,θ3,...,θm\theta=(\theta^1,\theta^2,\theta^3,...,\theta^m),对于其中每一个维度的θi\theta^i都会有一个对应的LSTM来学习出它的最佳梯度更新值。一般情况下一个模型可能有十万百万个参数,如果我们为每一个参数都配备一个独有的LSTM,那整个网络显然会变得非常庞大,以致于完全无法训练。所以optimizer中的LSTM是全部共享参数ϕ\phi的。如图4所示,所有的LSTM均共享参数ϕ\phi,但是它们各自的隐状态hth_t是不共享的。由于每个维度上的LSTM输入的hth_tL(θ)\nabla L(\theta)是不同的,所以即使它们的ϕ\phi相同,但是它们的输出却是不一样的。实际上这也与常规的优化方法相似,比如ADAM,SGD等,它们也是为每个维度的参数施行同样的梯度更新规则。

在这里插入图片描述

图4:所有的LSTM均共享参数,但是它们都有各自独有的隐状态

我一直比较困惑的是:我到底应该如何更新optimizer的ϕ\phi值?难道我需要利用所有维度的loss值来更新我optimizer的参数么?如果这样做的话显然行不通,因为每一轮训练,我可能需要对ϕ\phi更新上万次。后来我终于弄清楚了,其实这篇文章每次训练只取optmizee中一个维度的loss值来更新optimizer的参数。

4 实验

4.1 二次函数

这个实验拟合一个10维的二次函数。其中有一句话是这样的:

Each function was optimized for 100 steps and the trained optimizers were unrolled for 20 steps.

这句话容易让人困惑,但是有人觉得这句话实际表达的是:optimizee会经过100次的优化,而optimizer每20步更新一次参数,也就是说optimizer每次接收20个loss值,构成自己(LSTM)20个时间步的输入。以下引用@Adrien Lucas Ecoffet对这句话的解释:

I assume this means that each epoch is made up of trying to optimize a new random function for 100 steps, but we are doing an update of the optimizer every 20 steps. The number of epochs is thus unspecified, but according to the graphs it seems to be 100 too.

在这里插入图片描述

4.2 Minist数据集

在这里插入图片描述

4.3-4.4 CIFAR-10数据集和Neural Art

略,见原文。

5 总结

这篇文章写得不怎么规范,文章结构不太清晰。这篇文章在引言部分对trasfer learning和generalization做了重点介绍,然后整篇文章的重点其实是meta-learning。本文的方法于2016年提出,比MAML要早一年。但它专注于优化方法的meta-learning,而MAML专注于初始权重的Meta-Learning,所以此方法完全可以跟MAML结合在一起使用。

Reference

1. From zero to research — An introduction to Meta-learning

2. Learning to learn by gradient descent by gradient descent

3. The pdf of Hong-yi Lee’s courses

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章