今天分享的文章是Google和DeepMind联合发表在ICCV21的工作《With a Little Help from My Friends: Nearest-Neighbor Contrastive Learning of Visual Representations》。
以往的对比学习大多都是基于实力判别任务进行的,即一张图片通过不同的图像增广方式获得两个数据增广,将来自同一张图片的数据增广视为正样本,将来自不同图片的数据增广视为负样本,拉近正例之间的距离,拉远负例之间的距离。
让我们回顾一下人类是如何识别物体的。比如给出一张渡渡鸟的图片,即使不知道这个是渡渡鸟,但是人们还是会将渡渡鸟和其他同类别的东西之间产生联系。比如,渡渡鸟更像鸡或者鸭,而与大象和老虎不像。这种感觉在人类区分物体时是很常见的,并且帮助人们对物体进行区分。
实例判别任务在对比学习中是十分常见的。但是其仅仅是对同一张图片进行不同的数据增强,获得不同的角度。但是将同一个图片进行数据增强是无法提供以下这些信息:同一张图片的不同视角,同一对象的变体,相同语义类别中其他类似实体。
因此作者不仅学习单一实体,做单一实体判别任务,而是找到数据集中与该图片最近邻的元素互为正例。
如图1所示,首先将一张图片 x 通过不同的数据增广方式得到 x_{1} 和 x_{2} ,之后使用encoder将 x_{1} 和 x_{2} 编码为 z_{1} 和 z_{2} ,之后在数据集中寻找和 x_{1} 最近邻的元素作为 x_{2} 的正例,进行对比学习。
SimCLR使用两个增广后的嵌入互为正例 \left( z_{i} ,z_{i}^{+}\right) 。在NNCLR中,使用的是最近邻和增广互为正例 \left( z_{i} ,Q\right) 。和SimCLR一样,负例来自于batch中的其余图片。
让我们梳理以下前向传播过程,一个batch中有N张图片,对其进行增广得到2N张图片,在support set中找到最近邻的N张图片,让最近邻的N张图片和增广后的图片互为正例,让其余2(N-1)张图片作为负例子。损失函数如下:
类似于MOCO,NNCLR使用了一个队列support set来存储最近邻样本。这个support set也是随着训练不断更新的,更新方式类似于MOCO中的memory queue,是先进先出的。队列的大小是 \left[ m,d \right] ,其中 m 表示队列的大小(可以容纳多少个最近邻), d 表示嵌入的大小。在每一个batch结束后,对队列进行更新,将最老的N个样本出队,将该batch中的N个样本入队。队列大小尽量的大,如果够大,可以实现队列和数据集的近似。
算法如下:
带有动量更新的算法:
作者在附录中还提到将最近邻的思想替换掉SimSaim中数据增强的部分。
其实本文的核心思想就是将最近邻替换掉数据增广。原来使用一张图片进行两次数据增广,现在使用的是一个数据增广和一个最近邻。最近邻可以增加数据的多样性,所以效果更好。
实验细节:使用的backbone encoder是ResNet-50,encoder输出是2048维的向量。非线性投影是三层MLP,维度变化是 \left[ 2048,2048,d \right] 。本文中 d=256 。prediction MLP是两层全连接,维度是 \left[ 4096,d \right] 。
线性实验结果:
像之前对比学习实验一样,作者固定了NNCLR对图片编码得到的2048维度嵌入,并且将其输入到分类器中,观察实验结果。
发现NNCLR不仅比基于实例判别任务的MOCO v2,SimCLR v2要好,话和InfoMin表现类似,同时超过了BYOL。NNCLR效果还比加入了聚类任务的SwAV要强。
半监督测试:
在1%和10%测试数据的情况下,对模型进行半监督测试,得到结果如下所示:
迁移学习的效果,在其他数据集下,对任务进行测试:
消融实验:
1,作者对比了使用最近邻和数据增强的区别,
2,作者对比有数据增广和没有数据增广下模型的效果:
发现去掉数据增广对NNCLR的影响是最小的,对SimCLR和BYOL的影响是十分巨大的。
3,预训练的epoch对模型效果的影响