松田研究室
FindingID: mcmc-3-defects
Status: draft / task A.2
← Findings Index
Spec · A.2 MCMC implementation

A.2 MCMC 法の完全実装 — 3 設計欠陥の整理 (spec)

Kheradmand et al. NeurIPS 2024 と当 workspace MCMC 実装の乖離を「3 設計欠陥」(点数上限、スケール上限、多項分布スケジュール) として整理し、A.2 の修正項目を確定させる起草 spec。

neutralrank: midinvestigative第 1 軸phase-5mcmcsgldspecrelocationscale-l1opacity-l1
Impact
本実装の MCMC が論文と乖離している 3 箇所 (5% incremental growth 欠如、λ_Σ/λ_o covariance/opacity 正則化欠如、relocation が refine prune に便乗) を整理し、A.2 の修正項目と検証条件を確定させた spec。
01

本文

当 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 である。

作成日
2026-05-22
参照
Kheradmand et al., "3D Gaussian Splatting as Markov Chain Monte Carlo", NeurIPS 2024 (arXiv:2404.09591)
現状
当 workspace の MCMC 実装は 3dgs-rs 由来の partial 移植で 3 箇所で論文と乖離

0. 用語と参照

略称指し示すもの
本実装splat/crates/splat-train-v1/ (apply_mcmc_noise + enable_mcmc_respawn)
論文Kheradmand et al. 2024 (NeurIPS 採択版、arXiv v2)
3DGS classicalKerbl et al. 2023 (3DGS 原著) の clone / split / prune-by-grad
relocation論文 §3.2 の dead → live への置き換え (本実装 = "respawn")
SGLDStochastic Gradient Langevin Dynamics

主要ファイル

  • splat/crates/splat-train-v1/src/regularize.rsapply_mcmc_noise
  • splat/crates/splat-train-v1/src/refine.rsenable_mcmc_respawn 経路
  • splat/crates/splat-train-v1/src/config.rsMcmcConfig, RefineConfig.max_scale_cap
  • splat/crates/splat-train-v1/src/train_loop.rs — invocation timing

1. 欠陥 (1) 点数上限 — 5% incremental growth が無い

論文の挙動

論文 §3.3

"We gradually increase the number of live Gaussians by 5% per iteration until reaching a maximum desired number."

  1. 初期 splat 数 N₀ (init.ply 由来) から開始
  2. 毎 relocation tick (= 100 iter) ごとに N_alive ← min(N_alive × 1.05, N_max)
  3. dead splat (o < 0.005) を上記 N_alive まで relocation で復活
  4. N_max は古典 3DGS と同水準 (Lego では ~1M、Mip-NeRF360 では ~5M)

本実装の挙動

  • cfg.trainer.capacity (= N_max) は固定の hard cap (Param::with_capacity で確保)
  • enable_mcmc_respawn=true の path は refine の prune step に便乗、growth schedule は持たない
  • 初期 N₀ → max は古典 3DGS の clone/split + prune の挙動でのみ増加 (=非 MCMC)

修正案 (A.2 で実装)

  • McmcConfiggrowth_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 まで予約済み)
  • N_alive 到達後は relocation のみ (新規 spawn 停止、dead → live 置換のみ)

検証

  • 1000 iter 区切りで param.num_splats を log し、5% 等比増加カーブを確認
  • N_max 到達時点で stop することを assert

2. 欠陥 (2) スケール上限 — λ_Σ covariance 正則化が無い

論文の挙動

論文 §3.4 の loss 拡張:

L_total = (1-λ) · L1 + λ · L_SSIM + λ_Σ · Σᵢ ‖Σᵢ‖_eig_L1 + λ_o · Σᵢ ‖oᵢ‖_L1
  • ‖Σᵢ‖_eig_L1 = covariance Σᵢ の固有値 L1 norm (= 3 軸 scale の和)
  • 推奨 hyperparam: λ_Σ = 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 とも別物
  • opacity 正則化は存在しない

修正案

  • McmcConfigscale_eigen_l1: f32 (default 0.01) と opacity_l1: f32 (default 0.01) を追加
  • training step 内で scale_grads += scale_eigen_l1 * sign(eig(Σᵢ)) (3 軸独立で exp(log_scaleᵢ) の L1 サブグラディエント)
  • training step 内で opac_grads += opacity_l1 * sign(sigmoid(raw_opac))
  • 既存 apply_scale_reg (variance formulation) と排他にする (両方有効化は禁止、validate でエラー)

検証

  • λ_Σ=0.01 で 30k iter、final splats の平均 scale が λ_Σ=0 比で 10-20% 減少することを確認
  • PSNR が brush 比 -3〜-6 dB レンジに留まることを確認 (回帰しないこと)

3. 欠陥 (3) 多項分布スケジュール — relocation が prune に便乗

論文の挙動

論文 §3.2 Algorithm 1:

  1. 500 iter warmup: relocation も成長も無効
  2. iter ≥ 500 から 毎 100 iter に relocation を実行
  3. dead set D = { i : oᵢ < 0.005 }, live set L = { i : oᵢ ≥ 0.005 }
  4. L から opacity 重み付き多項分布でターゲットを N_dead 個サンプル
  5. 各ターゲット t に対し dead を 1 つ relocate → 新 cluster (N_t splat)
  6. probability-preserving 公式 (論文 Eq. 9): o_new = 1 - (1 - o_old)^(1/N_t), Σ_new も補正

本実装の挙動

  • enable_mcmc_respawn = truerefine 関数内、prune が発生した時のみ動作
  • relocation は古典 prune (低 opacity を消す) の slot 再利用として実装され、独立スケジュールではない
  • iter ≥ refine.start_iter (default 500) かつ iter ≤ refine.stop_iter (default 15_000) のみ動作 — stop_iter 以降 relocation が消える
  • probability-preserving 公式は適用していない (新 opacity = 旧 opacity を継承、要確認)

修正案

  • relocation を refine から分離し、train_loop の独立 tick に
  • McmcConfigrelocation_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) で置換

検証

  • 30k iter で dead_count / step のヒストリを記録、500 iter 以降は 100-tick 毎にゼロに戻ることを確認 (毎 tick で dead → live に置換)
  • multinomial sampling の cumulative weight が opacity 比 (期待値 = total opacity) と一致することを unit test

4. 完了条件 (A.2 全体)

完了基準
欠陥 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
IntegrationLego 30k で MCMC モード PSNR が brush 比 -3〜-6 dB レンジ (現状未測定、A.2 完了で測定)
Test各 unit test (growth schedule / scale_l1 / multinomial) 通過、既存 24 test 維持

5. 想定スコープ外

  • f16 packed (A.6 / #feat.G) との交差は今回扱わず — A.2 完了後別タスクで評価
  • 完全な Σ covariance マニピュレーション (rotation 補正含む) は probability-preserving の最小実装に留め、論文の Σ_new 公式の完全再現は次フェーズ
  • Tanks & Temples / 他 real-world シーンでの検証は A.11 へ繰り越し

6. 直接の作業項目 (A.2 実装着手時の TODO)

  1. McmcConfig 拡張 (growth_factor, growth_every, scale_eigen_l1, opacity_l1, relocation_every, relocation_start, opacity_threshold)
  2. regularize.rs::apply_mcmc_noise の coef を論文 SGLD 式に揃える (現状 (1-σ(o))^150σ(-100·(o-0.995)))
  3. regularize.rs::apply_mcmc_scale_l1 + apply_mcmc_opacity_l1 を新設
  4. relocate.rs (新規 module) で apply_mcmc_relocation を実装
  5. train_loop.rs で relocation tick を main loop に組み込み
  6. refine.rs::enable_mcmc_respawn 経路は obsolete マーク、validate で deprecation 警告
  7. Lego 30k smoke で動作確認、続いて Lego 30k MCMC full run
  8. 結果を splat-summary で HTML 化、runs/index.html に並べる

参照: [[autonomous-plan-a-b]] / [[research_direction]]

03

関連 finding

© 2026 大竹律輝 — 松田研究室