原文:https://waynejin0918.github.io/how-far-native-ar-video/zh.html
作者:Weiyang Jin,香港大学
语言模型里,自回归的意思其实早就清楚了。预训练拟合的就是
每写下一个词只需一次前向,训练看见的、测试看见的,都是已经写出的词。没人会先训一个双向 BERT 6,再蒸馏出一个「看起来像 GPT」的学生,然后说这就是原生自回归。推理时加一层因果 mask,同样不算。
视频如果也用这个词,对 V=(v_1,\ldots,v_T),就写成
c_t 是当时已经有的条件:文本、第一帧、相机位姿、按键。它可以进条件,但不等于可以去看还没发生的 v_{>t}。这里说的原生自回归有两层意思,预训练拟合的就是这个乘积,写出下一步只需一次前向。Echo-WM-Flash 1 是我们按现在通行的扩散自回归训过的模型之一,下面讲这套做法离这个定义还有多远。
图像没有时间;视频多出来的是 t
一张图里,左右是同时存在的。PixelRNN 4 把似然写成光栅顺序 p(x)=\prod_{h,w}p(x_{hw}\mid x_{<hw}),只是给联合分布排个序,这个序是编码约定,不是时间。DiT 12 后来把光栅顺序丢掉,在 (h,w) 上做双向注意力,更接近一张照片,帧内空间双向没问题。
视频多出来的是 t。Video Pixel Networks 5 在像素级就已经把 t 当序列,而不是把时长 T 拉成一张更高的图。写 v_t 的时候,下一帧还没发生,不是画面还没画完。所以同一个似然里,两种顺序不是一类东西:
时间上的这个乘积,是因为后面的帧这一刻还不存在;帧内双向只是当前帧怎么表示。把 T 当成更长的 H,就是把「还没发生」当成「画面另一边还没画完」。
短短几秒的片子上,这个差别几乎看不出来,未来帧就在同一条训练样本里,用上它们画质更好,Sora 14、Wan 16、LTX 15 靠的就是这个。它们拟合的是整段短片的联合分布,所以每个时刻的条件是
测试变成流式生成以后,需要的条件就变了。接着往下写,中途会碰到新的 c_t,生成也会比训练见过的窗口更长。这时要拟合的是


训练时能看见哪些变量,学到的条件就不一样。c_t 换成文本、图像或位姿,只是条件里多一项,V_{\setminus t} 不会变成 v_{<t}。
世界模型 22–25 很早就把这个错位露出来了,因为人一边看一边操作。更长的视频、更低延迟的续写,碰到的还是这件事。
VideoGPT 7、TATS 9 已经在离散符号上写过 \prod_t p(v_t\mid v_{<t})。画质后来不如 MaskGIT 8、MAGVIT 11、Phenaki 10,再不如按整段短片训的 DiT 级双向模型。
图好看了,「下一帧只看过去」却丢掉了。测试变成流式生成之后,领域没有回到「时间上只看过去」的预训练,问的是已经训好的 q_{\mathrm{bi}} 怎么改一改,让测试看起来像 q_{\mathrm{AR}},后面的流水线一直在做这件事。
训练看见了未来,生成下一步也不止一次前向
按这个定义,现在通行的扩散自回归这两条都不成立。
先说训练。训练时本该拟合 q_{\mathrm{train}}(v_t\mid\cdot)=p_{\mathrm{data}}(v_t\mid v_{<t})。如果拟合的是 q_{\mathrm{bi}},推理时再加因果 mask(当前块不许看后面的块),只是测试时挡住训练用过的未来。模型从来没有在「只有过去」这个条件下训练过。
再说生成。时间切成 B_1,\ldots,B_N 之后,写成 p(B_{1:N})=\prod_i p_\theta(B_i\mid B_{<i})。可这一步如果做成
写出来的并不是直接的 B_i,而是一段常微分方程积出来的。K\sim 30 是短片双向模型的积分长度;K=4 只是把同一种向量场的步数缩短,并不是一次前向写出 f_\theta(v_{<t})。
这两条缺口接着会变成一串后训练。训练已经看见未来,推理就只能加上因果 mask,训练时历史用的是干净数据(teacher forcing),测试时历史却是模型自己刚写出的块:
Bengio 等的 scheduled sampling 2、Ranzato 等的序列级训练 3、Self Forcing 19,处理的都是这个缺口。
真要在「只有过去」下训又贵又不稳。缺口还在就再加一级,先让模型自己往下滚,在这段历史上做 DMD 28,再把同样的损失加到已经带误差的更长历史上,\mathcal{L}_{\mathrm{long}}=\sum_k\mathcal{L}_{\mathrm{DMD}}^{(k)}。预训练从没在「只有过去」下训练过,这些阶段都是事后加上的。
写出下一步仍要积一段微分方程,所以要蒸馏。
Diffusion Forcing 17、CausVid 18、Self Forcing 19、Rolling Forcing 20、MAGI-1 21 推理时都不看未来,块里面却还是用多步把 K 压下来,整段生成要跑 N_{\mathrm{blocks}}\times K 次前向,到了 K=4 网络拟合的仍是 v_\theta(x,\sigma)。
训练条件没改,每一步仍是多步积分。生成又要比训练窗口更长,于是改的是推理时看得见的过去 \mathcal{H}_i:留几帧早期的当锚点、只留最近几块、窗口往前滑时重置位置编码。
StreamingLLM 13 在语言里说过,滑动窗口需要锚点;FramePack 26、WorldMem 27 问的是 \mathcal{H}_i 里该留什么。这只改了测试时能看见哪些帧,训练时拟合的条件没动。
现在通行的做法,是缺一层补一层:
现在通行
for i in 1..N:
x ~ N(0, I)
for σ in [1.0, 0.75, 0.50, 0.25]:
x = x + Δσ · v_θ(x, σ | B_<i, x)
cache.write(x)
原生
for t in 1..T:
v_t = f_θ(v_<t, c_≤t)
cache.write(v_t)

每一级都多一组要调的量,如果预训练从来没用过 v_{>t},下一步也只需一次前向,这些级就没有必要。
块该切多长,不能随便定:一块只有一帧,块里没有前后运动,多步积分只剩空间去噪;一块接近一秒,又变回带边界缓存的短片模型;三帧既能边写边出,又给块内双向去噪留了空间,所以成了常见折中。原生模型得在预训练就定下这个单元,可以一帧跑一次网络,也可以一块跑一次网络,不用额外让三帧共用一个 mask 再积分一遍。
过去的经验
我们过去训过现在这套扩散自回归,Flash 1 是其中之一,闭环长程生成时,两件事反复出现。
后训练如果优化的是块内去噪,同一块 B_i 里可以更好看,但不一定能改善块与块之间的条件,而 \prod_t p(v_t\mid v_{<t}) 要的正是这个。只改 \mathcal{H}_i,改的是测试时能看见哪些帧,训练时拟合的条件没动。

更晚的后训练,采样和窗口都没动,同一块里纹理更干净,跨块一致性却没有稳定跟着变好。
生成器不动,只改 \mathcal{H}_i,加长推理窗口,或者打开、关掉位置和位姿编码的重置,训练条件都没变。窗口和训练对不上,问题出在块与块的接缝;重置和训练对不上,相对位置编码会指向另一套几何。跨块一致性没有因此稳定变好,变的仍是测试时能看见哪些帧,并没有拟合 p(v_t\mid v_{<t})。
对原生设计意味着什么
块内后训练,推理时改窗口、开关重置,都到不了拟合 p(v_t\mid v_{<t}) 的目标。如果预训练就要拟合 p(v_t\mid v_{<t},c_{\le t}),下一步也只需一次前向,后面几件事其实已经定了。
块内后训练补不上跨块条件。 块内损失会把容量用在 B_i 好不好看上,要把 \prod_t p(v_t\mid v_{<t}) 学到,预训练的条件就得是过去,再加一个更好看的蒸馏阶段也补不上这个条件。继续预训练已经双向的 DiT,初始化可以留,但时间上的未来必须从第一步起就看不见。更干净的做法是隐空间不变,帧内仍双向,时间 mask 从随机初始化就是因果的。
VideoGPT 7 写过「下一帧只看过去」,离散码本偏弱,缺的是用现在的 DiT 和视频 VAE 再走这条路 12 15 16。损失可以还是流匹配,改的是条件:
\sigma 只加在当前单元上,梯度不经过 v_{>t}。少步一致性训练如果想当 K=1 的手段,得一开始就在 q_{\mathrm{AR}} 下训,先学 q_{\mathrm{bi}} 再压步数,容量又会用在块内积分上。后训练擅长的正是这个,跨块一致性却没有跟着上来,自己滚一段再加 DMD 还可以继续补,但那是上一节写过的后训练,不是原生模型。
加长窗口、开关重置,改的不是训练条件。 只改 \mathcal{H}_i、不改训练条件,跨块一致性没有稳定变好,所以在原生模型里,看得见的过去要成为模型的一部分:要么就是 v_{<t}(因果注意力的缓存),要么是参数里对 v_{<t} 的压缩,而且这段历史要接得上梯度。
固定「留多少锚点、留多少最近帧」,再去搜要不要重置位置编码,是改造 q_{\mathrm{bi}} 时才会去做的事。FramePack 26、WorldMem 27 问的是这段历史里该留什么,答案不该是再搜一轮和训练对不齐的窗口。
时间单元在预训练定下来,测试时不再对块内积分。 块内去噪可以更好看,网络却还在算 K 步向量场,如果一块或一帧就是一步,测试时就不能再对这块做 K 步积分。一次网络计算写一帧,最接近语言里的一个词;一次网络计算写 L>1 帧,块内可以双向,每次写出的片段更长。
两种都可以,但 L 不能再当推理超参,改 L 就是改这一步有多长,块长如果还留给测试时折中,就会回到三帧加一段微分方程,后训练会再去优化这段方程。
评价要看跨块,不能只看块内好不好看。 块内更好看,并不等于跨块更一致,只看短片段和块内指标来停训,还会把这两件事当成一回事。用同一套权重,生成时只需一次前向,从第一秒量到超过训练窗口,c_t 中途变了,再看条件是不是仍只依赖 v_{<t}。
几秒的短片上双向模型更好看并不奇怪,那段长度上训练本来就看得见未来,短片上的观感说明不了原生这条路通不通。
数据也要按「过去已经发生」来切。 等长短片把未来帧也当特征用。q_{\mathrm{AR}} 要求数据里的过去也是当时已经发生的:更长的连续镜头、带时间戳的 c_t、中途才出现的条件。不改训练条件,跨块一致性上不来,只改 \mathcal{H}_i 的时候我们见过这件事。
还有几个问题没有答案,最好在再调窗口之前先想清楚。已经双向的大规模视频骨干,只做时间因果的继续预训练,要多久才能去掉 q_{\mathrm{bi}} 留下的习惯,要不要重新初始化?连续隐空间上 K=1 稳不稳,还是需要更强的离散或混合码本?
原生目标下,一帧跑一次网络和三帧跑一次网络,哪一个更能同时顾上运动和延迟?学出来的 \mathcal{H}_i 要不要直接用跨块一致性来监督?没有这条监督的窗口搜索,并不改变模型学到的条件。
2021 年离开 VideoGPT「下一帧只看过去」这条路,当时说得通,因为要的是短片段,短片段上 q_{\mathrm{bi}} 就是对的模型。现在面对的已经是流式生成,先训双向短片,再做后训练,再在推理时搜 \mathcal{H}_i,到不了拟合 p(v_t\mid v_{<t}) 的目标,接下来只能在预训练改训练时能看见的变量。没改之前,现在叫「自回归视频」的做法仍是先按整段短片去噪,再在推理时改成只看过去。
结论
原生自回归是两件事,预训练拟合 p(v_t\mid v_{<t},c_{\le t}),写出下一步只需一次前向,现在通行的做法这两条都不成立。事后再补也补不上,块内损失只让同一块更好看,加长窗口或开关重置只改测试时能看见哪些帧,都到不了拟合 p(v_t\mid v_{<t}) 的目标。
语言模型这几年走得快,是因为预训练从一开始就在做下一词预测,扩大模型和数据仍在优化同一个目标。视频生成在 2021 年为了短片画质离开了「下一帧只看过去」这条路,后来才加上因果 mask、少步去噪和窗口搜索,让双向短片模型能够流式生成,但这些都没有改变预训练拟合的条件。原生模型必须在预训练时看不见未来,生成下一步也只需一次前向,事后蒸馏补不上这两点。没做到这些,我们离原生自回归视频模型还很远。