Text2Video这套管线里,真正决定视频内容和质量的,其实是那个不起眼的"噪声预测器"。很多人调CFG、换采样器、改步数,折腾半天画面还是不行,最后才发现瓶颈根本不在采样策略上,而在网络结构本身。作为本系列第4篇,这篇专门拆解视频扩散模型中的核心组件——DiT(Diffusion Transformer),也就是俗称的噪声预测器。它做的一件事听起来很简单:在每一步去噪时告诉你"当前噪声从哪里来、往哪个方向走",但这件事做得好不好,直接决定了生成视频的结构、动态和文本对齐度。适合正在复现Text2Video项目、做架构选型或排查生成质量问题的同学阅读。
DiT不是最近才出现的概念,它从图像生成一路卷到视频生成,中间经历了好几个阶段的演化。下面我会按"它在整个系统里扮演什么角色—为什么视频这条赛道把它推上主位—单流和双流架构怎么选—工程落地里有哪些关键设计—训练推理的实战经验—常见踩坑排查"这个逻辑来聊。
1. 扩散模型里的"领航员":噪声预测器到底在预测什么
要理解DiT,首先得把扩散模型这个框架拉出来看一遍。扩散模型的前向过程是一点点往干净数据上加噪,直到数据变成纯噪声。生成过程则反过来:从一个随机噪声开始,每走一步都根据"当前带噪样本"和"当前步数",预测出应该去掉的噪声或应该走的方向,再把这个方向作为下一步的起点。这里承担预测任务的网络,就是噪声预测器。在DDPM时代,它的输出被定义成噪声本身,也就是预测epsilon。
1.1 三种预测目标的差异
不同年代的模型对预测目标有不同的定义,理解它们对后面看DiT的代码和训练配置很有帮助。
- epsilon预测(DDPM):预测加噪过程中混入的噪声,然后用公式从带噪样本里反推原始数据。数学推导里x_0可以由x_t和epsilon直接估计,但它在高噪声区间误差放大明显。
- x_0预测:直接预测干净样本,收敛快但模型要从几乎全噪声状态恢复出完整结构,难度极高。
- v预测(常用于视频生成):预测x_t对噪声和数据的混合权重变化,介于epsilon和x_0之间,训练时更稳定。
- velocity / flow预测(主流DiT多用这种):基于flow matching或rectified flow,把扩散路径定义成从数据到噪声的一条直线,网络预测的是这条路径上的速度场。它的好处是采样轨迹可以被简单ODE求解,步数少也能生成高质量内容。
很多人会问:预测目标不一样,是不是换个损失函数就行?实际操作里,目标函数的改变会连带影响网络输出的通道语义、时间步采样策略、CFG引导的公式形态,甚至最后的采样器选择。比如你从epsilon预测切到flow预测,原先那套scheduler很可能不再适用,采样公式也要重新推导。
1.2 为什么视频生成比图像生成更依赖噪声预测器
图像生成里,一张图512×512像素,噪声预测器就算不完美,多走几步总能有个像样的结果。但视频的输入是一个时间序列,模型每一帧预测的误差不光影响当前帧,还会顺着时间维往前滚。一帧出现误差,后面连续几十帧都会跟着飘。加上Text2Video里文本条件要在视频动态变化中保持一致,噪声预测器不仅要"看懂"画面,还要"记住"前面帧长什么样。
我见过一种很形象的类比:扩散生成就像开车走夜路,噪声预测器是副驾驶座上的领航员。图像生成里你只需要告诉司机下一米怎么开,视频生成里你得告诉他接下来一条街怎么走,还要保证不会拐错弯。如果领航员自己都在乱指路,后面所有的"优化采样器""调CFG"都只是在一个错误方向上加速而已。
2. 从U-Net到DiT:视频生成架构路线的转变逻辑
DiT的全称是Diffusion Transformer,核心思想是用Vision Transformer结构替代扩散模型里传统的U-Net主干。这个转变不是爱好者们无聊折腾,它背后有一整套逻辑在支撑。
2.1 U-Net时代的优势与天花板
U-Net在图像扩散时代统治了很久,原因不难理解:它天然带有局部归纳偏置,下采样和上采样过程中,不同尺度特征靠skip connection连接,细节恢复能力很强。图像本质上是强局部相关性的数据,一个像素周围通常就是它最相关的信息,U-Net恰好贴合这种规律。做视频时,常见做法是把3D卷积塞进U-Net里,把时间维当作额外的通道维度来处理。这种方式能跑通,生成几秒钟短视频没问题。
但3D U-Net有一个绕不开的软肋:它对长程时序关系的建模非常弱。注意力层在U-Net里只是穿插在下采样模块之间,局部卷积仍然占主导。当视频里出现大位移运动、镜头切换、某个物体先消失再出现这类需要"看过远处几帧才知道该怎么画"的情况,局部卷积很难处理。我在复现早期视频模型时,最明显的感受是:用U-Net生成几帧还行,生成几十帧时画面会出现"突然忘记上一帧在干什么"式的漂移。
2.2 DiT的全局建模与扩展性优势
DiT的设计逻辑完全相反:把视频latent按块(patch)切碎,展平成token序列,丢进多个Transformer层里做global attention。任意两个token之间都能直接交互,不管它们在空间上隔多远,时间上隔几帧,attention都会自行决定该关注谁。这个特性对视频来说是击中要害的——视频内容的连续性本来就不只是局部像素层面的连续,更多是语义层面、运动轨迹层面的连续。
另一个不可忽略的优势是可扩展性。DiT本质上就是标准Transformer:模块堆叠、维度扩展、数据量大就涨效果,不需要重新设计卷积结构。业界经验也一样,训练数据超过一定规模后,DiT的loss下降曲线明显要比U-Net平滑得多。Sora、Open-Sora、CogVideoX、HunyuanVideo这些项目选择DiT作为主干,背后同一个逻辑:这就是当前条件下视频生成最稳的一条扩展路径。
3. 单流DiT与双流DiT:近期架构路线之争
DiT这个名字在视频生成语境下,当前最热的具体设计话题是"单流"和"双流"。如果你关注最近几个开源项目的代码结构,会频繁看到这组概念。它回答的问题很直接:视频这种视觉信息,和用户输入的文本描述,到底该在网络的哪个阶段、以什么方式融合。
3.1 双流DiT的思路与代价
双流架构,典型代表是HunyuanVideo这类设计。它把文本token和视频token视为两种不同类型的模态,各自用独立的Transformer层先做内部处理。文本走文本的attention流,视觉走视觉的attention流,两路并行计算一段时间后,中间通过特定的融合模块把信号交汇在一起,再继续处理。
这样做的好处是对两种模态分别保留了更独立的表达空间。文本欠编码的问题会少一些,语义在深层网络里不至于被视觉特征稀释。代价也很现实:需要两套attention骨架,参数和计算开销直接翻倍,训练显存压力大。还有一个在速度上的直观感受:同样分辨率、同样帧数,双流模型的推理延迟肉眼可见地比单流高。
3.2 单流DiT的兴起
单流架构更激进:把文本token和视频token拼接成一个统一序列,丢进同一个Transformer,靠attention机制自己去学习该看哪些token、该忽略哪些。这种做法最早在图像生成的MM-DiT里就有雏形,视频领域最近"单流dit"这个热词频繁出现,也是因为它让网络结构更简洁:只有一种Transformer块、一套权重、一波计算。
单流模型在训练数据质量高、文本编码器强大的前提下,效果能追平甚至超过双流模型。原因也好理解:融合发生的时机早,文本-视觉间跨模态交互更充分,很多隐式的对齐关系在浅层就可以建立。数据不够强的时候,单流模型容易"学过头"——把文本token当成视觉token一样处理,失去文本本身的语义边界,导致对齐变差。所以单流不是无条件优于双流,它对数据质量和文本编码器更敏感。
3.3 怎么选:算力、语义与效果的天平
如果让我给个实操建议:起步复现阶段选单流架构,先把链路跑通,节省算力也方便调试。等需要冲刺SOTA效果、且手头有高质量长文本标注数据时,再考虑切换到双流,或者采用双流前融合这种折中设计。不要一上来就追双流,网络结构复杂后的调试成本会高出一大截。
下面这张对比可以直观看出两条路线的差异:
| 对比维度 | 双流DiT | 单流DiT |
|---|---|---|
| 文本与视觉融合时机 | 较晚,各流先内部交流 | 早,拼接后统一attention |
| 代表项目 | HunyuanVideo | 近期多个新模型 |
| 文本语义保持 | 强,不易被视觉特征淹没 | 依赖文本编码器质量 |
| 参数与计算开销 | 高 | 低 |
| 对数据质量要求 | 相对宽容 | 更敏感 |
| 工程调试难度 | 中等偏难 | 相对容易 |
4. 把DiT装进Text2Video管线:关键设计决策
光看架构图怎么做和真正能在GPU上把它跑起来,中间隔着一整套工程细节。我基于自己复现项目的经验,把最影响效果的几个决策点拆开说说。
4.1 token怎么从视频里来:VAE与patchify
DiT吃的不是原始像素,而是Video VAE压缩后的latent。先通过3D因果VAE把一段视频压缩成时空latent,比如时间维可能压缩4倍,空间维每维压缩8倍。之后DiT再对latent做patch化(patchify):把latent切成一个个小方块,每个方块展平成一个token,token的通道维度就是这个patch里所有数值拼接起来的向量。
patch size的选择直接影响生成细节和序列长度。一个小patch(比如2×2×2)保留的细节多,但token数量大,attention开销随之暴涨。一个大patch(比如4×4×4)计算量减到原来的八分之一,但画面细节会损失,文本引导的局部控制也变弱。常见做法是空间用2×2、时间用2,这样一个latent序列切完之后,长度控制在几千到万级token。如果你的显存卡在瓶颈,优先调大patch size,而不是盲目砍帧数。
4.2 时序信息:位置编码与attention mask
视频token展开成序列后,网络本身不知道哪个token在前哪个在后。必须注入位置编码。这里的常见组合是:空间维用2D RoPE或2D位置编码,时间维单独用时间位置embedding,二者加在一起。有的项目直接用3D RoPE,把时间和空间坐标统一编码,效果也很稳定。
attention mask同样关键。完整视频生成时,如果允许最后几帧的token去attend未来的帧,模型训练时就会学到"先看到未来再画现在"这种作弊行为。因果时间mask是常用的解法:第t帧的token只能attend前t帧,不能看第t+1帧。之前看一些开源实现喜欢用整段非mask的full attention,生成短视频问题不大,一拉长帧数就能感受到区别——未来帧信息泄漏会让运动模式变得奇怪。
4.3 文本条件怎么进入DiT
文本条件进入DiT,主要有三种方式:cross-attention、自适应调制(AdaLN)以及joint attention直接拼接。单流DiT里文章先做文本和视频的拼接,本质上属于joint attention。双流架构里cross-attention和AdaLN更常见。时间步t的信号,通常和文本一起通过AdaLN调制注入,对每个token的scale和shift做调整。
文本编码器是很多人忽视的瓶颈。用CLIP做文本编码器,对付短prompt勉强够用;但视频生成里长prompt、复杂场景描述、多个实体关系,CLIP经常表达不够。我的实测经验是:把文本编码器换成更强大的T5或LLM系列编码器后,文本-视频对齐效果提升非常明显,甚至比换个更大的DiT backbone效果还直观。这条经验也解释了为什么很多新项目直接把LLM作为text encoder。
4.4 长视频与KV cache的博弈
生成长视频时,一个主流的做法是分块生成:先生成前几秒,再在已有内容基础上向后续写。此时,前面帧的attention KV需要缓存供新块复用,不然每次都要重新计算全部历史token,显存和算力都吃不消。KV cache在DiT里遇到的问题和LLM类似:视频token数量大,缓存本身会占据大量显存,而且视频帧之间相似度高,缓存冗余也高。
我的建议是:长视频场景优先考虑局部窗口attention配合少量全局token,或者做分层生成(先生成关键帧,再补中间帧)。这种设计带来的几何级显存节省,比硬上大显存更可持续。
5. 目标函数与采样解码:DiT训练和推理的实战经验
网络结构定了,训练目标函数和推理采样策略是决定实际生成质量的第二战场。
5.1 flow matching目标函数
我个人认为,视频DiT目前最配的目标函数是flow matching(也叫rectified flow)。它把扩散过程重新定义成数据到噪声的线性插值路径,网络预测的是路径上某一点的速度。相比epsilon预测,flow匹配的优化曲面更平滑,它在不同噪声水平下的目标不会出现剧烈尺度变化,训练更稳,收敛也更快。很多最新项目在训练代码里已经默认用flow matching了。
训练细节上,时间步采样策略会影响模型对中噪声段的敏感度。均匀采样在[0,1]之间是最简单可靠的,工程上也够用。有条件的话,采用logit-normal分布采样能加大中间噪声段的训练权重,对于提升生成样本的整体结构很有帮助。
5.2 无分类器引导与采样步数
DiT做Text2Video,基本都靠无分类器引导(CFG)来拉高文本相关性。训练时以一定概率随机drop文本条件,推理时同时跑一遍有条件和无条件分支,两者差值按scale加权后叠加。公式形态在flow目标下是v_cfg = v_uncond + scale * (v_cond - v_uncond)。这里的scale对视频生成的影响比图像生成更微妙:拉大scale,文本对齐确实变好,但运动幅度会被压缩,画面也容易出现过饱和和僵硬。
采样步数上加分之二:flow模型在20至30步时就能获得不错结果,配合DPM-Solver++或Euler采样器更佳。不要死守50步,视频DiT采样每步都贵,能20步解决的问题就不要浪费算力。
5.3 VAE解码的时序闪烁问题
这是在推理阶段最磨人的问题。DiT在latent空间生成的表现很好,但用Video VAE解码回像素空间后,画面上常常出现微弱的闪动或纹理变化,尤其静态区域特别明显。DiT本身没有显式时序平滑机制,VAE的单帧解码误差被时间放大。
实践里大概有三个缓解方向。一是用时间一致性更好的Video VAE,这是根源解法。二是在推理阶段对重叠帧做加权拼接,类似视频超分里的overlap-and-blend。三是CFG层面做处理:每帧单独用不同随机噪声会导致帧间闪烁方差变大,可以固定噪声种子或对guidance做平滑。这些技巧不能完全消除闪烁,但能把观感拉回可用水平。
6. 复现DiT时最容易踩的坑与排查思路
最后分享一些在复现DiT过程中积累的排查经验,这些坑踩过才有免疫力。
6.1 显存与attention复杂度的取舍
DiT的attention复杂度随序列长度二次方增长,视频latent序列长度通常上万。在8卡甚至单卡上训练,全局attention直接会导致显存爆炸。我的排查思路很直白:先算出序列长度,再估算attention占用。如果超预算,优先级排序是:减少帧数 > 加大patch size > 换成窗口注意力 > 使用sequence parallel。窗口注意力会把视频切成空间小块,让每个块内部做attention,效果略有折扣,但显存压力指数级下降,工程上非常实用。
6.2 文本-视频对齐不足的排查
生成结果画面漂亮但跟prompt对不上,先别急着调CFG和训练参数。按顺序排查:文本编码器是不是太弱?文本token有没有被正确地注入网络?训练时文本drop的比例够不够?推理时是不是uncond分支算错了?其中"文本drop比例"很关键,很多项目设置3%到10%之间的drop率,太低会导致模型在推理时对CFG不敏感。
6.3 训练loss spike与数值稳定性
训练DiT时常见loss突然冲高然后训练崩盘。诱发因素多为混合精度下fp16溢出,或大batch加高学习率导致梯度爆炸。视频DiT推荐bf16,指数范围大,稳定性好很多。同时要做好warmup和梯度裁剪,clip值设在1.0附近即可。
6.4 评估指标:别只盯着对齐分数
不少人复现完DiT,只看CLIP score或文本对齐指标,结果指标漂亮但生成视频动起来像幻灯片。视频生成评估至少要看三块:单帧质量、时间一致性、运动合理性。VBench这类benchmark能给出比较全面的量化报告,CLIP score只反映图像-文本匹配,不能代表动态质量。我自己在项目里长期盯的是VBench的motion quality与temporal consistency两个子项,这两个才最能反映DiT的时序建模能力有没有真正发挥。
把这一环做扎实,Text2Video这套管线才算真正立起来了。后面如果有机会,我会把这个系列延伸到文本编码器选型和Video VAE压缩设计上,那两个环节和DiT放在一起看,才是完整的视频生成技术拼图。