Index
2026-05-02 — Analysis

DA3 Loss v2 Conf Inflation 진단 및 softplus → sigmoid 수정

VGGRPO | DA3 트랙 | job 3219(실패) → job 4389(sigmoid, 재시작)

TL;DR

0.84
v2 softplus r (step 5700)
0.93
v1 r (step 3300)
-44%
총 loss (step 50)
-79%
L_D (step 50)

1 배경 / 목적

DA3 Phase-B Loss v2 (paper §3.2 풀 구현, job 3219)를 ~24h 학습 후 viz 품질을 점검했다. step 5700 기준 agent_L/R r 평균 0.84로, v1 baseline (job 2903) step 3300의 r=0.93보다 낮았다. paper 준수한 v2가 자체 설계 v1보다 나빠야 할 이유가 없으므로 implementation 버그 탐색 시작.

핵심 symptom: step 5470에서 L_D = -0.118 (음수). paper formulation D_c · |err| − λ_c · log D_c는 이론상 음수 허용한다고 "합리화"했지만, 이는 conf inflation 시작 신호를 놓친 것.

2 작업 내용

원인 분석 — Conf Inflation 메커니즘

paper의 L_D loss에서 conf D_c의 equilibrium을 분석:

L_D = D_c · |err| − λ_c · log(D_c) ∂L_D/∂D_c = |err| − λ_c / D_c = 0 → D_c* = λ_c / |err| unit-scale 공간에서 학습이 진행될수록 |err| → 0 → D_c* = λ_c / |err| → ∞ (UNBOUNDED) softplus(x)는 x → ∞ 허용 → conf parameter가 발산, L_D 음수 → depth supervision 신호 흡수
v1에서 dry run L_D 음수 봤을 때 합리화한 게 잘못: "NLL formulation이라 음수 허용"이라 판단했지만 실제론 conf inflation 시작 신호였다. 24h × 4 GPU = 96 GPU-hour 낭비.

수정 — softplus → sigmoid

src/models/phase_b_loss_da3_v2.pydepth_loss_paper 함수에서 conf 파라미터화 변경:

# Before (v2 softplus — 잘못) D_c = F.softplus(pred_conf) # ∈ (0, ∞) — unbounded # After (v2 sigmoid — 수정) D_c = torch.sigmoid(pred_conf) # ∈ (0, 1) — bounded # 결과: # D_c* = min(1, λ_c / |err|) → bounded # log(D_c) ∈ (-∞, 0) → L_D ≥ 0 always # MoGe paper (DA3가 ℒ_gl에서 인용한 논문)과 동일 convention
Sigmoid 선택 근거: DA3 paper가 ℒ_D formulation을 MoGe에서 인용. MoGe 원본은 sigmoid 파라미터화 사용. paper가 D_c 파라미터화를 명시하지 않아 softplus를 가정했던 게 오류.

디렉토리 정리 및 재시작

old softplus run: lgm_robocasa_da3_v0_0430_1822 → archive_lgm_robocasa_da3_v0_softplus_0501_0443 (기록용 rename, weights 보존) new sigmoid run: lgm_robocasa_da3_v0_lossv2_<ts> (job 4389) sbmr 5x retry, 4GPU DDP, core-extra, 56 CPU, 800GB v1과 resume 호환 없음 (unit-scale vs metric space) → fresh start

3 결과

Dry run 비교 (sigmoid vs softplus)

버전적용 ckpttotalL_DL_ML_PL_CL_grad
v2 softplus (job 3219, step 5470)오염된 4500 ckpt-0.118
v2 sigmoid (ckpt 4500 + sigmoid 적용)contaminated ckpt0.340.0860.100.090.0510.008

job 4389 초기 학습 (fresh start, sigmoid)

SteptotalL_D변화
02.360.51
501.330.106total -44%, L_D -79%
초기 수렴 속도 개선: sigmoid fresh start step 0→50에서 total -44%, L_D -79%. softplus 초기(step 0→50)의 total 2.83→1.49 (-47%)와 비슷하나, L_D가 양수 유지되어 depth supervision 신호가 정상 흐름.

진행 중인 학습 잡 (수정 후 상태)

JobDirLoss ver상태
4268lgm_robocasa_da3_v0_0430_1822v1 baselineRUNNING ~step 3300
3219archive_..softplus_0501_0443v2 softplusCANCELLED (실패)
4389lgm_robocasa_da3_v0_lossv2_<ts>v2 sigmoid (현재)RUNNING ~step 50

4 Takeaway

Paper 직역보다 인용 논문 convention 확인이 우선

DA3 paper §3.2는 D_c 파라미터화를 명시하지 않았다. 이럴 때는 해당 formulation이 인용된 원본 논문(MoGe)을 확인해야 한다. "paper formulation이 음수 허용"이라는 합리화는 implementation 검증을 건너뛰는 전형적인 실수.

Dry run 신호를 합리화하지 말 것

v2 최초 dry run에서 L_D 음수(-0.247)가 나왔을 때 경고 신호로 받아들였어야 했다. 대신 "NLL 특성상 허용"으로 합리화하고 학습을 시작했고, 결과적으로 96 GPU-hour(4 GPU × 24h)를 낭비했다. 앞으로: 의심 신호 → 즉시 formulation 재검증 → 학습 시작은 그 이후.

재발 방지: L_D 음수, scale diverge, 특정 loss component만 비정상적으로 낮음 — 이런 신호는 "paper 특성"이 아닌 "implementation 버그" 가설을 우선 검토.

5 Next Steps

job 4389 vs v1 (job 4268) 비교 ablation

step 1500 도달 시 (~9h): agent_L/R r, eye_in_hand r, scale 변동 (v1 1.05~1.65 vs v2 이론상 1), conf map 정성 검사. v2 sigmoid가 v1 대비 명확히 우수하면 main loss로 확정.

남은 검증 항목

① softplus(conf) numerical edge case: pred_conf → -50 → softplus≈0 → log(eps) → 현재 (D_c+1e-6).log()로 막았으나 sigmoid 전환으로 D_c∈(0,1) — log(eps) 위험 대폭 감소
② FOV convention round-trip 검증 (pose_enc 9-DoF)
③ DDP find_unused_parameters — v2 새 헤드 분기 포함 정상 동작 여부 (step 0~100 watch)

v2 softplus archive 활용

archive된 softplus ckpt(step ~5700)는 비교 분석에만 사용. resume 절대 금지 (unit-scale + conf-inflated space → sigmoid fresh start와 충돌). ablation 데이터로 "conf inflation 이전 vs 이후 depth 품질" 비교 가능.