Kheradmand et al. NeurIPS 2024 と当 workspace MCMC 実装の乖離を「3 設計欠陥」(点数上限、スケール上限、多項分布スケジュール) として整理し、A.2 の修正項目を確定させる起草 spec。
当 workspace の MCMC 実装は 3dgs-rs 由来の partial 移植で、3 箇所で Kheradmand et al. 2024 (NeurIPS) と乖離している。本書は乖離を「3 設計欠陥」 — (1) 5% incremental growth 欠如、(2) λ_Σ / λ_o 正則化欠如、(3) relocation が refine prune に便乗 — として整理し、A.2 の修正項目と検証条件を確定させる起草 spec である。
| 略称 | 指し示すもの |
|---|---|
| 本実装 | splat/crates/splat-train-v1/ (apply_mcmc_noise + enable_mcmc_respawn) |
| 論文 | Kheradmand et al. 2024 (NeurIPS 採択版、arXiv v2) |
| 3DGS classical | Kerbl et al. 2023 (3DGS 原著) の clone / split / prune-by-grad |
| relocation | 論文 §3.2 の dead → live への置き換え (本実装 = "respawn") |
| SGLD | Stochastic Gradient Langevin Dynamics |
splat/crates/splat-train-v1/src/regularize.rs — apply_mcmc_noisesplat/crates/splat-train-v1/src/refine.rs — enable_mcmc_respawn 経路splat/crates/splat-train-v1/src/config.rs — McmcConfig, RefineConfig.max_scale_cap 等splat/crates/splat-train-v1/src/train_loop.rs — invocation timing"We gradually increase the number of live Gaussians by 5% per iteration until reaching a maximum desired number."
N_alive ← min(N_alive × 1.05, N_max)cfg.trainer.capacity (= N_max) は固定の hard cap (Param::with_capacity で確保)enable_mcmc_respawn=true の path は refine の prune step に便乗、growth schedule は持たないMcmcConfig に growth_factor: f32 (default 1.05) と growth_every: u32 (default 100) を追加train_loop の relocation tick (新設) で N_alive を逐次更新Param.num_splats を「現 active 数」として relocation tick で動的に N_alive まで増やす (slot は capacity まで予約済み)param.num_splats を log し、5% 等比増加カーブを確認論文 §3.4 の loss 拡張:
L_total = (1-λ) · L1 + λ · L_SSIM + λ_Σ · Σᵢ ‖Σᵢ‖_eig_L1 + λ_o · Σᵢ ‖oᵢ‖_L1
‖Σᵢ‖_eig_L1 = covariance Σᵢ の固有値 L1 norm (= 3 軸 scale の和)λ_Σ = 0.01, λ_o = 0.01 (Deep Blending のみ λ_o = 0.001)この正則化が「巨大 Gaussian」と「opacity が高くも不要な Gaussian」をソフトに退場させる役割。本実装の max_scale_cap の hard cap とは別物。
cfg.refine.max_scale_cap (default 0.0 = off) — hard cap、論文の λ_Σ とは別系統apply_scale_reg (regularize.rs) は loss = w · Σᵢ (log_scaleᵢ - μ_axis)² という variance formulation — これは MCMC 論文の eigenvalue L1 とも別物McmcConfig に scale_eigen_l1: f32 (default 0.01) と opacity_l1: f32 (default 0.01) を追加scale_grads += scale_eigen_l1 * sign(eig(Σᵢ)) (3 軸独立で exp(log_scaleᵢ) の L1 サブグラディエント)opac_grads += opacity_l1 * sign(sigmoid(raw_opac))apply_scale_reg (variance formulation) と排他にする (両方有効化は禁止、validate でエラー)論文 §3.2 Algorithm 1:
o_new = 1 - (1 - o_old)^(1/N_t), Σ_new も補正enable_mcmc_respawn = true で refine 関数内、prune が発生した時のみ動作iter ≥ refine.start_iter (default 500) かつ iter ≤ refine.stop_iter (default 15_000) のみ動作 — stop_iter 以降 relocation が消えるrefine から分離し、train_loop の独立 tick にMcmcConfig に relocation_every: u32 (default 100), relocation_start: u32 (default 500), opacity_threshold: f32 (default 0.005)apply_mcmc_relocation(param, ..., rng) を新設: (1) dead / live を opacity threshold で 2 分、(2) live から opacity 重み付き多項分布で N_dead 個サンプリング (with replacement)、(3) 各クラスター t に対し N_t (= dead 配分数) splat の o, Σ を probability-preserving に書き換えenable_mcmc_respawn は obsolete、McmcConfig.relocation_enable: bool (default false) で置換dead_count / step のヒストリを記録、500 iter 以降は 100-tick 毎にゼロに戻ることを確認 (毎 tick で dead → live に置換)| 項 | 完了基準 |
|---|---|
| 欠陥 1 修正 | growth_factor=1.05 で N_alive log カーブが指数増加、N_max 到達で stop |
| 欠陥 2 修正 | λ_Σ=0.01 で平均 scale 10-20% 減、λ_o=0.01 で active splat 数も追従 |
| 欠陥 3 修正 | relocation が refine 非依存、500 iter warmup → 100-tick 毎に動作、probability-preserving |
| Integration | Lego 30k で MCMC モード PSNR が brush 比 -3〜-6 dB レンジ (現状未測定、A.2 完了で測定) |
| Test | 各 unit test (growth schedule / scale_l1 / multinomial) 通過、既存 24 test 維持 |
Σ_new 公式の完全再現は次フェーズMcmcConfig 拡張 (growth_factor, growth_every, scale_eigen_l1, opacity_l1, relocation_every, relocation_start, opacity_threshold)regularize.rs::apply_mcmc_noise の coef を論文 SGLD 式に揃える (現状 (1-σ(o))^150 → σ(-100·(o-0.995)))regularize.rs::apply_mcmc_scale_l1 + apply_mcmc_opacity_l1 を新設relocate.rs (新規 module) で apply_mcmc_relocation を実装train_loop.rs で relocation tick を main loop に組み込みrefine.rs::enable_mcmc_respawn 経路は obsolete マーク、validate で deprecation 警告splat-summary で HTML 化、runs/index.html に並べる参照: [[autonomous-plan-a-b]] / [[research_direction]]