CLIP
感谢您的观看,希望能给您带来一点帮助。
😊😆
介绍
CLIP的迁移学习能力很强, 他预训练好的模型能够在任意一个视觉分类的数据集上取得不错的效果,而且最重要的是CLIP是“Zero-Shot”的。意思就是他完全没有在这些数据集上进行训练,就能得到很好的结果,作者在超过30多个数据集上做了测试证明了CLIP的有效性。
CLIP在不使用ImageNet的训练集的情况下,也就是不使用任何一张那128万张图片训练的情况下,直接Zero-Shot做推理,就可以获得和之前有监督训练好的ResNet50取得同样的效果。
讲解
我们先看看图1,
首先,CLIP是如何进行预训练的呢?
通过自然语言处理来的一些监督信号,我们可以去训练一个迁移效果很好的视觉模型,所以很自然可以想到这是一个牵扯文字、图片的一个多模态的工作。
那么CLIP是如何利用自然语言处理来的这个监督信号呢?
在训练的过程中,模型的输入是一个图片和文字的配对,比如上述图片画的是一只狗,文字描述的就是:澳洲小狗佩珀,图片通过一个图片的编码器,从而得到了一些特征,编码器既可以是个ResNet,也可以是Vision Transformer,对于句子来说,也会通过一个文本的编码器,从而得到一些文本的特征,假设每个Batch里面都有n个这样的图片文本对,也就是这里有n张图片,又有n个句子,那我们就会得到n个这种图片的特征,还有n个这样文本的特征,然后CLIP就是在这些特征上去做对比学习,配对的图片-文本对就是一个正样本,因为描述的是同一个东西,所以特征矩阵中沿着对角线方向的都是正样本,而特征矩阵中不是对角线上的元素就都是负样本了,也就是有n个正样本,有 n 2 − n n^{2} - n n2−n个负样本,有了正负样本后,模型就可以通过对比学习的方式去进行训练,完全不需要任何手工的标注。而对于这种无监督的预训练方式,比如说对比学习,他是需要大量的数据的,所以OpenAI还专门去收集了这么一个数据集,他里面有4亿个图片和文本的这个配对,而且这个数据,应该是清理的非常好的,质量是非常高,这也是为什么CLIP这个预训练模型之所以能这么强大的主要原因之一。
CLIP如何去做Zero-Shot的推理?
这部分非常有意思,因为CLIP这个模型经过预训练之后呢,只能去得到这些视觉上和文本上的这些特征,他并没有在任何的分类任务上去做继续的这种微调或训练,所以说是没有这个分类头的,那没有这个分类头要怎么去做推理呢?作者就想到一种巧妙的,利用自然语言的一种方法,也就是叫prompt template,我们这里先拿ImageNet做个例子,CLIP就是先把ImageNet里这1000类变成一个句子,比如说把一个单词“飞机”变成这么一个句子:“这是一张飞机的图片”。像ImageNet这里有1000个类,那这里就生成了1000个句子。然后这1000个句子通过之前的预训练好的文本编码器,就会得到1000个这个文本的特征。
为什么要做prompt template呢?
其实直接用这里的单词去抽取文本的特征也是可以的,但是呢,因为你在模型预训练的时候,你的图片每次看到的基本都是一个句子,如果在推理的时候,突然把所有的文本都变成了一个单词,那么就跟你在训练的时候看到的这个文本就不太一样了,所以效果就会稍有下降。在推理的时候,无论来了任何一张图片,我只要把这个照片扔给图片的编码器,得到图片特征之后呢,我就拿这个图片的特征去跟所有的文本的特征去做余弦相似度比较。
CLIP最吸引人的地方?
因为他彻底摆脱了categorical label这个限制,也就是说无论是在训练的时候,还是在推理的时候,我都不需要提前订好这个标签的列表,任意给我一张照片,我都可以给模型去喂这种文本-句子,从而知道这张图片里到底有没有我感兴趣的物体。
而且CLIP不仅能识别物体,由于他真的把视觉这个语义和文字的语义联系到了一起,所以他学到的这个特征,语义性非常强,迁移的效果也非常好,在OpenAI的这个官网上,也就是CLIP这个官方博客上,作者还举例:
从侧面说明了,因为和自然语言处理的结合,所以导致CLIP学出来的这个视觉特征和我们用语言所描述的某个物体已经产生了强烈的联系,在domain变化的这么剧烈的情况下,依旧能够识别出这张图片画的是什么,准确的完成分类任务。