视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet

cover

视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet

真没想到,举例视频生成上一轮的集中爆发才过去三个月,没想OpenAI一出手,该领域又直接变天了自打2.16日OpenAI发布sora以来,不但把同时段Google发布的Gemmi Pro 1.5干没了声音,而且网上各个渠道,大量新闻媒体、自媒体(含公号、微博、博客、视频)做了大量的解读,也引发了圈内外的大量关注,很多人因此认为,视频生成领域自此进入了大规模应用前夕,好比NLP领域中GPT3的发布一

​编辑 v_JULY_v  ·  2024-02-18 22:49:27 发布

前言

真没想到,距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月,没想OpenAI一出手,该领域又直接变天了

  1. 自打2.16日OpenAI发布sora以来(其开发团队包括DALLE 3的4作Tim Brooks、DiT一作Bill Peebles、三代DALLE的核心作者之一Aditya Ramesh等13人),不但把同时段Google发布的Gemini 1.5干没了声音,而且网上各个渠道,大量新闻媒体、自媒体(含公号、微博、博客、视频)做了大量的解读,也引发了圈内外的大量关注
    很多人因此认为,视频生成领域自此进入了大规模应用前夕,好比NLP领域中GPT3的发布
  2. 一开始,我还自以为视频生成这玩意对于有场景的人,是重大利好,比如在影视行业的
    对于没场景的人,只能当热闹看看,而且我司大模型项目开发团队去年年底还考虑过是否做视频生成的应用,但当时想了好久,没找到场景,做别的应用去了

可当我接连扒出sora相关的10多篇论文之后,觉得sora和此前发布的视频生成模型有了质的飞跃(不只是一个60s),而是再次印证了大力出奇迹,大模型似乎可以在力大砖飞的情况下开始理解物理世界了,使得我司大模型项目组也愿意重新考虑开发视频生成的相关应用

本文主要分为三个部分(初步理解只看第一部分即可,深入理解看第二部分,更多细节则看第三部分)

  • 第一部分,侧重sora的核心技术解读
    方便大家把握重点,且会比一切新闻稿都更准确,此外
    \rightarrow  如果之前没有了解过DDPM、ViT的,建议先阅读下此文《从VAE、扩散模型DDPM、DETR到ViT、Swin transformer》
    \rightarrow  如果之前没有了解过图像生成的,建议先阅读下此文《从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion》
    当然,如果个别朋友实在不想点开看上面的两篇文章,我也尽可能在本文中把相关重点交代清楚
  • 第二部分,侧重sora相近技术的发展演变
    把sora涉及到的关键技术在本文中全部全面、深入、细致的阐述清楚,毕竟如果人云亦云就不用我来写了
    且看完这部分你会发现,从来没有任何一个火爆全球的产品是一蹴而就的,且基本都是各种创新技术的集大成者(Google很多工作把transformer等各路技术发扬光大,但OpenAI则把各路技术 整合到极致了..)
  • 第三部分,根据sora的32个reference以窥探其背后的更多细节
    由于sora实在是太火了,网上各种解读非常多,有的很专业,有的看上去一本正经 实则是胡说八道(即便他的title看起来有一定的水平),为方便大家辨别什么样的解读是不对的,特把一些更深入的细节也介绍下

总之,看本文之前,如果你人云亦云的来一句:sora就是DiT架构,我表示理解。但看完全文后你会发现

  • 如果只允许用10个字定义sora的模型结构,则可以是:潜在扩散架构下的Video Transformer
  • 如果允许25个字以内,则是:带文本条件融合且时空注意力并行计算的Video Diffusion Transformer

推荐内容

第一部分 OpenAI Sora的关键技术点

1.1 Sora的三大Transformer组件

1.1.1 从前置工作DALLE 2到sora的三大组件

为方便大家更好的理解sora背后的原理,我们先来快速回顾下AI绘画的原理(理解了AI绘画,也就理解了sora一半)

以DALLE 2为例,如下图所示(以下内容来自此文:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion)

  1. CLIP训练过程:学习文字与图片的对应关系
    如上图所示,CLIP的输入是一对对配对好的的图片-文本对(根据对应文本一条狗,去匹配一条狗的图片),这些文本和图片分别通过Text Encoder和Image Encoder输出对应的特征,然后在这些输出的文字特征和图片特征上进行对比学习
  2. DALL·E2:prior + decoder
    上面的CLIP训练好之后,就将其冻住了,不再参与任何训练和微调,DALL·E2训练时,输入也是文本-图像对,下面就是DALL·E2的两阶段训练:
    \rightarrow  阶段一 prior的训练:根据文本特征(即CLIP text encoder编码后得到的文本特征),预测图像特征(CLIP image encoder编码后得到的图片特征)
    换言之,prior模型的输入就是上面CLIP编码的文本特征,然后利用文本特征预测图片特征(说明白点,即图中右侧下半部分预测的图片特征的ground truth,就是图中右侧上半部分经过CLIP编码的图片特征),就完成了prior的训练
    推理时,文本还是通过CLIP text encoder得到文本特征,然后根据训练好的prior得到类似CLIP生成的图片特征,此时图片特征应该训练的非常好,不仅可以用来生成图像,而且和文本联系的非常紧(包含丰富的语义信息)

    \rightarrow  阶段二 decoder生成图:常规的扩散模型解码器,解码生成图像
    这里的decoder就是升级版的GLIDE(GLIDE基于扩散模型),所以说DALL·E2 = CLIP + GLIDE

所以对于DALLE 2来说,正因为经过了大量上面这种训练,所以便可以根据人类给定的prompt画出人类预期的画作,说白了,可以根据text预测画作长什么样

最终,sora由三大Transformer组件组成(如果你还不了解transformer或注意力机制,请读此文):Visual Encoder(即Video transformer,类似下文将介绍的ViViT)、Diffusion TransformerTransformer Decoder,具体而言

  1. 训练中,给定一个原始视频X
    \rightarrow  Visual Encoder将视频压缩到较低维的潜在空间(潜在空间这个概念在stable diffusion中用的可谓炉火纯青了,详见此文的第三部分)
    \rightarrow  然后把视频分解为在时间和空间上压缩的潜在表示(不重叠的3D patches),即所谓的一系列时空Patches
    \rightarrow  再将这些patches拉平成一个token序列,这个token序列其实就是原始视频的表征:visual token序列
  2. Sora 在这个压缩的潜在空间中接受训练,还是类似扩散模型那一套,先加噪、再去噪
    这里,有两点必须注意的是
    \rightarrow  1 扩散过程中所用的噪声估计器U-net被替换成了transformer结构的DiT(加之视觉元素转换成token之后,transformer擅长长距离建模,下文详述DiT)
    \rightarrow  2 视频中这一系列帧在上个过程中是同时被编码的,去噪也是一系列帧并行去噪的(每一帧逐步去噪、多帧并行去噪)
    此外,去噪过程中,可以加入去噪的条件(即text condition),这个去噪条件一开始可以是原始视频X的描述,后续还可以是基于原视频进行二次创作的prompt
    比如可以将visual tokens视为query,将text tokens作为key和value,然后类似SD那样做cross attention
  3. OpenAI 还训练了相应的Transformer解码器模型,将生成的潜在表示映射回像素空间,从而生成视频X'

你会发现,上述整个过程,其实和SD的原理是有较大的相似性(SD原理见此文《从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion》的3.2节),当然,不同之处也有很多,比如视频需要一次性还原多帧、图像只需要还原一帧

网上也有不少人画出了sora的架构图,比如来自魔搭社区的

1.1.2 如何理解所谓的时空编码(含其好处)

首先,一个视频无非就是沿着时间轴分布的图像序列而已

但其中有个问题是,因为像素的关系,一张图像有着比较大的维度(比如250 x 250),即一张图片上可能有着5万多个元素,如果根据上一张图片的5万多元素去逐一交互下一张图片的5万多个元素,未免工程过于浩大(而且,即便是同一张图片上的5万多个像素点之间两两做self-attention,你都会发现计算复杂度超级高)

  1. 故为降低处理的复杂度,可以类似ViT把一张图像划分为九宫格(如下图的左下角),如此,处理9个图像块总比一次性处理250 x 250个像素维度 要好不少吧(ViT的出现直接挑战了此前CNN在视觉领域长达近10年的绝对统治地位,其原理细节详见本文开头提到的此文第4部分)

  2. 当我们理解了一张静态图像的patch表示之后(不管是九宫格,还是16 x 9个格),再来理解所谓的时空Patches就简单多了,无非就是在纵向上加上时间的维度,比如t1 t2 t3 t4 t5 t6
    而一个时空patch可能跨3个时间维度,当然,也可能跨5个时间维度

    如此,同时间段内不同位置的立方块可以做横向注意力交互——空间编码
    不同时间段内相同位置的立方块则可以做纵向注意力交互——时间编码
    (如果依然还没有特别理解,没关系,可以再看下下文第二部分中对ViViT的介绍)

可能有同学问,这么做有什么好处呢?好处太多了

  • 一方面,时空建模之下,不仅提高单帧的流畅、更提高帧与帧之间的流畅,毕竟有Transformer的注意力机制,那无论哪一帧图像,各个像素块都不再是孤立的存在,都与周围的元素紧密联系
  • 二方面,可以兼容所有的数据素材:一个静态图像不过是时间=0的一系列时空patch,不同的像素尺寸、不同的时间长短,都可以通过组合一系列 “时空patch” 得到

总之,基于 patches 的表示,使 Sora 能够对不同分辨率、持续时间和长宽比的视频和图像进行训练。在推理时,也可以可以通过在适当大小的网格中排列随机初始化的 patches 来控制生成视频的大小

DiT 作者之一 Saining Xie 在推文中提到:Sora“可能还使用了谷歌的 Patch n’ Pack (NaViT) 论文成果,使其能够适应可变的分辨率/持续时间/长宽比”


当然,ViT本身也能够处理任意分辨率(不同分辨率相当于不同长度的图片块序列),但NaViT提供了一种高效训练的方法,关于NaViT的更多细节详见下文的介绍

而过去的图像和视频生成方法通常需要调整大小、进行裁剪或者是将视频剪切到标准尺寸,例如 4 秒的视频分辨率为 256x256。相反,该研究发现在原始大小的数据上进行训练,最终提供以下好处:

  1. 首先是采样的灵活性:Sora 可以采样宽屏视频 1920x1080p,垂直视频 1920x1080p 以及两者之间的视频。这使 Sora 可以直接以其天然纵横比为不同设备创建内容。Sora 还允许在生成全分辨率的内容之前,以较小的尺寸快速创建内容原型 —— 所有内容都使用相同的模型

    图片

  2. 其次使用视频的原始长宽比进行训练可以提升内容组成和帧的质量
    其他模型一般将所有训练视频裁剪成正方形,而经过正方形裁剪训练的模型生成的视频(如下图左侧),其中的视频主题只是部分可见;相比之下,Sora 生成的视频具有改进的帧内容(如下图右侧)

    图片

1.1.3 Diffusion Transformer(DiT):扩散过程中以Transformer为骨干网络

sora不是第一个把扩散模型和transformer结合起来用的模型,但是第一个取得巨大成功的,为何说它是结合体呢

  1. 一方面,它类似扩散模型那一套流程,给定输入噪声patches(以及文本提示等调节信息),训练出的模型来预测原始的不带噪声的patches「Sora is a diffusion model, given input noisy patches (and conditioning information like text prompts), it’s trained to predict the original “clean” patches
    类似把视频中的一帧帧画面打上各种马赛克,然后训练一个模型,让它学会去除各种马赛克,且一开始各种失败没关系,反正有原画面作为ground truth,不断缩小与原画面之间的差异即可
    而当把一帧帧图片打上全部马赛克之后,可以根据”文本-视频数据集”中对视频的描述/prompt(该描述/prompt不仅仅只是通过CLIP去与视频对齐,还经过类似DALLE 3所用的重字幕技术加强 + GPT4对字幕的进一步丰富,下节详述),而有条件的去噪
  2. 二方面,它把DPPM中的噪声估计器所用的卷积架构U-Net换成了Transformer架构

图片

总之,总的来说,Sora是一个在不同时长、分辨率和宽高比的视频及图像上训练而成的扩散模型,同时采用了Transformer架构,如sora官博所说,Sora is a diffusion transformer,简称DiT

关于DiT的更多细节详见下文第二部分介绍的DiT

1.2 基于DALLE 3的重字幕技术:提升文本-视频数据质量

1.2.1 DALLE 3的重字幕技术:为文本-视频数据集打上字幕且用GPT把字幕详细化

首先,训练文本到视频生成系统需要大量带有相应文本字幕的视频,而通过CLIP技术给视频对齐的文本描述,有时质量较差,故为进一步提高文本-视频数据集的质量,研究团队将 DALL・E 3 中的重字幕(re-captioning)技术应用于视频

  1. 具体来说,研究团队首先训练一个高度描述性的字幕生成器模型,然后使用它为训练集中所有视频生成文本字幕
  2. 与DALLE 3类似,研究团队还利用 GPT 将用户简短的prompt 转换为较长的详细字幕,然后发送给视频模型(Similar to DALL·E 3, we also leverage GPT to turn short user prompts into longer detailed captions that are sent to the video model),这使得 Sora 能够生成准确遵循详细字幕或详细prompt 的高质量视频

关于DALLE 3的重字幕技术更具体的细节请见此文2.3节《AI绘画原理解析:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion》

2.3 DALLE 3:Improving Image Generation with Better Captions

2.3.1 为提高文本图像配对数据集的质量:基于谷歌的CoCa​微调出图像字幕生成器

2.3.1.1 什么是谷歌的CoCa

2.1.1.2 分别通过短caption、长caption微调预训练好的image captioner

2.1.1.3 为提高合成caption对文生图模型的性能:采用描述详细的长caption,训练的混合比例高达95%..

1.2.2 类似VDT或Google的W.A.L.T工作:引入auto regressive进行视频预测或扩展

其次,如之前所述,为了保证视频的一致性,模型层不是通过多个stage方式来进行预测,而是整体预测了整个视频的latent(即去噪时非先去噪几帧,再去掉几帧,而是一次性去掉全部帧的噪声)

但在视频内容的扩展上,比如从一段已有的视频向后拓展出新视频的训练过程中可能引入了auto regressive的task,以帮助模型更好的进行视频特征和帧间关系的学习

更多可以参考下文Google的W.A.L.T工作,或下文“2.3.2 VDT的视频预测方案:把视频前几帧作为条件帧自回归预测下一帧”

1.3 对真实物理世界的模拟能力

1.3.1 sora学习了大量关于3D几何的知识

OpenAI 发现,视频模型在经过大规模训练后,会表现出许多有趣的新能力。这些能力使 Sora 能够模拟物理世界中的人、动物和环境的某些方面。这些特性的出现没有任何明确的三维、物体等归纳偏差 — 它们纯粹是规模现象

  1. 三维一致性(下图左侧)
    Sora 可以生成动态摄像机运动的视频。随着摄像机的移动和旋转,人物和场景元素在三维空间中的移动是一致的
    针对这点,sora一作Tim Brooks说道,sora学习了大量关于3D几何的知识,但是我们并没有事先设定这些,它完全是从大量数据中学习到的
    图片图片
    长序列连贯性和目标持久性(上图右侧)
    视频生成系统面临的一个重大挑战是在对长视频进行采样时保持时间一致性
    例如,即使人、动物和物体被遮挡或离开画面,Sora 模型也能保持它们的存在。同样,它还能在单个样本中生成同一角色的多个镜头,并在整个视频中保持其外观
  2. 与世界互动(下图左侧)
    Sora 有时可以模拟以简单方式影响世界状态的动作。例如,画家可以在画布上留下新的笔触,这些笔触会随着时间的推移而持续,而视频中一个人咬一口面包 则面包上会有一个被咬的缺口

    图片图片

    模拟数字世界(上图右侧)
    视频游戏就是一个例子。Sora 可以通过基本策略同时控制 Minecraft 中的玩家,同时高保真地呈现世界及其动态。只需在 Sora 的提示字幕中提及 「Minecraft」,就能零样本激发这些功能
1.3.2 sora真的会模拟真实物理世界了么

对于“sora真的会模拟真实物理世界”这个问题,网上的解读非常多,很多人说sora是通向通用AGI的必经之路、不只是一个视频生成,更是模拟真实物理世界的模拟器,这个事 我个人觉得从技术的客观角度去探讨更合适,那样会让咱们的思维、认知更冷静,而非人云亦云、最终不知所云

首先,作为“物理世界的模拟器”,需要能够在虚拟环境中重现物理现实,为用户提供一个逼真且不违反「物理规律」的数字世界

比如苹果不能突然在空中漂浮,这不符合牛顿的万有引力定律;比如在光线照射下,物体产生的阴影和高光的分布要符合光影规律等;比如物体之间产生碰撞后会破碎或者弹开

其次,李志飞等人在《为什么说 Sora 是世界的模拟器?》一文中提到,技术上至少有两种方式可以实现这样的模拟器

  • 一种是通过大数据学习出一个AI系统来模拟这个世界,比如说本文讨论的Sora能get到:“树叶在溪流中顺流而下”这句话所对应的物体运动轨迹是什么,更何况sora训练时还有LLM的夹持(别忘了上文1.2.1节中说的:与DALLE 3类似,研究团队还利用 GPT 将用户简短的prompt 转换为较长的详细字幕,然后发送给视频模型)
    比如在大量的文本-视频数据集中,GPT给一个视频写的更丰富的文本描述是:“路面积水反射出大楼的倒影”,而Sora遵循文本能力强,那Sora就能固定或机械的记忆住该物理定律,但其实这个物理规则来自于GPT写的Prompt
  • 另外一种是弄懂物理世界各种现象背后的数学原理,并把这些原理手工编码到计算机程序里,从而让计算机程序“渲染”出物理世界需要的各种人、物、场景、以及他们之间的互动

虚幻引擎(Unreal Engine,UE)就是这种物理世界的模拟器

  1. 它内置了光照、碰撞、动画、刚体、材质、音频、光电等各种数学模型。一个开发者只需要提供人、物、场景、交互、剧情等配置,系统就能做出一个交互式的游戏,这种交互式的游戏可以看成是一个交互式的动态视频
  2. UE 这类渲染引擎所创造的游戏世界已经能够在某种程度上模拟物理世界,只不过它是通过人工数学建模及渲染而成,而非通过模型从数据中自我学习。而且,它也没有和语言代表的认知模型连接起来,因此本质上缺乏世界常识。而 Sora 代表的AI系统有可能避免这些缺陷和局限

不同于 UE 这一类渲染引擎,Sora 并没有显式地对物理规律背后的数学公式去“硬编码”,而是通过对互联网上的海量视频数据进行自监督学习,从而能够在给定一段文字描述的条件下生成不违反物理世界规律的长视频

与 UE 这一类“硬编码”的物理渲染引擎不同,Sora 视频创作的想象力来自于它端到端的数据驱动,以及跟LLM这类认知模型的无缝结合(比如ChatGPT已经确定了基本的物理常识)

最后值得一提的是,Sora 的训练可能用了 UE 合成的数据,但 Sora 模型本身应该没有调用 UE 的能力

第二部分 Sora相近技术的发展史:ViViT、DiT、VDT、NaViT、MAGVIT v2、W.A.L.T、VideoPoet

注意,和sora相关的技术其实有非常多,但有些技术在本博客之前的文章中写过了(详见本文开头),则本部分不再重复,比如DDPM、ViT、DALLE三代、Stable Diffusion(包括潜在空间LDM)等等

2.1 视频Transformer之ViViT:视频元素token化且时空编码(没加扩散过程、没带文本条件融合)

在具体介绍ViViT之前,先说三个在其之前的工作

  1. 业界最早是用卷积那一套处理视频,比如时空3D CNN(Learning spatiotemporal features with 3d convolutional networks),由于3D CNN比图像卷积网络需要较多的计算量,许多架构在空间和时间维度上进行卷积的因式分解和/或使用分组卷积,且最近,还通过在后续层中引入自注意力来增强模型,以更好地捕捉长程依赖性
  2. 而Transformer在NLP领域大获成功,很快便出现了将Transformer架构应用到图像领域的ViT(Vision Transformer),ViT将图片按给定大小分为不重叠的patches,再将每个patch线性映射为一个token,随位置编码和cls token(可选)一起输入到Transformer的编码器中(下图来自萝卜社长,如果不熟悉或忘了ViT的,详见此文的第4部分)

  3. 2021年的这两篇论文《Is space-time attention all you need for video understanding?》、《Video transformer network》都是基于transformer做视频理解

而Google于2021年5月提出的ViViT(其对应论文为:ViViT: A Video Vision Transformer)便要尝试在视频中使用ViT模型,且他们充分借鉴了之前3D CNN因式分解等工作,比如考虑到视频作为输入会产生大量的时空token,处理时必须考虑这些长范围token序列的上下文关系,同时要兼顾模型效率问题

故作者团队在空间和时间维度上分别对Transformer编码器各组件进行分解,在ViT模型的基础上提出了三种用于视频分类的纯Transformer模型,如下图所示

区别于常规的二维图像数据,视频数据相当于需在三维空间内进行采样(拓展了一个时间维度),有两种方法来将视频\mathbf{V} \in \mathbb{R}^{T \times H \times W \times C}映射到token序列\tilde{\mathbf{z}} \in \mathbb{R}^{n_{t} \times n_{h} \times n_{w} \times d}(说白了,就是从视频中提取token,而后添加位置编码并对token进行reshape得到最终Transformer的输入\mathrm{z} \in \mathbb{R}^{\mathrm{N} \times \mathrm{d}})

  • 第一种,如下图所示,将输入视频划分为token的直接方法是从输入视频剪辑中均匀采样 n_t 个帧,使用与ViT 相同的方法独立地嵌入每个2D帧(embed each 2D frame independently using the same method as ViT),并将所有这些token连接在一起

    具体地说,如果从每个帧中提取 n_{h} \cdot n_{w} 个非重叠图像块(就像 ViT 一样),那么总共将有 n_{t} \cdot n_{h} \cdot n_{w} 个token通过transformer编码器进行传递,这个过程可以被看作是简单地构建一个大的2D图像,以便按照ViT的方式进行tokenised(这点和本节开头所提到的21年那篇论文space-time attention for video所用的方式一致)
  • 第二种则是把输入的视频划分成若干个tuplet(类似不重叠的带空间-时间维度的立方体)
    每个tuplet会变成一个token(因这个tublelt的维度就是: t * h * w,故token包含了时间、宽、高)
    经过spatial temperal attention进行空间和时间建模获得有效的视频表征token

2.1.1 spatio-temporal attention

上文说过,Google在ViT模型的基础上提出了三种用于视频分类的纯Transformer模型,接下来,介绍下这三种模型

当然,由于论文中把一个没有啥技巧且计算复杂度高的模型作为模型1:简单地将从视频中提取的所有时空token,然后每个transformer层都对所有配对进行建模,类似Neimark_Video_Transformer_Network_ICCVW_2021_paper的工作(其证明了VTN可以高效地处理非常长的视频)

所以下述三个模型在论文中被分别称之为模型2、3、4

2.1.2 factorised encoder及其代码实现

第二个模型如下图所示,该模型由两个串联的transformer编码器组成:

  1. 第一个模型是空间编码器Spatial Transformer Encoder
    处理来自相同时间索引的token之间的相互作用(相当于处理同一帧画面下的各个元素,时间维度都相同了自然时间层面上没啥要处理的了,只处理空间维度),以产生每个时间索引的潜在表示,并输出cls_token
  2. 第二个transformer编码器是时间编码器Temporal Transformer Encoder
    处理时间步之间的相互作用(相当于处理不同帧,即空间维度相同但时间维度不同)。 因此,它对应于空间和时间信息的“后期融合”
    换言之,将输出的cls_token和帧维度的表征token拼接输入到时间编码器中得到最终的结果

对应的代码如下(为方便大家一目了然,我不仅给每一行代码都加上了注释,且把代码分解成了8块,每一块代码的重点都做了细致说明)

  1. 首先定义ViViT类,且定义相关变量
    # 定义ViViT模型类
    class ViViT(nn.Module):
        def __init__(self, image_size, patch_size, num_classes, num_frames, dim=192, depth=4, heads=3, pool='cls', in_channels=3, dim_head=64, dropout=0.,
                     emb_dropout=0., scale_dim=4):
            super().__init__()  # 调用父类的构造函数
            
            # 检查pool参数是否有效
            assert pool in {'cls', 'mean'}, 'pool type must be either cls (cls token) or mean (mean pooling)'
            # 确保图像尺寸能被patch尺寸整除
            assert image_size % patch_size == 0, 'Image dimensions must be divisible by the patch size.'
            # 计算patch数量
            num_patches = (image_size // patch_size) ** 2
            # 计算每个patch的维度
            patch_dim = in_channels * patch_size ** 2
            # 将图像切分成patch并进行线性变换的模块
            self.to_patch_embedding = nn.Sequential(
                Rearrange('b t c (h p1) (w p2) -> b t (h w) (p1 p2 c)', p1=patch_size, p2=patch_size),
                nn.Linear(patch_dim, dim),
            )
    为方便大家理解,我得解释一下上面中这行的含义:
    Rearrange('b t c (h p1) (w p2) -> b t (h w) (p1 p2 c)', p1=patch_size, p2=patch_size)
    且为方便大家和我之前介绍ViT的文章前后连贯起来,故还是用的ViT那篇文章中的例子(此文的第4部分)
    以ViT_base_patch16为例,一张224 x 224的图片先分割成 16 x 16 的 patch ,很显然会因此而存在 (224\times 224/16\times 16)^2=196 个 patch
    且图片的长宽由原来的224  x 224 变成:14  x 14(因为224/16 = 14)
    16*1616*1616*1616*1616*1616*1616*1616*1616*1616*1616*1616*1616*1616*16
    16*16
    16*16
    16*16
    ...
    所以对于上面那行意味着可以让批次大小b=1、时间维度t=2、RGB图像的通道数c=3
    原始维度即为:
    (1, 2, 3, 旧的长 = 224 patch_size = 16, 旧的宽 = 224 patch_size = 16),Rearrange之后的维度则变为:
    (12, 新的长14 x 新的宽14 = 196, 16 x 16 x 3 = 768)
  2. 初始化位置编码和cls token
    self.pos_embedding 的维度为(1, num_frames, num_patches + 1, dim)
    在这里,num_frames 是 t,num_patches 是 n=196,dim 是 768,因此 pos_embedding 维度为 (1,2,197,768)
            # 位置编码
            self.pos_embedding = nn.Parameter(torch.randn(1, num_frames, num_patches + 1, dim))
            # 空间维度的cls token
            self.space_token = nn.Parameter(torch.randn(1, 1, dim))
            # 空间变换器
            self.space_transformer = Transformer(dim, depth, heads, dim_head, dim * scale_dim, dropout)
    
            # 时间维度的cls token
            self.temporal_token = nn.Parameter(torch.randn(1, 1, dim))
            # 时间变换器
            self.temporal_transformer = Transformer(dim, depth, heads, dim_head, dim * scale_dim, dropout)
    
            # dropout层
            self.dropout = nn.Dropout(emb_dropout)
            # 池化方式
            self.pool = pool
    
            # 最后的全连接层,用于分类
            self.mlp_head = nn.Sequential(
                nn.LayerNorm(dim),
                nn.Linear(dim, num_classes)
            )
  3. patch嵌入和cls token的拼接
    输入数据 x 的维度在经过嵌入层后变为 (1,2,196,768)
    self.space_token 的初始维度为 (1,1,768),被复制扩展成 (1,2,1,768) 以匹配批次和时间维度
    cls_space_tokens 和 x 在patch维度上拼接后,维度变为 (1,2,197,768)
    为何拼接之后成197了呢?原因很简单,如ViT那篇文章中所述:“[class] token的维度为 [1, 768] ,通过Concat操作,[196, 768]  与 [1, 768] 拼接得到 [197, 768]”
        def forward(self, x):
            # 将输入数据x转换为patch embeddings
            x = self.to_patch_embedding(x)
            b, t, n, _ = x.shape  # 获取batch size, 时间维度, patch数量
    
            # 在每个空间位置加上cls token
            cls_space_tokens = repeat(self.space_token, '() n d -> b t n d', b=b, t=t)
            x = torch.cat((cls_space_tokens, x), dim=2)  # 在维度2上进行拼接
  4. 添加位置编码和应用dropout
    加上位置编码后,x 保持 (1,2,197,768) 维度不变。应用dropout后,x 的维度仍然不变
            x += self.pos_embedding[:, :, :(n + 1)]  # 加上位置编码
            x = self.dropout(x)  # 应用dropout
  5. 空间Transformer
    重排 x 的维度为 (2,197,768),因为 b×t=1×2=2
    空间Transformer处理后,x 的维度变为 (2,197,768)
            # 将(b, t, n, d)重排为((b t), n, d),为了应用空间变换器
            x = rearrange(x, 'b t n d -> (b t) n d')
            x = self.space_transformer(x)  # 应用空间变换器
            x = rearrange(x[:, 0], '(b t) ... -> b t ...', b=b)  # 把输出重排回(b, t, ...)
  6. 时间Transformer
    self.temporal_token 的初始维度为(1,1,768),被复制扩展成 (1,2,768)
    cls_temporal_tokens 和 x 在时间维度上拼接后,维度变为(1,3,768)
         # 在每个时间位置加上cls token
            cls_temporal_tokens = repeat(self.temporal_token, '() n d -> b n d', b=b)
            x = torch.cat((cls_temporal_tokens, x), dim=1)  # 在维度1上进行拼接
    
            x = self.temporal_transformer(x)  # 应用时间变换器
  7. 池化
    如果 self.pool 是 'mean',则对 x 在时间维度上取均值,结果维度变为 (1,768)
    如果不是 'mean',则直接取 x 的第一个时间维度的cls token,结果维度同样是 (1,768)
            # 根据pool参数选择池化方式
            x = x.mean(dim=1) if self.pool == 'mean' else x[:, 0]
  8. 分类头
    self.mlp_head,将 (1,768) 维度的 x 转换为最终的分类结果,其维度取决于类别数num_classes,如果 num_classes 是 10,则最终输出维度为 (1,10)
            # 通过全连接层输出最终的分类结果
            return self.mlp_head(x)
2.1.3 factorised self-attention

第二个模型如下图所示,会先计算空间自注意力(token中有相同的时间索引,相当于同一帧画面上的token元素),再计算时间的自注意力(token中有相同的空间索引,相当于不同帧下同一空间位置的token,比如一直在视频的左上角那一块的token块)

  1. 具体进行空间注意力交互的方法是:将初始视频序列生成的\mathrm{z} \in \mathbb{R}^{1 \times \mathrm{n}_{\mathrm{t}} \cdot \mathrm{n}_{\mathrm{w}} \cdot \mathrm{n}_{\mathrm{h}} \cdot \mathrm{d}},通过tensor的reshape思想映射为\mathrm{z}_{\mathrm{S}} \in \mathbb{R}^{\mathrm{n}_{\mathrm{t}} \times \mathrm{n}_{\mathrm{w}} \cdot \mathrm{n}_{\mathrm{h}} \cdot \mathrm{d}},而后计算得到空间自注意力结果
  2. 同理,在时间维度上映射得到\mathrm{z}_{\mathrm{t}} \in \mathbb{R}^{\mathrm{n}_{\mathrm{w}} \cdot \mathrm{n}_{\mathrm{h}} \times \mathrm{n}_{\mathrm{t}} \cdot \mathrm{d}},从而进行时间自注意力的计算

2.1.4 factorised dot-product attention

由于实验表明空间-时间自注意力或时间-空间自注意力的顺序并不重要,所以第三个模型的结构如下图所示,一半的头仅在空间轴上计算点积注意力,另一半头则仅在时间轴上计算,且其参数数量增加了,因为有一个额外的自注意力层

不过,该模型通过利用dot-product点积注意力操作来取代因式分解factorisation操作,通过注意力计算的方式来代替简单的张量reshape。思想是对于空间注意力和时间注意力分别构建对应的键、值,如下图所示(图源自萝卜社长)

在这里插入图片描述

2.2 DiT:将扩散过程中的U-Net 换成 Transformer(2D图像生成,带文本条件融合)

2.2.1 DiT = VAE encoder + ViT + DDPM + VAE decoder

在ViT之前,图像领域基本是CNN的天下,包括扩散过程中的噪声估计器所用的U-net也是卷积架构,但随着ViT的横空出世,人们自然而然开始考虑这个噪声估计器可否用Transform架构来代替

2022年年底,William Peebles(当时在UC Berkeley,Peebles在𝕏上用昵称Bill,在Linkedin上及论文署名时用大名William)、Saining Xie(当时在约大学)的两人通过论文《Scalable Diffusion Models with Transformers》提出了一种叫 DiT 的神经网络结构

  1. 其结合了视觉 transformer 和 diffusion 模型的优点,即DiT = VAE encoder + ViT + DDPM + VAE decoder
  2. 但它把DPPM中的卷积架构U-Net换成了Transformer架构(We train latent diffusion models of images, replacing the commonly-used U-Net backbone with a transformer that operates on latent patche,至于什么是U-Net,请参见此文的2.1节)

2.2.2 Diffusion Transformer(DiT)的3个不同的条件策略

如下图所示,便是扩散transformer(DiT)的架构

  • 左侧:我们训练条件潜在DiT模型(conditional latent DiT models), 潜在输入被分解成patch并通过几个DiT blocks处理(The input latent is decomposed into patches and processed by several DiT blocks)
    比如当输入是一张256x256x3的图片,对图片做切patch后经过投影得到每个patch的token,得到32x32x4的Noised Latent(在推理时输入直接是32x32x4的噪声),结合当前的Timestep t、Label y作为输入
    经过N个Dit Block通过mlp进行输出,得到输出的噪声Noise预测以及对应的协方差矩阵\Sigma(After the final DiT block, we need to decode our sequence of image tokens into an output noise prediction and an output diagonal covariance prediction),经过T个step采样,得到32x32x4的降噪后的latent
  • 右侧:我们的DiT blocks细节。 我们试验了标准transformer块的变体,这些变体通过自适应层归一化、交叉注意和额外输入token来加入条件(incorporate conditioning via adaptive layer norm, cross-attention and extra input tokens),其中自适应层归一化效果最好

接下来,仔细介绍下上图右侧4个不同的条件策略(说白了,就是怎么加入conditioning)

  1. 自适应层归一化,即Adaptive layer norm (adaLN) block
    鉴于自适应归一化层在GANs和具有U-Net骨干的扩散模型中的广泛使用,故用自适应层归一化(adaLN)替换transformer块中的标准层归一化层
    不是直接学习维度方向的缩放和偏移参数 \gamma和 \beta,而是从 t 和类别标签c的嵌入向量之和中回归它们(Rather than directly learn dimension-wise scale and shift parameters γ and β, we regress them from the sum of the embedding vectors of t and c.)
  2. adaLN-Zero block
    关于ResNets的先前工作发现,将每个残差块初始化为恒等函数是有益的。例如,Goyal等人发现,在每个块中将最终批量归一化尺度因子 γ零初始化可以加速大规模训练在监督学习设置中[13]
    扩散U-Net模型使用类似的初始化策略,在任何残差连接之前将每个块的最终卷积层零初始化。 我们对adaLN DiT块的修改,它做了同样的事情。 除了回归 γ和 β,还回归在DiT块内的任何残差连接之前立即应用的维度方向的缩放参数 α
  3. 交叉注意力块
    将t和c的嵌入连接成一个长度为二的序列,与图像token序列分开,transformer块被修改为:在多头自注意块之后,包含一个额外的多头交叉注意层,类似于LDM用于根据类标签进行条件处理的设计。 交叉注意力使模型增加了最多的Gflops,大约增加了15%的开销
  4. 上下文条件化(In-context conditionin)
    将 t 和 c的向量嵌入作为两个额外的token追加到输入序列中,与图像token无异地对待它们,这类似于ViTs中的 cls token,它允许我们使用标准ViT块而无需修改。 在最后一个块之后,从序列中移除条件token。 这种方法没有新增模型多少Gflops,可忽略
2.2.3 DiT类似架构之U-ViT:虽也带文本条件融合,但和DiT都只局限在2D图像生成

对于扩散过程中噪声估计器的选择,国外的研究者很自然的想到了用Transformer代替U-net,那国内就没人想到么?

其实早在2022年9月,清华朱军团队就发布了一篇名为《All are Worth Words: A ViT Backbone for Diffusion Models》的论文(比 DiT早提出两个多月,后被 CVPR 2023 收录),这篇论文提出了用「基于Transformer的架构U-ViT」替代基于卷积架构的U-Net

  1. U-ViT参数化了噪声预测网络\boldsymbol{\epsilon}_{\boldsymbol{\theta}}\left(\boldsymbol{x}_{t}, t, c\right),它接受时间 t、条件 c、噪声图像 x_t作为输入,然后预测注入到 x_t中的噪声。按照ViT的设计方法,图像被分割成patch,并且U-ViT将所有输入(包括时间、条件和图像patch)都视为token
  2. 受到基于CNN的U-Net在扩散模型中的成功启发,U-ViT采用了类似的浅层和深层之间的长跳跃连接(Inspired by the success of the CNN-based U-Net in diffusion models [65], U-ViT also employs similar long skip connections between shallow and deep layers)
    意思是说,\boldsymbol{\epsilon}_{\boldsymbol{\theta}}\left(\boldsymbol{x}_{t}, t, c\right)的目标是像素级预测任务,对低级特征敏感。 长跳跃连接为低级特征提供了捷径,因此有助于噪声预测网络的训练
    Intuitively,the objective in Eq. (1) is a pixel-level prediction task and is sensitive to low-level features. The long skip connections provide shortcuts for the low-level features and therefore ease the training of the noise prediction network
  3. U-ViT在输出之前可选地添加一个3×3的卷积块。 这旨在防止transformer生成的图像中出现潜在的伪影(potential artifacts in images)

对比来看,两项工作在架构路线上完全一致

  • 均是提出了将 Transformer 与扩散模型融合的思路
  • 并且在具体的实验路径上也一致,比如采用了相同的 patch embedding、patch size;都得出了同样的结论 ——patch size 为 2*2 是最理想的
  • 在模型参数量上,两者都在 50M-500M 左右的参数量上做了实验,最终都证实了 scale 特性

不过 DiT 仅在 ImageNet 上做了实验,U-ViT 在小数据集(CIFAR10、CelebA)、ImageNet、图文数据集 MSCOCO 上均做了实验。此外,相比传统的 Transformer,U-ViT 提出了一项「长连接」的技术,大大提升了训练收敛速度

2.3 VDT:基于扩散的视频生成中首次使用Transformer(与sora架构最接近)

2.3.1 VDT:综合「ViViT的时空编码」与「DiT的扩散Transformer」

上面介绍的DiT、U-ViT更多还是在2D图像生成领域,那有没有“基于扩散的视频生成中首次使用Transformer(which pioneers the use of transformers in diffusion-based video generat)”的工作呢?

2023年5月,中国人民大学(高瓴人工智能学院)与加州大学伯克利分校、香港大学等共同提出了基于 Transformer 的 Video 统一生成框架:Video Diffusion Transformer(对应论文为:VDT: General-purpose Video Diffusion Transformers via Mask Modeling,简称VDT ,后于24年1月被ICLR 2024接收 ),统一各种视频生成任务,包括无条件生成、预测、插值、动画和时空视频生成

这篇论文开头提到Transformer在视频生成领域中具备的几大优势

  1. 视频生成的领域包括各种任务,例如无条件生成、视频预测、插值和文本到图像生成。以往的研究通常专注于单个任务,经常结合用于下游微调的专门模块。此外,这些任务涉及到可以在帧和模态之间变化的多样化的条件信息。这需要一个能够处理不同输入长度和模态的强大架构
  2. 与主要设计用于图像的U-Net不同,Transformer天生具有捕捉长程或不规则时间依赖性的能力,这要归功于它们强大的token化和注意力机制。这使得它们能够更好地处理时间维度,如在各种视频任务中的分类、定位和检索方面表现出优越性能
  3. 只有当模型学习(或记忆)了世界知识(例如时空关系和物理定律)时,它才能生成与真实世界相对应的视频(Only when a model has learned (or memorized) worldly knowledge (e.g., spatiotemporal relationships and physical laws) can it generate videos corresponding to the real word)。因此,模型容量是视频扩散的关键组成部分
    Transformer已被证明具有高度可扩展性,使它们比3D U-Net更适合应对视频生成的挑战。例如,最大的U-Net架构的SD-XL有26亿个参数,而PaLM等Transformer架构的模型则拥有5400亿个参数

而提出的视频扩散Transformer(VDT)具备以上所有优势,且它有时间和空间注意力模块的Transformer块,以及用于有效token化的VAE标记器以及用于生成视频帧的解码器组成

VDT 框架包括以下几部分:

  • 输入 / 输出特征
    VDT 的目标是生成一个 F×H×W×3 的视频片段,由 F 帧大小为 H×W 的视频组成。然而,如果使用原始像素作为 VDT 的输入,将导致计算量极大(尤其是当 F 很大时)
    为解决这个问题,受潜在扩散模型(LDM)的启发,VDT 使用预训练的 VAE tokenizer 将视频投影到潜在空间中。将输入和输出的向量维度减少到潜在特征 / 噪声的 F×H/8×W/8×C,加速了 VDT 的训练和推理速度,其中 F 帧潜在特征的大小为 H/8×W/8。这里的 8 是 VAE tokenizer 的下采样率,C 表示潜在特征维度
  • 线性嵌入
    遵循 Vision Transformer 的方法,VDT 将潜在视频特征表示划分为大小为 N×N 的非重叠 Patch,且为为每个patch添加空间和时间位置嵌入(sin-cos)
  • 时空 Transformer Block
    受到视频建模中时空自注意力的启发,VDT 在 Transformer Block 中插入了一个时间注意力层,以获得时间维度的建模能力
    具体来说,每个 Transformer Block 由一个多头时间注意力、一个多头空间注意力和一个全连接前馈网络组成,这点类似上文介绍过的ViViT,如下图所示

此外,在扩散过程中,将时间信息纳入Transformer块是至关重要的

具体的执行方式是在Transformer块中,VDT在层归一化时整合了时间(we integrate the time component after the layer normalization in the transformer block),这与基于U-Net的扩散模型中使用的
自适应组归一化类似,可以表示为:

\operatorname{adaLN}(h, t)=t_{\text {scale }} \text { LayerNorm }(h)+t_{\text {shift }}

其中 h是隐藏状态,t_{\text {scale }}t_{\text {shift }}是从时间嵌入中获得的scale 和shift 参数

对比 Sora 最新发布的技术报告,可以看到 VDT 和 Sora 在实现细节上还是存在一些差别

  1. 首先,VDT 采用的是在时空维度上分别进行注意力机制处理的方法,而 Sora 则预计是将时间和空间维度合并,通过单一的注意力机制来处理
    VDT这种分离注意力的做法在视频领域已经相当常见,通常被视为在显存限制下的一种妥协选择,即选择采用分离注意力也是出于计算资源有限的考虑
    而Sora 强大的视频动态能力可能来自于时空整体的注意力机制,反正算力充沛
  2. 其次,不同于 VDT和ViViT,Sora 还考虑了文本条件的融合(当然,U-ViT和DiT也都有基于 Transformer 进行文本条件的融合)
    预计Sora 可能在其模块中进一步加入了交叉注意力机制,当然,直接将文本和噪声拼接作为条件输入的形式也是一种潜在的可能

综上,你可以把sora理解为带文本条件融合且时空注意力并行计算的Video Diffusion Transformer (所谓的这个带文本条件融合,你也可以简单粗暴的理解为条件去噪)

因此,行文至此,这个VDT是最接近sora的架构了,但国内没公司将其产品化,让人不得不再次感叹,国内技术并不差,但OpenAI对scale太坚定、把大模型各个创新技术整合到一个产品中并规模化应用的能力太强、算力太强,包括其追踪最新技术、最新paper的能力,让其率先推出了sora

2.3.2 VDT的视频预测方案:把视频前几帧作为条件帧自回归预测下一帧

视频生成领域有一个与之密切相关的任务 —— 视频预测,即预测下一个视频帧,而视频预测任务也可以视为条件生成,这里给定的条件帧是视频的前几帧

VDT 主要考虑了以下三种条件生成方式:

  • 自适应层归一化
    实现视频预测的一种直接方法是将条件帧特征整合到 VDT Block 的层归一化中,类似于上节的将时间信息整合到扩散过程中
    \operatorname{adaLN}(h, c)=c_{\text {scale }} \text { LayerNorm }(h)+c_{\text {shift }}
    其中 h是隐藏状态, c_{\text {scale }}c_{\text {shift }}是从时间嵌入和条件帧中获得的scale 和shift 参数
  • 交叉注意力
    研究者还探索了使用交叉注意力作为视频预测方案,其中条件帧用作key和value,而噪声帧作为query,这允许将条件信息与噪声帧融合
    在进入交叉注意力层之前,使用 VAE tokenizer 提取条件帧的特征并 Patch 化。同时,还添加了空间和时间位置嵌入,以帮助VDT 学习条件帧中的对应信息
  • Token 拼接
    VDT 模型采用纯粹的 Transformer 架构,因此,直接使用条件帧作为输入 token 对 VDT 来说是更直观的方法
    \rightarrow  VDT通过在 token 级别拼接条件帧(潜在特征)和噪声帧来实现这一点,然后将其输入到 VDT 中
    \rightarrow  接下来,他们将 VDT 的输出帧序列分割,并使用预测的帧进行扩散过程,如上图(b)所示
    他们发现,这种方案展示了最快的收敛速度,与前两种方法相比,在最终结果上提供了更优的表现
    此外,他们发现即使在训练过程中使用固定长度的条件帧,但在推理是,VDT 仍然可以接受任意长度的条件帧作为输入,并输出一致的预测特征
2.3.3 将 VDT 扩展到图片生成视频,而无需引入额外的模块或参数

在 VDT 的框架下,为了实现视频预测任务,不需要对网络结构进行任何修改,仅需改变模型的输入即可。这一发现引出了一个直观的问题:能否进一步利用这种可扩展性,将 VDT 扩展到更多样化的视频生成任务上 —— 例如图片生成视频 —— 而无需引入任何额外的模块或参数

  1. 通过回顾 VDT 在无条件生成和视频预测中的功能,唯一的区别在于输入特征的类型。具体来说,输入可以是纯噪声潜在特征,或者是条件和噪声潜在特征的拼接
  2. 然后,研究者引入了 Unified Spatial-Temporal Mask Modeling 来统一条件输入

如下图所示:

2.4 NaViT:多个patches打包成一个单一序列以实现可变分辨率

2.4.1 Google提出NaViT(Native Resolution ViT)

在压缩网络部分有一个关键问题:在将patches送入Diffusion Transformer的输入层之前,如何高效处理潜空间维度的变化(即不同视频类型的潜特征块或patches的数量,其中,处理高效很重要)

2023年7月,Google DeepMind通过此篇论文《Patch n' Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution》提出了Native Resolution ViT,简称NaViT

  • 该模型在训练过程中采用序列封装的方式处理任意分辨率和纵横比的输入(uses sequence packing during training to process inputs of arbitrary resolutions and aspect ratios)
  • 除了具备灵活性的模型应用外,还展示了通过大规模监督和contrastive image-text pretraining来提高训练效率(we demonstrate improved training efficiency for large-scale supervised and contrastive image-text pretraining)

具体而言

  • 视觉Transformer(ViT)输入图像会被调整为固定的平方纵横比,并分割成固定数量的patch(input images are resized to a fixed square aspect ratio and then split into a fixed number of patches)
    这是通过在每个训练步骤中对patch大小进行随机采样和调整算法来实现的,以支持多种初始卷积嵌入尺寸(This is achieved via random sampling of a patch size at each training step and a resizing algorithm to allow the initial convolutional embedding to support multiple patch sizes)
  • Pix2Struct引入了一种替代方法来保留纵横比(introduced an alternative patching approach which preserves the aspect ratio),在图表和文档理解等任务中尤其有用

Google从而提出了一种替代方法NaViT,将来自不同图像的多个patches打包成一个单一序列——称为Patch n’ Pack——从而实现可变分辨率并保持长宽比(Multiple patches from different images are packed in a single sequence— termed Patch n’ Pack—which enables variable resolution while preserving the aspect ratio)

2.4.2 如何实现的可变分辨率并保持长宽比

不同的分辨率输入在训练时候带来的是大量的计算负载不均衡,一个最简单的做法就是直接padding到固定大小

然此举势必会引入大量不必要的计算量, 因此用下述技术降低计算量,支持动态输入:

  1. 以紧凑的方式打包 token
    NaViT采用了简单的贪心算法,即在第一个序列中添加足够剩余空间的样本。一旦没有样本可以容纳,序列就会被填充 token 填满,从而产生批处理操作所需的固定序列长度
    这种简单的打包算法可能会导致大量填充,这取决于输入长度的分布情况
    另一方面,可以控制采样的分辨率和帧数,通过调整序列长度和限制填充来确保高效打包
  2. 控制好哪些 token 在何时被丢弃
    直观的方法是丢弃相似的 token,或者像 PNP 一样,使用丢弃率调度器。不过,值得注意的是,在训练过程中,丢弃 token 可能会忽略细粒度的细节
    因此,有人认为 sora 很可能会使用超长的上下文窗口并打包视频中的所有 token,尽管这样做的计算成本很高(毕竟Transformer的计算复杂度与序列长度上成二次方)
    总之,一个长时间视频中的时空潜在 patch 可以打包到一个序列中,而多个短时间视频中的时空潜在 patch 则会串联到另一个序列中

2.5 MAGVIT v2:用好tokenizer可以超越diffusion

2.5.1 能得到离散的视觉token的好处

对于基于 transformer 的工作,不管是 latent diffusion 还是 language model,它们之间的区别很小,都是 token-based,最大的区别在于:基于 diffusion 的生成是连续的 token,language model 处理的是离散的 token

通过上文,我们已经知道 Sora 会将视频数据 token 化,所以再来深入聊下tokenizer

Google和CMU于2023年10月份联合发布的MAGVIT v2(这是其论文Language Model Beats Diffusion -- Tokenizer is Key to Visual Generation)

  1. 配备这个tokenizer,LLMs在图像和视频生成等视觉任务上能取得比扩散模型更好的效果,更第一次证明语言模型在标志性的ImageNet基准测试上击败了扩散模型
  2. 值得强调的是,该模型的意图不是断言语言模型是否优于其他模型,而是促进对LLMs的视觉分词方法的探索

LLMs与其他模型(如扩散模型)的一个基本区别是LLMs利用离散的潜在格式,而能得到离散的视觉token的价值不容忽视

  1. 与LLMs的兼容性,比如可以轻松利用市面上多年来为LLM开发的优化技术。这包括更快的训练和推理速度、模型基础设施的进展、模型扩展的学习方法以及GPU/TPU优化等其他创新
    通过相同的token空间统一视觉和语言,可以为真正的多模态LLM奠定基础,使其能够理解、生成和推理我们的视觉环境
  2. 压缩表示,离散token可能为视频压缩提供新的视角。这些视觉token可以作为一种新的视频压缩格式,在互联网传输过程中减少磁盘存储和带宽。 与压缩的RGB像素不同,这些token可以直接输入生成模型,跳过传统的解压缩和潜在编码步骤。 这样可以加快生成视频应用程序的处理速度,特别适用于边缘计算情况
  3. 视觉理解的好处。 先前的研究表明,离散标记在自监督表示学习中作为预训练目标是有价值的

此外,如公号“飞哥说AI”所说,以前的Tokenizer针对图片和视频一般是用不同的Vocabulary分开处理,MAGViT V2把图片和视频整合到同一个Vocabulary里,使得图片和视频能够在同一个模型中进行联合训练。另外,以前Vocabulary的规模一般比较小(比如说8192),而MAGVit V2用了一种Lookup-free的办法,把Vocabulary的规模做到了26万,从而显著提高了视频的压缩和生成质量

2.5.2 因果3D卷积层(temporally causal 3D convolution)替换掉3D CNN的价值

值得一提的是,如下图所示

  • C-ViViT采用了完全空间transformer块与因果时间transformer块的组合(如上图2a所示),不过,其有两个缺点
    首先,与CNN不同,位置嵌入使得在训练期间未见过的spatial resolutions难以进行分词。 其次,经验发现,3D CNN比spatial transformer表现更好,并且产生具有更好空间因果关系corresponding patch
    C-ViViT employs full spatial transformer blocks combined with causal temporal transformer blocks.
    First, unlike CNNs, the positional embeddings makes it difficult to tokenize spatial resolutions that were not seen during training.
    Second, empirically we found that 3D CNNs perform better than spatial transformer and produce tokens with better spatial causality of the corresponding patch
  • 那把C-ViViT中的spatial transformer替换成3D CNN(如上图b所示)会如何呢?然问题又出现了,这些层不能独立处理第一帧,因为常规的卷积核尺寸\left(k_{t}, k_{h}, k_{w}\right)将会操作\left\lfloor\frac{k_{t}-1}{2}\right\rfloor帧之前和\left\lfloor\frac{k_{t}}{2}\right\rfloor帧之后的输入帧
  • 好在通过因果3D卷积层(temporally causal 3D convolution)替换掉3D CNN则顺利解决了这个问题(如上图c所示),因为卷积核仅在过去的k_{t}-1帧上操作(即因果3D卷积层在输入之前只填充k_{t}-1帧,之后不填充,因此每个帧的输出仅依赖于前面的帧)
    这确保了每一帧的输出仅受到前面帧的影响,使得模型能够独立地对第一帧进行标记

2.6 W.A.L.T:将Transformer用于扩散模型

2.6.1 两个窗口局部注意力:空间层、时空层

23年12月中旬,来自斯坦福大学、谷歌、佐治亚理工学院的研究者提出了 Window Attention Latent Transformer, 一种基于窗口注意力的潜在视频扩散模型(LVDMs)方法, 简称 W.A.L.T,其对应的论文为《Photorealistic Video Generation with Diffusion Models》,该方法成功地将 Transformer 架构整合到了潜在视频扩散模型中,斯坦福大学的李飞飞教授也是该论文的作者之一

该方法包括两个阶段

  1. 首先,一个自动编码器将视频和图像映射到一个统一的、低维的潜在空间。 这种设计选择使得在图像和视频数据集上联合训练单一生成模型成为可能,并显著减少了生成高分辨率视频的计算负担
  2. 随后,我们提出了一种新的Transformer块设计,用于潜在视频扩散建模,它由交替的自注意力层组成,这些层在不重叠的、窗口限制的空间和时空注意力之间切换
    这种设计提供了两个主要好处:首先,使用局部窗口(这个局部窗口的本质就是上文提到过的patch)注意力显著降低了计算需求。 其次,它促进了联合训练,其中空间层独立处理图像和视频帧,而时空层专门用于建模视频中的时间关系

如下图所示,我们将图像和视频编码到一个共享的潜在空间中,Transformer骨干网络通过具有两层窗口局部注意力的块处理这些潜在因素:

  • 空间层spatial layers捕获图像和视频中的空间关系
  • 而时空层spatiotemporal layers通过身份注意力掩码在视频中建模时间动态并在图像中传递(spatial layers capture spatial relations in both images and video, while spatiotemporal layers model temporal dynamics in videos and pass through images via identity attention mask)
    且通过空间交叉注意力加入text condition

具体来说

  1. 给定一个视频序列x \in \mathbb{R}^{(1+T) \times H \times W \times C},模型旨在学习一个低维表示z \in \mathbb{R}^{(1+ t) \times h \times w \times c}通过空间的f_{s}=H / h=W / w因子和时间的f_{t}=T / t因子进行时空压缩
  2. 为了使视频和静态图像都能使用统一的表示,第一帧总是独立于视频的其余部分进行编码。 这允许静态图像 x \in \mathbb{R}^{1 \times H \times W \times C}被视为具有单一帧的视频,即z \in \mathbb{R}^{1 \times h \times w \times c}
  3. 最终用因果3D CNN编解码器架构实例化这个设计,该架构是MAGVIT-v2 tokenize
    在这个阶段之后,模型的输入是一批表示单个视频或一堆1 +t独立图像的潜在张量z \in \mathbb{R}^{(1+ t) \times h \times w \times c}
2.6.2 自回归生成:过去的帧也可以作为继续生成的condition

为了通过自回归预测生成长视频,我们也在帧预测任务上联合训练我们的模型,这是通过在训练期间以概率p_{fp}条件化模型在过去的帧上实现的

具体来说,模型通过c_{\mathrm{fp}}=\operatorname{concat}\left(m_{\mathrm{fp}} \circ \boldsymbol{z}_{\boldsymbol{t}}, m_{\mathrm{fp}}\right)进行条件化,其中 m_{fp}是一个二进制掩码。 二进制掩码指示了用于条件化的过去帧的数量。

最终,根据 1个潜在帧(图像到视频生成)或 2个潜在帧(视频预测)进行条件化

  1. 这种条件化通过沿着「噪声潜在输入」的通道维度的拼接,被整合到模型中
    This conditioning is integrated into the model through concatenation along the channel dimension of the noisy latent input
  2. 在推断过程中,我们使用标准的无分类器引导,以c_{fp}作为条件信号
    During inference, we use standard classifier-free guidance with cfp as the conditioning signal

2.7 Google VideoPoet:基于MAGVIT V2和Transformer而来

2023年年底,Google推出了VideoPoet(这是其论文:VideoPoet: A Large Language Model for Zero-Shot Video Generation),包含两个阶段:预训练和微调(pretraining and task-specific adaptation)

与通常使用外部交叉注意力网络或潜在混合进行风格化基于扩散的方法相比(In contrast to the diffusion-based approaches that usually use external cross-attention networks or latent blending for styliza-tion),Google的这个方法更加类似于利用LLM进行机器翻译,因为只需将结构和文本作为语言模型的前缀

2.7.1 通过自然语言随心所欲的编辑视频,且其zero-shot能力强悍

如下图所示,其可以将输入图像动画化以生成一段视频,并且可以编辑视频或扩展视频

在风格化方面,该模型接收表征深度和光流的视频,以文本指导的风格绘制内容

2.7.2 视频生成器:借鉴LLM离散化token的处理思路

LLM在过去一年已经取得了巨大成功,那可否用于视频生成领域呢

  1. 然而,LLM 是在离散 token 上运行的,好在一些「视频和音频 tokenizer(比如用于视频和图像的 MAGVIT V2 和用于音频的 SoundStream)」,可以将视频和音频剪辑编码为离散 token 序列,并且也可以转换回原始表征形式
  2. 如此,通过使用多个 tokenizer,VideoPoet 便可以训练自回归语言模型来学习跨视频、图像、音频和文本的多个模态
    一旦模型生成以某些上下文为条件的 token,就可以使用 tokenizer 解码器将它们转换回可视化的表征形式

如下图所示,VideoPoet将所有模态编码映射到离散的标记空间中,以便能够直接利用LLM架构进行视频生成,特定标记使用<>表示,其中

  • 深红色代表模态不可知部分
    蓝色代表文本相关组件,即text tokens (embeddings): the pre-extracted T5 embed-dings for any text.
    黄色代表视觉相关组件,即visual tokens: the MAGVIT-v2 tokens representing the images, video subsection, or COMMIT encoded video-to-video task.
    绿色代表音频相关组件,即audio tokens: the SoundStream tokens representing au-dio
  • 上图左侧的浅黄色区域表示双向前缀输入
    而上午右侧的深红色区域则表示带有因果注意机制的自回归生成输出
2.7.3 Tokenization:图像视频标记MAGVIT-v2与音频标记SoundStream

图像和视频分词器(Image and video tokenizer)是生成高质量视频内容的关键

具体而言,它将图像和视频编码为一串整数,并通过解码器将其映射回像素空间,作为标记和像素空间之间的桥梁

  • 视觉分词器的性能决定了视频生成质量的上限。同时,为了实现有效且高效的任务设置,压缩比决定了LLM序列长度
  • MAGVIT-v2对8 fps采样率下17帧、2.125秒、128×128分辨率的视频进行分词,产生(5, 16, 16)形状,并扁平化为1280个标记,词汇表大小为2-18
    MAGVIT-v2tokenizes17-frame2.125-second128×128 resolution videos sampled at 8 fps to pro-duce a latent shape of (5, 16, 16), which is then flattenedinto 1280 tokens, with a vocabulary size of 2-18
  • 此外,在移动端生成短形式内容时,我们还将视频按纵横比分割成128×224分辨率,并产生(5, 28, 16)形状或2240个标记。在评估协议中使用16帧时,我们会舍弃最后一帧以制作16帧视频

第三部分 根据sora的32个reference以窥其背后更多技术细节

对于这32篇reference,我根据大家可能的熟悉程度归个类

  1. 13是transformer论文,14是GPT3论文,15是ViT论文,17是MAE论文,19是SD奠基论文,30是DALLE 3,31是DALLE 2
  2. 上文第二部分介绍过的:16是ViViT、18是NaViT,26是DiT
  3. 22-24是DDPM发展相关的:22是DDPM,23是improved DDPM,24是Diffusion Model Beat GANs
  4. 三篇text-to-image相关的文章27、28、29,下文会介绍
  5. 8是UC Berkeley的Videogpt、10是Google的imagen video,11是Nvidia的VideoLDM(该项目主页)
  6. 最前面的6篇是一些比较早期的研究(15-19年),下文会介绍

3.1 早期对视频的研究——使用LSTM的视频表示的无监督学习

sora的第一个reference为这篇论文《Unsupervised learning of video representations using lstms》,该论文考虑了目标序列的不同选择

  1. 一种选择是预测与输入相同的序列,动机类似于自动编码器(比如VAE)——我们希望捕获所有重现输入所需的信息,同时克服模型施加的归纳偏差
    The motivation is similar to that of auto encoders –we wish to capture all that is needed to reproducethe input but at the same time go through the inductive bi-ases imposed by the model

  2. 另一种选择是预测未来的帧。这里的动机是学习一种表示,提取所有需要推断的运动和外观,而非仅限于观察到的内容

这两种自然而合理地选择也可以结合起来。在这种情况下,有两个解码器LSTM——一个将表示解码为输入序列,另一个则利用相同表示进行解码以预测未来

在模型输入方面,理论上可以采用任何表示单个视频帧的方式。然而,为了本文目的的考虑,我们将限制注意力在两种输入上

  1. 第一种是图像块,即image patches
  2. 第二种是通过应用在ImageNet上训练过的卷积网络提取出来的高级“感知”。这些感知指代卷积神经网络模型中最后一层和/或倒数第二层校正线性隐状态所得到的结果

3.2 早期对世界的模拟和对环境的学习

3.2.1 把RNN用于对环境的模拟:预测时确保时空上的一致性

在sora的第二个reference中,引入了循环神经网络来提升以前的高维像素观测环境模拟器。这些网络能够对未来数百个时间步进行时间和空间上的一致预测,从而使智能体能够有效地计划和行动

为了解决计算效率低下的问题,我们采用了一个不需要在每个时间步生成高维图像的模型。通过这个方法,可以改善探索并适应多种不同环境,包括10个雅达利游戏、3D赛车环境和复杂的3D迷宫

3.2.2 世界模型World Models

在sora的第三个reference中,研究了构建流行的强化学习环境生成神经网络模型的方法

世界模型可以通过无监督方式快速训练,以学习环境的时空压缩表示(to learn acompressed spatial and temporal representation of the environment)

通过将从世界模型中提取的特征作为Agent的输入,我们能够训练出一种非常紧凑和简洁的策略来解决所需任务。甚至可以完全在由世界模型生成的幻梦中(hallucinated dream generated by its world model)对Agent进行训练,并将该策略迁移到实际环境中

3.2.3 Generating Videos with Scene Dynamics

在sora的第四个reference中,利用大量未标记的视频,以学习场景动态模型,应用于视频识别任务(如动作分类)和视频生成任务(如未来预测)

  1. 其提出了一种具备时空卷积架构的视频生成对抗网络,该架构能够将场景中的前景与背景分离
  2. 实验证明,该模型能够以全帧率生成长达一秒的小视频,并且相较于简单基线方法表现更优,在预测静态图像方面也展示出可信度
  3. 此外,实验和可视化结果显示,该模型在最小监督下内部学习到了有益特征来识别动作,证明了场景动态是良好表示学习信号
3.2.4 Generating Long Videos of Dynamic Scenes

在sora的第7个reference中,提出了一个视频生成模型,可以精确地再现物体运动、摄像机视角的变化以及随时间推移而出现的新内容

  • 在它之前,已有的视频生成方法通常无法作为时间函数产生新内容,并同时保持真实环境中所期望的一致性,如可信的动态和对象持久性。一个常见失败案例是过度依赖归纳偏差来提供时间一致性,例如指定整个视频内容的单个潜在代码,导致内容永远不会改变
  • 另一种极端情况下,如果没有长期一致性,则生成的视频可能会在不同场景之间失去真实感并发生形变

为了解决这些限制,我们优先考虑时间轴,并通过重新设计时间潜在表示以及通过在更长视频上进行训练来学习长期一致性

为此,我们采用两阶段训练策略,在低分辨率下使用更长视频进行训练,在高分辨率下使用更短视频进行训练。为了评估模型能力,我们引入了两个新的基准数据集,明确关注长期时间动态

3.3 27/28/29-text-to-image,前面两篇均有Ilya Sutskever的参与

  • Generative Pretraining from Pixels:Transformer预测图像像素
    摘要: 这篇论文探讨了在图像领域应用无监督表示学习的方法,特别是通过训练一个序列Transformer来自回归地预测像素
    尽管在没有标签的低分辨率ImageNet数据集上进行训练,但模型(GPT-2规模)能够学习到强大的图像表示,这通过线性探测、微调和低数据分类得到了验证

    在CIFAR-10数据集上,使用线性探测达到了96.3%的准确率,超过了监督的Wide ResNet。在ImageNet上,通过VQ-VAE编码替换像素,达到了69.0%的准确率,与自监督基准相当

    方法: 研究者们提出了一种预训练阶段,然后进行微调阶段的方法。预训练阶段探索了自回归和BERT目标。Transformer架构被用来预测像素而不是语言token

    通过微调,模型可以适应图像分类任务。此外,还使用了线性探测来评估表示质量
  • Zero-Shot Text-to-Image Generation:展示transformer的零样本能力
    摘要: 这篇论文描述了一个基于Transformer的方法,用于零样本文本到图像生成。该方法通过自回归地模拟文本和图像标记作为单一数据流。通过足够的数据和规模,该方法在零样本评估中与特定领域的模型竞争

    方法: 研究者们提出了一个两阶段训练过程
    \rightarrow  第一阶段使用离散变分自编码器(dVAE)将图像压缩为图像标记的网格
    \rightarrow  第二阶段,将文本token与图像token连接起来,训练一个自回归Transformer来模拟文本和图像token的联合分布
  • Scaling Autoregressive Models for Content-Rich Text-to-Image Generation
    摘要: 这篇论文介绍了Pathways Autoregressive Text-to-Image (Parti)模型,该模型能够生成高保真度的逼真图像,并支持内容丰富的合成,涉及复杂的组合和世界知识。Parti将文本到图像生成视为序列到序列的建模问题,使用图像标记序列作为目标输出

    方法: Parti模型基于Transformer架构,使用ViT-VQGAN图像分词器将图像编码为离散标记序列。通过扩大模型规模(高达20B参数),实现了一致的质量提升,MS-COCO上的零样本FID得分为7.23,微调后的FID得分为3.22

这三篇论文展示了在图像生成和视觉表示学习领域的最新进展,特别是在利用大规模数据集和模型规模来提高生成图像质量和多样性方面

// 待更

参考文献与推荐阅读

  1. OpenAI sora的技术报告:Video generation models as world simulators
  2. 我在模拟世界!OpenAI刚刚公布Sora技术细节:是数据驱动物理引擎
  3. 爆火Sora参数规模仅30亿?谢赛宁等大佬技术分析来了
  4. 请教英伟达小哥哥,解读 Sora 真正的技术突破
  5. Sora 的一些个人思考(这篇文章有一些表述是错的,需注意辨别,如有冲突 以本文为准)
  6. ViViT论文阅读、ViViT: A Video Vision Transformer阅读和代码、ICCV2021-《ViViT》-视频领域的纯Transformer方案
  7. A Video Vision Transformer 用于视频数据特征提取的ViT详解
  8. 专访 VideoPoet 作者:视频模型技术会收敛,LLM 将取代diffusion带来真正的视觉智能
  9. sora的32个reference
  10. Sora背后团队:应届博士带队,00后入列,还专门招了艺术生
  11. 揭秘Sora技术路线:核心成员来自伯克利,基础论文曾被CVPR拒稿
  12. sora参考文献整理及AI论文工作流完善
  13. 一文看Sora技术推演、一文带你了解OpenAI Sora
  14. Sora的前世今生:从文生图到文生视频
  15. 复刻Sora有多难?一张图带你读懂Sora的技术路径、Sora技术详解及影响分析
  16. 为什么说 Sora 是世界的模拟器?、Sora能作为物理世界模拟器吗
  17. 国内公司有望做出Sora吗?这支清华系大模型团队给出了希望
  18. 国内高校打造类Sora模型VDT,通用视频扩散Transformer被ICLR 2024接收
  19. 我院师生论文被国际学术会议ICLR 2024录用
  20. 万字长文解构中国如何复刻 Sora:模型架构、参数规模、数据规模、训练成本
  21. Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models
    中国如何复刻Sora,华人团队长文解构!996 OpenAI研究员:Sora是视频GPT-2时刻
    微软37页论文逆向工程Sora,得到了哪些结论?
  22. 还有一堆参考和原始论文,由于在上述正文中都已经贴上了对应的link,便没再重复贴至此了..

本文的创作、修订、完善记录

熟悉我文章的人都知道,一篇文章最开始发布的时候一般只能称之为0.1版,随后一两周内会做大量补充、修订、完善从而成为第1版,而后续则可能继续陆陆续续的修订成为第2版、第3版..

  1. 24年2.20,全面修订到0.3版
    补充完善2.1节中对ViViT的介绍
    并修正1.1节中不准确的描述
    补充完善2.5节W.A.L.T:将Transformer用于扩散模型
    以及补充了2.4节「MAGVIT v2:用好tokenizer可以超越diffusion」的内容
  2. 2.21,修订到0.6版,具体修订点包括
    修正1.1节中一个明显的表述错误
    即sora训练中,视频去噪是一次性去噪的,非去噪几帧,再以“已去噪的几帧”去预测接下来的几帧
    增补“2.1.2 4种Video模型下的时空两个维度的注意力计算”中相关的内容
  3. 2.22,修订此节“1.1.2 如何理解所谓的时空编码(含其好处)”中的部分细节,为0.8版
    补充此节的内容:2.2.2 Diffusion Transformer(DiT)的3个不同的条件策略
  4. 2.23,修订此节“1.2.2 类似Google的W.A.L.T工作:引入auto regressive进行视频扩展”的内容
    修订此节“2.1 ViT在视频上的应用:视频Transformer之ViViT”的内容
    补上了此节“2.1.2.2 Model 2:factorised encoder”所对应的示例代码

    是为0.9版
  5. 2.24,为此节“2.1.2 Model 2及其示例代码:factorised encoder”的代码加上注释和完整的数据示例
    是为第1.0版了
  6. 2.26,新增一节的内容,即:2.2.3 扩展:DiT之相似架构U-ViT,
    并纠正文中部分不够精准的描述
    是为1.2版
  7. 2.27,随着对sora的不断深挖,再次新增一节的内容,即2.3 VDT:基于扩散的视频生成中首次使用Transformer(但没带文本条件融合)
    且加上sora官方博客中的这句话:Similar to DALL·E 3, we also leverage GPT to turn short user prompts into longer detailed captions that are sent to the video model
    是为1.4版
  8. 2.28,丰富对2.3节的内容,且精准化一系列相关标题,是为1.5版
  9. 2.29,补充对“2.5 MAGVIT v2:用好tokenizer可以超越diffusion”一节的一个介绍
    且补充下面这一段话
    而当把一帧帧图片打上全部马赛克之后,可以根据”文本-视频数据集”中对视频的描述/prompt(注,该描述/prompt不仅仅只是通过CLIP去与视频对齐,还经过类似DALLE 3所用的重字幕技术加强 + GPT4对字幕的进一步丰富,下节详述),而有条件的去噪

    是为1.6版
  10. 3.1,修订此节的内容:2.4 NaViT:多个patches打包成一个单一序列以实现可变分辨率
    是为1.7版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/427613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读_代码生成模型_CodeGeeX

英文名称: CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X 中文名称: CodeGeeX&#xff1a;一种用于代码生成的预训练模型&#xff0c;并在HumanEval-X上进行多语言评估 链接: https://arxiv.org/abs/2303.17568 代码: http…

政务浏览器——打通信创闭环最后一公里

当前&#xff0c;信创建设工作主要集中在芯片、操作系统、数据库以及pc整机&#xff0c;这些领域基本可用&#xff0c;或者达到了市场主流水平。但是&#xff0c;政务办事场景下的信创落地仍然困难重重&#xff0c;很多地方不得不装双系统或买两台设备来来平衡日常业务和信创考…

CentOS部署FastDFS+Nginx并实现远程访问本地服务器中文件

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

盘点全网哪些超乎想象的高科技工具?有哪些免费开源的最新AI智能工具?短视频自媒体运营套装?

盘点全网哪些超乎想象的高科技工具&#xff1f;有哪些免费开源的最新AI智能工具&#xff1f;短视频自媒体运营套装&#xff1f; 自媒体主要用来干什么&#xff1f; 可以通过短视频吸引更多的观众和粉丝&#xff0c;提升自媒体账号的影响力和知名度。 短视频形式更加生动、直观…

MySQL-----视图

一 视图 ▶ 介绍 视图view是一个虚拟表&#xff0c;非真实存在&#xff0c;其本质是根据SQL语句获取动态的数据集&#xff0c;并为其命名&#xff0c;用户使用时只需使用视图名称即可获取结果集&#xff0c;并可以将其当作表来使用。 数据库中存放了视图的定义&…

windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

HarmonyOS—开启AOT编译模式

AOT&#xff08;Ahead Of Time&#xff09;即提前编译&#xff0c;能够在Host端&#xff08;即运行DevEco Studio的电脑&#xff09;将字节码提前编译成Target端&#xff08;即运行应用的设备&#xff09;可运行的机器码&#xff0c;这样字节码可以获得充分编译优化&#xff0c…

OpenMMlab AI实战营第三期培训

OpenMMlab AI实战营第三期培训 OpenMMlab实战营第三次课2023.2.2学习参考一、pytorch完整训练过程二、基于mmclassification做图像分类1.安装mim工具包以及必备的库2. OpenMMlab项目中的重要概念&#xff08;1&#xff09;配置文件&#xff08;2&#xff09;下载配置文件 3.训练…

Frontend - Boostrap 消息弹窗

目录 一、下载 &#xff08;一&#xff09;中文官网 &#xff08;二&#xff09;bootstrap v3 依赖 jQuery 插件 二、解压并安装 &#xff08;一&#xff09;解压 1. 压缩包解压 2. 简化文件 &#xff08;二&#xff09;安装 三、配置 &#xff08;一&#xff09;bas…

CDN介绍

概念介绍 CDN Content Delivery Network&#xff0c;缩写&#xff1a;CDN&#xff09;是一种提供更快互联网访问的服务&#xff0c;通过在网络的边缘或核心交换区域部署内容代理服务器来实现。这些服务器利用全局负载调度机制来分发内容&#xff0c;从而构建了一个覆盖范围广…

2023年个税申报:“婴幼儿照护专项附加扣除标准”你选对了没有?

2023年个税申报&#xff1a;“婴幼儿照护专项附加扣除标准”你选对了没有&#xff1f; 根据《国务院关于设立3岁以下婴幼儿照护个人所得税专项附加扣除的通知》(国发〔2022〕8号)&#xff1a; 一、纳税人照护3岁以下婴幼儿子女的相关支出&#xff0c;按照每个婴幼儿每月1000元…

技术总结: PPT绘图

目录 写在前面参考文档技巧总结PPT中元素的连接立方体调整厚度调整图形中的文本3D 图片调整渐变中的颜色 写在前面 能绘制好一个好看的示意图非常重要, 在科研和工作中好的示意图能精准表达出自己的想法, 减少沟通的成本, 可视化的呈现也可以加强自身对系统的理解, 时间很久后…

Linux进程间通信方式之socket使用实例

TCP/IP协议族包括运输层、网络层、链路层&#xff0c;而socket所在位置如图&#xff0c;Socket是应用层与TCP/IP协议族通信的中间软件抽象层。 下面是网络socket通信的基本流程&#xff1a; socket函数 int socket(int domain, int type, int protocol);socket函数对应于普通…

DevOps学习 | 如何应对IT服务交付中的问题?

目录 前言 DevOps是什么&#xff1f; DevOps发展历程 DevOps与微服务、容器的关系 书本推荐 前言 作为一个热门的概念&#xff0c;DevOps这个名词在程序员社区里频频出现&#xff0c;备受技术大佬们的追捧。甚至网络上有了“南无DevOps”的戏言&#xff08;南无在梵语的意…

MySQL面试题【全面】

基础内容 1、MySQL的架构分层 &#xff08;1&#xff09;Serve层&#xff1a;负责建立连接、分析和执行 SQL。 MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xff0c;所有的内置函数&…

解析 openGauss 的 AutoVacuum 机制及优化策略

前言 在 openGauss 数据库中&#xff0c;AutoVacuum 机制是一个关键的自动化功能&#xff0c;用于管理表的空间和性能。AutoVacuum 通过定期清理过时数据和更新统计信息&#xff0c;帮助数据库管理员维护数据库的性能和稳定性。 为什么需要 AutoVacuum&#xff1f; 了解AutoV…

SOCKS55代理 VS Http代理,如何选择?

在使用IPFoxy全球代理时&#xff0c;选择 SOCKS55代理还是HTTP代理&#xff1f;IPFoxy代理可以SOCKS55、Http协议自主切换&#xff0c;但要怎么选择&#xff1f;为解决这个问题&#xff0c;得充分了解两种代理的工作原理和配置情况。 在这篇文章中&#xff0c;我们会简要介绍 …

第15届蓝桥STEMA测评真题剖析-2024年1月28日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第173讲。 第15届蓝桥第4次STEMA测评&#xff0c;这是2024年1月28日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

羊大师揭秘羊奶与健康,美味的保健佳品

羊大师揭秘羊奶与健康&#xff0c;美味的保健佳品 羊奶确实是一种美味且健康的保健佳品&#xff0c;其独特的营养成分和风味使其成为许多人的健康选择。以下是一些羊奶与健康的关系&#xff1a; 营养丰富&#xff1a;羊奶含有丰富的蛋白质、脂肪、矿物质和维生素&#xff0c;…

【latex过长或过短】 表格大小调整 解决方案

文章目录 1、表格过短 1.2 问题描述1.2 解决方案 2、表格过长&#xff0c;显示信息不全 2.1 问题描述2.2 解决方案 1、表格过短 1.2 问题描述 表格占整个页面的宽度较小&#xff0c;如下图&#xff1a; Latex源码如下&#xff1a;\begin{table*} \caption{short} \label{t1} …