[{"data":1,"prerenderedAt":254},["ShallowReactive",2],{"finding:mcmc-3-defects":3,"finding-runs:mcmc-3-defects":229,"finding-related:mcmc-3-defects":230},{"meta":4,"impact":27,"sections":31},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":22,"related_runs":23,"related_findings":25},"mcmc-3-defects","A.2 MCMC 法の完全実装 — 3 設計欠陥の整理 (spec)","Kheradmand et al. NeurIPS 2024 と当 workspace MCMC 実装の乖離を「3 設計欠陥」(点数上限、スケール上限、多項分布スケジュール) として整理し、A.2 の修正項目を確定させる起草 spec。","Spec · A.2 MCMC implementation","2026-05-22","draft","spec","neutral",[14],1,[16,17,18,11,19,20,21],"phase-5","mcmc","sgld","relocation","scale-l1","opacity-l1","A.2",[24],"lego-mcmc-30k",[26],"mcmc-noise-calibration",{"summary":28,"rank":29,"verdict":30},"本実装の MCMC が論文と乖離している 3 箇所 (5% incremental growth 欠如、λ_Σ\u002Fλ_o covariance\u002Fopacity 正則化欠如、relocation が refine prune に便乗) を整理し、A.2 の修正項目と検証条件を確定させた spec。","mid","investigative",[32,35,46,49,71,74,81,83,85,90,97,99,104,106,112,114,118,120,121,124,128,132,134,135,140,142,148,149,153,155,156,158,166,167,173,174,180,181,185,187,208,210,215,217,227],{"type":33,"text":34},"lead","当 workspace の MCMC 実装は \u003Ccode>3dgs-rs\u003C\u002Fcode> 由来の partial 移植で、3 箇所で \u003Ca href=\"https:\u002F\u002Farxiv.org\u002Fabs\u002F2404.09591\">Kheradmand et al. 2024 (NeurIPS)\u003C\u002Fa> と乖離している。本書は乖離を「3 設計欠陥」 — (1) 5% incremental growth 欠如、(2) λ_Σ \u002F λ_o 正則化欠如、(3) relocation が refine prune に便乗 — として整理し、A.2 の修正項目と検証条件を確定させる起草 spec である。",{"type":36,"items":37},"kv",[38,40,43],{"key":39,"value":9},"作成日",{"key":41,"value":42},"参照","Kheradmand et al., \"3D Gaussian Splatting as Markov Chain Monte Carlo\", NeurIPS 2024 (arXiv:2404.09591)",{"key":44,"value":45},"現状","当 workspace の MCMC 実装は 3dgs-rs 由来の partial 移植で 3 箇所で論文と乖離",{"type":47,"text":48},"heading","0. 用語と参照",{"type":50,"columns":51,"align":54,"rows":56},"table",[52,53],"略称","指し示すもの",[55,55],"left",[57,60,63,66,68],[58,59],"本実装","splat\u002Fcrates\u002Fsplat-train-v1\u002F (apply_mcmc_noise + enable_mcmc_respawn)",[61,62],"論文","Kheradmand et al. 2024 (NeurIPS 採択版、arXiv v2)",[64,65],"3DGS classical","Kerbl et al. 2023 (3DGS 原著) の clone \u002F split \u002F prune-by-grad",[19,67],"論文 §3.2 の dead → live への置き換え (本実装 = \"respawn\")",[69,70],"SGLD","Stochastic Gradient Langevin Dynamics",{"type":47,"level":72,"text":73},3,"主要ファイル",{"type":75,"items":76},"list",[77,78,79,80],"\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Fregularize.rs\u003C\u002Fcode> — \u003Ccode>apply_mcmc_noise\u003C\u002Fcode>","\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Frefine.rs\u003C\u002Fcode> — \u003Ccode>enable_mcmc_respawn\u003C\u002Fcode> 経路","\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Fconfig.rs\u003C\u002Fcode> — \u003Ccode>McmcConfig\u003C\u002Fcode>, \u003Ccode>RefineConfig.max_scale_cap\u003C\u002Fcode> 等","\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Ftrain_loop.rs\u003C\u002Fcode> — invocation timing",{"type":47,"text":82},"1. 欠陥 (1) 点数上限 — 5% incremental growth が無い",{"type":47,"level":72,"text":84},"論文の挙動",{"type":86,"label":87,"variant":88,"text":89},"callout","論文 §3.3","info","\"We gradually increase the number of live Gaussians by 5% per iteration until reaching a maximum desired number.\"",{"type":75,"ordered":91,"items":92},true,[93,94,95,96],"初期 splat 数 N₀ (init.ply 由来) から開始","毎 relocation tick (= 100 iter) ごとに \u003Ccode>N_alive ← min(N_alive × 1.05, N_max)\u003C\u002Fcode>","dead splat (o \u003C 0.005) を上記 N_alive まで relocation で復活","N_max は古典 3DGS と同水準 (Lego では ~1M、Mip-NeRF360 では ~5M)",{"type":47,"level":72,"text":98},"本実装の挙動",{"type":75,"items":100},[101,102,103],"\u003Ccode>cfg.trainer.capacity\u003C\u002Fcode> (= N_max) は固定の hard cap (\u003Ccode>Param::with_capacity\u003C\u002Fcode> で確保)","\u003Ccode>enable_mcmc_respawn=true\u003C\u002Fcode> の path は \u003Ccode>refine\u003C\u002Fcode> の prune step に便乗、growth schedule は持たない","初期 N₀ → max は古典 3DGS の clone\u002Fsplit + prune の挙動でのみ増加 (=非 MCMC)",{"type":47,"level":72,"text":105},"修正案 (A.2 で実装)",{"type":75,"items":107},[108,109,110,111],"\u003Ccode>McmcConfig\u003C\u002Fcode> に \u003Ccode>growth_factor: f32\u003C\u002Fcode> (default 1.05) と \u003Ccode>growth_every: u32\u003C\u002Fcode> (default 100) を追加","\u003Ccode>train_loop\u003C\u002Fcode> の relocation tick (新設) で \u003Ccode>N_alive\u003C\u002Fcode> を逐次更新","\u003Ccode>Param.num_splats\u003C\u002Fcode> を「現 active 数」として relocation tick で動的に N_alive まで増やす (slot は capacity まで予約済み)","N_alive 到達後は relocation のみ (新規 spawn 停止、dead → live 置換のみ)",{"type":47,"level":72,"text":113},"検証",{"type":75,"items":115},[116,117],"1000 iter 区切りで \u003Ccode>param.num_splats\u003C\u002Fcode> を log し、5% 等比増加カーブを確認","N_max 到達時点で stop することを assert",{"type":47,"text":119},"2. 欠陥 (2) スケール上限 — λ_Σ covariance 正則化が無い",{"type":47,"level":72,"text":84},{"type":122,"text":123},"paragraph","論文 §3.4 の loss 拡張:",{"type":125,"lang":126,"text":127},"code","text","L_total = (1-λ) · L1 + λ · L_SSIM + λ_Σ · Σᵢ ‖Σᵢ‖_eig_L1 + λ_o · Σᵢ ‖oᵢ‖_L1\n",{"type":75,"items":129},[130,131],"\u003Ccode>‖Σᵢ‖_eig_L1\u003C\u002Fcode> = covariance Σᵢ の固有値 L1 norm (= 3 軸 scale の和)","推奨 hyperparam: \u003Ccode>λ_Σ = 0.01\u003C\u002Fcode>, \u003Ccode>λ_o = 0.01\u003C\u002Fcode> (Deep Blending のみ \u003Ccode>λ_o = 0.001\u003C\u002Fcode>)",{"type":122,"text":133},"この正則化が「巨大 Gaussian」と「opacity が高くも不要な Gaussian」をソフトに退場させる役割。本実装の \u003Ccode>max_scale_cap\u003C\u002Fcode> の hard cap とは別物。",{"type":47,"level":72,"text":98},{"type":75,"items":136},[137,138,139],"\u003Ccode>cfg.refine.max_scale_cap\u003C\u002Fcode> (default 0.0 = off) — hard cap、論文の λ_Σ とは別系統","\u003Ccode>apply_scale_reg\u003C\u002Fcode> (regularize.rs) は \u003Ccode>loss = w · Σᵢ (log_scaleᵢ - μ_axis)²\u003C\u002Fcode> という variance formulation — これは MCMC 論文の eigenvalue L1 とも別物","opacity 正則化は存在しない",{"type":47,"level":72,"text":141},"修正案",{"type":75,"items":143},[144,145,146,147],"\u003Ccode>McmcConfig\u003C\u002Fcode> に \u003Ccode>scale_eigen_l1: f32\u003C\u002Fcode> (default 0.01) と \u003Ccode>opacity_l1: f32\u003C\u002Fcode> (default 0.01) を追加","training step 内で \u003Ccode>scale_grads += scale_eigen_l1 * sign(eig(Σᵢ))\u003C\u002Fcode> (3 軸独立で \u003Ccode>exp(log_scaleᵢ)\u003C\u002Fcode> の L1 サブグラディエント)","training step 内で \u003Ccode>opac_grads += opacity_l1 * sign(sigmoid(raw_opac))\u003C\u002Fcode>","既存 \u003Ccode>apply_scale_reg\u003C\u002Fcode> (variance formulation) と排他にする (両方有効化は禁止、validate でエラー)",{"type":47,"level":72,"text":113},{"type":75,"items":150},[151,152],"λ_Σ=0.01 で 30k iter、final splats の平均 scale が λ_Σ=0 比で 10-20% 減少することを確認","PSNR が brush 比 -3〜-6 dB レンジに留まることを確認 (回帰しないこと)",{"type":47,"text":154},"3. 欠陥 (3) 多項分布スケジュール — relocation が prune に便乗",{"type":47,"level":72,"text":84},{"type":122,"text":157},"論文 §3.2 Algorithm 1:",{"type":75,"ordered":91,"items":159},[160,161,162,163,164,165],"\u003Cstrong>500 iter warmup\u003C\u002Fstrong>: relocation も成長も無効","iter ≥ 500 から \u003Cstrong>毎 100 iter\u003C\u002Fstrong> に relocation を実行","dead set D = { i : oᵢ &lt; 0.005 }, live set L = { i : oᵢ ≥ 0.005 }","L から \u003Cstrong>opacity 重み付き多項分布\u003C\u002Fstrong>でターゲットを N_dead 個サンプル","各ターゲット t に対し dead を 1 つ relocate → 新 cluster (N_t splat)","probability-preserving 公式 (論文 Eq. 9): \u003Ccode>o_new = 1 - (1 - o_old)^(1\u002FN_t)\u003C\u002Fcode>, \u003Ccode>Σ_new\u003C\u002Fcode> も補正",{"type":47,"level":72,"text":98},{"type":75,"items":168},[169,170,171,172],"\u003Ccode>enable_mcmc_respawn = true\u003C\u002Fcode> で \u003Ccode>refine\u003C\u002Fcode> 関数内、\u003Cstrong>prune が発生した時のみ\u003C\u002Fstrong>動作","relocation は古典 prune (低 opacity を消す) の slot 再利用として実装され、独立スケジュールではない","\u003Ccode>iter ≥ refine.start_iter\u003C\u002Fcode> (default 500) かつ \u003Ccode>iter ≤ refine.stop_iter\u003C\u002Fcode> (default 15_000) のみ動作 — stop_iter 以降 relocation が消える","probability-preserving 公式は適用していない (新 opacity = 旧 opacity を継承、要確認)",{"type":47,"level":72,"text":141},{"type":75,"items":175},[176,177,178,179],"relocation を \u003Ccode>refine\u003C\u002Fcode> から分離し、\u003Ccode>train_loop\u003C\u002Fcode> の独立 tick に","\u003Ccode>McmcConfig\u003C\u002Fcode> に \u003Ccode>relocation_every: u32\u003C\u002Fcode> (default 100), \u003Ccode>relocation_start: u32\u003C\u002Fcode> (default 500), \u003Ccode>opacity_threshold: f32\u003C\u002Fcode> (default 0.005)","関数 \u003Ccode>apply_mcmc_relocation(param, ..., rng)\u003C\u002Fcode> を新設: (1) dead \u002F live を opacity threshold で 2 分、(2) live から opacity 重み付き多項分布で N_dead 個サンプリング (with replacement)、(3) 各クラスター t に対し N_t (= dead 配分数) splat の \u003Ccode>o, Σ\u003C\u002Fcode> を probability-preserving に書き換え","既存 \u003Ccode>enable_mcmc_respawn\u003C\u002Fcode> は obsolete、\u003Ccode>McmcConfig.relocation_enable: bool\u003C\u002Fcode> (default false) で置換",{"type":47,"level":72,"text":113},{"type":75,"items":182},[183,184],"30k iter で \u003Ccode>dead_count \u002F step\u003C\u002Fcode> のヒストリを記録、500 iter 以降は 100-tick 毎にゼロに戻ることを確認 (毎 tick で dead → live に置換)","multinomial sampling の cumulative weight が opacity 比 (期待値 = total opacity) と一致することを unit test",{"type":47,"text":186},"4. 完了条件 (A.2 全体)",{"type":50,"columns":188,"align":191,"rows":192},[189,190],"項","完了基準",[55,55],[193,196,199,202,205],[194,195],"欠陥 1 修正","growth_factor=1.05 で N_alive log カーブが指数増加、N_max 到達で stop",[197,198],"欠陥 2 修正","λ_Σ=0.01 で平均 scale 10-20% 減、λ_o=0.01 で active splat 数も追従",[200,201],"欠陥 3 修正","relocation が refine 非依存、500 iter warmup → 100-tick 毎に動作、probability-preserving",[203,204],"Integration","Lego 30k で MCMC モード PSNR が brush 比 -3〜-6 dB レンジ (現状未測定、A.2 完了で測定)",[206,207],"Test","各 unit test (growth schedule \u002F scale_l1 \u002F multinomial) 通過、既存 24 test 維持",{"type":47,"text":209},"5. 想定スコープ外",{"type":75,"items":211},[212,213,214],"f16 packed (A.6 \u002F #feat.G) との交差は今回扱わず — A.2 完了後別タスクで評価","完全な Σ covariance マニピュレーション (rotation 補正含む) は probability-preserving の最小実装に留め、論文の \u003Ccode>Σ_new\u003C\u002Fcode> 公式の完全再現は次フェーズ","Tanks & Temples \u002F 他 real-world シーンでの検証は A.11 へ繰り越し",{"type":47,"text":216},"6. 直接の作業項目 (A.2 実装着手時の TODO)",{"type":75,"ordered":91,"items":218},[219,220,221,222,223,224,225,226],"\u003Ccode>McmcConfig\u003C\u002Fcode> 拡張 (\u003Ccode>growth_factor\u003C\u002Fcode>, \u003Ccode>growth_every\u003C\u002Fcode>, \u003Ccode>scale_eigen_l1\u003C\u002Fcode>, \u003Ccode>opacity_l1\u003C\u002Fcode>, \u003Ccode>relocation_every\u003C\u002Fcode>, \u003Ccode>relocation_start\u003C\u002Fcode>, \u003Ccode>opacity_threshold\u003C\u002Fcode>)","\u003Ccode>regularize.rs::apply_mcmc_noise\u003C\u002Fcode> の coef を論文 SGLD 式に揃える (現状 \u003Ccode>(1-σ(o))^150\u003C\u002Fcode> → \u003Ccode>σ(-100·(o-0.995))\u003C\u002Fcode>)","\u003Ccode>regularize.rs::apply_mcmc_scale_l1\u003C\u002Fcode> + \u003Ccode>apply_mcmc_opacity_l1\u003C\u002Fcode> を新設","\u003Ccode>relocate.rs\u003C\u002Fcode> (新規 module) で \u003Ccode>apply_mcmc_relocation\u003C\u002Fcode> を実装","\u003Ccode>train_loop.rs\u003C\u002Fcode> で relocation tick を main loop に組み込み","\u003Ccode>refine.rs::enable_mcmc_respawn\u003C\u002Fcode> 経路は obsolete マーク、validate で deprecation 警告","Lego 30k smoke で動作確認、続いて Lego 30k MCMC full run","結果を \u003Ccode>splat-summary\u003C\u002Fcode> で HTML 化、\u003Ccode>runs\u002Findex.html\u003C\u002Fcode> に並べる",{"type":122,"text":228},"参照: [[autonomous-plan-a-b]] \u002F [[research_direction]]",[],[231],{"id":26,"title":232,"date":233,"status":234,"polarity":235,"category":236,"axes":237,"tags":238,"task_code":22,"related_runs":244,"delta_psnr":250,"delta_wallclock":-1,"rank":251,"verdict":30,"impact_summary":252,"detail_path":253},"A.2 MCMC 検証で発覚した noise gate 不整合と L1 全滅 segfault","2026-05-23","stable","negative","experiment",[14],[16,17,239,240,241,242,243],"sgld-noise","calibration","regression","smoke","segfault",[24,245,246,247,248,249],"mcmc-l1-only-smoke","mcmc-noise-sh3-smoke","mcmc-combo-iter-bisect","mcmc-combo-500","mcmc-l1-500","2.5 dB (sh=3 + 全部入り、50 iter で発散)","high","SGLD gate を paper 式に揃えた結果 mean_noise_weight が ~50-150x スケールズレし、calibration 補正 (5e5→5e3) でも iter 240 前後で SIGSEGV。Bisect smoke で真因が L1 全滅 → refine prune → 空 buffer crash というアルゴリズム順序問題と判明。Calibration ≠ correctness。","\u002Ffindings\u002Fmcmc-noise-calibration\u002F",1782449788628]