本文主要是本人在看朱毅讲CLIP中遇到的一些疑问,以及我自己寻找的疑问的答案。有一些问题网上的其他人都已经给出了很完美的答案了,我就作为一个收集,给出链接。
一、CLIP的大概流程
1.1 训练流程(上图中的左边的图所示)
训练过程中模型的输入是一个图片文字的配对,假如一个训练batch中有N个这样的配对,则经过图片编码器(可以是ResNet或ViT)和文本编码器(CBOW、Text Transformer)得到N个图片的特征(图中绿色的部分, I 1 , I 2 I_1,I_2 I1,I2等)和文本的特征,CLIP在这些特征上进行对比学习,对比学习只需要一个正样本和负样本的定义,正样本是配对的图片和文字对,所以矩阵对角线上的都是正样本,其他的都是负样本,有N个正样本和 n 2 − n n^2-n n2−n个负样本。完全不需要手工的标注
1.2 分类流程(上图中的右边的图所示)
因为CLIP经过预训练以后,只能得到视觉上和文本上的特征,没有继续的在任何的分类任务上去做训练和微调,所以没有分类头,那如果没有分类头怎么去做推理呢?作者这里想出来一个巧妙的利用自然语言的一种方法,也就是prompt template。举一个image net的例子:
- CLIP先把image net里这一千个类,比如说图片里的plane、car、dog等变成一个句子(例如A photo of a {object}),就是用类别去替代这里的这个object,比方说得到一个A photo of a car句子。而且从单词到句子也是很有讲究的,文章中也进行了探讨
- image net有1000个类,那其实就生成了1000个句子,经过预训练好的文本编码器对1000个句子进行编码得到1000个文本特征
- 具体推理的时候,给出一张图像,只要把这张图像扔给图像编码器,得到了这个图像特征之后,使用图片的特征去跟所有的文本的特征去计算余弦相似度,最后图像特征跟哪个文本特征最相似。我们就把这个文本特征所对应的句子挑出来,从而完成了分类这个任务
1.3 为什么要进行prompt template这个操作呢?
其实直接用这里的这些单词去抽取这种文本的特征也是可以的,但是因为在模型预训练的时候,每个图片配对的文本基本都是一个句子,如果在推理的时候突然把所有的这个文本都变成了单词,这样就跟训练的时候的文本就不太一样了,模型的效果会下降。
二、如何在多个GPU上训练一个超大的模型
视频中提到,由于CLIP这个模型非常大,加上数据集也非常大,所以CLIP在训练的时候用了很多技巧来节省内存和减少训练时间。故朱毅在视频中给出了一个博客说如何多GPU训练模型
三、CLIP模型的伪代码实现
图中是CLIP实现的伪代码,关于伪代码实现中的一些细节,博客中讲的很详细,可以看看。
总结
这篇CLIP文章主要是听着课来看的,对于很多具体实现视频中没有讲,我也没有自己去看,因为我主要是进行汇报所以来看的视频。而且文章总共有48页,仅仅是为了汇报去专门读48页的原文我觉得是不合理的,所以我还是浅显的看一下。