WAN

Paper:Wan: Open and Advanced Large-Scale Video Generative Models

学习模块1:Wan-VAE

创新点1:发现 GroupNorm 会破坏因果性,并改良。

论文设计了一个具有 1.27 M 参数的 casual 3D VAE,成功的将视频的时空维度压缩了

image.png

论文用 RMSNorm 替换了 GroupNorm,原因是 GroupNorm 可能会以来未来帧的统计量,破坏因果结构。

那么 GroupNorm 是如何计算的呢?

假设视频 latent 是:,比如

如果用 GroupNorm(num_groups=4, num_channels=16),它会把 16 个 channel 分成 4 组:

text
1
2
3
4
第 1 组: channel 0,1,2,3
第 2 组: channel 4,5,6,7
第 3 组: channel 8,9,10,11
第 4 组: channel 12,13,14,15

然后 对每个 batch 内、每个 group 内的所有元素计算均值和方差。也就是对这些维度一起算统计量:C_group × T × H × W

然后:

text
1
2
3
4
5
先标准化:
x_norm = (x - mean) / std

再缩放和平移:
y = gamma * x_norm + beta

但是 RMSNorm 只在 channel 维度 C 上计算 RMS。

创新点2:分块策略与特征缓存机制

传统的 3D 卷积在处理视频时,卷积核不仅在空间(H, W)上滑动,还在时间轴(T)上滑动。假设你的视频有 100 帧,直接塞进一个普通的 3D 卷积层,这个卷积层需要同时将这 100 帧的特征图全部缓存在 GPU 显存中,用来计算时间维度的上下文。随着帧数 的增加,显存开销呈线性飙升,极其容易引发 Out of Memory (OOM)。

论文中整个视频被切分成由 个 Chunks 组成的队列,这个数量恰好与压缩后的潜空间特征数量完全一致 。也就是每个 Chunk 最多只有 4 帧。

论文默认复用前一个 Chunk 的最后 2 帧特征。

对于默认因果卷积:

image.png

Kernal Size 通常是 3,为了计算当前块,它必须向前索要 2 帧 缓存,输出刚好等于 Chunk 的原始帧数。

对于时间下采样卷积层:

image.png

这类层负责将时间轴的分辨率压缩,它向前面索要 1 帧 缓存 。

学习模块2:DiT 架构的参数瘦身与能效优化

标准 DiT 是如何处理时间步 和文本条件的 ?

通常引入自适应层归一化:

其中,(缩放因子 Scale)和 (位移因子 Shift)不是固定的控制系数,而是通过一个 MLP,根据当前的时间步嵌入(Timestep Embedding)动态预测出来的。

系统框架:

text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
prompt

text encoder

text tokens ───────────────┐

原始视频 / latent noise DiT denoiser
↓ ↑
3D-VAE encoder │
↓ │
latent video z_t │
↓ │
patchify │
↓ │
video tokens + pos emb ─────┘

diffusion timestep t
通过 AdaLN 调制每个 block

然后每一层都需要有两组参数,设模型的隐层维度为 ,每组参数需要被投影成 的巨型向量,另外还要有巨型线性投影矩阵,这部分参数在整个模型中占据了高达 25% 的比例。

然后 WAN 做了优化:

  • 权重全共享:全局共同复用同一个全局投影矩阵的权重。
  • 保留层独立偏置:让每一个 Block 学习一套自己独享的、非常轻量化的偏置向量。

image.png

论文做了实验:

  • Full-shared-adaLN-1.3B(基础款): 30层网络,参数全共享(Wan 的标准做法) 。
  • Half-shared-adaLN-1.5B(半独立): 前 15 层共享,后 15 层保持独立不共享。由于增加了不共享的投影层,参数量膨胀了 0.2B,达到 1.5B 。
  • Full-shared-adaLN-1.5B (extended)(加深款): 保持参数全共享,但利用省下来的参数预算,把网络层数从 30 层硬生生堆到了 35 层,此时总参数量同样对齐到 1.5B 。
  • Non-shared-AdaLN-1.7B(完全不共享): 维持 30 层网络,但每一层都完全独立,不共享任何参数,总参数量高达 1.7B 。

发现:

  • 同等参数量对比: 在相同 1.5B 参数规模下,加深款(35层+全共享)的训练 Loss 显著、持续低于半独立的 1.5B 模型
  • 跨越参数量对比: 更加令人惊叹的是,即便是那个拥有独立参数、总规模高达 1.7B 的庞大模型,其最终的收敛效果也干不过只有 1.5B、但网络更深的加深款模型 。

结论:在 DiT 架构中,将参数堆在条件调制层(adaLN)的容量上是一种低效的浪费;将参数彻底解放出来,用来堆网络的深度(Depth,更多的 Transformer 块),才能带来最强的语义收敛和画质爆发

学习模块3:流匹配框架下的“图-影联合”多阶段预训练

Pre-Training

  • 阶段1:纯图像的预训练
    • 使用 256 像素的文本图像对从头预训练,没有任何视频。
  • 阶段2:图像-视频联合训练
    • 将训练数据切换为 256 像素的图像与 192 像素、5秒长度(16帧每秒,共80帧物理帧)的短视频剪辑 混合在一起进行联合训练。
  • 阶段3:抬升分辨率
    • 将图像和视频的分辨率统一提升到 480p。
    • 但是视频的物理时常依旧是 5 秒
  • 阶段4:继续提升分辨率
    • 将空间分辨率推到最终的 720p 级别
    • 视频的物理时常依旧是 5 秒

Post-Training

  • 阶段5:模型维持 480p 和 720p 的高分辨率,但把数据源切换成了经过极致筛选的“高质量画质美感图”以及“具备复杂/简单运动且类目平衡的黄金视频” 。

其他

什么是 Plücker coordinates(普吕克坐标)?

是一种表示 3D 空间中“直线”的方式。在相机运动控制里,它通常用来表示:相机中心出发、穿过图像某个像素点的一条 3D 射线

一条 3D 直线可以用两个三维向量表示:

其中: 是直线的方向向量,表示这条线朝哪里走; 是 moment vector(矩向量),可以理解成这条线相对于原点的位置关系。这里 是直线上任意一点, 是叉乘。

所以 Plücker coordinates 通常是 6 维向量

这也是为什么 Wan 论文里会写 camera condition 是:

意思是:对视频中每一帧、每个像素,都生成一个 6 维 Plücker 表示。Wan 在相机运动控制模块中用它把相机内参、外参转换成稠密的几何条件,再注入到 DiT 里控制镜头运动。


WAN
https://d4wnnn.github.io/2026/05/30/Notion/WAN/
作者
D4wn
发布于
2026年5月30日
许可协议