好,那么好

多模态MLLM都是怎么实现的(1)_模态

, 今天开始陆续写点多模态内容,没想好是不是要写个专栏(因为我之前挖的坑太多...),然而还是开了,今天先写点基础做个seed

       有想了解一下多模态扫盲的读者,可以自己先看看这篇论文

       2311.13165.pdf (arxiv.org)

       说是论文其实没什么干货,当多模态介绍看看是可以的(BTW现在感觉在aixV上水论文真的容易,我越来越想找人一起水一篇了,有兴趣的请联系我)

       我先按照我自己的思路给大家过一下

      MLLM(Multimodal Large Language Models)即多模态的大语言模型,顾名思义,这个还是以大语言模型为基础的

       那怎么个多模法呢?从我这总结主要是2点:

1-Encoder,decoder的多模

2-多模融合

       

       我们从一个简单的多模态CLIP讲起

       CLIP也是OPENAI的模型,现在也被广泛的应用于各种多模态的业务场景里,本身是开源的,又是挺重要的分类器,你们使用的多模态模型或多或少都用了它的代码和概念

       我们先看它是怎么实现的,看下图

多模态MLLM都是怎么实现的(1)_模态_02

      首先我设计一个矩阵,矩阵的行方向,我是由一个Text-encoder来生成的,它把我的训练数据(一堆关于下面图片的描述)给encoder成向量,Text-Encoder我们可以拿GPT啊,拿BerT做都行

然后呢,我有一系列图片,这些图片和上面的图片描述是对应的,同时有一个image的的encoder,这个encoder也会把图片的高维数据,压缩成一个向量,Image-Encoder我们可以拿ResNet,VGG, ViT都行

      如上图所示,第一个文本T1和一堆图片Ix的向量做内积,最大的那个就是I1T1,第二个也是如此I2T2,一直到InTn,相乘了一个矩阵的对角线,我们其实就是训练这个对角线就完了,这个就是特征融合

      既然要训练,那我们的目标函数F(I,T)是什么呢?很显然它的目标就是矩阵对角线都是1,其他的位置全是0


多模态MLLM都是怎么实现的(1)_模态_03

      在推理的时候,你比如给一个zero-shot就给一只狗的图片,过了image encoder以后,就等着和上面的text-encoder下来的那个向量做点积。然后直接取最大的那个,就能得到一句话"a photo of a dog", 就完成了一个简单的图片分类的任务

      Tips,和传统的什么resnet的训练方式不一样,你不用定义正负样本,只需要标准文本图像对,正负样本是在batchsize里面随机得到的,1和0么

     训CLip的话,batchsize挺重要的:

      第一:bacthsize不能太小,因为我没正负样本提前规划,所以如果你训练太小的话,你对角线跑不出来,比如你给了文字,你没给够足够的图片,文字知道像你的东西是啥,但是不能理解不像你的东西是啥,那自然训练效果就不好,说白了就0少

     第二:batchsize大,但是你分类任务设置的太小,比如即使你batchsize是100,但是你分类任务就2个(猫,狗),有可能你这100个也捞不出来几个负样本,所以你训练效果还是不好

     CLip比传统的分类方式好处在哪呢?

     

多模态MLLM都是怎么实现的(1)_CL_04

      看上图,比如你就拿真实的水果图片去做训练,然后拿Resnet和CLIP来PK,同样的都是真实水果图片的场景来推理,他俩其实差不多,CLIP也没看出来好,但是,随着你图片越来越抽象,ResNet的准确率下滑的就不是简单的线性了,甚至指数的下跌,这就是训练方式不同导致的CLIP显示出来的优势从另外的角度解读就是:

      它的泛化能力特别强

      支持新类别的拓展

      支持新类别的拓展是什么意思呢?因为它对图片来讲是点积得到的吗,我举个例子,你说 A women walks on a street 和 A girl walks on a street, 这两句话虽然不一样,但是women和girl的余弦距离本来就没那么大,所以你拿一个girl的图片来让只见过"women"的CLIP分类器来分类,一样能给你分出来


多模态MLLM都是怎么实现的(1)_点积_05

       如果给数据化的比较,Resnet和CLIP比起来更惨不忍睹,仅限0样本prompt的前提下,所以各位做Resnet的CV同学不要骂我,我标注了前置条件

       还一个值得说的就是工程化的小Tips:

       下图我框成红框的这两个部分和对角线矩阵是松耦合的,所以意味着完全可以独立离线计算,大家别一起占用算力,等你想要上线的时候两个encoder一架起来,再开始算对角线就可以了,也能实现算力版的"分时复用"

       

多模态MLLM都是怎么实现的(1)_点积_06

        说了CLIP这么多NB的地方,辩证的看问题,下面说说他的缺点:

1-CLIP zero-shot性能虽然比ResNet要好,但是很多任务上是比不了ResNet里的SOTA的,比如他没见过的task,例如计算图中对象个数,分出相邻车辆的距离,它就完全没戏

2- OCR一直不行

3- 新的概念,如拿网络用语来做匹配,它理解不了,这块其实如果要弄得重新pretrain了,而且text-encoder要用更强的模型来做了,甚至GPT-4同级别

       第一天先写这么多吧,我最近事多,码子效率也不高,后面陆续更新吧,可以写写算法和架构上可以写写diffusion,模型上可以讲讲VIT,Deit,nextGPT,dall-E,Gemini,GPT4V, 我知道你们现在就想看,我非得后面写

多模态MLLM都是怎么实现的(1)_点积_07

多模态MLLM都是怎么实现的(1)_模态_08

多模态MLLM都是怎么实现的(1)_CL_09


       

    

多模态MLLM都是怎么实现的(1)_CL_10