有关小样本学习的各类文章通常会将其方法分成几个大类:基于度量学习的小样本方法、基于数据增强的小样本学习方法和基于模型初始化的小样本学习方法。我觉得这样分类并不好,因为三种方法之间并不是各自独立存在的,大多数情况下都是有交集的,比如一篇工作可能既使用了元学习的训练策略,同时又在度量方法上进行了创新。因此在梳理工作的时候,还是按照论文的顺序来梳理比较好,每篇工作都有他的特点,其思考的角度都不尽相同。
因此,我选择了几篇代表性的工作,在此整理小样本学习(主要是图像识别任务)的相关工作,其中穿插的自己的思考与理解。
论文链接:https://proceedings.neurips.cc/paper_files/paper/2017/file/cb8da6767461f2812ae4290eac7cbc42-Paper.pdf
这篇工作是我入门小样本的第一篇工作,对小样本元学习中的episodes的训练模式、各类场景下的任务设定都进行了一个初步的了解,本文的方法也非常简单,公式简单易懂,特别适合入门。同时随便一搜就会有很多的代码实现,适合自己拿来代码复现一下,通过实验分析各种way-shot设定下的模型的性能,有助于小样本分类任务的理解。
本文认为采用合适的度量方式是至关重要的,发现欧氏距离的效果比余弦相似度的效果好很多。同时本文对每个类别利用求平均的方式得到一个类别原型(这个方法广为流传,尽管我觉得这么做并不是最优策略),然后利用这个类别原型去计算各个类别之间的距离,其思想如图1所示。
此外,在此工作的基础上的改进也有一系列的工作,比如cvpr 2023的 Revisiting Prototypical Network for Cross Domain Few-Shot Learning。
论文链接:https://arxiv.dosf.top/pdf/2003.11539.pdf
这篇文章进一步的重新思考了小样本分类的问题本质,提出了训练一个性能好的embedding model起到非常关键的作用。所以将每个task中原本的train数据部分整合成一个大的数据集,再用这个新的数据集去训练Embedding Model,使得这个Embedding Model 具有一般分类任务的特征提取性能。接着利用提取的特征为每个task拟合不同的线性分类器。和fine-tune方法不同的,文章并没有利用新的样本重新调整Embedding Model的参数,而是让其保持不变,而是针对各任务的不同对象,拟合不同的线性分类器。所以如何提取出样本中广泛的、基础的,并能拟合更具代表性的特征,是小样本学习的关键。也就是如图人类在面对没有见过的物体时,会利用已有的知识来描绘这个物体,所以只需少量的样本,人类就能很快能区分这个物体。因此相比其他元学习的算法,这篇文章用更大的数据训练Embedding Model,得到的特征更具代表性。
进一步,根据知识蒸馏思想,作者也提出了对Embedding Model进行自蒸馏迭代,使得Embedding Model学到的特征更加的凝练。实验结果也证明加入自蒸馏后模型性能有了较大的提升。
在这里插入图片描述
值得一提的是这篇工作并没有采用元学习的训练策略,而是将训练集合并在一起,强调了embedding model的重要性。
论文链接:https://arxiv.dosf.top/pdf/2203.05922.pdf
这篇工作是非常出名的最初的工作发表在CVPR,后来增加了一些图像检索的实验之后发表在了TPAMI上。
总体来说是逻辑清晰的一篇论文,消融实验非常的充分,各个数据集,各个组件的作用,跨域,几乎把所有能做的实验全部都做完了。
首先是提出set to set的匹配方法,同时采用EMD去度量(EMD有数学依据很充分),然后为了区分不同nodes的重要程度,用一个cross mechanism(这个cross mechanism考虑到了support和query相同的区域)去计算每个nodes的权重。
最后针对k-shot的情况,提出了一个能得到set权重的全连接层,就能对每一个shot得到的set赋予不同的权重,再去做度量。
实际上这篇文章的idea与我最初的一些想法撞车了(当我看到这篇工作时惊出了一身冷汗)。我也是想将图像打成各个小的patch,然后利用这些小的patch去进行相似度的度量,这样就能充分利用少量样本(few-shot)中的丰富的信息,缓解小样本任务场景下的数据不充分的问题。还好这篇工作比较早,使用cnn-based model进行学习的,而我的那篇工作刚好可以利用最新的 vit 模型进行patch的划分。
论文链接:https://arxiv.dosf.top/pdf/2203.05922.pdf
这篇工作按照本篇博客最开始的划分方式,应该划分为生成式的小样本学习方法。同时呢,这篇工作的idea也是非常的简单,相当于是对何恺明老师MAE工作的一个扩展,将其应用到小样本图像生成,以缓解小样本数据受限的问题。不过不建议大家去读这篇工作,应为并没有公开代码,无法追究其实现的细节,但是光从idea来看,还是很有意思的一篇工作。
其具体过程如下:
1.每一个support set中的样本都feed到encoder中去获得feature embedding
2.三部分东西放到decoder中to obtain a series of augmented feature embeddins
3.用所有增强的到的特征和原本support set中的特征放到一起,再去计算每个类别的prototype。
(这个想法与我之前的想法类似,只不过我是在像素层次上生成,而不是图片层次上。)
论文链接:https://openaccess.thecvf.com/content/CVPR2023/papers/Li_MAGE_MAsked_Generative_Encoder_To_Unify_Representation_Learning_and_Image_CVPR_2023_paper.pdf
同样的,与上篇工作类似,也是对何恺明老师MAE工作的扩展,与我之前MAE加对比学习的思想非常类似,但是作者比我想的更多,不仅完成了表示学习的任务(比如图像分类),也完成了生成学习的任务,两个任务通过mask遮挡的方式一起完成了。
论文链接:https://arxiv.dosf.top/pdf/2203.05922.pdf
初次看到这篇文章的摘要时看到这样一句话:In this work, we depart from this established direction and instead propose to extract sets of feature vectors for each image. 刚好与我的一个idea撞车,又惊出了一身冷汗。不过还好,本文不是vit的patch set,而是fpn的不同层的特征的set!!!牛逼!
这篇工作是受fpn特征金字塔的启发(目标检测),如上图,同时,因为网络的各个层级的特征维度不同,利用一个改进的自注意力的Mmapper进行特征的映射,方便映射之后的特征之间进行度量。因此各个层在进行小样本的支持集和查询集图片进行度量的时候,并不是单独的利用网络最后一层得到的特征进行度量,而是利用各个阶段(层级)得到的特征进行度量,这样每张图片就得到了一个特征set,于是作者提出了三种不同的set to set的度量方式。其具体pipline下:
这篇工作的讲故事的顺序非常值得学习:
1.先说明本文提出的set to set的提取各个层的特征的方式确实是有效果的。
2.再详细讲是如何实现set to set metric的,具体的对各个层的特征是如何操作的(embed simple self-attention modules in between convolutional blocks)。
3.最后说明在各个数据集上的效果。
同时这篇工作也启发了我:除了利用各个阶段的特征进行度量,还能利用什么特征进行度量呢?于是就诞生了我的第一篇工作,利用图像的各个区域(多尺度)的特征进行度量。
论文链接:https://openaccess.thecvf.com/content/CVPR2022/papers/Hu_Pushing_the_Limits_of_Simple_Pipelines_for_Few-Shot_Learning_External_CVPR_2022_paper.pdf
如上图所示,这篇工作提出了: Pre-training → Meta-training → Finetuning (P>M>F) 的小样本学习的新范式,即先在大的数据集上进行与训练,然后再小样本数据集的训练集上进行元训练,最后再在小样本数据集的测试集上利用少量样本进行微调。
同时,作者发现这种徐训练方式对小样本任务是非常奏效的,达到了sota(现在的 paper with code的排行榜依然是第一名)。
最重要的是,本文的代码尝试了十几种不同的 backbone 以及 多种不同的小样本数据集(包括单域和跨域),是一篇很适合作为baseline的文章。代码非常值得跑一跑逐行的去学习下。、
但是美中不足的是,在对metadata进行训练的过程中可能是因为cpu的ram并没有及时释放,会出现爆内存的情况。
论文链接:https://openaccess.thecvf.com/content/CVPR2023/html/Chen_Semantic_Prompt_for_Few-Shot_Image_Recognition_CVPR_2023_paper.html
这篇文章代表一类工作,都是利用Clip的基本思想应用到小样本学习任务中,其遵循clip的基本范式,即利用文本编码器去辅助或者指导视觉模型的训练。如下图所示:
其实现方式也比较简单,具体来说是利用来文本的编码器得到的特征,对视觉编码器的训练过程进行一个显示的干预,作者提出了两种文本信息和视觉交互的方式:通道交互和空间交互。具体pipline如下:
但是,这类方法存在一个明显的问题:文本和视觉模态这件存在天然的模态之间的gap,导致生成的文本特征并不能很好的辅助或者指导视觉模型的训练,我正是从这篇工作中得到启发,同时模仿了这篇工作的写作风格,完成了自我提示的一篇工作并被 AAAI2024 接收。