Chapter2 对比学习(Contrastive Learning)的核心机理


深度进阶:对比学习(Contrastive Learning)的核心机理

对比学习的核心思想是 “Instance Discrimination” (个体判别):通过构造正负样本对,在无标注数据下学习“物以类聚,人以群分”的特征表示。


1. 样本生成:数据增强(Data Augmentation)

对比学习并不依赖标签,而是通过对同一张原始图片 $x$ 应用两次随机增强函数 $t, t’ \sim \mathcal{T}$,生成正样本对 $(x_i, x_j)$。

核心增强算子

  • Random Resized Crop (最关键):强迫模型学习局部与整体、不同尺度下的语义一致性。
  • Color Jitter & Grayscale:打破模型对色彩统计特性的依赖,防止模型通过颜色直方图“作弊”。
  • Gaussian Blur:模糊纹理细节,促使模型关注高层轮廓。

2. 数学本质:InfoNCE 损失函数

对比学习本质上是在高维球面上进行 $K+1$ 路分类

公式定义

  • $\tau$ (温度参数)
    1. 平滑分布:防止 Softmax 过早饱和导致梯度消失。
    2. Hard Negative Mining:较小的 $\tau$ 会让模型对“长得像但不是”的困难负样本产生极大的 Loss,迫使编码器学到更细致的判别特征。

3. 算法全流程详解

3.1 SimCLR:端到端对称对比 (End-to-End)

SimCLR 的核心逻辑是 “在大 Batch 中寻找自己”

具体步骤:

  1. 输入分配:取一个 Batch 的原始图像 ${x_k}_{k=1}^N$。
  2. 双路增强:对每张图 $x_k$ 进行两次随机增强,生成 $2N$ 张图。其中 $x_{2k-1}$ 和 $x_{2k}$ 互为正样本对
  3. 前向传播
    • 提取特征:所有图片通过同一个编码器 $f(\cdot)$,得到特征 $h = f(x)$。
    • 非线性投影:通过投影头 $g(\cdot)$(MLP)映射到对比空间:$z = g(h)$。
  4. 计算相似度矩阵:计算这 $2N$ 个向量两两之间的余弦相似度,形成一个 $2N \times 2N$ 的矩阵。
  5. 损失计算:对于每一个向量 $z_i$,其正样本只有一个(对应的增强版本),其余 $2N-2$ 个向量均为负样本。
  6. 更新:梯度同时流经 $g$ 和 $f$,同步更新全网参数。

3.2 MoCo:动量字典查询 (Dictionary Lookup)

MoCo 的核心逻辑是 “维护一个平滑演变的负样本库”

具体步骤:

  1. 双编码器输入
    • 输入 $x$,增强得到 $x_q$ 和 $x_k$。
    • $x_q$ 进入 Query Encoder ($\theta_q$),得到向量 $q$。
    • $x_k$ 进入 Key Encoder ($\theta_k$),得到向量 $k_+$。
  2. 归一化 (L2 Norm):将 $q, k_+$ 以及队列中所有的 $k$ 映射到单位超球面上。
  3. 度量计算 (Logits)
    • 正对:计算 $q \cdot k_+$。
    • 负对:计算 $q$ 与 Queue (队列) 中存储的 $K$ 个历史特征的点积。
  4. 对比损失:将正对和 $K$ 个负对看作一个 $K+1$ 类的分类问题,计算 InfoNCE。
  5. 动量更新 (核心)
    • 梯度更新:只对 $\theta_q$ 进行反向传播。
    • 平滑跟随:$\theta_k \leftarrow m\theta_k + (1-m)\theta_q$。保证了 Key Encoder 生成的特征在队列中具有时空一致性。
  6. 队列维护:将当前 Batch 的 $k_+$ 加入队列(Enqueue),并剔除最老的特征(Dequeue, FIFO)。

4. 核心差异与面试考点

特性 SimCLR MoCo
负样本规模 受 Batch Size 限制 (需超大 Batch) 由 Queue 决定 (可达 65536)
负样本一致性 实时计算,一致性完美 依靠动量更新保证一致性
解决模型坍塌 显式负样本排斥 显式负样本排斥
硬件要求 极高 (TPU/多卡集群) 友好 (单卡即可训练大模型)

面试 Tip:为什么 SimCLR 需要 Projection Head?
因为对比学习任务可能会由于过于关注“不变性”而损害特征的语义。非线性投影层 $g(h)$ 可以作为一个“防火墙”,让信息损失发生在 $z$ 层,从而保护 $h$ 层保留更多的下游任务有用信息(如颜色、形状)。


5. 对比学习负样本是否重要?负样本构造成本过高应该怎么解决?

负样本为什么重要?(数学本质)从信息论角度看,对比学习的目标是最大化正样本对之间的互信息(Mutual Information)

  • 防止模型崩溃(Model Collapse):如果没有负样本,模型最简单的“偷懒”方式就是让所有图片的输出向量都变成常数(比如全 1),这样相似度永远最大。负样本的存在提供了“推开”的力,迫使模型去寻找能区分不同物体的特征。
  • InfoNCE 紧致度:数学上证明了,负样本数量 $K$ 越大,InfoNCE 损失函数对互信息的下界估计就越紧。换句话说,负样本越多,模型对特征空间的分布刻画就越精准。

负样本构造成本过高的解决方案如果显存不够、算力有限,无法像 SimCLR 那样搞大 Batch,业界有四种主流的演进思路:

  • A. 缓存机制(代表作:MoCo)这是最经典的工程解法。
    • 原理:既然一个 Batch 里的负样本不够,我就用一个队列(Queue)把之前几十个 Batch 的特征存起来。
    • 核心:为了解决“特征陈旧”问题,引入动量更新(Momentum Update),让产生负样本的编码器演进得慢一点。这样你只需极小的显存,就能获得成千上万个负样本。
  • B. 寻找“硬”负样本(Hard Negative Mining)与其要一万个没用的负样本,不如要十个极其难区分的。
    • 原理:在损失函数中给那些离 Query 很近的负样本更高的权重(通过调小温度系数 $\tau$ 或者主动采样策略)。
    • 例子:CUZA 等算法会动态地挑选那些模型容易搞混的样本作为负样本进行训练。
  • C. 改变对称性:预测机制(代表作:BYOL, SimSiam)这是目前的“黑科技”方向:完全不要负样本!
    BYOL 的做法:它通过两个不对称的网络(一个 Online,一个 Target),让 Online 网络去预测 Target 网络的输出。
    • 数学直觉:通过引入 Predictor(非线性层) 和 Stop-gradient(停止梯度回传),即使没有负样本,模型也不会崩溃到常数解。
    • 这证明了:只要架构不对称,负样本不是必须的。
  • D. 特征去相关(代表作:Barlow Twins)
    • 原理:既然负样本是为了防止特征塌陷,那我们直接在特征的协方差矩阵上做文章。
    • 目标:让正样本对的特征互相关矩阵趋近于单位矩阵(Identity Matrix)。这意味着特征内部的每个维度都在表达不同的信息,且不同样本之间尽量不重复。这种方法也不需要显式的负样本对。

Author: YANG
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source YANG !
  TOC