基于距离度量学习的对比学习(Contrastive Learning)算法原理与训练过程
题目描述
对比学习是近年来在自监督学习领域取得显著成功的一种方法,其核心思想是通过拉近相似样本(正样本对)的表征,并推远不相似样本(负样本对)的表征,来学习一种有效的特征表示,而无需人工标注的标签。一个典型的范式是,给定一个锚点样本(Anchor),通过数据增强(如裁剪、旋转、颜色抖动等)生成其正样本,而将同一批次(Batch)内的其他样本视为负样本。本次讲解将围绕对比学习中经典且基础的SimCLR(A Simple Framework for Contrastive Learning of Visual Representations) 框架,详细拆解其原理、损失函数设计及训练过程。
解题过程(循序渐进讲解)
第一步:核心思想与框架概览
对比学习的直观目标是:学一个“好”的编码器(Encoder)f(·),它能将输入数据(如图像)映射到一个低维的表示空间(即特征向量/嵌入向量)。
- “好”的标准是:语义相似的样本(如图像的不同增强视图)在特征空间中应该彼此靠近,语义不同的样本在特征空间中应该彼此远离。
- SimCLR框架包含四个核心部分:
- 数据增强模块:为每个输入样本生成两个随机增强视图,构成一个正样本对。
- 编码器网络
f(·):提取样本的表示向量。通常使用卷积神经网络(如ResNet)。 - 投影头网络
g(·):一个小型的多层感知机(MLP),将编码器的输出映射到一个更适于计算对比损失的空间。 - 对比损失函数:用于衡量正负样本对之间的关系,并驱动模型学习。
第二步:数据流与正负样本对构建
假设有一个批次(Batch)的N个原始样本 {x_1, x_2, ..., x_N}。
- 生成正样本对:对每个样本
x_k,应用两次随机数据增强(从同一组增强策略中随机选择,如随机裁剪+颜色抖动),得到两个增强视图x_{2k-1}和x_{2k}。这对视图(x_{2k-1}, x_{2k})构成一个正样本对。整个批次总共产生2N个增强样本。 - 定义负样本:对于一个给定的正样本对,比如
(x_i, x_j),在同一个批次内,除了x_j之外的所有其他2N-1个增强样本,都视为x_i的负样本。注意,x_i自身的另一个视图x_j是正样本,而x_j的另一个视图x_i是正样本,但x_i与自身(严格来说是同一个原始样本的另一个增强视图)不算作负样本对,这是构建的关键。
第三步:特征提取与投影
- 编码:将所有2N个增强样本
{x_l}输入编码器f(·),得到对应的表示向量h_l = f(x_l)。这里的h_l是编码器输出的特征(例如,ResNet全局平均池化后的向量)。 - 投影:将表示向量
h_l输入投影头网络g(·),得到最终用于对比学习的嵌入向量z_l = g(h_l) = g(f(x_l))。投影头通常是一个或两层的MLP,将特征映射到另一个空间,经验表明这能改善损失函数的信息含量。在推断阶段,通常会丢弃g(·),只使用f(·)提取的特征h。
第四步:对比损失函数(NT-Xent)的定义与计算
SimCLR使用归一化温度标度交叉熵损失(Normalized Temperature-scaled Cross Entropy Loss, NT-Xent)。
-
相似度计算:使用余弦相似度来衡量两个投影向量
z_i和z_j的相似性。定义相似性函数为:
sim(z_i, z_j) = (z_i^T z_j) / (||z_i|| * ||z_j||)。
为了数值稳定性,通常会对投影向量进行L2归一化,使得||z||=1,此时sim(z_i, z_j) = z_i^T z_j。 -
损失公式:对于批次中的每一个样本
i(其索引为2k-1或2k),我们需要计算其损失。设(i, j)是它的正样本对(即来自同一个原始样本的另一个增强视图)。则样本i的损失l(i, j)定义为:l(i, j) = -log [ exp(sim(z_i, z_j) / τ) / Σ_{k=1}^{2N} 1_{[k ≠ i]} exp(sim(z_i, z_k) / τ) ]- 分子:
exp(sim(z_i, z_j) / τ)衡量正样本对的相似性。τ是一个温度超参数,用于调节分布的锐利程度(小的τ使分布更尖锐,对困难负样本更敏感)。 - 分母:对批次内所有非
i自身的样本(即k ≠ i)计算指数相似度并求和。这包含了1个正样本j和(2N-2)个负样本。注意1_{[k ≠ i]}是指示函数,当k ≠ i时为1,排除了自身。 - 整个分式可以看作是在一个(2N-1)类的Softmax分类问题中,将样本
i正确分类到其正样本j的概率。 - 取负对数,就得到了样本
i的对比损失。
- 分子:
-
批次总损失:由于每个正样本对
(i, j)会被计算两次(一次以i为中心,一次以j为中心),最终的批次损失是所有正样本对损失的平均:
L = (1/(2N)) Σ_{k=1}^{N} [ l(2k-1, 2k) + l(2k, 2k-1) ]
第五步:模型训练与参数更新
- 优化目标:最小化上述对比损失
L。 - 训练流程:
a. 从数据集中采样一个批次(Batch)的N个原始样本。
b. 对每个样本应用两次随机增强,得到2N个样本。
c. 前向传播:通过编码器f和投影头g,得到2N个投影向量z。
d. 计算损失:根据第四步的公式计算对比损失L。高效实现通常利用向量化计算整个相似度矩阵。
e. 反向传播:计算损失L关于编码器参数θ_f和投影头参数θ_g的梯度。
f. 参数更新:使用优化器(如SGD with momentum 或 Adam)根据梯度更新θ_f和θ_g。 - 关键技巧:
- 大批次训练:负样本来自同一批次,更大的批次能提供更多、更丰富的负样本,有助于学习更好的表示。SimCLR通常使用非常大的批次(如4096)。
- 数据增强组合:对视觉任务,随机裁剪(伴随尺寸调整)和颜色失真的组合被证明至关重要。
- 投影头的使用与丢弃:训练时使用
g(·)能学到更好的表示h,下游任务(如分类)微调时,通常只使用f(·)提取的h。
第六步:下游任务应用
训练完成后,我们得到了一个预训练好的编码器f(·)。对于新的下游任务(如图像分类):
- 特征提取:我们可以固定
f(·)的参数,用它来提取输入图像的特征向量h。 - 微调:更常见的是,在
f(·)之后接一个简单的任务特定层(如线性分类器),然后使用少量标注数据,对整个网络(或仅分类层)进行有监督的微调(Fine-tuning)。由于f(·)已经学到了良好的通用视觉特征,微调通常能取得优异的效果和数据效率。
总结:对比学习(以SimCLR为例)的核心是通过构建正负样本对,并利用InfoNCE(NT-Xent是其中一种) 损失函数,在特征空间中进行判别性学习。它不依赖于人工标签,而是利用数据自身的内在结构(通过数据增强定义“相似性”) 来学习通用的、可迁移的特征表示。这种方法在计算机视觉、自然语言处理等领域都取得了巨大成功。