持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
本文共计1945字,阅读大概需要花费4分钟
论文地址:Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
如果你不懂什么是对比学习,直接看这篇文章会很吃力。建议阅读本文之前先看看两篇前馈文章:
如果你不想看这两篇文章也没有关系。我会尽力尽力,说得通俗易懂。毕竟我也是初学者,所以我感觉我理解的肯定容易让小白也理解。如果有什么漏误欢迎各位大佬批评指正。我们称这篇论文为SwAV。
对比学习简单来说就需要找出正样本和负样本互相对比。在前面的这个学习的工作中,大家提出了各式各样的政府样本的选取方式,比如:
- 将整个imagenet做成字典,从中抽取一个mini batch作为正样本。再从中随机抽取4096条作为负样本。
- 从数据集中抽取一个mini batch对其增广,使用一个孪生网络,将原图放进一个网络,将增强之后的图放进另一个网络,二者同时进行训练,对二者使用一个NCE loss或者infoNCE loss。一张图片和它的增广作为正样本,剩余的图片及其增广作为负样本。
- 从数据集中抽取一个mini batch对其进行两次增广,使用一个孪生网络,将一组图片增强放进一个网络,将另一组图片增强放进另一个网络,二者同时进行训练,对二者使用一个NCE loss或者infoNCE loss。
乍一看上面的做法好像都没有什么问题,做出来的最后效果也挺好的,但是这个时候一个做聚类的大佬跳了出来。他说不管你们对比学习的负样本怎么选择,你们的整个mini match都是从imagenet中随机抽取的,所以你们的负样本具有随机性。
- 它可能会重复的抽取到同一数据。虽然你数据集有很多图片,但是你从中抽可能会抽到相同的图片。极端的情况下,如果你抽到一组图片作为正样本,然后你又抽到同样重复的一组图片作为负样本。那这样就会对训练造成影响。
- 也可能不具有整个数据集的代表性。比如这个数据其实有很多很多种动物,但是你抽到的都是狗,这样数据就是没有代表性的。
- 当然这样的选取的越全面效果越好,但是如果你选取的过多的负样本又会造成计算资源的浪费。
所以我提出用聚类。
看一下上边图像。
左侧是常规的对比学习。将数据进行不同内强的增强,然后将增强后的两份数据分别放入不同的模型当中获得对应的表示,最后进行对比。
右侧是作者提出的网络。也是将输入进行不同的增强,增强之后的数据也会进入到一个网络之中,获得相应的表示之后不会直接拿去做对比。中间加了一个C模块,这个模块是一个聚类模块。你得到的数据需要去跟聚类的中心比。
聚类中心就是右图里的c,也就是个prototype,它其实就是个矩阵,它的维度是d 乘以 k,d是特征的维度,这里的d和特征的d 是一样的,比如说就是之前说的128维,这个k就是有多少个聚类中心。在这篇文章中它选的是3,000,ImageNet数据集上常用的一个参数聚类参数。
通过clustering让特征z和prototype c生成一个目标,也就是上图的q1、q2。
x1、x2是正样本的话,那z1 和 z2的特征就应该很相似,也就跟之前对比学习一样,z1和z2要尽可能的相似。那如果两个特征非常相似,按道理来说应该是可以互相去做预测的,也就是说,如果拿z1这个特征去跟c去做点乘,按道理来说也是可以去预测q2;反之亦然,z2和这个c去做点乘也可以预测q1,所以说点乘之后的结果就是预测。通过这种换位预测(Swapped prediction)的方法,SwAV可以对模型进行训练。
最后的目标函数是这一个:
−1N∑n=1N∑s,t∼T[1τznt⊤Cqns+1τzns⊤Cqnt−log∑k=1Kexp(znt⊤ckτ)−log∑k=1Kexp(zns⊤ckτ)]-frac{1}{N} sum_{n=1}^{N} sum_{s, t sim mathcal{T}}left[frac{1}{tau} mathbf{z}_{n t}^{top} mathbf{C} mathbf{q}_{n s}+frac{1}{tau} mathbf{z}_{n s}^{top} mathbf{C} mathbf{q}_{n t}-log sum_{k=1}^{K} exp left(frac{mathbf{z}_{n t}^{top} mathbf{c}_{k}}{tau}right)-log sum_{k=1}^{K} exp left(frac{mathbf{z}_{n s}^{top} mathbf{c}_{k}}{tau}right)right]
ImageNet才1000类,因此这里聚类聚成3000个是非常足够的。那我们来看一下使用聚类能解决什么问题。
- 先说重复问题:因为你使用的是聚类中心进行比较。虽然是不同的聚类中心,那么他肯定不可能出现重复的情况。
- 再说一下没有代表性的问题:聚类就是将众多的图片聚成不同的类别。与每一个类别的中心进行对比,是绝对具有代表性的。
- 再说一下过去有过多负样本造成资源浪费的问题。如果要跟很多的负样本去做类比,可能就需要成千上万的负样本,而且即使如此也只是一个近似,而如果只是跟聚类中心做对比,则可以用几百或者最多3,000个聚类中心,就足以表示了。大大减少了计算资源消耗。
除了聚类,SwAV还提出了一个muti crop的方法,感兴趣的可以自己去看一下。
最后我们来看一下它的效果。
因为这篇文章是在BYOL之前出来的,所以它只和前面的模型做了一下对比,我们可以明显的看到。他比我们之前提到的无监督对比学习方法效果都要好,效果直逼有监督的方法。其实它甚至比身后的BYOL 和 SimSiam效果也要好。
而且当使用更大的模型的时候,也就是像图里说的一样,把一个Res50变宽,而且就是这里的2倍、4倍、5倍这么宽的时候,SwAV的结果还能不停地涨。当用最大的模型(5倍的模型)的时候,SwAV已经跟有监督的模型,差距非常的小,而且SwAV也是要比SimCLR*2、SimCLR *4要高的。这篇文章还是非常值得一读的,并且作者也从另一个角度给我们提出了一个改进方法,就是要让样本更具有代表性。这篇文章非常推荐大家看一看。