19. 언어로 시키는 로봇 — 데이터 공장을 차리고, 보기 좋게 실패했습니다

시즌 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개가 매번 무작위 위치에 놓입니다 (위 카메라는 다음 편에서 추가됩니다. 여기서는 장면을 보여 주기 위해 빌려 썼습니다)

조합은 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는 성공을 보증하지 않습니다.
  • 실패의 결은 분명합니다. 순서는 외웠고 눈은 안 떴습니다.
  • 그리고 진단 도구가 두 번 고장 났습니다.

다음 편에서는 “그러면 뭘 더 주면 되나”를 세 번 시도하고 세 번 다 기각당합니다. 그 세 번의 기각이 있어야 진짜 원인에 도달하는데, 미리 말씀드리면 원인은 우리가 준 것에 있지 않고 정책이 무엇을 보지 않기로 했는가에 있었습니다.

로봇에게 “빨간 걸 파란 데 올려”라고 말했더니 빨간 것도 파란 것도 안 보고 허공에서 아주 정확한 시간표대로 춤을 췄습니다. 시키는 대로 하긴 했습니다. 시간표대로요.


이 시리즈의 전체 글 목록 → 시리즈 목차

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.