Optimization as a model for few-shot learning 论文笔记

前言

本文提出了一个基于LSTM的meta-learner模型来学习最优化算法,该算法将用于训练另一个learner分类器(神经网络分类器)。meta-learner捕获了任务中的short-term知识,和所有任务中共有的long-term知识,由meta-learner模型优化的另一个learner分类器在每个任务上都能快速收敛。

除此之外,meta-learner模型还学习了适用于其它learner分类器的一般初始化,该初始化捕获了所有任务之间共享的基础知识,从而允许其它learner分类器在训练中能够快速收敛。

本文指出基于梯度的模型不能很好的处理few-shot的原因:

  • 基于梯度的优化算法在更新次数有限制的情况下并不能表现得很好。具体来说,当处理非凸优化问题时,合理选择参数并不能使算法保持好的收敛速度,在经过数百万次迭代之后才能收敛到一个很好的程度;
  • 对于每个不同的数据集,网络每次都要从一个随机初始化开始,这会损害网络仅需几次更新就可以收敛的能力。虽然迁移学习可以缓解这个问题,即先在标签充足的数据集上预训练一个网络,然后再对该网络进行微调,但如果预训练网络的任务偏离了目标网络的任务,这种方法也并不会特别有效。

一些设置

在机器学习中,数据集 D D 通常被分为训练集 D t r a i n D_{train} 和测试集 D t e s t D_{test} ,在 D t r a i n D_{train} 上优化参数 θ \theta ,在 D t e s t D_{test} 上检验模型的泛化能力。在meta-learning中,meta-sets S S 包含多个数据集, D S D \in S 并且每个 D D 都被分为 D t r a i n D_{train} D t e s t D_{test}

考虑 k k -shot N N -class分类任务,也就是说对于每个 D D D t r a i n D_{train} 包含 N N 个类,每个类有 k k 个标记样本,即 D t r a i n D_{train} 包含 k N k \cdot N 个样本,而 D t e s t D_{test} 包含的是一定数量的样本。

meta-sets被划分为 S m e t a t r a i n S_{meta-train} S m e t a v a l i d a t i o n S_{meta-validation} S m e t a t e s t S_{meta-test}

  • S m e t a t r a i n S_{meta-train} :训练一个"学习过程"(即meta-learner模型),该过程使得在输入一个 D t r a i n D_{train} 的情况下,能够产生一个learner分类器,该分类器能在对应的 D t e s t D_{test} 上获得较高的性能;
  • S m e t a v a l i d a t i o n S_{meta-validation} :对meta-learner的超参数进行选择;
  • S m e t a t e s t S_{meta-test} :评估meta-learner的泛化能力。

为了对应few-shot learning,每个 D t r a i n D_{train} 都包含少量的标记样本,本文考虑 k = 1 k=1 k = 5 k=5 ,并且之后在对应的 D t e s t D_{test} 上也能获得很好的性能。

meta-learning的设置如下图所示,上面是 S m e t a t r a i n S_{meta-train} ,每个灰色的框中是一个数据集 D D ,被分为 D t r a i n D_{train} D t e s t D_{test} ,这里考虑的是1-shot 5-class,即在 D t r a i n D_{train} 有5个类,每个类只有一个样本,而 D t e s t D_{test} 中有两个样本。下面是 S m e t a t e s t S_{meta-test} ,它的 D t r a i n D_{train} D t e s t D_{test} 的设置和上面的一样,但是 S m e t a t e s t S_{meta-test} 中的 D t r a i n D_{train} 里有一些类是 S m e t a t r a i n S_{meta-train} 中从未出现过的。
在这里插入图片描述


算法思路

考虑一个单独的数据集,或episode, D S D \in S ,假设需要在 D t r a i n D_{train} 上训练一个参数为 θ \theta 的learner分类器,那么需要用梯度下降的一些变体来训练该网络,更新形式如下:
在这里插入图片描述
其中 θ t 1 \theta_{t-1} 是learner在 t 1 t-1 次更新后的参数, α t \alpha_t 是在时间 t t 时的学习率, L t L_t 是learner在 t t 时刻更新后优化的损失, Δ θ t 1 L t \Delta_{\theta_{t-1}}L_t 是损失相对于参数 θ t 1 \theta_{t-1} 的梯度, θ t \theta_t 是learner需要更新的参数。

作者观察到,式(1)的那种更新,和LSTM中单元状态(cell state) c t c_t 的更新是有些类似的:
在这里插入图片描述
如果 f t = 1 f_t=1 c t 1 = θ t 1 c_{t-1}= \theta_{t-1} i t = α t i_t= \alpha_t c ~ t = Δ θ t 1 L t \tilde c_t=-\Delta_{\theta_{t-1}}L_t ,那么这两个式子确实差不多。

因此,本文训练了一个基于LSTM的meta-learner,它的目标就是学习LSTM的更新规则,然后将其应用于训练另一个神经网络(learner分类器)上。 将LSTM的单元状态设置为meta-learner的参数,即 c t = θ t c_t= \theta_t ,将候选单元状态设置为 c ~ t = Δ θ t 1 L t \tilde c_t=-\Delta_{\theta_{t-1}}L_t ,给出梯度信息对优化有多大价值。然后还定义了输入门 i t i_t 和遗忘门 f t f_t ,使meta-learner能够通过更新过程来确定最优值:
在这里插入图片描述
在这里插入图片描述

  • 对于输入门 i t i_t ,它的作用相当于学习率 α \alpha ,它是当前参数 θ t 1 \theta_{t-1} 、当前梯度 Δ θ t 1 L t \Delta_{\theta_{t-1}}L_t 、当前损失 L t L_t 以及先前学习率 i t 1 i_{t-1} 的函数;
  • 对于遗忘门 f t f_t ,它代表着上一轮参数 θ t 1 \theta_{t-1} 所占的权重,在式(2)中只是简单的将其固定为1,但在这里1并不是最优值。当meta-learner目前处于一个糟糕的局部最优状态,并且需要大幅更新以逃离当前位置时,缩小meta-learner的参数并且遗忘先前的部分值是合理的。这对应于损失很高但梯度接近于0的情况。因此,与 i t i_t 一样, f t f_t 也由四项得到。

除此之外,本文还指出可以学习LSTM单元状态的初始值 c 0 c_0 ,将其作为meta-learner的参数,这对应于learner分类器的初始权值。这样当来一个新任务时,meta-learner能够给它一个较好的初始值,从而能够快速学习。


参数共享

由于meta-learner用于为另一个深度神经网络生成更新,而该神经网络包含成千上万个参数,因此为了避免meta-learner发生"参数爆炸",需要采用某种参数共享策略,即在learner梯度的coordinates上共享参数。这意味着每个coordinate虽然都有自己的单元状态,但它们在LSTM上的参数都是相同的,因此可以用一个紧凑的LSTM模型对每个coordinate使用相同的更新规则。这样,在输入是梯度coordinate的batch,和每个维度 i i 损失 ( Δ θ t , i L t , L t ) (\Delta_{\theta_{t,i}}L_t,L_t) 的情况下,就可以很轻松的实现参数共享。

由于梯度的coordinate和损失有很大的不同,因此本文还对它们做了一个归一化处理:
在这里插入图片描述


训练

接下来就要对基于LSTM的meta-learner模型进行训练了,并且该模型应该能够很好的处理few-shot learning任务。训练的关键点就是,训练时的场景需要和测试时的场景保持一致。给定训练集 D t r a i n D_{train} 上的一系列梯度和损失,meta-learner需要提供参数以对另一个分类器进行更新,从而使该分类器能够在测试集 D t e s t D_{test} 上获得良好的性能。过程如下图所示:
在这里插入图片描述
图中虚线左边是 D t r a i n D_{train} ,右边是 D t e s t D_{test} ,虚线箭头表示为了与测试时的场景相匹配,训练目标是在测试集 D t e s t D_{test} 上生成的分类器的损失 L t e s t L_{test} ,当在训练集 D t r a i n D_{train} 上进行迭代时,meta-learner在每一个时间步 t t 从分类器接收 ( Δ θ t , i L t , L t ) (\Delta_{\theta_{t,i}}L_t,L_t) ,并提供新的参数集 θ t \theta_t ,这个过程重复 T T 个步骤,然后在 D t e s t D_{test} 上评估分类器及其最终参数,以产生损失,然后该损失用于训练meta-learner,训练算法如下图所示:
在这里插入图片描述

独立梯度假设

注意到分类器的梯度和损失其实取决于meta-learner的参数,因为分类器是根据meta-learner提供的参数集进行更新的,然而这会使meta-learner的梯度计算变得复杂。因此本文做了一个小小的假设,即分类器产生的梯度和损失对meta-learner的梯度计算是没有贡献的,也就是说两部分梯度是独立分开的,因此分类器的那部分梯度对于meta-learner的梯度计算是可以忽略的。这就避免了二次求导,使得meta-learner依然能够很有效率地被训练。

meta-learner的初始化

在训练基于LSTM的meta-learner时,最好用一个较小的权重来对LSTM进行初始化,并且将遗忘门偏差设置的尽可能大,从而使得遗忘门被初始化为接近于1,开启梯度流;而对于输入门偏差来说应将其设置的尽可能小,从而使meta-learner使用的输入门的值在开始时较小,即以一个较小的学习率开始。

发布了39 篇原创文章 · 获赞 1 · 访问量 1196

猜你喜欢

转载自blog.csdn.net/qq_30146937/article/details/105043780