大家好,上个礼拜FacebookMetaAI刚刚开源了他们自己的一个语言的大模型,叫做LLAMA,这个LLAMA的模型有65billing的参数,效果自然是不错的。他们的目的也是想让这个大模型更加的亲民,能够让更多人拿到这个模型的参数,有可能就能直接应用到他们的领域中去了,是一件非常好的事儿。他们分别开源了四个模型,从小到大就从有这个70亿、130亿、330亿和650亿参数量,这四个模型。但这里面比较有意思的一个点,就是他们虽然管自己叫这个large language model LLM但事实上在这篇博文里,他们管他们自己的LLAMA叫做smaller models,就是他认为他们自己是小模型。这个其实就看和谁比了,如果和GPT3175billion比,或者和Google的palm这个540billion比,那这个66billion确实是小了一个数量级,但其实66billion已经比我们平时用的大多数模型都要大很多倍了,基本上很少有人能够去训练这些上10亿参数的模型,就更不用说产品部署了。这些大模型对于大部分研究者来说其实是可望而不可即的,那自然语言处理那边,我们已经知道大模型已经是主流,模型越对越大了那计算机视觉这边肯定也不甘落后,也就在两周前,这个Google又推翻了自己之前最大的这个vision transformer,又推出了更大的这个VIT,有22billion的参数,那现在视觉也算是有了自己的这个大模型了。之前不论是Google,他们自己推出的这个vit-g就有两billion,还是说他们这个pali,还有就他这里写的这个chen2022这个多模态的工作里提出的vit-e,还有这个4billion的模型都是刚上10亿,然后这回这个VIT一下就到了220亿。所以终于能跟这个language这边保持差不多的这个模型大小了,那这个效果自然也是不用说,各种各样的视觉任务都能做,而且效果都很好。那眼看这个科研进步的速度越来越快,不仅每天可能都有这种立意比较新的这个论文出来,而且之前的模型也是越做越大,现在这些模型都成了系列,动不动就是V1、V2、V3,所以是一代比一代大,一代比一代强,所以我看很多小伙伴经常在这个视频下面留言,而现在这个模型方向已经卷的都玩不动了,还有什么别的方向可以做呢?还有同学可能说现在很多工作都是大力出奇迹,那如果我没有这个大力,我该怎么出奇迹?或者还有很多同学就问,马上要开题了但是实验室又没有那么多计算资源,该怎么样选择一个合适的研究方向呢?那其实面对进步如此之快、竞争如此白热化的这个科研领域来说,你说你不慌肯定是假的。
那今天我就抛砖引玉用自己参与过的一些不那么需要计算资源的项目来跟大家讨论一下,如何在有限的计算资源内做出一遍让自己比较满意的工作,如果大家有别的更好的想法,也欢迎在视频下方留言,大家一起交流,一起进步因为我做的方向一般比较偏视觉或者多模态,所以今天要分享的工作,也都是偏这些领域的。那今天主要会提到四个方向:
- 第一个方向就是因为你没有那么多的计算资源,所以你肯定是要往这个efficiency上去做的,所以这也是最直白的一个方式,就是哪里慢我就让它哪里快起来,哪里太heavy了,我就把它变得lightweight一些,总之就是让所有的这些方法变得更efficient一点。在这里我们举的一个例子就是用最近比较火的这个PEFT的这个概念,就是parameter efficient finetuning去如何做这个大模型的微调
- 那第二个方向就是能不做Pretraining就不做Pretraining,能借助已有的东西,那就尽量借助已有的东西,比如说别人已经预训练好的模型,那不用白不用,那clip出来之后就有那么多那么多几百、上千篇论文出来,直接就调用clip的模型去做各种非常有意思的应用,这些都很有impact。同时可以选择那些比较新的研究方向,这样能避免有很多的这个竞争者,而且也不用天天想着如何去刷榜,能够全心全意投入到自己喜欢的科研工作之中。
- 那第三个方向,就是尽量做一些通用的,能够Plugandplay,就是即插即用的这种模块儿。那这个模块儿其实不光是说模型上的这种模块儿,它有可能也是一个目标函数,一个新的loss,它有可能也是一个data competition的方法,总之就是一个很简单的东西,但是能够应用到各种领域的。那这个方法的好处就是说你只需要选很多很多的baseline,然后在一个你能承受的这个setting之下去做这个实验,因为它是公平对比,所以这就已经足可以说明你方法的有效性了,而不需要你真的在特别大的数据集上,用特别大的模型去证明你的有效性。
- 那最后一个方向就是比如说构建一个数据集,然后或者做一些以分析为主的文章,或者写一篇综述论文那这个方向是最不需要计算资源的,但同样非常有这个影响力因为你给整个领域都提供了一些非常新颖的见解,同时也能让你自己对这个领域的理解加深一些。
1 使用parameter efficient finetuning去做模型的训练
所以上这些都是我认为比较有用,而且不那么耗费资源的研究方向那我们先来看一下今天第一篇要讲的工作,就是如何使用parameter efficient finetuning去做这个模型的训练。这个是我们最近刚中的一篇iclr23的论文,叫做AIM: ADAPTING IMAGE MODELS FOR EFFICIENTVIDEO ACTION RECOGNITION,是用来做这个视频动作识别,也就视频理解的一个工作。视频理解其实我们之前也讲过很多期了,从最开始的双流网络到后面的这个I3D网络,后面又讲了视频理解上,视频理解下,基本是把最近几年比较耳熟能详的视频理解的工作都提了一下。
那我们先来看一下这篇文章的图一,其实就是回顾一下之前的那些视频理解的工作都是怎么做的,
其实简单一点,粗略一点来分类的话。大部分之前的工作都可以被划分为两类
一类就是这个时间上和空间上的处理尽量分开来做,另外一类就是时空一起来做。那如果画的这张图里来表示,就往往是说我们先有一个很大的这个图像的数据集,我们先去做一个预训练,得到一个image的模型,比如说这里就是一个,比如说在imagenet1k上训练过的一个rise50的模型,或者说是在一个imagenet21K上训练的一个VIT或者swing的模型。总之这里面就是一个已经预训练好的一个图像的模型,那接下来要么就是你在这个已经有的这个图像模型之上去单独的增加一些这个时序处理的模块,比如说在TSN里他就把这个视频p成几段,然后最后去把这些视频抽出来的特征做一下加权平均那在TSM里,作者就是把这个模型的特征在这个channel维度上进行来回的这个shift,从而去模拟这个时序建模,那或者说在最近的使用Transformer来做视频理解的工作里,像timesformer,那就是先做timeattention,然后再做这个specialattention,就把这个specialtemporal劈开来做。所以大致上就可以总结为是在一个已有的图像模型之上,加了一些这个时序处理的模块
那另外一系列工作就是这个时间空间的特征,我要一起学。那当然这里面主要就是这个3D网络,比如我们之前讲过的这个I3D或者说像Transformer时代的这个video swing,那就把2D的这个shiftedwindow变成了3D的shiftwindow总之输入是3D的,模型也是3D的,是一个joint modeling的过程
所以大致就分为这两类。那之前的这些方法虽然说效果上都非常的好但是他们都有一个小小的问题,就是这个计算代价实在是太大,因为他们的这些模型全都是需要fullfinetuning的,就是整个模型所有的参数都要拿下来,在这个视频数据集上去做这个finetuning但是本身视频数据集就比较大,这个数据的io一般又有bottleneck,然后这些模型本身也比较大,所以这个训练的cos非常昂贵,一般左边这种时间和空间分开的方法还好,可能就是说如果你有一台8卡机,可能就是三四天、四五天就能完成一个模型的训练,当然如果你的backbone特别大的话,可能也需要一周或者10天的时间,总之稍微能轻量一些。但是对于这种joint的video model比如说大部分的3D网络或者这个videoswing的模型,他们的训练时间就非常感人了,当然这些模型还好,因为他们利用了这个预训练的这个图像模型,所以说白了他们更多的还是在做一个finetuning那如果像视频领域里有一些模型是从头开始训练,纯formScratch那这些模型就需要更长的时间了啊,比如说像maskfeet或者videoMae这些最近的自监督的这个视频学习方法,他们的训练代讲都是以周为计算单位的,一般情况下想要复现他们的模型都很困难,更不要说是提出什么新模型去比他效果更好了。
所以我自己一直想做的一个方向就是如何把这个视频理解做得更亲民,然后有更多的玩家,然后可以让这个领域更加蓬勃的发展,所以之前在组里做过这个gluon CV,视频里的开源,也写过一篇综述的论文,最近也准备在这个视频数据集上下功夫。但这篇文章主要的这个研究动机还是来自于CLIP,因为当时在20年的时候,这个对比学习很火,我自己也很痴迷于对比学习,所以一直想的就是能不能做一个很大的这个视频数据集,然后在上面用纯视觉的方法对比学习,然后训练出来一个很好的这个视频的特征。但是后来正在做的过程中,CLIP21年年初的时候就出来了,当时一看这个效果确实是太厉害了,它里面也做了这个视频动作识别UCF101和这个connect700的这两个数据集,直接zeroshot效果就非常好。虽然说这两个数据集比较specialheavy,之前我们也说过,就是这两个数据集比较偏重于这个物体的识别和这个背景的识别,就是说他不太看重这个时序性,就如果他看到一个视频里有一个篮球,那他就说十有八九这个动作就是打篮球了,他不太会是别的动作。所以这种视频数据集就是一般用这个图像的模型,也能做得很好所以这就解释了CLIP作为一个图像模型,它也能做这种视频动作识别的任务,但即使如此CLIP的效果还是好的出奇,也给了我一些启发,我主要想的一个问题就是,到底这个已经训练好的这个图像模型需不需要再finetuning?也就是这里面这个image model需不需要再去微调它?这里面有几个原因首先第一个原因就是CLIP已经证明了,就是即使Zeroshot它的效果就很好Zeroshot就是模型不变,我直接在各个数据集上所推理,所以它已经部分验证了这个假设,就是如果一个已经训练得很好的一个图像模型,我们可以直接从它里面抽,这个视觉的特征应该是比较具有泛化性,而且随着这个时代的进步,随着大家都在讨论这个foundation model我当时就在想以后的这个视觉模型,这个视觉的foundationmodel肯定是越来越好,越来越大了,那也就意味着它里面抽出来的特征肯定是越来越具有泛化性,而且越来越有效的。所以从有效性的这个方面来讲,当有了一个极其强大的已经预训练好的这个图像模型之后,我们可能就不需要finetuning这个部分。那另外一个原因也很好理解,就是为了防止这种灾难性遗忘,就是说如果你已经训练好了一个特别大的模型,它的参数量也非常多,那这个时候如果你的这个下游数据集没有很好的数据,或者说没有很多的数据,你硬要去finetuning这个大模型的话,往往你是finetuning不好的,要么就是直接overfit了,整个模型就不能用了,要么呢就是即使你能在你现在这个下游任务上表现得很好,但是它有了灾难性遗忘,就是它之前的很多大模型有的这种特性全都就丢失了,它的泛化性可能也丢失了,这也是得不偿失的一件事情。
所以说从这两个主要的方面去考虑,我当时就很想尝试这条路,就是说当拿来一个非常大、非常有效的这个image model之后,我能不能直接就把它的这个模型参数锁住,然后在它上面加一些这种时序处理的模块,或者加一些新的这个目标函数啊?综之就是通过修改周边的方式来让这个模型具备这个时序建模的能力,从而让一个图像模型能直接做这个视频理解的任务,而不需要从头再去训练这么一个视频模型,省时省力。所以21年的时候其实就已经写了这么一个proposal,不过当时也没有想好什么可以用的这个很好的周边改动的方式,而且手头上还有几个别的正在进行的项目,所以就迟迟没有动手做这个工作,一直到22年年初,就是从21年年底开始很多基于Prompt工作,然后到22年初这个visual prompttuning VPT的出现,再让我感觉到这个方向如果再不做就来不及了。所以就赶紧去学习了一下这个prompt tuning以及这个prompter efficient finetuning这一系列的各种方法,好在其实这个prompterefficientfinetuning它一点儿都不难,不论是形式上还是理解起来都不难。
Adapter和prompt tuning Adapter
我们接下来就可以稍微过一下其中两个比较普遍的方法,Adapter和这个prompt tuning Adapter最早来自于这篇2019年的论文,最早的时候就是用来做NLP。最近其实我们可以看到很多视觉这边或者多模态这边用的这个技术都是从NLP那边过来,原因就是因为大家都用transformer做backbone了。所以说那之前在NLP那边工作的一些方法,大概率在这边也是能work的,所以说就能很好的迁移过来,比如说这些parameter efficient finetuning的技术,或者说最近比较火的这个incontext learning,还有InstructGPT里那个RLHF,这些基于reinforcementlearning的方法都会快速的被运用到视觉里面,而且我觉得以这个视觉这个卷的速度很快,这个视觉的community就能反哺回这个NLPcommunity了那Adapter究竟是什么呢啊?其实Adapter很简单这是一个下采样的FC层,所以说这里你看这个feature从多变少,然后再过一层这个非线性的激活层然后再经历一层fitforwardupproject,就是一个上层硬的FC层,然后就结束了好,当然这里还有一个residualconnection,这个其实就是Adapterlayer,它就像一个即插即用的模块一样,可以插到这个consumerlayer里的任何一个地方那像2019年这篇工作的时候,它就是先在这个attention后