normalize_latent() 함수로 encode 직후 (z-mean)/std 적용. Wan 로더에는 stats 미부착이라 자동 no-op.07/04부터 진행 중인 VGGT-Ω LGM Cosmos VAE aggregator vs DINOv2 stitch ablation(job 36540 등, aggregator step 35.9K/50K)에서 사용하는 Cosmos-Predict2 tokenizer는 Wan 2.1 VAE 아키텍처를 그대로 채용했지만 NVIDIA가 별도로 fine-tune한 가중치다. 이 fine-tune 과정에서 latent의 채널별 통계 분포가 Wan과 완전히 달라졌을 가능성을 점검했다.
Cosmos VAE로 96 clip × 3 cam × 8 frame을 인코딩해 채널별 mean/std를 Welford single-pass 알고리즘(수치적으로 안정, 1-pass)으로 계산했다. 결과는 극단적으로 불균일했다:
구현 (파일: scripts/compute_cosmos_latent_stats.py, 실행 ~3분 login node 1 GPU):
load_cosmos_vae()(scripts/train_lgm_gt_v0.py) 마지막에 stats를 VAE 객체에 _latent_mean/_latent_std로 attach. load_wan_vae()에는 이 코드가 없어 Wan은 attach 자체가 안 됨.
적용 지점: vae.encode() 직후, Conv3d connector 직전, 총 3개 스크립트의 정확히 같은 위치에 삽입.
| 스크립트 | 용도 | 적용 지점 |
|---|---|---|
train_lgm_robocasa_vggt_v0.py | 학습 | vae_encode_views() |
find_stitch_layer_vggt.py | Stitch search (aggregator) | Pass 1(train) + Pass 3(eval) |
find_stitch_layer_vggt_dinov2.py | Stitch search (DINOv2) | Pass 1 + Pass 3, 동일 패턴 |
대안으로 Conv3d weight init만 조정하는 방법도 검토했으나, 입력 분포 자체를 표준화하는 편이 stitch search closed-form 해(ℓ̂)와도 일관되게 맞물려 latent 정규화를 채택했다.
정규화 적용 전후 데이터 흐름:
hasattr 분기로 no-op 보장) Cosmos 경로에만 격리 적용됐다 — 3개 스크립트 동일 위치 삽입으로 학습/stitch search 간 불일치 리스크 제거.Cosmos VAE 채널10의 std가 60.74로 나머지 대비 30~60배 큰 것은 단순 스케일 문제가 아니라 gradient가 사실상 단일 채널로 쏠려 나머지 15채널의 geometry 정보가 학습에 거의 기여하지 못하는 구조적 위험이었다. 07/04부터 진행 중인 no-norm 축 학습(job 36540, aggregator step 35.9K/50K)은 이 문제를 안은 채 진행된 것으로, 향후 norm 적용 축과의 비교가 이 가설의 실질적 검증이 된다. Wan VAE 경로는 코드 변경 없이 격리됐으므로 기존 Wan 학습 결과의 재현성에는 영향 없음.
정규화가 실제로 downstream depth/pose 예측 품질을 개선하는지는 아직 정량 확인 전. stitch search 재실행(job 36679/36680) 완료 후 새 Cosmos-norm ablation을 시작해야 loss curve로 비교 가능.
Stitch search(norm 반영) 완료 → 새 Conv3d init으로 Cosmos-norm 학습 시작. 최종적으로 {Wan, Cosmos-nonorm, Cosmos-norm} × {aggregator, DINOv2} 6-way 비교 진행, no-norm 대비 norm 축의 초기 loss 안정성 및 AbsRel 개선폭을 확인할 것.