上一篇的链接:多模态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)

      上文我们聊了一下怎么实现Stable Diffusion。

      这节课我们讲一下怎么从Stable Diffusion到Difussion Transformer

      上节课我们说到了一个SD简单的大概长这样。

多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_生成模型

       #细心的读者可能注意到了,右边输入的图为什么是512*1

       再复习一下SD架构,它不是一个模型,我们要训练的地方一共有3个:

  • Text Encoder负责文字的理解
  • VAE 负责把图片从像素空间转向了隐层空间Latent
  • Backbone的部分负责加噪,解噪
       
          这节课我们先做第一个事情,把Unet换了...
          为什么换Unet有很多的说法,CNN的前朝遗老,扩展性差,性能差啥的,其实归结起来就一个原因:Scaling Law
          这也是为什么现在张嘴先用Transfomer来做的原因,通过增大模型的深度和大量数据的scale up,当到达一个临界点,它的训练效果就不是线性的了,是指数性的提升,想了解Scaling Law的看这个文章:
    小周带你读论文之语言模型的进阶Scaling Laws 幂律,(参数/数据量/算力的最优解) (qq.com)       
         那么现在模型变形了,变这样
  • 多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_归一化_02

  •         有人说我看过论文原图,长这样。

  • 多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_模态_03

  •       其实这两图长得没区别,只不过原图把VAE的部分(也可以不用VAE),就是隐空间加解压的部分没画进去而已。
          我们也可以按着它的论文图来讲,这次要从下往上看,而且是一个推理的过程:
  • 左边灰色部分是隐空间的输入(加了噪的Latent或者小图,形状是32*32*4)然后经过Pathify,就分成了不同的Patches了,类似NLP里面句子的分词和token化。
  • 右边蓝色的部分就是关于被加噪的latent要被生成什么样的解析率,什么样的内容的图片(视频)的描述,包括要跑多少个step,然后过文字的Token化,这部分也是我们之前讲过的所谓Condition,条件项
  • 然后我们进入到了Dit Block,它的扩展图,我们一眼就看出来了,又见面了,Transfomer,和它实在是太熟悉不过了。感兴趣得可以看我的Transformer的文章:小周带你读论文-2之"草履虫都能看懂的Transformer老活儿新整"Attention is all you need(1) (qq.com)


  • 关于条件注入Dit它原始有4种我们讲图上的3个,按图中的顺序从左往右:


  1. adaLN-zero:引入额外的MLP层,这个MLP层和所有的归一化LN层都有互操作,这么做的目的是为了啥呢? 除了回归 γ 和 β 之外,还回归维度缩放参数 α,这些参数在 DiT 块内的任何连接之前生效,是为了模仿残差网络中的有益初始化策略,以促进模型的有效训练和优化。(最新的SD3也是用这个,Sora估计也是用)
  2. Cross-attention:将两个 embedding 拼接起来,然后在 transformer block 中插入一个 cross attention,将 embedding 作为 cross attention的 K 和 V;要引入的额外计算量最大
  3. In-context conditioning:将latent和文字 embedding 作拼接,类似 ViT 中的 cls token,实现起来比较简单,不消耗额外算力。(最low,但是自己训练玩没毛病,简单)


      剩下的就没啥可解释了,一顿操作从上面出来一个均值和方差,分布出来了,图片也就生成好了。

      这个除了Transformer以外也没看出来比原来的Unet有太多的区别,那么怎么能评测你的这个要比原来的Unet好呢?

      今天最后一点内容,我们讲一下多模态,尤其是视觉模块的评测方法,生成图像这玩意就很玄学,你又不能像NLP任务一样找个数据集去打分,谁来定义你生成的像不像呢,那我们今天就介绍一下常用的生成模型评测方法FID。

多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_归一化_04

      这slide已经写的不能更明确了,就是找个预训练的CNN(或者其他模型)来把你生成的图片和原始图片放里面做representation,然后softmax给我个比率,越符合交叉区域,证明你的模型训练的越好。

     独木难成林,所以我们也不能只用FID,第二个验证的方法, clip score

多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_模态_05

       这个看着也不能更好的理解了,之前我们在这个系列第一节就讲过clip,clip是个巨量的图和文字对应的训练模型,所以,你把你的文字和想要的图片一起输入进clip去,clip给你判断个距离,肯定根据远近决定你的生成是否优秀。

多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_归一化_06

      FID-10K,就是每10万张的图片的FID的测试结果,我们发现它还有clip score这两个评测值,都主要和两个因素最相关,一个是encoder的size,encoder这里指的是文字encoder,所以Dalle3和Sora为啥牛B,因为有GPT-4当encoder,虽然不是直接当,这个下节课讲。这也是我不遗余力的强调,NLP是王道和核心,其他都是锦上添花。

      另外一个是U-net size,其实正确的说是网络的size,网络的size越大,效果越好,所以你明白了为什么要用Dit,为什么Dit要把Unet换Transfomer了吗?

      

多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer_模态_07