在城郊的「时光胶片修复馆」里,老周是远近闻名的修复师。他接到一批七十年代的老电影胶片:画面上布满雪花噪点,人物手臂在相邻几帧间忽前忽后地抖动,像是喝了酒。老周修复流程是这样的——他先对着破损胶片研究“损坏规律”,搞清楚雪花是怎么一层层爬上画面的;然后他让 AI 学会“逆向拆解”,从满屏雪花里一步步把清晰画面捞回来;最关键的是,他修完第 5 帧,一定要对照第 4 帧来修,绝不让主角的手突然消失。这套「研究破坏 → 学习还原 → 保证连贯」的功夫,正是视频扩散模型的核心原理。本篇我们就借老周的修复台,看懂 Sora、可灵这类视频生成工具背后的底层魔法。

岗位关联

掌握视频扩散模型,等于拿到了视频生成类 AI 的「发动机图纸」——无论是理解 Sora 的技术报告,还是设计自己的视频生成产品,你都具备了底层判断力。

目录
  1. 可视化演示
  2. 扩散模型原理
  3. 前向加噪过程
  4. 逆向去噪过程
  5. 时序一致性
  6. 3D U-Net架构
  7. 时序注意力
  8. 运动条件注入
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示视频扩散模型核心技术:前向加噪/逆向去噪过程(时空三维扩散)、3D U-Net架构(时空卷积+时序注意力层保证帧间一致性)、以及潜空间视频扩散(VAE压缩降维降低计算成本)。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+captions.diff+'

扩散模型原理

老周在修复胶片前,会先做一件反直觉的事:他拿出一批干净的新胶片,故意撒上灰尘、刮出划痕,然后仔细观察“破坏的规律”。他说,只有搞清楚了岁月是怎么把画面弄脏的,才能反过来推断干净画面上原本有什么。这就像你要学会解开一道数学题的答案,最好的办法是先研究出题人是怎么把题目变难的。扩散模型的基本哲学,就是把“破坏”和“修复”两个过程都用数学语言明确写下来。

老周观察到的“破坏规律”是分步进行的:他每次只撒一点点灰、刮一道小痕,反复几百次后,画面才彻底被雪花吞没。回到 AI 语言中,这就是前向加噪过程——从一张干净的原始视频帧出发,按照预先设计的调度表,逐步添加微小的高斯噪声,生成一条越来越模糊的加噪链条。而逆向去噪过程则是训练一个神经网络,让它学会沿着链条反向走,从纯噪声中一步一步恢复出清晰的画面。老周修的胶片是真实存在的,而扩散模型面对的是一个更宏大的目标:学会整个数据分布,从而凭空“生成”出从未见过的新视频。

把这两个过程写在一个框架里,就是扩散模型的完整概率图:

老周的修复台上有两条轨道:一条通向“彻底损坏的胶片”,一条通向“崭新如初的画面”。扩散模型正是把这两条轨道合二为一的数学引擎,理解了这一点,视频生成的底层逻辑就敞开了一半。

q(x1:T∣x0)=∏t=1Tq(xt∣xt−1),pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)q(x_{1:T} \mid x_0) = \prod_{t=1}^{T} q(x_t \mid x_{t-1}), \qquad p_\theta(x_{0:T}) = p(x_T) \prod_{t=1}^{T} p_\theta(x_{t-1} \mid x_t)
这条公式说明:向前是“一步步被弄脏”的链,向后是“一步步被修复”的链,两链相接就构成生成新视频的完整路线。
  1. 前向加噪链条从清晰帧开始,每一步只加入一点点噪声,逐步过渡到完全随机的噪声状态,老周称之为“做旧工序”。
    q(xt∣xt−1)=N(xt; 1−βt xt−1, βtI)q(x_t \mid x_{t-1}) = \mathcal{N}(x_t;\, \sqrt{1-\beta_t}\, x_{t-1},\, \beta_t I)
  2. 逆向去噪链条从纯噪声状态出发,神经网络逐步还原出清晰的画面,相当于老周的“修复工序”。
    pθ(xt−1∣xt)=N(xt−1; μθ(xt,t), Σθ(xt,t))p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(x_{t-1};\, \mu_\theta(x_t, t),\, \Sigma_\theta(x_t, t))
  3. 参数 θ 的含义这是神经网络里所有可学习的权重参数,即老周积累了大半辈子的“修复经验”。
    θ=arg⁡min⁡θE [ 去噪误差 ]\theta = \arg\min_\theta \mathbb{E}\, [\, \text{去噪误差}\, ]

前向加噪过程

老周研究出的“做旧工序”有一套严格章法。他先把胶片分成许多小步骤,每一步撒的灰量由一个“噪声调度表”控制:前期撒得少,让画面看起来只是微微发白;后期撒得多,直到画面完全淹没在雪花里。他还会刻意做实验记录每一步画面还剩多少“原样”、掺了多少“噪声”。这套章法落在数学上,就是前向加噪过程。

假设原始视频帧为 x₀,经过 t 步加噪后得到 x_t。为了让每一步都保持“部分原样 + 部分噪声”的混合比例,扩散模型设计了一个巧妙的重参数化公式,把整条加噪链压缩成一步计算:

老周把“做旧”练成了肌肉记忆:调好调度表,撒灰、记录纯度、再撒灰。前向加噪过程就是这条被严格量化的“做旧流水线”,它为后续的修复训练提供了无数对“干净与弄脏”的对照样本。

xt=αˉt x0+1−αˉt ε,ε∼N(0,I)x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \varepsilon,\quad \varepsilon \sim \mathcal{N}(0, I)
这个公式的意思是:任意时刻 t 的画面,等于原始画面与随机噪声的加权混合,权重由累计噪声调度决定。老周看后点头:只要记下“折损系数”,就能快速判断某一步画面里还剩多少真东西。
  1. 累计信号系数表示原始画面在 t 时刻还剩多少比例的有效信号,这个值随 t 增大单调递减,老周称之为“画面的剩余纯度”。
    αˉt=∏i=1t(1−βi),βi∈(0,1)\bar{\alpha}_t = \prod_{i=1}^{t} (1 - \beta_i),\quad \beta_i \in (0, 1)
  2. 噪声强度系数表示噪声在画面中占据的比例,它随 t 增大而递增,保证最后一步画面几乎完全被噪声覆盖。
    1−αˉt→1当 t→T\sqrt{1 - \bar{\alpha}_t} \to 1 \quad \text{当 } t \to T
  3. 随机噪声每一步从标准高斯分布中采样一个噪声项,它模拟的是照片上的颗粒感,老周把这种颗粒称为“可控的雪花”。
    ε∼N(0,I)\varepsilon \sim \mathcal{N}(0, I)

逆向去噪过程

老周的修复手艺逐渐成型后,迎来了真正的大考:一沓完全被雪花覆盖的胶片,毫无干净参照物。老周有自己的绝活——他不求一步到位,而是记住'每一步被弄脏的规律',然后用神经网络一点一点把雪花的比例降下来。这就是逆向去噪过程。

训练好的噪声预测网络 ε_θ(x_t, t) 看到当前帧 x_t 和时间步 t,就能估算出画面里混入了多少噪声。有了这个估计值,就可以从当前帧中“减去”预测出的噪声,得到更干净的上一帧。这个去噪一步的数学形式是:

逆向去噪不是变魔术,而是一段讲究节奏的“揭膜”过程:每揭一层,画面就清晰一分。Sora 之所以能生成 60 秒连贯视频,正是因为这套去噪引擎不辞辛劳地走了成百上千步,每一步都踩在数学的节拍上。

xt−1=1αt(xt−βt1−αˉt εθ(xt,t))+σtz,z∼N(0,I)x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}}\, \varepsilon_\theta(x_t, t)\right) + \sigma_t z,\quad z \sim \mathcal{N}(0, I)
通俗地说:把当前画面里的“雪花”按预测比例剥掉一部分,再按原样强度微调,最后保留一点点随机性,保证画面不会因为过度修复而变得死板。老周说这就像擦玻璃——先大块擦掉污渍,再用软布抛光。
  1. 噪声预测网络这是整个模型的主力干将,它输入当前画面和时间步,输出对画面中噪声的估计值,相当于老周“看一眼就知道这层雪花是何时撒的”。
    εθ(xt,t)≈ε\varepsilon_\theta(x_t, t) \approx \varepsilon
  2. 按比例剥离噪声将预测出的噪声按系数缩放后从当前画面中减去,这是“修复”动作的直接体现。
    xt−βt1−αˉt εθ(xt,t)x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}}\, \varepsilon_\theta(x_t, t)
  3. 强度校正除以系数以补偿前向过程中信号的衰减,防止画面越修越暗,老周的“提亮环节”。
    1αt (⋅)\frac{1}{\sqrt{\alpha_t}}\,(\cdot)
  4. 随机扰动项添加一个小的随机噪声,让生成结果不至于千篇一律,保留老周手工修复的“笔触感”。
    σtz\sigma_t z

时序一致性

老周修胶片最怕一件事:单帧修复完美,但连起来放映时主角的手臂忽前忽后、桌上的茶杯突然消失。他总结出一条铁律——绝不一帧一帧孤立地修。每修完一帧,他都会把它和前后帧摊在灯台上对照,让动作顺着一个合理的轨迹走。视频扩散模型面临的正是同样的问题:如果只把图像扩散模型对每一帧跑一遍,生成结果会出现严重的帧间闪烁,视觉上像老式电风扇那样抖个不停。

解决这个问题的关键,是给模型加上时序一致性约束。最常用的手段之一是引入光流信息:光流是描述相邻帧之间每个像素“从哪里移动到哪里”的二维矢量场。老周说,光流就像演员的走位剧本——手臂在上一帧的末端位置,恰好是这一帧的起始位置。于是我们可以定义一个光流对齐损失,强迫模型生成的帧符合这种运动规律:

时序一致性让视频扩散模型不再是“一堆独立照片的幻灯片”,而是一部真正的“活动影像”。老周感慨:修复和生成殊途同归,都离不开“让每一帧活在上下文的参考系中”这条朴素真理。

Ltemporal=E[ ∥xt(i)−warp(xt(i−1), Fi−1→i)∥2 ]L_{\text{temporal}} = \mathbb{E}\left[\, \left\| x_t^{(i)} - \mathrm{warp}\left(x_t^{(i-1)},\, F_{i-1 \to i}\right) \right\|^2 \,\right]
这个损失函数在说:当前帧应该约等于“把上一帧按光流方向扭一下”的结果。老周的解释很直白:如果剧本说手臂往右移了 5 像素,那修复后的画面就必须真的往右移 5 像素,容不得含糊。
  1. 当前帧表示表示视频中第 i 帧在去噪过程 t 时刻的特征状态,它是需要被修正的对象。
    xt(i)x_t^{(i)}
  2. 光流场记录第 i-1 帧到第 i 帧之间每个像素的移动方向与距离,老周的“走位剧本”。
    Fi−1→i=(Δup,Δvp)p∈ΩF_{i-1 \to i} = \left( \Delta u_{p}, \Delta v_{p} \right)_{p \in \Omega}
  3. 光流变形操作按照光流场把上一帧的像素“搬到”当前帧应处的位置,实现帧间对齐。
    warp ⁣(xt(i−1), Fi−1→i)\mathrm{warp}\!\left(x_t^{(i-1)},\, F_{i-1 \to i}\right)
  4. 均方误差约束当前帧与“剧本预测的当前帧”差异越小越好,从而抑制闪烁,保证运动连贯。

3D U-Net架构

老周的修复台上摆着一组多层放大镜:第一层能快速浏览整卷胶片的大致色调,第二层放大到某段片段看清人物轮廓,第三层则能聚焦到胶片颗粒上判断噪点分布。视频扩散模型也需要这样一套“多尺度观察工具”,这就是 3D U-Net 架构的设计初衷。

图像扩散模型通常使用 2D U-Net:它像一张地图,只在空间平面上逐级压缩和还原。但视频多了一个时间维度,画面是“空间高度 × 空间宽度 × 时间长度”的立体数据块,就像一摞连续播放的胶片帧叠在一起。3D U-Net 将卷积核从 2D 扩展到 3D,让每一次特征提取都能同时“看到”多个连续帧的信息。这种时空卷积的设计,使模型既能学到单帧内的纹理细节,又能捕捉帧与帧之间的运动模式。

为了让网络在加深时不至于“忘掉”浅层细节,3D U-Net 内部大量使用残差连接。残差块的核心思想极其朴素:把输入和经过变换的输出加在一起。老周笑道,这就像他修胶片时,总会在旁边放一张修复前的照片做底稿,无论中间怎么折腾,最后都能兜底:

3D U-Net 就像老周的多层放大镜组:收缩路径负责“看全局”,扩展路径负责“修细节”,残差连接则是他时刻攥在手心的“底稿”。视频生成模型的时空感知能力,就是在这套架构上一砖一瓦搭起来的。

y=x+F(x,t)y = x + \mathcal{F}(x, t)
残差公式的本质是“在原图基础上做增量修正”。它让网络每一层只需学习“变化量”,而不是从零重建整个内容,训练更稳定,效果也更好,老周的“底稿保底法”。
  1. 输入特征块包含多个连续帧的时空特征,x 的形状横跨高度、宽度和时间三个维度。
    x∈RC×T×H×Wx \in \mathbb{R}^{C \times T \times H \times W}
  2. 网络变换函数由一系列 3D 卷积、归一化、激活函数组合而成的非线性变换,同时接受时间步信息作为调控信号。
    F(x,t)=Conv3D(Norm(x))+Embed(t)\mathcal{F}(x, t) = \text{Conv3D}(\text{Norm}(x)) + \text{Embed}(t)
  3. 残差合并输入与变换结果直接相加,保证梯度在深层网络中仍然畅通无阻。
    y=x+F(x,t)y = x + \mathcal{F}(x, t)

时序注意力

老周修胶片时最得心应手的工具是一台“多帧对照灯台”:他把相邻的十几帧胶片同时挂在灯台上,哪一帧的人物手臂位置可疑,一眼就能从前后帧的对照中看出端倪。在视频扩散模型中,承担这个“对照灯台”角色的,就是时序注意力层。

时序注意力的核心思想是:当模型在处理某一帧时,不仅要看这一帧自己的内容,还要主动去“翻阅”相邻帧的信息,找出与当前区域最相似的区域,把它们的特征加权融合进来。比如第 5 帧里人物的手臂有轻微残影,模型就会从第 4 帧和第 6 帧的手臂位置找到线索,综合判断出手臂最合理的形态。这种跨帧的信息交流,正是时序注意力与普通空间注意力最大的不同。

时序注意力沿用 Transformer 中经典的 QKV 机制。可以这样理解:Q(查询)是当前帧提出的问题“我这里应该是什么”,K(键)是其他帧贴出的线索标签“我这里有这些内容”,V(值)是线索背后的具体特征。模型先计算 Q 与所有 K 的匹配度,再按匹配度把 V 加权汇合:

时序注意力让模型具备“跨帧翻阅”的能力,无论目标在画面里如何运动、遮挡,模型都能通过长距离的帧间关联找回线索。老周说,有了这盏灯台,他再也不用凭运气猜手臂的位置了。

Attention(Q,K,V)=softmax ⁣(QK⊤dk)V\text{Attention}(Q, K, V) = \mathrm{softmax}\!\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V
这个公式描述的是“我该参考谁、参考多少”。老周在灯台前扫一眼就能判断第 4 帧和第 6 帧谁更有参考价值,注意力机制做的正是同一件事,只不过用的是数学而不是眼睛。
  1. 查询向量矩阵当前帧的查询特征,它携带“我正在处理哪块区域”的信息。
    Q=XWQQ = X W_Q
  2. 键向量矩阵其他帧的索引特征,负责回答“我这里有哪类内容”,帮助模型快速检索。
    K=XWKK = X W_K
  3. 缩放点积匹配度计算查询与所有键的相似度得分,除以维度平方根防止数值过大导致梯度消失。
    QK⊤dk\frac{Q K^\top}{\sqrt{d_k}}
  4. 加权融合值对匹配度做 softmax 归一化得到权重,再用权重对值向量加权求和,实现跨帧特征融合。
    softmax(⋅) V\mathrm{softmax}(\cdot)\, V

运动条件注入

老周发现,光靠“对照灯台”还不够——有些场景里,人物的动作是有明确方向的,比如奔跑、转身、镜头平移。如果能提前拿到一张“动作路线图”,修复起来会事半功倍。于是他开始在案头放一份标注了运动轨迹的草图:箭头指向哪里,修复时就有意识地让画面顺着箭头走。在视频扩散模型中,这种“动作路线图”就是运动条件注入。

运动条件通常包括两类信息:其一是光流场,描述了每一帧相对于上一帧的像素移动,相当于逐像素的动作指令;其二是相机位姿,记录了拍摄镜头的运动状态,比如镜头是在左摇、推进还是环绕。这些条件并不直接作为输入图片喂给网络,而是经过一个小型编码网络转换成特征向量,再注入到去噪网络的主干特征中。

最直接的注入方式是特征加法,把条件特征加到主干特征上,让模型的每一层都“看得见”动作方向。老周打个比方:这就像在剧本上标注好“从 A 点跑到 B 点”,演员演每场戏时都带着这个方向感,再怎么临场发挥也不会跑偏:

运动条件注入把“猜测动作”变成了“参考剧本生成动作”。老周说,手上有路线图之后,他修的每一帧都稳了许多。现代视频扩散模型正是通过这类设计,把光流、相机轨迹等物理线索融进了生成的血脉里,让画面既生动又合理。

h=h+ϕ(c)h = h + \phi(c)
条件注入的作用是给生成过程“导航”。没有它,模型是在盲修;有了它,模型知道镜头正在右摇、角色正在奔跑,生成结果自然更符合物理规律。
  1. 运动条件表示光流图或相机位姿等外部运动信息,它是老周案头的“动作路线图”。
    c={Fflow, Pcamera}c = \{ F_{\text{flow}},\, P_{\text{camera}} \}
  2. 条件编码网络把原始条件转换成与主干特征维度一致的特征向量,相当于把草图翻译成演员能看懂的走位指令。
    ϕ(c)=MLP(c)\phi(c) = \text{MLP}(c)
  3. 特征调制将条件特征与主干特征相加,使空间与时间两个维度的信息在每一层都保持协同。
    h=h+ϕ(c)h = h + \phi(c)

AI 应用场景

短视频 AI 创作工具

阶段:视频生成应用

解决的问题:传统视频制作需要拍摄、剪辑、特效层层工序,普通人难以产出高质量动态画面。基于视频扩散模型,创作者只需输入一句文字描述,模型便通过加噪-去噪流程生成多帧一致的视频片段,并以时序注意力保证动作连贯。

具体案例:一位短视频博主输入提示词“樱花树下的少女回眸”,可灵或 Pika 类工具在数秒内生成 5-10 秒的连贯视频。底层逻辑就是扩散模型先生成噪声帧,再沿逆向去噪链条逐步还原出“樱花 + 少女 + 镜头前推”的时空协调画面。

老电影修复与高清化

阶段:视频增强与修复

解决的问题:老胶片普遍存在噪点、划痕、帧抖动问题,人工逐帧修复成本高且难以保证时序一致。视频扩散模型的去噪能力天然适配这一任务:先对损坏帧做前向加噪模拟,再用逆向去噪网络逐级清除真实噪点,配合光流约束修复抖动。

具体案例:修复团队处理一部 1980 年的纪录片,将每帧画面输入扩散模型去噪,同时利用光流信息对齐相邻帧,最终输出画面干净、运动平稳的 4K 高清版本。这正是老周工作的现代化版本。

影视预演与中间帧插值

阶段:内容增强生成

解决的问题:动画制作中手绘关键帧之间需要补充中间帧,传统插值算法在快速运动时容易产生形变或闪烁。视频扩散模型的运动条件注入机制可以接收光流作为引导,在生成中间帧时遵循真实的运动轨迹。

具体案例:动画工作室手绘了角色跳跃的起跳与落地两帧,通过扩散模型配合光流条件补出中间的 8 帧,生成手臂摆动自然、身体曲线连贯的过渡画面,大幅节省原画师工作量。

Python 演示

python84 行
import mathimport randomimport numpy as np  def frame_signal(frame_id, n=16):    # 合成一条模拟视频帧的一维信号    t = np.linspace(frame_id * 0.1, frame_id * 0.1 + 2, n)    return np.sin(t) + 0.3 * np.cos(2 * t)  class TinyVideoDiffusion:    def __init__(self, T=60, n=16):        self.T = T        self.n = n        self.betas = np.linspace(0.001, 0.02, T)        self.alpha_bars = np.cumprod(1.0 - self.betas)        self.w1 = np.random.randn(n, 64) * 0.1        self.b1 = np.zeros(64)        self.w2 = np.random.randn(64, n) * 0.1        self.b2 = np.zeros(n)        self.h_cache = None     def predict_noise(self, x_t, t):        # 用两层网络预测当前帧中的噪声        t_emb = np.array([math.sin(t), math.cos(t)])        h = np.maximum(0, x_t @ self.w1 + self.b1 + t_emb)        self.h_cache = h        return h @ self.w2 + self.b2     def add_noise(self, x0, t):        # 前向加噪: 混合原始信号与高斯噪声        ab = self.alpha_bars[t]        eps = np.random.randn(self.n)        x_t = math.sqrt(ab) * x0 + math.sqrt(1 - ab) * eps        return x_t, eps     def train_step(self, x0):        # 随机采样一个时间步, 训练噪声预测网络        t = random.randrange(self.T)        x_t, eps = self.add_noise(x0, t)        pred = self.predict_noise(x_t, t)        dout = (pred - eps) / self.n        self.w2 -= 0.02 * np.outer(self.h_cache, dout)        self.b2 -= 0.02 * dout        drelu = dout @ self.w2.T        drelu[self.h_cache <= 0] = 0        self.w1 -= 0.02 * np.outer(x_t, drelu)        self.b1 -= 0.02 * drelu        return float(np.mean((eps - pred) ** 2))     def sample_frame(self):        # 逆向去噪: 从纯噪声逐步还原出一帧        x = np.random.randn(self.n)        for t in range(self.T - 1, -1, -1):            z = np.random.randn(self.n) if t > 0 else 0.0            pred = self.predict_noise(x, t)            coeff = self.betas[t] / math.sqrt(1.0 - self.alpha_bars[t])            x = (x - coeff * pred) / math.sqrt(1.0 - self.betas[t]) + z        return x  def main():    random.seed(0)    np.random.seed(0)    model = TinyVideoDiffusion()    frames = [frame_signal(i) for i in range(30)]    for epoch in range(300):        loss = sum(model.train_step(f) for f in frames) / len(frames)        if epoch % 100 == 0:            print(f"epoch {epoch} loss {loss:.4f}")    generated = []    for i in range(30):        f = model.sample_frame()        if i > 0:            # 相邻帧平滑, 模拟最简单的时序一致性约束            f = 0.6 * f + 0.4 * generated[-1]        generated.append(f)    delta = float(np.mean(np.abs(np.diff(np.array(generated), axis=0))))    print(f"相邻帧平均差异 {delta:.4f}")  if __name__ == "__main__":    main()
目的:这个极简版本演示了视频扩散模型的两大核心流程——前向加噪混合信号与噪声,以及逆向去噪从噪声中逐步还原信号,同时用相邻帧平滑模拟时序一致性约束。
  1. self.alpha_bars = np.cumprod(1.0 - self.betas)预先算好每一步的累计信号保留比例,加噪时直接查表使用。
  2. x_t = math.sqrt(ab) * x0 + math.sqrt(1 - ab) * eps一行代码完成前向加噪:原信号和噪声按系数混合。
  3. t = random.randrange(self.T)每次训练随机抽一个时间步,让网络学会处理不同强度的噪声。
  4. pred = self.predict_noise(x_t, t)网络根据当前帧和时间步预测“画面里的雪花有多少”。
  5. x = (x - coeff * pred) / math.sqrt(1.0 - self.betas[t]) + z逆向去噪的采样公式:剥掉预测噪声,校正强度,再补一点随机性。
  6. f = 0.6 * f + 0.4 * generated[-1]生成下一帧时参考上一帧,用简单的加权平均模拟时序一致性。

常见误区

误区视频不就是连续的图片吗?我把每一帧都当成一张图片,用图像扩散模型逐帧生成,拼起来不就是视频了?为什么还要搞复杂的时序设计?

正解逐帧独立生成会带来严重的帧间闪烁:同一物体在相邻帧里忽大忽小、忽明忽暗,人物的头发位置随机漂移。这是因为模型没有共享帧间信息,每帧都是在“闭眼盲画”。视频扩散模型必须引入时序注意力、光流约束等机制,让每一帧都参考相邻帧生成,就像老周修胶片时必须把前后帧挂在同一盏灯台下对照。

为何常见:人的直觉容易把“视频”简化成“图的序列”,忽略了人眼对运动连贯性极其敏感这一事实。

误区我以为加噪就是把画面打上越来越大的马赛克,把高清图变成模糊图块,去噪就是把这些马赛克块重新拼清晰。

正解前向加噪加入的是随机高斯噪声,即每个像素独立地叠加一个随机的亮度扰动。马赛克是空间上“抹平细节”,而高斯噪声是“在细节上撒雪花”。去噪网络学的是“如何识别并剥离雪花”,而不是“如何复原被抹平的色块”。

为何常见:日常修图经验中“模糊”和“噪点”经常混为一谈,导致对扩散模型加噪机制的理解产生偏差。

误区既然最后一步是纯随机噪声,那模型生成画面不就是“无中生有”吗?那它跟随机画画有什么区别?

正解逆向去噪的第一步确实从纯噪声出发,但每一步都“有锚定”:模型先预测这一帧可能是什么内容(通过噪声的分布模式推断),再逐步修正。更重要的是,视频生成通常以文字条件、首帧条件或运动条件作为引导,这些条件从一开始就约束了生成方向,就像老周手里拿着“动作路线图”修胶片,绝非随机涂抹。

为何常见:只看到采样时从纯噪声开始的流程图,忽略了条件信息在每一层的持续注入。

误区3D U-Net 和 2D U-Net 的差别只是把卷积核从正方形变成正方体,其他设计完全一样。

正解在实际工程中,直接全换成 3D 卷积会导致参数量和计算量爆炸,且难以训练。主流设计采用“2D 空间卷积 + 时序注意力”或“伪 3D 卷积(先分离空间再分离时间)”等解耦方案,在控制成本的同时兼顾时空建模。3D U-Net 的价值在于多尺度时空特征提取架构,而非简单的卷积维度替换。

为何常见:从字面上理解“3D“很容易得出”就是卷积核多一维”的表面结论,忽略了工程设计的系统性权衡。

误区生成视频只要每帧都清晰漂亮,观感就好,运动是否连贯是次要的。

正解人眼对运动连贯性的敏感度远高于对单帧细节的敏感度。即使每一帧都是 8K 高清,只要相邻帧出现 1-2 像素的抖动,观众就会立刻感到不适。这也是为什么视频扩散模型在训练损失中专门加入光流对齐项和时序注意力,本质上是在用数学方法保证“动得自然”。

为何常见:长期关注图像生成效果的人容易沿用“画质至上”的思维定式,忽略了视频特有的时间维度体验。

面试题

Q1. 扩散模型前向过程的核心作用是什么?

单选题 · easy

  • A.直接生成清晰的视频帧
  • B.逐步向数据中掺入噪声← 正确答案
  • C.用随机噪声替换整个画面
  • D.反向合成训练样本数据

答案:B。前向加噪过程是逐步向原始数据中添加高斯噪声,形成加噪链条,为逆向去噪网络提供训练样本和“破坏规律”。选项 B 正确。A 是逆向过程的职责,C 混淆了逐步加噪与一次性替换,D 方向反了——扩散模型不是用噪声合成样本,而是从样本出发加噪。

Q2. 逆向去噪网络中,模型的主要预测目标是什么?

单选题 · mid

  • A.直接输出完整的最终帧
  • B.输出当前步的掺杂噪声← 正确答案
  • C.输出帧间的运动轨迹
  • D.输出动作类别的标签

答案:B。逆向去噪网络 ε_θ(x_t, t) 的预测目标是当前画面中混入的噪声 ε。模型通过“剥掉预测噪声”来还原更清晰的上一帧。选项 B 正确。A 是一步到位的生成(非扩散范式),C 和 D 分别是光流估计和分类任务,不属于去噪网络的直接预测目标。

Q3. 前向加噪公式中累计系数随时间步 t 增大会如何变化?

单选题 · mid

  • A.单调递减趋近于零值← 正确答案
  • B.单调递增趋近于无穷
  • C.先增后减最后回到零点
  • D.始终维持在一个固定常数值

答案:A。累计信号系数 ᾱ_t 是所有 (1−β_i) 的连乘,由于每个因子都小于 1,所以随着 t 增大,它单调递减并趋近于零。这意味着原始信号占比越来越小、噪声占比越来越大。选项 A 正确,其余选项都与连乘递减性质相悖。

Q4. 视频扩散模型与图像扩散模型最本质的区别在于什么?

单选题 · mid

  • A.多了时间维度的建模能力← 正确答案
  • B.网络深度增加一倍即可
  • C.只需要加宽卷积核即可
  • D.去掉跳跃连接结构即可

答案:A。视频扩散模型在处理空间维度的基础上,必须额外建模时间维度上的帧间关系,包括时序注意力、光流约束和运动条件注入。选项 A 正确。单纯加深网络、加宽卷积核或改动跳跃连接,都无法解决帧间一致性问题。

Q5. 为什么视频扩散模型要引入光流约束?

单选题 · easy

  • A.为了让相邻帧运动保持连贯← 正确答案
  • B.为了减少视频文件存储体积
  • C.为了增强单帧画面的锐度
  • D.为了压缩模型的参数量

答案:A。光流约束通过强迫当前帧与“按光流变形的上一帧”保持一致,抑制帧间闪烁、保证运动轨迹合理。选项 A 正确。光流是视频理解中的运动信息,与文件压缩、画面锐化和参数量压缩无关。

Q6. 时序注意力层在视频扩散模型中的作用是什么?

单选题 · easy

  • A.让不同帧之间共享参考信息← 正确答案
  • B.让单帧内部的色彩更鲜艳
  • C.让模型训练速度成倍提升
  • D.让视频文件的编码更加高效

答案:A。时序注意力通过 QKV 机制计算帧间匹配度,将相邻帧的特征按相似度加权融合,让当前帧能参考其他帧的信息,从而保持内容一致与运动连贯。选项 A 正确。它不负责单帧色彩、训练速度或视频编码。

Q7. 3D U-Net 中残差连接的核心作用是什么?

单选题 · hard

  • A.让深层网络训练更稳定← 正确答案
  • B.让卷积核自动变大
  • C.让噪声比例自动调整
  • D.让光流计算更加简单

答案:A。残差连接 y = x + F(x, t) 让网络只需学习增量修改而非完整的特征重建,缓解深层网络梯度消失问题,使训练更稳定。选项 A 正确。残差机制不改变卷积核尺寸、不调度噪声、不直接计算光流。

Q8. 视频扩散模型常用的时序一致性手段有哪些?

多选题 · mid

  • A.时序注意力层建模帧间依赖← 正确答案
  • B.光流约束保持运动连贯性← 正确答案
  • C.训练时打乱所有帧的顺序
  • D.条件帧与生成帧联合输入← 正确答案

答案:ABD。时序注意力让帧间互相参照,光流约束让运动符合物理规律,条件帧联合输入为生成提供锚定结构,三者都是典型的时序一致性设计。选项 C 打乱帧序会破坏时序结构,属于错误思路。

Q9. 关于前向加噪过程的噪声调度,下列说法正确的有哪些?

多选题 · hard

  • A.噪声强度需要从小到大逐步增加← 正确答案
  • B.信号保留系数应随步数递减← 正确答案
  • C.噪声系数在每一步可以任意指定
  • D.最终步画面应接近高斯噪声分布← 正确答案

答案:ABD。前向加噪按从小到大的调度逐步增加噪声强度,初始步保留大部分信号,最后一步信号接近消失、画面逼近标准高斯分布。调度表必须精心设计,不能任意取值,因此 C 错误。A、B、D 均符合扩散模型的调度设计准则。

Q10. 关于视频扩散模型的运动条件注入,下列说法正确的有哪些?

多选题 · extreme

  • A.光流场可作为运动条件输入← 正确答案
  • B.相机位姿可辅助建模镜头运动← 正确答案
  • C.条件特征注入到主干网络各层← 正确答案
  • D.运动条件必须输入原始像素图

答案:ABC。光流和相机位姿是典型的运动条件,二者经编码网络转换为特征后注入主干网络的各层,实现“带着方向感生成”。条件以特征向量而非原始像素图形式输入,因此 D 错误。A、B、C 正确描述了运动条件注入的核心设计。