시즌 3의 시작입니다. 18편까지는 “걷게 만들고 의심하기”였다면, 이번에는 과제가 통째로 바뀝니다. 걷기가 아니라 테이블 위 물건 옮기기, 강화학습이 아니라 모방학습, 관절 숫자가 아니라 카메라와 문장입니다. 이 편에서는 데이터 공장을 세우고 첫 정책을 학습시킨 뒤, loss가 100배 떨어졌는데 성공률이 0인 상황을 만납니다.
왜 갑자기 팔인가요
시즌 1~2의 G1은 이제 걷고, 돌고, 밀쳐도 버티고, 16cm 계단을 오릅니다. 잘하는데, 한 가지를 못 합니다. 시키는 대로 하지 못합니다. 우리가 준 명령은 늘 숫자였습니다. 전진 속도 0.8, 회전 0.5. “빨간 블록을 파란 받침에 올려”라고 말할 수 있는 통로가 없습니다.
2026년의 로봇 학습이 몰려가는 곳이 정확히 거기입니다. 카메라 이미지와 사람 말을 받아서 행동을 내놓는 모델, 이른바 VLA(Vision-Language-Action)입니다. 시뮬레이터가 있고 GPU가 한 장 있으면 집에서도 전체 루프를 돌려볼 수 있는 크기의 모델이 나와 있습니다. 그래서 시즌 3의 1단계를 이렇게 잡았습니다. 환경 만들기 → 시연 수집 → 파인튜닝 → 평가.
개념 박스: 강화학습과 모방학습 강화학습은 로봇이 직접 넘어져 가며 배웁니다. 보상을 주면 그 보상을 최대로 만드는 행동을 스스로 찾아냅니다. 시즌 1~2가 이 방식이었습니다. 모방학습은 정답 시연을 보여 주고 따라 하게 합니다. “이 상황에서는 이 행동”의 짝을 잔뜩 모아 지도학습으로 흉내 내게 합니다. 사람이 조종한 데이터를 쓸 수 있어 실제 로봇 팔 분야에서는 이쪽이 주류입니다. 대신 시연에 없는 상황에는 약합니다.
준비 운동에서 한 번 창피했습니다
인터넷 소개 글에는 “Genesis 1.4가 로봇 학습 표준 포맷 내보내기를 지원한다”고 적혀 있었습니다. 그 말을 믿고 계획서를 썼는데, 실제로 패키지를 뒤져 보니 그런 기능은 없었습니다. 릴리스 노트 1.1부터 1.4까지 직접 확인했습니다. 그건 같은 이름을 쓰는 상용 플랫폼 쪽 기능이었고, 오픈소스에 들어온 데이터 기능은 자체 포맷 궤적 녹화뿐이었습니다.
다리는 우리가 놓았습니다. 시뮬레이터에서 궤적을 npz로 뽑고, 학습 라이브러리 쪽 API로 직접 기록하는 경로를 만들어 왕복 검증까지 마쳤습니다. 저장한 숫자가 다시 읽었을 때 1e-6 안에서 같고, 배치 추출까지 정상이면 통과입니다.
준비 운동에서 함정도 하나 밟았습니다. 시뮬레이터에 내장된 Franka 로봇 팔의 손가락은 기본 설정에서 힘이 사실상 0입니다. 그대로 쓰면 손가락이 흘러내린 채 큐브를 밀고 다닙니다. 첫 수집 세 번을 그렇게 날리고 나서야 게인을 명시해 줘야 한다는 걸 알았습니다.
데이터 공장 — 3초에 한 편씩
장면은 이렇게 짰습니다.
- 탁자 위에 색 큐브 3개(빨강, 초록, 노랑)와 받침 2개(파랑, 보라)
- 매번 위치를 무작위로 뽑되 서로 겹치지 않게
- 지시문은 “Put the {색} cube on the {색} pad.”
- 카메라는 비스듬한 측면 1대(뒤에서 3대로 늘어납니다)

조합은 3 × 2 = 6가지인데, 그중 (노랑 큐브, 보라 받침) 한 조합은 학습에서 뺐습니다. 이 조합만 평가에 씁니다. 노랑도 봤고 보라도 봤지만 둘을 함께 본 적은 없는 상태에서 “노랑을 보라에 올려”가 되는지 보려는 겁니다.
개념 박스: 홀드아웃 학습에서 일부러 빼 두고 평가에만 쓰는 몫입니다. 시험 범위에서 제외한 문제를 시험에 내는 셈이라 야박해 보이지만, 외운 것과 이해한 것을 가르는 가장 싼 방법입니다.
시연은 사람이 아니라 스크립트 전문가가 만듭니다. 물체 좌표를 알고 있으니 역기구학으로 손 위치를 계산해 접근-하강-파지-인양-이동-하강-놓기-후퇴 8구간을 고정 시간표대로 수행합니다. 편당 약 3초, 성공률 300/300. 하룻밤이면 수천 편도 만들 수 있는 공장입니다.

이 “완벽함”이 나중에 우리 발목을 잡습니다. 지금은 넘어갑시다.
첫 학습 — loss는 아름다웠습니다
모델은 SmolVLA(약 4억 5천만 파라미터)를 골랐습니다. 16GB GPU에서 여유 있게 돌아가는 크기입니다. 300편으로 2만 스텝을 학습시켰습니다.
| 항목 | 값 |
|---|---|
| 학습 속도 | 1.38 step/s |
| VRAM | 6.9GB / 16GB |
| 학습 loss | 2.23 → 0.023 (100배 감소) |
곡선이 교과서처럼 매끄럽게 내려갔습니다. 기분이 좋아진 채로 평가 배터리를 돌렸습니다. 학습에 쓴 5조합 각 5회, 홀드아웃 5회. 총 30회.
성공 0회입니다.
실패에도 결이 있습니다
“완전 실패”라고 적고 넘어가면 아무것도 안 남습니다. 어떻게 실패하는지가 다음 실험을 정하니까요. 네 단계로 파고들었습니다.
하나, 행동을 눈으로 봅니다. 정책은 하강하고, 손가락을 오므리고, 옮기고, 놓습니다. 순서는 완벽합니다. 위치만 엉뚱합니다. 전문가의 고정 시간표를 통째로 외운 것이고, 눈은 뜨지 않은 상태입니다.

전체 영상:
둘, 이미지가 모델에 들어가기는 하는지 봅니다. 배선이 끊겼을 수도 있으니까요. 진짜 이미지, 새까만 이미지, 옆으로 민 이미지를 넣고 출력을 비교했더니 최대 0.78 rad 차이가 납니다. 이미지는 들어갑니다. 배관 문제는 아닙니다.
셋, 얼마나 보는지 숫자로 잽니다. 큐브를 y축으로 +24cm와 −24cm에 놓고 같은 순간 손끝이 얼마나 따라 움직이는지 쟀습니다. 완전히 보고 있다면 약 48cm 차이가 나야 합니다. 측정값은 −3.5cm였습니다. 거의 안 봅니다.
넷, 눈 자체의 성능을 봅니다. 이미지 인코더가 뽑은 특징에서 큐브 위치를 선형 회귀로 맞혀 봤습니다. 처음 나온 결정계수가 −37이었습니다. 0이면 평균만 찍는 수준인데 그보다 한참 나쁩니다.
진단 도구가 먼저 고장 났습니다
−37은 “이미지에 정보가 없다”는 뜻이 아니었습니다. 회귀가 망가진 것이었습니다. 특징은 1920차원인데 표본은 240개, 정규화가 약하니 과적합으로 터진 겁니다. 정칙화 세기를 훑고 다시 재니 결정계수 0.68 / 0.79, 평균 오차 8.6cm가 나왔습니다. 위치 정보는 상당히 있었습니다.
비슷한 사고가 한 번 더 있었습니다. 접지 프로브를 체크포인트마다 한 번씩 재고 “학습이 진행되면서 조금씩 보기 시작한다”고 기록했다가, 곧 철회했습니다. 이 정책은 행동을 확률적으로 뽑습니다. 같은 가중치, 같은 장면인데 실행할 때마다 답이 다릅니다. 5회씩 다시 재 봤습니다.
| 체크포인트 | 접지율 평균 | 표준편차 |
|---|---|---|
| 5k | 13% | 9%p |
| 10k | 23% | 14%p |
| 15k | 30% | 23%p |
| 20k | 6% | 16%p |
표준편차가 평균만큼 큽니다. 추세라고 부를 게 없습니다. 한 번 재고 그린 그래프는 그래프가 아니라 낙서였습니다.
이 시리즈의 오래된 교훈이 또 나왔습니다 10편에서 “영상은 검증이 아니다, 수치 잣대로 재라”고 적었습니다. 이번엔 그 수치 잣대 자신이 고장 나 있었습니다. 진단 도구부터 진단하십시오. 아는 답이 있는 곳에서 먼저 돌려 보고, 한 번 재고 판정하지 마십시오.
이번 편에서 남은 것
- 언어로 시키는 픽앤플레이스 환경과, 3초에 한 편씩 찍어내는 데이터 공장이 생겼습니다.
- 첫 정책은 loss 0.023에 성공률 0/30입니다. 낮은 loss는 성공을 보증하지 않습니다.
- 실패의 결은 분명합니다. 순서는 외웠고 눈은 안 떴습니다.
- 그리고 진단 도구가 두 번 고장 났습니다.
다음 편에서는 “그러면 뭘 더 주면 되나”를 세 번 시도하고 세 번 다 기각당합니다. 그 세 번의 기각이 있어야 진짜 원인에 도달하는데, 미리 말씀드리면 원인은 우리가 준 것에 있지 않고 정책이 무엇을 보지 않기로 했는가에 있었습니다.
로봇에게 “빨간 걸 파란 데 올려”라고 말했더니 빨간 것도 파란 것도 안 보고 허공에서 아주 정확한 시간표대로 춤을 췄습니다. 시키는 대로 하긴 했습니다. 시간표대로요.
이 시리즈의 전체 글 목록 → 시리즈 목차