MoCo 与 CLIP

MoCo与CLIP都利用了对比学习。只不过CLIP是多模态的。本文对这两个模型进行学习。

0 对比学习

1)对比学习2019年到现在机器学习领域最炙手可热的领域之一
2)对比学习就是对比着学习,不需要知道类别,只需要知道上面两张图片类似,下面这张图片与上面的两张不类似。更明白一点就是:对比学习希望类似的图片在特征空间里靠近,不类似的图片在特征空间里远离。就学到了很好的特征。
在这里插入图片描述

3)对比学习虽然不需要知道这两张图片的标签信息,但是需要知道那些图片是类似的,哪些是不类似的,才能去训练,为什么对比学习被认为是无监督学习?在视觉领域,大家通过一些巧妙的代理任务,也就是pretext task,从而人为的定一些规则,这些规则可以用来定义哪些图片是相似的哪些图片是不相似的,从而可以提供一个监督信号去训练模型。这就是所谓的自监督训练。
在这里插入图片描述
代理任务举例:最广为应用的一类代理任务:instance discrimination:有个一个没有标注的数据集: X 1 , X 2 , . . . , X N {X_1,X_2,...,X_N} X1,X2,...,XN.要定义哪些图片是相似的,哪些图片不是相似的。instance discrimination是这么做的,如果我们从数据集里随机挑选一张图片 X i X_i Xi,在这张图片上做随机裁剪: X i 1 X_i^1 Xi1 X i 2 X_i^2 Xi2,裁剪之后还做了很多数据增广。把裁剪和数据增广都叫做transformation。用 T 1 T_1 T1 T 2 T_2 T2分别表示得到 X i 1 X_i^1 Xi1 X i 2 X_i^2 Xi2的transformation。因为都是从 X i X_i Xi经过某些变化得到的,所以语义信息应该没有变化。 X i 1 X_i^1 Xi1 X i 2 X_i^2 Xi2就被称作是正样本。instance discrimination认为数据集里剩下的所有样本都是与 X i X_i Xi不相似的,都是负样本。这样就有了一个定义什么是正样本以及什么是负样本的规则
接下来就是我们通过一个模型得到一些特征,然后在这些特征上使用一些对比学习的目标函数就可以了。比如说NCE loss
以上框架就是对比学习常用的一种方式了。对比学习最大的优势就是很灵活,你可以制定各种各样的正负样本的定义方式。只要找到一种就够了,剩下的都是标准的操作方式。 举例:1)视频领域,同一个视频里的任意两帧都可以认为是正样本,不同视频的帧认为是负样本。2)nlp领域,simCSE这篇论文,就是把句子扔给模型,但是做两次forward,每次forward使用不同的dropout,这样得到的两个特征认为是正样本。其他所有句子的特征都是负样本。3)CMC这篇论文,一个物体的不同视角也可以作为是正样本,比如一个物体的正面和背面。一个物体的RGB图像和深度图像,这些都可以作为不同形式的正样本。很灵活,任何领域都能用,后来自然而然扩展到了多模态领域。也就造就了OPEN AI的CLIP模型

1 MoCo

在这里插入图片描述
x q u e r y x^{query} xquery作为query的图片, x 0 k e y , x 1 k e y , . . . x_0^{key},x_1^{key},... x0key,x1key,...作为key的图片。这些图片通过编码器得到一些图片的特征。然后q与 k 0 , k 1 , . . . k_0,k_1,... k0,k1,...去做一些对比。然后用对比学习的loss去训练整个模型。和之前的不同指之处在于queue和momentum encoder。也就是MoCo这篇论文的贡献所在

这样做的原因是MoCo想构架又大又一致的字典。

1.1 为什么要用队列来构建字典(又大)

主要是受限于显卡的内存。如果这里的字典太大,也就是要输入很多很多的图片,显卡的内存是吃不消的。我们需要想一个办法让字典的大小和前向计算的bachisize的大小剥离开来。解决办法就是用队列这种数据结构来解决这项任务。具体来说,就是这个队列可以很大,但是每次更新这个队列是一点一点进行的。用一个很小的bachisize的时候,最新的batch抽取的特征入队,最老的batch抽取的特征离队。这样队列可以很大,但是mini-batch size可以很小。

1.2 momentum encoder(又一致)

在这里插入图片描述
θ k \theta_k θk刚开始是由 θ q \theta_q θq来初始化的,在模型训练的过程中,如果我们选择了一个很大的动量m,那么每次更新就会很慢,不跟跟着 θ q \theta_q θq去做很大的改变。所以保证了这个字典里所有的key都是由相似的编码器抽取得到的。尽最大可能的保持了他们之间的一致性。

1.3 选用什么代理任务去充当自监督信号,从而进行模型的训练

MoCo只是建立中间模型的一个方式,只是为对比学习提供了一个动态的字典。具体选择什么样的代理任务(正负样本定义方式)去做自监督学习呢?Moco是很灵活的。可以和很多代理任务合起来用。本片论文选择了一种比较简单的代理任务:instance discrimination。如果一个query和一个key是同一个图片不同的视角(比如不同的随机裁剪),那么就说这个query和这个key能匹配的上。也就是能在这个动态字典里查找到这个query对应的key。在imagenet数据集做通用的linear classification与之前最好的方法性能有竞争力。

1.4 损失函数

一个假设:字典里只有一个key是与query是配对的。记为 k + k_+ k+
有了正负样本的定义,接下来要定义损失函数。损失函数需要满足:当q与 k + k_+ k+很相似且其他负样本不相似的失手要很小,否则要很大。本文损失函数用的是InfoNCE。NCE(noise-contrastive estimation)

在这里插入图片描述
InfoNCE其实就是基于softmax损失函数来定义的。直观的理解可以认为就是做K+1的分类,然后想把q分到 k + k_+ k+这个类别。

1.5 伪代码

在这里插入图片描述

2 CLIP

在这里插入图片描述

CLIP核心实现的伪代码:

1)分别输入图片([n,h,w,c])和文本([n,l],l是指序列长度),然后送入到各自的encoder提取特征,image encoder可以是ResNet也可以是Vision Transformer,text encoder可以是Text Transformer
2)得到对应的特征之后,再经过一个投射层(即W_i和W_t),投射层的意义是学习如何从单模态变成多模态,投射完之后再做l2 norm,就得到了最终的用来对比的特征I_e和T_e,现在有n个图像的特征,和n个文本的特征,
3)计算consine similarity,算的相似度就是最后要分类的logits,
4)logits和ground truth做交叉熵loss,正样本是对角线上的元素,logits的维度是[n,n],ground truth label是np.arange(n),算两个loss,一个是image的,一个是text的,最后把两个loss加起来就平均。这个操作在对比学习中是很常见的,都是用的这种对称式的目标函数。

在这里插入图片描述

1.预训练

模型输入:图片(n)和文字(n)的配对,分别映射到n个特征上,CLIP就是在这n×n个特征上做对比学习
正样本:配对的图片文本对(对角线),n个
负样本: n 2 − n n^2-n n2n个(矩阵里除了对角线的部分)
有了正负样本,模型就可以通过对比学习的方式去训练了,不需要任何手工标注。这种无监督的训练方式,是需要大量的训练数据的。

2.从标签文本创建数据集分类器

预训练之后只能得到文本和图片的特征,没有分类头,没有分类头怎么推理?——prompt template。
比如对于ImageNet的1000个类,变成"A photo of a {object}" 的1000个句子,这1000个句子通过之前预训练好的文本编码器,得到1000个文本的特征。
直接用类别单词去抽取文本特征也可以,为什么要有这么一个操作?因为模型预训练图片看到的是句子,在推理的时候如果突然把所有文本变成单词,跟训练不太一样,会影响效果
3.推理:用于zero-shot分类

推理的时候 对于任何一张照片,扔给图片编码器 拿到图片特征之后 和所有的文本特征做cosine similirity,最后哪个最相似,就把这个文本特征对应的句子挑出来

参考:
【1】https://blog.csdn.net/weixin_43508499/article/details/131141887

【2】https://zhuanlan.zhihu.com/p/631190729

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值