关键词:扩散模型、Diffusion Transformer、时空 Patch、3D VAE、Flow Matching、Sora / Veo / 可灵
这篇文章不堆砌"哪个模型最强"的榜单,而是把 AI 视频"凭空生成"这件事的底层数学和工程逻辑讲清楚。读完你应该能回答:为什么是噪声变视频?为什么帧与帧之间不会"鬼畜"?以及如何用几十行代码亲手跑一遍核心流程。
一、先看现状:2026 年视频生成走到哪了
两年前 AI 视频还是"五秒钟、手指融化、画面糊成一团"的玩具。到 2026 年,主流模型已经能稳定输出 1080p 甚至原生 4K、十几秒、画面与音频同步生成的片段。
当前真正主流的几个模型------Google 的 Veo 3.1 、OpenAI 的 Sora 2 、快手的 可灵 3.0(Kling 3.0) 、字节的 Seedance 2.0------架构上有一个惊人的共识:
它们全部是 Diffusion Transformer(扩散 Transformer,简称 DiT)。
它们都不在原始像素上工作,而是把视频压缩进一个"时空潜空间",在里面把噪声一步步"去噪"成视频。下面我们就从这条主线把原理拆开。
二、整体框架:从一句话到一段视频
先建立全局认知。一个文本生成视频(Text-to-Video)系统,本质上是下面这条流水线:
文本提示词 ──► 文本编码器 ──► 条件向量
│
随机高斯噪声 ──► [ 扩散 Transformer 反复去噪 ] ──► 时空潜表示(latent)
▲
(条件向量注入引导)
│
时空潜表示 ──► 3D VAE 解码器 ──► 像素视频(+ 音频)
拆成四个核心模块:
- 文本编码:把"一只柯基在雪地里奔跑"变成模型能理解的向量(通常用 T5 或 CLIP 类编码器)。
- 时空压缩(3D VAE):像素视频太大,先压成低维潜空间,降低几十倍计算量。
- 扩散去噪(DiT):核心引擎。从纯噪声出发,在潜空间里一步步去噪,逐渐"显影"出符合提示词的内容。
- 解码还原:把去噪完成的潜表示解码回真实像素(现代模型还会同步生成音频)。
接下来逐个击破,重点在第 3 和第 2 模块。
三、核心原理一:扩散模型------"加噪"与"去噪"
3.1 直觉:把生成问题变成去噪问题
扩散模型的核心思想极其优雅:
- 前向过程(加噪) :拿一张真实图片,一点点往上加高斯噪声,加几百上千步后,它变成一团纯噪声。这个过程是固定的、无需学习的。
- 反向过程(去噪) :训练一个神经网络,学会"看着一团带噪声的东西,预测出该减掉多少噪声"。如果网络学会了,那么我们就能从纯噪声出发,反向一步步去噪,无中生有地造出一张全新的图。
视频只是把"一张图"换成"一叠按时间排列的图"而已。
3.2 数学表述(DDPM)
前向加噪 。给定真实数据 x0x_0x0,第 ttt 步的加噪结果可以一步到位地写出:
xt=αˉt x0+1−αˉt ϵ,ϵ∼N(0,I) x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) xt=αˉt x0+1−αˉt ϵ,ϵ∼N(0,I)
其中 αˉt=∏s=1tαs\bar{\alpha}t = \prod{s=1}^{t}\alpha_sαˉt=∏s=1tαs 是一个随 ttt 增大而单调递减的系数(噪声调度)。ttt 越大,x0x_0x0 占比越小,噪声占比越大,直到几乎全是噪声。
训练目标 。我们训练一个网络 ϵθ\epsilon_\thetaϵθ,输入带噪样本 xtx_txt、步数 ttt 和条件 ccc(比如文本),让它预测当初加进去的噪声 ϵ\epsilonϵ:
L=Ex0,ϵ,t ∥ϵ−ϵθ(xt,t,c)∥2 \mathcal{L} = \mathbb{E}_{x_0, \epsilon, t}\left\\; \\big\\\| \\epsilon - \\epsilon_\\theta(x_t, t, c) \\big\\\|\^2 \\;\\right L=Ex0,ϵ,t ϵ−ϵθ(xt,t,c) 2
就是一个最朴素的均方误差。训练阶段做的全部事情,就是反复地"随机选一个真实样本、随机加点噪声、让网络猜噪声"。
采样(生成) 。训练好后,从 xT∼N(0,I)x_T \sim \mathcal{N}(0, I)xT∼N(0,I) 出发,用网络预测的噪声反复去噪:
xt−1=1αt(xt−1−αt1−αˉt ϵθ(xt,t,c))+σtz x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}t}}\, \epsilon\theta(x_t, t, c) \right) + \sigma_t z xt−1=αt 1(xt−1−αˉt 1−αtϵθ(xt,t,c))+σtz
一步步从 xTx_TxT 走到 x0x_0x0,噪声团就"显影"成了内容。
💡 2026 趋势:Flow Matching
新一代模型(如 Stable Diffusion 3、部分视频模型)越来越多采用 Flow Matching / Rectified Flow ,不再预测离散噪声,而是学习一个从噪声分布到数据分布的连续"速度场" vθ(xt,t)v_\theta(x_t, t)vθ(xt,t),采样路径更直、步数更少、训练更稳。思想同源,只是把"预测噪声"换成了"预测前进方向"。
四、核心原理二:为什么要在"潜空间"里玩------3D VAE
4.1 像素空间太贵
一段 5 秒、24fps、512×512 的视频,就是 120×512×512×3≈9400120 \times 512 \times 512 \times 3 \approx 9400120×512×512×3≈9400 万个数。直接在像素上跑扩散,显存和算力都吃不消。
解法是 VAE(变分自编码器) :先用一个编码器 把视频压成一个小得多的潜表示 zzz,在 zzz 上做扩散,最后用解码器 还原回像素。这就是 Latent Diffusion(潜扩散) 的精髓,也是 Stable Diffusion 当年破圈的关键。
4.2 视频要压"时间维"------3D VAE
图片的 VAE 只压空间(高、宽)。但视频多了时间维 ,相邻帧高度冗余(背景几乎不动)。所以视频模型用 3D VAE:卷积核在"时间 × 高 × 宽"三个维度上同时压缩。
- 空间通常压缩 8×8;
- 时间通常压缩 4× 左右(比如 4 帧合并成 1 个时间潜帧)。
可灵(Kling)的官方架构说明里就明确写了用 3D VAE 高效压缩时空特征。压缩后扩散模型要处理的数据量直接小了几十倍,这是长视频、高分辨率能跑起来的工程前提。
五、核心原理三:Diffusion Transformer 与"时空 Patch"
5.1 从 U-Net 到 Transformer
早期扩散模型的去噪网络 ϵθ\epsilon_\thetaϵθ 是 U-Net (卷积结构)。Sora 带来的范式转变是:把 U-Net 换成 Transformer。Transformer 的可扩展性(scaling law)更好------加数据、加参数,效果稳定提升,这正是大模型时代最看重的性质。
5.2 关键招式:时空 Patch(Spacetime Patches)
Transformer 吃的是"一串 token"。怎么把一段视频潜表示变成 token 序列?
答案是 时空 Patch:把压缩后的时空潜表示,沿着"时间 × 高 × 宽"切成一个个小立方块(patch),每个立方块拉平成一个向量,就成了一个 token。
潜空间视频 (T × H × W × C)
│ 按 (t_p × h_p × w_p) 切块
▼
一串时空 patch token ──► 喂给 Transformer
这个设计的妙处在于统一性 :无论视频是长是短、是横屏是竖屏、是高清是低清,都能切成同样规格的 patch 序列。这就是为什么 Sora 能用同一个模型训练任意时长、任意分辨率、任意宽高比的视频------OpenAI 的技术报告里把这套机制称为"把视频当作时空 patch 的集合"。
5.3 时序一致性靠什么------注意力
帧与帧之间不"鬼畜"、人物前后是同一个人、运动连贯------这些时间一致性 靠 Transformer 的注意力机制保证:
- 空间注意力:同一帧内不同位置互相"看"(保证单帧画面合理)。
- 时间注意力:不同时间步的同一区域互相"看"(保证运动连贯)。
很多实现采用 3D 全注意力 (所有时空 patch 互相 attend),效果最好但算力最贵;也有用时空分解注意力(先时间后空间)来省算力的折中方案。这正是"画面会不会抖、人物会不会变脸"的根本所在。
5.4 文本怎么"指挥"画面------条件注入与 CFG
提示词通过**交叉注意力(Cross-Attention)**注入:文本向量作为 Key/Value,潜表示 patch 作为 Query,让"柯基""雪地""奔跑"这些语义去影响每个 patch 的去噪方向。
此外几乎所有模型都用 无分类器引导(Classifier-Free Guidance, CFG) 来增强提示词的"听话程度"。做法是在采样时同时算"有提示词"和"无提示词"两个预测,然后外推放大二者的差:
ϵ^=ϵθ(xt,t,∅)+w⋅(ϵθ(xt,t,c)−ϵθ(xt,t,∅)) \hat{\epsilon} = \epsilon_\theta(x_t, t, \varnothing) + w \cdot \big( \epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing) \big) ϵ^=ϵθ(xt,t,∅)+w⋅(ϵθ(xt,t,c)−ϵθ(xt,t,∅))
引导系数 www 越大,越贴合提示词(但太大会过饱和、失真)。你在产品里调的"提示词相关性"滑块,背后往往就是这个 www。
六、动手:用代码跑通核心流程
下面给两段可独立运行的 PyTorch 教学代码(为聚焦原理做了简化,不是工业实现)。
6.1 扩散的"加噪 / 去噪"骨架
这段代码不依赖任何视频数据,直接展示扩散调度与采样循环的数学骨架:
python
import torch
# ---------- 1. 噪声调度(线性 beta) ----------
T = 1000
betas = torch.linspace(1e-4, 0.02, T) # 每一步的噪声强度
alphas = 1.0 - betas
alpha_bars = torch.cumprod(alphas, dim=0) # ᾱ_t = ∏ α_s
# ---------- 2. 前向加噪:一步到位得到 x_t ----------
def q_sample(x0, t, noise):
"""x_t = √ᾱ_t · x0 + √(1-ᾱ_t) · ε"""
ab = alpha_bars[t].view(-1, 1, 1, 1) # 广播到 (B,C,H,W)
return ab.sqrt() * x0 + (1 - ab).sqrt() * noise
# ---------- 3. 训练目标:让网络预测噪声 ----------
def training_loss(model, x0, cond):
B = x0.size(0)
t = torch.randint(0, T, (B,), device=x0.device) # 随机步数
noise = torch.randn_like(x0) # 随机噪声
x_t = q_sample(x0, t, noise)
pred = model(x_t, t, cond) # 网络预测噪声 ε_θ
return ((noise - pred) ** 2).mean() # MSE,就这么简单
# ---------- 4. 采样:从纯噪声反向去噪 ----------
@torch.no_grad()
def sample(model, shape, cond, guidance=4.0):
x = torch.randn(shape) # x_T ~ N(0, I)
for t in reversed(range(T)):
t_b = torch.full((shape[0],), t, dtype=torch.long)
# --- Classifier-Free Guidance ---
eps_cond = model(x, t_b, cond)
eps_uncond = model(x, t_b, None) # 空条件
eps = eps_uncond + guidance * (eps_cond - eps_uncond)
# --- DDPM 反向一步 ---
a, ab, b = alphas[t], alpha_bars[t], betas[t]
x = (x - (b / (1 - ab).sqrt()) * eps) / a.sqrt()
if t > 0:
x = x + b.sqrt() * torch.randn_like(x) # 注入随机性
return x
把上面的 model 换成处理视频张量 (B, T, C, H, W) 的网络,把图片换成视频潜表示,这套骨架就直接迁移到视频生成------核心数学一模一样。
6.2 一个最小的"时空注意力"块(DiT 的灵魂)
这段展示时间一致性的关键------时空分解注意力:
python
import torch
import torch.nn as nn
class SpatioTemporalBlock(nn.Module):
"""简化版 DiT 块:空间注意力 + 时间注意力 + 交叉注意力(文本条件)"""
def __init__(self, dim, n_heads, text_dim):
super().__init__()
self.spatial_attn = nn.MultiheadAttention(dim, n_heads, batch_first=True)
self.temporal_attn = nn.MultiheadAttention(dim, n_heads, batch_first=True)
self.cross_attn = nn.MultiheadAttention(dim, n_heads, batch_first=True,
kdim=text_dim, vdim=text_dim)
self.norm1 = nn.LayerNorm(dim)
self.norm2 = nn.LayerNorm(dim)
self.norm3 = nn.LayerNorm(dim)
self.ff = nn.Sequential(nn.Linear(dim, dim * 4), nn.GELU(),
nn.Linear(dim * 4, dim))
def forward(self, x, text):
# x: (B, T, N, D) ------ T 个时间步,每步 N 个空间 patch token
B, Ti, N, D = x.shape
# 1) 空间注意力:同一帧内 N 个 patch 互相看
h = x.reshape(B * Ti, N, D)
h = h + self.spatial_attn(self.norm1(h), self.norm1(h), self.norm1(h))[0]
# 2) 时间注意力:同一空间位置在 T 个时间步之间互相看(保证运动连贯)
h = h.reshape(B, Ti, N, D).permute(0, 2, 1, 3).reshape(B * N, Ti, D)
h = h + self.temporal_attn(self.norm2(h), self.norm2(h), self.norm2(h))[0]
h = h.reshape(B, N, Ti, D).permute(0, 2, 1, 3).reshape(B * Ti, N, D)
# 3) 交叉注意力:让文本条件引导画面内容
t = text.unsqueeze(1).expand(B, Ti, -1, -1).reshape(B * Ti, -1, text.size(-1))
h = h + self.cross_attn(self.norm3(h), t, t)[0]
# 4) 前馈
h = h + self.ff(h)
return h.reshape(B, Ti, N, D)
读懂这两段代码,你就握住了所有主流视频生成模型的"骨架":扩散负责"从噪声造内容",时空注意力负责"帧间连贯",交叉注意力负责"听懂提示词"。
6.3 真实开发:直接调用厂商 API
绝大多数实际项目不会自己训模型,而是调用 Veo / 可灵 / Seedance 等厂商接口。形态大同小异------提交一个生成任务、轮询任务状态、取回视频 URL:
python
import requests, time
API_BASE = "https://api.example-video-provider.com/v1" # 占位,以实际厂商文档为准
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1) 提交生成任务
def create_task(prompt, duration=5, resolution="1080p"):
resp = requests.post(f"{API_BASE}/videos/generations", headers=HEADERS, json={
"model": "video-gen-latest",
"prompt": prompt,
"duration": duration,
"resolution": resolution,
"aspect_ratio": "16:9",
})
resp.raise_for_status()
return resp.json()["task_id"]
# 2) 轮询直到完成(视频生成通常是异步的,耗时几十秒到几分钟)
def wait_for_result(task_id, interval=5, timeout=600):
start = time.time()
while time.time() - start < timeout:
r = requests.get(f"{API_BASE}/tasks/{task_id}", headers=HEADERS).json()
status = r["status"]
if status == "succeeded":
return r["output"]["video_url"]
if status == "failed":
raise RuntimeError(r.get("error", "generation failed"))
time.sleep(interval)
raise TimeoutError("generation timed out")
if __name__ == "__main__":
tid = create_task("一只柯基在雪地里奔跑,慢动作,电影级光影")
url = wait_for_result(tid)
print("生成完成:", url)
⚠️ 各厂商参数名、鉴权方式、计费(基本都按"秒"收费)各不相同,以官方文档为准。上面是通用模式骨架。
七、总结:一张图记住全部
| 模块 | 作用 | 关键技术 |
|---|---|---|
| 文本编码器 | 把提示词变向量 | T5 / CLIP |
| 3D VAE | 时空压缩,降算力 | 3D 卷积、潜空间 |
| 时空 Patch | 视频→token 序列 | Spacetime Patches |
| Diffusion Transformer | 去噪生成主引擎 | DiT、扩散 / Flow Matching |
| 时间注意力 | 帧间连贯一致 | 3D / 分解注意力 |
| 交叉注意力 + CFG | 听懂并贴合提示词 | Cross-Attention、引导系数 |
| 解码器 | 潜表示→像素(+音频) | 3D VAE Decoder |
一句话串起来:
把视频压进时空潜空间 → 切成时空 patch → 用 Transformer 在扩散过程中从噪声去噪、靠注意力保证连贯、靠文本条件引导内容 → 解码回像素。
接下来值得关注的方向
- Flow Matching / 一致性模型:更少采样步数、更快生成,正在取代传统 DDPM 采样。
- 音视频联合生成:2026 主流模型已把对白、音效、环境音与画面在同一次前向里同步生成。
- 更长、更可控:多镜头一致性、首尾帧控制、相机轨迹控制成为新战场。
- 自回归 vs 扩散之争:自回归在超长视频上有理论优势,但 2026 年 DiT 仍是产业主力。
本文聚焦原理与最小可运行示例,工业级实现还涉及大量训练技巧、数据工程与分布式优化。如果你想要某一模块(比如 3D VAE 训练、Flow Matching 推导)的深入拆解,欢迎在评论区交流。