[{"data":1,"prerenderedAt":268},["ShallowReactive",2],{"finding:mcmc-noise-calibration":3,"finding-runs:mcmc-noise-calibration":225,"finding-related:mcmc-noise-calibration":251},{"meta":4,"impact":33,"sections":40},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":23,"related_runs":24,"related_findings":31},"mcmc-noise-calibration","A.2 MCMC 検証で発覚した noise gate 不整合と L1 全滅 segfault","SGLD gate を paper 流に書き換えたら mean_noise_weight が ~50x ズレ、calibration を直しても iter 240\u002F500 で SIGSEGV。Bisect smoke で真の root cause は『L1 regularizer が opacity を 0 まで shrink → refine prune が全 splat を削除 → 空 buffer で SIGSEGV』と判明。","Negative finding · MCMC calibration \u002F L1 全滅","2026-05-23","stable","experiment","negative",[14],1,[16,17,18,19,20,21,22],"phase-5","mcmc","sgld-noise","calibration","regression","smoke","segfault","A.2",[25,26,27,28,29,30],"lego-mcmc-30k","mcmc-l1-only-smoke","mcmc-noise-sh3-smoke","mcmc-combo-iter-bisect","mcmc-combo-500","mcmc-l1-500",[32],"mcmc-3-defects",{"summary":34,"rank":35,"verdict":36,"delta_psnr":37,"delta_loss":38,"delta_splats":39},"SGLD gate を paper 式に揃えた結果 mean_noise_weight が ~50-150x スケールズレし、calibration 補正 (5e5→5e3) でも iter 240 前後で SIGSEGV。Bisect smoke で真因が L1 全滅 → refine prune → 空 buffer crash というアルゴリズム順序問題と判明。Calibration ≠ correctness。","high","investigative","2.5 dB (sh=3 + 全部入り、50 iter で発散)","0.34 → 0.91 (発散)","500 iter で 0 まで shrink",[41,44,62,65,73,75,78,82,84,114,116,118,121,123,125,128,130,132,134,136,138,140,145,147,154,156,158,160,162,189,191,196,198,200,202,208,210,212,217,219],{"type":42,"text":43},"lead","A.2 part 1 で \u003Ccode>apply_mcmc_noise\u003C\u002Fcode> の SGLD gate を paper 流 \u003Ccode>σ(-k(o-t))\u003C\u002Fcode> に書き換えたところ、\u003Ccode>mean_noise_weight = 5e5\u003C\u002Fcode> が旧 gate 前提のチューニング値だったため有効 noise が ~50-150 倍に膨張し loss 発散 → kernel segfault。Calibration を 1\u002F100 にしても iter ~240 で同じ SIGSEGV。Bisect smoke 4 件で真の root cause は \u003Cstrong>L1 regularizer (opacity_l1 + scale_eigen_l1) が opacity を 0 まで shrink → refine prune が全 splat を削除 → 空 buffer で次 forward kernel が SIGSEGV\u003C\u002Fstrong>、というアルゴリズム順序問題と判明した。",{"type":45,"items":46},"kv",[47,50,53,56,59],{"key":48,"value":49},"発生日","2026-05-22 23:50 JST",{"key":51,"value":52},"発見","A.2 実装直後の lego-mcmc-30k 30k full run が iter 1 直後に segfault",{"key":54,"value":55},"原因 (初期診断)","SGLD gate 変更と mean_noise_weight 値の不整合 (calibration ズレ)",{"key":57,"value":58},"原因 (真因)","L1 が opacity を 0 まで shrink → refine prune が全 splat 削除 → 空 buffer SIGSEGV",{"key":60,"value":61},"状態","実装は正しい、アルゴリズム順序とハイパパラ両方要調整。コードレベルの bug は無し。",{"type":63,"text":64},"heading","観測",{"type":66,"ordered":67,"items":68},"list",true,[69,70,71,72],"\u003Cstrong>lego-mcmc-30k\u003C\u002Fstrong> (paper §3 全部入り、\u003Ccode>mean_noise_weight = 5e5\u003C\u002Fcode>) を 30k full で実行 → iter 1 直後に Metal kernel が segfault (loss 発散 → NaN → kernel crash と推定)","smoke 切り分け: \u003Ccode>mean_noise_weight=5e5\u003C\u002Fcode> のみ (scale_l1 \u002F opacity_l1 OFF) で 100 iter 完走、loss は ~0.21 で安定 (sh=0)","\u003Ccode>scale_eigen_l1=0.01\u003C\u002Fcode> のみ: 100 iter 完走、loss は ~0.28 で安定 (sh=0)","\u003Cstrong>3 つ全部入り + sh=3 + capacity=1M\u003C\u002Fstrong>: 50 iter で loss が 0.34 → 0.70 に発散、PSNR 2.5 dB (catastrophic)。30k 走らせれば segfault に至る (splats が NaN → kernel 範囲外 read)",{"type":63,"text":74},"原因解析 (初期診断: gate factor 変更)",{"type":76,"text":77},"paragraph","A.2 part 1 で \u003Ccode>apply_mcmc_noise\u003C\u002Fcode> の gate factor を以下に変更した。",{"type":79,"lang":80,"text":81},"code","rust","\u002F\u002F 旧 (brush 流近似): low-opacity 完全 reject\nlet factor = (1.0 - sigmoid(raw_opac)).powi(150);\n\n\u002F\u002F 新 (paper SGLD): low-opacity full noise\nlet factor = sigmoid(-cfg.noise_gate_k * (opac - cfg.noise_gate_t));\n\u002F\u002F k=100, t=0.995 (paper default)\n",{"type":76,"text":83},"両式の振る舞いを \u003Ccode>o\u003C\u002Fcode> (opacity = sigmoid(raw_opac)) で比較する。",{"type":85,"columns":86,"align":90,"rows":92,"caption":113},"table",[87,88,89],"o","旧 (1-σ)^150","新 σ(-100·(o-0.995))",[91,91,91],"right",[93,96,100,103,106,109],[94,95,95],"0.0","1.0",[97,98,99],"0.1","~5e-50","0.9999",[101,102,99],"0.5","~7e-46",[104,105,99],"0.9","~1e-150",[107,108,101],"0.995","~6e-345",[110,111,112],"0.999","~0","0.0179","旧式は実質「全 splat で noise OFF」、新式は「o \u003C 0.995 全体で noise FULL」",{"type":76,"text":115},"\u003Ccode>mean_noise_weight = 5e5\u003C\u002Fcode> は旧式 (実質ゼロ gate) 前提でチューニングされた値。新式 (フル gate) に切り替えると、noise の実効大きさが \u003Cstrong>~50-150 倍\u003C\u002Fstrong> に。Adam step (\u003Ccode>lr_means = 1.6e-4\u003C\u002Fcode>) の数千倍の random walk が means に注入され、image gradient signal が埋もれて loss が発散する。",{"type":63,"text":117},"数値的見積もり",{"type":79,"lang":119,"text":120},"text","新式での per-iter noise (Lego 5207 splats, low-opacity 80%):\n\ncoeff       = lr_mean * median_scale * mean_noise_weight\n            = 1.6e-4 * 0.01 * 5e5 = 0.8\nfactor      ≈ 1.0  (低 opacity splat)\nsample      ~ N(0, 1)\nnoise_per_axis = sample * 0.8, clamp(-median_scale, median_scale) = ±0.01\n\nvs Adam step on means ≈ 1.6e-4 * |grad| ≈ 1.6e-6\n\nratio: noise \u002F Adam = 0.01 \u002F 1.6e-6 ≈ 6000x\n",{"type":76,"text":122},"純粋ランダムウォークが image-loss 由来の最適化を覆い隠す状態。",{"type":63,"text":124},"対応案 (3 案、優先度順)",{"type":63,"level":126,"text":127},3,"案 A (推奨): mean_noise_weight を 1\u002F50 〜 1\u002F100 に下げる",{"type":76,"text":129},"5e5 → \u003Cstrong>5e3 〜 1e4\u003C\u002Fstrong> に。新 gate で「旧式と同程度の有効 noise」を目指す。config 修正のみ、コード変更不要。次回 verify run で \u003Ccode>mean_noise_weight = 5e3\u003C\u002Fcode> から始め、PSNR 25 dB レンジに収束するかで判断。",{"type":63,"level":126,"text":131},"案 B: SGLD coef を paper の正確な式に揃える",{"type":76,"text":133},"paper Eq.: \u003Ccode>ε = λ_lr · σ(-k(o-t)) · Σ · η\u003C\u002Fcode>。ここで \u003Ccode>λ_lr\u003C\u002Fcode> は Adam lr (1.6e-4)、\u003Ccode>Σ\u003C\u002Fcode> は covariance matrix (3x3、log_scales + rot_quats から再構成)、\u003Ccode>η\u003C\u002Fcode> は \u003Ccode>N(0, I)\u003C\u002Fcode>。現状実装は \u003Ccode>Σ\u003C\u002Fcode> を \u003Ccode>median_scale\u003C\u002Fcode> スカラーで近似 (rotation 不変の axis-aligned 単一値)。これを正確な \u003Ccode>Σ · η\u003C\u002Fcode> に置換 (rotation 回せば論文同等)。\u003Ccode>mean_noise_weight\u003C\u002Fcode> はそもそも paper 式には登場しないので、5e5 は別由来 (brush の流儀)。工数: 半日 (rotation rebuild + \u003Ccode>Σ · η\u003C\u002Fcode> 計算が \u003Ccode>apply_mcmc_noise\u003C\u002Fcode> に必要)。",{"type":63,"level":126,"text":135},"案 C: warmup gate を追加",{"type":76,"text":137},"\u003Ccode>iter &lt; 500\u003C\u002Fcode> (= \u003Ccode>relocation_start\u003C\u002Fcode>) の間は noise も OFF。paper §3.2 は relocation のみ warmup 記述だが、本実装で必要なら拡張。工数: 1h (gate を train_loop 側で挟む)。",{"type":63,"text":139},"暫定処置 (今セッションでの対応)",{"type":66,"items":141},[142,143,144],"\u003Ccode>lego-mcmc-30k\u003C\u002Fcode> config を \u003Cstrong>手付けせず\u003C\u002Fstrong>、本書に「次回検証時の手順」として残す","\u003Ccode>docs\u002Ffindings\u002Fmcmc-3-defects.md\u003C\u002Fcode> の A.2 完了基準を「\u003Cstrong>ハイパパラ calibration が次セッション残課題\u003C\u002Fstrong>」と注記","A.5 final ablation 表の MCMC 行は \u003Cstrong>TBD のまま\u003C\u002Fstrong>",{"type":63,"text":146},"次回手順 (案 A 採用前提)",{"type":66,"ordered":67,"items":148},[149,150,151,152,153],"\u003Ccode>lego-mcmc-30k.toml\u003C\u002Fcode> の \u003Ccode>mean_noise_weight\u003C\u002Fcode> を \u003Ccode>5.0e5 → 5.0e3\u003C\u002Fcode> に","smoke (50 iter sh=3) で loss が monotonic decreasing か確認","300 iter \u002F 1000 iter で PSNR の trajectory を見る","PSNR 21 dB レンジに 1000 iter で達するなら 30k full run kickoff","結果を A.5 表に追記",{"type":63,"text":155},"2026-05-23 01:00 retry 結果: 失敗継続 — calibration 修正のみでは不十分",{"type":76,"text":157},"\u003Ccode>mean_noise_weight = 5.0e3\u003C\u002Fcode> (50x 補正) でも iter 1 直後に同じ segfault。",{"type":63,"text":159},"2026-05-23 01:15 切り分け smoke (4 件) → 真の root cause 判明",{"type":76,"text":161},"短期 smoke で各成分を bisect 実行 (\u003Ccode>splat\u002Fconfigs\u002F2026-05-23-01XX-mcmc-*.toml\u003C\u002Fcode>)。",{"type":85,"columns":163,"align":166,"rows":168},[21,164,165],"components","300-500 iter 結果",[167,167,167],"left",[169,173,177,181,185],[170,171,172],"mcmc-l1-only-smoke (300 iter)","scale_l1=0.01 + opacity_l1=0.01、noise=0、relocation=OFF","完走、PSNR 1.08 dB、loss 0.34→0.91 発散",[174,175,176],"mcmc-noise-sh3-smoke (300 iter)","noise=5e3、L1=0、relocation=OFF","完走、PSNR 12.90 dB、loss 0.34→0.12 収束",[178,179,180],"mcmc-combo-iter-bisect (20 iter)","noise=5e3 + L1=0.01、relocation=OFF","完走、PSNR 5.19 dB",[182,183,184],"mcmc-combo-500 (500 iter)","同上、500 iter","iter ~240 で SIGSEGV (exit=139)",[186,187,188],"mcmc-l1-500 (500 iter)","scale_l1 + opacity_l1 のみ、noise=0、relocation=OFF","iter 500 で splats 0 → eval が SIGSEGV (exit=139)",{"type":63,"level":126,"text":190},"真の root cause",{"type":192,"label":193,"variant":194,"text":195},"callout","Root cause","danger","\u003Cstrong>L1 regularizer (opacity_l1 + scale_eigen_l1) が opacity を 0 まで shrink → refine prune が全 splat を削除 → 空 buffer で次の forward kernel が SIGSEGV\u003C\u002Fstrong>。",{"type":79,"lang":119,"text":197},"iter 500 \u002F 500  loss 9.0672e-1  splats      0  12.6 ms\u002Fiter\ntraining done in 6.82s\nfinal splats: 0\n-- evaluation (val) --\n[SIGSEGV]\n",{"type":76,"text":199},"paper の MCMC 設計では (1) L1 が opacity shrink を強制 → (2) relocation tick (default iter 500 以降毎 100 iter) が dead splat を live splat の clone で復活 → (3) 結果として live 数は維持される、という流れ。本実装の場合、\u003Cstrong>relocation が refine prune の prune slot に依存\u003C\u002Fstrong>しており (\u003Ccode>enable_mcmc_respawn=true\u003C\u002Fcode> だった旧経路)、relocation を独立 tick として組み込んだ新経路 (A.2 part 2) では「relocation tick の前に refine prune が全 splat を消す」順序問題が出る。",{"type":63,"level":126,"text":201},"確定した修正方針 (次セッション着手)",{"type":66,"ordered":67,"items":203},[204,205,206,207],"\u003Cstrong>L1 weights をまず下げる\u003C\u002Fstrong>: λ_Σ = λ_o = 0.01 → 0.001 (paper default の 1\u002F10)、relocation 機能を活かして 30k 走らせ、PSNR がどこまで上がるかで再評価","\u003Cstrong>relocation の閾値を refine prune より緩く\u003C\u002Fstrong>: \u003Ccode>opacity_threshold = 0.005\u003C\u002Fcode> を \u003Ccode>0.001\u003C\u002Fcode> 等にし、refine が prune する前に MCMC relocation が処理できる順序にする","\u003Cstrong>train_loop で relocation tick を refine よりも前に走らせる\u003C\u002Fstrong> (現状は train_step → refine → relocation の順なら refine 後の prune slot は relocation で埋まる、要コード確認)","\u003Ccode>enable_mcmc_respawn=true\u003C\u002Fcode> の旧経路を MCMC 有効時のみ default に: refine prune と relocation を同一 tick で密結合する旧設計のほうが安定するかも",{"type":76,"text":209},"paper の精神は「shrink + 再配置で active 数を保つ」が、本実装の prune が \u003Cstrong>全滅させてしまう\u003C\u002Fstrong>点が真の bug。calibration ではなくアルゴリズム順序の問題。",{"type":63,"text":211},"学び (卒論 §5.4 Negative Findings への素材)",{"type":66,"items":213},[214,215,216],"\u003Cstrong>paper 公式と既存実装の hybrid は危険\u003C\u002Fstrong>: gate 関数を 1 行変えると hyperparameter の scale が ~50x ズレる","\u003Cstrong>必須 smoke gate\u003C\u002Fstrong>: 大規模 (30k iter) 着手前に短時間 smoke で loss trajectory を見るべき。今回は smoke 経由せず full 着手して 1 サイクル無駄にした","\u003Cstrong>calibration ≠ correctness\u003C\u002Fstrong>: 単体テスト (26→31 pass) は通過するが、production hyperparameter は別途検証が必要",{"type":63,"text":218},"関連",{"type":66,"items":220},[221,222,223,224],"A.2 実装 spec: \u003Ccode>mcmc-3-defects.md\u003C\u002Fcode>","設定: \u003Ccode>splat\u002Fconfigs\u002F2026-05-22-2305-lego-mcmc-30k.toml\u003C\u002Fcode>","smoke 切り分け config 群: \u003Ccode>2026-05-22-2355-mcmc-noise-only-smoke.toml\u003C\u002Fcode>, \u003Ccode>2026-05-22-2356-mcmc-scale-l1-smoke.toml\u003C\u002Fcode>, \u003Ccode>2026-05-22-2357-mcmc-all-smoke.toml\u003C\u002Fcode>","関連 memory: [[autonomous-plan-a-b]]",[226,237,244],{"id":28,"title":28,"subtitle":227,"date":9,"workspace":228,"tags":229,"verdict":232,"psnr":233,"psnr_unit":-1,"wallclock":234,"splats":235,"summary_url":236,"detail_path":236},"MCMC segfault 切り分け #3: noise + L1、log_every=1 で iter localize","splat",[230,17,21,231],"debug","iter-bisect","partial",5.1915082931518555,"0.57s",5207,"\u002Fruns\u002Fmcmc-combo-iter-bisect\u002F",{"id":26,"title":26,"subtitle":238,"date":9,"workspace":228,"tags":239,"verdict":232,"psnr":241,"psnr_unit":-1,"wallclock":242,"splats":235,"summary_url":243,"detail_path":243},"MCMC segfault 切り分け #1: scale_eigen_l1 + opacity_l1 のみ",[230,17,21,240],"l1-only",1.0794563293457031,"4.82s","\u002Fruns\u002Fmcmc-l1-only-smoke\u002F",{"id":27,"title":27,"subtitle":245,"date":9,"workspace":228,"tags":246,"verdict":232,"psnr":248,"psnr_unit":-1,"wallclock":249,"splats":235,"summary_url":250,"detail_path":250},"MCMC segfault 切り分け #2: SGLD noise 5e3 のみ、sh=3 cap=1M",[230,17,21,247],"noise-only-sh3",12.896780014038086,"7.64s","\u002Fruns\u002Fmcmc-noise-sh3-smoke\u002F",[252],{"id":32,"title":253,"date":254,"status":255,"polarity":256,"category":257,"axes":258,"tags":259,"task_code":23,"related_runs":264,"delta_psnr":-1,"delta_wallclock":-1,"rank":265,"verdict":36,"impact_summary":266,"detail_path":267},"A.2 MCMC 法の完全実装 — 3 設計欠陥の整理 (spec)","2026-05-22","draft","neutral","spec",[14],[16,17,260,257,261,262,263],"sgld","relocation","scale-l1","opacity-l1",[25],"mid","本実装の MCMC が論文と乖離している 3 箇所 (5% incremental growth 欠如、λ_Σ\u002Fλ_o covariance\u002Fopacity 正則化欠如、relocation が refine prune に便乗) を整理し、A.2 の修正項目と検証条件を確定させた spec。","\u002Ffindings\u002Fmcmc-3-defects\u002F",1782449788629]