1. Contrastive Loss(对比损失):
Contrastive Loss 是最早的度量学习损失之一,直接对成对样本(正/负)施加 Margin 约束,分为两部分分别优化正、负样本对:
- 对正样本对:强制距离尽可能小(趋近于 0);
- 对负样本对:强制距离至少大于 Margin 值 α\alphaα,否则惩罚。
数学公式:
L=12N∑i=1N[yi⋅d(ai,pi)2+(1−yi)⋅max(α−d(ai,ni),0)2]\mathcal{L} = \frac{1}{2N} \sum_{i=1}^N \left[ y_i \cdot d(a_i, p_i)^2 + (1-y_i) \cdot \max(\alpha - d(a_i, n_i), 0)^2 \right]L=2N1i=1∑N[yi⋅d(ai,pi)2+(1−yi)⋅max(α−d(ai,ni),0)2]
其中:
- yiy_iyi:样本对标签(yi=1y_i=1yi=1 表示正样本对,yi=0y_i=0yi=0 表示负样本对);
- α\alphaα:Margin 参数(通常取 1.0~2.0);
- NNN:样本对数量。
- d=∥ai−pi∥2=(∑i=1N(ai−pi)2)1/2d = \|a_i - p_i\|_2 = (\sum_{i=1}^N(a^i-p^i)^2)^{1/2}d=∥ai−pi∥2=(∑i=1N(ai−pi)2)1/2
1.1 核心逻辑
- 损失函数的本质:模型训练的目标是最小化损失值,损失越大,模型调整参数的“动力”越强;
- 距离函数 d(a,p)d(a,p)d(a,p):这里默认是欧式距离(L2 距离),即 d(a,p)=∥a−p∥2=(a1−p1)2+(a2−p2)2+...+(ad−pd)2d(a,p) = \|a - p\|_2 = \sqrt{(a_1-p_1)^2 + (a_2-p_2)^2 + ... + (a_d-p_d)^2}d(a,p)=∥a−p∥2=(a1−p1)2+(a2−p2)2+...+(ad−pd)2,距离越大,说明两个嵌入向量越“远”,匹配度越低;
- Margin 参数 α\alphaα:是人为设定的“阈值”(比如取 1.0),代表我们希望负样本对的距离至少要达到这个值才“合格”。
1.1.1 正样本对
正样本对的标签 yi=1y_i=1yi=1,代入 Contrastive Loss 公式:
Lpos=yi⋅d(a,p)2=1⋅d(a,p)2=d(a,p)2\mathcal{L}_{pos} = y_i \cdot d(a,p)^2 = 1 \cdot d(a,p)^2 = d(a,p)^2Lpos=yi⋅d(a,p)2=1⋅d(a,p)2=d(a,p)2
- d(a,p)2d(a,p)^2d(a,p)2 是距离的平方(非负),距离和损失呈正相关:
- 如果 aaa 和 ppp 完全重合(匹配度 100%),d(a,p)=0d(a,p)=0d(a,p)=0,损失 Lpos=0\mathcal{L}_{pos}=0Lpos=0(模型最满意,无需调整);
- 如果 aaa 和 ppp 距离远(比如 d(a,p)=2d(a,p)=2d(a,p)=2),损失 Lpos=4\mathcal{L}_{pos}=4Lpos=4(损失大,模型必须调整)。
模型的目标是最小化损失,为了让 Lpos\mathcal{L}_{pos}Lpos 变小,必须让 d(a,p)d(a,p)d(a,p) 变小——也就是让锚点 aaa 和正样本 ppp 的嵌入向量“靠近”。
一句话总结:正样本对的损失直接等于距离的平方,距离越远损失越大,模型为了减少损失,会主动把匹配的两个实体嵌入往一起“拉”。
1.1.2 负样本对
负样本对的标签 yi=0y_i=0yi=0,代入 Contrastive Loss 公式:
Lneg=(1−yi)⋅max(α−d(a,n),0)2=1⋅max(α−d(a,n),0)2\mathcal{L}_{neg} = (1-y_i) \cdot \max(\alpha - d(a,n), 0)^2 = 1 \cdot \max(\alpha - d(a,n), 0)^2Lneg=(1−yi)⋅max(α−d(a,n),0)2=1⋅max(α−d(a,n),0)2
这里的 max(⋅,0)\max(\cdot, 0)max(⋅,0) 是关键——它让损失只有在“负样本对距离小于阈值 α\alphaα”时才生效:
- 情况 1:d(a,n)<αd(a,n) < \alphad(a,n)<α(比如 α=1.0\alpha=1.0α=1.0,d(a,n)=0.5d(a,n)=0.5d(a,n)=0.5):
max(1.0−0.5,0)=0.5\max(1.0 - 0.5, 0) = 0.5max(1.0−0.5,0)=0.5,损失 Lneg=(0.5)2=0.25\mathcal{L}_{neg} = (0.5)^2 = 0.25Lneg=(0.5)2=0.25(损失>0,模型需要调整); - 情况 2:d(a,n)≥αd(a,n) ≥ \alphad(a,n)≥α(比如 α=1.0\alpha=1.0α=1.0,d(a,n)=1.5d(a,n)=1.5d(a,n)=1.5):
max(1.0−1.5,0)=0\max(1.0 - 1.5, 0) = 0max(1.0−1.5,0)=0,损失 Lneg=02=0\mathcal{L}_{neg} = 0^2 = 0Lneg=02=0(损失=0,模型无需调整)。
模型的目标是最小化损失,仅当负样本对距离不足 α\alphaα 时,模型才有调整动力:
- 当 d(a,n)<αd(a,n) < \alphad(a,n)<α:损失 (α−d(a,n))2(\alpha - d(a,n))^2(α−d(a,n))2 是正的,且 d(a,n)d(a,n)d(a,n) 越小(负样本靠得越近),损失越大;
- 模型为了减少损失,必须让 d(a,n)d(a,n)d(a,n) 变大,直到 d(a,n)≥αd(a,n) ≥ \alphad(a,n)≥α(此时损失为 0,模型停止调整)。
优缺点:
-
✅ 优点:
- 比 triplet 更简单,只需 pair;
- 计算开销小;
- 适合二分类式对齐任务。
-
❌ 缺点
- 需要平衡正负样本比例;
- 负样本若太“容易”,模型学不到判别性;
- 不如 triplet 利用相对关系强。
-
🎯 适用场景
- 手写体识别(原始 Siamese Network)
- 句子语义相似度(如 STS-B)
- 小规模跨模态对齐(图像-标题)
2 Triplet Loss (三元组损失)
通过一个 锚点(anchor)、一个 正样本(positive)(与 anchor 同类/对齐)、一个 负样本(negative)(不同类/不对齐),强制模型满足:
“anchor 与 positive 的距离 < anchor 与 negative 的距离 - margin”
只有当正样本距离比负样本距离近得不够多(小于 margin)时,才产生损失。
设嵌入函数为 ( f(\cdot) ),距离函数通常为欧氏距离 ( d(x, y) = |f(x) - f(y)|_2 ),则:
Ltriplet=max(d(a,p)−d(a,n)+α, 0)
\mathcal{L}_{\text{triplet}} = \max\left( d(a, p) - d(a, n) + \alpha,\ 0 \right)
Ltriplet=max(d(a,p)−d(a,n)+α, 0)
其中:
- aaa: anchor
- ppp: positive
- nnn: negative
- α>0\alpha > 0α>0: margin(间隔)
总损失为所有三元组的平均。
- 仅关注三元组内的相对距离,而非绝对距离;
- 优化目标是让锚点到正样本的距离,比到负样本的距离至少小 γ\gammaγ,强制拉大正负样本的区分度。
扩展版本(Batch Hard Triplet Loss):
为提升优化效率,实际中常用「批次内最难样本」挖掘:
L=1N∑i=1Nmax(0,d(ai,pi+)−d(ai,ni−)+γ)\mathcal{L} = \frac{1}{N} \sum_{i=1}^N \max(0, d(a_i, p_i^+) - d(a_i, n_i^-) + \gamma)L=N1i=1∑Nmax(0,d(ai,pi+)−d(ai,ni−)+γ)
其中 pi+p_i^+pi+ 是批次内与 aia_iai 距离最远的正样本,ni−n_i^-ni− 是批次内与 aia_iai 距离最近的负样本(最难优化的样本对)。
✅ 优点
- 直观、几何解释清晰;
- 显式建模相对距离;
- 广泛用于人脸、Re-ID、跨模态检索。
❌ 缺点
- 采样困难:需构造有效三元组(避免 trivial triplets);
- 训练效率低:大量无效三元组导致收敛慢;
- 对 margin 超参敏感。
🔧 改进策略
- Hard Negative Mining:只选难负样本;
- Batch All / Batch Hard:在 batch 内挖掘所有或最难三元组;
- 使用 semi-hard 三元组(正负距离差在 (0, margin) 之间)。
🎯 适用场景
- 人脸识别(FaceNet)
- 行人重识别(Person Re-ID)
- 跨知识图谱实体对齐
- 图像-文本对齐(早期 CLIP 前身)
3 InfoNCE / NT-Xent(Noise-Contrastive Estimation噪声对比估计)(归一化温度标度交叉熵损失)
注:严格来说 InfoNCE 是理论框架,NT-Xent 是其在 SimCLR 中的具体实现。
InfoNCE(Information Noise Contrastive Estimation)是对比学习的核心损失,NT-Xent(Normalized Temperature-scaled Cross Entropy)是其在批量对比学习中的实现(常用于 SimCLR/MoCo 等框架),核心是将对齐问题转化为「多分类任务」:
- 把锚点的正样本视为“正确类别”,批次内所有负样本视为“错误类别”;
- 通过温度系数 ttt 控制 Margin 强度,让模型对正样本的相似度远高于负样本。
将 一个正样本 与 多个负样本 放在同一个 softmax 分母中,最大化正样本的 log-likelihood。
核心是 多分类代理任务:给定 anchor,从 batch 中找出哪个是它的正样本。
设 batch 中有 2N2N2N 个样本(每对增强视为正样本),对第 iii 个样本:
Li=−logexp(sim(zi,zj)/τ)∑k=1Kexp(sim(zi,zk)/τ) \mathcal{L}_i = -\log \frac{\exp(\text{sim}(z_i, z_j) / \tau)}{\sum_{k=1}^K \exp(\text{sim}(z_i, z_k) / \tau)} Li=−log∑k=1Kexp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ)
其中:
- zi,zjz_i, z_jzi,zj 是同一原始样本的两种增强视图(正对);
- sim(u,v)=u⊤v/(∥u∥∥v∥)\text{sim}(u, v) = u^\top v / (\|u\|\|v\|)sim(u,v)=u⊤v/(∥u∥∥v∥)(余弦相似度);
- τ>0\tau > 0τ>0:温度参数(temperature),控制分布 sharpness;
- 总 loss 为所有 iii 的平均。
虽然 没有显式 margin,但 温度 τ 隐式控制“分离程度”:τ 越小,正负越分离。
✅ 优点
- 利用 batch 内所有样本作为负例,高效;
- 无需 hard mining;
- 在自监督学习中 SOTA(SimCLR、MoCo 等)。
❌ 缺点
- 依赖大 batch size(否则负样本不足);
- 温度 τ 需调参;
- 对数据增强敏感。
🎯 适用场景
- 自监督视觉表示学习(SimCLR, MoCo)
- 多语言句子嵌入(如 LaBSE)
- 跨模态预训练(ALIGN, CLIP 的变体)
- 推荐系统中的用户-物品对比学习
2606

被折叠的 条评论
为什么被折叠?



