上一篇的链接:多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer (qq.com)

上上一篇的链接:多模态MLLM都是怎么实现的(5)-Backbone, Unet or Transformer?从0搭建一个SD (qq.com)

上上上一篇的链接:多模态MLLM都是怎么实现的(4)-去噪声 (qq.com)

上上上上一篇的链接: 多模态MLLM都是怎么实现的(2)-DDPM (qq.com)

上上上上上一篇的链接:多模态MLLM都是怎么实现的(2) (qq.com)

上上上上上上篇的链接:多模态MLLM都是怎么实现的(1) (qq.com)

       很难想象一个系列写了7篇,我现在目前最多的就是深度学习从入门到不想放弃系列,那个还没写完,深度学习从入门到不想放弃-7 (qq.com) 但是那个是基础啊,可见多模态MLLM还是一个很跨学科,很复杂的门类。

      上节我们讲了Dit,其实就是基本搭建了Sora骨架了,现在我们要加一些血肉(feature),让它变得活灵活现起来

      Sora是做视频生成的,首先我们思考一个问题,视频是什么和图像是什么关系,其实视频就是连续的图像,那我要做一个视频生成的模型,先决条件是不是我要有视频的encoder和decoder?

      OK,所以我们今天先理解下,怎么给视频encoder,如果要你来你会怎么设计,是每一帧都自己做encoder吗?这个不是不行,但是你这么做失去了最重要的一个信息,视频帧的时序性,就是前一帧和后一帧的关联,那要跨多个帧来做encoder?怎么做呢?

       第一个论文被引入,ViViT,[2103.15691] ViViT: A Video Vision Transformer (arxiv.org)

        ViViT有两种编码模式:

       第一种叫Uniform frame sampling:

多模态MLLM都是怎么实现的(7)-Sora_模态

      就是视频里面你先通过Vit去编码,然后取N*M个patch,然后你再取K个帧,最后得到了一个[N,M,K]形状的Tensor(要是我,我就选这个,看着就简单)

第二种叫Tubelet embedding:

多模态MLLM都是怎么实现的(7)-Sora_ide_02

      如上面的图所示,第二种方式是更3D的,是从输入整体中以时空方式取得不重叠的立方体,将VIT的embedding扩展到3D形式,形状是[W,H,T](W,H,T取实际取值,不是最大值)

       回到Sora官网这个图,我们基本可以判断它采用的ViViT的Tubelet embedding的模式,当然我们上节课讲过了一个1024*1024的照片我处理都费劲,更别提视频了,所以肯定要先把视频文件先给Tubelet embedding,然后再过一道类VAE的处理,然后给所有的encode出来的所谓时空编码,原文叫spacetime pathes,放到隐空间形成Latent,然后Latent在训练加噪解噪,或者推理解噪。

多模态MLLM都是怎么实现的(7)-Sora_ide_03

       OK,第一个知识点介绍完了,我们进入下一个环节。

       我再提一个问题,如果用过SD1.5的同学可以来回答我,为什么训练的图片要裁剪成一样的,或者尽量裁剪成512*512?

       我在前面的文章里其实也故意埋了个彩蛋,不过没人发现

多模态MLLM都是怎么实现的(7)-Sora_语言模型_04

,也没有人来问。

多模态MLLM都是怎么实现的(7)-Sora_模态_05

      其实这东西很好理解,你可以理解为语言模型的外推性差不多,因为一个batch进去的sequence就那么多,做不完就要截断。所以你放进去一样分辨率的图片训练,至少能保证你放进去的那些图片是你选的,然后期中的内容,比如人物,景色,尽量居中,或者按着你的想法在图片上排布,不过你想过没有,如果你要把图像分辨率生成不规则或者不是你训练的那样的呢?

多模态MLLM都是怎么实现的(7)-Sora_ide_06

       答案是就会发生左边这种图的现象,其实你们以前如果玩过SD1.5的大概深有体会。

       那么第二个论文被引入:NaViT 2307.06304.pdf (arxiv.org)

  

多模态MLLM都是怎么实现的(7)-Sora_ide_07

      这个论文我很喜欢,因为它的思想具备通用性,其实不只是对图片,对NLP也一样生效。

      简而言之,先看最下面一层,我在数据给到网络的时候拿到的就不是一样size的图片(你做NLP不是一样长的句子也行),然后进行Patch化,同时在这一步,它就做了dropout为了增加模型的鲁棒性。

      然后你这3张图片的patches被一个线性层吧,我们姑且这么理解,给拉齐到一维的向量,如果你定义的向量最长长度太长,还得加点pad,这个没啥可说的。

      好玩的来了,我虽然被拉到了一个向量里,这里面我加了2层(实际上是多层,逻辑上2层)mask过的线性层,一个是self-attention层(但是只算QK),一个是pooling层(QKV之前的pooiling),虽然这三个图的patches都在一个向量里,但是因为mask的存在,我们还是能各算各地,比如算1就mask2和3,然后最终完成QKV的计算,还能保证虽然大家在一个向量里,可是分别计算,没有混乱。

      NaViT也是大家对Sora比较惊艳的所谓可以生成各种尺寸的视频能力的基础。

多模态MLLM都是怎么实现的(7)-Sora_模态_08

      Sora这么能耐,还有一点,在视频其实没体现出来,其实这个也是Dalle3的一大武器"GPT-4",这个feature叫re-captioning

      简单说就是Recaptioning大道至简,就是训练一个image captioning模型将原来的text prompt进行优化,生成描述更加详实的文本,本质上是一种NLP思路,NLP CloseAI有GPT-4,不服是不行的。

多模态MLLM都是怎么实现的(7)-Sora_ide_09

     例如你说"画个海龟游泳",GPT-4马上给你渲染一下,看下图。

多模态MLLM都是怎么实现的(7)-Sora_模态_10

就是这个意思

多模态MLLM都是怎么实现的(7)-Sora_语言模型_11

,你出来的prompt就是牛B,画的也肯定详细。

 Sora的feature基本在7个文章里都介绍全了,那么我们开始组装Sora!

多模态MLLM都是怎么实现的(7)-Sora_语言模型_12


1- 我有一个traing vedio到达了,然后我有4帧

2- 4个帧我给resharp成一个matrix

3-  进入 Sora的VE,我们就当是VAE(其实这块也是可以讲的,但是压缩算法它没公开,是不是VAE不知道,但是肯定也差不多的思路),好玩的来了,它这个VE特别逗,正常我们知道如果如果你一个2行的矩阵要和一个4行4列的矩阵来做矩阵乘,一定是要是2行4列的才行,对吧,但是它特别有意思,VE做了个2行5列的矩阵,前4列参与计算,最后一列是作为偏移值的会加入到最后的计算结果,这个设定,也很正常,不过对于bias的使用,我们以前刚神经网络入门的时候都加bias,所谓的为了多样性,如果大家看多了网络,发现大部分的网络都不太用bias了,当然也没那么绝对。我个人不去讨论好与坏,一定是人家经过多次实验得出的结论,我们姑且按这个看,后面的矩阵运算也基本都是在最后一列是一个偏移值的列,还有另外一个好玩的点是,这一步做完了还直接来个Relu,因为Relu只有正数部分,所以如果是负数的矩阵运算+偏移,最后都会变成0。

     

4-  加入噪音进来

多模态MLLM都是怎么实现的(7)-Sora_语言模型_13

 5- 这个时候看右边,要操作condition部分了,首先定义跑几步,比如跑3步,那这个step3就用2进制11来表示,然后它和prompt"Sora is sky"被encode成的text embedding来做矩阵乘。

6- 得到的这个结果要被一个liner mask矩阵(最后一列也是偏移),这一步的目的是要得到Scale和Shift,这块看不懂的看第六节课DiT部分,这个列向量的上半部分[2,-1]是scale部分,下半部分[-1,5]是shift。

7- 然后左右变量的cross-attetion就开始了,要把左边的被加过噪声的latent和这个scale相乘然后相加shift得到一个加了条件的噪声过的latent

多模态MLLM都是怎么实现的(7)-Sora_语言模型_14

8- 加了条件的噪声过的latent,然后做QK

9- 这一步就做pooling了,第8步和第9步和上面描述的NaViT是一样的操作。

10-过FFN(最后一列还是偏移),通过FFN预测出来了噪声,主要啊,我预测出来的是噪声,可不是加噪声的latent,这块没看懂的去看第四节DDPM加噪,去噪部分

多模态MLLM都是怎么实现的(7)-Sora_ide_15

11- 然后把你预测的噪声和原始的噪声做对比,求一个MSE的Loss(这块居然不是cross-Entropy

多模态MLLM都是怎么实现的(7)-Sora_ide_16

)求完了梯度再反向传播回去进入下一个step....

12- 这快就是推理部分了,我之前也讲过VAE或者叫VE的encoder-decoder可以独立于Dit训练,所以在训练的时候是不用VE的decoder参与进来的,推理它就得来了,这一步就是用加了噪声的Latent减去预测的噪声得到去噪了的Latent

13- 这一步就是拿纯净的lantent去被VE的decoder解码,解码出来一个matrix,这一步做完了,也拿Relu把负值给滤掉了

14- 和第1步的操作正好是逆操作,把矩阵重新排列成一帧一帧的patches,重组成video。

      全文完!

       

       写在最后。

       我写东西本来也慢,也不愿意一天一写完。到此我写了快2个月的多模态MLLM都是怎么实现的,就结束了,我其实本来没那么着急写,第一是因为之前写分布式训练的原稿被M365给吞了,我就生气。正好那时候Sora发布了,我就顺手借着Sora把整个多模态的训练,推理,feature都讲完了,大家如果认真看过就会发现Sora并没有什么特别多的技术上的创新,这和OpenAI一直以来的风格也是比较相似的,就是守着Transformer,然后遵守scaling law,一顿Scale,直到训出来涌现的产生,这条路被证明是可行的,相比于其他瞎折腾的模型,不知道高几个档次。

       现在arxiV上的论文成天那么多,每天都给我推,看着都挺猛,一用都挺拉,这其实也给大家一个启示,有时候按照既定的路线做好细分的每一步,不折腾,不冒进,反而能得到最好的结果。

      另外说一个所谓世界模型的问题,说到这就得讨论什么是世界模型,统计模型到底算不算世界模型。我个人认为也算,比如你小时候对一个字记住怎么写,那不也是你多次接触的结果吗?尤其语言模型本身就是人类知识的大成者,按杨丽坤说的,非得所谓东西都是无监督学习就是世界模型,是站不住脚的(再说CasualLM本来pretrain时候也是无监督的)。世界模型就是对这个物理世界的认知,本身就有好多方式,不见得一定是无监督,只要你对这个世界的客观规律认知是正确的就好,无所谓是不是概率模型,这是我的看法。也正是因此,由于有GPT-4的存在,它贡献了无数的牛B prompt也就是label,加上很好的video数据做监督的train,Sora诞生就有了一部分世界模型的特征,也因为有GPT-4的recaption让它对客观世界描述更准确,更具体,更物理。

      最后说一下Sora的大小,也正式因为Sora的监督学习的,我可以负责任的告诉大家不到30B,甚至可以压缩到10B,拿Sora冲算力的想法我觉得没必要,100到几百块卡的规模足够了,别忘了它周边有多少东西都是独立于它训练的,比如VE,比如GPT。

       

多模态MLLM都是怎么实现的(7)-Sora_模态_17