hello, robot

이번 인사이트의 재료는 세 편이에요. 샤오미 로보틱스의 XR-1, OMRON SINIC X의 Hand Visibility Detector, UCSD의 FACT예요. 다루는 층이 데이터 수집과 관측, 정책으로 제각각인데 나란히 놓으니 같은 동작이 보였어요. 셋 다 한 덩어리로 묶여 있던 것을 떼어내는 데서 출발해요.

떼어낸 이유는 서로 달랐어요. 붙어 있으면 잴 수 없었고, 넣을 수 없었고, 키울 수 없었어요.

붙어 있으면 잴 수 없어요

얼린 손 포즈 백본에 헤드만 얹은 Hand Visibility Detector가 이 구조를 가장 선명하게 보여줘요. 손 포즈 추정 모델은 21개 관절 좌표를 언제나 내놓아요. 손등에 가려진 관절도, 물체 뒤로 들어간 관절도, 화면 밖으로 나간 관절도 값이 나와요. 그 값이 실제로 관측된 것인지 손 구조에서 추론된 것인지는 출력만 봐서는 갈리지 않아요.

가림을 다루는 연구가 없던 건 아니에요. 다만 대부분 가시성을 포즈 정확도를 올리기 위한 보조 신호로 썼어요. 그러면 가시성 추정 자체가 얼마나 맞는지는 직접 평가되지 않고 최종 포즈 정확도로만 간접 확인돼요. 지표 하나에 딸려 있는 동안에는 그 부품이 어디서 무너지는지 알 방법이 없어요.

떼어내서 직접 재기 시작하니 바로 드러나는 게 있었어요. 이 논문은 사전학습된 백본을 그 값 그대로 얼리고 위에 가벼운 가시성 헤드만 얹는데, 학습하는 파라미터가 631M 모델의 0.83M으로 0.131%뿐이에요. 백본을 바꿔 가며 돌린 절제 실험에서 최근 범용 이미지 모델 중 가장 강한 DINOv3가 840M 파라미터로 mAP 0.897인데, 손 특화 모델을 얼려 쓴 쪽이 0.931이에요. 규모가 아니라 무엇을 보고 배운 백본인지가 이 과제를 가른다는 뜻인데, 가시성을 독립 지표로 재기 전에는 물어볼 수조차 없던 질문이에요.

얼린 백본에서 특징을 뽑고 가벼운 가시성 헤드만 학습해요. 왼쪽이 전체 파이프라인, 오른쪽이 헤드 구조예요(출처: Hara et al., Hand Visibility Detector · CC BY-SA 4.0)

로봇 쪽에는 이 구조에 대응하는 익숙한 이름이 있어요. 위치추정 노드가 자세 추정값과 함께 공분산을 발행하고, 라이다 드라이버가 거리와 함께 반사 강도(intensity)를 실어 보내는 것처럼, 값과 그 값을 믿어도 되는 정도를 별도 채널로 함께 내보내는 설계예요. 다른 점은 그 별도 채널이 얼마나 맞는지를 이 논문이 처음으로 따로 쟀다는 거예요.

붙어 있으면 넣을 수 없어요

실패 롤아웃을 결과 감독으로 바꾼 행동 조건부 월드-액션 모델 FACT는 데이터 쪽에서 같은 문제를 만나요. 미래 영상을 함께 예측하는 월드-액션 모델은 학습 데이터가 전부 전문가 시연이에요. 모델은 좋은 행동에 짝지어진 그럴듯한 미래만 보고 자라서, 나쁜 행동이 무엇을 부르는지는 한 번도 안 봐요. 그래서 테스트 때 잘못된 행동이 들어와도 여전히 성공 쪽으로 기운 미래를 그려요. 논문은 이걸 성공 편향 환각이라고 불러요.

실패 롤아웃을 학습 데이터에 섞으면 될 것 같지만 그럴 수 없어요. 행동 모방 손실이 그대로 걸려 있으니 실패한 행동을 따라 하도록 배우니까요. 실패 데이터가 없어서 못 넣은 게 아니라 넣을 자리가 없어서 못 넣은 거예요.

FACT가 그 자리를 만드는 방식은 인과 순서를 뒤집는 거예요. 미래를 먼저 그리고 역동역학으로 행동을 되뽑는 대신, 행동을 먼저 제안하고 실제로 실행된 그 행동을 조건으로 미래 영상과 과제 진행도를 예측해요. 미래가 자기를 만든 행동에서 뻗어 나오니, 성공 시연은 행동과 진행도와 미래 셋 다 감독하고 실패 롤아웃은 행동 모방 손실만 떼어낸 채 결과 쪽 감독만 살릴 수 있어요.

왼쪽은 토큰 배치와 참조 관계, 오른쪽은 성공 시연과 실패 롤아웃에 각각 다르게 걸리는 손실 구성이에요(출처: Peng et al., FACT · CC BY-NC-ND 4.0)

효과를 재는 방식이 깔끔해요. 성공만 학습한 체크포인트와 실패를 함께 학습한 체크포인트에 똑같이 나쁜 행동을 조건으로 주고, 각자가 그린 미래를 실제 일어난 일과 비교해요. 실패 롤아웃에서 미래 예측 화질이 19.51 dB에서 25.92 dB로 오르는데, 같은 표에서 성공 롤아웃은 26.12 dB와 26.08 dB로 사실상 그대로예요. 실패 데이터로 얻은 이득이 실패 상황에서만 나왔고 정상 예측 품질을 깎아서 얻은 게 아니라는 뜻이에요.

붙어 있으면 키울 수 없어요

균등 분할과 상태 전이 라벨로 10만 시간을 모은 VLA, XR-1은 수집 쪽이에요. 손에 쥐는 UMI 그리퍼가 로봇 없이 시연을 기록할 수 있게 만들어 수집 장치 문턱은 이미 내려갔는데, 그 뒤에 라벨링이 남아요. 사람이 긴 영상을 과제 의미 단위로 잘라내고 구간마다 지시문을 적는 작업량은 데이터 시간에 그대로 비례해요.

여기서 붙어 있는 것은 자르는 일과 이름 붙이는 일이에요. 과제 이름을 붙이려면 자른 위치가 과제 경계와 맞아야 하니까요. 어중간하게 잘린 조각에는 붙일 이름이 없어요.

XR-1은 라벨링 정확도를 올리는 대신 라벨이 요구하는 조건을 낮춰요. 궤적을 기계적으로 같은 길이 조각으로 자른 뒤, 시각-언어 모델에게 그 조각 안에서 장면이 어떤 상태에서 어떤 상태로 바뀌었는지 서술하게 시켜요. 상태 변화를 적는 라벨은 어디서 잘라도 성립해요. 어떤 조각이든 그 안에서 무언가는 움직였고 그 움직임은 문장이 되니까요. 경계를 정확히 찾는 문제가 경계가 필요 없는 문제로 바뀌면서 10만 시간이 모여요.

가정과 사무실, 공장, 식당, 상업 시설, 야외를 아우르는 사전학습 데이터셋 개요예요(출처: Xiaomi Robotics, Xiaomi-Robotics-1)

대가는 다음 단계가 치러요. 이렇게 학습한 모델이 내놓는 행동은 UMI 그리퍼의 것이지 로봇의 것이 아니고, 조건으로 받는 문장은 사람이 로봇에게 던지는 명령문이 아니라 상태 변화 서술문이에요. 그래서 약 1만 시간의 이종 몸체 데이터로 사후 학습을 붙이는데, 그중 7,200시간 이상이 실제 로봇으로 직접 모은 것이에요. 병목이 사라진 게 아니라 값싼 단계와 비싼 단계로 나뉜 구조예요.

경계를 잘못 그으면 더 나빠져요

여기까지는 셋 다 떼어내서 얻은 이야기예요. 그런데 세 편이 함께 보여주는 두 번째 사실이 더 중요해 보여요. 분리는 어디를 떼느냐가 아니라 떼어낸 두 쪽에 각각 무엇을 먹이느냐로 결정돼요. 선을 잘못 그으면 떼기 전보다 나빠진다는 게 숫자로 나와 있어요.

Hand Visibility Detector에서 백본까지 열어 가시성 과제에 맞춰 파인튜닝하면 mAP가 0.931에서 0.622로 떨어져요. 비교 대상으로 세운 기존 방법 어느 쪽보다도 낮은 값이에요. 가시성 라벨이 붙은 데이터가 학습 25,273 프레임 규모라 백본까지 열면 그 작은 데이터에 과적합되는 구조예요. 떼어내는 데까지는 맞았지만 학습을 어디서 멈출지를 틀리면 사전학습에서 얻은 표현이 망가져요.

FACT의 절제 실험은 같은 이야기를 두 번 해요. 실패 롤아웃을 넣되 행동 모방 손실을 마스킹하지 않으면 실기 성공률이 82%에서 63%로 떨어져요. 반대편 절제는 진행도를 예측하는 값 헤드(value head) 쪽이에요. 행동 후보를 여러 개 뽑아 진행도 점수로 고르는 스코어링을 얹으면 좋아질 것 같지만, 실패 결과를 배우지 않은 모델에 스코어링만 붙이면 79%로 스코어링 없는 89%보다 낮아요. 성공만으로 학습한 값 예측은 전문가 행동 다양체 위에서만 보정돼 나쁜 후보에도 낙관적인 점수를 주기 때문이에요. 순위를 매기는 장치가 생겼다는 것과 그 장치가 쓸모 있다는 것은 다른 이야기예요.

XR-1 쪽에서 대응하는 자리는 아직 덜 재인 채로 남아 있어요. 사전학습과 사후 학습을 나눈 뒤 사후 학습에 얼마가 필요한지는 지금 규모에서 잰 한 점뿐이고, 스케일링 곡선도 10만 시간 전체가 아니라 약 20k 시간 풀 위에서 그려졌어요. 분리의 비용이 규모를 키울 때 어떻게 움직이는지는 이 보고서가 답하지 않아요.

제가 이번 주에 그은 선

여기까지는 학습 파이프라인 이야기인데, 같은 판단은 모델을 전혀 학습시키지 않는 자리에서도 나와요. 이번 주에 실기체 두 대를 브링업하면서 같은 종류의 경계를 세 번 만났어요.

가장 닮은 건 주행 스택의 초기 위치 자동화예요. 완성된 지도 위에서 위치만 푸는 파티클 필터에 초기 위치를 넣어 주는 노드를 만들고 검증까지 붙였는데, 통과했어요. 그런데 제가 준 좌표는 지도 밖이었어요. 시뮬레이터의 스폰 좌표 (−3.12, −3.27)을 그대로 넣었는데 그건 map 프레임 값이 아니었고, 지도의 y 범위는 −2.51부터 시작해요. 검증이 이걸 못 잡은 원인은 자기가 발행한 값을 되읽어 비교하는 순환 구조였다는 거예요. 검증기가 피검증 대상과 같은 소스를 참조하면 무엇을 넣어도 통과해요. 가시성을 포즈 정확도 뒤에 두면 가시성이 얼마나 맞는지 알 수 없다는 것과 같은 자리예요.

그래서 검증 신호를 대상에서 떼어냈어요. 스캔이 지도와 얼마나 맞는지를 독립 지표로 삼고, 일부러 2 m 어긋낸 좌표를 대조군으로 넣어 그 지표가 실제로 갈리는지 먼저 확인했어요. 정상 좌표에서 100%, 어긋낸 대조군에서 62%로 갈렸으니 그때부터 이 지표를 믿기로 했어요.

지도가 무너진 문제도 같은 방식으로 풀렸어요. 처음에는 “지도가 이상하다”는 한 덩어리였는데, 원인 후보를 하나씩 떼어 각각에 실측 프로브를 붙이니 다섯 개가 전부 잡혔어요. 라이다 좌우 반전은 제자리 회전 프로브로, 매핑 중 서비스 재시작이 오도메트리 원점을 리셋한 건 재시작 시점 대조로, 화면에서 본 어긋남 하나는 두 기기 시계 차이로 판명됐어요. 다섯 원인이 전부 정지 상태에서는 안 보이는 부류였다는 게 이번 주에 남은 교훈이에요. 정적 점검을 통과한 목록은 주행의 보증서가 되지 않아요.

로봇 팔 쪽에서는 측정 도구 자체를 바꿔야 했어요. 관절 부호를 조그 목측으로 판정했다가 틀렸는데, 역기구학으로 수직 아래를 명령했더니 실물은 45° 쳐든 자세로 섰어요. 120° 어긋난 값이라 부호 오류가 확정됐어요. 움직이는 걸 눈으로 보는 것과 정지 자세를 사진으로 재는 것은 서로 다른 측정이에요. 앞의 방법으로는 부호가 갈리지 않고, 뒤의 방법으로는 갈려요.

다음 한 주에 적용할 것

세 편에서 가져갈 형태를 하나로 좁히면 이거예요. 무언가를 떼어냈으면 떼어낸 쪽이 실제로 갈리는지를 먼저 확인한다는 거예요.

구체적으로 두 가지를 하려고 해요. 첫째, 검증기를 만들 때 통과시키면 안 되는 입력을 하나 먼저 만들고 그게 떨어지는지 확인한 뒤에 본 검사를 돌려요. 이번 주에는 지표를 만든 뒤에 대조군을 붙였는데, 그 순서를 뒤집어 두는 거예요. 둘째, 실패 기록을 성공 기록과 같은 자리에 쌓지 않고 무엇을 감독할지를 나눠 적어요. FACT가 보여준 건 실패 데이터가 있으면 좋아진다가 아니라 넣을 자리를 먼저 만들어야 한다는 것이었으니까요.

여기부터는 제 판단이에요. 로봇을 실제로 굴리는 조직에서는 실패 로그가 자연히 쌓이는데, 그게 학습 재료가 되지 못하는 이유는 데이터가 없어서라기보다 그 데이터를 무엇으로 쓸지 정하는 층이 없어서인 경우가 많아 보여요. 성공 시연과 실패 롤아웃을 같은 손실로 다루는 파이프라인에서는 실패를 모으면 모을수록 나빠지니, 수집을 늘리기 전에 손실 설계를 먼저 갈라야 해요. 사전학습 자산을 얼려 두고 얇은 헤드만 붙이는 쪽도 라벨이 적은 조직에는 현실적인 선택으로 보여요. Hand Visibility Detector가 H200 한 장에서 2.5시간에 학습을 끝내는 규모니까요.

조금 더 넓게 보면, 값과 그 값을 믿어도 되는 정도를 함께 내보내라는 요구는 로봇만의 것이 아니에요. 모델이 답을 늘 내놓는 자리에서 그 답이 관측에서 온 것인지 구조에서 추론된 것인지 구분되지 않으면, 그 값을 받아 다음 결정을 내리는 쪽에는 구분할 방법이 없어요. 이번 세 편은 그 구분을 만들려면 출력을 하나 더 붙이는 것으로는 안 되고, 그 출력을 무엇으로 학습시킬지까지 따로 설계해야 한다는 걸 각자의 층에서 보여줬어요.