模块一 · 核心原理 预计阅读 18 分钟

NeRF & GS 与生成模型的关联:Diffusion 驱动的 3D 内容生成

L1L2 解决了「从照片重建三维场景」的问题——给定几十张环绕拍摄的图片,NeRF 或 3DGS 能恢复出可自由漫游的场景。但现实中有大量需求是没有照片、只有描述:「给我一座赛博朋克风格的中式庭院」、「把这个二维 Logo 变成 3D 模型」。

本章将拆解生成式 3D的核心思想:如何让预训练的 2D 图像生成模型(Diffusion)「教」一个 3D 表示(NeRF/3DGS)学会生成合理的三维结构。你会理解 DreamFusion 的 Score Distillation Sampling(SDS)为何能只用文字就生成 3D 对象——这是连接 2D 生成能力与 3D 表示的桥梁。

术语速查

本课引入生成模型相关术语。如需随时查阅定义,请打开 L3 词汇表(可打印,适合边学边查)。

先澄清一个容易混淆的点:NeRF/3DGS 是三维场景的表示方法(回答「三维空间长什么样」),而 Diffusion/VAE 是二维图像的生成模型(回答「什么样的图片合理」)。二者解决的问题根本不同,但在生成式 3D 中通过「渲染 + 评判」协作:

NeRF / 3DGS Diffusion / VAE
本质 三维场景的表示与渲染 二维图像的生成与分布建模
输入 相机位姿 + 多视角图像 随机噪声或隐向量 z
输出 任意视角的 2D 渲染图 一张新的 2D 图像
能否创造 不能——只能重建已观测场景 能——从分布采样新图像
一致性 天然多视角一致 每步独立,不保证一致

1. 问题背景:3D 数据的稀缺性

训练一个高质量的 3D 生成模型需要海量的标注 3D 数据。但现实中:

与此同时,2D 图像生成模型已经极其强大。Stable Diffusion、DALL-E、Midjourney 等模型在数十亿张图文对(image-text pairs)上训练,学会了「什么样的图片是合理的」。核心洞察由此产生:与其直接学习生成 3D,不如让一个 3D 表示去「讨好」一个已经懂审美的 2D 生成模型

3D 数据(稀缺) 3D 3D 3D ShapeNet: ~50K Objaverse: ~800K 标注成本高、分布窄 2D 图像 + 文本(丰富) 数十亿张图文对 LAION-5B, 互联网爬取 差距 1000x+
3D 标注数据与 2D 图文数据的数量级差距。这一差距催生了「用 2D 生成模型驱动 3D 生成」的核心思路。

2. Diffusion 模型:一个懂审美的「评委」

在进入 3D 生成之前,先回顾 Diffusion 模型的核心直觉(假设你已具备基础深度学习背景):

Diffusion 模型是一个去噪网络。训练时,它学习从被高斯噪声严重破坏的图像中恢复出清晰的原始图像。推理时,从一个纯噪声图像出发,通过多步去噪逐步生成一张新图像。关键是:这个网络在训练过程中「见过」数十亿张真实图片,因此它知道「什么样的图片看起来是合理的」

文本到图像的 Diffusion 模型(如 Stable Diffusion)还额外学会了对齐文本语义:给定「一只宇航猫」的文本描述,它去噪出的图像不只是「合理的图片」,而是「符合文字描述的合理图片」。

关键直觉

把 Diffusion 模型想象成一位经验丰富的艺术评委。他不能亲手为你雕塑,但他看一眼你的草图就能告诉你:「这个角度不对,猫的脸应该更圆一些,宇航服的头盔反光太强了。」DreamFusion 的核心思想就是:让这位评委不断给出反馈,指导一个 3D 模型自我调整。

3. DreamFusion:用评委的反馈雕刻 3D

DreamFusion(Poole et al., ICLR 2023)是首个成功实现「Text-to-3D」的里程碑工作。它不直接生成 3D 数据,而是采用以下策略:

  1. 用 NeRF 作为可学习的 3D 表示——一个随机初始化的 MLP,有待训练
  2. 随机采样一个相机视角,从当前 NeRF 渲染出一张 2D 图像
  3. 把这张渲染图加上噪声,喂给预训练的文本条件 Diffusion 模型
  4. Diffusion 模型尝试去噪——在去噪过程中,它会朝着「更像真实图片」的方向调整
  5. 利用去噪方向的梯度,反向传播更新 NeRF 的权重
  6. 重复步骤 2-5,直到 NeRF 从任意视角渲染出的图像都让 Diffusion 评委满意
NeRF (随机初始化) 可学习的 3D 随机视角 渲染 2D 图像 体积渲染 添加噪声 ~N(0, s^2) 破坏图像 Diffusion 模型 (预训练, 冻结) 文本条件:「宇航猫」 去噪 + 评分 梯度信号 dL/dtheta 评委的反馈 更新 NeRF 权重 theta <- theta - eta*g 重复数万次,覆盖所有视角 3D 表示 2D 渲染 噪声扰动 2D 生成模型 优化
DreamFusion 的 SDS 流程:NeRF 随机视角渲染 → 加噪声 → Diffusion 去噪评估 → 梯度回传 → 更新 NeRF。循环数万次后,NeRF 从任意视角看都「像真的」。

4. Score Distillation Sampling:评委如何给出反馈

上述流程的核心是 Score Distillation Sampling(SDS)。为了理解它,需要先明白 Diffusion 模型的一个性质:

Diffusion 的去噪过程实际上是在估计分数函数(Score Function),即数据分布的对数概率密度对输入的梯度。直观地说,分数函数指向「数据密度更高的方向」——就像山顶的梯度指向海拔上升最快的方向,分数函数指向「更像真实图片」的方向。

SDS 的精妙之处在于:它不直接优化「渲染图像与目标图像的像素差异」(因为没有目标图像),而是优化「渲染图像在 Diffusion 模型看来有多像真实图片」。具体来说:

  1. 取当前 NeRF 在某视角渲染的图像 x = render(theta, camera)
  2. 给 x 加上噪声得到 x_t(t 是随机选的时间步)
  3. 把 x_t 和文本提示喂给 Diffusion 模型,得到预测的去噪方向 eps_pred
  4. 计算 eps_pred 与真实噪声 eps 的差异——这个差异就是「评委的评分」
  5. 通过链式法则把这个评分回传给 NeRF 参数 theta
为什么叫「蒸馏」?

SDS 的名字中有「Distillation(蒸馏)」,因为它本质上是把预训练 Diffusion 模型中关于「什么是合理图像」的知识,蒸馏到一个 3D 表示中。Diffusion 模型是「老师」,NeRF 是「学生」——学生不断渲染图像给老师看,老师给出改进方向,学生据此调整自己。

SDS 的局限性

SDS 存在一个著名的过饱和(Oversaturation)问题:由于 Diffusion 模型对噪声水平敏感,SDS 倾向于生成颜色过亮、对比度过高的图像,导致 3D 结果看起来有点「塑料感」或「虚假」。后续工作如 Magic3D、Fantasia3D 通过多阶段优化、引入法线贴图等方式缓解了这一问题。

5. 为什么 NeRF / 3DGS 是理想的「学生」?

并非任意 3D 表示都能充当 SDS 中的学生。NeRF 和 3DGS 被选中,是因为它们满足三个关键条件:

条件 为什么重要 NeRF / 3DGS 如何满足
可微分渲染 Diffusion 的梯度必须能流回 3D 参数 NeRF 的体积渲染处处可导;3DGS 的可微分光栅化记录每高斯贡献
任意视角一致性 3D 表示必须从所有角度都「合理」 NeRF/3DGS 共享同一组参数表达整个场景,天然保证多视角一致性
连续性 优化过程需要平滑的参数空间 隐式 MLP 和显式高斯的位置/颜色都是连续变量,梯度下降有效

对比传统表示:三角网格的拓扑变化是不连续的(难以用梯度优化),点云没有表面定义(难以渲染出让 Diffusion 评估的图像),体素网格分辨率受限(精细细节需要极高分辨率)。NeRF 和 3DGS 恰好避开了这些陷阱。

6. 从 NeRF 到 3DGS:更快、更清晰的生成

DreamFusion 使用 NeRF 作为 3D 表示,训练需要数小时。后续工作迅速将 SDS 框架迁移到 3DGS 上——最典型的是 GaussianDreamerDreamGaussian。为什么要换?

DreamFusion (NeRF + SDS) NeRF 隐式 MLP 体积渲染 慢, ~10s/帧 Diffusion 评分 训练时间: 数小时 结果: 有点模糊/过饱和 编辑: 困难 演进 → DreamGaussian (3DGS + SDS) 3DGS 显式高斯 光栅化 快, ~100 FPS Diffusion 评分 训练时间: 数分钟 结果: 更清晰、几何感强 编辑: 可直接操作高斯
从 DreamFusion(NeRF + SDS)到 DreamGaussian(3DGS + SDS)的演进。核心框架不变,只是将 3D 表示从隐式 MLP 换为显式高斯点云,获得了数量级的速度提升和更好的编辑性。

7. 另一路径:Zero123 与单图生 3D

SDS 解决了「Text-to-3D」的问题,但它依赖 Diffusion 模型的文本理解能力。如果用户只有一张图片、没有文字描述呢?

Zero123 系列工作的思路是:训练一个专门的扩散模型,输入是一张参考图和一个目标视角(相对参考视角的旋转角度),输出是该视角下的图像。这个模型在大量「同一场景、不同视角」的图像对上训练,学会了「给定一张图,我能想象出其他角度长什么样」。

有了 Zero123,单图生 3D 的流程变为:

  1. 用 Zero123 从输入图生成多个虚拟视角的合成图像
  2. 用这些合成图像作为监督信号,训练一个 NeRF 或 3DGS
  3. 最终得到一个可以从任意角度观察的 3D 对象
SDS vs Zero123:两种范式对比

SDS 范式(DreamFusion / DreamGaussian):每步渲染后请 Diffusion 「评委」打分,通过反馈优化 3D。优势是不需要多视角数据,劣势是训练慢、容易过饱和。

Zero123 范式(One-2-3-45 / SyncDreamer):先用多视角生成模型合成虚拟视角,再用标准重建方法拟合 3D。优势是几何一致性更好,劣势是需要额外的多视角模型训练。

实际上,这两种范式正在融合:最新的工作(如 MVDream、ImageDream)结合了两者的优势,用 SDS 框架但以 Zero123 的视角生成模型作为「评委」。

9. 本节小结

8. 快速检验

Q1. DreamFusion 中,Diffusion 模型的角色是什么?
Q2. SDS(Score Distillation Sampling)的核心思想是什么?
Q3. 为什么 3DGS 比 NeRF 更适合 SDS 框架?
Q4. NeRF/3DGS 与 Diffusion/VAE 最根本的区别是什么?

9. 延伸阅读

如果你想更深入地理解生成式 3D 的发展脉络和工程实现,推荐以下资源:

下一步

模块一(核心原理)到此结束。你已经理解了 NeRF 的隐式表示、3DGS 的显式高斯、以及它们与生成模型的协作关系。下一模块将进入工程实践:L4 将介绍如何用 nerfstudio 训练 NeRF 和 3DGS 模型,L5 将深入调优技巧,L6 将对比两种方法的技术选型。准备好动手了吗?

如有任何概念不清楚,随时向我提问。SDS 是连接 2D 生成与 3D 表示的核心桥梁,而理解 NeRF/3DGS 与 Diffusion/VAE 的本质区别,将帮助你在工程实践中正确选择和使用这些工具——它们是协作关系,不是替代关系。

← L2: Gaussian Splatting 原理 模块一 · 核心原理(完)