§3.1DreamFusion · SDS 开山
DreamFusion— Text-to-3D using 2D Diffusion
完全没有 3D 训练数据,只有一个强大的文生图模型(痛点 a)。
关键想法:提出 Score Distillation Sampling (SDS)——优化一个 NeRF,让它随机视角的渲染图看起来像扩散先验的高概率样本,且不需要反传穿过 U-Net。给渲染图 $x=g(\theta)$ 加噪,问冻结的 $\hat\epsilon_\phi$"往哪改更像文字 $y$":
$$ \nabla_\theta \mathcal{L}_{\text{SDS}} = \mathbb{E}_{t,\epsilon}\!\left[ w(t)\big(\hat\epsilon_\phi(x_t; y, t) - \epsilon\big)\frac{\partial x}{\partial \theta} \right] $$
加的噪声 $\epsilon$ 充当控制变量被减掉,剩下的就是"指向更像文字"的方向。
把 DreamFields 的 CLIP 评委换成扩散评委——信号强得多,但继承了"逐场景优化、几十分钟起步"的代价。
几乎同时,SJC(Score Jacobian Chaining, TTIC, 2212.00774)从"分数场"的视角独立推出了等价物——
把 2D 分数沿渲染 Jacobian 链式传成 3D 分数。两篇一起钉死了这套范式的数学。
SDS 有两个臭名昭著的毛病,下面这个 demo 帮你建立直觉,后面三节都是在修它们:
过饱和/过平滑(要拿可用信号得用巨大的 guidance,把结果推向单一 mode);
Janus 多面(每个视角被一个没有 3D 一致性的 2D 模型独立打分,于是每个角度都想长成正脸)。
Demo 4 · SDS 与 Janus 多面问题
中间是一个 3D 物体的转台视角。独立 2D 先验下,每个视角的梯度(细线)都指向"画一张正脸",
于是背面、侧面也长出了脸——这就是 Janus。
切到 多视图一致先验:只有真正的正面是脸,几何正确。这正是 §3.5 的核心修复。
§3.2loss 修正 · VSD 与它的同伙
SDS 减的是随机噪声 → mode-seeking → 必须用很大的 CFG → 过饱和、过平滑、缺多样性。修法的分水岭是 VSD:
ProlificDreamer / VSD— High-Fidelity and Diverse Text-to-3D via Variational Score Distillation
SDS 把 3D 场景当成一个点估计(等价于巨大 CFG 的 mode-seeking)→ 糊、饱和、缺多样性。
关键想法:Variational Score Distillation (VSD)——把 3D 场景当成一个粒子分布,最小化它与先验的 KL。梯度里减的不再是随机噪声,而是当前渲染分布的学习到的分数 $\epsilon_\varphi$(用一个在线 LoRA 微调的扩散副本估计):
$$ \nabla_\theta \mathcal{L}_{\text{VSD}} = \mathbb{E}_{t,\epsilon,c}\!\left[ \omega(t)\big(\epsilon_{\text{pretrain}}(x_t,t,y) - \epsilon_\varphi(x_t,t,c,y)\big)\frac{\partial g(\theta,c)}{\partial \theta} \right] $$
因为 $\epsilon_\varphi$ 跟踪"场景实际长什么样"(而非纯噪声),VSD 在正常 CFG(~7.5)下就能恢复锐利细节和多样性。SDS = VSD 退化到单粒子的特例。
把"减随机噪声"换成"减一个在线学习的渲染分布分数"——一句话改动,换来锐度和多样性的质变。
同一波 loss-fix 还有一串,思路都是"把 SDS 梯度里那个有害项拆掉或改掉":
NFSD(Noise-Free SD,2310.17590,去掉强迫大 CFG 的噪声项)、
CSD(Classifier SD,2310.19415,发现只留 CFG 隐式分类器项就够)、
HiFA(latent+图像双空间分数 + 时间步退火)、
DreamTime(2306.12422,单调递减的时间步调度:先大 $t$ 定结构、后小 $t$ 补细节)、
Consistent3D / SteinDreamer / ESD(确定性 ODE 目标 / Stein 控制变量降方差 / 补回熵项治 mode collapse)。
§3.3换表示 · 把 SDS 搬上 3D 高斯
loss 修了,还是慢——NeRF 的 SDS 优化要几小时(痛点 d)。突破来自换表示:
DreamGaussian— Generative Gaussian Splatting for Efficient 3D Content Creation
NeRF 的 SDS 优化动辄数小时(痛点 d)。
关键想法:把 SDS 跑在 3D 高斯上——渐进式致密化比 NeRF 的占据剪枝收敛快得多,再抽出 mesh、在 UV 里 refine 纹理。~2 分钟出带纹理网格(~10× 提速)。
表示从 NeRF 换成 3DGS——同一套 SDS,wall-clock 从小时级砍到分钟级。
跟进的一串 text→3DGS:GSGEN(Point-E 3D 先验初始化 + 2D SDS)、
GaussianDreamer(2310.08529,Shap-E 初始化 + 2D SDS,~15 min)、
LucidDreamer(2311.11284,Interval Score Matching (ISM)——用确定性 DDIM 反演轨迹、按区间匹配分数,去掉 SDS 的平滑偏置)。
注意这是个既换表示又修 loss 的混血。
§3.4单图 → 3D · 给 SDS 加一张参考图
把任务从"文字→3D"换成"单图→3D":在参考视角上加重建 loss,新视角上用 SDS 幻想。
RealFusion(2302.10663,textual inversion 把先验锁到该物体)、
Make-It-3D(2303.14184,粗 NeRF → 带纹理点云)、
Magic123(2306.17843,同时用 2D 先验 Stable Diffusion + 3D 先验 Zero-1-to-3,一个旋钮平衡"想象 vs 保真")。
为什么 Magic123 要混两个先验
2D 先验爱过度想象(细节多但乱编几何),3D 先验太保守(几何对但糊)。混合 + 一个权衡旋钮,是单图重建里反复出现的招——它也预告了下一部多视图扩散里"把 3D 一致性烤进先验"的思路。
§3.5治 Janus · 通往多视图扩散
Janus 的病根(Demo 4):每个视角被一个没有 3D 约束的 2D 先验独立打分。三类解药,最后一类最彻底——它直接催生了下一部:
Perp-Neg / Debiased-SDS— 训练无关的 Janus 缓解
不想重训模型,只想压住"背面长正脸"。
关键想法:Perp-Neg 把负向 prompt 的去噪方向投影成与主方向垂直,干净地抹掉串味的"正面"内容;Debiased-SDS 截断异常大的梯度分数 + 用 LM 消解视角 token 与 prompt 的冲突。
都是训练无关的"打补丁"——治标,不改先验本身。
MVDream / ImageDream— Multi-view Diffusion for 3D Generation
Perp-Neg 之流治标不治本——先验本身没有 3D 一致性。
关键想法:把扩散模型微调成一次联合吐 4 张相互一致的视图(4 视图之间做 3D self-attention),再当 SDS 先验用。一致性烤进先验本身,Janus 从结构上被根治。ImageDream 是它的图像条件版。
从"事后打补丁"变成"把 3D 一致性做进先验"——这步直接开启了 Part IV · 多视图扩散。
这一部的谱系,一句话
开山(DreamFusion/SJC)→ 修 loss(VSD/NFSD/CSD/DreamTime)→ 换表示提速(DreamGaussian/GaussianDreamer/ISM)→ 治 Janus(Perp-Neg → MVDream)。
但整条线终究被淘汰:每个资产都要逐一优化几分钟到几小时、几何还很依赖先验。
前馈重建(Part V)和原生 3D 扩散(Part VI)一次前向几秒出活,到 2024 年底基本把逐资产蒸馏挤出了生产线。