自监督学习中的 Contrastive Learning 对比学习(持续更新)
本文介绍了对比学习以及最新的研究成果。
目录
- 1 介绍
- 2 对比学习
- 2.1 对比学习一般思路
- 3 主要论文
- 小介绍
- 3.1 MoCo
- 3.1.1 队列形式的字典
- 3.1.2 momentum update
1 介绍
监督学习近些年获得了巨大的成功,但是有如下的缺点:
1.人工标签相对数据来说本身是稀疏的,蕴含的信息不如数据内容丰富;
2.监督学习只能学到特定任务的知识,不是通用知识,一般难以直接迁移到其他任务中。
由于这些原因,自监督学习的发展被给予厚望。监督学习,无监督学习和自监督学习的区别
自监督学习(self-supervised learning)不需要人工标注的类别标签信息,直接利用数据本身作为监督信息,学习样本数据的特征表达,应用于下游的任务。自监督学习又可以分为对比学习(contrastive learning) 和 生成学习(generative learning) 两条主要的技术路线。对比学习的核心思想是讲正样本和负样本在特征空间对比,学习样本的特征表示,难点在于如何构造正负样本。
最近,诸如BERT和T5之类的自然语言处理模型已经表明,可以通过首先在一个大型的未标记数据集上进行预训练(即进行 pretext task上游任务),使得编码器能够提取数据中的特征,然后在一个较小的标记数据集上进行微调(下游任务,通常要在上游任务得到的编码器后添加几层全连接层组成完整的模型),从而用很少的类标签来获得良好的结果。
用MoCo里的定义就是:
A main purpose of unsupervised learning is to pre-train representations (i.e., features) that can be transferred to downstream tasks by fine-tuning.
也是因此,对比学习通常会和 表征学习(representation learning) 联系起来,表征学习的定义是:learning representations of the data that make it easier to extract useful information when building classifiers or other predictors
同样,对未标记的大型图像数据集进行预训练,有可能提高计算机视觉任务的性能。这点已经在对比表示学习的相关论文,例如Exemplar-CNN, Instance Discrimination, CPC, AMDIM, CMC, MoCo,获得了证实。对比学习训练得到的神经网络模型,可以被用作下游的任务,例如分类、分割、检测等。经过对比学习预训练得到的神经网络,已经具有很强的表达能力,一般只需要再用很少的有标签数据微调,就可以获得非常优秀的性能。总结而言,对比学习训练得到的模型可以当作预训练模型,后续仅需少量有标签的数据就可以训练出一个完整功能的模型。
用一个图来概括什么是自监督学习:
2 对比学习
对比学习首先学习未标记数据集上图像的通用表示形式,然后可以使用少量标记图像对其进行微调,以提升在给定任务(例如分类)的性能。简单地说,对比表示学习可以被认为是通过比较学习。相对来说,生成学习(generative learning)是学习某些(伪)标签的映射的判别模型然后重构输入样本。在对比学习中,通过在输入样本之间进行比较来学习表示。对比学习不是一次从单个数据样本中学习信号,而是通过在不同样本之间进行比较来学习。可以在“相似”输入的正对和“不同”输入的负对之间进行比较。以下图片引用。
对比学习通过同时最大化同一图像的不同变换视图(例如剪裁,翻转,颜色变换等)之间的一致性,以及最小化不同图像的变换视图之间的一致性来学习的。 简单来说,就是对比学习要做到相同的图像经过各类变换之后,依然能识别出是同一张图像,所以要最大化各类变换后图像的相似度(因为都是同一个图像得到的)。相反,如果是不同的图像(即使经过各种变换可能看起来会很类似),就要最小化它们之间的相似度。通过这样的对比训练,编码器(encoder)能学习到图像的更高层次的通用特征 (image-level representations),而不是像素级别的生成模型(pixel-level generation)。
2.1 对比学习一般思路
对比学习通过使用三个关键的元素(正样本、anchor、负样本的表征)来实现上述思想。为了创建一个正样本对,我们需要两个相似的样本,而当我们创建一个负样本对时,我们将使用第三个与两个正样本不相似的样本。
然而,在自监督学习任务中,我们并不知道每个样本的标签。因此,我们也无从知晓两张图像是否相似。
尽管如此,如果我们假设每张图片都从属于它自身的一个独有的类别,那么我们就可以提出各种构造这类三元组的方法(正负样本对)。这意味着,在一个包含 N 个样本的数据集中,我们现在拥有了 N 个标签!
接下来:为每一个样本赋予一个独特的类别
当我们知道了每一张图像的标签(类别)后,就可以使用数据增强技术(旋转 裁剪 加噪等)来生成这些三元组:
生成完正负样本对以后,就可以设计一个 encoder,作为特征提取器,来进行优化、训练。
3 主要论文
小介绍
对比学习广泛应用于图像领域的无监督表示学习,以MoCo(ICML2020)和SimCLR(2020)为代表,在ImageNet数据集上取得了显著的提升。「对比学习的核心在于如何构建正负样本集合」,图像领域一般通过旋转、裁剪等图片操作,而文本领域往往通过回译、字符插入删除等方法,这些方法依赖于领域经验,缺乏多样性和灵活性
3.1 MoCo
提出了 Momentum Contrast (MoCo) 机制,该机制通过匹配查询样本xqueryx^{query}xquery的编码值q和key样本编码值字典{k0,k1,k2,...}\{k_0,k_1,k_2,...\}{k0,k1,k2,...},并计算他们的对比损失(contrastive loss),来优化、训练一个 visual representation encoder 。字典以queue的形式建立,当前的 mini-batch 进入队列、最老的 mini-batch 出列,以 mini-batch 为最小单位。在训练时,keys样本被一个 encoder 编码,encoder又以 momentum update 的方式进行更新。这样的更新机制可以在学习视觉表征时实现一个足够大的、一致性(因为momentum的滑动平均机制)的字典。我认为当出现收敛问题时,我们可以采取这样的momentum 策略,把前几次的数据也加入计算,这样可以使得更新的方向具有一致性。
MoCo的两个创新点:队列形式的字典;momentum update。
3.1.1 队列形式的字典
MoCo的神奇之处在于设计了一个动态的字典,我们先来了解一下对比学习中的 Dictionary Look-up 机制:
值得注意的是:The networks fqf_qfq and fkf_kfk can be identical [29, 59, 63], partially shared [46, 36, 2], or different [56].
本文的假设是当 dictionary 足够大并且包含有足够的负样本时, encoder 可以提取到更佳的特征,并且在 encoder 进化的过程中,dictionary中的值应该尽量保持一致性(consistent)。
为什么要采用队列形式的dictionary?:Removing the oldest mini-batch can be beneficial, because its encoded keys are the most outdated and thus the least consistent with the newest ones.
3.1.2 momentum update
一个最简单的idea就是设置 fkf_kfk 和 fqf_qfq 的参数一样,也就是使用同一个编码器,但是在这样操作的过程中,发现效果很差,本文猜测是因为 encoder过快的变化造成了key表征的一致性 导致的。所以本文提出了如下的参数更新策略:
根据上式, θk\theta_kθk 更新地会更加缓和,有效地解决了原本的收敛问题。
MoCo算法torch版本的伪代码
# f_q, f_k: encoder networks for query and key
# queue: dictionary as a queue of K keys (CxK)
# m: momentum
# t: temperature
f_k.params = f_q.params # initialize
for x in loader: # load a minibatch x with N samplesx_q = aug(x) # a randomly augmented versionx_k = aug(x) # another randomly augmented versionq = f_q.forward(x_q) # queries: NxCk = f_k.forward(x_k) # keys: NxCk = k.detach() # no gradient to keys# positive logits: Nx1l_pos = bmm(q.view(N,1,C), k.view(N,C,1))# negative logits: NxKl_neg = mm(q.view(N,C), queue.view(C,K))# logits: Nx(1+K)logits = cat([l_pos, l_neg], dim=1)# contrastive loss, Eqn.(1)labels = zeros(N) # positives are the 0-thloss = CrossEntropyLoss(logits/t, labels) # 这里的交叉熵是指原文中定义的 L_q,而不是我们所熟悉的交叉熵# SGD update: query networkloss.backward()update(f_q.params)# momentum update: key networkf_k.params = m*f_k.params+(1-m)*f_q.params# update dictionaryenqueue(queue, k) # enqueue the current minibatchdequeue(queue) # dequeue the earliest minibatch
# 注:bmm: batch matrix multiplication; mm: matrix multiplication; cat: concatenation.
参考:
https://blog.csdn.net/xxxxxxxxxx13/article/details/110820373
https://www.jianshu.com/p/f297528191c8
对比学习,写的很详细基础:
https://baijiahao.baidu.com/s?id=1679009620846462836&wfr=spider&for=pc
自监督学习中的 Contrastive Learning 对比学习(持续更新)相关推荐
- CIKM'21 | 谷歌:推荐中的自监督对比学习
作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP 1.对比学习到底是啥 对于最近很火的"对比学习",许多人把它和我们之前经常用的向量化召回混为一谈 ...
- IRS中波束赋形设计源代码之AO算法学习(持续更新,多多交流)
IRS中波束赋形设计源代码之AO算法学习(持续更新,多多交流) 论文:Weighted Sum-Rate Maximization for Reconfigurable Intelligent Sur ...
- Deep Learning源代码收集-持续更新…
Deep Learning源代码收集-持续更新- zouxy09@qq.com http://blog.csdn.net/zouxy09 收集了一些Deep Learning的源代码.主要是Matla ...
- cas 部署过程中遇到的一些问题(持续更新)
cas 部署过程中遇到的一些问题(持续更新) 1.CertificateException 有时候客户端和服务端都部署好了之后,回调回来会报异常 javax.net.ssl.SSLHandshakeE ...
- 推荐系统中不得不学的对比学习(Contrastive Learning)方法
作者 | 对白 出品 | 公众号:对白的算法屋 大家好,我是对白. 今天我们来聊一聊推荐系统中不得不学的Contrastive Learning方法,近年来Contrastive Learning在C ...
- ICCV2021 比MoCo更通用的对比学习范式,中科大MSRA提出对比学习新方法MaskCo
关注公众号,发现CV技术之美 今日分享 ICCV2021论文『Self-Supervised Visual Representations Learning by Contrastive Mask P ...
- CVPR2022:计算机视觉中长尾数据平衡对比学习
点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 [前言] 现实中的数据通常存在长尾分布,其中一些类别占据数据集的大部分,而大多数稀有样本包含的数量有限,使用交 ...
- 无监督学习中的无监督特征学习、聚类和密度估计
无监督学习概述 无监督学习(Unsupervised Learning)是指从无标签的数据中学习出一些有用的模式,无监督学习一般直接从原始数据进行学习,不借助人工标签和反馈等信息.典型的无监督学习问题 ...
- Supervised Contrastive Learning(学习笔记)
Supervised Contrastive Learning NeurlPS2020 原文链接: https://arxiv.org/pdf/2004.11362v4.pdf b站讲解视频: htt ...
- 图学习中的链路预测任务(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 本文将对图学习中的链路预测任务进行系统性的介绍. 最近更新时间:2022.11.29 最早更新时间:2022.10.31 文章目录 1. 问题定义 2. 研究方法 ...
最新文章
- DGbroker故障切换示例
- 神经网络风格迁移更新篇
- [导入]8.3赛车频道活动
- js批量向html容器内的元素赋值
- 【Zookeeper】源码分析之Watcher机制(一)
- promise.prototype.catch()
- 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) D】Count The Bits【数位DP】
- ShardedJedis的使用
- 新能源汽车,不需要“共享充电宝”
- 二年级上册计算题_二年级数学脱式计算题600道
- Excel中数字、数值和文本的区别
- Apache 防止恶意解析
- 4. struct 结构体
- NT151应用案例:西门子PLC S7-1200与派克ACR9000的通信(Part 3)
- html调整上下的间距,html上下间距怎么调
- 水库大坝安全监测监控系统平台axure分析+辽阳市水库大坝安全检测平台+志豪未来科技有限公司+陈志豪
- 佛说:人就是苦今生修来生
- verycd没有的资源有很多方法下载
- uniapp 条件编译的使用
- C语言中数据放在哪里