论文地址 HCSC: Hierarchical Contrastive Selective Coding (arxiv.org)
开源代码 PyTorch implementation of Hierarchical Contrastive Selective Coding (HCSC)
HCSC 层次语义结构存在于图像数据集中,其中几个语义相关的图像集群可以进一步集成到一个更粗粒度更大的集群中。用图像表示来捕获这样的结构可以极大地促进对各种下游任务的语义理解。HCSC 构建了一组层次原型,并动态更新,以表示潜在空间中数据的层次语义结构。为了使图像表示更好地适合这种语义结构,采用并通过一种复杂的配对选择方案进一步改进了传统的实例式和原型对比学习。该方案寻求选择具有相似语义的更多不同的正对和具有真正不同语义的更精确的负对。在广泛的下游任务中,我们验证了HCSC优于最先进的对比方法的性能,并通过大量的分析研究证明了主要模型组件的有效性。
一个图像数据集总是包含多个语义层次结构,例如。“哺乳动物→狗→拉布拉多犬”的顺序是从粗粒度语义到细粒度语义。
现有的对比方法主要可以分为两类,实例式对比学习和原型对比学习(这两种方式可以理解为原型是一个类,而实例是一个类的具体实现即对象)。实例对比寻求映射潜在空间中附近的相似实例,而将不同的实例映射到遥远的距离,从而保证了不同图像表示之间合理的局部结构。原型对比的目的是获得聚集在相应的集群中心周围的紧凑的图像表示,从而捕获一些可以由单一集群层次表示的基本语义结构。然而,在建模一个总是具有多个语义层次的大规模图像数据集时,这些方法的表示能力滞后。例如:在一个广泛的物种数据库中,狗群总结了拉布拉多犬、贵宾犬、萨摩耶德犬等的共同特征。应该被置于更高的层次;同样,狗和猫、猴子、鲸鱼等。进一步总结了一个更高层次的集群,哺乳动物。学习包含这种层次语义结构的图像表示可以极大地有利于对各种下游任务的语义理解。如何通过对比学习来实现这一目标仍然是一个有待解决的问题。
HCSC 提出了一种新的对比学习框架,称为层次对比选择编码(HCSC)。在这个框架中,我们建议用层次原型捕获数据底层的层次语义结构,这是潜在空间中一组树结构的代表性嵌入。在训练过程中,这些原型被动态更新,以适应当前的图像表示。
在这种层次语义结构的指导下,我们试图通过选择语义正确的高质量的正对和负对来改进实例级和原型级的对比学习。具体来说,对于每个查询样本,我们在每个语义层次结构上搜索其最相似的原型,以构建更丰富的正对。此外,对于每个负对的候选对象,如果负对的语义相关性为低/高,我们将进行伯努利抽样来保持/丢弃它。通过使用这些选择的对进行实例化和原型化的对比,可以将来自层次原型的语义约束嵌入到表示学习的目标中。
提出了通过动态维护层次原型来表示图像表示的层次语义结构。
提出了一种新的对比学习框架,层次对比选择编码(HCSC),它通过选择语义正确的正负对来改进传统的实例式和典型的对比学习。
HCSC方法在各种下游任务上始终取得了比更先进的对比学习算法更好的性能。
给定一组X={x1,x2,···,xN}未标记的图像,对于每个图像学到一个低维δ的向量表示z,同时维护一组层次原型,其中L代表语义层次结构的数量,和Ml层次的原型的数量。每个原型分枝C也被表示为一个δ维向量。
实例对比学习,为了实现自我监督表示学习的目标,一种广泛使用的方法是对比一个正实例对和一些负实例对。具体来说,给定一对相关实例的表示(z,z0),定义了一个标准的InfoNCE损失[36],以最大化这个正对之间的相似性,并最小化一些随机抽样的负对之间的相似性:
原型对比学习。在这种对比表示学习方式中,每个正对由一个实例及其相关的语义原型组成,负对是由实例与不相关的语义原型配对形成的。在这种对构造的方式中,给定一个正对(z,c),ProtoNCE损失基于相同的InfoNCE损失的原理去细化:
具体实现参见开源代码。关于如何捕获底层的层次语义结构,作者使用层次 K-means算法聚类。
HCSC框架的核心是构建和维护数据的层次语义结构潜在空间。与以前的方法只能捕获单一语义层次或多个独立层次的相比,我们的方法能够捕获各种语义集群之间的层次关系。我们通过一个简单而有效的分层K-means算法来实现这一点,该算法以自底向上的方式实现这一点。
算法实现过程: 首先,利用图像编码器提取数据集中所有图像的特征表示,并对这些图像表示进行K-means聚类,得到第一层次的原型。然后,通过迭代应用K-means聚类,得到每个更高层次的原型。为了构建层次语义结构,我们进一步将每个原型与其父原型连接到更高的层次上,在K-means聚类过程中,被分配给。所有这些连接都形成了一个无向边集e。通过这种方式,层次原型被结构为一组树。在该算法中,在分段中指定了语义层次数L和第l个层次上的原型数Ml。
由于图像表示是在训练过程中不断更新的,因此还需要对层次原型进行维护方案,以确保它们是潜在空间中的表示嵌入。在我们的实现中,为了平衡精度和效率,我们在每个epoch开始前进行层次K-means算法,以根据当前的图像表示更新层次原型。
实例对比学习:的要点是在潜在的空间中嵌入相似的实例,而将那些不同的实例嵌入到遥远的地方。通过数据增强很容易获得一个相似的(即正的)实例对,而不相似的(即负的)实例对的定义则不是平凡的。以前的方法是通过在数据集上均匀采样或从去偏数据分布中采样来获得负样本。但是,它们不能保证产生的负样本相对于查询样本具有完全不同的语义。这种缺陷阻碍了实例级对比学习,即那些语义相关的正候选对象可能会在潜在空间中被错误地从查询样本中驱逐出去,从而使语义结构在一定程度上被破坏。为了克服这个缺点,我们的目标是选择更精确的负样本,它们与查询拥有真正无关的语义。通过对每个负候选样本进行伯努利抽样来选择真正的负样本进行对比。定义了图像和语义聚类之间的相似性度量。特定的点积定义图像表示z和该聚类之间的语义相似性。
for layer in range(len(im2cluster)):
proto_logit = torch.mm(self.queue.clone().detach().permute(1, 0), centroids[layer].permute(1, 0))
density[layer] = density[layer].clamp(min=1e-3)
proto_logit /= density[layer]
label = im2cluster[layer][index]
logit = proto_logit.clone().detach().softmax(-1)
p_sample = 1 - logit[:, label].t()
queue_p_samples.append(p_sample)
原型对比学习:的目的是在潜在空间中获得紧凑的图像表示,其中每个图像都紧密地嵌入在其相关的聚类中心周围。给定一个查询样本,之前的工作将其与单个原型池进行比较,他们将其最相似的原型视为它的正同伴,而将所有其他原型视为负样本。然而,该方案忽略了不同集群之间的语义相关性,可能会对某些语义相关的集群进行过度惩罚。例如,给定一个拉布拉多犬的图像,考虑到语义相关性,它不应该被强烈地从其他种类的狗的图像集群中驱逐出去在这些集群。为了减轻这种过度惩罚,我们试图选择在语义上距离查询的更精确的负集群。
实验略。
这项工作提出了一种新的对比学习框架,层次对比选择编码(HCSC)。在这个框架中,数据底层的层次语义结构被层次原型捕获。在此基础上,设计了一种新的对选择方案,以更好地选择正对和负对进行对比学习。对各种下游任务的大量实验验证了我们的HCSC方法的优越性。
目前HCSC方法的主要局限性是在预训练中发现的层次原型在下游任务中被丢弃。但是,这些原型包含丰富的语义信息,它们应该在某种程度上有利于对下游应用程序的语义理解。因此,我们未来的工作将主要集中在通过充分利用分层原型来提高模型在下游任务上的性能。
这篇论文的开源代码实现比较麻烦,本人也在学习阶段,有问题欢迎讨论。