clip
clip是一个迁移学习效果很好的zero-shot的多模态大模型,他在训练的时候使用图文对的方式,让模型可以在推理的时候即使没见过这个图文对也一样可以将他们匹配出来。
训练
图1 clip预训练
从图1可以看到,模型的输入是文字和图片的配对,clip采用的是对比学习的方式进行预训练的,在一组数据中,仅有一个图文对是匹配的,我们称为正样本,其他的都是负样本,openai为了训练clip是专门做了一个有4亿个数据的数据集。
推理
图2 clip推理
在推理的时候,我们可以自行给定一组标签,这里clip打破了固定类别标签范式,然后将标签写成一个句子(prompt),然后通过encode提取特征,然后图片通过encode提取特征,最后计算图片和标签中的哪个特征最相似,那么这个图片和标签就匹配上了。
伪代码
图3 训练伪代码
其实很简洁明了,图片和文字分别进入各自的encode里面提取特征,然后经过投射层学习一下单模态到多模态的过程(图片和文字的特征embedding到同一个特征空间),好人做l2归一化,然后计算余弦相似度,这边label就是1234567...因为上面说过图文对的正样本只会出现在对角线的地方,然后计算图片的loss和文本的loss,相加除以2就是最终loss了。
prompt engineering和ensemble
prompt engineering就是给出一个提示的模板,比如this is a {label},那这样的话就会减少很多的词的多义性(那个地方只能是名词),又或者如果我们已经知道要分类的数据集是什么类别,比如宠物,我们可以这样设计this is a {label},a type of pet,那这样的话boxer就不会被理解成拳击手了。prompt ensemble就是可以多设计几种prompt的方式,然后做多次推理,并且将结果综合起来。
局限性
CLIP的zero-shot性能虽然和有监督的ResNet50相当,但是还不是SOTA,作者估计要达到SOTA的效果,CLIP还需要增加1000x的计算量,这是难以想象的;
CLIP的zero-shot在某些数据集上表现较差,如细粒度分类,抽象任务等;
CLIP在自然分布漂移上表现鲁棒,但是依然存在域外泛化问题,即如果测试数据集的分布和训练集相差较大,CLIP会表现较差;
CLIP并没有解决深度学习的数据效率低下难题,训练CLIP需要大量的数据