Meta-Transfer Learning for Few-Shot Learning 论文笔记
前言
元学习(meta-learning)是目前广泛使用的处理小样本学习问题的方法,它的目的是在学习不同任务的过程中积累经验,从而使得模型能够快速适应新任务。比如在MAML(Model-Agnostic Meta- Learning)中,通过搜寻最优初始化状态,使得base-learner能够快速适应新任务。但是这一类元学习方法具有两个缺点:
- 需要大量相似的任务以进行元训练(meta-training),成本花费很大;
- 每个任务通常由较低复杂度的base-learner进行建模,以避免过拟合,这会导致模型不能使用更深更强的结构。比如在MAML中,使用的是shallow CNN,只有4个卷积层。
本文提出了一种新的元学习方法,称为meta-transfer learning(MTL),当仅使用少量带有标记的数据时,它可以帮助深度神经网络快速收敛,并且降低过拟合发生的概率,
- "transfer"意味着在大规模数据集上训练得到的DNN权值,可以通过两个轻量级的神经元操作从而被使用到其它任务中,这两个操作分别是scaling和shifting(SS),比如αX+β\alpha X+\beta。
- "meta"意味着这些操作的参数可以看作是针对小样本学习任务训练的超参数。
通过大规模数据集训练得到的DNN权值提供了一个很好的初始化状态,可以确保MTL在处理小样本任务时能够快速收敛。而在DNN神经元上进行的轻量级操作也使得模型的参数更少,降低了过拟合的可能。除此之外,这些操作保持DNN的权值不被改变,从而避免了当适应新任务时,模型会遗忘通用模式这种情况的发生。
本文还提出了一种新的学习策略,称为hard task(HT)meta-batch,以往的meta-batch包含的是一些随机任务,而HT meta-batch根据之前在训练时出现的具有较低验证准确度的失败任务,对hard task进行重新采样。
本文的贡献如下:
- 提出MTL方法,使用经过大规模数据集预训练得到的DNN权值,来处理小样本学习任务;
- 提出HT meta-batch学习策略,迫使MTL通过hard task进行学习;
- 在两个小样本学习benchmark上进行实验并取得优异的结果。
方法实现

如上图所示,本文的方法共包含3个阶段:
- 在大规模数据集上训练一个DNN,并固定较低层级的卷积层作为特征提取器(Feature Extractor);
- 在MTL阶段,学习特征提取器神经元的SS参数(scaling和shifting),确保能够快速适应小样本任务。除此之外还采用了HT meta-batch学习策略,以提升整体的学习;
- meta-test阶段
1. DNN的训练
这一阶段类似于目标识别中的预训练阶段,这里是在小样本学习benchmark的现成数据集上进行预训练。对于一个确切的小样本数据集,将会融合所有类的数据DD以进行预训练。比如在miniImageNet中,DD的训练集中共有64个类,每个类包含600个样本,那么将利用所有这些数据进行预训练,得到一个64-class分类器。
首先随机初始化一个特征提取器Θ\Theta和分类器θ\theta,通过梯度下降对它们进行优化:

其中LL是交叉熵损失:

这一阶段主要通过学习得到一个特征提取器Θ\Theta,在后续的meta-training和meta-test阶段,Θ\Theta将会被冻结,而这一阶段得到的分类器θ\theta将会被去掉。
2. MTL
MTL通过HT meta-batch训练来对元操作(meta operation)SS进行优化,将SS操作分别定义为ΦS1\Phi_{S_1}和ΦS2\Phi_{S_2},给定任务TT,T(tr)T{(tr)}是训练数据,使用T(tr)T{(tr)}的损失来优化当前的base-learner(分类器)θ′\theta^{'},也就是对θ\theta进行更新:

与式(1)不同的是,这里并没有更新Θ\Theta。注意这里的θ\theta与式(1)中的θ\theta是不同的,在式(1)中θ\theta处理的是某个数据集中的所有类,而这里的θ\theta只关注少量的几个类,从而在小样本设置的情况下进行分类。θ′\theta^{'}是一个临时的分类器,它只关注当前的任务。
ΦS1\Phi_{S_1}由1进行初始化,ΦS2\Phi_{S_2}由0进行初始化,然后,用T(te)T{(te)}的损失对它们进行优化,T(te)T{(te)}是测试数据:

然后用与式(4)中相同的学习率γ\gamma对θ\theta进行更新:

然后说一下如何将ΦS{1,2}\Phi_{S_{\lbrace 1,2 \rbrace}}应用到Θ\Theta的神经元上。给定Θ\Theta,它的第ll层包含KK个神经元,也就是KK个参数对儿,定义为{(Wi,k,bi,k)}\lbrace (W_{i,k},b_{i,k})\rbrace,分别表示权值和偏差。假设输入是XX,那么将{ΦS{1,2}}\lbrace \Phi_{S_{\lbrace 1,2 \rbrace}} \rbrace应用到(W,b)(W,b)上就是:

下图说明了分别通过SS和FT进行更新的不同之处:

- 图(a)是通过FT(fine-tuning)进行更新,它对Θ\Theta中的所有WW和bb都进行更新,并且参数的数量很多,图中绿色的都是需要学习的参数;
- 图(b)是通过SS进行更新。图中是3×33 \times 3的卷积核,在SS操作后,卷积核通过ΦS1\Phi_{S_1}进行缩放,然后将卷积后的特征图平移ΦS2\Phi_{S_2},它可以使Θ\Theta中的参数保持不变,并且参数数量变为原来的29\frac{2}{9}(仅限3×33 \times 3的卷积核)。
3. HT meta-batch
在以往的元训练中,meta-batch包含的是随机采样的任务,也就是说任务的难度也是随机的。本文在元训练中有意挑选出每个任务中的失败案例(failure case),并将其数据重新组合为难度较大任务,迫使meta-learner"在困难中成长"。
每个任务TT都包含T(tr)T{(tr)}和TteT{{te}},分别用于base-leaning和test,base-learner由T(tr)T{(tr)}的损失进行优化(在多个epoch中进行迭代),然后SS由T(te)T{(te)}的参数进行优化(只进行一次)。对于T(te)T^{(te)},可以得到其中MM个类的识别精度,然后根据最低的精度AccmAcc_{m}判断当前任务中最困难的类class-mm(failure class)。在从当前的meta-batch {T1−k}\lbrace T_{1-k} \rbrace的所有kk个任务中获得所有failure class之后,从这些数据中重新采样任务。也就是说,假设p(T∣{m})p (T|\lbrace m\rbrace)是任务分布,那么采样harder task Ttask∈p(T∣{m})T^{task} \in p (T|\lbrace m\rbrace),采样的具体细节如下:
- 在每个任务中,通过对class-level的识别精度进行排序,选出最困难的类class-mm;
- 在选出{m}\lbrace m \rbrace之后,要么直接使用当前任务TT中class-mm中的样本作为TtaskT{task},或者根据class-mm的类标签采样属于同一类的新样本作为TtaskT{task}。实验证明第二种方法更好。
4. 算法
Algorithm 1总结了DNN的训练和MTL这两个阶段,其中的failure class由Algorithm 2返回。Algorithm 2说明了在单个任务上的学习过程,包括episode training和episode test


结论
本文在MAML的基础上,使用了一个较深的预训练DNN模型,为了更好地发挥DNN的效果,在固定DNN每层参数不变的情况下,为每层的权值和偏差分别设置了可学习的scaling和shifting,这样可以降低参数数量,避免过拟合。除此之外,为了增强模型的泛化能力和鲁棒性,本文使用HT meta-batch学习策略。
