基本结构

对比学习属于自监督学习,不需要人为地去标注标签,就能让模型学习到数据的特征表示。

其目标是,在潜空间中,相似的样本应该距离较近,而不相似的样本应该距离较远。

其主要结构如下

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,一个用于编码图片,一个用于编码文字。而对于相似度计算,可以使用余弦相似度,避免模型学到直接将模长拉长 similarity=xyxy\text{similarity} = \frac{\mathbf{x}\cdot\mathbf{y}}{|\mathbf{x}||\mathbf{y}|}


左图中描述的就是相似度矩阵。共有NN个文字样本与NN个图片样本,共同组成了一个N×NN\times N的矩阵。
只有对角线位置上的结果匹配的,需要增大这些值;而其余位置上是不匹配的值,需要减小这些值。

对于右图,讲的是如何对图片进行分类。只需要用文本去描述不同的类别,嵌入到潜空间。然后将图片嵌入到潜空间,计算相似度,取相似度最高的类别作为预测结果。

但是这篇论文还提出了一个创新点,就是这两个encoder的输出不一定需要相同(文中说的他们用的预训练模型,降本增效),因为可以在loss函数前添加一个线性层,将不同的维度映射到相同的维度。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# extract feature representations of each modality
I_f = image_encoder(I) # [n, d_i]
T_f = text_encoder(T) # [n, d_t]

# joint multimodal embedding [n, d_e] 把表示映射到相同的维度
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)

# 通过广播机制得到 [n, n],并应用温度系数(控制平滑程度,值越大,softmax时约尖锐)
logits = np.dot(I_e, T_e.T) * np.exp(t)

# symmetric loss function
labels = np.arange(n) #[0,1,...,n-1]
loss_i = cross_entropy_loss(logits, labels, axis=0) #对于图像,是竖向的,需要对列计算损失
loss_t = cross_entropy_loss(logits, labels, axis=1)# 对于文字,是横向的,需要对行计算损失
loss = (loss_i + loss_t) / 2

参考资料:

SimCLR

论文:https://arxiv.org/abs/2002.05709

这篇论文主要提出了3个创新点:

  1. 数据增强的组成起着关键作用
  2. 不直接在嵌入层计算loss,而是再经过一个非线性变换后计算loss
  3. 相较于监督学习,对比学习需要更大的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使用了两个编码器。EncoderQuery\text{Encoder}_{\text{Query}}EncoderKey\text{Encoder}_{\text{Key}}。其中放入FIFO队列的负样本通过EncoderKey\text{Encoder}_{\text{Key}}编码得到。

因此,为了维护负样本的编码的一致性,需要缓慢地更新EncoderKey\text{Encoder}_{\text{Key}}的参数。

θk=μθk+(1μ)θq\theta_k = \mu \theta_k + (1-\mu) \theta_q

其中μ\mu是动量系数,用来描述平滑程度。θk\theta_kEncoderKey\text{Encoder}_{\text{Key}}的参数,θq\theta_qEncoderQuery\text{Encoder}_{\text{Query}}的参数。

这样,既能使EncoderKey\text{Encoder}_{\text{Key}}的参数向EncoderQuery\text{Encoder}_{\text{Query}}的参数靠近,又能维护负样本的编码的一致性。

损失函数定义如下:

Lq=logexp(qk+/t)i=0Kexp(qki/t)L_q=-\log \frac{\exp(q\cdot k_+/t)}{\sum_{i=0}^K\exp(q\cdot k_i/t)}

其中,k+k_+是正样本,其余均是负样本。tt是温度系数。

最终实验得到地结果几乎与每次重新编码地效果相当,远远好于memory bank。

参考:

  1. https://zhuanlan.zhihu.com/p/158023072
  2. https://blog.csdn.net/weixin_45662399/article/details/132988951
  3. 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有NN个样本,数据增强后产生2N2N个样本。记第nn个样本的数据增强后的样本分别为zn,i,zn,jz_{n,i},z_{n,j}。记sim(zn,i,zn,j)\text{sim}(z_{n,i},z_{n,j})zn,iz_{n,i}zn,jz_{n,j}的余弦相似度。可以将目标损失函数(InfoNCE)记为:

Ln=logexp(sim(zn,i,zn,j)/t)n=1,nnNexp(sim(zn,i,zn,j)/t)\newcommand{\si}{\text{sim}} L_n=-\log\frac{\exp(\si(z_{n,i},z_{n,j})/t)} {\sum_{n'=1,n'\neq n}^N \exp(\si (z_{n,i},z_{n',j})/t)}

理论研究

之前有人证明过:

I(X;Y)E[logf(x,y)Eyf(x,y)],I(X;Y) \geq \mathbb{E} \left[ \log \frac{f(x,y)}{\mathbb{E}_{y'} f(x,y')} \right],

其中I(X;Y)I(X;Y)XXYY的互信息(关联性),f(x,y)f(x,y)XXYY的联合分布。

而上述loss函数就可以看作互信息的一个下界。

实验

实验表明,对于不同的图结构,不同的数据增强方式对实验效果有着显著的区别。
数据集主要有两大部分:生物大分子、社交网络

不同的图结构,不同的数据增强方式对实验效果有着显著的区别

研究团队发现了如下几个结论:

  1. Composing different augmentations benefits more.
  2. 对于边的扰动对于社交网楼有益但对于生物大分子有害。
  3. 对于属性的掩盖对更加密集的图结构有益。
  4. 随机丢点、子图普遍适用。

除此之外,研究团队还发现,更“难”的数据增强方式的效果更好。

参考

  1. https://arxiv.org/abs/2010.13902
  2. https://zhuanlan.zhihu.com/p/643337039