自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters

Introduction

通过前面几篇文章的介绍,我们已经直到自监督学习的目的是为了学习图像中的高级语义特征。然而,目前的自监督学习方法在很多任务上落后于ImageNet预训练模型,一个最可能的原因是自监督学习设计的pretext任务,不可避免的会学习到图像的颜色、纹理等低层次的特征,导致模型的泛华能力下降。而ImageNet预训练模型训练的时候使用的是具有分类标签的数据,可以有效地避免网络学习到颜色和纹理等不必要的特征,大大降低模型过拟合的程度。因此,我们可以很自然的想到,可不可以先用聚类为图像标注分类标签,之后训练分类网络,再利用分类网络提取的特征对分类标签进行调整,如此循环往复,最终得到或接近人工标注的结果。这个实际上也是实现无监督学习的一种方法,它可以利用聚类方法不需要手工标签和CNN强大的特征抽象能力。这篇博客介绍的论文就属于这一类方法,当然方法要更复杂一些,效果也更好 (实际上,上面的思路在实际上很可能是没用的,太简单了) ,改文章发表在CVPR2016上,论文地址

Method

论文中提到的方法分为两个步骤,一个是利用CNN特征进行聚类,确定类别的标签;另一个是设计了损失函数,对CNN的特征进行调整。
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters

Agglomerative Clustering

聚类方面,作者是使用了层次聚类的方法,关于该方法的详细介绍可以参考这篇博客:层次聚类。这里作者采用的是自下而上的合并型聚类方式,即初始阶段将每一个样本点都视为一个单独的类别,之后依次计算样本点之间的相似度(affinity or similarity),将相似度接近的样本聚合成一类,这里计算样本间相似度使用的是如下的方法:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters
样本iijj的相似度用符号W(i,j)W(i,j)表示。随着迭代次数的增加,还需要计算的是不同簇之间的相似度,计算不同簇之间相似度有很多的方法,这里作者借鉴了这篇文章中的方法:计算簇相似度的方法。如果不想看原文的话,只需要记住,文中使用A(ci,cj)A(c_i,c_j)表示簇cic_icjc_j的相似度,而且值越大,表示越接近,越有可能合并到一起。另外,文中还定义了其他的一些符号,包括I={I1,...,Ins}I=\{I_1,...,I_{n_s}\}表示输入图像,X={x1,...,xns}X=\{x_1,...,x_{n_s}\}表示CNN从II中提取到的特征,C={C1,....,Cnc}C=\{C_1,....,C_{n_c}\}表示聚类的簇,NiKsN^{K_s}_i表示xix_iKsK_s近邻,NCiKsN^{K_s}_{C_i}表示CiC_iKsK_s近邻。最后需要说明的是,NCiKsN^{K_s}_{C_i}中的簇是按照相似度降序排列的,也就是说NCiKs[1]N^{K_s}_{C_i}[1]表示CiC_i的最近邻。

Loss Function

作者使用CNN提取图像的特征,之后利用聚类方法对其进行标注,但是训练CNN作者并不是使用的聚类标签,而是根据聚类的特点,设计了一个损失函数。这部分是文章的核心创新点,如果我们将CNN网络视为分类网络,直接使用聚类标签对其进行训练的话,很有可能得到理想的效果。
作者在这里采用的损失函数如下所示:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters
损失函数分为两部分,第一部分为衡量的是簇CiC_i和它的最近邻之间的相似度,我们希望他们的相似度越大越好,也就是说这两个簇需要尽可能接近,这样下一次迭代的时候很有可能会合并。损失函数的第二部分看起来可能比较绕,但是要实现的目标很好理解,这部分的目的是保证簇CiC_i的最近邻(假设为CjC_j),与其他的簇的相似度尽可能小,也就是说尽可能远离其他的簇。如下图所示:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters
损失函数的第一项就是计算的b和d的相似度,他们需要越大越好,然后第二项是计算d和e,c等的相似度,使他们尽可能远离。

网络在迭代的时候,首先要根据CNN提取的特征计算各个聚类的重点P,之后计算损失函数,利用梯度反传,更新网络参数。感觉更新的过程就是这样,但是作者在原文里写的很复杂,不知道是不是自己理解的问题。下面是迭代过程的伪代码:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters

Experiments

为了验证本文中方法的效果,作者主要做了三个实验,分别来验证图像聚类的效果,跨域数据的聚类效果和图像分类的效果。

Image Clustering

作者在这里和12个聚类方法在8个数据集上进行了对比,对比的数据集如下:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters

对比的结果如下图所示:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters
作者使用NMI(Normalized Mutual Information)来衡量聚类的效果,可以看出,论文中提出的方法在所有数据集上都取得了最好的效果,证明了该方法的有效性。

Transferring Learned Representation

在这个部分,作者使用一个数据集上训练网络,在另一个数据集上对网络进行测试,结果如下:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters
列data表示直接使用目标域数据进行聚类,其他列表示从CNN的哪一层提取特征进行聚类,可以看出,论文中的方法取得了更好的效果,这证明该方法具有更强的泛华性能。

Image Classification

最后,作者在CIFAR-10数据集上验证了该方法的分类性能:
自监督学习(四)Joint Unsupervised Learning of Deep Representations and Image Clusters

Conclusion

这篇文章总体上看,更像是一篇介绍无监督方法的文章,和之前我们介绍的自监督方法在应用上有些差别。但是该方法完全可以应用到自监督任务中,所以这里也对这篇文章进行了介绍。自监督与聚类方法的结合,可能会产生比单纯设计pretext task更好的效果。