https://space.bilibili.com/511378644
目录
3标题:利用来自nlp的监督信号去学习一个迁移效果很好的视觉模型
NLP效果非常好的框架:文本进文本出+利用自监督信号训练整个模型+原始数据
NLP这套效果非常好的框架能不能用在视觉里?根据过去的工作看,是没问题的
为什么利用自然语言那边的监督信号是一个很有前途的方向,那为什么在视觉里这一系列的工作那么少呢
6.1方法的核心:利用这个自然语言的监督信号来训练一个比较好的这个视觉模型。他们说这个方法或者说这个思路一点儿都不新,那作者为什么还要接着这个方向继续做?
6.2为什么非要用这种自然语言的监督信号来训练一个视觉模型呢?
6.3如果你要去做这种文本和图片配对儿的学习,你就需要有一个足够大的数据集
7.2怎么用 CLIP 去做这种 Zero shot 的迁移
7.4为什么要做 prompt engineering 和 prompt assembling?
7.5在 27 个数据集上去衡量了一下 CLIP 做这种 Zero shot 迁移的效果
7.6对于这些更难的数据集, few shot 会比 Zero shot 的衡量更合理
实战一下,跑一个很简单的一个样例代码,看看 CLIP 模型是不是真的什么都能做分类
评价:工作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还有很多好玩的应用,而且还有很多很好的这个后续工作,我这里呢就不一一列举了。
目前最先进的视觉系统:固定的提前定义好的物体类别集合,模型通过预测提前定义好的类别完成模型训练。这属于有限制性的监督信号,这也限制了模型本身的泛化性,尤其是要识别新类别物体的时候,就需要新的数据去训练新的模型。
这个固定的提前定义好的这个标签集合怎么理解?
其实就是说 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的能力。
接下来作者说之前这些弱监督的方法,也就是之前我们提到的Mahajan et al. (2018) and Kolesnikov et al. (2019)这两个工作,和最近的这些借助于自然语言处理去学习这个图像表征的方法,也就是这些 virtex、ICMLM这些工作,他们的最大的区别在哪?他们最大的区别就是在他们这个规模上,因为从方法上来说,不论你是从这个 Instagram 的这个 hashtag 上去学习,还是从 JFT 300 million 这个数据集上,这个标签这一两个单词上去学习。其实也都算是一种从自然语言处理学习图像特征的方法,它们之间的区别并不是很大,关键就是在规模上。那这个规模其实就是说数据的规模和模型的规模。那像之前这些弱监督学习的方法Mahajan et al. (2018) and Kolesnikov et al. (2019),他们是在亿级规模的数据集上去训练他们的模型的,而且训练了加速器年,它这里为什么用加速器,是因为大家用来训练的这个硬件是不一样的,大多数人可能还是用GPU,但像 Google 就是用TPU,当然还有很多别的训练硬件了。所以作者这里把所有的这些硬件都统称为是加速器,反正都比 CPU 快,这个其实我们之前在讲 VIT 那篇论文的时候也提到过,当时作者说他们训练这个 VIT 模型用了 2500 个 TPUV 三天,也就是说如果你用一个 TPUV 三核的话,你训练这个模型需要训练 2500 天,那换算过来的话大概就是 7 年。他们当时也是在 JFT 300 million 这个数据集上去训练的。对,大概就是这里说的训练了七个 accelerate years,然后在这种亿级规模的数据集上去训练。但最近的这些方法,比如说跟 CLIP 最相似的virtex、ICMLM、Convirt这三种方法,他们其实只是在几十万张图片上去做了这个训练,而且就训练了几天,那跟之前那种亿级规模的数据集,而且还训练了几年的规模比起来,它的效果肯定是不太行的。
那 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 这个模型真的是想法又简单,实现又高效,性能在各个数据集上又非常的好,而且泛化性稳健性都不错。全方面碾压之前的方法效果好的真是让人不敢相信,所以说作者都不得不专门儿写了一个section,也就是后面我们会提到的这个section7,去讨论了一下 CLIP 这个工作的这个广泛的影响力,以及它有可能带来的这种政策上或者伦理上的这种影响。
直接从原始的文本数据中去预训练一个模型已经在过去几年里在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:想法简单,实现高效,性能在各个数据集上都非常好,而且泛化和稳健性都不错,全面碾压之前的方法。
接下来我们一起来看一下文章的方法部分,看看 CLIP 是怎么进行预训练。作者上来先说它们方法的核心,就是利用这个自然语言的这个监督信号来训练一个比较好的这个。视觉模型。然后大佬一般都比较谦虚,他们说这个方法或者说这个思路一点儿都。不新。那作者为什么还要接着这个方向继续。做?因为他说之前的这些方法,他们的这个用语都比较的。混淆。本来都是很类似的想法,但是这四个工作分别把他们的方法描述成为是无监督的、自监督的、弱监督的和有监督的,所以让人感觉很无厘头,而且他们的规模也没有。做得很大。所以作者说那我来帮你们总结,顺便把规模做大给你们看看效果。到底有多好。然后作者说我们想强调的是这些工作其实他们没有什么大的。区别。他们就是想用文本当做一个训练的信号,但这条路走的不是很顺。其实也有一个原因,就是 NLP 那边的模型也不是。很好学。比如说之前 NLP 那边用的是这种 topic model 或者 n gram 的这种形式,都还是非常复杂的,所以不太好做这种跨模态。的训练。那。但是随着 Transformer 和自监督的这种训练方式的兴起NLP 那边彻底革命了,也就是他这里说的这种 deep contextual representation learning,就是具有上下文语义环境的这种学习方式,比如说 Bert 用的完形填空,然后在这种自监督学习的范式之下,现在 NLP 模型终于可以利用这种取之不尽用之不竭的这种文本监督信号了,所以说训练出来的模型又大又好、而且还简单而且泛化的也好,这就为多模态的训练铺平了道路。
然后接下来作者又说了说,我们为什么非要用这种自然语言的监督信号来训练一个视觉。模型呢?因为它的好处实在是太多了。作者这里列举了两个最重要的,第一个就是说你不需要再去标注这些数据了,那像 image net 的话,你原来就得说你先定好我有 1000 个类,那这 1000 个类也得是你提前去筛选好的,然后你再根据这些类去下载照片,然后再去清理数据集,然后再去。标注。这个非常复杂。的过程。那如果你现在要做的只是去网上下载这些图片文字。的配对。别的这些标注的步骤都不用做了,那数据的这个规模很容易就变大了。而且因为你现在的监督信号是一个文本,而不是像文中说的N 选一的标签,那模型的这个输入输出这个自由度就大了很多。第二个非常重要的点,也是说,正是因为你现在训练的时候,把这个图片和文字绑定。到了一起。那你现在学校这个特征不再单单的是一个视觉特征了,而是一个多。模态的特征。当你和这个语言联系在一起以后,你就很容易去做这种 Zero shot 的这种迁移学习了。但如果你只是做一种单模态的这种自监督学习的话,无论你是用单模态的对比学习,比如说MOCO,还是说单模态这种掩码学习,就是。Mae。你都只能学到视觉的这个特征,而无法和自然语言联系到一起,那这样呢?你还是很难去做这种 Zero shot 的迁移,所以总结下来就是说用文本监督信号去帮助训练一个视觉模型是非常有潜力的。
那可惜的是,如果你要去做这种文本和图片配对儿的学习,你就需要有一个足够大的数据集,里面就有很多很多这种图片文字堆儿。作者这里说已有的常见的几个数据集,就是有这个 MS Coco visual Gino 和这个YFCC。一百million。然后虽然前两个数据集它的这个标注质量非常。的高。但是它的这个数据量太少了,只有大概这个 10 万个训练样本,那跟现在大家对大数据集的这个期待,也就是说它这个 modern standard 相比而言,它就小。太多了。那像 GFT 300 million 有3亿个训练样本,然后 Instagram 那个数据集有三点儿 5 billion 就有 35 亿。个训练样本。然后对于这个 y f c 100 mini 数据集来说,你乍一看有一个亿好像很多,但是它的标注质量实在是太差了。它里面很多照片,这个配对的文本信息都是自动生成的。比如说很多时候它配对的那个文本信息就是这个照片。的名字。或者说是这个相机的一些参数,比如说焦距、曝光度什么,这种完全跟这个图片是对不上号文不对题的。那你如果用这样的配对去训练模型的话,肯定这个效果就不是很好,然后就有人去把这个数据集清理一下,但是发现经过清洗以后,这个数据集一下就缩小了 6 倍,最后就大概就只有 1500 万张图片了。作者说这个规模,那其实就跟 image net 差不多,当然这里的 Imagenet 指的可能是 image net 2122K,那他们也是有14。million 的图片。总之作者就是觉得即使是这个规模。也是不够大。应该达不到他想要的这种一鸣惊人的。效果。所以说不如自己动手,自己造一个。大数据集。那确实造这个数据集也是。物有所值。不光是孕育了像 clip 这篇工作,而且还孕育了 OpenAI 另外一篇 Dolly 的那个做图像。生成的工作。那最后 OpenAI 自己收集的这个数据集里面有。400 million。也就是 4 个亿的图片。文本,对儿。那这个是什么概念?那如果你跟之前图像那边儿最大的数据集 Google 的 GFT 300 million 数据集比的话,那比他们还多一个亿的训练样本,那如果跟 LP 那边比的话,作者这里说如果按照单词的数量来看的话,他们新收集的这个数据集大概跟训练 GPT two 用的那个 Web text 数据集差不多接近,所以应该是够。大够用了。他们就把最后这个数据集叫做WIT,也就是 Web image。text 数据集。
那有了超大规模的数据集,那接下来作者就在 2. 3 节讲了一下预训练的方法,以及他们是怎么选择这个预训练的方法的,他说视觉现在这边的模型都是非常大,训练起来都。非常贵。比如说之前这个工作,他就在 Instagram 那个数据集上去做预训练的,他训练了一个RESNACKS101,这个网络需要 19 个 GPU 年,就是说如果你用一块儿 GPU 的话,你要训练 19 年。然后另外一个工作,这个 Noisy student,也就是之前在 Imagenet 数据集上霸榜很久的那个方法,我们也提到过很多次了,它需要 33 个 TPUV 三年,也就是说如果你用一个 TPUV 三盒的话,你需要训练。33 年。总之就是说训练起来非常。贵。然后作者又补充。了一点。如果你去想一想,这两个系统还都是在预测只有 1000 类,就已经这么耗费。资源了。那他们现在不仅数据集更大,而且任务也更难,他们是要从自然语言处理里直接去学这种 open set of visual concept,就是直接去学这个开放世界里所有的这种视觉概念的。那就连 OpenAI 这种每次出手都是大手笔,感觉从来不愁计算资源的公司都觉得训练这个系统太吓人了。所以最后他们说经过他们一系列的努力,他们发现这个训练的效率对于这种多模态预训练的成功是至关重要。那作者他们做了哪些尝试?他们说首先他们试了一个跟 word text 这篇工作非常相似的方法,就是说图像那边他们用了个卷积神经网络,然后文本这边用了个。Transformer。然后都是从头开始训练的。那它的任务是什么呢?就是说给定一张图片,它要去预测这个图片所对应的那个文本。也就是这个图片的那个caption。那其实这个就是预测型的任务,但这个很好理解,因为 OpenAI 本来就是一家把任何事情都是 GPT 化的公司,从最开始的 GPT G P T 2 到 GPT 3,以及最近的Dolly,还有 image GPT 和open。i Codex。所有这些鼎鼎有名的大项目全都是基于GPT。来做的。唯有 CLIP 这个工作因为训练效率的原因选择了对比学习的方法。那作者接下来就解释一下为什么要用对比学习。他说因为如果你是给定一张图片,然后你要去预测它对应的这个文本的话,你是要逐字逐句去预测这个文本的,那这个任务就。太难了。因为对于一张图片来说,你可以有很多很多不同的描述,那比如说我们现在大家看到的这个画面,让不同的人去添加字幕的话,那有的人可能就会说这里是有一个人在讲。论文。那也有人可能说这个人穿的衣服是蓝色的,所以说这个文本之间的差距是非常巨大的。那如果用这种预测型的任务去预训练这个模型的话,它就有太多太多的可能性了,那这个模型训练的就非常。慢。所以作者接下来就说了一大堆对比。学习的好处。作者发现如果你把这个训练任务变成一个对比的任务,也就是说你只需要去判断这个图片和这个文本是不是一个配对儿?那这个任务听起来是不是就简单。了很多?因为我现在不再需要去逐字逐句地去预测这些文本了,那这个时候只要你这个文本和图片是配对的就行,这个约束一下就放宽。了很多。那其实这个监督信号想起来也更合理。然后作者把这个对比放到了这个图 2 里,那么发现仅仅把这个预测型的这个目标函数换成一个对比性的目标函数,这个训练的效率一下就提高。了 4 倍。那在图 2 里这条蓝线就是 OpenAI 这种 GPT 的模型,基于 Transformer 去做这种预测型的任务。中间这条橘黄色的线指的是一种 bag of words 的方式,它其实简单来说就是说你不用去逐字逐句地去预测这个。文本了。你的这个文本已经全局化的抽成了一些特征,所以说相应的这个约束被放宽了。那我们可以看到一旦这个约束放宽以后,立马这个训练的高效性就。提高了 3 倍。然后如果我们进一步放宽这个约束,就是不再去预测这个单词了,我只需要判断它是不是图片文本。对,也就是最后这里画的这条绿线就是 clip 用的这种对比学习的方式,我们会发现它这个训练效度又进一步的提高。了 4 倍。所以也就说明了基于对比学习的这种方法,它的训练非常高效。
那接下来作者就具体讲了一下 CLIP 所用的方法。之前我们在前言的时候也大概讲了一下,图一里就是这个 clip 模型的这个。总览图。那这里呢?我们直接过一遍伪代码,应该就对 clip 这个方法有更加直观。的了解了。
首先就是你有两个输入,一个是图片的输入,一个是文本的输入,那这个图片的输入这里的维度也已经都说明了,它是n,也就是这个 batch size 和 HWC 分别对应的。比如说 24 * 24 * 3,那文本的输入 t 这里头,当然这个 batch size 也是n,因为它跟这个 image 是配对的,那这个 l 就指的是序列场度。
那一旦你有了这两个输入,你就需要去通过这个编码器去得到对应的这个特征,那当然这里的编码器作者说它既可以是一个Resnet,也可以是一个 vision Transformer,那对于文本来说它既可以是一个CBOW,那就 back of visual words 也可以是一个。text Transformer。
然后在你得到对应的这个图像特征和文本特征之后,一般后面会有一部这个归一化。的操作。当然这里还牵扯到一个。投射层。那这个投射层的意义主要就是去来学习一下如何从这个单模态,然后变。到这个多模态。所以作者这里说这是一个合并的一个多模态的。一个特征。那当你投射完之后,再做一次这个 L2归一化,你就得到了最终的用来对比的这个特征 i e。和 t e。
那一旦你有了这两个特征,也就是说你有 n 个图像的特征,还有 n 个文本的特征,那接下来要做的就去算一下他们这个 cosine Similarity,那这个算得的相似度其实也就是最后你要用来。做分类的这个logic。
那一旦你有了你预测的这个logis,那当然接下来我们就需要。一个 ground truth。然后你这个 logist 就去跟这个 ground truth 做这个交叉熵目标函数,从而算得最后。的这个loss。
那这里我们可以看到它算这个 ground truth 用的是这个 a range function,那你得到的值就是从一开始 1234567 一直。到n。这个跟我们之前讲过的 MOCO 创建 ground truth 的方式是不一样的,因为对于 MOCO 来说,正样本永远都是在第一位,所以在 MOCO 那篇实现里,它的这个 ground truth 全都是零,因为只有在 0 这个位置,也就是第一号这个位置是正样本。但是对于 CLIP 来说,我们之前在图一里也说过,它的正样本全都是在对角线。上的。也就是说i,e,T,1,I2, T2 所有这些在对角线上的元素才是正样本。所以他就用这种形式去创建这个。ground truth。
然后接下来是很中规中矩的算两个loss,一个是 image 的,一个是text,一个对称。的loss。最后把两个 loss 加起来求。个平均。这个操作在对比学习这边是非常常见的,从最开始的same, clear 到B,Y,O,L,一直到最新的 MOCO V3 Dino,这些工作全都是用的这种对称式的。目标函数。
所以说当我们看完这份伪代码之后,我们就会发现 CLIP 真的很简单,它真的跟之前的对比学习没有什么区别,它无非就是把单模态的正样本换成了多模态的正样本。
接下来作者还讲了一些很有意思的细节,他说因为他们收集的这个数据集也实在是太大了,所以说这个模型的训练不太会有这种 overfitting 的问题,所以他们的实现就比之前的这个工作。要简单很多。比如说在他们训练 CLIP 这个模型的时候,对应的这个文本编码器和图片编码器都是不需要提前进行。预训练的。
然后第二个有趣的点就是在他们最后做这个投射的时候,他们并没有用这种非线性的投射层,而是用了一个线性的投射层。那这个线性非线性投射层我们之前在讲对比学习,尤其是 same player MOCO 这一系列的论文时候,我们讲过用这种非线性的投射层会比用线性的投射层带来将近 10 个点的这个性能提升是非常巨大的。但是作者这里说,在他们多模态的这个预训练过程中,他们发现这个线性非线性没什么大关系。他们怀疑这个非线性的这个投射层应该只是用来适配这种纯图片的单模态学习的。
然后也因为 open i 这个数据集实在是太大了,所以他们也不需要做太多的这个数据增强。作者这里说他们唯一用的这个数据增强就是一个随机的裁剪,其他所有那些 Fancy 的数据增强都。没有使用。
然后最后因为这个模型实在是太大了,数据集也实在是太大了,训练起来太耗时,所以说你不太好去做这种调参的工作。所以在算对比学习的这个目标函数的时候,我们之前在讲对比学习那些工作的时候,这个 temperature 这个超参数是个非常重要的参数,稍微调一调,这个最后的性能就会有很大的改变。但作者这里实在是不想调,所以就把它设置成了一个可以学习的一个标量。所以这个参数直接在模型训练过程中就被优化了,而不需要当成一个超参数,最后。再去调参。
那在文章的二点儿四节,作者主要就讲了一下,在视觉那边,模型既可以选择Resnet,也可以选择 vision Transformer。文本那边就是用的Transformer,模型的选择上都是非常中规中矩的,只有一些很小的改动,但这些改动一般都是为了训练得更高效,能让最后的性能再好一点,它并不影响整个文章的这个故事走向。所以这里我就直接跳过我们接下来看文章的 2. 5 节怎么训练。这些模型。
作者说对于视觉这边,他们一共训练了 8 个模型,有 5 个这个Resnet,有 3 个这个 vision Transformer,那这五个 rest net 里面有 rest 50 和 rest 101,就标准的,还有三个残差网络,它是根据 efficient net 这种方式去把模型里 channel 的这个宽度,还有模型的这个深度以及这个输入的大小都做了调整,从而得到了几个残差网络的变体。也就是他这里说的 Resnet 50 * 4, Resnet 50 * 16 和 Resnet 50 * 64 分别对应的就是原始的那个 Resso net 50,4 倍, 16 倍和 64 倍的这个更多。的计算量。那对 vision Transformer 来说,作者这里就选择了 VIt base 32 VIP base 16 和 VIt large 14。这里的 321614 分别指的是这个 patch 的大小,因为 VIT large 已经非常大了,所以就没必要再去把它变得更大了,而且如果你想要更大的模型,那 VIT huge, VITG 也都有,你直接用就完了。
然后作者说所有的这些模型都训练了这个 32 个 epoch ,是用 Adam 这个优化器去训练的。
然后对于所有的那些超参数,作者也简单的做了一些这个 grade search,或者说 random search 和手动的这个调整。但是为了让这个调餐调的快一点,所以在做超餐搜索的时候都是用的最小的这个 rise 50 去做的,而且都只训练了一个epoch,对于更大的模型来说,作者这里就没有再去调参了。
然后在训练的时候,作者选用的 batch size 是 3 万多,非常的大,之前SImCLR 的训练也无非就是说8192,所以很显然这个模型肯定是在很多很多的机器上去做这种分布式训练,而且混精度训练也是用到的,这样不仅能加速训练,而且还能省内存。混精度训练其实现在一个常见的操作了,基本上涉及 transform 的论文都会用,由于对于大部分任务来说,用混精度也不会掉点,有时候甚至。还能涨点。然后凭空又能省一半内存,训练速度也能大幅度增加,那为什么不用?
然后为了进一步的这个节省内存,作者还用了很多的技术,比如说:即使是最后在算这个相似度的时候,其实这个相似度的计算也是被分到不同的 GPU 上去做的。只有经过这么多工程上的优化,这个 CLIP 这个模型才能。被训练起来。
如果大家对这些工程上的细节感兴趣的话,我推荐给大家一篇很有用的博文,这篇博文的题目就是,如何在很多很多的GPU 上去训练这种超级大的模型。这个博文其实也是 open i 的一个员工写的,所以非常具备参考价值,写得也非常好。这个博主还有很多别的博客都是满满的。干货。
那最后我们来看作者说,对于最大的这个残差网络来说,这个 rise 50 乘以64,它在 592 个 V100 的 GPU 上训练了 18 天,而最大的这个 vision transfer model 在 256 个 V100 GPU 上只花了。12 天。所以确实是像 vision Transformer 那篇论文里说的一样,训练一个 vision Transformer 是比训练一个残差网络要。高效的。然后因为 vision Transformer 就是个 VIP large 14 表现最好,所以作者又拿预训练好的这个模型,再在这个数据集上又 fine tuning 了一个epoch,而且用的是更大尺寸的图片,就是 336 * 336 的这种图片,这种在更大尺寸上 fine tuning,从而获得性能提升是来自于这篇论文里的。对,最后作者就把这个模型叫做。这样。然后作者接下来说,如果没有特殊指明的话,接下来整篇文章剩下的二三十页,只要我们说到clip,其实都指的是这个最大。最好的模型了。那读到这儿呢,我们就把文章的第二章节看完了。我们现在已经知道 clip 这个模型是如何进行预训练,以及作者为什么选用对比学习来。预训练CLIP。
CLIP怎么预训练的?利用自然语言的监督信号,去训练一个比较好的视觉模型
总结(统一)之前的工作+把规模做大看看效果
之前的工作:想用文本做监督信号。为什么以前做不好呢?因为NLP那边的模型也不是很好学,Topic models和n-gram的形式都很复杂,不好做跨模态的训练,但是随着transformer和自监督的训练方式兴起,NLP那边彻底革命了:deep contextual representation,就是具有上下文语义环境的学习方式,比如bert用的完形填空。
在自监督的学习范式下,现在nlp模型终于可以用这种取之不尽用之不竭的文本监督信号了,所以训练出来的模型又大又好,不仅简单而且泛化的也好,这就为多模态的训练铺平了道路。
我们为什么非要用这种自然语言的监督信号来训练一个视觉模型呢?因为好处实在是太多了,其中两个最重要的:
结论:用文本的监督信号帮助去训练一个视觉模型是很有潜力的。
1、要做图片和文本配对的学习,就需要有一个足够大的数据集,里面有很多很多图片文本对。过去的数据集都不够大,质量不够好,所以自己造一个数据集wit,4亿个图文对
2、预训练的方法,以及如何选择预训练的方法.视觉这边的模型都非常大,训练起来都非常贵。过去的方法只是训练区预测仅仅1000个类,就已经需要训练数年。现在数据集更大,任务更难(从自然语言处理里直接去学open set of visual concepts,要去学开放世界里所有的视觉概念)训练效率对于多模态预训练的成功至关重要,作者做了一些尝试:图像CNN,文本transformer,从头开始训练,任务是给定图片 要预测图片所对应的文本。
为什么要用对比学习?如果给定一张图片,要去预测它对应的文本,是需要逐字逐句去预测文本的,这个任务就太难了。因为对于一张图片来说,可以有很多很多不同的描述,文本之间的差距是非常巨大的,如果用预测型的任务去预训练模型的话,就有太多的可能性了,模型训练的就非常慢。作者发现,如果把训练任务变成一个对比的任务,也就是说,只需要判断这个图片和这个文本是不是一个配对,这个任务听起来就简单了很多,因为不再需要逐字逐句的去预测文本了,只需要图片和文本是配对的就行,这个约束一下就放宽了很多。这个监督信号其实也更合理。
如图2,仅仅把预测型的对比函数换成对比型的目标函数(黄线→绿线),训练效率一下就提高了四倍;训练效率随着约束逐渐放宽在成倍的提高,也就说明基于对比学习的训练方法,训练效率是非常高的。
3、伪代码认识CLIP方法
CLIP的伪代码真的很简单,和之前的对比学习没有什么区别,无非就是把单模态的正样本换成了多模态的正样本。
46:23一些有意思的细节
怎么训练这些模型。视觉这边:训练了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
第二章总结:
那接下来我们就来读一下这个长达十几页的实验部分。那实验部分一开始作者先介绍了一下什么是 Zero shot transfer,因为这个才是 CLIP 这篇文章的核心和精华所在,那作者少不了上来还得再介绍一下他们为什么要这么做,就是他们研究 Zero shot 迁移的。这个动机。其实大概总结下来。就是一句话。就是说之前那些自监督或者无监督的方法,他们主要研究的是这种特征学习的能力,他们的目标就是去学一种泛化性比较好的特征,比如说我们讲过的 MOCO same clear that i know。但即使你学到了很好。的特征。如果你想应用到下游任务的时候,你还是需要有标签的数据去做微调。所以这里面就还牵扯各种这样的问题,比如说下游任务不好去收集数据,比如说有 distribution shift 的问题,那我们如何能够训练一个模型,接下来就不再训练或者不再微调了,所以这就是作者研究 Zero shot 迁移的这个研究动机。一旦你借助文本训练好了一个这个又大又好的模型之后,你就可以用这个文本作为引导,去很灵活的做这种 Zero shot 的迁移学习,至少在分类上效果都。非常的好。
那至于怎么用 CLIP 去做这种 Zero shot 的迁移,作者在这个 3. 1. 2 这一节里。大概说了一下。那文字还是不够直观,我们现在回到图一里去,再复习一下这个 Zero shot 的推理是如何做的。这个图一其实我们之前在前沿的时候已经介绍过了,这里我们再细致的过一遍,
当 clip 预训练好之后,其实它就有两个编码器,一个是这个图像编码器,一个是这个文本编码器,他们就都已经训练好了。
那这时候任意给你一张照片,比如说这里这张有狗的照片,那这个照片通过这个图片编码器就会得到一个图片的特征
那文本那边的输入应该是什么呢?那文本那边的输入其实就是你感兴趣的标签有哪些?比如说这里的标签,飞机、汽车、狗和鸟,我们暂且就用这四个词当作所有的标签。 那首先这四个词通过 prompt engineering 就会变成这一个句子,也就是说飞机就会变成这是一张飞机的照片,汽车就会变成这是一张汽车的。照片。所以说 4 个单词就变成了 4 个句子,那当你有了 4 个句子之后,你通过这个文本边的编码器就会得到 4 个文本的特征,
那这时候你拿着 4 个文本的特征去跟这一个图像的特征去算 cosine similarity,最后得到这个相似度,还会再通过一层 Softmax 得到一个概率分布。那这里哪个概率最大?也就是说哪个相似度最高,那它所对应的那个句子大概率就是在描述你这张照片,也就是说那个句子里所包含的物体,其实就是你这个图片里应该有的物体了。
那如果我们现在想一下,我们要给 imagenet里所有的图片去做这种推理,去测试一下模型的效果如何?我们这里会生成多少个句子?应该是 1000 个句子,因为你 Imagenet 有 1000 个类,所以说你对应的就会生成 1000 个句子。简单的来说就是说你每张图片你相当于都用 1000 个句子这样。去问。它,你是不是飞机?你是不是汽车,你是不是狗,你是不是人?问它 1000 次,然后它跟哪个文本最接近,那它就是哪一类。当然在文本端算这个特征的时候,并不是这种顺序进行的,它是可以批次进行的,所以说 CLIP 的推理还是非常高效的,它并不会慢。
那讲完了如何去做这种 Zero shot 的推理,那接下来就可以跑分了。所以说作者在 3. 3 里就去做了一下和之前最相似这个工作。 visual n grams 这个对比。作者说我们在表一里展示了一个非常惊人的结果,就是visual n grams 之前在 Imagenet 上这个效果只有 11. 5 的这个准确率,而 clip 已经达到了 76. 2,而这个 76. 2 的这个性能直逼之前的这个原版的 res 50,而且还是在完全没有用任何一张,就是那 128 万张训练图片的情况下,直接Zero shot 迁移就能得到76.2。
那现在我们来看一下表一, clip 和 visual n grams 的这个直接对比。我们可以看到 clip 是大幅度超越这个 visual ingrams,当然 Imagenet 上这个提升是最明显的,但是在剩下两个数据集上也都非常厉害。但是作者这里也指出了这并不是一个公平的对比,因为很多东西都不一样, CLIP 用的数据集比之前的那个方法大了十倍,而且用的这个视觉上的模型比之前要多 100 倍的这种计算。所以说相当于在训练上他们用了超过 1000 倍的这个资源去训练这个模型,而且在模型的架构上, clip 用的是Transformer。但是在 2017 年就 visual Ingrams 这篇论文发表的时候,其实 Transformer 这篇论文还没出现,所以作者这里其实想强调的就是这不是一个公平的对比,这也是对之前的工作show respect。
那接下来我们就来说一下大家比较感兴趣的这个三点儿一点儿四节,也就是 Prompt engineering 和ensembling。这个基于 Prompt 这个学习方法最近非常火,不论是在 NLP 还是在 CV 领域都非常的火。如果你还在找研究方向,其实这是一个不错的选择,因为它主要是在你做微调或者直接做推理的时候用的一种方法,而不是在预训练阶段,所以你不需要那么多的计算资源,但是因为效果好,所以说它的影响力也还是非常大。那这个 prompt 是什么呢? prompt 翻译过来它有很多的。含义。但是在这里它其实对应的这个中文含义是提示,它起到是一个提示的作用,也就是我之前一直说的这个文本的引导作用。
那我们为什么要做 prompt engineering 和 prompt assembling?作者这里举了两个比较常见的例子。第一个问题就是作者这里说的 policy 多义性,也就是一个单词可以同时拥有很多。的含义。那如果你在做这种文本和图片的匹配的时候,你每次只用一个单词,也就是标签对应的一个单词去做这种文本的特征抽取,那你就有可能会面临到这种问题。比如说在 Imagenet 这个数据集里,它同时包含有两个类,一个类是 construction cream,一个是cream,那在相应的语境下,这两个 Crane 所对应的意义是不一样的。在这种建筑工地环境下,它指的是起重机,而作为一个动物,它指的是鹤,就是单顶鹤那种鹤类动物,那这个时候就会有歧义性出现了,你算的这个相似度很有可能。就是错的。当然别的数据集也有这种问题,比如说他这里说 Oxford 这 pet 里面也有一类叫Boxer,那其实如果你只从动物的这个角度去理解Boxer,其实就指的是狗的一个种类。但是对于一个什么都不知道的文本编码器来说,你如果只把 Boxer 输给它,它很有可能就把这个词当成是一种运动员了,就是打拳击的,那它抽取的这个特征肯定。就不对了。这种多异性的情况其实我们之前在做 research 的时候也遇到过,在做物体检测的时候经常有一类叫做remote,它说的就是遥控器的意思。但如果你只把 remote 这个词给这个文本编码器来看,如果不加任何上下文语义信息。的话。它很大情况下就把这个 remote 理解成遥远的意思了。所以总之就是说,如果你只用一个单词去做 prompt 的话,会经常出现歧义性这种问题。
那另外一个问题我们之前也说过很多次了,就是在我们做预训练的时候,我们这个匹配的文本一般都是一个句子,很少是。一个单词。可是如果你在做推理的时候,每次都进来的是一个单词,那你这里面可能就会存在 distribution gap 的这个问题,你抽出来的特征可能就不是很好。
所以基于这两个问题,作者就想了一个非常简单的一个方式去做这种prompt。template。就是有这么一个提示的模板,也就是说把标签放在这里,然后我把它变成这么一个句子,所有的标签都变成了这是一个什么什么的图片。这样呢,首先它已经是一个句子了,所以就不太会出现这种 distribution gap 的问题。其次因为他说的是这是一张什么的图片,所以说后面这个标签一般多指的是名词,那上面歧义性的问题有时候就会解决了。比如我刚才说的这个 remote 的问题,那它就肯定指的是以遥控器,而不是指的遥远这个含义了。所以用上了这个提示模板之后,作者发现这个准确度一下就提升了。1。3%。而且这个模板非常的简单粗暴,所有的标签都是改成这样一种形式的句子。那当然 prompt engineering 不光是提供这么一个提示的模板,它还可以做很多事情。作者就发现如果你提前知道一些信息,那这样对 Zero shot 的推理是非常有帮助的。比如说当你知道你现在做的就是 Oxford pass 这个数据集的时候,它里面的类别肯定都是动物,所以你给出的提示就不光是说 a photo of,你还可以在后面再加一句话,一种宠物的类别,那这样呢?一下就把这个解的空间缩小的很小了,很容易得到一个正确。的答案。那同样的道理,对于这种实物的数据集,你就可以说这是一种实物,对于这种飞机的数据集,你就可以说这是一种。飞机。对于 Zero shot 的迁移都会非常的有用。作者这里还举例,就是说当你去做 OCR 这个任务,也就是说给定一个图片,去里面找文字数字这种任务,如果你在你想找的那个文本或者数字上打上这个双引号模型,就更明白你的意思了,他可能就知道你就是想找双引号里面的这个内容,这个结果也是相当有意思的。
最后作者就讲了一下 prompt assembling,就是说多用一些这种提示的。模板。我们做多次推理,然后最后把这个结果综合起来, example 一般都会给你。更好的结果。那作者这里到底用了多少个这个提示样本去做这个Assemble?在论文里他说用了 80 个,那我们现在就来 clip 的这个代码库里,看看他到底用了哪 80 个这种提示模板。具体的路径就是在 CLIP 这个代码库下面,按 notebook 里找到这个 prompt engineering 的这个。notebook,然后我们往下。拉就可以看到在第七个这个代码块里,作者就把这 80 个模板都列出来了,那之前我们说过就只用了一个这个提示模板,就是说这是一个什么什么的图片,那这里面我们就可以看到它加了很多的这种上下文的。修饰。去匹配各种可能出现的情况。比如他这里说这是一张有很多。东西的图片。那这个模板就适用于里面有很多物体的图片,那比如说这个模板 a photo of the hard to see,就是说很难看到,那这个就有可能适合于那些特别小的物体。然后还有很多很多,比如说这是一个大物体的图片,或者这是一个小物体的图片,这是一个干净物体的图片,这是一个脏物体。的图片。总之就是在前后加这些形容词,去让这个提示模板尽量的描述到每一个物体可能所处的环境。那在作者讲完了如何做 prompt engineering 和 assembling 之后,其实 clip 整体所有的方法都讲完了,包括数据集怎么选择模型,怎么去做预训练,怎么去做 Zero shot 的这种推理。整个的方法部分我们。都已经看完了。这个花了作者 7 夜半的篇幅,其实到这里结果就已经很好了,如果加上点讨论,加上一个结论部分,其实就是一个中规中矩的 8 页这论文投稿,但是作者觉得看官你别着急,你且看我再给你秀10。页的结果。
所以接下来在 3. 5 节,作者就大范围的在 27 个数据集上去衡量了一下 CLIP 做这种 Zero shot 迁移的效果。 1.作者接下来就把这 27 个数据集的对比结果放到了这个图里,这个图比较的双方一个就是做 Zero shot 的clip,另外一个就是在 rise 50 的特征上去做这种 Linear probe。 linear probe 我们之前在讲对比学习的论文时候已经反复说过了,它就是把一个预训练好的模型冻住,只从里面去抽特征,然后就训练最后那一层那个 FC 分类头层去做这种有监督的分类任务。那这里这个 rise 50 是在 Imagenet 上用有监督的方式训练好的一个模型,我们从中去抽特征,然后在这些下游任务上去添加新的分类头,然后在这个新类分类头上去做这种 linear probe 的。微调。作者这里是把rise 50 的特征上去做这种 Linear probe当成。了基线。如果 clip 模型比它表现得好,它就列在上面是绿色的,这些全都是加号,意思就是说 clip 模型相比于这个基线提升。了多少?那对于下面这些蓝色的,就是说 CLIP 模型相对于基线要降低了多少的性能?首先我们可以看到的是在 16 个数据集上,也就是在大多数据集上, Zero shot 的 CLIP 模型都超越了之前这种用有监督预训练好的 rise 50。这个结果是非常惊人的,因为它真的证实了 Zero shot 这种迁移也是有效的,是可以广泛进行应用的,而不是光在 Imagenet 或者某些数据集。上有作用。然后作者这里还做了一些总结,就是对于这种普通的给物体进行分类的数据集来说, clip 一般都表现得比较好,像这种车食物动作,或者是像 CEPH 20, CEPH 2100, Imagenet 这种普通的物体分类的数据集 clip 就能很好的去做这种 Zero shot。的迁移。这个也比较好。理解。因为如果你这个图片中有一个可以描述出来的物体,那对应的那个文本里应该也有这个物体的描述。所以它俩就会匹配得非常好。 CLIP 模型对这种物体也会比较敏感,但是对于更难的一些任务,更难的一些数据集,比如说 DTD 这种对纹理进行分类的数据。集。或者说 clever accounts 这种去给图片中的物体计数的任务,对于 CLIP 来说就非常的难,而且太过。抽象了。所以 CLIP 模型在这些数据集上的表现。就不好。因为对于这种难的任务,你完全不给他任何标签信息的话,这也有点强人所难了,所以作者最后也为 clip 打爆了个。不平。他说对于这种特别难的。任务。如果只做这种 Zero shot 的迁移可能不是那么的合理,有可能去做这种 few shot 的迁移会更合理。因为对于这种难的任务,比如说去给这种肿瘤做分类这种需要特定领域知识的任务,那即使是对于我们人来说,如果我们没有这个先验知识,我们也没法分类正确的,那为什么要去强求 CLIP 去在 Zero shot 的时候能正确分类呢?那既然作者提到了 few shot,作者觉得对于这些更难的数据集, few shot 会比 Zero shot 的衡量更合理
那为了自圆其说,作者肯定就得把 few shot 的实验。也都做了。所以在图 6 里作者就做了一下 Zero shot clip 和 few shot clip,以及和之前 few shot 那些方法的。一些比较。具体来说,对于之前的这些方法,就是用不同的方法去进行模型的预训练,然后当你训练好这个模型以后,我们就把这个模型的参数冻住,只从里面去抽特征做这种 Linear probe。那既然你是 Linear probe,你需要训练最后那个分类头的,所以你就需要下游数据集里有这种有标签的数据,这个就算是 few shot,那对于 clip 模型也一样。作者这里就是把 clip 里面那个图片的编码器拿出来冻住,然后去做这种 Linear 的probe。
图 6 的横坐标是说这个数据集里每一个类别里到底我们用了多少这个训练样本?那 0 就是说的 Zero shot 什么都不用,所以是对应的也就是Zero。shot 的CLIP。别的这些方法因为没有和自然语言的这种相结合,所以他们就没办法做 Zero shot,所以他们最低也得从one。shot 开始。就是你怎么着至少也得用一个训练样本,然后从 one shot 到 two shot, four shot,最后到。SIXTEEN shot。
那图 6 的纵坐标说的是 average score,也就是一个平均的分类准确度。那这个平均其实就是在刚才的 27 个数据集上去取得平均。当然这里其实是 20 个数据集,因为在有 7 个数据集里,它有些类的训练样本还不足。16 个。所以如果把那个数据集囊括进来的话,这个 16 这块的曲线就不好。画。了,所以作者就把那 7 个数据集。踢掉了。所以这里就只是做了 20 个数据集的这个平均。准确度。也就意味着这里的每一条曲线其实是 20 个数据集结果的一个合并,而并不单单是一个数据集。上的结果。
那从这张图里我们可以观察到好几个有趣的结论。那首先就是看这条蓝色的曲线对应的其实是 BIT 模型。 B I T 也是 Google 的一篇工作,叫 big transfer,它主要就是为迁移学习而量身定做的,所以它算是迁移学习或者说 few shot 的迁移学习里表现最好的工作之一。那在这里,这个 BIT 的模型是在 image net 21K 上去做预。训练。数据集也比较大了,所以说这条蓝色的曲线非常具有代表性,是一个很强的 base one。但是我们可以看到 Zero shot 的 CLIP 不用任何训练样本,直接就和你最好的这个 BIT 打成。平手了。可见利用自然语言的。这个威力。
那第二个比较有意思的点,就是说这条紫色的曲线。就是我们对 clip 里那个图片编码器,去做这种 feel shot 的linear probe。我们可以发现,在当这个训练样本只有1 2 或者 4 的时候,这种用了训练样本的 few shot 方式还不如直接去做 Zero shot clip,也就再次证明了用文本去做这个引导这种多模态的学习是多么的强大。
那最后一个观察就是随着这个训练样本的增多,那这个 feel shot 学习的这个CLIP,它的模型效果最后是最好,它不仅超越了之前的这些方法,验证了 CLIP 模型的强大,同时它还超越了这种 Zero shot 的CLIP,验证了作者刚才的说法。对于这种难的数据集来说,有一些这个训练样本还是非常有必要的。
那说完了 Zero shot,又说完了 few shot,那接起来很自然的就是要看一下如果下游任务用全部的数据 clip 的效果会如何。作者就在 3. 2 节里做了这些实验,之所以作者把这一节叫做特征学习,因为之前不论你是无监督还是自监督,这种表征学习的方法都是先预训练一个模型,然后在下游任务上用全部的数据去做这种微调的,所以这里如果你用上了全部的数据,其实就可以跟之前的这些特征学习的方式去做公平对比了。那如果下游任务用全部的数据,就有很多种方式去衡量这个模型学到的这个特征好不好。最常见的两种方式,一种就是 Linear probe,另外一种就是 fine tuning。 Linear probe 就是把预训练好的模型冻住,然后在上面再训练一个。分类头。那就对于 fine tuning 就微调来说,就是说把整个网络都放开,直接去做这种端到端的学习,微调一般是更灵活的,而且在你下游数据集比较大的时候,微调往往是要比这个 Linear Pro 的效果。要好很多。
但是在 CLIP 这篇文章里,作者说我就是要用 linear probe,我不用 fine tuning,这里它就列了几个原因。第一个原因就是说 CLIP 这种工作,它就是为了用来研究这种跟数据集无关的预训练方式的。那如果你的这个下游数据集足够大,然后我整个网络全都放开,在你这个数据集上去做微调的话,很有可能你预训练的那个模型并不好,但是在微调的这个过程中经过不断的优化,最后它的这个效果。也很好。这样你就无法分别你这个预训练的方法或者预训练的模型到底好不好了。而 Linear probe 就是用这种线性的分类头的方式,它们却不太。灵活。整个网络大部分都是冻住的,只有最后这一层 FC 是可以训练的,那它这个可学习的空间就比较小。所以如果你这个预训练的模型没有训练好的话,即使你在下游任务上训练的再久,也很难优化到一个特别好的结果,所以说能更准确的反映出这个预训练模型的好坏。那另外一个作者选用 Linear probe 的原因就是因为 Linear probe 不太用调参,因为 CLIP 这篇论文做了大量的实验,涉及了大量的数据集,那如果你是做这种端到端的微调,你就有太多可以调的这个套餐和。设计方案了。如果你这个下游数据集特别大,而且数据标注也质量比较高的话,你就希望你的这个学习率可能。会大一点。因为你想让这个预训练的模型尽可能地去拟合你下游的这个数据集。但如果你下游任务的这个数据集特别小,你可能就得用特别小的这个学习率,因为很有可能稍一学习,这个模型就过拟合了。总之,你得为每个数据集都去量身定做,就是你得去搜这个超参,才能在各个数据集上表现。好一点。但如果你是做 linear probe,你的这个模型主体都已经冻住了,你就是抽特征。你唯一要学的就是最后那个分类层,所以它可以调的这个参数。非常少。而且不论对于什么数据集,或者不论对于什么任务,只要是分类,那整个测试的流程就是一个正规化的流程,什么都不用改,所以大大简化了这个方法之间的对比。
那接下来作者就在这个图10里展示了一下结果。作者这里对比了很多的方法,从他们自己的这个clip,然后到有监督的这种 efficient net 还有用了伪标签的 efficient net,还有这种弱监督的在 Instagram 上训练的模型,还有最近大火的这种对比学习自监督学到的模型,以及还有一些经典的有监督学习的这些基线模型。左右两张图其实画的都是一个意思,它的横坐标都是说对于一张图片来说,它做一遍这个前向过程需要用多少的。计算量。然后纵坐标就是说在很多数据集上,它最后的这个平均。准确率。那所以说这个准确度越高,用的时间越短,它的这个效果就越好。所以说在这两张图里,越靠左上角点的这个模型,在精度和速度上的这个 trade off 就做得更好。
首先我们先看右图,作者就是把那 27 个数据集上的这个效果平均了一下。然后这里我们可以看到 clip 这里对应的这个红色五角星和这个红色的空气的五角星,效果都是最好的,比剩下所有的这些模型的效果都要好。这就再次证明了 CLIP 这个模型的强大之处,就不光是 Zero shot 还有 few shot,那在用全部的数据去做训练的时候, CLIP照样吊打别的。所有模型。
那左边这张图其实是为了跟之前的工作做一个公平对比,因为之前有个工作提出了这个 12 个数据集的一个集合,很多人就都在这 12 个数据集上去比这个平均的效果。那在这张图里我们可以看到用更大的模型就是用 vision Transformer 的这种 CLIP 效果还是。很好。使用残差网络的 clip 就比别的有些方法要差了。但作者这里想说的意思是,这 12 个数据集跟 image net 的关系很大,也就是说它们之间的关联性很高。所以如果你那些模型在 image net 这个数据集上做过有监督的预训练,那肯定它这个效果就。会特别好,超过CLIP。也就不足为奇了。
最后作者为了再次证明 CLIP 模型的这个无比强大,他就选择了之前在 image net 上表现最好的模型,也就我们之前常说的这个,用最大的 efficient net 然后用 noise student 这种方式,也就用伪标签的方式去训练的一个模型。他在 image net 上霸榜了快一年,有八十八点几的这个top。one 的准确率。那在这里作者就是把 clip 的模型和这个模型全都冻住,然后从他们里面去抽特征,然后最后去做这种logistic。regression。然后作者发现在 27 个数据集里, CLIP 在 21 个上面都超过了 efficient net 而且很多数据集都是大比分超过。那在那些表现不行的数据集上, CLIP 也只比 efficient net 稍微低一点,差距。并不大。
那讲完了, Zero shot few shot,我用所有数据去衡量这个模型的好坏,也就是说正规的任务我们做完了,那接下来就要衡量一下这个模型其他的特性了。那首当其冲的就是这个模型的泛化性,也就是它的稳健性。作者这里就在 3. 5 节讲了一下,当你这个数据有分布偏移的时候,CLIP内部的表现会如何。当然这个图我们在讲前沿的时候就已经提到过了,就是说当数据这个分布改变得非常厉害的时候,普通的一个模型它可能掉点就非常严重,但是对于 CLIP 训练出来的模型它就非常的。稳健。它在所有的这种数据分布上表现的都。非常好。鉴于时间关系,这里我就不展开了。
那在第二章作者讲完了这个怎么去做预训练,然后又在第三章讲了怎么去做这种 Zero shot 的推理,以及在各种环境、各个数据集上的表现。 CLIP 这篇论文的主体方法,而主要的实验结果其实就已经。讲完了。
那接下来的这十几页儿其实全都是讨论和分析。然后因为 CLIP 在 Zero shot, few shot 和在用所有数据集上的表现都非常亮眼,所以说作者在这个第四章节就做了一个很有意思的事情,就是说既然你这么强,那你跟这个人比一比,看看有什么相似和区别,那以及我们还怎么能继续提高这个。CLIP 模型。
那接下来我们就看这个第四节和人的这个表现。的对比。那这里作者其实就找了 5 个人,然后让他们去看这个 Oxford pass 这个数据集里的这个测试。图片。这里面其实就都是一些宠物了,主要就是一些细分的狗和猫的这种类,一共是 37 类。对于这种 Zero shot 的情况,作者也做了强调,说这些参加实验的人是不能去网上进行搜索的,而且他们也没有给这些参赛者看过这些狗和猫对应的这种类的示例。图片。然后作者他们还做了这种 one shot 和 two shot 的实验,那 one shot 就是给所有的这些参赛者每个种类看一张这种示例图片,告诉他这个种类的狗和猫到底长什么样,但是就一张,然后这种 two shot 就是。看两张。那我们来看看表 2 里这个对比的结果到底。如何。我们就只看一下这一列就可以了,我们可以看到 Zero shot CLIP 比这个 Zero shot 的人表现要好得多,那毕竟对于一个普通人来说,如果他对狗和猫的种类不是那么了解的话,那确实很难去做出这种 Zero shot 的分类。比如对于我而言,我知道狗的种类可能两只手就数得过来,肯定是不认识 37 种这么多的狗和猫的。然后一旦给这个参赛者看过一张这个示例图片以后,他们的这个准确度一下就从 50 多提升到。70 多了。这个提升还是相当明显的,就说明人的这个学习速度还是。非常快的。但如果你给这些参赛者每个种类再多看一张照片,就是这里的 too short 这种情况,结果你会发现这个准确度并没有提升,这个倒是挺有意思的,这说明人之所以在给一张图片以后准确率能提升这么多,主要是它可以把常识,它之前的这种先验知识和这个示例图片联合在一起做这种判断。那如果他没有系统的学过这些知识,就是说他的先验知识并没有增加的情况下,那你再多给他看一到两张图片,其实也是。于事无补的。他并不会真的随着这个数据的增加准确率。提升。但这里这个对比也不一定公平,因为毕竟只选了 5 个人作为参赛者,他这个代表性不太够,而且数据集也就只做了一个,而且狗狗猫猫这些图片在网上可能非常多,所以说 CLIP 的预训练数据集就有这些配对的图片文本。对,所以说它的这个准确率。才能这么高。但无论如何, CLIP 强大还是。很强大的。
然后作者还做了一个有趣的实验,他就把这些宠物的种类都列了出来,看了一下针对每一个类这些模型的表现到底如何。然后蓝色的点对应的就是 Zero shot 的clip,橘黄色的点就对应的是 one shot 的人,还有这个绿色就对应着Zero。shot 的人。这里其实真实的数据点是这些。点。然后这里的这个直线其实只是拟合过后的直线,只是为了方便读者看的。作者这里想说的意思就是说,对于 CLIP 这个模型来说难得类,对于人来说也很难。对于 CLIP 来说简单的类对于人来说也。简单。因为从图里来看,这些分类准确率比较高的这些类, CLIP 和人的这个准确度。都高。那对于分类准确度低的这些类来说, CLIP 和人的表现。也都低。这个也是比较。有意思。那很有可能还是一种现实生活中的这个数据分布有关系。那人类对于这种常说常见的宠物种类,它也自然就知道,就在它的常识范围里面。那 CLIP 因为这些在数据集里肯定也出现过,所以说它的这个分类准确度也高。
那在第四章作者简单讲完了这个和人类对比的实验之后,作者还简单的讲了一个章节,就这些数据集之间有没有这种重叠的问题,因为肯定会有很多人质疑,是不是因为你这个收集的数据集太大了。太好了。所以说他把这些下游的数据集全都包括了,所以才导致它的。效果这么好。那作者这里也简单的做了一些去重。的实验。最后的结论还是说 CLIP 这个模型本身泛化性。比较好。这里我就不过多介绍了,感兴趣的同学可以自己去看一下。
1、什么是zero-shot transfer
动机:
之前的自监督或者无监督的方法,主要研究的是特征学习的能力,目标是去学一种泛化性比较好的特征。但即使学到了很好的特征,如果想应用到下游任务上,还是需要有标签的数据做微调,所以还牵扯各种各样的问题:下游任务不好收集数据,分布偏移(Distribution shift) 【分布偏移在监督学习中一般指的是训练分布与测试分布不同,在离线强化学习中指的是训练策略与行为策略不一致。】那么如何能够训练一个模型,接下来就不在训练或者不再微调了呢?
一旦借助文本训练好了这个又大又好的模型,然后就可以用这个文本作为引导,去很灵活的做zero-shot的迁移学习,至少在分类上效果都非常好。
怎么用CLIP做zeroshot的迁移呢?
如果给imagenet里所有的图片去做zeroshot的推理,去测试模型的效果如何,那么1000个类应该生成1000个句子,如此去与图像特征算相似度,得到结果。当然,这个过程是可以分批次进行的,所以CLIP的推理还是非常高效的,不会非常慢。
提示工程:基于prompt的学习最近非常火,无论是在CV还是NLP都非常火,主要是在做微调或者直接做推理的时候用的一种方法,而不是在预训练阶段,所以不需要那么多的计算资源,而且效果好,所以影响力非常大。在这里,prompt指的是文本的引导作用。
为什么要做prompt engineering和prompt ensembling?
基于上面两个问题,作者就想了一个很简单的方式:做了一个提示模板prompt template “A photo of a {label}.”把标签变成一个句子。已经是个句子了就不会出现distribution gap的问题。因为这个模板的含义是:这是一个什么的图片,所以这个标签多指的是名词,就能解决歧义性的问题了。
作者发现用了这个提示模板之后,准确度提高了1.3%。
方法部分总结:
其实最后 CLIP 这篇文章我最想讲的一个章节就是这个第六章limitation,就是尽管你 CLIP 这个模型这么强大,你肯定还是有很多不足的地方,你肯定还是有很多做不了的事情,来分析一下这些不足和这些局限性其实比这篇文章到底怎么做的,之前那些好的结果是怎么来的,都要有。意义的多。因为这些不足和局限性才能引发更多的思考而让整个领域向前走,加上这个章节其实也是写论文很好的,或者说必不可少的。一个步骤。审稿人是很爱看的,而且现在有越来越多的审稿人去要求这个作者写一些他们的局限和不足。那接下来我们就来看一看作者写了哪些局限性和不足之处。
第一点,作者说 clip 在很多数据集上,平均下来看,它是可以和一个比较简单的基线模型打成平手的,也就是我们反复说的那个 image net 上训练的 rise 50。的模型。但是在大多数这个数据集上,这个 rise 50 的模型其实根本就不是 state of art,如果跟现在最好的那个模型比起来,这个 rise 50 要比 SOTA到差很远。那 Imagenet 也是如此, Clip Zero shot 就是 70 六点儿2,跟这个基线的 rise 50 打个平手。但是你要跟 noisy student 比,八十八点儿几,或者你跟最新最大的那个 vision Transformer 或者 Mae 比,都是8889,甚至都上 90 了,差。了十几个点。所以 CLIP 的这个性能强,但是也没有强到不可一世的地步。作者这里说文章中也做了实验,就是如果你加大这个数据集,而且加大这个模型,就是你去扩大这个规模,CLIP的性能是还能继续提高的。但是如果你想把这十几个点的差距都弥补上。作者预估你还要在现在训练 CLIP 这个计算量的基础上要乘以一个1000,那这个代价就太大了。作者这里说,即使对 OpenAI 来说,用现有的这种硬件条件他们也是没办法训练。所以如果你想走扩大 club 规模的这种方式去弥补这十几个点的差距,让 CLIP 在所有数据集上都达到 SOTA 的这个效果的话。那肯定需要有新的方法,然后在这个计算和数据的这个高效性上进行。进一步的提高。
那另外一个局限之处,作者就是说 CLIP在有些数据集上,它的这个 Zero shot 的结果。也并不好。比如在某些这种细分类的数据集上, clip 的效果也是低于这个有监督训练 rise 50 的基线网络的。另外不光是这种细分类的任务, playable 还无法处理这种就是特别抽象的概念,或者说更难的这些任务,比如说去数一数这个图片里到底有多少个物体,或者说在监控视频里区分当前这一帧是异常还是非异常。因为 CLIP 模型虽然很擅长去分类这个物体,但是他完全不了解什么叫异常,什么叫安全。作为作者最后总结说,他们坚信还有很多领域, CLIP 这个 Zero shot 的性能其实是跟瞎猜一样的,也就是说在很多情况下 CLIP 都不行,它并不是一个万能的方法。
那第三个局限性,作者说CLIP虽然说泛化做得很好,对于很多这种自然图像的这个分布偏移模型还是相对稳健。但是如果你在做推理的时候,这个数据真的跟你训练的数据差得非常远,就这个数据真的已经 out of distribution 了,那 CLIP 的模型泛化照样。也很差。作者这里举了一个例子,就是在 m nist 这个数据集上, CLIP 的准确率只有88%。那作者说这个就尴尬了,因为 m nist 这个数据集特别小,而且是几十年前就提出来的,随随便便一个分类器在上面都有 99% 的准确度,而且就连一个超级简单的一个极限模型。就这里说的是直接在这个像素点上去做 logistic ration,最后的结果就比 Zero shell 的 CLIP 还要高。这个在作者看来,甚至在我们读者看来,其实都是很不可思议的。一件事情。然后作者就深入地研究了一下,他就用各种去重的方法去看看他们搜集的这个 4 个 e 图片的数据集里,到底有没有跟 m Nest 相似的图片?结果发现非常神奇的是,即使他们的训练数据集有4亿个训练样本,但是就是没有跟这个 m Nest 数据长相,因为 m Nest 就是 123456789 这种合成的数据集,所以跟自然图像还是有很大。差距的。所以这就导致 m list 数据对于 CLIP 模型来说就是一个 out of distribution。的数据。所以这其实也就是从侧面反映了 CLIP 这个模型也。没什么大不了的。它跟普通的这些深度学习的模型都非常的脆弱。
然后第四个局限性,作者这里就说虽然 CLIP 可以去做这种 Zero shot 的分类任务,那它还是从你给定的那些类别里去做的选择,那相比而言一种更灵活的方式就直接去生成图像的这个标题,那这样的话一切都是这个模型在处理,所有的都自动化,它是可以给你生成一个新的输出的,而不是像 CLIP 一样,你得给它一个新的类别,然后它告诉你跟这个图片类似不类似。所以作者这里还是不忘 OpenAI 的老本行,还是想把一切都 GPT 化,都做成生成。式的模型。但可惜受限于这个计算资源的问题,他们没办法去训练一个图像题目生成的这个极限。网络。作者说以后可能会有这么一个简单的想法,就是说把这个对比学习的目标函数和这个生成式的目标函数。合在一起。那这样的话你就有可能把两个方法的优势结合在一起,就是既有了对比学习这个训练模型的这个高效性,又有了这个生成式模型的这个灵活性。
接下来作者又讨论了第五个局限性。就是说 CLIP 对这种数据的利用并不是很高效,就是它还跟别的这个深度学习里的网络一样,需要大量的数据。去投喂,作者这里形象的描述了一下他们这个数据集到底。有多大。那在他们训练的过程中,他们一共训练了 32 个。epoch。那每个 epoch 要过4亿个图片,所以说最后一共就相当于是跑了 128 亿张图片。那如果我们这个 data loader 的速度是每秒钟出一张图片,那这个模型要把所有的这些图片全看完,就需要花 405 年的时间,所以作者感叹说这用的数据实在是太多了,如果能减少一下这个数据用量,那当然是极好的。那怎么减少这个数据用量呢?简单一点儿的方式当然就是做数据。增强了。那另外最近还有两种比较常见的方式,一种就是用自监督的方式,另一种就是用伪标签的方式,这两种方式都能比监督学习有更好的这个数据利用效率。
那作者接下来说的第六个局限性还跟数据有关,但是是跟下游任务的这个测试。数据集有关。它的意思是说,虽然我整篇文章都在说 Zero shot, CLIP 做 Zero shot 的效果最好,但是在我们整个研发 CLIP 的这个过程之中,我们为了能跟别人去做这种公平的比较,也为了得到一些回馈,所以我们往往是在整个这个测试数据集上去不停的做测试。比如说 CLIP 这里 image net 上的分儿。这么高。它并不是第一次训练出来分儿就这么高的,它肯定是测试了很多变体,做了很多超参的调整,最后才定下的这套网络结构和这套超参数。而在整个这个研发的过程中,它其实每次都用 image net 这个测试集去做了指导,所以这里面已经无形之中就已经带入了偏见了,而且并不是真正的这种 Zero shot的情况。另外作者还说他们整篇文章里不停的用到 27 个数据集去做测试,但其实数据集千千。 one one 为什么只选这 27 个?这 27 个也不一定就具有代表性,所以整个 CLIP 的这个研发过程也是跟这 27 个数据集。息息相关的。那最后作者总结了一下,就是说如果能真的再创建一个新的数据集,而这个数据集就是用来测试各种各样的这个 Zero shot 迁移的能力的,那就太好了。如果只是像他们现在一样简单的重复使用已有的这种做有监督训练的数据集,就难免会有这种局限性。
那第七个局限性就是 open i 经常说的这个局限性了。对,因为他们的这个数据都是从网上爬的,不论是图片还是文字,那这些爬下来的图片文本对基本是没有经过清洗的,就是既没有被过滤过,也没有被审查过,所以这就导致最后学得的这个 CLIP 模型,它很有可能就带了一些社会上的这种偏见,比如说性别、肤色、宗教。所以作者这里还专门写了一个第7章,去讨论了一下 CLIP 模型有可能带来的这种巨大的社会。影响力。以及它模型里可能隐藏的这种偏见,有可能会带来的这种不当的使用。
那最后作者还提到了另外一个局限性,他就说虽然整篇论文他们都在宣传 CLIP 这个工作到底有多么的灵活,利用这种自然语言处理到底有多么。的牛逼。但其实它还是有局限性的,因为很多很复杂的这种任务,或者是很复杂的这种概念,其实即使用语言也无法描述的。如果你能在做下游任务,做这种泛化的时候提供一些这种训练样本还是非常有帮助的。但可惜 clip 这个模型的提出并不是为了 feel shot 的这种情况而提出的,也不是为了它优化的,所以就导致了一个非常奇怪的现象,之前我们也看过,就是当给 CLIP 提供了一些训练样本 one shot, two shot, four shot。的时候。它这个结果反而还不如直接用 Zero shot。这个就很耐人寻味了,你不给它提供训练样本,它反而效果很好。你给它提供。了一些训练。样本,它反而效果。还差了。那这个跟我们人的学习呢,就截然不同了,因为在第四个章节的时候,我们跟人的那个表现也。做过对比。如果你给这些参加实验的人就看一张图片,它这个分类的准确度最后都会。大幅提升。而不可能是说你给他更多的训练样本,那反而这个分类的准确度还下降了。所以说之后的这个工作。还有。很多,怎么能让 CLIP 既在这种 Zero shot 的情况下。工作的很好。也能在给他提供一些训练样本的时候,他 few shot 做的也很好。
那接下来在第七章,作者主要讨论一下 CLIP 模型对这个社会可能产生的这个影响力。它首先在 7. 1 节讲了一下模型可能内在的这种偏见,然后在 7. 2 节讲了一下 CLIP 在监控视频里的应用。和风险。最后在7。 3 节展望了一下未来工作。然后作者又在最后第八章讲了一下。相关工作。因为时间关系,而且因为后面的这两张跟文章的方法其实没有多大。的关系了。所以这里我就。跳过了。
我们最后直接去看一下这个。结论部分。结论部分其实写得非常短,像我之前说的一样,还没有最后的这个致谢写的长。因为实在是该讨论的都讨论完了,该做的实验也全做完了,如果这里要把结果再秀一遍,写。不下。所以说就只好简单的总结。一下了。作者这里说他们的这个研究动机,就是因为在 NLP 领域,现在利用这种大规模的数据去预训练模型,而且用这种跟下游任务无关的这种训练方式,比如说完形填空,但是两种工具的加持之下, NLP 那边取得了非常革命性的成功,比如就是 open i 他们自己的 GPT 三这。一系列工作。所以他们就想把 NLP 里的这个成功复制到其他的领域里去,比如说视觉。然后作者发现在视觉领域里用了这一套思路之后,确实效果也不错,其实是特别好,所以他还顺带讨论了一下有可能带来的这个社会的。影响力。接下来作者用一句话总结了他们的方法,那就在预训练阶段,他们就有这种。对比学习。他们利用了这种文本的提示去做了这种 Zero shot 的迁移学习。最后的结论就是说,在大规模的数据集和大模型的双向加持之下,CLIP的效果能跟之前精心设计的那些,而且是有监督训练出来的基线模型打成。平手。但是作者在第六章也讨论了很多这个局限性,所以说作者这里说还有很多可以提升。的空间。
那最后总结一下, CLIP 这篇工作最大的贡献,在我看来就是它打破了之前这种固定种类标签的范式。意思就是说不论在你收集数据集的时候,还是在训练模型的时候,你都不需要像 image net 一样做 1000 类,或者像 Coco 一样做。80 类了。你直接就搜集这种图片文本的配对,然后用无监督的方式,要么去预测它的相似性,要么去。生成它。总之是跟这种固定多少类别的范式。说拜拜了。这样的好处就是不仅在处理数据的时候更方便,训练几模型更方便,那最主要的就是在你做推理的时候更方便。甚至可以去 Zero shot 的做各种各样的分类任务。所以在 CLIP 这边工作出来之后,很快就有一大批工作迅速。跟进。那到现在为止,其实像物体检测、物体分割、视频动作识别检索,还有多模态,还有图像生成,基本上是每个领域都有利用 CLIP 的这个后续。工作。它的影响力可见。一般。 那如果我们按照木神之前讲的那个,如何判断一个工作的这些价值来说,在我看来应该就是 100 * 100 *。100。
从新意度的角度来说, CLIP 打破了这种固定类别标签的做法,彻底放飞了视觉模型的这个训练过程,引发了一大批后续的工作,所以信息度无疑是很高的,
那从有效性上来说,那就更不用说了,做了这么多数据集效果这么好,泛化性能也这么好,甚至在某些情况下比人的这个 Zero shot 的性能还好。那有效性也毋庸置疑。是 100 分儿。
最后就是问题大小,那 CLIP 用一个模型就能解决大部分的这个分类任务,而且是Zero shot 去解决。这个问题本身就已经很大了。更何况你只要利用这个 CLIP 训练好的模型。再在其他领域里稍微适配一下,就能把别的领域的任务也全都做掉。所以说它这个问题大小也是 100 分。
CLIP模型的这个灵活性和它的高效性能让我们看到一点儿这个人工智障变人工智能的希望。所以综合从这三个角度来看, CLIP 都是一篇价值极高的论文
那说了这么多 CLIP 有多么的方便,有多么的。灵活。但是口说无凭,我们现在就来实战一下,跑一个很简单的一个样例代码,看看 CLIP 模型是不是真的什么都能。做分类。那这里我就是开了一个 collab 的这个实例,底下的代码其实就是从 clip 官方的那个代码库里复制过来的。
那首先我们来安装。一下clip。
接下来我们把 clip 预训练好的模型。加载一下。这里面我们用的是一个 vision Transformer,一个。base 的模型。还不是 clip 论文里说那个最厉害的。
那装好了 clip 也加载完了预训练模型之后,我们就可以开始玩了。那首先就是找一张图片,这里面因为过年,所以说我去选了一个红包。的图片。红包这个物体肯定不属于 Imagenet 那 1000 个类。里面的。如果你拿 Imagenet 训练出来的模型,肯定是分不出红包。这个类的。那我们来看看 CLIP 模型行不行。
那这里我们先首先调戏一下模型,我们给的这个文字就是刚才 CLIP 论文里说的那几类,就是 Imagenet 那几类,跟红包是牛头不对马嘴的。
那接下来就是图片通过这个图片编码器得到一些图像的特征,
那文本通过文本编码器得到一些文本的特征,
然后接下来就是把单模态的特征投射到多模态的特征,同时做一下这个cosine similarity。
那最后我们就在这个相似度之上再去算一下Softmax。那哪个文本跟这个图片最相似,那我们就说这个图片是哪一类,
那我们现在就来跑,看一下。我们可以看到模型是非常困惑的,所以说他给这每一个类都分配了一些这个概率,因为他也觉得这红包这个类跟上面这几个类实在是差的太远。
接下来我们就不调戏模型了,那我们把红包这个类呢。给它加上。那现在我们再来跑一下,看看 CLIP 模型能不能。正确的分类。那 CLIP 模型果然是不负众啊,一下就识别出来了红包这个置信度有 83% 了。
那接下来我们还想再玩一下,看看 CLIP 这个模型到底是通过什么方式知道这张图片。是红包。那比如说我们现在把这个车换成红色,我们把这个鸟儿换成envelope,这里我就想看看是因为 CLIP 模型认出的是红色的东西,所以选择了。red envelope。还是说他认出了是个信封,所以选择了。red envelope。那如果我们现在把这个红色和信封都单独拿出来的话,我们来看一下模型。会怎么选择。结果我们发现 CLIP 这个模型还真是厉害,它还是能够准确的认识出图片是。红包。而不是说因为是红色的或者。是一个信封。它的这个置信度都已经达到。100%。丝毫不受影响。
那最后我。还想玩儿一下。就是看看 clip 这个模型到底有多强。那除了这些明显的特征之外,我们也知道红包一般就是用来拜年的,里面都是会塞钱的,而且基本可以说是中国特有的,所以那我现在把这些词都加上,看看 CLIP 模型能不能知道红包这张图片也能对应到这些。概念上来。那么现在把飞机改成钱,红包改成 New Year,然后再在后面加上一个。China。这次我们来看一下,那我们再次发现 CLIP 模型还是非常坚定了选择了红包,这个置信度还是接近。于100%。
那如果我们现在把红包这个选项。去掉。CLIP又会怎么选?再跑一次这个结果就很有意思了,他现在置信度全都跑到最后跑到中国上了,他甚至没有选这个红色的,也没有选。这个信封。他知道红包是跟中国这个概念紧紧的结合。在一起的。所以说他就。分配给了中国。但是虽然这个分类结果很有趣,说明他学到这个特征非常好。但如果光从这个分类角度来看,我觉得是不是还是应该分给这个信封?
不足之处,分析局限性
结论
研究动机:在NLP领域,用大规模的无监督数据去预训练模型,而且用和下游任务无关的训练方式(完形填空),在这两种工具的加持下,NLP那边取得了革命性的成功(gpt3)。他们想把NLP里的这种成功复制到其他领域去。
然后他们发现把这套思路用到视觉里,确实效果很好。然后他们还讨论了一下社会影响力。
一句话总结他们的方法:预训练阶段做了对比学习,利用文本的提示做了zeroshot的迁移学习,
结论:在大规模的数据和大模型的双向加持下,CLIP的效果能和之前精心设计的那些,而且是有监督训练出来的基线模型达成平手,但还有很多可以提升的空间。
CLIP最大的贡献:打破了之前固定种类的范式,也就是不论在收集数据集还是训练模型的时候,都不需要像imagenet那样做1000类或者像coco一样做80类了,直接搜集图片文本对,然后用无监督的方式,要么去预测相似性,要么去生成它,总之就是和固定类别的范式说拜拜了。这样不仅处理数据更方便,训练模型更方便,最主要的是在做模型推理的时候更方便,甚至可以去zeroshot的做各种各样的分类任务。