Problem
Phase 1에서 Phase 2로 전환할 때 loss spike 발생 후 NaN으로 발산, training collapse로 이어짐.
Root Cause
Phase 2의 low noise regime에서 gradient magnitude가 Phase 1 대비 10x 이상 급증.
Phase 1에서 학습한 weight scale이 Phase 2의 noise schedule과 맞지 않아 gradient explosion 발생.
Solution
gradient clipping (max_norm=1.0) 적용 + Phase 2 시작 시 500-step warmup 스케줄 추가.
Warmup 기간 동안 learning rate를 0에서 target LR까지 linear ramp-up.
Result
Loss 1.3 → 0.8, 20K steps에 걸쳐 안정적 수렴 확인
Problem
Phase 2 학습 완료 후 validation 시 ego view 부분이 완전히 검은 화면으로 출력됨.
Wrist view는 정상 생성되나 ego는 zero tensor에 가까운 값.
Root Cause
Phase 2 noise schedule이 ego latent에도 동일하게 적용되고 있었음.
Ego는 conditioning 입력이므로 noise를 추가하면 안 되는데, noise injection 로직이 ego/wrist를 구분하지 않고 전체 latent에 적용.
Fix
ego latent masking 도입 — noise는 wrist latent에만 선택적으로 적용.
Ego latent는 clean state를 유지하도록 masking 처리.
Result
Ego view 정상 출력 확인. Ego-wrist 간 spatial consistency 유지됨.
Problem
Cross-view rendering loss의 gradient가 transformer backbone까지 흐르지 않음.
Loss 값은 계산되나 backward pass에서 gradient가 끊김.
Root Causes (3건)
torch.no_grad() 블록 안에서 loss 계산 — gradient 자체가 차단됨
- GT wrist를 rendering에 입력 — generated wrist (
z_0_pred)를 넣어야 학습 가능
- 49 frame 중 5개만 사용 — supervision signal 불충분
Fix
z_0_pred 사용으로 전환 + no_grad 제거 + 전체 frame 사용.
Pipeline (수정 후)
z_0_pred → split ego/wrist → stitching Conv3D → AnySplat → gsplat render → L1 loss
Result
Cross-view rendering loss ~0.13 (L1, 정상 범위). Gradient가 transformer까지 정상 전파 확인.