Index
2026-08-13 — Experiment

World Forcing 4-arm 완결: depth branch와 REPA를 같이 걸면 더 좋아지는가

X-WAM | RoboCasa 24 task × 50 rollout, cfg=0 | arm A / B / C / D

TL;DR

61.08%
A 없음
66.00%
B depth
64.67%
C REPA
64.75%
D 둘 다
+0.08
D−C (%p)

1 배경 / 목적

arm C에서 29M REPA가 1.64B depth branch 이득의 73%를 가져왔다(점추정). 남은 질문은 두 기하 신호가 상보적인가 중복인가다.

이 비교가 깨끗한 이유: _maybe_stash_repablock 19 출력에서 캡처하고 depth branch의 extra_seq_intermediate바로 그 슬라이스다(wan_model.py:676 vs :695). 두 신호가 동일한 텐서에 작용하므로 깊이 차이로 인한 교란이 없다.
사전 등록한 세 시나리오 D > B -> 상보적. 서로 다른 기하를 나름 D ~ B -> REPA 중복. 1.64B가 이미 REPA가 넣는 기하를 유도 (= "29M로 대체 가능" 강화) D < B -> REPA가 depth 학습을 방해

2 결과

arm구성추가 paramALL (24)PnP (8)non-PnP (16)
A없음061.08%44.00%69.62%
Bdepth branch1.64 B66.00%53.75%72.12%
CREPA0.029 B64.67%46.75%73.62%
Ddepth + REPA1.67 B64.75%50.00%72.12%
D − C = +0.08%p — 777 vs 776, 즉 1,200 rollout 중 성공 1개. 1.64B 파라미터를 추가한 결과가 이것이다.

유의성 (n=1200/arm)

비교차이 (%p)SEz95% CI판정
B−A+4.921.962.51[+1.07, +8.76]유의
D−A+3.671.971.86[−0.20, +7.53]미확립
C−A+3.581.971.82[−0.28, +7.45]미확립
D−B−1.251.94−0.64[−5.06, +2.56]미확립
D−C+0.081.950.04[−3.74, +3.91]미확립
“D≈C”는 같다는 증명이 아니다. CI가 [−3.74, +3.91]로 ±4%p까지 열려 있다. 차이를 발견하지 못했다가 정확한 표현이다. PnP에서만 B−A(z=2.77)와 C−B(z=−1.98)가 살아남는다.

3 Takeaway

네 arm이 좁은 밴드에 앉는다

A(61.08) < C(64.67) ≈ D(64.75) < B(66.00). 기하 신호가 있으면 61 → 64~66이고, 어느 신호를 어떻게 넣든 상한이 비슷해 보인다. 두 신호를 겹쳐도 올라가지 않는다는 것이 이번의 새 정보다.

이것이 실재하는 천장인지 노이즈인지는 표본을 늘려야만 알 수 있다. 지금 데이터로는 어느 쪽도 주장할 수 없다.

병목은 방법이 아니라 표본이다. 4-arm 20×4 = 80시간의 학습을 마쳤는데도 B·C·D를 서로 구분할 수 없다. 100 rollout 재평가(SE 1.95→~1.4%p)가 다른 어떤 ablation보다 우선한다.

4 부수 확인 — 아키텍처 사실 2개

X-WAM은 multi-view를 temporal concat하지 않는다

_create_freqs(wan_model.py:472)에서 v 축이 expand로만 만들어지고 v로 인덱싱되는 주파수 성분이 없다. 실측: 같은 (t,h,w)에서 view0==view1==view2True, t·h·w는 모두 구분됨.

뷰를 구분하는 것은 nn.Embedding(3, 3072) 상수 하나뿐이고, 뷰 간 기하 관계가 위치 인코딩에 전혀 없다. teacher(VGGT-Ω)는 cross-view 기하를 만들어 타깃에 실어 넘기는데 student에게는 그것을 표현할 위치 채널이 없다 — arm C·D가 PnP에서 약한 것의 후보 설명이다.

async noise sampling = per-token AdaLN. e0[B, L, 6, D]라 토큰마다 자기 scale/shift를 갖는다(보통 DiT는 [B,6,D]). 다만 실사용 입도는 (모달리티, 프레임) — 프레임 내 뷰0==뷰1 실측 확인. 프레임별 다른 noise level(Diffusion Forcing)은 runner 한 줄이면 되고, 우리는 GF의 loss 2항만 가져왔지 noise scheduling은 안 가져왔다.

5 Next Steps

1. [최우선] 100 rollout/task 재평가 — A·C·D(·B). SE 1.95 → ~1.4%p. EVAL_RANKS로 3 rank씩 샤딩하면 작은 쿼터에서도 돌아간다.

2. repa_layer 스윕 (우선순위 상향). 우리는 19/30(깊이 67%)로 REPA 관행(AGRA 8/28=29%)보다 깊다. 통제 비교를 위해 depth fork 지점에 맞춘 대가이고, PnP 약세가 “정렬이 약해서”가 아니라 “너무 깊어서”일 수 있다. teacher 캐시 층은 [4,11,17,23] 4개뿐.

3. C0 ablation — repa_frames = cond vs gen. 관측 정렬(Spatial Forcing) vs 생성 정렬(Geometry Forcing). 같은 백본·teacher·레시피로 둘을 직접 비교한 선행 연구가 없다.

4. λ_scale 스윕(C4) / relational loss(C2). PAIWorld·MECo-WAM이 독립적으로 둘 다 관계 정렬을 택했고, PnP 실패가 그 증거일 수 있다.

6 운영 함정 (재발 방지)

#함정영향 / 대응
1짧은 세그먼트는 순손실save_interval=500은 0.26 it/s에서 32분, 로딩 ~7분 → 39분 미만 세그먼트는 체크포인트를 못 남기고 되감김arm D에서 76597 −100 step, 76728 −160 step. 총 점유 11.1h 중 2.6h(24%)가 소멸. preempt가 잦으면 250으로
2SAVE_ROOT를 고정하지 않으면 requeue가 무의미 — 기본값이 robocasa_$SLURM_JOB_ID재제출마다 새 디렉토리 → RESUME이 빈 디렉토리를 봐서 24 태스크를 처음부터. 평가를 sbmr로 낼 땐 반드시 export
3큐 대기를 실행 시간으로 오독 — job 78297을 “2h40m 돌고 결과 없음”으로 보고실제는 PENDING 2h40m + 실행 23초. sacct -o Elapsed는 실행 시간만 센다 — Start 시각을 같이 볼 것