对比学习(Contrastive Learning)方法详解

对比学习(Contrastive Learning)方法详解

对比学习(Contrastive Learning)是一种强大的自监督或弱监督表示学习方法,其核心思想是学习一个嵌入空间,在这个空间中,相似的样本(“正样本对”)彼此靠近,而不相似的样本(“负样本对”)彼此远离。

核心概念

  • 目标: 学习数据的通用、鲁棒、可迁移的表示(通常是向量/嵌入),而不需要大量的人工标注标签。

  • 核心思想: “通过对比来学习”。模型通过比较数据点之间的异同来理解数据的内在结构。

  • 关键元素:

    • 锚点样本(Anchor): 一个查询样本。

    • 正样本(Positive Sample): 与锚点样本在语义上相似或相关的样本(例如,同一张图片的不同增强视图、同一个句子的不同表述、同一段音频的不同片段)。

    • 负样本(Negative Sample): 与锚点样本在语义上不相似的样本(例如,来自不同图片、不同句子、不同音频的样本)。

    • 编码器(Encoder): 一个神经网络(如ResNet, Transformer),将输入数据(图像、文本、音频等)映射到低维嵌入空间 f ( x ) → z f(x) \to z f(x)z

    • 相似度度量(Similarity Metric): 通常是余弦相似度 s i m ( z i , z j ) = ( z i ⋅ z j ) / ( ∣ ∣ z i ∣ ∣ ⋅ ∣ ∣ z j ∣ ∣ ) sim(z_i, z_j) = (z_i · z_j) / (||z_i|| \cdot ||z_j||) sim(zi,zj)=(zizj)/(∣∣zi∣∣∣∣zj∣∣) 或点积 s i m ( z i , z j ) = z i ⋅ z j sim(z_i, z_j) = z_i \cdot z_j sim(zi,zj)=zizj,用于衡量两个嵌入向量在嵌入空间中的接近程度。

  • 基本流程:

    1. 对输入数据应用数据增强,生成不同的视图(对于图像:裁剪、旋转、颜色抖动、模糊等;对于文本:同义词替换、随机掩码、回译等;对于音频:时间拉伸、音高偏移、加噪等)。

    2. 使用同一个编码器 f ( ⋅ ) f(\cdot) f() 处理锚点样本 x x x及其正样本 x + x^+ x+(通常是 x x x的一个增强视图),得到嵌入向量 z z z z + z^+ z+

    3. 从数据集中采样或使用内存库/当前批次中获取一组负样本 x 1 − , x 2 − , . . . , x K − {x^-_1, x^-_2, ..., x^-_K} x1,x2,...,xK,并通过 f ( ⋅ ) f(\cdot) f()得到对应的负嵌入向量 z 1 − , z 2 − , . . . , z K − {z^-_1, z^-_2, ..., z^-_K} z1,z2,...,zK

    4. 计算锚点 z z z与正样本 z + z^+ z+的相似度(应高),以及与每个负样本 z k − z^-_k zk的相似度(应低)。

    5. 定义一个对比损失函数(如InfoNCE)来最大化 z z z z + z^+ z+ 之间的相似度,同时最小化 z z z和所有 z k − z^-_k zk 之间的相似度。

    6. 通过优化这个损失函数来更新编码器 f ( ⋅ ) f(\cdot) f()的参数,使得相似的样本在嵌入空间中聚集,不相似的样本分离。

核心原理

对比学习的有效性建立在几个关键原理之上:

  • 不变性学习: 通过对同一数据点的不同增强视图(正样本对)施加高相似度约束,编码器被迫学习对这些增强变换保持不变的特征(即数据的内在语义内容)。例如,一只猫的图像无论怎么裁剪、旋转、变色,编码器都应将其映射到相似的嵌入位置。

  • 判别性学习: 通过将锚点与众多不同的负样本区分开来,编码器被迫学习能够区分不同语义概念的特征。这有助于模型捕捉细微的差异,避免学习到平凡解(例如,将所有样本映射到同一个点)。

  • 最大化互信息: InfoNCE 损失函数(见下文)被证明是在最大化锚点样本 x x x与其正样本 x + x^+ x+的嵌入 z z z z + z^+ z+之间的互信息的下界。这意味着模型在学习捕捉 x x x x + x^+ x+之间共享的信息(即数据的本质内容)。

  • 避免坍缩(Collapse): 对比学习面临的一个主要挑战是模型可能找到一个“捷径解”,将所有样本映射到同一个嵌入向量(坍缩到一个点)。负样本的存在、特定的损失函数设计(如 InfoNCE的分母项)、架构技巧(如预测头、非对称网络、动量编码器)都旨在防止这种坍缩。

关键损失函数

对比学习有多种损失函数形式,它们共享相同的目标,但在数学表述和侧重点上有所不同。

Contrastive Loss (成对损失/边界损失)

  • 目标: Contrastive Loss 是对比学习中最基础的损失函数,处理成对样本(正样本对 / 负样本对),通过距离度量(欧氏距离或余弦相似度)约束特征空间的结构。

  • 公式:
    L c o n t r a s t i v e = y i j ⋅ d ( f ( x i ) , f ( x j ) ) 2 + ( 1 − y i j ) ⋅ m a x ( 0 , m a r g i n − d ( f ( x i ) , f ( x j ) ) ) 2 \mathcal{L}_{contrastive}=y_{ij}\cdot d(f(x_i), f(x_j))^2+(1-y_{ij})\cdot max(0, margin-d(f(x_i), f(x_j)))^2 Lcontrastive=yijd(f(xi),f(xj))2+(1yij)max(0,margind(f(xi),f(xj)))2

    • d ( ⋅ , ⋅ ) d(\cdot, \cdot) d(,) 是距离度量(如欧氏距离)。
    • margin 是一个超参数,强制执行正负样本对之间的最小差异。它定义了正负样本对在嵌入空间中应保持的最小“安全距离”。
  • 特点:

    • 非常直观,直接体现了对比学习的基本思想(拉近正对,推远负对)。
    • 正样本对( y i j = 1 y_{ij}=1 yij=1):鼓励特征距离尽可能小(趋近于 0)。
    • 负样本对( y i j = 0 y_{ij}=0 yij=0):若当前距离小于margin,则施加惩罚,迫使距离超过margin;若已大于margin,则不惩罚。
    • 缺点:仅考虑成对关系,当负样本对距离远大于m时,梯度消失,学习效率低。

Triplet Loss (三元组损失)

  • 目标: 明确要求锚点到正样本的距离比到负样本的距离小至少一个边界 margin。

  • 公式 (使用距离):
    L t r i p l e t = m a x ( 0 , d ( z , z + ) − d ( z , z − ) + m a r g i n ) \mathcal{L}_{triplet} = max(0, d(z, z^+) - d(z, z^-) + margin) Ltriplet=max(0,d(z,z+)d(z,z)+margin)

  • 特点:

  • 每次显式地处理一个三元组(锚点、正样本、负样本)。

  • 对负样本采样敏感,特别是对“半困难”负样本(那些距离锚点比正样本远,但又在 margin 边界附近的负样本)能提供最有价值的梯度。

  • 在大规模数据集上,如何高效挖掘有意义的(半)困难三元组是一个挑战。

InfoNCE (Noise-Contrastive Estimation) Loss (噪声对比估计损失,NT-Xent Loss)

  • 目标: 源于噪声对比估计(NCE),将对比学习转化为多分类问题:给定一个锚点 x x x,从包含一个正样本 x + x^+ x+ 和 K 个负样本 x 1 − , . . . , x K − {x^-_1, ..., x^-_K} x1,...,xK 的集合 x + , x 1 − , . . . , x K − {x^+, x^-_1, ..., x^-_K} x+,x1,...,xK 中,识别出哪个是正样本 x + x^+ x+。目标是最大化锚点 x x x 与其正样本 x + x^+ x+的互信息的下界。

  • 公式:
    L I n f o N C E = − log ⁡ e x p ( s i m ( z , z + ) / τ ) e x p ( s i m ( z , z + ) / τ ) + ∑ k = 1 K e x p ( s i m ( z , z k − ) / τ ) \mathcal{L}_{InfoNCE} = -\log \frac{exp(sim(z, z^+) / \tau)}{exp(sim(z, z^+) / \tau) + \sum_{k=1}^K exp(sim(z, z^-_k) / \tau)} LInfoNCE=logexp(sim(z,z+)/τ)+k=1Kexp(sim(z,zk)/τ)exp(sim(z,z+)/τ)

    等价于交叉熵损失,其中正样本为正类,负样本为负类,分类标签为 one-hot 向量。
    NT-Xent (Normalized Temperature-scaled Cross Entropy) Loss是 InfoNCE 的一种具体实现形式,使用 L2 归一化 的嵌入向量(即 ||z|| = 1)。

显式地引入温度系数 τ。

  • s i m ( z i , z j ) sim(z_i, z_j) sim(zi,zj):锚点嵌入 z z z与另一个样本嵌入 z j z_j zj的相似度(通常用余弦相似度)。

  • τ \tau τ:一个温度系数(Temperature),非常重要的超参数。它调节了分布的形状:

    • τ \tau τ 小:损失函数更关注最困难的负样本(相似度高的负样本),使决策边界更尖锐。
    • τ \tau τ 大:所有负样本的权重更均匀,分布更平滑。
    • K:负样本的数量。
  • 特点:

    • 当前对比学习的主流损失函数。 像 SimCLR, MoCo, CLIP 等里程碑式的工作都采用它。

    • 形式上是一个 (K+1) 类的 softmax 交叉熵损失,其中正样本是目标类。

    • 理论根基强: 被证明是在最大化 z z z z + z^+ z+之间互信息 I ( z ; z + ) I(z; z^+) I(z;z+)的下界。

    • 利用大量负样本: 损失函数的分母项 ∑ e x p ( s i m ( z , z k − ) / τ ) \sum exp(sim(z, z^-_k) / \tau) exp(sim(z,zk)/τ) 要求模型同时区分锚点与多个负样本,这比只区分一个负样本(如 Triplet Loss)提供了更强的学习信号和更稳定的梯度。更多的负样本通常能带来更好的表示。

    • 温度系数 τ \tau τ至关重要: 需要仔细调整。合适的 τ \tau τ能有效挖掘困难负样本的信息。

    • 计算成本随负样本数量K线性增加。MoCo 等模型通过维护一个大的负样本队列(动量编码器)来解决这个问题,使得 K 可以非常大(如 65536)而不显著增加每批次的计算量。

    • 隐式地学习了一个归一化的嵌入空间(如果使用余弦相似度)。

总结对比

特征Pair-wise/Triplet LossInfoNCELoss
核心思想直接约束距离/相似度差异 (边界)多类分类 (识别正样本) / 最大化互信息下界
样本关系显式处理锚点-正样本-负样本三元组锚点 vs. 1正样本 + K负样本
负样本数量1 (per triplet)K (通常很大, 几十到几万)
关键超参数margin温度系数 τ \tau τ
梯度来源主要来自困难负样本来自所有负样本 (权重由相似度和 τ \tau τ决定)
计算复杂度相对较低 (每样本)随K线性增加 (但MoCo等可高效处理大K)
理论根基直观但理论较弱强 (基于互信息最大化)
主流性早期/特定应用 (如人脸)当前主流 (SimCLR, MoCo, CLIP等)
防止坍缩机制依赖负样本和margin依赖大量负样本和分母项
表示空间不一定归一化通常L2归一化 (超球面)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.6 http模块nodejs 对比 go

我们以go语言 原生实现 和浏览器交互.到现在学习 nodejs http模块. nodejs 对于请求分发,也需要我们自己处理. 我们应该也对 http 服务是建立在 tcp协议基础上.有更深入的体会了吧. 对于我们之后 学习 java web容器. 能有更深入的认知. 请求分发 请求分发是指 Web 框架或服务器…

护照阅读器在景区的应用

护照阅读器在景区的应用可以显著提升游客管理效率、增强安全性并优化游客体验。以下是其主要应用场景、优势及实施建议: 一、核心应用场景 快速入园核验 自动身份识别:通过扫描护照芯片(MRZ码或NFC读取),1-3秒完成身份…

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…

什么是遥测数据?

遥测数据定义 遥测数据提供了关于系统性能的重要洞察,对主动解决问题和做出明智决策至关重要。要实现这一点,不能只依赖原始数据 —— 你需要实时的洞察,而这正是遥测数据提供的。 遥测是从远程来源(如服务器、应用程序和监控设…

【JavaAPI搜索引擎】项目测试报告

JavaAPI搜索引擎测试报告 项目背景与项目介绍项目功能自动化测试单元测试测试ansj分词器测试能否获取到正确的URL测试能否正确解析文件中的正文 测试计划界面测试测试1 页面布局是否合理美观,元素是否正确显示测试2 测试是否可以正常显示出搜索结果测试3 点击搜索结…

如何选择合适的IP轮换周期

选择合适的IP轮换周期需综合业务目标、目标平台风控规则、IP类型与质量等多维度因素,以下是系统化决策框架及实操建议: 🔄 一、核心决策要素 业务场景类型 高频操作型(如数据采集、广告点击): 轮换周期短&a…

GO Goroutine 与并发模型面试题及参考答案

目录 什么是 Goroutine,它与线程有何区别? 如何创建一个 Goroutine?有哪些方式? Goroutine 执行函数时传递参数应注意什么问题? 使用 Goroutine 时如何确保主线程不会提前退出? 多个 Goroutine 写共享变量时会出现什么问题?如何解决? 如何用 sync.WaitGroup 管理 …

Leetcode-11 2 的幂

Leetcode-11 2 的幂(简单) 题目描述思路分析通过代码(python) 题目描述 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数…

【Java】【力扣】121.买卖股票的最佳时机

思路 所以后续的每次都是在&#xff1a;1-判断是否更新最低点 2-如果不需要更新最低点 则计算差值 代码 class Solution { public int maxProfit(int[] prices) { int minprices[0]; int max0; for (int i 1; i < prices.length; i) { //假设0就是最低点 // 判…

微服务架构下大型商城系统的事务一致性攻坚:Saga、TCC与本地消息表的实战解析

当用户在商城完成支付却看到"订单异常"提示时&#xff0c;背后往往是分布式事务一致性缺失导致的业务裂缝。在微服务拆分的商城系统中&#xff0c;如何保障跨服务的交易原子性&#xff0c;成为架构设计的生死线。 一、商城分布式事务的典型场景与痛点 在某家电品牌商…

深入理解 Vue.observable:轻量级响应式状态管理利器

目录 引言 一、什么是 Vue.observable&#xff1f; 二、为什么需要 Vue.observable&#xff1f;解决什么问题&#xff1f; 三、核心原理&#xff1a;响应式系统如何工作 四、如何使用 Vue.observable 功能说明 技术要点 五、关键注意事项与最佳实践 六、实际应用案例 …

JS设计模式(5): 发布订阅模式

解锁JavaScript发布订阅模式&#xff1a;让代码沟通更优雅 在JavaScript的世界里&#xff0c;我们常常会遇到这样的场景&#xff1a;多个模块之间需要相互通信&#xff0c;但是又不想让它们产生过于紧密的耦合。这时候&#xff0c;发布订阅模式就像一位优雅的信使&#xff0c;…

【电路物联网】SDN架构与工作原理介绍

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

vscode 保存 js 时会自动格式化,取消设置也不好使

vscode 里的设置搜索 Editor: Format On Save 取消勾选 卸载 Prettier - Code formatter 这个插件后好使了&#xff0c;本来以为是插件的问题&#xff0c;后来发现是工作区设置的问题。 因为我是用 GitHub 下载的工程打开后&#xff0c; vscode 认为是工作区了, 因为 .vscode…

xcode中project.pbxproj点开为空白问题

由于需要修改signing里面的配置&#xff0c;点击了project.pbxproj。但是发现一片空白&#xff0c;如图 以为是配置文件损坏&#xff0c;邮件show in Finder看了一通后没看出什么所以然。并且发现entitlement文件、list文件全都是点开为白&#xff0c;并且没有任何保存 最后发…

JUC并发编程(四)常见模式

目录 一 同步与协调模式 1 保护性暂停模式 2 顺序控制模式 3 生产者消费者模式 4 Balking模式&#xff08;犹豫模式&#xff09; 二 线程管理/生命周期模式 1 两阶段终止模式 一 同步与协调模式 1 保护性暂停模式 一个线程需要等待另一个线程提供特定条件&#xff08;通常是…

Vue 数据代理机制对属性名的要求

Vue 数据代理机制对属性名的要求 在 Vue 的数据代理机制中,属性名需遵循以下关键规则: 1. 禁止以 _ 或 $ 开头 ⚠️ Vue 会跳过代理以 _ 或 $ 开头的属性原因:这些前缀被 Vue 保留用于内部属性(如 _data, _uid, $refs, $el 等)示例:data() {return {count: 1, // ✅…

pdf.js在iOS移动端分页加载优化方案(ios移动端反复刷新加载问题)

背景与问题 在iOS移动端加载大型PDF文件时&#xff0c;由于设备内存限制&#xff0c;经常遇到以下问题&#xff1a; 内存不足导致页面崩溃大文件加载缓慢页面反复重新加载 ##解决方案 采用PDF.js的分页加载策略&#xff0c;实现按需加载当前可视页面及相邻页面&#xff0c;…

【C++】来学习使用set和map吧

各位大佬好&#xff0c;我是落羽&#xff01;一个坚持不断学习进步的大学生。 如果您觉得我的文章有所帮助&#xff0c;欢迎多多互三分享交流&#xff0c;一起学习进步&#xff01; 也欢迎关注我的blog主页: 落羽的落羽 文章目录 一、set和map是什么二、set系列1. set2. mult…

h5st逆向分析

h5st最新5.1版本逆向分析 申明定位h5st生成的位置动态插桩,事半功倍日志分析,十分钟还原算法逻辑申明 本文仅用来记录学习过程以免日后忘了,如有侵权请联系删除。 定位h5st生成的位置 通过关键字“sign”搜索,可以定位到window.PSign.sign(f)这个位置,f参数的值为{ &qu…