image.png

论文地址:Unsupervised Learning of Visual Features by Contrasting Cluster Assignments http://arxiv.org/abs/2006.09882

代码地址:https://github.com/facebookresearch/swav

这篇论文最好需要接着前两篇论文往下看。你直接看的话可能会有点吃力。除非你已经了解什么叫对比学习了。如果你不想看这两篇文章也没有关系。我会尽力尽力,说得通俗易懂。毕竟我也是初学者,所以我感觉我理解的肯定容易让小白也理解。如果有什么漏误欢迎各位大佬批评指正。我们称这篇论文为SwAV

  1. 诸神黄昏时代的对比学习
  2. “军备竞赛”时期的对比学习好。

对比学习简单来说就需要找出正样本和负样本互相对比。在前面的这个学习的工作中,大家提出了各式各样的政府样本的选取方式,比如:

  • 将整个imagenet做成字典,从中抽取一个mini batch作为正样本。再从中随机抽取4096条作为负样本。
  • 从数据集中抽取一个mini batch对其增广,使用一个孪生网络,将原图放进一个网络,将增强之后的图放进另一个网络,二者同时进行训练,对二者使用一个NCE loss或者infoNCE loss。一张图片和它的增广作为正样本,剩余的图片及其增广作为负样本。
  • 从数据集中抽取一个mini batch对其进行两次增广,使用一个孪生网络,将一组图片增强放进一个网络,将另一组图片增强放进另一个网络,二者同时进行训练,对二者使用一个NCE loss或者infoNCE loss。

乍一看上面的做法好像都没有什么问题,做出来的最后效果也挺好的,但是这个时候一个做聚类的大佬跳了出来。他说不管你们对比学习的负样本怎么选择,你们的整个mini match都是从imagenet中随机抽取的,所以你们的负样本具有随机性。

  • 它可能会重复的抽取到同一数据。虽然你数据集有很多图片,但是你从中抽可能会抽到相同的图片。极端的情况下,如果你抽到一组图片作为正样本,然后你又抽到同样重复的一组图片作为负样本。那这样就会对训练造成影响。
  • 也可能不具有整个数据集的代表性。比如这个数据其实有很多很多种动物,但是你抽到的都是狗,这样数据就是没有代表性的。
  • 当然这样的选取的越全面效果越好,但是如果你选取的过多的负样本又会造成计算资源的浪费。

所以我提出用聚类。

image.png

看一下上边图像。

左侧是常规的对比学习。将数据进行不同内强的增强,然后将增强后的两份数据分别放入不同的模型当中获得对应的表示,最后进行对比。

右侧是作者提出的网络。也是将输入进行不同的增强,增强之后的数据也会进入到一个网络之中,获得相应的表示之后不会直接拿去做对比。中间加了一个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可以对模型进行训练。

最后的目标函数是这一个:
$$
-\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的方法,感兴趣的可以自己去看一下。

最后我们来看一下它的效果。
image.png

因为这篇文章是在BYOL之前出来的,所以它只和前面的模型做了一下对比,我们可以明显的看到。他比我们之前提到的无监督对比学习方法效果都要好,效果直逼有监督的方法。其实它甚至比身后的BYOL 和 SimSiam效果也要好。

而且当使用更大的模型的时候,也就是像图里说的一样,把一个Res50变宽,而且就是这里的2倍、4倍、5倍这么宽的时候,SwAV的结果还能不停地涨。当用最大的模型(5倍的模型)的时候,SwAV已经跟有监督的模型,差距非常的小,而且SwAV也是要比SimCLR *2、SimCLR 4要高的。这篇文章还是非常值得一读的,并且作者也从另一个角度给我们提出了一个改进方法,就是要让样本更具有代表性。这篇文章非常推荐大家看一看。