InfoNCE Loss :构建高效对比学习模型
引言
对比学习中的InfoNCE损失函数是自监督学习领域的重要进展,它通过最大化正样本对之间的相似度并最小化负样本对的相似度,有效地引导模型学习到数据的本质特征。InfoNCE不仅提高了表示学习的质量,还为下游任务如分类、聚类等提供了强大的基础。
一、背景
InfoNCE(Information Noise-Contrastive Estimation)损失是对比学习中非常重要的一个损失函数,特别是在SimCLR、MoCo等框架中被广泛应用。它通过最大化正样本对之间的相似度,同时最小化负样本对之间的相似度来学习有用的表示。下面我们详细解释InfoNCE损失的公式及其各个组成部分。
二、公式
1. 定义
LInfoNCE=−logexp(sim(zi,zj)/τ)∑k=12N1[k≠i]exp(sim(zi,zk)/τ)\mathcal{L}_{\text{InfoNCE}} = -\log \frac{\exp(\text{sim}(z_i, z_j) / \tau)}{\sum_{k=1}^{2N} \mathbf{1}_{[k \neq i]} \exp(\text{sim}(z_i, z_k) / \tau)}LInfoNCE=−log∑k=12N1[k=i]exp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ)
2. 公式分解
为了帮助你更深入地理解InfoNCE损失公式,我们将逐步分解并解释每个部分的意义。我们通过一个直观的例子来说明这个过程,确保每个步骤都清晰明了。
2.1 分子:正样本对的相似度得分
exp(sim(zi,zj)/τ)\exp(\text{sim}(z_i, z_j) / \tau)exp(sim(zi,zj)/τ)
- ziz_izi 和 zjz_jzj 是来自同一数据点的两个不同增强视图(augmented views)。
- sim(zi,zj)\text{sim}(z_i, z_j)sim(zi,zj) 衡量这两个嵌入向量之间的相似度,通常使用余弦相似度或点积。
- τ\tauτ 是温度参数,控制相似度分布的锐度。
- exp(⋅)\exp(\cdot)exp(⋅) 是指数函数,用于放大相似度得分。
示例:
假设 sim(z1,z3)=0.9\text{sim}(z_1, z_3) = 0.9sim(z1,z3)=0.9,温度参数 τ=0.1\tau = 0.1τ=0.1,那么:
exp(sim(z1,z3)/0.1)=exp(0.9/0.1)=exp(9)≈8103.08\exp(\text{sim}(z_1, z_3) / 0.1) = \exp(0.9 / 0.1) = \exp(9) \approx 8103.08exp(sim(z1,z3)/0.1)=exp(0.9/0.1)=exp(9)≈8103.08
这表示正样本对 (z1,z3)(z_1, z_3)(z1,z3) 的相似度得分为 8103.08。
2.2 分母:所有负样本对的相似度得分之和
∑k=12N1[k≠i]exp(sim(zi,zk)/τ)\sum_{k=1}^{2N} \mathbf{1}_{[k \neq i]} \exp(\text{sim}(z_i, z_k) / \tau)k=1∑2N1[k=i]exp(sim(zi,zk)/τ)
- 2N2N2N 是批次中所有嵌入向量的数量(每个数据点有两个增强视图,因此总共有 2N2N2N 个嵌入向量)。
- 1[k≠i]\mathbf{1}_{[k \neq i]}1[k=i] 是指示函数,确保不将自身作为负样本。当 k=ik = ik=i 时,指示函数取值为0;否则为1。
- exp(sim(zi,zk)/τ)\exp(\text{sim}(z_i, z_k) / \tau)exp(sim(zi,zk)/τ) 是每个负样本对的相似度得分,同样经过温度参数调整后的指数形式。
示例:
假设我们有4个嵌入向量 z1,z2,z3,z4z_1, z_2, z_3, z_4z1,z2,z3,z4,并且 z1z_1z1 和 z3z_3z3 来自同一个数据点,其他都是负样本。我们需要计算 z1z_1z1 对所有其他嵌入向量的相似度得分之和:
∑k=141[k≠1]exp(sim(z1,zk)/0.1)=exp(sim(z1,z2)/0.1)+exp(sim(z1,z3)/0.1)+exp(sim(z1,z4)/0.1)\sum_{k=1}^{4} \mathbf{1}_{[k \neq 1]} \exp(\text{sim}(z_1, z_k) / 0.1) = \exp(\text{sim}(z_1, z_2) / 0.1) + \exp(\text{sim}(z_1, z_3) / 0.1) + \exp(\text{sim}(z_1, z_4) / 0.1)k=1∑41[k=1]exp(sim(z1,zk)/0.1)=exp(sim(z1,z2)/0.1)+exp(sim(z1,z3)/0.1)+exp(sim(z1,z4)/0.1)