对比学习损失函数系列(1/4):对比损失 Contrastive Loss

副标题 / 摘要 对比损失是度量学习最经典的成对目标:拉近同类、推远异类。本文用公式、几何直觉与最小可运行实验,帮你建立对比学习的第一块基石。 预计阅读时长:15~18 分钟 标签:contrastive-loss、metric-learning、pairwise SEO 关键词:对比损失, Contrastive Loss, 度量学习, 嵌入空间 元描述:讲清对比损失的数学形式、训练细节与工程应用场景。 系列导航 (1/4)对比损失 Contrastive Loss(本文) (2/4)三元组损失 Triplet Loss (3/4)InfoNCE + SimCLR (4/4)CLIP 对比学习目标 目标读者 想入门对比学习/度量学习的初学者 需要在工程中构建相似度模型的开发者 希望通过小实验理解公式含义的实践派 背景 / 动机 在推荐、检索、验证类任务里,我们往往不关心“分类标签”,而关心“相似度”。 对比损失用成对样本表达“相似/不相似”,是把语义关系映射到向量空间的基础方法。 核心概念 嵌入空间:把样本映射为向量,距离代表语义相近程度。 正负样本对:正样本对应“相似”,负样本对对应“不相似”。 Margin:负样本需要被推远的最小距离阈值。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 对比损失做的事很简单: 同类样本对要靠得更近。 异类样本对要至少分开一个 margin。 基础示例(1) 两张同一人的人脸:距离应该变小。 两个不同人的人脸:距离至少大于 margin。 基础示例(2) 同类商品图片:嵌入距离小。 异类商品图片:嵌入距离大。 实践指南 / 步骤 选择特征编码器(如 MLP/CNN)。 构造正负样本对,并标记 y=1/0。 计算成对距离并应用对比损失。 观察正负样本平均距离是否分离。 可运行示例(最小对比损失实验) import random import torch import torch.nn as nn import torch.nn.functional as F random.seed(42) torch.manual_seed(42) def make_data(n=200): c1 = torch.randn(n, 2) * 0.4 + torch.tensor([0.0, 0.0]) c2 = torch.randn(n, 2) * 0.4 + torch.tensor([3.0, 3.0]) x = torch.cat([c1, c2], dim=0) y = torch.cat([torch.zeros(n), torch.ones(n)]).long() return x, y def make_pairs(x, y, num_pairs=1000): pairs = [] labels = [] for _ in range(num_pairs): if random.random() < 0.5: cls = random.randint(0, 1) idx = (y == cls).nonzero().flatten() i, j = idx[torch.randint(len(idx), (2,))] labels.append(1) else: i = (y == 0).nonzero().flatten()[torch.randint((y == 0).sum(), (1,))] j = (y == 1).nonzero().flatten()[torch.randint((y == 1).sum(), (1,))] labels.append(0) pairs.append((x[i], x[j])) return torch.stack([p[0] for p in pairs]), torch.stack([p[1] for p in pairs]), torch.tensor(labels) def contrastive_loss(z1, z2, y, margin=1.0): d = F.pairwise_distance(z1, z2) pos = y * d.pow(2) neg = (1 - y) * F.relu(margin - d).pow(2) return (pos + neg).mean() class Encoder(nn.Module): def __init__(self): super().__init__() self.net = nn.Sequential( nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 2), ) def forward(self, x): return self.net(x) x, y = make_data() x1, x2, pair_y = make_pairs(x, y, num_pairs=2000) model = Encoder() opt = torch.optim.Adam(model.parameters(), lr=1e-2) for epoch in range(1, 201): z1 = model(x1) z2 = model(x2) loss = contrastive_loss(z1, z2, pair_y.float(), margin=1.0) opt.zero_grad() loss.backward() opt.step() if epoch % 50 == 0: with torch.no_grad(): d = F.pairwise_distance(z1, z2) pos_d = d[pair_y == 1].mean().item() neg_d = d[pair_y == 0].mean().item() print(f"epoch={epoch} loss={loss.item():.4f} pos_d={pos_d:.3f} neg_d={neg_d:.3f}") C — Concepts(核心思想) 方法类型 对比损失属于度量学习 / 表示学习范式,使用成对样本将语义关系映射到向量距离。 ...

2026年1月24日 · 3 分钟 · map[name:Jeanphilo]

对比学习损失函数系列(2/4):三元组损失 Triplet Loss

副标题 / 摘要 Triplet Loss 用“相对排序”表达语义约束:让 anchor 更接近 positive,同时远离 negative。本文包含公式、难例挖掘与最小实验,帮助你把三元组损失用于工程实践。 预计阅读时长:16~20 分钟 标签:triplet-loss、metric-learning、hard-negative SEO 关键词:Triplet Loss, 三元组损失, 度量学习, hard negative 元描述:系统拆解 Triplet Loss 的训练逻辑、采样策略与工程场景。 系列导航 (1/4)对比损失 Contrastive Loss (2/4)三元组损失 Triplet Loss(本文) (3/4)InfoNCE + SimCLR (4/4)CLIP 对比学习目标 目标读者 已了解对比损失,希望理解更强排序约束的读者 需要构建相似度排序系统的工程实践者 想掌握 hard negative mining 逻辑的入门者 背景 / 动机 成对对比只能表达“像 / 不像”,而很多场景需要相对排序: “与 A 更像,而不是 B”。Triplet Loss 用三元组直接编码这种关系, 在检索与验证任务中非常常见。 核心概念 Anchor / Positive / Negative:锚点、同类样本、异类样本。 Margin:要求 anchor 与 negative 至少比 positive 远一个 margin。 Hard Negative Mining:选择最难的负样本提升训练信号。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 Triplet Loss 让“正确的相对关系”成立: ...

2026年1月24日 · 3 分钟 · map[name:Jeanphilo]

CLIP 系列(1/3):原理与对比学习公式——多模态对齐的核心机制

副标题 / 摘要 CLIP 通过对比学习把图像与文本映射到同一嵌入空间。本文以数学公式为主线,解释训练目标、损失函数与相似度计算,帮助你掌握多模态对齐的核心机制。 预计阅读时长:15~20 分钟 标签:clip、contrastive-learning、multimodal、infonce SEO 关键词:CLIP, 对比学习, 多模态, InfoNCE, 图文对齐 元描述:用公式与直觉讲清 CLIP 的对比学习目标、相似度计算与嵌入空间设计。 系列导航 (1/3)原理与对比学习公式(本文) (2/3)PyTorch 完整可复现实战 (3/3)工程化与优化 目标读者 想系统理解 CLIP 原理与数学目标的初学者 需要把对比学习迁移到工程场景的中级开发者 想搭建多模态系统、关注检索与零样本分类的应用型读者 背景 / 动机 传统图像分类需要固定标签集,而现实世界的描述更自然地以语言表达。 CLIP 的价值在于把视觉与语言放到同一空间里,通过相似度完成“检索”和“分类”,让模型具备零样本泛化能力。 要理解 CLIP,核心不是“模型多大”,而是对比学习目标如何让图文对齐。 核心概念 对比学习(Contrastive Learning):让“正样本对”更近,“负样本对”更远。 共享嵌入空间:图像与文本映射到同一向量空间,用相似度统一度量。 温度参数(Temperature):控制相似度分布的“尖锐度”,影响训练稳定性。 对称目标:图像检索文本 + 文本检索图像,双向一致。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 CLIP 做的事很直接: 用图像编码器把图片变成向量 v_i。 用文本编码器把描述变成向量 t_i。 在同一个空间里对齐 v_i 与 t_i,用相似度度量它们“匹配”的程度。 训练时让正确配对的图文更近、错误配对更远。 基础示例(1) 图片:一只狗 文本 A:“一只狗在草地上” 文本 B:“一辆红色汽车” 训练后应满足:sim(图像, 文本A) > sim(图像, 文本B)。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]