首页 / 资讯中心 / 文章详情

视频生成模型为何集体转向DiT?从U-Net到Transformer的技术演进

视频生成模型为何集体转向DiT?从U-Net到Transformer的技术演进 ★ FEATURED ARTICLE
视频生成这个赛道从2024年初Sora亮相到现在技术路线的收敛速度快得有点出人意料。如果你把最近一年冒出来的主流视频生成模型——不管是国外的还是国内的——拆开看它们的网络结构图会发现一个很明显的现象大家不约而同地把原来的U-Net主干换成了Transformer准确说是换成了DiTDiffusion Transformer这套骨架。标题里说所有视频模型都在抄同一个剧本这话虽然糙但方向是对的。这篇就聊聊DiT到底是什么、为什么它能在视频生成里取代U-Net、单流和双流DiT的区别在哪以及如果你想自己动手跑一个视频模型需要理解哪些关键设计。1. 从U-Net到DiT视频生成主干网络为什么必须换1.1 扩散模型的老搭档U-Net到底卡在哪要理解DiT为什么火得先搞清楚它替代的U-Net有什么问题。扩散模型Diffusion Model的核心思路是给一张图不断加噪声直到变成纯噪声然后训练一个网络学会从噪声里一步步把原图还原回来。这个还原网络在图像时代基本都用U-Net。U-Net的结构特点是有下采样、有上采样、中间有跳跃连接整体是个U形。它在图像生成上非常成功Stable Diffusion 1.5到2.1用的都是这套。但问题在于U-Net的归纳偏置inductive bias是偏向图像的——它假设数据有很强的局部性和空间层级结构卷积核在局部窗口上滑动下采样压缩空间分辨率。这套假设对静态图像很合适但视频多了一个时间维度情况就变了。视频本质上是图像序列时间一致性。你不仅要让每一帧看起来合理还要让帧与帧之间的运动连贯、物体不闪烁、镜头运动自然。U-Net处理视频时通常的做法是在2D卷积基础上加一层时间注意力或者把2D卷积膨胀成3D卷积。但这样做的结果是时间维度的建模能力被附加在空间结构上而不是原生地统一处理。当视频分辨率提高、时长拉长U-Net的卷积感受野和注意力机制的配合就越来越吃力。更关键的是可扩展性scalability。U-Net的卷积结构在参数量增大到一定程度后性能提升会放缓而Transformer在语言模型上已经证明了参数越大、数据越多、效果越好的缩放定律Scaling Law。视频生成需要海量参数来建模复杂的时空分布U-Net在这方面先天不占优势。1.2 DiT的核心思路让扩散过程跑在Transformer上DiTDiffusion Transformer的思路其实很直接既然Transformer在序列建模上这么强那能不能把扩散模型的去噪网络整个换成Transformer答案是能而且效果更好。具体做法是这样的把输入的图像或视频先切成一个个小块patch每个patch展平成一个向量加上位置编码就变成了一串token序列。这串token送进标准的Transformer块多头自注意力前馈网络输出再还原成patch拼回图像或视频。整个过程和Vision TransformerViT处理图像分类几乎一样区别只在于输出不是类别而是预测的噪声。这个设计的美妙之处在于Transformer对输入序列的每个元素一视同仁不预设局部性。视频的时空信息被统一编码成token序列模型自己学习哪些token之间该建立强关联。空间上相邻的patch、时间上相邻的帧模型都能通过注意力机制灵活处理而不是被卷积核的固定窗口限制死。这里有个容易混淆的点DiT不是用Transformer替代扩散模型而是用Transformer作为扩散模型的去噪主干。扩散的加噪、去噪、采样流程完全没变变的只是那个负责预测噪声的网络结构。1.3 为什么视频模型比图像模型更依赖DiT图像生成用U-Net也能跑得很好为什么视频就非得换DiT核心原因是视频的token数量爆炸式增长。假设一张512x512的图像切成16x16的patch得到32x321024个token。如果是一段16帧的512x512视频token数就变成1024x1616384个。如果分辨率提到1024x1024、时长拉到几十秒token数轻松突破十万。U-Net的卷积结构在处理这种长序列时感受野增长很慢需要堆很多层才能让远距离的时空位置产生交互。而Transformer的自注意力机制任意两个token之间都是一步直达天然适合处理长距离依赖。另外视频生成对全局一致性的要求远高于图像。比如一个镜头里人物从左走到右U-Net可能因为局部感受野的限制在人物移动到画面边缘时出现形变或消失。DiT的全局注意力能让模型在生成每一帧时都看到整个视频的上下文一致性自然更好。2. DiT的内部构造patch化、条件注入与adaLN-Zero2.1 视频patch化把时空切成token序列DiT处理视频的第一步是patch化patchify。对于图像做法是把HxW的图像切成PxP的patch每个patch展平后经过一个线性层映射到隐藏维度D。对于视频多了时间维度T通常有两种处理方式第一种是时空patch即用PxPxP的3D patch同时切空间和时间。比如2x16x16的patch表示时间上取2帧、空间上取16x16的区域。这种方式token数最少但时间分辨率被压缩得比较狠。第二种是空间patch时间独立即每帧单独切成PxP的2D patch然后所有帧的patch按顺序拼成一个长序列。这种方式保留了完整的时间分辨率但token数更多。实际实现中很多视频DiT采用折中方案空间上用较大的patch如16x16时间上先用一个轻量的3D卷积或时间压缩模块降低帧率再送进Transformer。这样既控制了token数量又保留了一定的时间建模能力。patch化之后每个token会加上位置编码。视频的位置编码需要同时编码空间位置和时间位置常见做法是分别生成空间位置编码和时间位置编码然后相加或拼接。有些实现还会用可学习的绝对位置编码让模型自己学出时空位置关系。2.2 条件注入时间步、文本、类别怎么进网络扩散模型的去噪网络必须知道当前是第几步去噪时间步t否则没法判断该去掉多少噪声。对于条件生成比如文生视频还需要注入文本提示词的信息。DiT处理这些条件的方式很有讲究。最直接的方式是in-context conditioning把时间步和文本的embedding当成额外的token直接拼到输入序列前面让Transformer自己通过注意力去读取。这种方式实现简单但条件信息可能被淹没在大量视觉token里。更常用的是cross-attention在Transformer块里加一层交叉注意力让视觉token去查询文本token。Stable Diffusion就是这种方案。但cross-attention会增加计算量而且对时间步这种标量条件不太自然。DiT论文里提出的是adaLN-Zeroadaptive layer norm with zero initialization这也是目前视频DiT最主流的条件注入方式。具体做法是把时间步和类别或文本的embedding相加经过一个MLP生成六个参数缩放scale和偏移shift各两组分别用于自注意力和前馈网络之前的LayerNorm以及一组门控参数用于残差连接。这些参数初始化为零使得训练初期整个DiT块近似于恒等映射训练更稳定。adaLN-Zero的精髓在于零初始化。如果门控参数初始不为零训练初期残差分支的输出会随机扰动主干导致loss震荡。零初始化让模型从什么都不做开始逐步学会注入条件信息收敛更平滑。2.3 单流DiT与双流DiTMMDiT和STDiT的区别视频DiT发展到现在分化出了两个主要流派单流single-stream和双流dual-stream。双流DiT的代表是Open-Sora用的STDiTSpatial-Temporal DiT。它的做法是把空间注意力和时间注意力分开先做空间自注意力同一帧内的patch互相attend再做时间自注意力同一空间位置跨帧attend。这种分离式设计降低了计算复杂度因为空间注意力和时间注意力各自处理的序列长度更短。但缺点是空间和时间的交互是间接的模型需要多层堆叠才能让时空信息充分融合。单流DiT的代表是Meta的MMDiTMulti-Modal DiT用在SD3和后续的视频模型里。它的做法是把文本token和视觉token拼成一个序列一起送进Transformer让它们在同一套自注意力里自由交互。这种设计让文本和视觉的对齐更直接生成结果对提示词的遵循度更高。但计算量更大因为序列长度增加了。对比维度双流DiTSTDiT单流DiTMMDiT注意力结构空间、时间分离时空统一文本注入交叉注意力或adaLN拼进序列一起attend计算复杂度较低较高文本遵循度中等较高代表模型Open-SoraSD3、部分视频模型实际选型时如果算力有限、追求训练效率双流DiT更友好如果追求生成质量和文本对齐单流DiT上限更高。现在越来越多的视频模型倾向于单流方案因为算力不再是最大瓶颈质量才是。3. 视频DiT的训练与推理从噪声到连贯视频的完整链路3.1 训练目标预测噪声还是预测速度扩散模型的训练目标看似简单给一张干净视频加噪声让网络预测加进去的噪声。但具体预测什么有几种不同的参数化方式。最经典的是预测噪声εepsilon-prediction。给定干净样本x0和噪声ε加噪后的样本xt sqrt(α_t)x0 sqrt(1-α_t)ε网络学习从xt和t预测ε。这种方式在图像扩散里很成熟但视频扩散里有个问题当噪声水平很高时xt几乎全是噪声预测ε的难度很大梯度信号弱。另一种是预测速度vvelocity-predictionv sqrt(α_t)ε - sqrt(1-α_t)x0。这种方式在高低噪声区间都有较好的梯度特性训练更稳定。Stable Diffusion 3和不少视频模型都转向了v-prediction。还有一种是预测x0本身但这种方式在高噪声区间不稳定因为从纯噪声预测干净视频太难。实际训练时很多视频DiT会采用混合预测或动态切换策略在低噪声区间预测x0高噪声区间预测ε或v。这样兼顾了各噪声区间的训练效率。3.2 时间步采样与噪声调度视频为什么需要更精细的调度图像扩散的时间步采样通常是均匀的或者用一些启发式方法如cosine schedule。但视频扩散对噪声调度更敏感原因是视频的时空结构更复杂不同噪声水平下模型需要学习的东西差异很大。在低噪声区间t接近0视频已经基本清晰模型主要学习细节修复和纹理生成。在高噪声区间t接近T视频几乎是纯噪声模型主要学习整体布局和运动趋势。中间区间则负责结构和运动的细化。如果均匀采样中间区间的训练样本会过多导致模型在细节和整体布局上都不够精。实践中常用的做法是logit-normal采样让时间步的采样分布偏向两端增加低噪声和高噪声区间的训练权重。这样模型在去噪的起始和收尾阶段都能学得更充分。另外视频扩散还需要考虑帧间噪声一致性。如果每一帧独立加噪帧与帧之间的噪声不相关模型很难学到时间连贯性。所以视频扩散通常采用共享噪声或相关噪声策略同一段视频的所有帧共享一部分噪声或者噪声在时间上有相关性。这样模型才能从噪声中恢复出连贯的运动。3.3 推理采样DDIM、DPM-Solver与蒸馏加速训练完之后推理阶段要从纯噪声一步步去噪生成视频。最基础的是DDPM采样需要上千步慢得没法用。实际都用加速采样器。DDIMDenoising Diffusion Implicit Models是早期常用的加速方法能把步数降到50-100步。它的核心是构造一个非马尔可夫的确定性采样过程让模型可以跳步去噪。但DDIM在视频上有时会出现帧间不一致因为跳步会放大误差。DPM-Solver是更先进的求解器把扩散过程看成常微分方程ODE用高阶数值方法求解。它能在20-30步内达到DDIM 100步的质量是目前视频DiT推理的主流选择。DPM-Solver还针对引导采样做了优化支持classifier-free guidance的高效计算。如果还嫌慢就要上蒸馏distillation。常见的有渐进式蒸馏Progressive Distillation和一致性模型Consistency Model。渐进式蒸馏让模型学会一步顶两步逐步把步数压到4-8步。一致性模型则直接学习从任意噪声水平一步映射到干净样本理论上可以一步生成但视频上目前还难以做到高质量一步生成。实测经验视频DiT推理时classifier-free guidance的scale对结果影响极大。scale太低3会导致文本遵循度差scale太高10会导致画面过饱和、运动僵硬。文生视频一般用6-8图生视频用3-5。这个参数需要针对具体模型调没有万能值。4. 想自己跑视频DiT环境、显存与实操避坑4.1 本地部署的硬件门槛与显存估算视频DiT的显存需求比图像模型高一个数量级。以一段16帧512x512的视频为例token数约16384隐藏维度假设1152那么单层自注意力的注意力矩阵就是16384x16384光这一项就是268M个浮点数约1GB显存fp16。如果模型有28层中间激活值累加起来轻松超过20GB。实际部署时显存估算可以按这个公式粗算显存 ≈ 参数量 x 2字节fp16权重 激活值 优化器状态训练时。推理时优化器状态不需要但激活值仍然是大头。一段16帧512x512视频推理显存大约需要12-16GB如果生成32帧或更高分辨率24GB显存是起步。如果显存不够有几个降级方案降低分辨率512降到384、减少帧数16降到8、使用梯度检查点用时间换显存、使用CPU offload把部分层放到内存。但这些都会牺牲速度或质量。4.2 从零训练还是微调数据与算力的现实考量从零训练一个视频DiT数据量和算力需求是个人开发者难以承受的。以Open-Sora为例训练数据是百万级别的视频片段算力是数百张GPU跑数周。个人或小团队更现实的路径是微调。微调又分几种全量微调更新所有参数、LoRA低秩适配只训练少量新增参数、ControlNet加一个条件控制分支。LoRA最省资源一张24GB显卡就能微调一个视频DiT适合定制风格或特定运动模式。ControlNet适合加新条件如深度图、姿态但需要额外训练控制分支。微调数据准备有个坑视频帧率要统一。如果训练数据里有的30fps有的24fps模型学到的运动速度会混乱。建议统一重采样到固定帧率如8fps或16fps并在训练时固定采样帧数。4.3 常见报错与排查OOM、loss不降、生成闪烁跑视频DiT最容易遇到的三个问题显存溢出OOM最常见。排查顺序是先降batch size到1再降分辨率再降帧数最后开梯度检查点。如果还OOM检查是否有不必要的中间变量没释放或者注意力实现是否用了内存高效的版本如FlashAttention。loss不降或震荡先检查学习率是否太大视频DiT通常用1e-4到5e-5再检查噪声调度是否合理。如果loss在前几百步就卡住可能是条件注入有问题——比如文本embedding没正确对齐或者时间步embedding维度不匹配。另外adaLN-Zero的零初始化如果没做对训练初期会很不稳定。生成视频闪烁帧间不一致的典型表现。原因可能是时间注意力太弱增加时间注意力层数或维度、噪声在时间上不相关改用相关噪声、或者采样步数太少增加DPM-Solver步数。还有一个容易被忽略的点VAE的时序压缩如果太激进解码时会出现帧间跳变。可以尝试用时序一致性更好的VAE或者在解码后加一个时序平滑后处理。我个人踩过的一个坑用fp16训练视频DiT时注意力分数容易溢出导致loss突然变NaN。后来改成bf16就稳了。bf16的动态范围比fp16大得多虽然精度略低但训练稳定性好很多。如果你的显卡支持bf16强烈建议用它而不是fp16。5. DiT之后视频生成主干网络的下一步会怎么走5.1 自回归Transformer与扩散Transformer的路线之争DiT虽然现在是主流但不是唯一路线。另一条路是自回归Autoregressive视频生成即把视频当成token序列用类似GPT的方式逐个预测。这种方式的优势是天然支持长视频和流式生成但挑战在于视频token的离散化和序列长度。目前看扩散DiT在生成质量和训练稳定性上占优自回归在长序列和交互性上有潜力。未来可能会出现混合架构用扩散DiT生成关键帧用自回归模型做帧间插值和长程扩展。或者反过来用自回归模型做高层规划扩散DiT做底层渲染。5.2 时空压缩与token效率视频DiT的算力瓶颈怎么破视频DiT最大的瓶颈是token数量。一段10秒1080p视频即使经过VAE压缩token数仍然巨大。降低token数的方向有几个一是更好的时空VAE。现在的VAE主要在空间上压缩8倍或16倍时间上压缩有限4倍左右。如果能把时间也压缩到8倍甚至16倍token数会大幅下降。但时间压缩太狠会丢失运动细节需要更聪明的压缩策略。二是稀疏注意力。视频里很多token之间的关联很弱比如画面左上角和右下角没必要全连接。用稀疏注意力或局部窗口注意力可以大幅降低计算量。但稀疏模式的设计需要针对视频特点不能简单套用语言模型的稀疏方案。三是分层生成。先低分辨率生成整体运动再逐步超分到高分辨率。这种方式把计算量分散到多个阶段每阶段的token数都可控。但分层之间的信息传递需要精心设计否则会出现层间不一致。5.3 从视频到世界模型DiT骨架的更大想象空间DiT这套骨架的潜力不止于视频生成。它本质上是一个时空序列去噪器只要能把数据编码成时空token序列就能用DiT生成。这意味着它可以扩展到3D生成、机器人轨迹规划、甚至世界模型World Model。世界模型的核心是让AI理解物理规律和因果关系能预测如果这样做接下来会发生什么。视频DiT已经学会了从噪声中恢复合理的时空演化这本身就是一种对物理规律的隐式建模。如果再加上动作条件action conditioning让模型学会给定当前状态和动作预测下一状态就离世界模型很近了。当然现在的视频DiT离真正的世界模型还有距离。它更多是在模仿训练数据里的运动模式而不是真正理解物理。但作为骨架DiT已经证明了它的可扩展性和通用性。接下来几年围绕DiT的改进——更好的条件注入、更高效的注意力、更强的时空压缩——会持续推动视频生成和世界模型的发展。我在实际跑视频DiT的过程中最大的体会是这套架构的优雅之处在于它的简单。没有复杂的卷积设计没有手工设计的时空模块就是标准的Transformer块堆叠加上精心设计的条件注入。但正是这种简单让它能充分利用Transformer的缩放定律随着参数和数据增长持续变强。如果你正在入门视频生成建议先把DiT的论文和开源实现读透自己跑通一个小的视频DiT训练流程比看多少综述都管用。
阅读完成 · 觉得有帮助?
咨询建站