对比学习损失函数系列(3/4):InfoNCE 与 SimCLR

副标题 / 摘要 InfoNCE 是现代对比学习的核心损失,SimCLR 则把它推向实用化。本文用公式、步骤与最小实验,带你理解“批内负样本 + 增强视图”的训练逻辑。 预计阅读时长:18~22 分钟 标签:infonce、simclr、self-supervised SEO 关键词:InfoNCE, SimCLR, 对比学习, 自监督 元描述:讲清 InfoNCE 的数学目标与 SimCLR 的训练结构,含可运行代码示例。 系列导航 (1/4)对比损失 Contrastive Loss (2/4)三元组损失 Triplet Loss (3/4)InfoNCE + SimCLR(本文) (4/4)CLIP 对比学习目标 目标读者 希望入门自监督对比学习的读者 需要理解 SimCLR 训练流程的工程实践者 想把对比学习迁移到业务数据的开发者 背景 / 动机 有标注数据昂贵,而无标注数据充足。 InfoNCE 让我们用“正负样本对齐”替代人工标签, SimCLR 则证明:只要数据增强和 batch 够大,效果可以接近监督学习。 核心概念 正样本视图:同一图像的两种增强视图。 批内负样本:同一 batch 中其他样本视为负样本。 投影头:把表示映射到对比空间,提高对比学习效果。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 InfoNCE 的核心是“在一堆负样本里找到正确配对”。 SimCLR 则把“正确配对”定义为同一张图像的两个增强视图。 基础示例(1) 图像 A 经过两种增强得到 A1 与 A2 目标:A1 与 A2 相似度最大化 基础示例(2) A1 在 batch 中看到 B1、C1 等视为负样本 目标:A1 与 A2 的相似度高于 A1 与其他样本 实践指南 / 步骤 设计增强策略(裁剪、翻转、颜色扰动)。 构造两份增强视图作为正样本对。 编码器 + 投影头输出对比向量。 使用 InfoNCE 计算对比损失并训练。 可运行示例(最小 SimCLR 实验) import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import DataLoader from torchvision import datasets, transforms torch.manual_seed(42) class TwoCrops: def __init__(self, base_transform): self.base = base_transform def __call__(self, x): return self.base(x), self.base(x) def info_nce(z1, z2, temp=0.5): z1 = F.normalize(z1, dim=1) z2 = F.normalize(z2, dim=1) logits = z1 @ z2.T / temp labels = torch.arange(z1.size(0), device=z1.device) loss1 = F.cross_entropy(logits, labels) loss2 = F.cross_entropy(logits.T, labels) return (loss1 + loss2) / 2 class Encoder(nn.Module): def __init__(self, out_dim=128): super().__init__() self.backbone = nn.Sequential( nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.AdaptiveAvgPool2d(1), nn.Flatten(), ) self.proj = nn.Sequential( nn.Linear(32, 128), nn.ReLU(), nn.Linear(128, out_dim), ) def forward(self, x): x = self.backbone(x) return self.proj(x) base_tf = transforms.Compose( [ transforms.RandomResizedCrop(32, scale=(0.6, 1.0)), transforms.RandomHorizontalFlip(), transforms.ToTensor(), ] ) dataset = datasets.FakeData( size=512, image_size=(3, 32, 32), num_classes=10, transform=TwoCrops(base_tf), ) loader = DataLoader(dataset, batch_size=128, shuffle=True) model = Encoder() opt = torch.optim.Adam(model.parameters(), lr=1e-3) for epoch in range(1, 6): total = 0.0 for (x1, x2), _ in loader: z1 = model(x1) z2 = model(x2) loss = info_nce(z1, z2, temp=0.5) opt.zero_grad() loss.backward() opt.step() total += loss.item() print(f"epoch={epoch} loss={total/len(loader):.4f}") C — Concepts(核心思想) 方法类型 InfoNCE 与 SimCLR 属于自监督对比学习,通过增强视图构造正样本对。 ...

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

对比学习损失函数系列(4/4):CLIP 对比学习目标

副标题 / 摘要 CLIP 把图像与文本放到同一嵌入空间,用双向 InfoNCE 进行对齐。本文从损失函数视角梳理 CLIP 的训练目标,并给出最小可运行示例。 预计阅读时长:14~18 分钟 标签:clip、multimodal、contrastive-learning SEO 关键词:CLIP, 对比学习, 多模态, InfoNCE 元描述:从损失函数角度拆解 CLIP 的双向对齐目标与工程应用。 系列导航 (1/4)对比损失 Contrastive Loss (2/4)三元组损失 Triplet Loss (3/4)InfoNCE + SimCLR (4/4)CLIP 对比学习目标(本文) 目标读者 想理解 CLIP 训练目标与公式的读者 需要在工程中使用图文对齐模型的实践者 希望把对比学习扩展到多模态的开发者 背景 / 动机 相比单模态对比学习,CLIP 的挑战在于“跨模态对齐”。 只要目标函数对齐得当,图像与文本就能通过相似度统一度量。 核心概念 图像/文本编码器:分别把图像与文本映射为向量。 双向对齐:图像检索文本 + 文本检索图像。 温度参数:控制相似度分布的尖锐程度。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 CLIP 的损失可以理解为“图像-文本的双向匹配”。 在一个 batch 中,正确图文对要排在最前面。 基础示例(1) 图像:一只狗 文本:“a photo of a dog” 与 “a red car” 目标:图像与狗文本更相近 基础示例(2) 在相似度矩阵中,对角线应该最大。 实践指南 / 步骤 图像与文本分别编码成向量。 L2 归一化,计算相似度矩阵。 用双向交叉熵训练(图像检索文本 + 文本检索图像)。 监控相似度矩阵是否“对角线突出”。 可运行示例(最小 CLIP 损失) import torch import torch.nn.functional as F torch.manual_seed(42) N, D = 4, 8 image = F.normalize(torch.randn(N, D), dim=-1) text = F.normalize(torch.randn(N, D), dim=-1) logits = image @ text.T / 0.07 labels = torch.arange(N) loss_i = F.cross_entropy(logits, labels) loss_t = F.cross_entropy(logits.T, labels) loss = (loss_i + loss_t) / 2 print(loss.item()) C — Concepts(核心思想) 方法类型 CLIP 属于多模态对比学习,核心是对齐图像与文本的共享嵌入空间。 ...

2026年1月24日 · 2 分钟 · 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]