테이블에 고정된 Franka Panda가 닫은 그리퍼 아래 둥근 말렛으로 파란 퍽을 쳐서, 빨간 목표 원(반경 5cm) 위에 멈추게 한다. 한 에피소드는 같은 숨은 물성으로 5번 시도한다. EmbodiedSWE의 robobench(Isaac Lab 2.3, Isaac Sim 5.1)에 scene을 런타임 등록해서 쓴다.
| 숨은 변수 | 학습 범위 | 처음 보는 범위(보간) | 범위 밖(외삽) |
|---|---|---|---|
| 퍽-테이블 마찰 | 0.012–0.040 | 0.030–0.035 | 0.009–0.012, 0.040–0.046 |
| 퍽 질량 [kg] | 0.10–0.30 | 0.22–0.26 | 0.07–0.10, 0.30–0.38 |
| 테이블 경사 [°] | 0–0.35 | 0.15–0.22 | 0.35–0.42 |
목표까지 거리 0.22–0.38m, 방향 ±30°. 시도마다 마찰 3% 변동과 퍽 위치 2mm 이동을 넣었고, GPU 물리 자체의 비결정성도 있다.
규모: 12,288 에피소드(64개 병렬 환경 × 192 샤드, 70GB). 에피소드 하나 = 숨은 물성과 배치를 고정하고 컨텍스트 시도 4회 + 오라클 시연 1회. 총 61,440번의 스윙을 Isaac에서 실행했다. 생성 속도는 64 에피소드당 85~100초(B200 1장), 4개 잡으로 약 1시간 20분.
| 에피소드에 저장되는 것 | 형태 | 용도 |
|---|---|---|
| 컨텍스트 시도 영상 (front) | 4 × 8프레임 × 224×224×3 | 과거 시도 토큰의 영상 |
| 컨텍스트 시도의 관절 목표 궤적 | 4 × 64스텝 × 7 | 과거 시도 토큰의 "실행한 action" |
| 컨텍스트 시도의 로봇 state 궤적 | 4 × 65스텝 × 10 | 과거 시도 토큰의 손 위치 궤적 |
| 컨텍스트 시도의 퍽 정지 위치 | 4 × 2 | 수치 결과를 쓰는 변형(VAN, AN)에만 |
| 오라클 시연 관측 (front + wrist) | 4시점 × 224×224×6 | 현재 관측 입력 |
| 오라클 시연 state / 관절 목표 | 65 × 10 / 64 × 7 | state 입력 / 정답 라벨 |
| 숨은 물성, 배치, 오라클 스윙 파라미터 | 스칼라들 | 분석용(정책에는 주지 않음) |
스윙은 방향 θ와 접촉 속도 v 두 값으로 정해지는 스크립트 동작이다: 준비 자세 → 퍽 뒤 8cm 지점으로 이동(0.5초) → θ 방향으로 가속해 v에 도달 → 퍽을 6cm 밀고 → 4cm 안에 급정지해서 퍽을 떠나보낸다. 이 손 경로를 미분 IK로 관절 목표 궤적(25Hz, 64스텝)으로 바꾼 것이 action이다. 에피소드마다 "진짜 물성에서 퍽이 목표에 멈추는 (θ, v)"를 Broyden 방법으로 탐색한다(배치 시도 8회). 탐색 잔차는 평균 0.38cm, 99퍼센타일 1.38cm이고(3,072개 표본), 찾은 스윙을 다시 실행했을 때 12,288개 중 12,252개(99.7%)가 목표 안에 멈췄다. 학습에는 성공한 시연만 쓴다.
정책이 "이전에 이렇게 쳐 봤더니 이렇게 됐다"로 읽을 재료다. 오라클 스윙의 속도에 3–50% 크기의 무작위 오차(로그 정규), 방향에 그에 비례하는 오차를 넣은 스크립트 스윙이고, 에피소드의 절반은 첫 시도를 평균 마찰 가정 스윙으로 했다. 시도마다 마찰 3% 변동과 퍽 2mm 이동이 들어간다. 컨텍스트 시도의 속도 오차는 평균 |log(v/v*)| 0.18~0.20, 정지 위치 오차 중앙값 7.5cm, 시도별 성공률 약 34%다(3,072개 표본).
분할: 학습 데이터는 학습 범위에서만 뽑는다(보간 띠 제외). 마지막 600 에피소드는 검증용. 평가 에피소드는 다른 시드로 새로 뽑는다.
| 구성 요소 | 구조 | 파라미터 |
|---|---|---|
| 관측 CNN | conv 5층(stride 2, 5×5, 32-64-128-256-256, GroupNorm+SiLU) + 좌표 채널, 7×7 펼쳐서 FC → 256 | 6.00M |
| 과거 영상 CNN | 같은 구조, 입력 24채널(8프레임을 채널로 쌓음) | 6.01M |
| 궤적 MLP / state MLP | 320 → 512 → 256 / 10 → 256 → 256 | 0.30M / 0.07M |
| 트랜스포머 / 출력 head | 4층 d=256 / LayerNorm → 512 → 224(=32×7) | 3.16M / 0.25M |
| 합계 | 주 모델(영상+행동) 15.79M, 기억 없는 정책 9.48M |
학습 문제: 표본 = (에피소드, 과거 시도 수 k ∈ 0–4, 질의 시점 j ∈ 0–3). 입력은 오라클 시연의 j번째 관측·state와 저장된 컨텍스트 시도 앞 k개, 정답은 오라클 시연의 다음 32스텝 관절 목표. 모델은 컨텍스트 시도를 따라 하도록 배우지 않는다. 그것을 읽고 오라클이 했을 동작을 맞히도록 배운다.
| 검증 오차 (정규화 chunk MSE) | 과거 시도 0개 | 1개 | 2개 | 3개 | 4개 |
|---|---|---|---|---|---|
| 영상+행동 (주 모델) | 0.00744 | 0.00055 | 0.00036 | 0.00030 | 0.00027 |
| 영상만 | 0.00747 | 0.00064 | 0.00043 | 0.00036 | 0.00033 |
| 영상+행동+수치 | 0.00743 | 0.00062 | 0.00039 | 0.00032 | 0.00028 |
| 행동+수치 (영상 없음) | 0.00769 | 0.00095 | 0.00061 | 0.00047 | 0.00042 |
| 기억 없는 정책 | 0.00832 | (과거 시도를 보지 않음) | |||
저장된(스크립트) 컨텍스트로 재면 과거 시도 하나만 봐도 오차가 13배 줄어든다. 이 이득이 폐루프 성공률로 이어지지 않는 것이 5절의 핵심 문제다.
평가 방식: 64개 병렬 환경에서 정책을 폐루프로 실행한다. 시도마다 4번(0, 0.64, 1.28, 1.92초) 카메라를 렌더하고 state를 읽어 chunk를 받고, 관절 목표를 25Hz로 실행한다. 2.56초 뒤 팔은 멈추고 퍽이 설 때까지 기다린다. 다음 시도에는 방금 시도의 영상 8프레임과 실행 궤적이 컨텍스트로 들어간다. 모든 정책이 같은 에피소드와 같은 시도별 변동을 쓴다.
세 칸은 같은 에피소드(같은 숨은 물성, 같은 시도별 변동)다. 왼쪽은 물성을 아는 오라클 스윙, 가운데가 히스토리 정책, 오른쪽이 기억 없는 정책. 평가용 시드의 처음 세 에피소드를 고르지 않고 실었다.
이 묶음 16개에서 첫 성공 시도는 히스토리 정책 [1, 1, 4, 실패, 1, 2, 1, 1, 1, 3, 1, 1, 1, 5, 1, 실패], 기억 없는 정책 [2, 1, 3, 2, 1, 3, 1, 1, 실패, 1, 1, 4, 실패, 2, 1, 실패]다. 장난감 버전처럼 "2~3번째에 확실히 고쳐 맞히는" 모습이 아니라, 두 정책 모두 맞을 때도 있고 빗나갈 때도 있다.
| 3차까지 누적 성공률 (%) | 학습 범위 | 보간 | 외삽 |
|---|---|---|---|
| 오라클 스윙(물성 앎) | 97.8 | 100.0 | 93.4 |
| 히스토리 정책 (영상+행동) | 49.4 | 67.2 | 42.2 |
| 같은 모델, 히스토리 삭제 | 41.2 | 71.6 | 33.1 |
| 같은 모델, 다른 물성의 히스토리 | 38.8 | 60.6 | 32.5 |
| 영상만 | 50.3 | 67.2 | 39.4 |
| 행동+수치 결과(영상 없음) | 39.1 | 57.5 | 38.8 |
| 기억 없는 정책 | 29.1 | 64.7 | 26.6 |
| 평균 마찰 가정 스크립트 스윙 | 41.6 | 26.9 | 0.3 |
| 히스토리 − 기억 없음 (대응, %p) | +20.3 [13.4, 27.5] | +2.5 [−4.4, 9.4] | +15.6 [9.7, 21.6] |
| 정책 | 1차까지 | 2차까지 | 3차까지 | 4차까지 | 5차까지 |
|---|---|---|---|---|---|
| 오라클 스윙(물성 앎) | 97.8 [96, 99] | 97.8 [96, 99] | 97.8 [96, 99] | 97.8 [96, 99] | 97.8 [96, 99] |
| 히스토리 정책: 영상+행동 (주 모델) | 24.4 [20, 29] | 40.9 [35, 46] | 49.4 [44, 55] | 54.4 [49, 60] | 58.1 [53, 64] |
| 히스토리: 영상만 | 23.8 [19, 28] | 39.1 [34, 45] | 50.3 [45, 56] | 54.1 [48, 60] | 59.1 [53, 65] |
| 히스토리: 영상+행동+수치 결과 | 22.2 [18, 27] | 33.8 [28, 39] | 41.2 [36, 47] | 45.9 [40, 52] | 48.4 [43, 54] |
| 히스토리: 행동+수치 결과(영상 없음) | 22.2 [18, 27] | 31.9 [27, 37] | 39.1 [34, 44] | 45.0 [40, 50] | 50.3 [45, 56] |
| 주 모델, 히스토리 삭제 | 21.2 [17, 26] | 35.0 [30, 40] | 41.2 [36, 47] | 45.3 [40, 51] | 50.9 [46, 56] |
| 주 모델, 다른 물성의 히스토리 | 21.9 [17, 27] | 33.8 [28, 39] | 38.8 [33, 44] | 41.2 [36, 47] | 44.7 [39, 50] |
| 기억 없는 정책 | 14.7 [11, 19] | 24.1 [19, 29] | 29.1 [24, 34] | 34.1 [29, 39] | 40.9 [36, 46] |
| 평균 마찰 가정 스크립트 스윙 | 35.6 [30, 41] | 40.6 [36, 46] | 41.6 [37, 47] | 42.8 [38, 48] | 42.8 [38, 48] |
| 정책 | 1차까지 | 2차까지 | 3차까지 | 4차까지 | 5차까지 |
|---|---|---|---|---|---|
| 오라클 스윙(물성 앎) | 100.0 [100, 100] | 100.0 [100, 100] | 100.0 [100, 100] | 100.0 [100, 100] | 100.0 [100, 100] |
| 히스토리 정책: 영상+행동 (주 모델) | 46.6 [41, 52] | 62.5 [57, 68] | 67.2 [62, 72] | 69.4 [64, 74] | 72.2 [67, 77] |
| 히스토리: 영상만 | 49.1 [44, 55] | 60.6 [55, 66] | 67.2 [62, 72] | 71.6 [67, 76] | 76.2 [72, 81] |
| 히스토리: 영상+행동+수치 결과 | 50.3 [45, 56] | 61.3 [56, 67] | 67.8 [62, 73] | 68.8 [63, 74] | 70.3 [65, 75] |
| 히스토리: 행동+수치 결과(영상 없음) | 40.6 [35, 46] | 51.6 [46, 57] | 57.5 [52, 63] | 63.7 [58, 69] | 65.9 [61, 71] |
| 주 모델, 히스토리 삭제 | 46.6 [42, 52] | 60.0 [55, 65] | 71.6 [67, 76] | 80.3 [76, 84] | 82.8 [79, 87] |
| 주 모델, 다른 물성의 히스토리 | 44.4 [39, 50] | 57.2 [52, 63] | 60.6 [55, 66] | 63.7 [58, 69] | 65.0 [59, 70] |
| 기억 없는 정책 | 35.6 [31, 41] | 53.4 [48, 59] | 64.7 [59, 70] | 67.2 [62, 72] | 72.2 [67, 77] |
| 평균 마찰 가정 스크립트 스윙 | 18.8 [14, 23] | 21.6 [17, 26] | 26.9 [22, 32] | 30.3 [25, 35] | 33.4 [28, 38] |
| 정책 | 1차까지 | 2차까지 | 3차까지 | 4차까지 | 5차까지 |
|---|---|---|---|---|---|
| 오라클 스윙(물성 앎) | 90.3 [87, 93] | 92.8 [90, 95] | 93.4 [91, 96] | 94.1 [92, 97] | 94.1 [92, 97] |
| 히스토리 정책: 영상+행동 (주 모델) | 18.8 [14, 23] | 33.4 [28, 38] | 42.2 [37, 48] | 45.6 [40, 51] | 48.1 [42, 53] |
| 히스토리: 영상만 | 17.8 [14, 22] | 31.6 [26, 37] | 39.4 [34, 45] | 44.7 [39, 50] | 46.6 [41, 52] |
| 히스토리: 영상+행동+수치 결과 | 23.8 [19, 28] | 34.7 [30, 40] | 43.1 [38, 48] | 44.1 [39, 49] | 47.2 [42, 53] |
| 히스토리: 행동+수치 결과(영상 없음) | 17.5 [13, 22] | 29.1 [24, 34] | 38.8 [34, 44] | 42.8 [38, 48] | 45.6 [40, 51] |
| 주 모델, 히스토리 삭제 | 15.9 [12, 20] | 28.7 [24, 34] | 33.1 [28, 38] | 36.6 [31, 42] | 38.8 [33, 44] |
| 주 모델, 다른 물성의 히스토리 | 21.2 [17, 26] | 30.0 [25, 35] | 32.5 [27, 38] | 34.4 [29, 39] | 35.9 [31, 41] |
| 기억 없는 정책 | 13.8 [10, 18] | 20.6 [16, 25] | 26.6 [22, 32] | 29.7 [25, 35] | 31.6 [27, 37] |
| 평균 마찰 가정 스크립트 스윙 | 0.3 [0, 1] | 0.3 [0, 1] | 0.3 [0, 1] | 0.3 [0, 1] | 0.3 [0, 1] |
괄호는 95% 부트스트랩 신뢰구간(에피소드 재표집 2,000회). 누적 성공률 = 그 시도까지 한 번이라도 목표 안에 멈춘 에피소드 비율.
| 정책 | 0x | 1x | 2x | 3x |
|---|---|---|---|---|
| 오라클 스윙 | 100.0 | 100.0 | 99.7 | 98.4 |
| 히스토리 정책 | 69.1 | 67.2 | 66.6 | 63.1 |
| 기억 없는 정책 | 60.6 | 64.7 | 65.0 | 63.7 |
1x = 마찰 3% 변동 + 퍽 2mm 이동. 변동을 3배로 키워도 오라클이 98.4%라서 이 과제에서 시도별 변동은 거의 영향이 없다. 정책 성공률이 변동 크기와 무관하게 60~69%인 것은 한계가 정책 출력 쪽에 있다는 뜻이다.
수정 이력: 첫 버전(v1)은 시연 action이 "현재 관절 + 피드백 보정"이라 상태 차이에 민감했고 격차가 +11.7 / +5.5 / +9.0%p였다. 시연을 매끄러운 계획 궤적(절대 관절 목표)으로 바꾸고 chunk를 16 → 32스텝으로 늘린 것이 지금 수치(v2, +20.3 / +2.5 / +15.6%p)다.
추상 타격 버전(로봇 없음, 타격 파라미터 2개)에서는 히스토리 정책이 3번 안에 87~90%, 기억 없는 정책이 0%였다. 현실적인 설정으로 옮기자 그 격차가 대부분 사라졌는데, 적응 능력이 없어서가 아니라 (1) 정책이 관절 궤적을 정밀하게 내지 못하고 (2) 자기 시도를 컨텍스트로 받는 상황을 학습 때 본 적이 없기 때문으로 보인다. 즉 "기억을 쓰면 된다"는 가설 자체보다, 그것을 visuomotor 정책에서 실현하는 데 필요한 조건이 드러난 결과다. 또 로봇 팔이 영상에 보이면 영상만으로도 행동을 읽을 수 있어서, 영상만 준 모델이 영상+행동 모델과 같은 수준이다.
한계: 과제 1개(퍽), 학습 시드 1개, 분할당 320 에피소드. 히스토리 삭제·바꿔치기와의 차이는 점 추정이다. 코드 try-and-suc/isaac/, 수치 results_isaac/summary.md, v1 결과 results_isaac_v1/.