原文链接:Contrastive Clustering (pengxi.me)
研究目标:实现图片的聚类
现存的方法主要依靠多轮迭代聚类来找出最终的聚类结果,这存在的问题有:
1. 迭代过程中积累误差(例如学习instance-representation和聚类交替进行的迭代方式)
2. 只能针对全部数据来做统一的聚类,无法处理实时的流数据
为了解决以上问题,本文提出的方法是:「“label as representation”」
将聚类结果(label)视为一种特殊的representation来学习,这样就把cluster prediction 转换为representation learning问题。基于此,每有一个batch的数据,我们就可以训练模型,不需要提前收集到所有的数据,因此可以在线处理实时数据流。
在明白sense以后,来看看本文如何实现将 cluster prediction 转换为representation learning问题,通过理解下面的框架,可以明白整个算法流程:
Part1: Pair Construction Backbone (PCB)
该部分做两件事情:
(1)对图片进行data augmentation。将原始图片x生成为xa和xb。
(2)feature extraction by sharing network,本文使用的是 ResNet34 框架。「例如:ha中的每一行对应xa中的一张图片的特征。」
Part2: Instance-level Contrastive Head (ICH)
该部分利用Contrastive learning计算loss,从而训练network。
(1)利用MLP 将ha和hb转换为za和zb,一行对应一张图片的feature,列数是feature的维度。假设一个batch有n张图片。
(2)Instance Contrastive learning需要有Pos和Neg,此处定义为:
Pos:za和zb对应的行是来自同一张图片,需要缩小他们的距离。
Neg:对于za中的一行feature,剩下的2n-2行 和它组成neg pairs。
Part3: Cluster-level Contrastive Head (CCH)
该部分比较新颖!!
ya和yb的行数是图片数量n,列数是cluster的数目m。因此,一张图片会被映射到一个cluster,理想状态中一行是一个one-hot向量。由于xa和xb对应的行是一张图片,所以ya和yb中对应的列应该是相同的。
Cluster Contrastive learning需要有Pos和Neg,此处定义为:
Pos:ya和yb中对应的列。
Neg:对于ya中的每一列,剩下的2m-2列和它组成neg pairs。
公式:依据上面对流程的理解,此处loss 函数已经很好理解了:
在以上两种Contrastive learning的loss计算中,使用cosine similarity(公式(1)和(4))来度量两个vector的相似性,loss函数分别为公式(3)和公式(6),最终将两个loss相加作为最终的loss。
公式(2)和公式(5)的训练目标都是实现分母大,分子小,即Pos的相似性高,Neg的相似性低。
公式(3)和公式(6)就是将所有loss求平均。在公式(6)当中有一个H(Y),H(Y) is the entropy of cluster assignment probabilities, 文中写这是为了避免将大多数instance分配到同一个集群。
实验结果:
cluster指标优于现有方法,平均10%左右:
随着epoch的变化,cluster的预测越来越准确:(note:训练好的CCH可以用于预测一个新数据的cluster类别,取一行向量中概率最大的那个cluster即可)
探究data augmentation对性能的影响:
发现当xa和xb都进行da时效果是最好的,如果不进行da,效果会很差:
下面探究两个contrastive learning的必要性:
发现ICH Only性能也不错(此时没有CCH,无法直接预测cluster类别,所以将学出来的representation用K-means聚类出结果),但想要实现在线的直接预测cluster,还是得用ICH+CCH。