前言
这篇论文于2020.08挂在arxiv上 (点击阅读),作者来自俄勒冈州立大学。本文提出了一种新的自监督少样本学习算法,我认为对无监督少样本学习的研究具有借鉴意义。
本文用于记录对论文算法及核心思想的展示和理解,出现的图片及公式均来自论文原文。
本人也在研究自监督少样本方面,并将实验结果总结在论文Few-Shot Image Classification via Contrastive Self-Supervised Learning中,欢迎大家阅读交流~
一、研究背景
少样本学习是目前比较流行的一个研究方向,但大部分的算法都是基于episode training来做的,这在前期训练时需要大量的有标签样本。这样实际上违背了我们的初衷。在mini-ImageNet上测试时,我们使用ImageNet中的部分图像训练就可以得到较好的迁移性。
但试想一下,现在要在医学领域中做FSL。那么我们无法用ImageNet做episode training,因为data domain差距过大,从base classes到new classes的迁移性会消失。但我们又无法获得大量有标签的医学影像。这将是一个两难的境地,我们无法进行之前的episode training。
因此在FSL中使用无监督学习就很重要了,我们可以用大量相同domain的图像(无需标签)进行预训练,之后再用一个FSL task中的少量labeled images进行分类。
二、核心思想
在无监督少样本学习方面,除去2019年论文中的一些打伪标签再进行task-based training(episode training)的方法外,我认为主要的发展方向是先用自监督的方式获得一个泛化性强的特征提取器,再将其直接用到后续的少样本分类任务(FSL)中。可有的创新点在于找到一个适合FSL的自监督学习上游任务,以及在拥有良好的feature extractor后,如何用少量的support set分类。
比如在我的论文中,自监督学习部分直接采用了CMC算法,后续用一些方法训练一个简单分类层,也取得了不错的效果。
在本文中,作者的发力点在自监督学习部分,后续在FSL中直接采用Prototypes Net的做法进行度量分类。作者使用GAN作为主干模型,训练时增加了重构损失和triplet loss作为提升性能的手段。训练完成后,D就成为了优秀的feature extractor。
其中,一个很大的创新点在于,一组triplet中的正负样本和anchor均来自于同一张图像。
具体做法是,作者对某张图像进行小正方形区域的mask,当mask位于图像中心时,成为负样本;mask位于角落时,成为正样本;原图就是anchor。这是因为作者发现,图像中心区域包含目标的概率更大,对特征影响最大。
如下图所示
三、论文算法
掌握思想是最重要的,具体算法流程就不做详细介绍了~
1. 网络结构
结构和传统GAN类似,只是为了增加重构损失,将D的输出分成了两支,一支 D r / f D_{r/f} Dr/f输出分类结果,一支 D z D_z Dz输出重构的语义特征。
2. 算法流程
我们只介绍自监督训练部分的过程:分为两阶段。全程不使用标签哦~
1. First stage:使用分类损失和重构损失交替训练G和D
2. Second stage:认为G已经训练完成,不再训练;在第1步的基础上,使用triplet loss单独训练D。
具体损失函数的设计可以看论文原文学习。
3. 实验结果
除了在基准数据集上的实验,作者还做了很多消融实验,结果发现在取triplet数据时,mask的大小设置为
16
∗
16
16*16
16∗16的效果最好。并且每一个损失的设计以及两阶段的训练方式都对性能有提升作用。
思考
1、为什么重构损失中,将 z ^ ′ \hat{z}' z^′与 z ′ z' z′比较,而没有和 z z z比较?
原始的GAN损失函数保证了G生成的图像和真实图像的分布接近,那么
z
^
′
\hat{z}'
z^′和
z
z
z的分布也应当是相近的。但这并不代表两个向量要相同。
其实
z
^
′
\hat{z}'
z^′和
z
z
z是没有太大关系的,它们是两张不同图像的语义特征,之间没有相同性的要求。
2、重构损失有效的原因是什么?为什么直接用原始GAN中D的分类层的输入值,作为对输入图像提取的语义特征,效果会差一点?
直观来看,这个损失保证了D提取出的隐性语义特征
z
^
′
\hat{z}'
z^′,非常接近于用于生成该图像的随机噪声
z
′
z'
z′。
我们可以将
z
′
z'
z′看作是图像的深层语义特征,G是一个解码器,从feature中恢复出原图。那么D就是编码器,从图像又提取出feature。
在G、D交替训练的过程中,二者的能力都变得很强:G可以很好地恢复出原图,D可以提取出具有良好区分性的特征。因此在某一种方式的解编码下,网络收敛到最优解时,
z
^
′
\hat{z}'
z^′与
z
′
z'
z′是相同的。
我觉得必然存在其他的解编码方式,使得解码的输入和编码的输出是不同的。但是如果训练时选择了本文的重构损失,那么就是想让网络实现解码的输入和编码的输出相同。
那么训练时采用这样的重构损失,是有助于G、D共同进步的。最终, D z D_z Dz可以成为一个良好的特征提取器。
同时,我认为重构损失是对网络训练增加了一层保障。 原始GAN的损失就可以使得D提取到良好的feature(因为只有先提取出有效的feature,才能完成对真假图的判断)。从前两段的分析可以看出,重构损失则是加强了训练效果。因此加上重构损失的实验效果更好一点。
或许,可以尝试一下,直接对原始D网络的分类层前,最后一层卷积的输出结果,计算重构损失。
突然感觉,作者添加FC层去获得最终的 z ^ ′ \hat{z}' z^′,是为了使得 z ^ ′ \hat{z}' z^′和 z ′ z' z′的维度相等。
3、增加第二阶段triplet损失的好处?
在第一阶段的自监督训练过程中,我们已经获得了一个较好的特征提取器,即
D
z
D_z
Dz。第二阶段的训练是为了在一阶段的成果上,获得一个效果更好的特征提取器。在训练时使用triplet loss,可以拉近相同图像的特征、并使不相似图像的特征变远。
第二阶段的训练有蒸馏学习的意味。
上面的思考比较抽象 ==,是我自己脑子里思路乱转想出来的,大家仅供参考!如果大家有独到的理解,欢迎和我讨论啊~