对比学习笔记
基本结构
对比学习属于自监督学习,不需要人为地去标注标签,就能让模型学习到数据的特征表示。
其目标是,在潜空间中,相似的样本应该距离较近,而不相似的样本应该距离较远。
其主要结构如下
graph LR
A[C的数据增强C']-->En{Encoder}
B[给定样本C]-->En
C[毫无关系的样本D]-->En
En-->Aen[C'对应表示]
En-->Ben[C对应表示]
En-->Cen[D对应表示]
Aen-->L1{loss1}
Ben-->L1
Cen-->L2{loss2}
Ben-->L2
我们希望样本C与其数据增强C’的对应表示距离较近(减小loss1);
我们希望样本C与毫无关系的样本D的对应表示距离较远(增大loss2);
这就是对比学习的基本原理。
这看起来好像是一个新知识,但其已经被应用在了GraphSAGE模型的训练中了。参考往期:https://blog.57u.tech/2025/09/17/GraphSAGE-note/
CLIP模型
论文: https://arxiv.org/abs/2103.00020
CLIP模型通过在网上获取带字幕的图片作为训练数据(文字-图片对),来学习文字和图片的特征表示。
因此需要两个Encoder,一个用于编码图片,一个用于编码文字。而对于相似度计算,可以使用余弦相似度,避免模型学到直接将模长拉长

左图中描述的就是相似度矩阵。共有个文字样本与个图片样本,共同组成了一个的矩阵。
只有对角线位置上的结果匹配的,需要增大这些值;而其余位置上是不匹配的值,需要减小这些值。
对于右图,讲的是如何对图片进行分类。只需要用文本去描述不同的类别,嵌入到潜空间。然后将图片嵌入到潜空间,计算相似度,取相似度最高的类别作为预测结果。
但是这篇论文还提出了一个创新点,就是这两个encoder的输出不一定需要相同(文中说的他们用的预训练模型,降本增效),因为可以在loss函数前添加一个线性层,将不同的维度映射到相同的维度。
代码如下:
1 | # extract feature representations of each modality |
参考资料:
SimCLR
论文:https://arxiv.org/abs/2002.05709
这篇论文主要提出了3个创新点:
- 数据增强的组成起着关键作用
- 不直接在嵌入层计算loss,而是再经过一个非线性变换后计算loss
- 相较于监督学习,对比学习需要更大的batch size

数据增强需要多样性。不过图中也能看出,其实多种数据增强的组合是对顺序不敏感的(其几乎是一个对称矩阵)。重要的是各种数据增强的方式。
第二个就是我觉得最重要的点,即不直接去计算representation的loss,而是先经过一个非线性变换,再计算loss。
graph LR
i[image]--encoder-->representation--nonlinear--> 投影特征向量
对于这个非线性变换(主要是多层感知机),其也有可学习参数,让encoder的生成的representation经过这个非线性变换后,更能适应loss函数。因为我们不能假定最好的representation就完全能够使用余弦相似度去衡量差异。
参考资料:
MoCo
论文地址: https://arxiv.org/abs/1911.05722
在了解Moco之前,需要先了解一下Memory Bank的概念。
由于对比学习需要在学习一个正向样本时,同时需要大量负向样本去计算loss,而这些负向样本的数量是非常多的。每次都重新计算会导致训练速度非常慢,更致命的是显存限制了batch size的最大值。于是memory bank就出现了,缓存每个样本的特征。每次需要计算负样本loss时,不用全部重新计算,而是从memory bank中取出负样本的特征。
但这也同时带来了一个问题,memory bank中缓存的向量是encoder在不同阶段的输出(随着训练的进行,encoder的参数会不断更新)。也就是说,从严格意义上讲,memory bank中的向量并不能直接去比较。
为了让memory bank中的向量与当前网络的输出具有可比较性,MoCo引入了一种叫做动量更新的东西,同时将庞大的memory bank替换为了一个FIFO队列。
FIFO队列
这个队列是用来缓存负样本的。
为了尽可能让缓存下来的向量与当前网络的输出具有可比较性,MoCo使用了FIFO队列,只缓存最近计算得到的向量。当然,这个队列的长度远远大于batch size,但也远小于memory bank。
动量更新
MoCo使用了两个编码器。和。其中放入FIFO队列的负样本通过编码得到。
因此,为了维护负样本的编码的一致性,需要缓慢地更新的参数。
其中是动量系数,用来描述平滑程度。是的参数,是的参数。
这样,既能使的参数向的参数靠近,又能维护负样本的编码的一致性。

损失函数定义如下:
其中,是正样本,其余均是负样本。是温度系数。
最终实验得到地结果几乎与每次重新编码地效果相当,远远好于memory bank。

参考:
- https://zhuanlan.zhihu.com/p/158023072
- https://blog.csdn.net/weixin_45662399/article/details/132988951
- https://arxiv.org/abs/1911.05722
GraphCL
论文地址:https://arxiv.org/abs/2010.13902
GraphCL的论文全程是Graph Contrastive Learning with Augmentations
其主要是提出了一种针对图(graph)的对比学习的基本框架,而不是具体的网络模型。
数据增强
图(graph)不像图片(image)那样具有简单地平移、翻转等语义不变性。因此,作者在原文中提出了4种针对图结构的数据增强的方式。
| Data augmentation | Type | Underlying Prior |
|---|---|---|
| Node dropping | Nodes, edges | Vertex missing does not alter semantics. |
| Edge perturbation(删/增边) | Edges | Semantic robustness against connectivity variations. |
| Attribute masking | Nodes | Semantic robustness against losing partial attributes. |
| Subgraph | Nodes, edges | Local structure can hint the full semantics. |
架构

其模型架构其实与SimCLR有相似之处,都是先经过一个encoder,再经过一个非线性变换,最后计算loss。
在训练过程中,记一个batch有个样本,数据增强后产生个样本。记第个样本的数据增强后的样本分别为。记为和的余弦相似度。可以将目标损失函数(InfoNCE)记为:
理论研究
之前有人证明过:
其中是和的互信息(关联性),是和的联合分布。
而上述loss函数就可以看作互信息的一个下界。
实验
实验表明,对于不同的图结构,不同的数据增强方式对实验效果有着显著的区别。
数据集主要有两大部分:生物大分子、社交网络

研究团队发现了如下几个结论:
- Composing different augmentations benefits more.
- 对于边的扰动对于社交网楼有益但对于生物大分子有害。
- 对于属性的掩盖对更加密集的图结构有益。
- 随机丢点、子图普遍适用。
除此之外,研究团队还发现,更“难”的数据增强方式的效果更好。
参考






