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
(
sim
(
z
1
,
z
2
)
/
0.1
)
=
exp
(
0.1
/
0.1
)
=
exp
(
1
)
≈
2.72
\exp(\text{sim}(z_1, z_2) / 0.1) = \exp(0.1 / 0.1) = \exp(1) \approx 2.72
exp(sim(z1,z2)/0.1)=exp(0.1/0.1)=exp(1)≈2.72
exp
(
sim
(
z
1
,
z
4
)
/
0.1
)
=
exp
(
2
)
≈
7.39
\exp(\text{sim}(z_1, z_4) / 0.1) = \exp(2) \approx 7.39
exp(sim(z1,z4)/0.1)=exp(2)≈7.39
因此,分母为:
2.72 + 7.39 ≈ 10.11 2.72 + 7.39 \approx 10.11 2.72+7.39≈10.11
2.3 比值:正样本对相对于所有负样本对的相似度比值
exp ( sim ( z i , z j ) / τ ) ∑ k = 1 2 N 1 [ k ≠ i ] exp ( sim ( z i , z k ) / τ ) \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)} ∑k=12N1[k=i]exp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ)
这个比值衡量了正样本对相对于所有负样本对的相对相似度。理想情况下,这个比值应该尽可能大,表示正样本对的相似度远高于任何负样本对。
示例:
exp ( sim ( z 1 , z 3 ) / 0.1 ) ∑ k = 1 4 1 [ k ≠ 1 ] exp ( sim ( z 1 , z k ) / 0.1 ) = 8103.08 10.11 ≈ 801.5 \frac{\exp(\text{sim}(z_1, z_3) / 0.1)}{\sum_{k=1}^{4} \mathbf{1}_{[k \neq 1]} \exp(\text{sim}(z_1, z_k) / 0.1)} = \frac{8103.08}{10.11} \approx 801.5 ∑k=141[k=1]exp(sim(z1,zk)/0.1)exp(sim(z1,z3)/0.1)=10.118103.08≈801.5
2.4 对数和负号
− log ( exp ( sim ( z i , z j ) / τ ) ∑ k = 1 2 N 1 [ k ≠ i ] exp ( sim ( z i , z k ) / τ ) ) -\log \left( \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)} \right) −log(∑k=12N1[k=i]exp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ))
- 对数函数 log ( ⋅ ) \log(\cdot) log(⋅) 将比值转换为对数尺度,使得优化问题更加稳定。
- 负号 − - − 确保损失值为正值,并且最小化这个损失意味着最大化正样本对相对于负样本对的相似度比值。
示例:
− log ( 801.5 ) ≈ − 6.69 -\log(801.5) \approx -6.69 −log(801.5)≈−6.69
直观理解
InfoNCE损失的目标是让模型能够从一组负样本中正确识别出正样本对。具体来说:
- 分子:代表正样本对之间的相似度得分,经过温度参数调整后的指数形式。
- 分母:代表所有可能的负样本对相似度得分之和,同样经过温度参数调整后的指数形式。
- 比值:衡量正样本对相对于所有负样本对的相对相似度。
- 对数和负号:确保损失值为正值,并且最小化这个损失意味着最大化正样本对相对于负样本对的相似度比值。
3. CV 知识补充 – 数据增强视图(Augmented Views)
让我们更清晰地解释一下“来自数据点1的两个增强视图”这句话的意思,并通过具体例子来说明正样本和负样本的概念。
在对比学习中,我们通常从同一个原始数据点(如一张图片、一段文本等)生成多个不同的版本,称为增强视图(augmented views)。这些增强视图是通过对原始数据应用随机变换(如裁剪、旋转、颜色抖动等)得到的。这样做是为了让模型能够学习到数据的本质特征,而不是依赖于具体的外观细节。
正样本与负样本
3.1 正样本对
正样本对是指来自同一个原始数据点的不同增强视图之间的配对。例如:
- 数据点1:假设我们有一张原始图片 x 1 x_1 x1。
- 增强视图:我们通过对 x 1 x_1 x1 应用不同的随机变换,生成两个不同的增强视图 z 1 z_1 z1 和 z 3 z_3 z3。
因此, ( z 1 , z 3 ) (z_1, z_3) (z1,z3) 是一对正样本,因为它们都来自同一个原始数据点 x 1 x_1 x1。
3.2 负样本
负样本是指来自不同原始数据点的增强视图之间的配对。例如:
- 数据点2:我们有另一张原始图片 x 2 x_2 x2,并生成两个不同的增强视图 z 2 z_2 z2 和 z 4 z_4 z4。
对于 z 1 z_1 z1 来说,负样本就是来自其他数据点的增强视图,即 z 2 z_2 z2 和 z 4 z_4 z4。
具体例子
假设我们有一个小批次的数据点,每个数据点有两个增强视图,总共有4个嵌入向量 z 1 , z 2 , z 3 , z 4 z_1, z_2, z_3, z_4 z1,z2,z3,z4。
- 数据点1:有两个增强视图 z 1 z_1 z1 和 z 3 z_3 z3
- 数据点2:有两个增强视图 z 2 z_2 z2 和 z 4 z_4 z4
正样本对
- ( z 1 , z 3 ) (z_1, z_3) (z1,z3):来自数据点1的两个增强视图
- ( z 2 , z 4 ) (z_2, z_4) (z2,z4):来自数据点2的两个增强视图
负样本
-
对于 z 1 z_1 z1,负样本是:
- z 2 z_2 z2(来自数据点2)
- z 4 z_4 z4(来自数据点2)
-
对于 z 2 z_2 z2,负样本是:
- z 1 z_1 z1(来自数据点1)
- z 3 z_3 z3(来自数据点1)
-
对于 z 3 z_3 z3,负样本是:
- z 2 z_2 z2(来自数据点2)
- z 4 z_4 z4(来自数据点2)
-
对于 z 4 z_4 z4,负样本是:
- z 1 z_1 z1(来自数据点1)
- z 3 z_3 z3(来自数据点1)
3.3 总结
- 正样本对:来自同一个原始数据点的不同增强视图之间的配对。例如 ( z 1 , z 3 ) (z_1, z_3) (z1,z3) 都来自数据点1。
- 负样本:来自不同原始数据点的增强视图之间的配对。例如对于 z 1 z_1 z1,负样本是 z 2 z_2 z2 和 z 4 z_4 z4,它们分别来自数据点2。
三、举个 🌰
InfoNCE Loss 10个嵌入向量的例子
为了更全面地理解InfoNCE损失的计算过程,我们通过一个包含10个嵌入向量的例子来详细说明。假设我们有一个批次的数据点,每个数据点有两个增强视图(augmented views),总共有5个数据点,因此有10个嵌入向量 z 1 , z 2 , … , z 10 z_1, z_2, \ldots, z_{10} z1,z2,…,z10。
1. 数据点和增强视图的关系
- 数据点1:有两个增强视图 z 1 z_1 z1 和 z 6 z_6 z6
- 数据点2:有两个增强视图 z 2 z_2 z2 和 z 7 z_7 z7
- 数据点3:有两个增强视图 z 3 z_3 z3 和 z 8 z_8 z8
- 数据点4:有两个增强视图 z 4 z_4 z4 和 z 9 z_9 z9
- 数据点5:有两个增强视图 z 5 z_5 z5 和 z 10 z_{10} z10
2. 正样本对和负样本
对于每个正样本对 ( z i , z j ) (z_i, z_j) (zi,zj),我们需要计算InfoNCE损失。以 ( z 1 , z 6 ) (z_1, z_6) (z1,z6) 为例:
- 正样本对: ( z 1 , z 6 ) (z_1, z_6) (z1,z6)
- 负样本:所有其他来自不同数据点的增强视图,即 z 2 , z 3 , z 4 , z 5 , z 7 , z 8 , z 9 , z 10 z_2, z_3, z_4, z_5, z_7, z_8, z_9, z_{10} z2,z3,z4,z5,z7,z8,z9,z10
3. 计算相似度得分
假设我们已经计算了所有成对的余弦相似度,并将温度参数设为 τ = 0.1 \tau = 0.1 τ=0.1。以下是相似度矩阵的部分示例值(假设已经归一化):
z 1 z 2 z 3 z 4 z 5 z 6 z 7 z 8 z 9 z 10 z 1 1.0 0.1 0.2 0.3 0.4 0.9 0.1 0.2 0.3 0.4 z 2 0.1 1.0 0.2 0.3 0.4 0.1 0.9 0.2 0.3 0.4 z 3 0.2 0.2 1.0 0.3 0.4 0.2 0.2 0.9 0.3 0.4 z 4 0.3 0.3 0.3 1.0 0.4 0.3 0.3 0.3 0.9 0.4 z 5 0.4 0.4 0.4 0.4 1.0 0.4 0.4 0.4 0.4 0.9 z 6 0.9 0.1 0.2 0.3 0.4 1.0 0.1 0.2 0.3 0.4 z 7 0.1 0.9 0.2 0.3 0.4 0.1 1.0 0.2 0.3 0.4 z 8 0.2 0.2 0.9 0.3 0.4 0.2 0.2 1.0 0.3 0.4 z 9 0.3 0.3 0.3 0.9 0.4 0.3 0.3 0.3 1.0 0.4 z 10 0.4 0.4 0.4 0.4 0.9 0.4 0.4 0.4 0.4 1.0 \begin{array}{c|cccccccccc} & z_1 & z_2 & z_3 & z_4 & z_5 & z_6 & z_7 & z_8 & z_9 & z_{10} \\ \hline z_1 & 1.0 & 0.1 & 0.2 & 0.3 & 0.4 & 0.9 & 0.1 & 0.2 & 0.3 & 0.4 \\ z_2 & 0.1 & 1.0 & 0.2 & 0.3 & 0.4 & 0.1 & 0.9 & 0.2 & 0.3 & 0.4 \\ z_3 & 0.2 & 0.2 & 1.0 & 0.3 & 0.4 & 0.2 & 0.2 & 0.9 & 0.3 & 0.4 \\ z_4 & 0.3 & 0.3 & 0.3 & 1.0 & 0.4 & 0.3 & 0.3 & 0.3 & 0.9 & 0.4 \\ z_5 & 0.4 & 0.4 & 0.4 & 0.4 & 1.0 & 0.4 & 0.4 & 0.4 & 0.4 & 0.9 \\ z_6 & 0.9 & 0.1 & 0.2 & 0.3 & 0.4 & 1.0 & 0.1 & 0.2 & 0.3 & 0.4 \\ z_7 & 0.1 & 0.9 & 0.2 & 0.3 & 0.4 & 0.1 & 1.0 & 0.2 & 0.3 & 0.4 \\ z_8 & 0.2 & 0.2 & 0.9 & 0.3 & 0.4 & 0.2 & 0.2 & 1.0 & 0.3 & 0.4 \\ z_9 & 0.3 & 0.3 & 0.3 & 0.9 & 0.4 & 0.3 & 0.3 & 0.3 & 1.0 & 0.4 \\ z_{10} & 0.4 & 0.4 & 0.4 & 0.4 & 0.9 & 0.4 & 0.4 & 0.4 & 0.4 & 1.0 \\ \end{array} z1z2z3z4z5z6z7z8z9z10z11.00.10.20.30.40.90.10.20.30.4z20.11.00.20.30.40.10.90.20.30.4z30.20.21.00.30.40.20.20.90.30.4z40.30.30.31.00.40.30.30.30.90.4z50.40.40.40.41.00.40.40.40.40.9z60.90.10.20.30.41.00.10.20.30.4z70.10.90.20.30.40.11.00.20.30.4z80.20.20.90.30.40.20.21.00.30.4z90.30.30.30.90.40.30.30.31.00.4z100.40.40.40.40.90.40.40.40.41.0
4. 计算InfoNCE损失
以 ( z 1 , z 6 ) (z_1, z_6) (z1,z6) 为例:
- 分子:正样本对的相似度得分
exp ( sim ( z 1 , z 6 ) / τ ) \exp(\text{sim}(z_1, z_6) / \tau) exp(sim(z1,z6)/τ)
假设 sim ( z 1 , z 6 ) = 0.9 \text{sim}(z_1, z_6) = 0.9 sim(z1,z6)=0.9,温度参数 τ = 0.1 \tau = 0.1 τ=0.1,那么:
exp ( sim ( z 1 , z 6 ) / 0.1 ) = exp ( 0.9 / 0.1 ) = exp ( 9 ) ≈ 8103.08 \exp(\text{sim}(z_1, z_6) / 0.1) = \exp(0.9 / 0.1) = \exp(9) \approx 8103.08 exp(sim(z1,z6)/0.1)=exp(0.9/0.1)=exp(9)≈8103.08
- 分母:所有负样本对的相似度得分之和
∑ k = 1 10 1 [ k ≠ 1 and k ≠ 6 ] exp ( sim ( z 1 , z k ) / τ ) \sum_{k=1}^{10} \mathbf{1}_{[k \neq 1 \text{ and } k \neq 6]} \exp(\text{sim}(z_1, z_k) / \tau) k=1∑101[k=1 and k=6]exp(sim(z1,zk)/τ)
具体数值为:
exp
(
sim
(
z
1
,
z
2
)
/
0.1
)
=
exp
(
0.1
/
0.1
)
=
exp
(
1
)
≈
2.72
\exp(\text{sim}(z_1, z_2) / 0.1) = \exp(0.1 / 0.1) = \exp(1) \approx 2.72
exp(sim(z1,z2)/0.1)=exp(0.1/0.1)=exp(1)≈2.72
exp
(
sim
(
z
1
,
z
3
)
/
0.1
)
=
exp
(
0.2
/
0.1
)
=
exp
(
2
)
≈
7.39
\exp(\text{sim}(z_1, z_3) / 0.1) = \exp(0.2 / 0.1) = \exp(2) \approx 7.39
exp(sim(z1,z3)/0.1)=exp(0.2/0.1)=exp(2)≈7.39
exp
(
sim
(
z
1
,
z
4
)
/
0.1
)
=
exp
(
0.3
/
0.1
)
=
exp
(
3
)
≈
20.09
\exp(\text{sim}(z_1, z_4) / 0.1) = \exp(0.3 / 0.1) = \exp(3) \approx 20.09
exp(sim(z1,z4)/0.1)=exp(0.3/0.1)=exp(3)≈20.09
exp
(
sim
(
z
1
,
z
5
)
/
0.1
)
=
exp
(
0.4
/
0.1
)
=
exp
(
4
)
≈
54.60
\exp(\text{sim}(z_1, z_5) / 0.1) = \exp(0.4 / 0.1) = \exp(4) \approx 54.60
exp(sim(z1,z5)/0.1)=exp(0.4/0.1)=exp(4)≈54.60
exp
(
sim
(
z
1
,
z
7
)
/
0.1
)
=
exp
(
0.1
/
0.1
)
=
exp
(
1
)
≈
2.72
\exp(\text{sim}(z_1, z_7) / 0.1) = \exp(0.1 / 0.1) = \exp(1) \approx 2.72
exp(sim(z1,z7)/0.1)=exp(0.1/0.1)=exp(1)≈2.72
exp
(
sim
(
z
1
,
z
8
)
/
0.1
)
=
exp
(
0.2
/
0.1
)
=
exp
(
2
)
≈
7.39
\exp(\text{sim}(z_1, z_8) / 0.1) = \exp(0.2 / 0.1) = \exp(2) \approx 7.39
exp(sim(z1,z8)/0.1)=exp(0.2/0.1)=exp(2)≈7.39
exp
(
sim
(
z
1
,
z
9
)
/
0.1
)
=
exp
(
0.3
/
0.1
)
=
exp
(
3
)
≈
20.09
\exp(\text{sim}(z_1, z_9) / 0.1) = \exp(0.3 / 0.1) = \exp(3) \approx 20.09
exp(sim(z1,z9)/0.1)=exp(0.3/0.1)=exp(3)≈20.09
exp
(
sim
(
z
1
,
z
10
)
/
0.1
)
=
exp
(
0.4
/
0.1
)
=
exp
(
4
)
≈
54.60
\exp(\text{sim}(z_1, z_{10}) / 0.1) = \exp(0.4 / 0.1) = \exp(4) \approx 54.60
exp(sim(z1,z10)/0.1)=exp(0.4/0.1)=exp(4)≈54.60
因此,分母为:
2.72 + 7.39 + 20.09 + 54.60 + 2.72 + 7.39 + 20.09 + 54.60 ≈ 170.6 2.72 + 7.39 + 20.09 + 54.60 + 2.72 + 7.39 + 20.09 + 54.60 \approx 170.6 2.72+7.39+20.09+54.60+2.72+7.39+20.09+54.60≈170.6
- 比值:正样本对相对于所有负样本对的相似度比值
exp ( sim ( z 1 , z 6 ) / τ ) ∑ k = 1 10 1 [ k ≠ 1 and k ≠ 6 ] exp ( sim ( z 1 , z k ) / τ ) = 8103.08 170.6 ≈ 47.5 \frac{\exp(\text{sim}(z_1, z_6) / \tau)}{\sum_{k=1}^{10} \mathbf{1}_{[k \neq 1 \text{ and } k \neq 6]} \exp(\text{sim}(z_1, z_k) / \tau)} = \frac{8103.08}{170.6} \approx 47.5 ∑k=1101[k=1 and k=6]exp(sim(z1,zk)/τ)exp(sim(z1,z6)/τ)=170.68103.08≈47.5
- 对数和负号
− log ( 8103.08 170.6 ) ≈ − log ( 47.5 ) ≈ − 3.86 -\log \left( \frac{8103.08}{170.6} \right) \approx -\log(47.5) \approx -3.86 −log(170.68103.08)≈−log(47.5)≈−3.86
5. 总结
最终,对于正样本对 ( z 1 , z 6 ) (z_1, z_6) (z1,z6),InfoNCE损失为:
L InfoNCE ( z 1 , z 6 ) ≈ − 3.86 \mathcal{L}_{\text{InfoNCE}}(z_1, z_6) \approx -3.86 LInfoNCE(z1,z6)≈−3.86
同样的步骤可以应用于其他正样本对 ( z 2 , z 7 ) , ( z 3 , z 8 ) , ( z 4 , z 9 ) , ( z 5 , z 10 ) (z_2, z_7), (z_3, z_8), (z_4, z_9), (z_5, z_{10}) (z2,z7),(z3,z8),(z4,z9),(z5,z10),分别计算它们的InfoNCE损失。
四、总结
InfoNCE(Information Noise-Contrastive Estimation)损失函数通过从一组负样本中区分出正样本对,指导模型学习有意义的数据表示。它利用温度参数调整相似度分布,确保正样本对的相似度远高于所有负样本。该方法在SimCLR、MoCo等框架中广泛应用,显著提升了无监督和自监督学习的表现,成为构建高效深度学习模型的关键工具。