什么是小样本学习?
人类非常擅长通过极少量的样本识别一个新物体,比如小孩子只需要书中的一些图片就可以认识什么是“斑马”,什么是“犀牛”。在人类的快速学习能力的启发下,研究人员希望机器学习模型在学习了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习,这就是 Few-shot Learning 要解决的问题。
小样本学习本质上属于迁移学习的一个领域,我们能通过少量图片就能认识一个新的物种,本质上是因为人类的大脑中有大量的先验知识存在。
Few-shot Learning 是 Meta Learning(元学习)在监督学习领域的应用。Meta Learning,又称为 learning to learn,在 meta training 阶段将数据集分解为不同的 meta task,去学习类别变化的情况下模型的泛化能力,面对全新的类别,不需要变动已有的模型结构就可以完成新类别的分类。
N-way K-shot 问题:
- N-Way就是N-路或N-类,K-Shot就是K-次或K-个
- 在元数据集(Meta-dataset)中随机抽取$N$类(Way)样本,每一类样本随机抽取$K+1$个(Shot)作为数据集,总共$N*(K+1)$个样本。
- 从这$N$类样本的$K+1$个实例中,每类样本随机抽取$K$个实例一起作为
Training Set
(或者Support Set
),每一类剩下的1个实例一起组成Testing Set
(或者Query Set
)。 - 在小样本学习或者元学习中,为方便区分,每个任务内部的训练集(Training Set)更名为支持集(
Support Set
)、测试集更名为查询集(Query Set
)。 - 训练:从
Support Set
中每一类随机选取一个实例,一起够成一组训练数据,输入到模型中,进行训练。 - 测试:从
Query Set
中随机抽取一个实例,用模型判断其属于哪一类。
小样本学习的分类
Few-shot Learning 模型大致可分为三类:Model Finetune Based,Metric Based 和 Optimization Based。
基于模型微调的方法
其实就是一般的迁移学习,这种方法已被广泛地应用。获得一定量的标注数据,然后基于一个基础网络进行微调。
这个基础网络是通过含有丰富标签的大规模数据集获得的,比如Imagenet,然后在特定数据域上进行训练。训练时,会freeze基础网络部分的参数,对领域特定的网络参数进行训练(这里有很多训练的trick,包括如何设置固定层和学习率等),该方法可以相对较快,依赖数据量也不必太多,就能达到较好的效果。
基于Metric的方法
如果在 Few-shot Learning 的任务中去训练普通的基于 cross-entropy 的神经网络分类器,那么几乎肯定是会过拟合,因为相对于神经网络中数以万计的参数,训练数据集太小了。
相反,很多非参数化的方法(K-NN、K-means)是不需要优化参数的,因此可以在 meta-learning 的框架下构造一种可以端到端训练的 few-shot 分类器。该方法是对样本间距离分布进行建模,使得同类样本靠近,异类样本远离,但效果依赖距离度量的选取。因此通过学习一个端到端的最近邻分类器,它同时受益于带参数和无参数的优点,使得不但能快速的学习到新的样本,而且能对已知样本有很好的泛化性。
孪生网络(Siamese Network)
CVPR2005:Learning a similarity metric discriminatively, with application to face verification
这个方法对输入的结构进行限制并自动发现可以从新样本上泛化的特征。通过一个有监督的基于孪生网络的度量学习来训练,然后重用那个网络所提取的特征进行one/few-shot学习。
它是一个双路的神经网络,训练时,通过组合不同类的样本成对,同时输入网络进行训练,在最上层通过一个距离的交叉熵进行loss的计算。
在预测的时候,以5way-5shot为例,从5个类中随机抽取5个样本,把这个mini-batch=25的数据输入网络,最后获得25个值,取分数最高对应的类别作为预测结果。
总结:
- 孪生网络解决了解决类别很多(或者说不确定),然而每类样本数较少的分类任务(比如人脸识别、人脸认证),不同于一般的ImageNet或VOC的任务。
- 孪生网络将输入映射为一个特征向量,使用两个向量之间的“距离”(L1 Norm)来表示输入之间的差异(图像语义上的差距)。
- 不同于softmax的1个样本和triplet的3个样本,孪生网络每次需要输入2个样本作为一个样本对计算损失函数。
- Contrastive Loss损失函数:
$$L= {1\over 2N}\sum_{n=1}^Nyd^2+(1−y)max(margin−d,0)^2$$
原型网络(Prototypical Networks)
NIPS2017:Prototypical Networks for Few-shot Learning
原型网络的思想十分简单高效,效果也非常好。
它学习一个度量空间, 通过计算和每个类别的原型表达的距离来进行分类。文章基于这样的想法:每个类别都存在一个聚在某单个原型表达周围的embedding,该类的原型是support set在embedding空间中的均值。然后,分类问题变成在embedding空间中的最近邻。c1、c2、c3分别是三个类别的均值中心(称Prototype),将测试样本x进行embedding后,与这3个中心进行距离计算,从而获得x的类别。
关系网络(Relation Networks)
CVPR2018:Learning to Compare: Relation Network for Few-Shot Learning
关系网络的主体结构分为两个部分:
- 一部分就是嵌入单元(embedding module)$fφ$用来提取图像的特征
- 另一部分是关联单元(relation module)$gφ$,用来计算两个图像的相似度
在训练时,我们利用training set
来对网络进行元学习,用sample set
中的数据与query set
中的数据做对比。在embedding module分别获得两者的特征、然后对特征进行连接后送入到关联单元来得到关联系数,来表示输入之间的相似度。
如果对于每类我们有K(K>1)个labelled的样本,我们将同一类的feature_map进行相加,然后就和上图的1-shot进行同样的操作。
Relation Networks为什么能工作?
论文指出,之前的few-shot工作都是预先指定好度量方式的,如欧式距离或余弦距离,学习部分主要体现在特征嵌入方面,但是该论文同时学习了特征的嵌入及非线性度量矩阵(相似度函数),这些都是端到端的调整。通过学习的到的相似性矩阵有着比人为选定的矩阵更具有灵活性,更能捕获到特征之间的相似性。
总而言之,关系网络不使用预定的距离度量方式,而是通过神经网络去学习一个全新的度量方法。
- 本文作者: Jason
- 本文链接: https://caicaijason.github.io/2019/12/05/小样本学习/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!