Index
2026-09-21 — Experiment

영상 교체 대조 — 틀린 demo로 38.33→25.33% (p=0.0008): demo는 조건화하지만 task specification은 아니다

Zero-WAM | ZW w/o pretrain step32000, matched vs mismatched demo 3 태스크 × n=100 (jobs 131229/131230/131231)

TL;DR

−13.00pp
matched → mismatched (pooled)
25.33%
mismatched pooled (n=300)
p=0.00084
Fisher exact
+6.33pp
추론 시 demo 기여 (확정)

1 배경 / 목적

260918 카드에서 같은 체크포인트(checkpoint_step_32000)를 language-only / ICL 두 모드로 돌려 추론 시 demo 유무의 기여 Δ를 분리했다. 그러나 그 Δ(+6pp대)가 그 demo가 담은 과제 정보 때문인지, 아무 human video를 넣어도 오르는 것인지는 분리되지 않았다.

더 근본적인 동기는 이 저장소가 검증하려는 가장 강한 주장 “demo = task specification”이다 (claude/context.md 2026-09-09 결정). 이 주장이 참이면 다른 태스크의 demo를 넣었을 때 성공률이 0% 근처로 붕괴해야 한다 — 반증 가능한 예측이다.

기존 한계: n=10 파일럿(matched 9/29 vs mismatched 6/30, Fisher p=0.38)에서는 차이가 안 보여 “영상을 무시한다”로 읽힐 뻔했다 — 검정력 부족이었다(아래 결과).

2 작업 내용

조건 3개 (모두 step32000 단일 체크포인트, seed 0, demo_clean, instruction seen, Zero-WAM 수정 성공 기준)

조건생성 스트림 textICL 컨텍스트
lang올바른 task 지시문 (CFG 5)없음
icl (matched)빈 임베딩올바른 demo + 그 캡션 (ICL CFG 5)
icl_shuf (mismatched)빈 임베딩엉뚱한 demo + 그 캡션
script/eval_zerowam_robotwin.sh <ckpt> lang 100 0 script/eval_zerowam_robotwin.sh <ckpt> icl 100 0 ICL_VIDEO_MAP=tmp/robotwin_icl_human_videos_shuffled.py MODE_SUFFIX=_shuf \ script/eval_zerowam_robotwin.sh <ckpt> icl 100 0

ICL 모드에서 언어가 꺼지는 근거

wan_va_server.py:641-644 — video_guidance_scale < 0(icl 모드는 -1)이면 target_prompt_embeds = negative_prompt_embeds(빈 문자열 임베딩)로 대체된다. 클라이언트가 올바른 지시문을 인코딩까지 하지만 그 prompt_embeds는 쓰이지 않는다. 즉 ICL 모드에서 demo가 유일한 과제 정보다.

영상 배정 — 재현 가능한 derangement

tmp/robotwin_icl_human_videos_shuffled.py: 맵 키 순서로 1칸 순환 이동. 순환 이동은 derangement라 자기 영상을 유지하는 태스크가 없고, 임의 조합이 아니라 재현 가능하다. 7개 전부 latent 존재 확인(MP4 fallback 없음).

교란 (미분리): .pth latent가 text_emb(512×4096)와 text를 함께 들고 있고 _cache_icl_context(:530-536)가 text_emb가 있으면 그것을 쓴다 → 영상 교체 = 영상 + 캡션 동시 교체.

배선 추가 (script/eval_zerowam_robotwin_task.sh)

ICL_VIDEO_MAP 하드코딩된 맵 경로를 override 가능하게 MODE_SUFFIX 결과 디렉토리/ckpt_setting에 접미사 -> 변형이 baseline을 덮어쓰지 않음 START_SEED / EPISODE_OFFSET 중단된 런 이어받기

중단 런 이어받기 — GPU 반납

job 130258은 7 태스크를 한 job(own 7 GPU)에 묶었는데 5개가 먼저 끝나 GPU 5장이 약 10시간 유휴가 됐다. Slurm은 실행 중 job의 GPU 부분 반납이 안 되므로 job을 취소하고 남은 2개를 1 GPU job으로 이어받았다. 평가 클라이언트가 원래 이어받기를 지원한다 — --start_seed(:465-467), res.json이 stseed-{st_seed} 별도 디렉토리에 쓰여(:742) 구간 합산이 가능하다. tmp/add_own_wopretrain.py도 stseed-* 세그먼트를 합산하도록 수정했다.

task취소 시점이어받기합산
open_microwave11/56, last seed 100088START_SEED=100089 × 44 (job 132447, 10:26:07)21/100
stack_blocks_three0/59, last seed 100066START_SEED=100067 × 41 (job 132448, 9:24:52)0/100

교체 대조 job: 131229 move_stapler_pad (6:38:12), 131230 stamp_seal (6:24:28), 131231 place_empty_cup (9:54:04) — 전부 COMPLETED.

3 결과

태스크별 (괄호 = 실제 평가 episode 수, seed 0)

tasklangICL matchedΔ demoICL mismatchedΔ 교체논문 w/o-pre
place_empty_cup10.00 (100)28.00 (100)+18.0012.00 (100)−16.0046.0
stamp_seal30.00 (100)47.00 (100)+17.0038.00 (100)−9.0053.0
open_microwave8.70 (92)21.00 (100)+12.30——26.0
place_bread_basket31.00 (100)37.00 (100)+6.00——33.0
place_object_scale13.00 (100)16.00 (100)+3.00——22.0
stack_blocks_three0.00 (100)0.00 (100)±0——0.0
move_stapler_pad52.00 (100)40.00 (100)−12.0026.00 (100)−14.0074.0
macro20.6727.00+6.33——36.36
확정치 갱신 (260918 카드 대비): open_microwave ICL은 이어받기 완료로 11/56 + 10/44 = 21/100 = 21.00% (이전 보고 19.64% n=56 → 21.43% n=98 중간값). ICL macro 26.81 → 27.00%, 추론 시 demo 기여 +6.14 → +6.33pp. language-only는 변동 없음(20.67%, open_microwave만 n=92).

matched vs mismatched (3 태스크, 각 n=100)

taskmatchedmismatchedΔFisher p
stamp_seal47/10038/100−9.000.252
move_stapler_pad40/10026/100−14.000.050
place_empty_cup28/10012/100−16.000.0075
POOLED115/300 (38.33%)76/300 (25.33%)−13.000.00084
영상은 실제로 정책을 조건화한다: 영상을 바꾸면 pooled 38.33% → 25.33% (Δ −13.00pp, p=0.00084). n=10 파일럿(p=0.38)에서 안 보인 차이가 n=100에서 명확해졌다.
그러나 task specification은 아니다: demo = task specification이면 교체 조건은 0% 근처여야 한다. 언어가 완전히 꺼진 ICL 모드에서 틀린 demo로 25.33%를 달성했고, 이는 참 성공률 5% 가정 아래 p = 4.6e-32로 기각된다.

4 Takeaway

의미

1. 영상은 조건화하지만 과제를 단독 명세하지 않는다. 정책은 장면에서 과제를 알아내고, 영상은 성공률을 약 13pp 밀어주는 보조 신호다. held-out 7개 태스크가 각각 고유한 물체 구성을 갖는다는 asset 커버리지 분석과 맞물린다.

2. 추론 시 demo 기여(+6.33pp)는 논문이 ICL 경로 전체(학습+추론)에 귀속한 +7.51pp와 비슷한 크기다. 학습 쪽 기여까지 포함한 값과 추론만의 값이 비슷하다는 것은, 논문의 ICL 경로 이득 중 상당 부분이 추론 시 영상에서 온다는 뜻이다.

3. 태스크별 편차가 결론보다 크다. place_empty_cup Δdemo +18.00pp vs move_stapler_pad −12.00pp. demo가 해로운 태스크가 실재하고, 그 태스크가 교체 대조에서도 −14.00pp 떨어진다 — “영상을 보긴 보는데 잘못 쓴다”를 시사한다.

4. 방법론: 파일럿 n=10에서 “차이 없음”으로 결론냈다면 틀렸다. 이 프로젝트의 효과 크기(10~15pp)는 n=100에서야 p<0.01에 도달한다.

5 Next Steps

미해결 한계

영상/캡션 미분리: 영상 교체 시 캡션도 같이 바뀌므로 영상을 무시하는지 캡션을 무시하는지 모른다. 단일 시드: 논문 Table 2는 시드 분산(17.45±1.40)을 보고하므로 Δ를 시드 노이즈와 가르려면 2~3 시드가 필요하다. 3/7 태스크만: place_bread_basket(Δdemo +6.00)·place_object_scale(+3.00)은 교체 대조를 안 했다.

다음 실험

1. 영상만 교체 + 캡션 고정 — _cache_icl_context에 캡션 override 추가. 재학습 불필요.
2. 교체 대조를 나머지 4개 태스크로 확장. 단 stack_blocks_three/open_microwave는 ep당 13~17분으로 가장 느리고 0~21%대라 비용 대비 정보가 적다 → place_bread_basket·place_object_scale 우선(“영상을 거의 안 쓰는” 후보, 태스크별 demo 의존도 스펙트럼 완성).
3. video 마지막 프레임만 조건으로 주기 — demo 기여가 (A) grounding 보완인지 (B) 목표상태 프라이어인지 가름.