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