← Back to index
TL;DR
95 / 97
tests correct (30 scen.)
+53.1 %p
vs Tier-2 (44.8%)
22 min
train time (3 epoch)
- 핵심 원인 진단: Tier-2의 builder가 prior chunk의 atomic으로 eval_spec의 target fixture를 미리 emit하도록 학습 (GT leak). token_acc 99.96%까지 올랐지만 token-copy task로 떨어져 진짜 memory recall 약함.
- Tier-3a fix: 2-turn 구조 — Turn 1은 video frames만 보고 PnP sub-tasks 나열 (eval_spec 전혀 안 봄), Turn 2에서 final query가 처음 도착 → memory에서 회상해 target 출력.
- 결과: 30 scenario / 97 simple test에서 95개 정답. 2 misses 모두 semantic-adjacent (microwave↔oven, cabinet↔fridge).
- Rare fixture 100% 회복: oven 0%→100%, freezer 0%→100%, dishwasher 0%→100% — Tier-3a 데이터 분포가 자연스럽게 균형 (cabinet 47%→21%).
1 Tier-2의 진단된 문제: GT leak
Tier-2 builder의 prior chunk supervision 코드:
for chunk_idx, seg in enumerate(all_segs):
seg_test = test_for_task_idx.get(int(seg["task_idx"]))
chunk_atomic = atomic_from_segment(seg, seg_test=seg_test) # ← LEAK
seg_test 매칭 시 atomic_from_test()로 떨어져 final answer GT를 prior chunk에서도 emit하게 학습됨. 매 chunk에서 model이 final query 답을 미리 알고 출력하는 분포. token_acc는 99.96%로 거의 완벽하지만 실제 fixture accuracy는 44.8%에 머무름 (cabinet bias).
사용자 직접 지적 (260515): "제공된 비디오가 끝나기 전까지 지금 쓰고 있는 GT는 나오면 안돼. ... 그러가다 그렇게 수행된 메모리를 가지고 마지막에 진짜 goal을 내뱉고 그걸 평가하는거지." → builder 재설계 결정.
2 Tier-3a 디자인: 2-turn watching → recall
{
"messages": [
{"role": "system", "content": "You are MemER, a video-language model..."},
{"role": "user", "content": "Watch this kitchen activity. Frames: [<image> × N]"},
{"role": "assistant", "content": "Observed sub-tasks:\n1. pick the steak from the fridge and place it on the freezer\n2. pick the bowls from the counter and place it in the cabinet\n3. pick the wooden spoons from the counter and place it in the cabinet"},
{"role": "user", "content": "Show me where the steak is placed."}, ← Final query enters HERE
{"role": "assistant", "content": "place the steak in the freezer"}
],
"images": [...44 frames in chronological order...]
}
- Turn 1 (Watching): 영상 frames만 보여줌. assistant는 PnP segment를 instruction 텍스트로부터 추출해 enumerate. eval_spec 전혀 안 봄.
- Turn 2 (Recall): 영상 끝난 후에야 final query 도착. assistant는 Stage-1 list에서 query object 매칭 → 그 fixture 추출 →
place the X in the Y 형식으로 답.
- Atomic 정규화: instruction의 trailing fixture noun (e.g. "any shelf in the freezer" → "freezer")만 사용해 final answer 형식과 align.
- Deployment:
policy.reset()에서 Stage-1 emit + 캐싱 → get_action()에서 query 도착하면 Stage-2 호출. 2 MemER 호출로 자연스럽게 매핑.
2.1 Dataset 분포 변화
| Fixture | Tier-2 train | Tier-3a train |
| cabinet | 47% (편향) | 21% (균형) |
| microwave | 9% | 29% |
| toaster_oven | 7% | 16% |
| freezer | 7% | 11% |
| fridge | 10% | 7% |
| oven | 5% | 6% |
| dishwasher | ~1% | 5% |
| sink | 3% | 5% |
builder가 eval_spec.target.fixture (각 test마다) 그대로 사용 → 데이터셋 자체의 fixture 분포가 그대로 학습 분포가 됨.
3 학습 — `swift sft` LoRA
Resume from: ~/ckpts/robocasa-memer-tier1-v2-merged (vocab swap baseline)
Dataset : data/scene_mem_tier3a/train.jsonl (2,713 samples / 858 scenarios)
Hardware : SLURM job 3283, 4 GPU (n11), 32 CPU
Hyperparams : LoRA r=16/α=32, max_length=16384, lr=5e-5, 3 epoch
IMAGE_MAX_TOKEN_NUM=128
Elapsed : 22 min 06 sec ← Tier-2 (1h 6m) 대비 3× 빠름 (seq 17K → 7K)
Final : eval_loss=0.00470, eval_token_acc=0.99832
학습 안정적 수렴. eval@249 (3 epoch 종료) loss=0.00470 / acc=0.9983.
Tier-2 (eval_loss 0.00171) 대비 약간 높은 loss는 task가 더 어렵기 때문 — Tier-2는 token copy로 떨어졌지만 Tier-3a는 진짜 video-grounded recall. Loss 절대값보다 downstream fixture accuracy가 의미 있음.
4 결과 — fixture accuracy 97.9%
4.1 Per-fixture recall comparison
회색 = Tier-2 (V1 probe, 1-turn). 초록 = Tier-3a (2-turn probe). Rare fixture 모두 100%로 회복.
| Fixture | Tier-3a hits | Recall | Tier-2 Recall | Δ |
| toaster_oven | 14/14 | 100% | 50% | +50%p |
| fridge | 10/10 | 100% | 0% | +100%p |
| dishwasher | 9/9 | 100% | 0% | +100%p |
| freezer | 8/8 | 100% | 0% | +100%p |
| oven | 8/8 | 100% | 0% | +100%p |
| sink | 4/4 | 100% | — | — |
| microwave | 24/25 | 96% | 40% | +56%p |
| cabinet | 18/19 | 95% | 89% | +6%p |
| Total | 95/97 | 97.9% | 44.8% | +53.1%p |
4.2 Confusion matrix
대각선 95개. Off-diagonal 단 2개. cabinet/microwave 컬럼에 fallback 거의 사라짐.
4.3 2 misses 상세
| scenario | object | GT | Pred | 비고 |
| combo_035_L34_S41_0781 | chicken_drumstick | microwave | oven | 둘 다 heating, semantic 인접 |
| combo_040_L46_S16_0797 | sweet_potato | cabinet | fridge | vegetable 예측 시 fridge로 일반화 |
Stage-1 list에서 해당 object가 없는 경우 (예: combo_002 test 2의 fish는 Stage-1에 enumerate 안 됨)에도 정답 emit. 즉 model이 단순 list lookup이 아니라 image evidence + memory를 결합해 recall하고 있음.
5 combo_002 walkthrough — 3 model 비교
Stage 1 (Tier-3a watching response):
1. pick the steak from the fridge and place it on the freezer
2. pick the bowls from the counter and place it in the cabinet
3. pick the wooden spoons from the counter and place it in the cabinet
| Test (GT fixture) | Tier-1 V2 (single-turn) | Tier-2 (cascade) | Tier-3a (2-turn) |
| steak → freezer | ...place it in the sink ❌ | place the steak in the cabinet ❌ | place the steak in the freezer ✅ |
| bowl → cabinet | ...place it in the sink ❌ | place the bowl in the cabinet ✅ | place the bowl in the cabinet ✅ |
| fish → oven | ...place it in the sink ❌ | place the fish in the freezer ❌ | place the fish in the oven ✅ |
fish의 경우 Stage-1 list에는 명시적으로 나오지 않음 (subtasks.json의 OvenBroilFish 자체가 PnP-form regex에 매칭되지 않아 enumerate 제외). 그럼에도 Test 2에서 oven 정확히 emit — image evidence + scene 이해.
6 Takeaway + Next
Takeaway
- GT leak 제거 + 2-turn 분리가 핵심. Tier-2의 token-copy 학습이 fixture accuracy 한계를 만들었음.
- 데이터 분포 자동 균형. 858 scenario × 평균 3 test에서 cabinet 21%만 차지 — Tier-2 builder의 prior-chunk-leak로 인한 47% 편향과 대조.
- 학습 비용 절감 (1h 6m → 22m). seq 길이 17K → 7K로 절반 이하. 같은 결과면 더 빠르고 싸게.
- memory_success 측정은 아직 미해결. cascade의 PI05_STUB=0 실제 Pi0.5 inference 필요.
Next priorities
- P0: 영상 시각화 — Stage 1 list overlay + per-test Q&A 표시 영상 렌더링
- P1: MemerPi05Policy에 2-turn 분기 추가 (memer_worker에
op: "watch" + op: "query") → 실제 cascade에서 Tier-3a 작동 검증
- P2: 진짜 Pi0.5 cascade (
PI05_STUB=0) → memory_success 정량
- P3: 858 전체 sweep (SLURM batch, 4-8 worker)
- P4: 2 misses 분석 — chicken_drumstick/microwave vs sweet_potato/cabinet → 추가 augment 필요한지