对比表征学习(一)Contrastive Representation Learning
对比表征学习第二部分:Sentence Embedding技术
参考翁莉莲的个人博客Blog,本文深入探讨了对比损失函数用于衡量两个相似样本之间的关系及其与不相似样本之间的差异。
对比表示学习方法(Contrastive Representation Learning)能够有效提升数据在嵌入空间中的组织效率。它通过促进相近的数据向彼此聚集,并将远离彼此的距离被扩大化,在处理嵌入数据时展现出显著的优势。另一方面,在面对无监督数据集时,对比表示学习作为一种高效的无监督学习方法。
对比学习目标
在早期阶段的对比学习过程中,每次仅配对一对正样例与负样例。而在当前阶段的学习目标下,在一批数据集中允许多个正样例与多个负样例进行多对多配对。
对比损失函数
Contrastive loss
这篇论文是基于对比学习的方法采用深度度量学习(deep metric learning)作为其最早训练目标之一
给定一组输入样本 \{x_i\}, 每个样本都对应一个标签 y_i \in \{1, \dots, L\}, 总共有 L 个不同的类别。我们的目标是学习一个函数 f_{\theta}(\cdot) : \mathcal{X} \rightarrow \mathbb{R}^d, 该函数能够将输入样本 x_i 映射为嵌入空间中的向量, 使得同一类别内的样本具有高度相似的嵌入表示, 而不同类别的样本则具有显著区分度的嵌入特征。基于此, 对比损失(Contrastive Loss)通过计算一对输入 (x_i, x_j) 的对比关系来优化模型性能: 当两个样本属于同一类别时, 算法会最小化它们之间的嵌入距离; 而当两个样本属于不同类别时, 则会最大化它们之间的距离差异。具体而言, 对比损失函数定义为:
\mathcal{L}_{\text{cont}}(x_i, x_j, \theta) = \begin{cases} \left\| f_\theta(x_i) - f_\theta(x_j) \right\|^2 & , y_i = y_j \\ \max(0, \epsilon - \left\| f_\theta(x_i) - f_\theta(x_j) \right\|^2) & , y_i \neq y_j \end{cases}
其中 \epsilon 是一个预设的超参数值
Triplet loss
基于该论文的研究背景提出了一个方法旨在探索同一人不同姿态与视角下的识别问题

我们选取一个锚定点输入 x 并为该输入选择一个正样本 x^+ 和一个负样本 x^-。其中正样本点x^+与锚定点x属于同一类别,并且负样本点x^-则来自另一个不同的类别。基于三元组损失函数\mathcal{L}_{\text{triplet}}(x, x^+, x^-)进行学习,在此过程中我们同时最小化锚定点x与其对应的正样本点x^+之间的距离,并最大化锚定点x与其对应的负样本点x^-之间的距离;该损失函数的具体形式如下:
\mathcal{L}_{\text{triplet}}(x, x^+, x^-) = \sum_{(x,x^+,x^-)\in\mathcal{X}} \max \left(0, \|f(x)-f(x^+)\|^2 - \|f(x)-f(x^-)\|^2 + \epsilon \right)
其中参数\epsilon被设置目标是最小化相似对之间的距离与最大化不相似对之间的距离的最小偏移量
Lifted Structured Loss
基于该论文中的研究方法,在单个训练批次内整合全部pairwise edges以优化计算性能

设 D_{ij} = |f(x_i) - f(x_j)|_2,一个结构化的损失函数定义如下:
\mathcal{L}_{\text{struct}} = \frac{1}{2|\mathcal{P}|} \sum_{(i,j) \in P} \max(0, \mathcal{L}_{\text{struct}}^{(ij)})^2
其中,
\mathcal{L}_{\text{struct}}^{(ij)} = D_{ij} + \max \left(\max_{(i,k) \in \mathcal{N}} (\epsilon - D_{ik}), \max_{(j,l) \in \mathcal{N}} (\epsilon - D_{jl})\right)
这里 \mathcal{P} 包含了正样本对的集合,而 \mathcal{N} 是负样本对的集合。注意,密集的成对平方距离矩阵可以在每个训练批次中轻松计算。\max \left(\max_{(i,k) \in \mathcal{N}} (\epsilon - D_{ik}), \max_{(j,l) \in \mathcal{N}} (\epsilon - D_{jl})\right) 部分用来挖掘难负样本,然而,这部分不是平滑的,可能会导致在实践中收敛到不好的局部最优。因此,它被放宽为以下形式:
\mathcal{L}_{\text{struct}}^{(ij)} = D_{ij} + \log \left( \sum_{(i,k) \in \mathcal{N}} \exp(\epsilon-D_{ik}) + \sum_{(j,l) \in \mathcal{N}} \exp(\epsilon-D_{jl}) \right)
在论文中,他们还提出通过在每个批次中积极加入一些难分的负样本(hard negative),通过给出几对随机的正样本,来提高负样本的质量
N-pair loss
多类 N 对损失(paper)被推广到三重损失中,并用于涵盖与多个负样本的比较。
考虑一个由一个阳性实例与 N−1 个阴性实例组成的总共有 N+1 个样元组成的集合;其对应的训练集表示为 \{X, X^+\, X_1^-\, \dots,\, X_{N−1}^-}\};损失函数被定义为:
\mathcal{L}_{N\text{-pair}}(x, x^+, \{x_i\}_{i=1}^{N-1}) 等于 括号内部 的总和求和项 加上 一 的 对数 。该表达式 被定义为 负对数 结果 ,其中 分子部分 是 \exp(f(x)^{T}f({x^+})) ,分母部分 则包括 同样的分子项 加上 求和项 \sum_{i=1}^{N-1}\exp(f(x)^{T}f({x_i^-})) 。
当我们在每个类别中仅选择一个负样本时(即对于每个类别来说),这相当于应用多分类任务中的softmax损失函数。
NCE
噪声对比估计法(NCE) ,文章链接
创新点是运行逻辑回归来区分目标数据和噪声。
设 x 为目标样本,则遵循条件概率分布 P(x|C = 1; \theta) = p_\theta(x);同时定义 \tilde{x} 作为噪声样本,并满足条件概率分布 P(\tilde{x}|C = 0) = q(\tilde{x})。值得注意的是,在此情况下我们旨在实现对数回归模型用于模拟分类问题中的对数几率(即 logit),也就是说,在这种设定下我们的目标是针对来自目标数据分布而非噪声分布的观测实例进行logit建模:
\ell(u) = \log \frac{p_\theta(u)}{q(u)} = \log p_\theta(u) - \log q(u)
将 logits 转换为对应的概率值后,在使用sigmoid函数 σ(⋅) 的基础上进行计算时,我们能够采用交叉熵损失函数作为损失函数。
L_{NCE} = -\frac{1}{N} \sum_{i=1}^N \left[ \log \sigma(\ell(x_i)) + \log (1 - \sigma(\ell(\tilde{x}_i))) \right]
其中:
\sigma(\ell) = \frac{1}{1 + \exp(-\ell)} = \frac{p_\theta}{p_\theta + q}
该段内容阐述了NCE损失的具体形式及其应用场景。
其中指出该方法仅考虑单个正样例与噪声样例之间的对比关系。
此外研究表明,在对比学习框架内结合多组异类负样例同样可获得稳定的性能表现。
InfoNCE
该论文链接基于NCE的启发,在 InfoNCE 中被设计为在一组不相关的噪声样本中寻找正例。
给定上下文向量 c,正样本应从条件分布 p(x|c) 中抽取;其余 N-1 个负样本则从与上下文相关的提议分布中抽取。为了简洁起见,请问您是否能将所有样本标记为集合形式:X = \{x_i\}_{i=1}^N?其中仅有一个样本x_{\text{pos}}被标记为正样本。我们正确检测到正样本的概率为:
该条件概率等于在给定上下文c的情况下,在位置\text{pos}处出现特定特征x的可能性与其在所有位置j中出现相应特征x_j的可能性之比;具体而言,
分子部分表示位置\text{pos}处的特征x_{\text{pos}}与所有其他位置i处特征x_i联合出现的概率乘积,
而分母则是对所有可能的位置j计算其同样条件下特征x_j及其余位置i≠j特征x_i联合出现的概率乘积之和;
进一步地,
分子可以表示为在位置\text{pos}处的条件概率除以其自身条件下出现的概率,
而分母则相当于将所有位置j对应的f(x_j,c)值进行加权求和,
其中f(x,c)定义为特征x在位置\text{pos}处与给定上下文c共同出现的可能性;
因此,
整个分数可以简化为特定位置\text{pos}对应的f(f,x,c)值与其在整个分布中各位置对应的f(f,x,c)值之和的比例。
其中,得分函数 f(x, c) \propto \frac{p(x|c)}{p(x)}。
InfoNCE 损失函数优化了正确分类正样本的负对数概率:
\mathcal{L}_{\text{InfoNCE}} = -\mathbb{E}\left[\log \frac{f(x, c)}{\sum_{x'\in X} f(x', c)}\right]
值得注意的是,在最大化输入变量x与其对应的上下文向量c之间的互信息的过程中,在最大化输入变量x与其对应的上下文向量c之间的互信息的过程中
I(x; c) = \sum_{x,c} p(x, c) \log \frac{p(x|c)}{p(x)p(c)} = \sum_{x,c} p(x, c) \log \frac{p(x|c)}{p(x)}
其中,\log \frac{p(x|c)}{p(x)} 的对数项由 f 估计。
在序列预测任务中,在处理连续k步的后续观测时,CPC(Contrastive Predictive Coding)模型不直接建模这些未来的观测p_k(X_{t+k}|C_t)(这可能相当昂贵),相反地,该模型采用了一个概率密度函数以保持X_{t+k}和C_t之间的互信息:
f_k(X_{t+k}, c_t) = \exp(z_{t+k}^T W_k c_t) \propto \frac{p(X_{t+k}|c_t)}{p(X_{t+k})}
其中 z_{t+k} 是编码后的输入,W_k 是一个可训练的权重矩阵。
Soft-Nearest Neighbors Loss
Soft-Nearest Neighbors Loss通过其改进方案使扩展工作能够包含多个正样本。
考虑一批数据 \{x_i, y_i\}_{i=1}^B ,其中每个 y_i 代表对应输入样本 x_i 的类别标记,并引入一个用于衡量两个输入之间相似程度的关键函数 f(\cdot, \cdot) 。在温度参数 \tau 的作用下定义的软最近邻损失函数为:
\mathcal{L}_{snn}被定义为-\frac{1}{B}乘以从i=1到B的总和的对数。\log部分包含了两个求和操作:分子部分是对所有满足j≠i且y_j=y_i的j值进行运算的总和;分母部分是对所有j≠i的情况进行运算的总和。\exp函数作用于f(x_i,x_j)除以\tau的结果,并被包含在了分数内部
温度参数 \tau 负责调整特征在表示空间中的集中程度。例如,在温度较低的情况下(或较小时),其主要由近邻节点间的差异主导(或贡献较大),而那些分布较广的节点对整体损失贡献较小(或不显著)。
