自监督对比学习系列论文(二):有引导对比学习--SCCL,SwAV,PCL,SupervisedCon

news2024/12/24 9:03:19

自监督对比学习

 本篇承接前一篇自监督对比学习的介绍自监督对比学习系列论文(一):无引导对比学习–MOCO,SimCLR,这次主要关注于包含先验指导的对比学习,这一指导更进一步的可以区分为聚类指导以及标签指导两种类型。前者给出数据集的基本结构–即数据可以大致划分为 K K K个类别,但如何划分,依据什么样的特征或者目标进行划分并没有给出,需要通过聚类的方式自行学习。而基于标签指导的对比学习则显式的给出了instance的标签,迫使同类样本在特征空间上的距离得以保留。

聚类对比学习

 聚类对比学习的思路相交于instance-wise contrastive learning而言,笔者认为是更为合理更为深入的。聚类对比学习的基础同样是认为每个instance可以认为是单独的一类,但在此基础之上,我们并不能否认某些类应当是更为亲密、而某些类则应当较为疏远,典型的例子如下:
在这里插入图片描述

instace-wise对比学习倾向于学到的是左边的的特征空间,但对于同类“狗”样本而言,即使是负样本,也应该和正样本更为亲密,由此诞生出了聚类对比学习。由于没有先验标签指导,只能通过聚类的形式来判断样本在语义上的一致性,进行有偏好的特征空间构造。而另一方面,针对于反例构造中性能与开销的抉择问题,聚类对比学习可以通过计算group层面的相似性来减少instance层面的开销,便于模型训练。

SCCL

 SCCL其实并不算是完全的聚类对比学习,而是对比监督学习,也就是利用对比学习的范式来完成聚类问题,其思路也非常的简单粗暴。既然instance-wise 对比学习可以实现将每个样本推开,同时又隐式的将相似样本的距离拉近(这一点存疑),那么完全可以借助这一特性来将那些较为重叠(集群)的样本们分散开来,从而形成簇。实现方式也非常的直接,就是在simCLR的框架上额外增加了一个聚类头,如下图所示:
在这里插入图片描述

同样是在 N N N张图片组成的batch内,针对每个样本都产生1个正例和 2 N − 1 2N-1 2N1个反例,利用infoNCELoss来训练模型。不同之处就在于Clustering Head的设计,实际上这个聚类头也是比较典型的设计,常见于深度聚类算法之中,意图用用可训练的方式来寻找数据数据的潜在分布。具体而言是先假定数据可以被划分为 K K K类,并且初始化 K K K个聚类中心,然后利用假定每个簇内的数据分布都符合 t t t分布,由此计算样本 e j e_j ej从属于第 k k k类的概率如下:
q j k = ( 1 + ∣ ∣ e j − μ k ∣ ∣ 2 2 / α ) − α + 1 2 ∑ k ′ = 1 K ( 1 + ∣ ∣ e j − μ k ′ ∣ ∣ 2 2 / α ) − α + 1 2 q_{jk}=\frac{(1+||e_j-\mu_k||^2_2/\alpha)^{-\frac{\alpha+1}{2}}}{\sum_{k'=1}^{K}(1+||e_j-\mu_k'||^2_2/\alpha)^{-\frac{\alpha+1}{2}}} qjk=k=1K(1+∣∣ejμk22/α)2α+1(1+∣∣ejμk22/α)2α+1
由此就得到了条件概率(软分类) P ( K ∣ q j ) P(\bold{K}|q_j) P(Kqj)。传统的聚类方法如k-Means想要优化的是簇内聚类和簇间聚类,而在深度聚类里我们则希望实现分布的近似,想要加强簇的纯净程度,这一目标分布如下:
p j k = q j k 2 / f k ∑ k ′ q j k 2 / f k ′ p_{jk}=\frac{q^2_{jk}/f_k}{\sum_{k'}q^2_{jk}/f_{k'}} pjk=kqjk2/fkqjk2/fk
其中 f k − ∑ j = 1 N q j k f_k-\sum_{j=1}^{N}q_{jk} fkj=1Nqjk,聚类头只对原始的输入进行计算,不对变换后的图片进行计算。这一目标分布具有三个特点:

  1. strengthen predictions
  2. 更加强调高置信度的数据点
  3. 使得每个聚类中心对于模型训练都有贡献

首先通过抬升概率的阶数使得分布更加的尖锐,然后通过簇置信度的归一化来消除大簇对于小簇的影响(实际上这一函数的具体数学原理真没看懂)。而后通过优化 q j k , p j k q_{jk},p_{jk} qjk,pjk的KL散度,使得前者逼近后者我们就可以使得模型学到一个更高置信度的分配方案,也就是:
l j C = K L [ p j ∣ ∣ q j ] = ∑ k = 1 K p j k l o g p j k q j k l^C_j=KL[p_j||q_j]=\sum_{k=1}^Kp_{jk}log \frac{p_{jk}}{q_{jk}} ljC=KL[pj∣∣qj]=k=1Kpjklogqjkpjk
将聚类损失和对抗损失结合一起来优化网络训练即可得到一个不错的聚类模型。文章后面也讨论了是否要将聚类和对抗结合在一起joint 训练还是先用对抗损失训练再用聚类损失训练,实验证明前者效果更好
 实际上这块聚类头的意思感觉上有点像semi-supervised learning里的pseduo-labeling策略,反倒和聚类没有那么的类似,具体可以去看看UDA以及SSL领域的的文章Unsupervised Domain Adaption (UDA)及domain shift介绍。虽然这个聚类头在很多深度聚类文章里都有应用,但总感觉不是很像聚类。

SwAV

 SwAV的motivation来自于聚类对比学习的第二个优点,即利用group层面的prototype来减小过多负例计算带来的开销。更精确来说,SwAV里其实完全去除了负例的概念,仅仅使用来正例来进行模型的训练,但正例训练的目标不再是简单的拉近正例对在特征空间中的距离,而是拉近二者在标签上的分布,用文章的表述来说,“从图像的一个增强版本中计算一个代码,再利用图像的其他增强版本来预测这个代码”,这里“代码”的物理含义就是图像从属于不同簇的软标签。

online clustering

 具体而言,首先从给定的一张图片得到 N N N张变换后的图片,然后对于某张图片,经特征提取后我们从特征相似性的角度可以计算其某一变换图 x t x_t xt从属于不同簇的概率分布情况:
p t k = e x p ( 1 τ z t T c k ) ∑ k ′ = 1 K e x p ( 1 τ z t T c k ′ ) p^{k}_t=\frac{exp(\frac{1}{\tau}z_t^Tc_k)}{\sum_{k'=1}^{K}exp(\frac{1}{\tau}z_t^Tc_k')} ptk=k=1Kexp(τ1ztTck)exp(τ1ztTck)
同时先前图像一个增强版本的代码则通过设计一个最优化分配方案得到,这一最优化分配方案要求同一个BATCH内的样本能够被较为均匀的的分配到不同的簇中,避免出现平凡解。假定输入BATCH的图像特征可以通过一个mapping Q Q Q转换到簇空间,这样我们的目的就变成了优化 Q Q Q来最大化特征和簇之间的距离:
m a x Q ∈ Q   T r ( Q T C T Z ) + ϵ H ( Q ) \underset{Q\in\mathbb{Q}}{max}\ Tr(Q^TC^TZ)+\epsilon H(Q) QQmax Tr(QTCTZ)+ϵH(Q)
其中 H ( Q ) = − ∑ i j Q i j l o g Q i j H(Q)=-\sum_{ij}Q_{ij}logQ_{ij} H(Q)=ijQijlogQij是熵正则项,而对于 Q Q Q的选取有一额外约束,要求BATCH中每个样本要被利用一次,每个簇也要被选中一次1,即:
Q = Q ∈ R + K × B ∣ Q l B = 1 K l K , Q l K = 1 B l B \mathbb{Q}={Q\in R_+^{K\times B}|Q\mathbf{l}_B=\frac{1}{K}\mathbf{l}_K,Q\mathbf{l}_K=\frac{1}{B}\mathbf{l}_B} Q=QR+K×BQlB=K1lK,QlK=B1lB
这一问题其实是最优化运输里常见的问题,可以通过sinkhron算法来解决2,解得Q的最优可行解为一迭代形式,即对如下式进行不断迭代直到收敛:
Q ∗ = D i a g ( u ) e x p ( C T Z ϵ ) D i a g ( v ) Q^*=Diag(u)exp(\frac{C^TZ}{\epsilon})Diag(v) Q=Diag(u)exp(ϵCTZ)Diag(v)
其中 D i a g ( u ) , D i a g ( v ) Diag(u),Diag(v) Diag(u),Diag(v)实际上就是在对矩阵进行行、列归一化。
 总体而言,SwAV的计算可以规范为如下几个步骤:

  1. 选取一张图片的两张变换后图片并进行特征提取得到 z t , z s z_t,z_s zt,zs
  2. 在BATCH层面内依据前述优化约束问题的解求得图像 x s x_s xs的code, q s q_s qs
  3. 计算簇和图像特征的相似性来计算 x t x_t xt的code, p t p_t pt
  4. 优化 q t q_t qt q s q_s qs间的距离(以 q s q_s qs为标签计算交叉熵): l ( z t , q s ) = − ∑ k q s k l o g ( p t k ) l(z_t,q_s)=-\sum_{k}q_s^klog(p_t^k) l(zt,qs)=kqsklog(ptk)
  5. 交换 x t , x s x_t,x_s xt,xs的code计算方式,重复2~4
     实际上笔者也没太明白为什么要用两种不同的方式来计算code,而且从计算方式来看,明显是决定通过优化方案计算得到的code更为靠谱,更适合作为一个pseduo label来指导聚类的进行。

Multi Crop

 除了online clustering之外,SwAV还提出了一种图像增强的方式,mutli crop,也就是从原图中截取一系列低分辨率的局部图像作为一种补充view。在此基础之上,SwAV隐性的将不同增强图进行了划分,2张全分辨率的corp信息更多,用于计算优化得到code;V张低分辨率crop信息少,只计算聚类crop,因此总的损失函数变为:
L ( z t 1 , z t 2 , . . . , z t v + 2 ) = ∑ i ∈ 1 , 2 ∑ v = 1 V + 2 l v ≠ i l ( z t v , q s ) L(z_{t1},z_{t2},...,z_{t_{v+2}})=\sum_{i\in{1,2}}\sum_{v=1}^{V+2}\mathbf{l}_{v\neq i}l(z_{tv},q_s) L(zt1,zt2,...,ztv+2)=i1,2v=1V+2lv=il(ztv,qs)

小结

 总得来看,SwAV的思路是很优秀的,巧妙的解决了传统聚类需要利用全部样本进行的不足,用一种类似于pseduo labeling的方式实现了每个BATCH内的聚类。但这里通过解决最优分配问题求得code存在一个很强的先验–同一个BATCH内的样本应当被均匀分配到clusetr中,即簇的大小应当是接近的,但在实际存在长尾分布问题的数据集中,这一assumption显然是不成立的,求得code能否再指导聚类也存疑。

PCL

 PCL的设计思路就是聚类对比学习的另一条方向,希望能够利用语义信息来帮助模型更好的进行特征提取。其目的就是利用聚类作为某种程度的正则项来保证样本在语义空间上的结构不被破坏,相似类的样本仍然相近。其基本框架仍然是MOCO,只是附加了聚类约束:
在这里插入图片描述

首先从EM算法入手,最大似然角度出发,优化的目的是最大化已观测样本的出现概率,再假定样本背后存在着隐变量(原型)的情况下,可以写成:
在这里插入图片描述

由jensen不等式可得其下界满足:
在这里插入图片描述

忽略掉常数项,我们最终的优化目标是:
在这里插入图片描述

E-step

 E-step中我们要对momentum encoder得到的图像特征向量进行k-means聚类,得到 k k k个聚类中心,并且记录下每个样本的“硬类别”也就是 p ( x i ; c i , θ ) p(x_i;c_i,\theta) p(xi;ci,θ)

M-step

 M-step中我们在E-step求得的条件分布基础之上优化最大似然函数:
在这里插入图片描述

给出两个强先验:

  1. 簇选取的先验分布是均匀的
    在这里插入图片描述

  2. 已知簇后,样本的条件分布是各项同性高斯分布;
    在这里插入图片描述

同时假定提取出的图像特征和聚类中心都已经经过了归一化,我们的最优解可以写做:
在这里插入图片描述

感性上理解仍然是类似于softmax函数,对于给定的图像 x i x_i xi以及由聚类得到的类别 s s s,我们希望最小化其交叉熵, j j j为其余类别。

 实践中为了得到不同层次的聚类效果,我们进行 M M M次不同簇数目的聚类,得到M个聚类正则项以保证图像语义空间的临近结构;将这一目标和infoCEloss结合以保证特征空间的局部平滑并促进聚类进程,我们可以得到如下损失函数ProtoNCE:
在这里插入图片描述

其中的 r r r为从memory bank里抽取的负样本数目, c j m c^m_j cjm为对应负样本在当前聚类策略下的聚类中心。

concentration estimation

 ProtoNCE中有一个温度项 ϕ \phi ϕ,用于衡量簇的紧密程度,值越小表面对应的簇越紧密,通过该簇中包含样本特征到聚类中心距离得到:
在这里插入图片描述

这一参数的加入使得簇的大小更加的平均,实验也证明了这一点。

小结

 其实感觉上这篇论文写的不是很连贯,聚类和最大似然的联系在哪解释的不是很清楚(可能是EM算法的原理), M-step里 p ( x i ; c i ) p(x_i;c_i) p(xi;ci)怎么得到的也没太懂,后续为什么随机采集 r r r个负样本对应的聚类中心也可以计算这个式子也不懂。只能大概理解算是给infoNCE加了个聚类的正则项来保留语义空间的结构。

有监督对比学习

 有监督对比学习在聚类对比学习的基础上再往前走了一步,由于我们可以显式的获取标签,那么直接使用标签来约束特征空间的结构,使得同类样本更为接近即可。一个较为简单的方式就是将同类样本也视作为正例,而不再和instance wise一般将除样本本身之外的instance都认为是负样本,这样就可以得到supervised contrastive loss:
在这里插入图片描述

其中 P ( i ) = { p ∈ A ( i ) ; y ^ p = y ^ i } P(i)={p\in A(i);\hat{y}_p=\hat{y}_i} P(i)=pA(i);y^p=y^i,也就是Batch内的同类样本,这两种形式的有监督对比损失区别在于log运算的顺序,考虑到log本身是个凹函数,这两个损失并不等价,由jensen不等式可知 L i n s u p ≤ l s u p o u t L_{in}^{sup}\leq l_{sup}^{out} Linsuplsupout,实验也证明了后者会是个更好的损失函数。
 这一篇论文其实改进不大,但在ImageNet上也算有用,涨了个点。

论文

Supporting Clustering with Contrastive Learning
Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
Prototypical Contrastive Learning of Unsupervised Representations
Supervised Contrastive Learning

参考


  1. 【研一小白论文精读】SwAV ↩︎

  2. Notes on Optimal Transport ↩︎

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

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

相关文章

CMake 安装与打包

书接上回,前面我们已经介绍了动态库、静态库的构建和使用,这里将介绍项目构建完成后的安装和打包发布 上一节: 动态库、静态库的构建与使用_爱钓鱼的歪猴的博客-CSDN博客 目录 一、安装 1、理解install命令 2、CMakeLists.txt 3、执行安装…

Class 08 - 数据的读取和保存 R语言中的管道(pip)功能

Class 08 - 数据的读取和保存 & R语言中的管道(pip)功能 数据的读取和保存data() - 加载R中的数据集readr 功能包介绍readr 包中读取文件的函数read_csv() 读取 .csv 文件 readxl 包读取Excel文件read_excel() - 读取Excel文件excel_sheets() - 读取…

windows平台的视频播放软件-potplayer

可以播放多种格式的视频,可以将大视频按需裁剪为多个指定的小视频, 裁剪方式:快捷键altc打开如下界面 从上往下的功能大致描述为: 1、选择裁剪得到的视频的存储路径 2、设置才见得到的视频文件的前缀名 3、这个功能很重要&#xf…

ChatGPT帮你写简历找工作

随着随着毕业时间的到来,应届生将要面临求职问题,根据官方的统计,2023届高校毕业生预计达1158万人,就业市场竞争激烈,无论是校园招聘,招聘会,线上招聘除了自身的准备和个人能力,都会…

优秀的前端开发框架

优秀的前端开发框架 1.Vue Vue2文档:Vue.js Vue3文档:Vue.js - 渐进式 JavaScript 框架 | Vue.js 用于构建用户界面的渐进式框架 Vue的核心库只关注视图层。可与elementUI配合Element - The worlds most popular Vue UI framework 2.React 原先的Fa…

动态库、静态库的构建与使用

一、理解动态库与静态库 静态、动态是指链接 所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:链接: 把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做…

Java面试知识点(全)-分布式和微服务-redis面试知识点

redis是什么 redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存、事件发布或订阅、高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串、哈希、列表、队列、集合结构直接存取,基于内存,可持久化。 为…

一个神奇的小工具,让URL地址都变成了“ooooooooo“

转换的逻辑有点像短链平台一样,只不过这个是将你的URL地址变的很长长长长,但是看着都是 ooooooooo,很好奇是如何实现的,所以查阅了源码,本文解读其核心实现逻辑,很有趣且巧妙的实现了这个功能。 发现一个很…

kaggle帕金森病进展预测大赛金牌方案分享

赛题背景 帕金森病 (PD) 是一种致残的脑部疾病,会影响运动、认知、睡眠和其他正常功能。不幸的是,目前没有治愈的方法 - 并且疾病会随着时间的推移而恶化。据估计,到2037年,美国将有1万人患有帕金森病&…

LeetCode 1080. Insufficient Nodes in Root to Leaf Paths【递归,二叉树】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

【Java|基础篇】详解static关键字和代码块

文章目录 1.前言2.static关键字2.1 static修饰成员变量2.2 static修饰成员方法 3. 代码块3.1 普通代码块3.2 静态代码块3.3 构造代码块 4.总结 1.前言 本文主要讲解static关键字以及代码块的执行顺序以及各部分代码块的作用. 2.static关键字 Java中的static关键字是用来修饰…

hive函数02

hive函数02 窗口函数 窗口函数(Window functions )也叫做开窗函数、OLAP函数,其最大特点是∶输入值是从SELECT语句的结果集中的一行或多行的“窗口”中获取的。 窗口函数可以简单地解释为类似于聚合函数的计算函数,但是通过GROUP BY子句组合…

jenkins 常见问题汇总

1、win11 节点(Error: Unable to access jarfile slave.jar) jenkins 默认cd 进入到设置的目录下面,如果不是C盘的话,直接cd 进入不了其他盘,所以,需要在命令前面,加参数进入到对应盘符。eg:E:…

pandas1

pandas pandas 的核心是:‘Series’、‘DataFrame’、Index’三个类型 1. 创建DataFrame对象 1.1 通过二维数组创建 scores np.random.randint(60,101,(5,3)) scoresarray([[ 91, 87, 87],[100, 80, 61],[ 76, 84, 80],[ 81, 97, 69],[ 67, 77, 65]]…

如何查看SSL证书的有效期?(中科三方)

SSL证书能够对数据传输进行加密处理,对网站的真实性进行核验,是网站提升数据安全能力的重要手段,现在已经有越来越多的网站开始安装SSL证书。但为了保障加密技术的快速更新,SSL证书的有效期逐渐缩短,而一旦SSL证书失效…

【腾讯云 Finops Crane 集训营】心得体会

【腾讯云 Finops Crane 集训营】心得体会 一直在关注技术社区的活动,希望看到更多的新技术,最近在逛 CSDN 的过程中,让我有机会参加了腾讯云的 Finops Crane 开源项目的第一季活动,从而深入了解了这个项目。Crane是一种云资源分析…

PMP常考知识点整理

1十大知识领域之项目整合管理 ❒ 变更控制流程(简化版) 书面记录变更请求→分析影响→提交CCB进行审批→批准或者拒绝→若批准,先修改计划(体现变更),再通知变更受影响相关方,最后再执行、追踪…

【PCIE720】 基于PCIe总线架构的高性能计算(HPC)硬件加速卡

板卡概述 PCIE720是一款基于PCI Express总线架构的高性能计算(HPC)硬件加速卡,板卡采用Xilinx的高性能28nm 7系列FPGA作为运算节点,在资源、接口以及时钟的优化,为高性能计算提供卓越的硬件加速性能。板卡一共具有5个F…

Linux---文件操作命令(find、which、read)

1. find命令 find [路径] [参数] 要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如 果未指定路径,则默认为当前目录。 可选参数,用于指定查找的条件,可…

day37_JQuery

今日内容 零、 复习昨日 一、JQuery 零、 复习昨日 正则 匹配,筛选字符串[0-9a-zA-ZA-z\d\w]*?{3}{4,}{5,10}^$reg.test(字符) jquery js封装的库,封装js操作,可以用来操作事件,dom,动画,ajax$("#id") $("element") $(".class")$("选择器…