欢迎光临散文网 会员登陆 & 注册

Clip

2023-03-12 19:35 作者:flow___  | 我要投稿

文章主要卖点:使用图像-文本 pair的形式,训练出一个大的模型,在zero-shot的条件下能达到与之前监督式训练的水平,同时还能摆脱categorical label的限制,模型的泛化性和实用性要比之前对特定数据集训练的模型强得多。在30个不同类型的视觉任务上使用CLIP进行了基准测试,并展示了CLIP强大的迁移能力 —— 在很多下游任务上不需要任何额外的数据也能比拟supervised的模型。

原文链接:https://arxiv.org/pdf/2103.00020.pdf

预训练方法:

预训练过程

这里先看左图,作者在网上搜罗了4亿图像-文本 pair形式的数据对(如上图所示的 狗图片 - "pepper the aussie pup")(当然是经过清理过后的数据配对,这也是CLIP模型能运作的很好的原因之一 —— 数据量够大,数据质量够高)。然后将一个batch里的文本通过Text Encoder,同时将对应配对的batch里的图片通过Image Encoderk,分别得到N个特征对(这里的编码器可以相对自由的选择,resnet-50,ViT等等模型)。

后面在这样的特征对上去使用对比学习,这里就需要引入监督信号,也就是对比学习需要的"规则",这里使用的规则是:正样本——图片与对应的文本是描述的同一个东西,则这样的一个"配对"就是正样本,反之不配对的话,则是负样本(文章中并不是只使用了2分类,而是视一个batch有多大,则记作多少类,label = arange(N),个人认为这里也可以使用不一样的打标签的方式,moco中则是使用 1,0,0,0...这样的2类去做的对比学习)。上图使用的矩阵的样子来表示,可以看到在这个正方形的矩阵中,对角线上的就是正样本对,且其他的类的配对都是负样本。

这里分好规则后,做好labels,就去算一下他们的cosine similarities,也就可以得到logits 。那么在构建一个合适的loss就可以开始训练啦。

下面是原文中的伪代码,也是很清晰的。

CLIP预训练的伪代码

这里的loss做了两次,意味着做了一次文本到标注的loss,做了一次图像到标注的差距,也就是对网络进行了两次更新操作,这是对比学习中常用的操作,不过这里我对对比学习的了解不够深刻,还需要再想一下。

预训练的部分大致思路是这样,接下来看一下在不同任务的使用上,有一些值得注意的地方。因为CLIP是一个预训练模型,没有任何的分类头或者特征图,供下游任务直接拿去使用,这里作者使用了一个很有意思的操作 —— prompt template。 这里以下图的1000类的Image的分类任务为例,先将这1000个词扩充成1000个句子,并通过text encoder得到1000个文本特征向量,然后将需要分类的图片通过图片编码器得到的一个图像的向量,与这1000个文本特征做一个similarities,选择相似度最高的作为分类得到的目标。

这里可以表现CLIP最吸引人的一个特性,它可以摆脱categorical label的限制,例如Image的1000种分类任务中没有“三轮车”这个类,但是如果你在此时将1000类添加一个“三轮车”,使其变为1001类,同时你在下面使用一张三轮车的图片去进行分类查询,此时CLIP仍然有极大的概率正确将其分类到“三轮车”的类中,这也是其能在zero-shot任务中大杀四方的原因。

CLIP用于zero-shot的分类任务

上面训练的部分还有很多细节,但是因为暂时不做实验,也没有复现的需求,大致学习思想即可。

这里简单介绍CLIP的思想,后续有非常多基于CLIP的新颖任务,后面会再说。

prompt engineering and emsemble: 文本的引导作用,在将单词拓展成CLIP需要的句子时,使用的工程技巧,是一个不错的方向。



Clip的评论 (共 条)

分享到微博请遵守国家法律