评价:工作clip呢自从去年2月底提出就立马火爆全场,他的方法出奇的简单,但是效果呢又出奇的好,很多结果和结论呢都让人瞠目结舌。比如呢作者说clip的这个迁移学习能力是非常强的,它预训好的这个模型能够在任意一个视觉分类的这个数据集上,取得不错的效果,而且最重要的是它是zero shot的,意思就是说他完全没有在这些数据集上去做训练,就能得到这么高的效果,作者这里呢做了超级多的实验,他们在超过30个数据集上啊去做了这个测试,涵盖的面啊也非常广,包括了这个 OCR,包括了这个视频动作检测,还有就是坐标定位啊和许多这个细分类任务,在所有这些结果之中,其中最炸裂的一条就是在imagenet上的这个结果了。那 Clip呢在不使用ImageNet的训练集的情况下,也就是不使用任何一张的128万张图片训练的情况下,直接zero short做推理就能获得和之前有监督训练好的这个 res50取得同样的效果。这在clip这片工作出来之前,很多人都认为这是不可能的事情。
接下来呢我还准备讲一些clip的这个后续工作,以及一些非常好玩的基于clip的应用,但是呢我感觉可能得先讲一下clip到底是什么,到底它是怎么去做这个 zero shot的推理的,才能让大家知道clip为什么能这么玩。那我们现在直接就来看文章的图一,也就是clip的这个模型总览图,我们这里呢就是先大概说一下它的流程,具体的细节呢后面还会讲到:
我们通过这个题目啊,也可以大概猜到一二,题目的意思是说呢通过这个自然语言处理这边来的一些监督信号,我们可以去训练一个可以迁移效果很好的视觉模型,所以很自然的,这是一个牵扯文字图片的一个多模态的工作,那它是怎么去利用这个自然语言处理来的这个监督信号?
那其实在训练的过程中,模型的输入是一个图片和文字的配对,比如这里图片里画的是一只狗,配对的文字呢也是说是一只小狗,然后图片呢就通过了一个图片的编码器,从而得到了一些特征,那这里的编码器呢既可以是个resnet,也可以是个vision transformer。那对于这个句子来说,它也会通过一个文本的编码器,从而得到一些文本的特征。那假设说我现在每个training batch里都有n个这样的图片文本,对,也就是说这里有n张图片,这里有n个句子,那我们就会得到n个这种图片的特征,还有n个这样文本的特征,然后clip呢就是在这些特征上去做对比学习,
那我们之前也提过啊对比学习非常的灵活,它就需要什么?它只需要你一个正样本和负样本的定义,其他呢都是正常套路,那这里什么是正样本,什么是负样本?那其实再明确不过了,那这样配对的一个图片文本对就是一个正样本,因为它描述的呢是一个东西,所以说这个特征矩阵里啊沿着这个对角线方向上的呢都是正样本,因为I1-T1,I2-T2这些本身就都是配对的,那剩下这个矩阵里所有不是对角线上的元素就都是负样本了。也就是说这里呢我们是有n个这个正样本,然后有n方减n个负样本,那一旦有了正负样本,那模型就可以通过对比学习的方式去训练起来了,完全不需要任何手工的标注,但当然了对于这种无监督的预训练方式,比如说对比学习它是需要大量的数据的,所以说呢 Open AI还专门去收集了这么一个数据集,它里面呢有4亿个这个图片和文本配对,而且这个数据啊应该是清理得非常好的,质量应该非常高。这也是clip这个预训练模型为什么能这么强大的主要原因之一
那接下来就是说clip如何去做zero shoot的推理了,这部分呢是非常有意思的,因为clip的这个模型经过预训练之后,它其实只能去得到一些这些视觉上和文本上的这些特征,他并没有在任何分类的任务上去做继续的这种训练或者微调,所以说它是没有这么一个分类头的,那如果没有分类头怎么去做推理?作者这里呢就想出来一个巧妙的啊,利用自然语言的一种方法,也就是叫prompt template。我们这里先拿image net做个例子, clip呢就是先把image net里这1000个类,比如说这里的这个飞机、啊汽车、啊狗啊变成这么一个句子,也就是用这里的这些物体呢去替代这里的这个 object,也就是说啊把一个单词,比如说飞机变成了这么一个句子,这是一张飞机的图片,那像image net有1000个类,那其实这里呢就生成了1000个句子,然后这1000个句子通过我们之前预训练好的这个文本编码器,就会得到1000个这个文本的特征。
那我们为什么要做这么一步prompt template呢?其实直接用这里的这些单词啊,去抽取这种文本的特征也是可以的,但是呢因为你在模型预训练的时候,你的图片呢每次看到的基本都是一个句子,如果你在推理的时候,突然把所有的这个文本呢都变成了一个单词,那这样就跟你在训练的时候看到的这个文本啊就不太一样了,所以效果就会稍有下降,而且怎么变成这边这个句子也是很有讲究的,所以clip这篇论文后面呢还提出了prompt engineering, prompt ensemble这两种方式去进一步的提高这个模型的准确率,而不需要重新训练这个模型。然后在推理的时候,不论你这时候来了任何一张照片,我只要把这张照片扔给这个图片的编码器,得到了这个图片特征之后,我就去拿这个图片的特征去跟所有的这些文本的特征,去做这个cosine similarity就去算这么一个相似性,那最后呢这个图像的特征跟这里的哪个文本特征最相似,我们就把这个文本特征所对应的那个句子挑出来,从而完成了分类这个任务,也就是说这张图片里有狗,这个物体是不是非常的巧妙,
而且呢其实当clip真正使用的时候,这里的这些标签啊其实还是可以改的,它不光是imagenet这1000个类,你可以换成任何的单词,这里的图片呢也不需要是imagenet里的图片,它也可以是任何的图片,然后你依旧可以通过这种算相似度的方式去判断出这张图片里到底还有哪些物体,比如说啊你这里给一张三轮车的照片,然后你在上面的这个类别里呢也加上三轮车这个类别,那通过clip的这种zero shot的推理的方式,很有可能这张图片就能正确的被分类成三轮车。
但如果像之前那种严格按照1000类去训练的这个分类头来说的话,那我们的模型啊永远都不会判断出这张图片是三轮车,最多也就是把它判断成是车或者是自行车这种,因为在Imagenet这1000个类里的类别,而且跟三轮车最接近的类,这个性质呢才是clip的强大之处,也是clip这个模型最吸引人的地方,因为他彻底摆脱了categorical label的这个限制,也就是说不论是在训练的时候,还是在推理的时候,我都不需要有这么一个提前定好一个标签的这个列表了,任意给我一张照片,我都可以通过给模型去喂这种不同的文本句子,从而知道这张图片里到底有没有我感兴趣的物体,而且呢 clip不光是能识别新的物体,由于他真的把这个视觉的这个语义和文字的语义联系到了一起,所以他学到这个特征啊语义性非常强,迁移的效果呢也非常的好。在open I的这个官网上,也就是clip的这个官方博客上,作者还举了这么个例子,就是说Imagenet这个数据集上之前训练的这个resnet101呢是76.2的准确率,然后对于clip训练出来的这个 VIT large呢也是76.2的准确率,这两个的准确率呢是一样的。
但是当我们换个数据集,比如说换到因为是Imagenet V2或者image net rendition objectnet imagenet sketch或者imagenet adversary之后,我们就会发现之前这种严格按照1000类分类头训练出来的模型,它的这个准确率呢下降得非常快。再换到这种素描画的时候,或者这种对抗性样本的时候,准确度直接从70多啊掉到20多,甚至到对抗性的这种2.7,基本上就已经是在随机猜了,迁移的效果是惨不忍睹,但是对于clip训练出来的模型来说,它的这个效果呢始终都非常的高,没有什么下降,这也就从侧面说明了因为和自然语言处理的结合,所以导致clip学出来的这个视觉特征呢和我们用语言所描述的某个物体呢已经产生了强烈的联系。
比如说这里的香蕉,不论是在这种自然图像里出现的香蕉,还是这种动漫里的香蕉,还是说这种素描的香蕉,或者是加过对抗性样本的香蕉,clip训练出来的模型呢都知道它对应的是香蕉这个单词,所以它能在domain(领域)变化的这么剧烈的情况下,依旧能识别出这张图片里画的是香蕉,准确的完成这个分类任务。
当然文章里啊还做了很多其他分类的任务以及数据集迁移的效果呢都非常好,这里呢我们先暂时不说分类了,我们去看一些
StyleCLIP:那首先一个很有意思的工作就是这个 StyleCLIP,那从名字一看,很显然这就是一个clip加上style gan的一篇工作,文章的意思呢就是想通过这种文字上的改变,从而去引导图像的这种生成,比如说在他下面的这个 demo视频里,那通过改变不同的这个文字输入,就能改变右边生成的这个图像的各种属性。
那么再接着往下看这些例子啊有一个更好的理解,比如说这里呢原来的图片是奥巴马的图片,然后给它加上文字的这种指示以后,他就把这个发型就变了。还有这里呢本来是Taylor Swift的照片,这里的文字指示是说啊去掉这个化妆,然后就直接一键卸妆了。这里的这个猫啊本来眼睛是闭上的,这里写出cute cat啊变得更可爱一点,所以这个眼睛一下就变大了。这篇论文的效果呢也确实非常好,所以是ICCV 2021的一篇口头报告论文
CLIPDraw:然后还有一篇论文叫CLIPDraw,也是利用clip这个预训练的模型呢去指导这个图像的生成,那这个论文的想法呢更是简单,他甚至都不需要进行模型的训练,他直接做几步这个gradient descent就可以生成这样的一些简笔画的图像了。
他在文章中说啊在一个普通的GPU上,往往不需要一分钟就能生成这样的一张图片。那我们这里可以看到这些生成的图也都很有意思,比如说这里是一个马在吃一个cupcake,它就真生成了这么一个动画的这种马,然后再吃一个cupcake,还有这里说生成一个这个3d的一个寺庙,那它这里画出来这个图啊还真有点3d那个意思。还有后面就是说全家去迪士尼乐园玩,他还真就是全家啊在一起,然后再像这个地图上一样去别的地方玩,还有最后的这个自拍啊一个相机,拍了这么多自己的脸,已经颇有这个抽象主义的风格了,如果真是个画家画的话,说不定能卖个好价钱。
目标检测:那当然除了去做这种图像生成的任务,clip肯定还能用来做更多的任务,物体检测和分割这两个主流任务肯定是跑不掉,所以在clip出来之后,很快也就是一个半月左右, Google呢就出了一篇啊利用clip去做这个物体检测的工作,当然这里的细节呢我就不细讲了,我们可以来看一下它的这个效果怎么样。
那作者这里说如果你是用传统的这种目标检测的方法去做预测的话,它可能只能 告诉你这些都是玩具,也就是这里他所说的蓝色的啊这种基础类,但是当你利用了这种自然语言之后,你就摆脱了基础类的这个限制,你就可以随意发挥了,也就他们这里说的这个 open vocabulary detector,所以他们训练出来的模型呢就可以检测出这些新的类,也就是红色的这些类。比如说呢他不光可以知道这些玩具的是颜色,这蓝色的玩具,绿色的玩具,同时呢他还知道这些玩具具体所代表的这个物体类别,比如说这是一个玩具大象,这是,一个玩具鳄鱼,这是一个玩具鸭子,所以说你能得到的这个输出啊一下就丰富了不少。
视频检索:最后呢我想再提一个基于clip的例子,是用来做视频检索的,他的意思是说如果现在给定你一个视频,然后你想去搜这个视频里到底有没有出现过这个物体,出现过这个人,或者说出现过一些场景,那你就可以通过直接输入文本的这种形式去做检索。
我们接下来呢就来看一下它在监控视频上的这个检索表现,那这里呢它的文本的输入是说他想去找一辆卡车,而这个卡车上呢带有一些文字,就是带这个“odwalla”可能是一个什么品牌,然后呢 clip模型就把这句话变成这个文本的特征,然后把这个视频里的每一帧呢都变成这个视觉上的特征,然后一帧一帧的去跟这个文本特征做对比,然后挑出相似性最高的那一帧给你展现出来,然后这里呢他还真就找到了这辆卡车,而且这个卡车呢是在侧面上印,有这些字母就这个“owdalla”,所以这个clip模型已经强大到甚至都可以直接去做OCR了。
那下面这个例子呢它的文字输入说去找一辆白色的这个宝马车,然后他也能准确的去找一辆这个白色的宝马车,至于这个是凑巧,还是说clip这个模型真的已经知道宝马车的车头是长这样,那这个就不得而知了,但确实也是检索出来了。然后后面这个例子呢是说去找一个这个骑自行车的人啊穿的是蓝色的这个 T恤,同样啊也能非常准确的把这个人找出来。最后一个show出来的例子呢是去找一辆这个蓝色这个 smart这种小车,他也能准确把这辆小车找出来。当然了作者这里只是把这些成功的例子展现出来,我相信肯定是有很多不成功的例子了,但这个结果呢还是比较令人不安的。CLIP的作者团队呢应该也意识到了这一点,所以在他们的论文里他们还专门有一段针对这个监控视频的这个讨论。
当然了clip还有很多好玩的应用,而且还有很多很好的这个后续工作,我这里呢就不一一列举了。
方法:利用nlp的监督信号
目的:迁移性,学习泛化性好的特征
目前最先进的视觉系统:固定的提前定义好的物体类别集合,模型通过预测提前定义好的类别完成模型训练。这属于有限制性的监督信号,这也限制了模型本身的泛化性,尤其是要识别新类别物体的时候,就需要新的数据去训练新的模型。
这个固定的提前定义好的这个标签集合怎么理解?
其实就是说 Imagenet 它有固定的 1000 个类,不多不少,那 Cifar 10 就有 10 个类, Cifar 100 就是 100 个类,那目标检测那边儿的Coco就是 80 个类,那语义分割的 city scapes就 19 个类,那视频那边儿的kinetics数据集就是有400 个类。
总之为了简单起见,不光是收集数据集的简单性,还是说从模型训练的简单性来说,直接定义这么一个固定的提前定义好的这个标签集合,会大大的简化这个问题本身。但是也因为采用了这种有限制性的这种监督信号,从而也限制了模型本身的这个泛化性,尤其是当你需要去识别新物体类别的时候,该怎么办?那对于这些新的类别,难道每次都要去收集新的数据,然后重头训练一个新的模型吗?这样就很有局限性,就不好 scale了,就不好做大做强了。所以说作者就想到了另外一种方式,直接从自然语言这边,从这个文本里去得到一些监督信号,是一个看起来非常有前途的办法,因为它的这个监督信号涵盖的范围就太广了,只要是你语言描述过的物体,你就有可能让你这个视觉模型去识别到这个物体,而不仅仅是你提前定义好的那 1000 个类。然后作者接下来说,他们其实已经证实了,就是用一个非常简单的一个预训练的任务,就可以非常高效的,而且可扩展的去学习一些最好的图像表征。那这个任务具体是什么呢?其实就是说给定你一张图片,然后又给定你一些句子,然后这时候模型需要去判断哪一个句子,也就是说哪一个这个题目跟这个图片是配对的。那既然你要做这么一个配对的任务,那你当然就需要这么一个类似的数据集了。也就是说你的训练样本必须是一个图片文字的配对儿。所以说文章的作者又去爬了一个超级大的,有 4 个亿的这个图片文本配对儿的数据集。那有了这么大的一个数据集之后,我们就可以选择一种自监督的训练方式,就去训练一个大模型出来了。在 CLIP 这篇文章我们之前也提过,它是用多模态的对比学习去完成模型训练。那在这个预训练完成之后,自然语言就被用来去引导这个视觉模型去做物体的分类,也就是我们之前说过的这个prompt。然后分类也不光局限于已经学到的这种视觉的这个概念,还能扩展到新的类别。从而说你现在学到的这个模型是能够直接在下游任务上去做这种 Zero shot 推理的。那为了验证这个模型的有效性,作者接下来就在超过 30 个不同的这个视觉的任务和数据集上去做了这个测试。然后作者发现这个模型的迁移学习效果,就是说对大多数任务来说,它的效果都是非常好的, CLIP 模型在不需要任何数据集的这种专门训练的情况下,能和之前一个完全用有监督方式训练出来的模型打成平手甚至还会更高。那为了让摘要看起来更具吸引力,所以说作者就在这里举了一个 image net 上,兵家必争之地上的这个效果,CLIP模型在不使用任何一张那 128 万个训练集的情况下,能跟之前一个有监督训练好的 rise 50 打成平手。这个结果在当时读起来是非常震惊的,已经足够吸引读者去读完整个论文了。最后作者说他们预训练好的模型和他们的代码都放到了这个链接里。但其实这里的代码只是可以用来做推理, OpenAI 并没有开源它真正的这个预训练的代码,那好在是他们开源了预训练的模型。所以像我们刚开始介绍过的一样,很快又激发了一系列好玩又有用的工作。
那接下来我们一起读文章的引言部分,文章一开始说直接从这种原始的文本数据里去预训练一个模型,已经在过去几年里在 NLP 领域取得了革命性的成功。比如说Bert,GPT, T 5 这些模型。那不论你是使用自回归预测的方式,还是使用这种掩码完形填空的方式,它都是一种自监督的训练方式。所以说它的目标函数是跟你的下游任务无关的,它只是想通过预训练得到一个非常好的非常能泛化的特征。那随着计算资源的增多、模型的变大、还有数据变得更多,这个模型的能力也会稳健的提升。那这一套系统说白了其实就是说文字进,文字出,它并不是在做一个什么特殊的分类任务,它的这个模型架构也是跟下游任务无关的。所以说当直接用在这种下游任务上的时候,我们就不需要费尽心思去研究一个针对那个任务的输出头,或者说针对那个数据集的特殊的一些处理了。那这里面最厉害的、最耳熟能详的模型,也就是 OpenAI 自己的这个 GPT 3,它也能够做分类、做翻译,还能帮你写邮件、写小说、写新闻,简直看起来是无所不能,而且在大多数任务上,它并不需要特定领域的这个数据,或者说只需要一点点的这个数据去做一点微调,就可以和之前精心设计过的那些网络取得差不多的结果。作者接下来说,这些鼓舞人生的结果证实了,在这种文本进文本出,利用自监督的信号去训练整个模型的框架下,这种大规模的没有标注的数据,其实是要比那些手工标注的,质量非常高的那种数据集,反而是要更好使的。但是在视觉领域,大家一般的做法还是在 image net这种数据集上去预训练一个模型,这就会让训练好的模型有诸多的限制。那 NLP 里的这套框架到底能不能用在视觉里,作者说从之前的工作看起来应该是没问题。然后接下来作者就讨论了一下之前的工作,他们直接从 99 年的工作开始讨论起,一直讨论到最新 21 年的一些工作,中间横跨了 20 年。因为讨论的工作比较多,所以说这里我就不细说了,CLIP 主要是跟这篇Li 2017 这篇论文是非常相似的,他们都做了这种 Zero shot 的这种迁移性的学习,但是在 17 年的时候,既没有Transformer,也没有这么大规模这么好的数据集,所以说这篇论文的结果就没有像 CLIP 这样这么亮眼。我们后面在表格里也可以看到,当时这个方法在 Imagenet 上做 Zero shot 只有十几的准确度,跟 Clip 的 76. 2差了 60 多个点。然后在有了Transformer,有了对比学习、完形填空这种强大的自监督训练方式之后,最近也有一些工作尝试把这个图片和文字结合起来,去学得一个更好的特征。这里作者列了三个工作,
这几个工作都是基于 Transformer 去做的,跟 clip 其实也已经非常像了。但具体的做法也都有一些区别,比如对于 virtex 来说,他们就用的是这种自回归的预测方式去做模型的预训练。那对于 ICMLM来说,很显然他们是用这种完形填空的方式去。做预训练。然后Convirt就跟 CLIP 已经非常类似了,但是他们只在医疗图像上做了实验。总之这三种方法都没有在模型或者数据上取得一个很大的规模。所以说就没有像 CLIP 模型一样一战成名。然后作者就反思了一下,说既然利用这个自然语言,那边的这个监督信号是一个很有前途的方向,那为什么在视觉里这一系列的工作就这么少?那其实可能还是跟这个圈子文化有关系。作者这里说,因为之前的那些方法没有这么大的数据集,没有这么多的算力,没有这么大的模型,没有这么好的自监督训练的方式。对它在标准的这个测试数据集上,比如说 image net 上的这个效果就非常的差。比如我们刚才说的这个工作,它在 Zero shot 的这种设定下就只有 11. 5 的这个准确度,但是在 Imagenet 上之前最好的表现方法都已经 88. 4。了。而且就算是不用 deep learning,就用传统的视觉方法,它的准确度也有 50 的准确度。当然这里的对比并不公平,因为这 88. 4 还有这 50 都是有监督的训练。但是这里的这个 11. 5 是 Zero shot 的,但因为效果实在太低,所以说没有实用的价值,大家去钻研这个方向的热情就会小很多。取而代之另一系列的工作就非常受人关注,就是说怎么去利用这种更弱的这种监督信号。所以之前Mahajan et al. (2018)这个工作他就提出了一个新的预训练的任务,也就是说他收集了一个Instagram的数据集。然后他去预测这个图片自身带的这些hashtag,那通过这种方法,你的数据集就可以变得非常大,因为每张图片都会自带一些hashtag,你不用去人工的标注,同时你这些 hashtag 也就可以想象成是一种自然语言的一种监督信号,它也是一个或者几个单词,它是有明确的语义含义的。然后另外还有一些工作,比如说这两篇工作Kolesnikov et al. (2019) and Dosovitskiy et al. (2020),就是去训练一个模型,然后去预测 JFT 300 million 这个数据集上所有的这个类别。但因为 JFT 300 mini 这个数据集非常大,它的类别数好像有18000,然后因为有这么多的类别,所以它的标注其实是比较noisy 的,这样也就算是一种弱的监督信号。但总之作者想说的是,这一系列的工作之所以更火爆,就是因为他们的性能会更好。这一系列的工作其实也就代表了一个实用主义的这个中间地带,其实那些作者也知道使用这种有限的,而且就是固定的这种特别好的标注数据是不好的,是有很大的局限性的。他们是非常想用这种取之不尽用之不竭的这种原始文字的,但是因为后一种方向目前的这个效果还太低,所以说没办法他们就走了这种中间的地带,就是用这种文本带来的弱监督信号去帮助有监督的模型取得更好的效果,但是有得必有失,作者这里就指出,虽然你取得了更好的结果,但是你还是有很大的局限性。之前的这些工作需要精心的设计,而且它们的监督信号还是 1000 个类或者 18000 个类,它并不能真的做到随心所欲去检测任何它想检测的类,而且这两种方式都是会用一个固定的 Softmax 分类头去做分类,所以说他们的输出都是固定,要么是 1000 选一,要么是 1 万八选一。如果再有新的类别,他就无能为力了。所以他们没有灵活的这种做 Zero shot的能力。接下来作者说之前这些弱监督的方法,也就是之前我们提到的这两个工作,和最近的这些借助于自然语言处理去学习这个图像表征的方法,也就是这些 virtex、ICMLM这些工作,他们的最大的区别在哪?他们最大的区别就是在他们这个规模上,因为从方法上来说,不论你是从这个 Instagram 的这个 hashtag 上去学习,还是从 JFT 300 million 这个数据集上,这个标签这一两个单词上去学习。其实也都算是一种从自然语言处理学习图像特征的方法,它们之间的区别并不是很大,关键就是在规模上。那这个规模其实就是说数据的规模和模型的规模。那像之前这些弱监督学习的方法,他们是在亿级规模的数据集上去训练他们的模型的,而且训练了加速器年,它这里为什么用加速器,是因为大家用来训练的这个硬件是不一样的,大多数人可能还是用GPU,但像 Google 就是用TPU,当然还有很多别的训练硬件了。所以作者这里把所有的这些硬件都统称为是加速器,反正都比 CPU 快,这个其实我们之前在讲 VIT 那篇论文的时候也提到过,当时作者说他们训练这个 VIT 模型用了 2500 个 TPUV 三天,也就是说如果你用一个 TPUV 三核的话,你训练这个模型需要训练 2500 天,那换算过来的话大概就是 7 年。他们当时也是在 JFT 300 million 这个数据集上去训练的。对,大概就是这里说的训练了七个 accelerate years,然后在这种亿级规模的数据集上去训练。但最近的这些方法,比如说跟 CLIP 最相似的这三种方法,他们其实只是在几十万张图片上去做了这个训练,而且就训练了几天,那跟之前那种亿级规模的数据集,而且还训练了几年的规模比起来,它的效果肯定是不太行的。那 CLIP 这篇论文的作者就是想告诉大家这些方法效果不行,不是因为它的方法不行,主要是因为规模没上去,只要规模上去了,效果好到你怀疑人生。所以作者接下来就说,那在这篇论文里我们就是 close 了这个gap,什么gap?就是之前这几个工作它的这个训练规模不够大,那我们这里就是把它的规模推到够大。具体来说,首先 CLIP 的作者团队就从数据出手。他们就先去收集了一个超级大的这个图像文本配对的数据集里面有 400 million 这个图片文本的配对,那这个规模就够大了,就跟 JFT 300 million 数据集是一个水平上的了,也就是说跟之前这些工作——这些弱监督学习的方式,他们在数据上打成平手了,那至于模型上,作者也尝试了从 Resnet 到 efficient net 到vision。Transformer。最大的他们用了 VIT large 这个模型,所以说模型的规模也提上去了。那在大数据加大模型双重的加持之下,作者说我们就提出来一个非常简单的方法叫CLIP,也就是 contrast language image Pre training。它其实就是我们之前说的这个工作 Convirt 的一个简化版本,但是效果非常的好。然后在模型方面,作者在视觉这边一共尝试了 8 个模型,从 Resnet 最后到vision Transformer,这里面最小的模型和最大的模型之间的计算量差了大概有100倍。然后作者最后发现这个迁移学习的效果,是跟这个模型的大小基本上是呈正相关的,就是说小的模型它的效果就差一些,那大的模型效果就好一些,你的模型逐步增大,你的这个迁移学习的效果也逐步增高。它是一个非常平滑的过程,所以你也是可以预料的。那如果在你接下来真实的应用中,你采取了更大的模型或者更小的模型,其实你也可以大概估算出来它的这个迁移学习的效果会是多少,这个性质确实是非常实用的。然后到引言到最后自然又是老套路,作者得开始卖结果了,那 clip 这篇论文的结果非常非常的多,而且效果都非常非常的好。所以说他就把最重要的几个点罗列了出来,那首先既然 CLIP 模型做的是这个迁移学习做的是这个泛化性能,你能迁移的这个任务越多,你的这个榜刷的越多,那自然就可以证明你的这个模型更有用。所以作者这里叫怒刷 30 个数据集。然后在这些数据集上, clip 一般都能和之前精心设计的那些
本文:从文本中获得监督信号,也就是只要用语言描述过的物体,就有可能让视觉模型能识别到。
证明:用一个很简单的预训练任务,就能非常高效的、可扩展的去学习最好的图像表征
预训练任务:配对任务,给定一张图片和一些句子,模型需要判断哪个句子和图片是配对的
数据集: 4亿的图文数据集
自监督的训练方式:多模态的对比学习来完成模型训练
预训练完成之后,自然语言就被用来引导视觉模型做物体分类,也就是Prompt,而且Prompt不局限于学到的视觉概念,还能扩展到新的类别,从而,学到的这个模型可以直接用在下游任务上去做zero-shot推理。
直接从原始的文本数据中去预训练一个模型已经在过去几年里在nlp领域取得了革命性的成功(bert gpt t5等模型)不论是完形填空还是自回归预测的方式,都是一种自监督的预训练方式,所以目标函数是与下游任务无关的,只是想通过预训练得到非常好非常能泛化的特征。随着计算资源、模型变大、数据增多,模型的能力也会稳健的提升。这就是一套文字进文字出,并不是在做什么特殊的分类任务。模型架构也是和下游任务无关的,那么在直接用在下游任务上的时候,就不用费尽心思去研究针对任务的输出头或者针对数据集的特殊处理了。这里面最厉害的就是OpenAI自己的gpt3模型了,什么任务都能做,而且不需要特定数据,或者只需要一点点数据做微调,就可以和之前精心设计的模型取得差不多的结果。
这些鼓舞人心的结果证实了,这种文本进文本出,利用自监督的信号去训练整个模型的框架下,这种大规模没有标注的数据是要比那些手工标注质量非常高的数据集,反而是要更好用的。但是在视觉领域,大家一般还是在imagenet这种数据集上去预训练一个模型,这就会让预训练好的模型有诸多的限制。
方式:zero-shot的迁移学习
局限:模型和数据上都没有很大的规模,所以效果没有非常拔群。下面三个工作都是基于transformer做的
所以效果没有那么好。
很好的标注数据预训练出来的模型有局限性;原始文字预训练出来的模型性能太低;所以用文本带来的弱监督信号去帮助有监督的模型取得更好的效果,但是虽然这种折中方法效果很好,但还是有很大局限性:之前的工作需要精心设计,而且监督信号只有1000个或者18000个类,并不能做到真正的随心所欲的去检测到任何想检测到的类,而且Mahajan et al. (2018) and Kolesnikov et al.(2019)这两种方式都是固定用一个softmax分类头去做分类的,所以输出都是固定的,对于新类别无能为力,也就是没有灵活的做zero-shot的能力。
如Mahajan et al. (2018) and Kolesnikov et al.(2019)等,之前的弱监督方法和如VirTex, ICMLM借助自然语言处理去学习图像表征的方法,他们最大区别在规模上(数据上和模型上)
CLIP解决了规模问题:超大的图文对数据集,超大的模型
作者发现,迁移学习的效果和模型大小正相关
如何证明迁移效果:刷更多的榜。
CLIP能和有监督训练的数据集打成平手,甚至效果更好
用linear probe证明CLIP学到的特征的有效性。
CLIP比imagenet训练出来的模型效果更好,计算上也更加高效
zero-shot的clip模型更加稳健:当效果和之前有监督imagenet上训练好的模型效果持平的时候,泛化性能却远远好于imagenet上有监督训练好的模型
CLIP:想法简单,实现高效,性能在各个数据集上都非常好,而且泛化和稳健性都不错,全面碾压之前的方法。
33:38方法
CLIP怎么预训练的?
利用自然语言的监督信号,去训练一个比较好的视觉模型
总结(统一)之前的工作+把规模做大看看效果
之前的工作:想用文本做监督信号。为什么以前做不好呢?因为NLP那边的模型也不是很好学,Topic models和n-gram的形式都很复杂,不好做跨模态的训练,但是随着transformer和自监督的训练方式兴起,NLP那边彻底革命了:deep contextual representation,就是具有上下文语义环境的学习方式,比如bert用的完形填空。
在自监督的学习范式下,现在nlp模型终于可以用这种取之不尽用之不竭的文本监督信号了,所以训练出来的模型又大又好,不仅简单而且泛化的也好,这就为多模态的训练铺平了道路。
我们为什么非要用这种自然语言的监督信号来训练一个视觉模型呢?
因为好处实在是太多了,其中两个最重要的:
结论:用文本的监督信号帮助去训练一个视觉模型是很有潜力的。
1、要做图片和文本配对的学习,就需要有一个足够大的数据集,里面有很多很多图片文本对。
过去的数据集都不够大,质量不够好,所以自己造一个数据集wit,4亿个图文对
2、预训练的方法,以及如何选择预训练的方法
39:20
视觉这边的模型都非常大,训练起来都非常贵。过去的方法只是训练区预测仅仅1000个类,就已经需要训练数年。
现在数据集更大,任务更难(从自然语言处理里直接去学open set of visual concepts,要去学开放世界里所有的视觉概念)
训练效率对于多模态预训练的成功至关重要,作者做了一些尝试:图像CNN,文本transformer,从头开始训练,任务是给定图片 要预测图片所对应的文本。
为什么要用对比学习?
如果给定一张图片,要去预测它对应的文本,是需要逐字逐句去预测文本的,这个任务就太难了。因为对于一张图片来说,可以有很多很多不同的描述,文本之间的差距是非常巨大的,如果用预测型的任务去预训练模型的话,就有太多的可能性了,模型训练的就非常慢。作者发现,如果把训练任务变成一个对比的任务,也就是说,只需要判断这个图片和这个文本是不是一个配对,这个任务听起来就简单了很多,因为不再需要逐字逐句的去预测文本了,只需要图片和文本是配对的就行,这个约束一下就放宽了很多。这个监督信号其实也更合理。
如图2,仅仅把预测型的对比函数换成对比型的目标函数(黄线→绿线),训练效率一下就提高了四倍;训练效率随着约束逐渐放宽在成倍的提高,也就说明基于对比学习的训练方法,训练效率是非常高的。
3、伪代码认识CLIP方法
43:39伪代码
CLIP的伪代码真的很简单,和之前的对比学习没有什么区别,无非就是把单模态的正样本换成了多模态的正样本。
46:23一些有意思的细节
怎么训练这些模型
48:36训练
视觉这边:训练了5个resnet,3个vit
ResNet-50, a ResNet-101, and then 3 more which follow EfficientNet-style model scaling and use approximately 4x, 16x, and 64x the compute of a ResNet-50
ViT-B/32, a ViT-B/16, and a ViT-L/14
第二章总结:
实验
52:22实验
1、什么是zero-shot transfer
动机:
之前的自监督或者无监督的方法,主要研究的是特征学习的能力,目标是去学一种泛化性比较好的特征。但即使学到了很好的特征,如果想应用到下游任务上,还是需要有标签的数据做微调,所以还牵扯各种各样的问题:下游任务不好收集数据,分布偏移(Distribution shift) 【分布偏移在监督学习中一般指的是训练分布与测试分布不同,在离线强化学习中指的是训练策略与行为策略不一致。】那么如何能够训练一个模型,接下来就不在训练或者不再微调了呢?
一旦借助文本训练好了这个又大又好的模型,然后就可以用这个文本作为引导,去很灵活的做zero-shot的迁移学习,至少在分类上效果都非常好。
怎么用CLIP做zeroshot的迁移呢?
如果给imagenet里所有的图片去做zeroshot的推理,去测试模型的效果如何,那么1000个类应该生成1000个句子,如此去与图像特征算相似度,得到结果。当然,这个过程是可以分批次进行的,所以CLIP的推理还是非常高效的,不会非常慢。
对比结果
55:58
57:09提示工程
基于prompt的学习最近非常火,无论是在CV还是NLP都非常火
主要是在做微调或者直接做推理的时候用的一种方法,而不是在预训练阶段,所以不需要那么多的计算资源,而且效果好,所以影响力非常大。
在这里,prompt指的是文本的引导作用。
为什么要做prompt engineering和prompt ensembling?
基于上面两个问题,作者就想了一个很简单的方式:做了一个提示模板prompt template “A photo of a {label}.”把标签变成一个句子。已经是个句子了就不会出现distribution gap的问题。因为这个模板的含义是:这是一个什么的图片,所以这个标签多指的是名词,就能解决歧义性的问题了。
作者发现用了这个提示模板之后,准确度提高了1.3%。
prompt engineering不光可以做提示模版,还可以做很多事情:如果提前知道一些信息,这对zeroshot的推理是非常有帮助的。For example on Oxford-IIIT Pets, using “A photo of a flabelg, a type of pet.” to help provide context worked well. Likewise, on Food101 specifying a type of food and on FGVC Aircraft a type of aircraft helped too. For OCR datasets, we found that putting quotes around the text or number to be recognized improved performance. Finally, we found that on satellite image classification datasets it helped to specify that the images were of this form and we use variants of “a satellite photo of a flabelg.”.
prompt ensembling,多用一些提示的模板,做多次推理然后把结果综合起来,ensemble一般都会得到更好的结果。论文中显示用了80个提示模板做ensemble。
方法部分总结:
到这里,结果已经很好了,加上点讨论,加上个结论就是个八页的中规中矩的论文投稿,但是作者又做了十页的效果展示:
在27个数据集上,衡量了CLIP做zeroshot的迁移的效果,如图所示:
Zero-Shot CLIP
Linear Probe on ResNet50作为基线:冻住预训练好的模型的主干,只用它抽特征,就训练最后一层的FC分类头层去做有监督的分类任务。这里的res50是用有监督的方式训练好的一个模型,从中去特征,然后在这些下游任务上去添加新的分类头,然后在这个新的分类头上去做linear probe的微调
绿色的都是相比于基线的提升
蓝色的是相比于基线的性能降低
证明对于更难的数据集,fewshot会比zeroshot的衡量更合理
01:06:25few shot
zeroshotCLIP:0个训练样本,别的方法因为没有和NLP结合所以没法做zeroshot,所以最低也得从oneshot开始
fewshotCLIP:预训练之后冻住模型参数,只从里面抽特征做这种linear probe,训练最后的分类头,所以需要下游数据集里有这种有标签的数据
1、linear probe CLIP:把CLIP的图片编码器冻住做linear probe
2、之前的方法:BiT-M、SImCLR、resnet50。
观察到的几个有趣的结论:
下游任务用全部的数据,CLIP的效果会如何?
01:09:49
3.2节做了这个实验,之所以命名为表征学习,因为之前不论是无监督还是自监督的表征学习,都是先预训练一个模型,然后在下游任务上用全部的数据去做微调的。所以如果这里用上了全部的数据,那么就可以和之前特征学习的方式去做公平对比了。
如果下游任务用全部数据,那就用很多方式去衡量模型学到的特征好不好,最常见的两种方式:
在本文中,作者选用了linear probe而不是微调,原因如下:
如图10,左右两张图画的是同一个意思:横坐标是对于一张图片来说,做一遍前向过程需要用多少的计算量;纵坐标是说在很多数据集上,最后的平均准确度。也就是准确度越高,用的时间越短,效果就越好,越靠左上角的模型,在精度和准确度之间的权衡就做的更好
右图:作者把27个数据集上的效果平均了一下,可以看到CLIP-vit和CLIP-resnet的效果都是最好的,证明了CLIP不光是zeroshot和fewshot效果好,在用全部数据做训练的时候,CLIP照样是效果最好的。
左图:为了和之前的工作做一个公平对比,在12个数据集上比平均的效果,我们可以看到,用更大的模型也就是用vit的CLIP效果还是很好,但是用resnet的CLIP就比不上别的方法了。作者说这12个数据集和imagenet的关联性很高,所以那些模型如果在imagenet上做过有监督的预训练,那肯定它的效果就会特别好,超过CLIP也就不足为奇了。
最后作者为了再次证明CLIP模型的强大,它选择了之前在imagenet上表现最好的模型:用最大的EfficientNet L2,用 NS 伪标签的方式去训练的一个模型,它在imagenet上霸榜了快一年,有88%的top-1准确率。
这里就是把CLIP的模型和EfficientNet L2 NS模型全都冻住,从他们里面抽特征,最后去做逻辑回归。然后作者发现在27个数据集里CLIP在21个上面都超过了EfficientNet L2 NS,而且很多数据集都是大比分超过,在那些表现不行的数据集上CLIP也只比EfficientNet L2 NS稍微低一点,差距并不大。
zeroshot、fewshot、全部数据去衡量模型的好坏,也就是说正规任务做完了,接下来就要衡量这个模型其他的特性
01:15:34泛化性
稳健性
3.5节,当数据有分布偏移的时候,CLIP的表现如何?
当数据分布改变的非常厉害的时候,普通的模型掉点就非常严重(第一列数据),但是CLIP训练出来的模型就非常稳健,在所有的数据分布上都表现的非常好(第二列数据)
01:16:41
和人的表现对比
找了5个人,让他们看Oxford IIT Pets数据集里的测试图片。
Zero-shot CLIP比Zero-shot human表现好的多
One-shot human一旦给人看过一张图片,准确度一下就从50提高到70了,这是因为人可以把新知识和过往的知识联系起来去做判断,但是Two-shot human的结果并没有提升,说明如果过往知识没有增加,只是多看一两张图是没有用的。
另一个有趣的实验:把宠物种类列出来,看针对每个类模型的表现如何。
证明:对CLIP难的对人也难,简单的同理。人对常说常见的种类,就在常识范围内所以分类准确度就高,CLIP也是。
01:20:05去重
q去重实验
因为会产生疑问:数据集重叠的问题,会不会收集的数据集太大了,包含了下游任务的数据集所以效果才那么好
去重实验证明了:确实是CLIP本身的泛化能力强
01:20:41第六章
不足之处,分析局限性
01:31:06
j结论
研究动机:在NLP领域,用大规模的无监督数据去预训练模型,而且用和下游任务无关的训练方式(完形填空),在这两种工具的加持下,NLP那边取得了革命性的成功(gpt3)。他们想把NLP里的这种成功复制到其他领域去。
然后他们发现把这套思路用到视觉里,确实效果很好。然后他们还讨论了一下社会影响力。
一句话总结他们的方法:预训练阶段做了对比学习,利用文本的提示做了zeroshot的迁移学习,
结论:在大规模的数据和大模型的双向加持下,CLIP的效果能和之前精心设计的那些,而且是有监督训练出来的基线模型达成平手,但还有很多可以提升的空间。
CLIP最大的贡献:打破了之前固定种类的范式,也就是不论在收集数据集还是训练模型的时候,都不需要像imagenet那样做1000类或者像coco一样做80类了,直接搜集图片文本对,然后用无监督的方式,要么去预测相似性,要么去生成它,总之就是和固定类别的范式说拜拜了。这样不仅处理数据更方便,训练模型更方便,最主要的是在做模型推理的时候更方便,甚至可以去zeroshot的做各种各样的分类任务。