2024年2月那批Sora样片放出来的时候做视频生成的朋友圈几乎炸了。大家讨论的焦点都在“能生成一分多钟、画面还这么稳”但作为一个长期折腾扩散模型的人我当时的关注点反而有点偏OpenAI居然把视频生成的主干网换成了DiT——Diffusion Transformer。接下来不到一年里事情就像推倒了多米诺骨牌可灵、Runway Gen-3、Vidu、CogVideoX、混元视频、豆包视频凡是能打出来的视频大模型技术报告里几乎都写着同一个架构关键词DiT。今天这篇漫话我就把这个“剧本”拆开聊透——DiT到底解决了什么问题、为什么视频模型集体改抄这一份作业、以及真到了自己动手训练的时候有哪些坑是躲不开的。1. 一个架构的逆袭DiT凭什么终结了U-Net时代1.1 先搞清楚DiT是什么用大白话说现在的视频生成模型基本都是扩散模型这个路线的工作方式很像雕刻先给模型看一块纯噪声的“大理石”然后让它一步步把复杂的画面从噪声里剥出来。这个“剥”的过程里真正负责理解画面、预测噪声并重建结构的骨干网络在长一段时间里都是U-Net——一种长得像字母U的卷积神经网络左边不断缩小分辨率提取特征右边再逐步放大还原细节中间还有跳跃连接把高低层信息拼在一起。DiT的全称是Diffusion Transformer核心改动只有一句话把扩散模型的骨干网络从卷积U-Net换成Transformer。这个想法最早来自William Peebles和谢赛宁在2022年底发表的论文《Scalable Diffusion Models with Transformers》后来拿了ICCV 2023的最佳论文。论文做的事情非常直接保留扩散模型的训练框架和采样过程只把主干换掉然后观察效果。换掉之后发生了两件事。第一DiT在图像生成上拿到了当时的SOTA成绩比如在ImageNet 256x256上FID达到了2.27第二也是我更看重的它在不同模型规模下的表现呈现出非常平滑的扩展趋势——模型加大效果稳定变好没有什么瓶颈期。这在U-Net上是很难看到的U-Net往往加大到一定程度就开始边际收益递减。很多朋友会问Transformer也不是新东西为什么之前没用因为前面的工程惯性太大了。Stable Diffusion把U-Net CLIP的组合做到了极致社区里大量模型、LoRA、ControlNet都是基于这个组合训练的迁移成本高得吓人。所以DiT论文发出来之后业内真正敢直接换骨干的团队不多直到Sora用事实证明了这条路在视频方向上不仅走得通而且走得更远。1.2 Transformer的“去人类先验”哲学U-Net和Transformer之间最本质的分歧不是网络形状不一样而是“要不要给模型预设太多人类知识”。U-Net自带两个很强的先验一个是局部性图像里相邻像素更相关所以用卷积小窗口扫描另一个是多尺度金字塔先缩再放天然假设画面细节存在层级结构。这两个假设在图片生成上很合理但它们同时限制了模型——你告诉它“世界长这样”它就很难跳出这个框架去发现别样的规律。Transformer则是一个几乎不预设任何先验的架构。它把一切输入都切成patch图像块当作token然后用自注意力机制让每个token和其他所有token两两交互。模型自己决定要关注哪里、怎么组合信息。等到数据足够多、算力足够大时这种“搭积木”式的通用结构能比手工精雕的U-Net挖掘出更复杂、更抽象的模式。我习惯打个比方U-Net是一台为煎饼定制的模具机换做三明治就得大改Transformer是一套万能乐高搭法你自己去学只要零件足够多你在数据和算力上投入多少它就还你多少。视频生成比图像复杂得多涉及空间纹理、物体运动、时间连贯性、光照变化人类很难设计出完美的归纳偏置。这时候把判断权交给模型、自己只负责堆规模和数据的路线反而成了更优解。Sora最大胆的地方就是它把这一哲学贯彻到了视频领域。2. 为什么全行业都在“抄”Sora的作业2.1 视频生成不是“图像加个时间轴”很多人以为视频生成图像生成然后一帧帧做这恰恰是最容易踩的坑。视频比图像多了一个时间维度物体的运动必须是连续且符合物理直觉的前后帧的光照、遮挡、形变都要保持一致。你单独把每帧生成得再漂亮拼起来也会闪烁、跳变、扭曲这就是业内常说的时序不一致。U-Net处理视频时一般是在2D卷积的基础上额外加时间卷积或者时间注意力模块。听起来很简单实际上总是在“空间表达”和“时间建模”之间做笨重的折中空间模块不知道怎么跟时间模块协同或者时间模块的计算量太大只能做得很浅。这类早期的U-Net视频扩散模型比如VideoLDM、LaVie等生成几秒钟短视频还勉强能用但稍微延长时长、物体多一些画面就控制不住了。DiT解决这个问题的方式很优雅它不把时间当成什么特殊的维度而是把视频的每一个小片包括空间和时间维度都打成token全部丢进统一的注意力机制里处理。模型在算第10帧某个像素跟第3帧另一个像素的关系时跟算同一帧内两个像素的关系走的是同一条路径。空间和时间的相关性被同等对待这种端到端学习的方式在数据足够多的时候远比“人工用模块去拼”来得更符合视频世界的真实规律。2.2 Sora的示范效应与工程取舍2024年2月Sora首次公开演示时还没有公开论文和代码但OpenAI发布的技术报告里明确提到Sora是建立在DiT之上的同时使用了视觉压缩网络把视频先压缩到潜空间再在潜空间里用DiT建模。这几乎等于给全行业指了一条明确的技术路线。Sora的示范效应是双重的。第一重是效果背书——大家看到60秒的长镜头、复杂场景下物体交互、相对稳定的物理规律这些用U-Net很难做到于是“原来这条路能走通”成了共识。第二重是工程指导——OpenAI给出的架构组合足够精简图像/视频统一切patch、压缩到latent空间、用DiT生成、再解码。后续出现的几乎所有视频模型都能在这个框架里找到自己的位置。这里我要多说一句“工程取舍”。很多人以为Sora吃掉了大量算力才能生成长视频但从公开信息推断Sora大概率也是用短片段训练的生成长视频时再用一种分段的、自回归式的方式拼接或扩展。这种“短训长推”的技巧后来也被各家沿用比如先训5秒、10秒推理时逐步外推并配合时间重叠和插值来保证接缝处一致。整个行业实质上共享了一套工程包。2.3 旧U-Net视频模型为什么“命短”这不是说U-Net在视频生成上一无是处。在小规模数据、短视频片段上U-Net训练稳定、收敛快、显存可控所以2023年那批论文几乎全是U-Net的天下。但一旦把目标拉高到“长时长、高分辨率、多物体、复杂运动”U-Net就暴露出一个致命问题扩展性差。“扩展性差”不是说加参数不加效果而是它的效果增长曲线会先陡后缓模型到一定规模后投入产出比极低。DiT恰恰相反因为Transformer的每一层、每个head都在做统一的全局建模数据和算力堆上去能力几乎是线性的稳定增长。这就导致视频模型赛道一旦进入“军备竞赛”DiT天然占优。各家看到Sora的效果后很快意识到如果继续用U-Net可能在架构层面就已经输了于是“换骨干”从技术选择变成了生存选择。还有一个容易被忽略的点工程生态。DiT把主干统一成了Transformer整个大模型生态里的基础设施都能复用包括分布式训练框架、混合精度策略、推理加速方案、甚至LoRA微调方法。视频模型团队可以借力大语言模型领域的成熟工具省下大量底层优化时间。这种事U-Net社区完全没法比。3. 拆开DiT那些绕不开的关键设计3.1 从像素到Token的Patchify操作DiT的第一步是把视频从“一堆像素”变成“一长串token”。具体做法是先用一个3D VAE变分自编码器把视频压缩到潜空间这个潜空间已经大幅缩小了时空分辨率然后再用patchify把潜空间切成一个个小方块每个方块线性映射成一个token。为什么需要3D VAE因为原始视频实在太大了。算一笔账一段10秒、720p、30fps的视频大约是1920x1080的1/3也就是1280x720共300帧。你要直接对像素做Transformertoken数量就是天文数字显存直接爆炸。用3D VAE压缩后空间维度通常压8倍时间维度压4倍那么latent就变成160x90x75大概108万个格子。如果用patch size 2x2token数能压到约27万。这个量级对现在的训练框架还是大所以训练时通常再截短片段、降低分辨率或者用更大的patch、更强的压缩。Patchify里patch size的选择直接决定“看多细”和“看多粗”的平衡。patch越小细节保留越好但token数成倍上涨训练成本和显存消耗都跟着飙patch越大计算压力下来了但小物体和精细纹理容易丢失。工程上通常的做法是训练阶段用适中patch推理阶段用更细patch配合模型微调。另外位置编码也在这里起作用——视频token是三维排布的必须在patch加上三维位置编码让模型知道每个token对应空间的哪个位置、时间的哪个时刻否则模型无法理解结构的顺序关系。3.2 时空注意力联合还是分离DiT主干里的自注意力有一个核心设计问题空间维度和时间维度的注意力是放在一起算还是分开算联合时空注意力joint attention是指把所有token直接合并起来在整段视频里做一次全局注意力。理论上表达能力最强Sora很可能就是类似思路。缺点是计算复杂度随着token总数平方增长长视频直接算不过来。分离注意力factorized attention则是先做空间注意力再做时间注意力或者反过来参数和计算量都省不少但模型必须隐式协调两种注意力的信息流转表达上会有损失。目前行业里两种路线都有实践。有些模型用联合注意力换质量但只敢在短视频上训练有些模型用分离注意力换效率可以通过叠加更多模块来补表达能力。还有一个变体是混合结构比如CogVideoX把注意力块做成专家混合的形式一部分专家做空间建模一部分做时间建模再由router动态分配兼顾了效率和效果。选哪种没有绝对答案更多取决于你能接受的计算预算和期望的生成质量。3.3 条件注入的三种姿势视频生成不是无中生有用户会输入文字提示、参考图或者运动轨迹DiT要把这些条件“告诉”主干网络。常见的方式有三种。第一种是AdaIN/adaLN就是自适应层归一化。DiT原文用的是adaLN-Zero把文本或时间步条件通过一个MLP映射成缩放和偏移参数作用到每一个Transformer子层上。这种方式高效、稳定是DiT论文的默认选择。第二种是交叉注意力cross-attentionStable Diffusion系列的老牌做法。文本token作为查询外的key/value跟主干token做跨模态交互。这种方式对文本语义的把控更精细代价是多一个注意力计算模块训练和推理都更重。第三种是上下文拼接in-context conditioning直接把条件token拼到主序列前面让Transformer当普通序列处理类似大语言模型的prefix prompting。这种方式最省事且灵活但对模型容量要求更高条件信息也容易被长序列淹没。实际视频模型里的做法往往是混搭文本用交叉注意力时间步用adaLN参考图用拼接。没有哪个方案是银弹核心原则是“在保证条件表达足够强的同时别让额外模块变成训练负担”。4. 玩家盘点从Sora到可灵、Vidu、CogVideoX4.1 各家模型都用了什么样的DiT变体与其空谈概念不如看看行业里的真实选择。下面是我根据公开技术报告和资料整理的一张表不一定100%精确但能反映主流趋势模型机构骨干架构压缩方式条件注入亮点SoraOpenAIDiT未公开细节视频压缩网络文本图像patch长视频、物理一致性可灵Kling快手DiT系3D VAE文本图生视频高分辨率长视频Vidu生数科技/清华U-ViTTransformer扩散3D VAE等文本图像多主体一致性CogVideoX智谱AIDiT Expert Blocks3D因果VAE文本开源、模块化设计混元视频腾讯DiT MLLM3D VAE文本大模型编码中文语义理解强Stable Video DiffusionStability AI早期U-Net后续转向DiT2D/3D VAE文本图像生态完善、社区工具多表格里能看出两个共性第一几乎都采用了VAE先压缩、再进入DiT生成的两阶段结构第二文本条件都由更强的文本编码器或多模态大模型来承担而不是像早期那样只用CLIP裸编码。4.2 架构选择背后的共性与差异共性背后一定是因为这套范式在工程上经过了验证。先训练一个强大的视频VAE把像素级复杂问题解耦成压缩重建问题再训练DiT只在低维的潜空间里学习时空规律。两个问题分开优化每一步都比端到端硬训练更容易收敛。差异主要体现在三处。一是VAE的时间压缩率有的模型压4倍有的压8倍压缩越狠DiT侧越轻松但重建时的细节损失就越大。二是注意力组织方式有的用联合注意力保质量有的用分离注意力省算力。三是flow matching和DDPM的选择——纯扩散模型通常用DDPM那一套噪声预测而现在越来越多的视频模型改用flow matching直接学习速度场典型代表是Stable Diffusion 3和很多DiT新模型训练更稳、采样更短。还有一个被低估的差异训练策略。有的模型用阶梯式分辨率从低清短片段逐步过渡到高清长片段有的模型在训练时交替使用随机帧样本让模型学会时间插值有的干脆引入自回归预测作为辅助任务。这些五花八门的训练技巧很多时候比架构本身更影响最终效果。4.3 从生成效果看DiT的优势具体体现在哪回到体验层面换了DiT之后视频生成到底强在哪我自己的观察有三个。第一是长镜头下的稳定性物体不会在几秒后忽然消失或变异镜头切换和遮挡关系更合理因为全局注意力让模型记住了前面几十帧的信息而不是“过目即忘”。第二是多物体的交互单人走路这类简单场景U-Net也能做但“几个人抢一个球、球反弹、影子交错”这种复杂交互DiT能学出更细的规律因为token之间是全连接的。第三是物理规律的“意外涌现”很多DiT模型没有显式建模重力、碰撞、流体却在长视频里表现出近似物理的轨迹这种能力大概率来自Transformer在大规模数据上学到的通用世界规律是U-Net天然的归纳偏置撑不出来的。当然DiT不是处处完美。它生成特定类型的内容时也可能崩比如文字、人手、复杂反射但这些更多受数据和文本编码器限制而不是架构尽头。每次看到有人拿DiT生成失败案例说“架构不行”我都觉得判断偏了。5. 实操与避坑训练一个DiT视频模型要注意什么5.1 显存与Token数量之间的“账”真自己上手训练DiT视频模型首先撞上的就是钱和显存问题。Transformer的计算量主要由token数量决定视频的token又格外多。显存不够不是玄学而是可以精确算出来的“账”。以一套常见配置为例DiT-Large隐藏维度102412层Transformer训练一段16帧、256x256的视频。先过4x时间压缩和8x空间压缩的VAE得到latent是16x32x32大约16384个格子用patch size 2x2token数就是4096。每个token在每层Transformer里需要保存QKV、注意力分数、中间激活粗略估算每个token每层占用几百KB级别的显存取决于batch size和混合精度4096个token、12层叠加之后一张A100的80GB显存也只能跑很小的batch。这还没算梯度和优化器状态。实操中的应对办法主要有几个。一是用更大的patch比如从2x2改成4x4token数降四倍但细节会有损失。二是用序列并行把token切到多张卡上分别计算注意力。三是用梯度检查点用时间换显存。四是尽量用bf16混合精度别用fp16——fp16在扩散模型训练里极易溢出loss直接变NaN。五是控制batch size宁小勿大稳定性优先。我自己的习惯是先做一次“显存预演”用一个极小的视频样本把完整训练流程跑通观察显存峰值再决定每张卡的batch数量。5.2 常见失败模式与排查要点我在训练DiT视频模型时踩过不少坑整理成一张速查表失败现象可能原因排查与解决训练loss不降或震荡学习率过大fp16溢出条件信号没对齐换bf16或FP32降低学习率检查文本编码器输出和视频帧是否配对生成画面闪烁缺乏时间维建模VAE逐帧编码导致latent不连续换3D VAE确保latent包含时间维压缩增大时间注意力权重运动幅度过小分类器自由引导CFGscale过高丢帧率太低降低CFG增加训练数据里的高动态视频比例重复物体/文字扭曲文本编码器能力不足注意力头数量不够换更强文本编码器或多模态大模型增加模型容量生成崩溃/纯噪声采样步数太少训练与推理的噪声调度不一致增加采样步数检查训练时用的噪声schedule和推理端是否一致视频前后帧颜色跳变VAE重建不稳定条件信息在帧间漂移训练时加入帧间一致性loss使用更稳定的VAE版本闪烁问题尤其值得展开说说。很多人一开始用2D VAE逐帧编码视频做完DiT后发现画面一亮一暗这就是因为每一帧独立经过VAElatent之间的噪声结构不连续后面的DiT再怎么建模也补不回原始的连续性。换成3D VAE把时间维度也一起压缩latent本身就携带了帧间关联生成的视频才真正连贯。5.3 我在实验里反复用的几个技巧分享几条常规文档里找不到、但我在实际操作中反复用到的经验。第一永远先做smoke test。正式训练前用最小的配置、最短的视频片段、最少的采样步数把整个训练和推理流程跑通。这一步能帮你提前发现显存溢出、数据加载死锁、条件对齐出错等一堆问题。千万别上来就开大实验失败一次浪费的成本够你跑几十次smoke test。第二优先冻结VAE只训练DiT。视频VAE的训练和DiT训练经常互相干扰先固定VAE专注把DiT练好再回头解冻VAE做联合微调收敛稳定得多。第三用flow matching替代DDPM。我自己从DDPM切到flow matching之后最大的感受是训练曲线更平滑采样步数能显著减少同样的算力下可以跑更多轮实验。不要被“换训练目标要大改代码”吓到其实两者的网络结构完全不变只是预测目标和损失函数换一下。第四认真对待CFG参数。分类器自由引导对视频生成的影响远大于图像。引导scale太低视频没有动感太高画面艳丽但运动僵住。务必在训练和推理中分别调CFG找到你任务的甜点区。6. 写在最后DiT会是终点吗现在回到开头那个问题所有视频模型都在抄同一个剧本吗严格说是的至少公开技术路线的模型绝大部分都落在DiT这个框架里。但我觉得这未必是终点更像是一个基础设施形态的固化——像大语言模型领域Transformer成了标配但不妨碍大家对注意力机制、位置编码、混合专家做出各种改良。DiT同理它会继续演化有人做更强的3D VAE有人把Mixture of Experts嵌进DiT减少计算量有人尝试将视频理解和生成统一到同一个DiT模型里最早Dall-E的不可控、Sora的物理规律缺失、以及时长超过几分钟后的记忆混乱这些问题DiT也没完全解决。从我个人的经验出发如果现在有人问我“要不要All in DiT”我的回答是先把DiT论文吃透再用小规模实验跑通一遍条件允许的话再考虑视频方向。DiT的学习曲线其实比想象中友好它不要求你同时精通卷积和Transformer反而只要你懂扩散模型的框架就能快速上手。真正难的从来不是背下某篇论文的结构而是知道在什么场景下选什么变体、遇到问题去哪里排查。最后再分享一个小技巧新手入门DiT不要一上来就挑战视频。先在图像数据集上复现DiT-XL的ImageNet结果体会patchify、adaLN-Zero、CFG这些基础操作的手感再切到视频领域你会少走很多弯路。毕竟这个行业里能跑通一次完整实验的人已经跑赢了大多数人。
阅读完成 · 觉得有帮助?