Index
2026-05-01 — Progress

DA3 Phase-B Loss v2 구현 — paper §3.2 완전 구현

VGGRPO | DA3 트랙 | L_D · L_M · L_P · L_C · L_grad + GT-side unit-scale norm

TL;DR

5
Loss 항수
1.9569
Dry run total
0.5204
L_P (new)
4 GPU
job 3219

1 배경 / 목적

기존 src/models/phase_b_loss_da3.py (v1)는 DA3 paper의 supervision 전략이 아닌, DA3의 출력 스키마에만 맞춰 자체 설계된 loss였다. ckpt 1500에서 viz agent_L/R r=0.95로 나쁘지 않았지만, paper §3.2를 정독하면서 구조적 격차 4개를 발견.

격차 1 (Critical): L_P 완전 누락 — depth와 ray가 P = D·d + t로 묶이는 관계인데, 이걸 supervise하지 않으면 한쪽이 다른 쪽 보상하는 drift mode 허용. 증거: ray_origin loss ~1.25 vs depth loss ~0.06 — 한 자릿수 차이.
격차 2 (Critical): Confidence weighting + log-conf regularizer 누락 — conf head가 완전 unsupervised. viz |diff|에서 boundary가 빨갛게 dominate하는 원인.
격차 3 (High): Gradient loss L_grad 없음 — depth boundary sharp하게 유지하는 명시적 constraint 부재.
격차 4 (High): Scale 방향 반대 — v1은 pred를 GT metric에 맞춤. paper는 GT를 unit-scale로 정규화하고 pred를 그 공간에서 학습. backbone weight 자연 분포와의 괴리.

2 작업 내용

1. lgm_connector_da3.py — pose_enc 노출

DA3 cam_dec가 9-DoF [t, q, fov] raw vector를 출력하는데, v1 wrapper는 이를 pose_encoding_to_extri_intri로 변환해 4×4 extrinsic만 노출했음. v2의 L_C는 9-DoF 직접 supervise가 필요하므로 raw pose_enc도 output dict에 추가. back-compat을 위해 extrinsic/intrinsic은 함께 derive해서 유지.

2. src/models/phase_b_loss_da3_v2.py — paper §3.2 풀 구현 (신규 257L)

Total: L = L_D + L_M + L_P + L_C + L_grad, 가중치 모두 1.0 (paper α=β=1)

구현 요지v1과의 차이
L_D(1/Z) Σ m_p (D_c · |D̂-D| − λ_c · log D_c). D_c = softplus(pred_conf), λ_c=0.1plain L1 → conf-weighted
L_Mraw 6-channel L1 (origin scaled by 1/scale + direction unrotated)유사 (format 통일)
L_P|P̂ − P_gt_norm|, P̂ = pred_depth · pred_dir + pred_origin, ray 해상도(168×296)v1 없음 — 신규
L_CL1(pred_pose_enc, [t_norm(3), q_xyzw(4), fov(2)]), FOV: 2·fx/WR(3×3) L1 → 9-DoF + FOV
L_graddepth 해상도(294×518)에서 finite-difference L1 (x+y 양방향)v1 없음 — 신규
scale (clip-level) = mean(||P_valid||_2).detach() → 모든 GT 신호 (depth, ray origin, P, pose_t) / scale → unit-scale 공간 pred는 raw (DA3 자연 relative 공간) 유지 GT만 정규화하여 pred와 동일 공간에서 학습 → backbone weights가 자연 분포에 가깝게 머무름

3. Train script 수정

scripts/train_lgm_robocasa_da3_v0.py에 v2 loss import + --lambda_c arg + log 컬럼 변경. exp dir 패턴을 lgm_robocasa_da3_v0_lossv2_*로 분리하여 v1 checkpoint와 명확히 구분 (v1 dir에서 resume 시 metric-scale vs unit-scale 충돌로 spike 위험).

3 결과

Dry run 단계 (random tensor → real data)

단계totalL_DL_ML_PL_CL_gradNaN/Inf
Random smoke test3.74550.55770.54810.80490.63671.198clean
Real data 1차 (ckpt 1500)1.2432-0.24700.41680.52040.54510.0078clean
Real data 2차 (softplus + λ=0.1)1.95690.46670.41680.52040.54510.0078clean
1차 dry run L_D 음수 원인: ckpt 1500의 conf head가 학습 안 된 상태에서 큰 양수 출력 → log term dominate. softplus(conf) + λ_c 0.5→0.1으로 수정 후 양수 영역 복귀.

2차 dry run 검증 수치 (1 GPU, ckpt 1500 + 실 RoboCasa clip)

forward 6.15s / backward 13.11s (1 GPU) trainable params: 233, with grad: 147 top gradient norms: 3.91 connector.conv3d.weight 0.84 blocks.22.mlp.fc1.lora_B 0.55 blocks.22.mlp.fc2.lora_B 0.48 blocks.19.mlp.fc1.lora_B NaN/Inf: clean
Gradient flow 정상: connector와 LoRA 모두 gradient 받음. v2에서 새로 노출된 pose_enc 경로도 이상 없음.

학습 잡 현황 (job 3219 시작 시점)

JobDirLoss ver상태
2903lgm_robocasa_da3_v0_0430_1822v1 baselineRUNNING ~step 1948
3219lgm_robocasa_da3_v0_lossv2_<ts>v2 (paper §3.2)RUNNING step 0+

두 잡 모두 끝까지 유지하여 step 1500/3000/5000 ablation 비교 예정.

4 Takeaway

Supervision Space 전환의 의미

v1 → v2는 단순 가중치 조정이 아니라 supervision space 자체를 변경한 것이다. metric pred space에서 학습하면 backbone이 원래 출력하던 relative scale 분포와 괴리가 생겨 LoRA가 더 큰 변화를 학습해야 한다. GT-side unit-scale 정규화로 pred는 DA3 자연 공간에 머무르고 LoRA 부담이 줄어든다.

L_P가 핵심 핀

depth와 ray는 P = D·d + t 관계로 묶여있다. L_P 없으면 depth만 잘 학습되고 ray가 drift하는 모드가 허용된다 (v1에서 ray_origin loss가 depth loss 대비 한 자릿수 높았던 이유). L_P는 두 변수를 동시에 구속하는 핀이다.

Confidence head activation: L_D conf weighting으로 conf head가 처음으로 supervision 받는다. 모델이 "여기 모름" 표시를 학습하면 viz 품질 + downstream reward signal quality 양쪽에 도움.

5 Next Steps

검증 대기 중 (job 3219 자동 검증)

① 4-GPU DDP 안정성 — 새로 노출된 pose_enc 분기에서 find_unused_parameters 정상 동작 여부
② Step 0~100 loss spike 없음 / NaN/Inf 없음 (특히 softplus(conf).log() numerical edge case)
③ Step 500/1000 viz 품질 — pred depth가 GT 구조 잡는지, conf map 유의미한 분포 보이는지
④ scale 안정성 — P_norm 기반 scale이 v1 per-clip 1.05~1.65보다 안정적인지 확인

구현 미검증 항목 (주의)

FOV convention round-trip: fov_x = 2·fx/W가 DA3의 pose_encoding_to_extri_intri와 일치하는지 GT extrinsic → pose_enc → 역변환으로 검증 필요
Quaternion xyzw vs wxyz: _matrix_to_quat_xyzw round-trip 자체 검증
softplus(conf) numerical: pred_conf가 매우 negative → softplus→0 → log→-∞. (D_c+1e-6).log()로 막았지만 실학습 중 conf -50까지 가는지 확인

v1 vs v2 비교 계획

동일 step (1500)에서: scale 변동(v1 1.05~1.65 vs v2 이론상 1), agent_L/R r(v1 0.95 vs v2 ?), eye_in_hand r(v1 0.74 vs v2 0.85+ 기대), conf map 정성 검사