静态缓存页面 · 查看动态版本 · 登录
智柴网 登录 | 注册
← 返回话题
✨步子哥 @steper · 2026-09-19 02:55

一套高斯,N种画质:Matryoshka Gaussian Splatting 如何让 3D 场景"套娃"起来

你站在巴塞罗那的圣家堂前,掏出手机想拍个 360 度全景。手机摄像头扫一圈,几百万张照片被送进一个 3D 重建管线,最后吐出一个"3D 高斯泼溅"(3D Gaussian Splatting, 3DGS)模型——几百万个小高斯椭球,每个带着位置、协方差、颜色、不透明度,渲染时像点彩画一样叠加成照片级画面。

问题来了:你的手机 GPU 能跑得动几百万个高斯,但你手腕上的 AR 眼镜呢?车机呢?网页浏览器呢?

传统答案是"做几个版本"——高精度版给工作站,中精度版给手机,低精度版给眼镜。每个版本独立训练,存三份模型,切换时还会"啪"地闪一下。这就是离散层级(discrete Level of Detail, LoD):像楼梯,每级之间是断的。

剑桥大学、Chalmers 理工和 Google 的团队觉得这不优雅。他们提出了 Matryoshka Gaussian Splatting(MGS)——名字来自俄罗斯套娃。一套高斯,从第一个到最后一个,任意位置切一刀,前 k 个高斯都能渲染出一张完整、连贯、画质随 k 平滑提升的画面

一、3DGS 的"无序之痛"

要理解 MGS 解决了什么问题,先得理解 3DGS 的"无序之痛"。

3DGS 用 N 个各向异性高斯椭球来表示一个场景,渲染时按深度排序做 alpha 合成。理论上,渲染成本和 N 成正比——去掉一半高斯,渲染就快一倍。听起来天然支持"按预算渲染"。

但问题是:传统训练出来的 3DGS 模型,高斯之间没有顺序。哪个该留哪个该删?没人知道。你随机去掉一半,画面直接崩——因为剩下的可能全是不重要的"装饰高斯",关键结构被删掉了。

现有的解决方案有三种,每种都有硬伤:

  • 离散 LoD(H3DGS、Octree-GS、MaskGaussian、FlexGaussian):建层级结构,暴露 3-9 个质量档位。档位之间跳变明显,且每个档位独立训练,全局不连贯。
  • 压缩/剪枝:按重要性剪枝,但每个预算点独立获取,子集之间不嵌套。
  • 连续 LoD(CLoD-GS、CLoD-3DGS):支持任意预算,但全容量画质会掉——为了适配低预算,模型被迫牺牲峰值表现。LoD 成了一个"昂贵的设计选择"。
MGS 想同时解决两个问题:连续可控的预算 + 不牺牲全容量画质

二、Matryoshka 的核心直觉:嵌套前缀

MGS 的核心想法极其简洁:给所有高斯排个序,让前 k 个高斯在任意 k 值下都构成一个"完整场景的低精度版本"

这就像俄罗斯套娃:最大的娃娃里面套着次大的,次大的里面套着更小的……每一层都是"一个完整的娃娃",只是精度不同。对应到高斯:

  • 第 1 个高斯:最关键的那个,可能代表场景中最显眼的物体轮廓
  • 前 10 个:能看出大致结构
  • 前 1000 个:能认出物体
  • 前 100 万个:照片级画质
渲染时只需截取前 k 个高斯,k 越大画质越高,k 越小速度越快。从同一个模型里"截断"出任意预算的版本,无需重新训练,无需切换模型,无需辅助数据结构。

这个想法的灵感来自 Matryoshka Representation Learning(MRL)——Kusupati 等人 2022 年提出的一种嵌套嵌入方法。MRL 让一个 embedding 的前 d 维在任意 d 值下都可用,原来是用在检索和分类里的,MGS 把这个原则搬到了 3D 场景原语上。

三、随机预算训练:两遍前向,搞定一切

要让一套高斯满足"任意前缀都好看"这个约束,最朴素的想法是:每个训练步遍历所有可能的 k,对每个 k 都渲染+反传一次。但 N 可能是几百万,这意味着每步几百万次前向——完全不可行。

MGS 的解法叫 Stochastic Budget Training(随机预算训练),简单得令人发指:

每个训练步: 1. 从均匀分布 r ~ Unif(r_min, 1) 中采样一个比例 2. 计算对应的前缀大小 k = ⌈r·N⌉ 3. 渲染前缀 G_≤k,计算 loss ℓ(G_≤k, I, c) 4. 渲染完整集合 G_≤N,计算 loss ℓ(G_≤N, I, c) 5. 反传两者之和:ℓ_MGS = ℓ(G_≤k) + γ·ℓ(G_≤N)

每步只有两次前向渲染,和标准 3DGS 训练成本几乎相同。但通过随机采样,训练过程中覆盖了从 r_min·N 到 N 的整个预算范围,每个预算都被均匀访问到。

这里有个关键设计:动态重排序。每次梯度更新后,高斯的参数变了,不透明度也变了,所以排序也要重新算。论文用 opacity(不透明度)降序作为重要性分数——不透明度高的高斯代表"可见且对画面贡献大"的原语,应该排在前面。每步训练后重新按当前 opacity 排序,保证前缀始终包含"当前最重要"的高斯。

这个设计有一个深层含义:重要性不是预设的,而是训练过程中涌现的。模型自己学会"哪些高斯该重要",通过 opacity 这个可微的代理指标。

四、实验:四项 benchmark,六位对手,一面倒

论文在四个标准 3DGS benchmark 上评测:MipNeRF 360、Tanks & Temples、Deep Blending、BungeeNeRF,对比六个 baseline——四个离散 LoD(H3DGS、Octree-GS、MaskGaussian、FlexGaussian)和两个连续 LoD(CLoD-GS、CLoD-3DGS)。

全容量画质:不降反升

最让人意外的结果是:MGS 在全容量下的画质,和专门为全容量训练的 3DGS-MCMC 几乎一样,甚至在某些场景上更好。

  • MipNeRF 360:MGS 28.20 dB vs 3DGS-MCMC 28.40 dB(差 0.20 dB)
  • Deep Blending:MGS 28.41 dB vs 3DGS-MCMC 27.63 dB(MGS 反超 0.78 dB
  • BungeeNeRF:MGS 27.13 dB vs 3DGS-MCMC 27.04 dB(MGS 反超 0.09 dB
这意味着随机预算训练不仅没牺牲峰值画质,反而起到了正则化作用。论文对此的解释是:强制模型在低预算下也能重建,迫使它学到更本质的场景结构,而不是靠堆高斯去拟合细节。这和"dropout 作为正则化"的机制异曲同工——强迫模型在信息缺失的情况下也能工作,反而让它在信息完整时表现更好

连续 Pareto 前沿:碾压式优势

论文定义了两个 AUC 指标来衡量"质量-速度"和"质量-数量"的权衡:

  • AUC_fps:质量 vs FPS 曲线下的面积
  • AUC_splats:质量 vs 高斯数量曲线下的面积
MGS 在四个 benchmark 上的 AUC 全面领先。以 MipNeRF 360 为例:
  • AUC_fps:MGS 64.81,CLoD-3DGS 46.38,Octree-GS 21.61
  • AUC_splats:MGS 77.79,Octree-GS 68.43,CLoD-3DGS 56.56
差距巨大。原因在于 MGS 在 5%-10% 这种极端低预算下仍能保持 21-28 dB 的 PSNR,而 CLoD-3DGS 和 CLoD-GS 在这个区间直接崩到 11-17 dB——画面已经不可用了。

画质降级曲线:优雅 vs 断崖

MGS 最具说服力的证据是画质降级曲线。当你从 100% 高斯逐步砍到 5%,MGS 的画质是平滑下降的,而 baseline 们是断崖式下跌的。

这意味着什么?在实际部署中,当系统检测到 GPU 负载高、需要降画质保帧率时,MGS 可以平滑地调低 k 值,用户几乎感知不到画质变化。而 baseline 要么在离散档位之间"啪"地切换(可见的 pop-in/pop-out 伪影),要么在某个阈值后画质突然崩盘。

五、消融实验:为什么是 opacity 降序?

论文做了详尽的消融实验,回答了几个关键问题:

1. 重要性分数选什么?

对比了 7 种排序策略:opacity 降序/升序、color variance 降序/升序、SH energy 降序/升序、volume 降序/升序,以及两种固定插入顺序(append/prepend)。

opacity 降序完胜。在 10% 预算下,opacity 降序达到 22.2 dB PSNR @ 493 FPS,次优的 SH energy 降序只有 17.6 dB。升序排序全部拉胯——这符合直觉,把最不重要的高斯放在前面,前缀就废了。

opacity 为什么是最好的重要性指标?因为 alpha 合成中,不透明度直接决定一个高斯对最终画面的贡献。opacity 高的高斯是"看得见、挡得住后面"的关键原语,把它们放在前缀里,能最大程度保留场景主体结构。

2. 训练目标怎么设计?

对比了三种:

  • Prefix + Full(MGS 默认):同时优化随机前缀和完整集合
  • Prefix only:只优化随机前缀
  • MRL-style:按 MRL 原始论文的方式分层优化
结果:Prefix + Full 最好,Prefix only 在全容量画质上掉 0.46 dB。完整集合 loss 是"锚点"——它防止模型为了适配低预算而牺牲峰值表现。这个 γ 权重论文也做了消融,发现 γ=1(等权)是个好的默认值,prefix-heavy 会牺牲峰值,full-heavy 会牺牲低预算表现。

3. 失败案例:MGS 不是万能的

论文诚实地报告了一个失败案例:在 Deep Blending 的 DrJohnson 场景上,CLoD-3DGS 在 100% 预算下比 MGS 高 1.4 dB(29.1 vs 27.7)。但即使在失败案例中,MGS 在 5%-30% 低预算下仍然优于 CLoD-3DGS——降级更优雅

这说明 MGS 的"全容量不降反升"不是绝对的,某些场景下专门为全容量训练的模型可能更强。但 MGS 的优势在于全预算范围的鲁棒性,而不是单点峰值。

六、MGS 的深层启示

这篇论文表面是个 3DGS 加速方法,实际上提出了几个值得整个神经渲染领域深思的问题。

1. "嵌套表示"作为通用范式

MRL 在嵌入空间证明了嵌套表示可行,MGS 把它搬到了场景原语上。嵌套表示的本质是:一个表示的任意前缀都是独立可用的。这个原则可能适用于更多场景:

  • 神经辐射场(NeRF)的 MLP 权重能否嵌套?
  • 三角网格的顶点能否按重要性排序,前 k 个顶点构成低精度网格?
  • 视频压缩的帧序列能否嵌套,前 k 帧就是低帧率版本?

2. "随机预算"作为正则化

MGS 最反直觉的发现是:强迫模型在低预算下也能工作,反而让它在全预算下表现更好。这和 dropout、data augmentation、stochastic depth 的精神一脉相承——通过随机剥夺信息,迫使模型学到更鲁棒的表示

但 MGS 的版本更优雅:它剥夺的不是"特征"或"层",而是"表示容量"。模型被迫在"只有 1% 高斯"的极端条件下也能重建场景,这迫使它学会"什么是真正重要的"。

3. "连续 vs 离散"的范式选择

LoD 领域长期有"离散 vs 连续"之争。离散派说:离散档位够用,实现简单。连续派说:真实世界的预算是连续变化的,离散档位会有跳变。

MGS 给连续派加了一票:如果连续 LoD 不牺牲全容量画质,且实现成本和离散一样低(两次前向),那离散 LoD 就没有理由存在了。论文的 AUC 数据显示,MGS 在所有四个 benchmark 上都碾压所有离散 baseline,且实现只需要改训练 loss,不需要改架构。

4. "代理目标陷阱"的反例

在 AI 领域,我们经常看到"优化代理目标反而损害真实目标"的案例。MGS 是个反例:优化"低预算表现"这个代理目标,反而提升了"全容量表现"这个真实目标。这说明代理目标和真实目标不总是冲突的——选对了代理目标,它可以和真实目标协同。

关键在于"低预算表现"是不是一个好的代理目标。如果代理目标是"在 benchmark 上刷分",那它和真实目标"鲁棒性"可能冲突。但如果代理目标是"在信息缺失下也能工作",那它和真实目标"学到本质结构"天然对齐。

5. "已经解决好的问题通常没解决好"再添一例

3DGS 的 LoD 问题被很多人当作"已经解决了"——不就是建个层级嘛。但 MGS 揭示:现有方案要么牺牲画质,要么档位粗糙,要么实现复杂。真正优雅的解决方案(嵌套前缀 + 随机预算训练)直到 2026 年才出现。这和 Tokeniser 2×2 实验的结论同构:被当作"已解决"的问题,往往只是被"绕过去了",真正被忽视的维度可能比主维度更重要。

七、结语:从"多版本"到"一套通用"

MGS 的意义不在于提出一个新模型,而在于改变了 3D 内容分发的范式。过去你要为不同设备准备不同版本的 3D 模型,现在你只需要一个 MGS 模型,每个设备按自己的预算截取前 k 个高斯即可。

这和 WebP 的"渐进式解码"精神一致——一张图片从上到下逐步加载,先模糊后清晰。MGS 让 3D 场景也能这样:先传前 1% 的高斯给你一个模糊预览,再逐步传更多高斯让画面清晰起来。对网络传输、流式渲染、AR/VR 都有直接价值。

论文最后说,未来会探索更复杂的重要性分数(比如学习出来的)和动态预算分配(比如按视角调整 k)。但我认为更紧迫的方向是把 MGS 纳入标准 3DGS 训练流程——既然它不牺牲画质、不增加成本、还提供连续 LoD,那有什么理由不用呢?

也许下次你站在圣家堂前拍全景时,背后跑的就是 MGS——一套高斯,N 种画质,从你的 AR 眼镜到工作站,同一个模型,各取所需。

---

论文信息:Matryoshka Gaussian Splatting, Zhilin Guo et al., arXiv: 2603.19234 代码开源:https://github.com/ZhilinGuo/matryoshka-gaussian-splatting 项目主页:https://ZhilinGuo.github.io/MGS

暂无表态