21편의 27/30을 공개하고 나니 제목이 눈에 걸렸습니다. “언어로 시키는 로봇”이라고 해 놓고, 정작 어느 큐브를 집을지는 정책이 아니라 우리가 짠 코드 한 줄이 정하고 있었습니다. 이 편은 그 한 줄을 정책에게 돌려주러 갔다가 두 번 전멸하고, 정책에게 이미지를 아예 보여 주지 않은 뒤에야 지시문을 읽는 로봇을 만나는 이야기입니다.
27/30은 언어의 성적이 아니었습니다
21편의 2단 구조를 다시 봅니다. 지각망이 큐브 3개와 받침 2개의 위치, 그러니까 좌표 10개를 읽습니다. 그중 지시문이 가리키는 큐브 하나와 받침 하나의 좌표 4개만 골라 정책에 넘겼습니다. 그런데 그 “고르기”를 누가 했느냐가 문제입니다. “red cube”라는 단어에서 빨간 큐브를 고른 것은 정책이 아니라, 색 이름을 문자열로 비교하는 우리 코드였습니다. 정책이 받는 입력에는 이미 “어디로 가야 하는지”가 들어 있었고, 지시문은 읽어도 그만 안 읽어도 그만이었습니다.
정말 안 읽었는지 확인하는 방법이 있습니다. 20편에서 쓴 방법과 같습니다. 같은 장면에서 입력 하나만 바꿔 넣고, 정책이 내놓는 행동이 얼마나 달라지는지 재는 겁니다. 이 편에서는 이것을 입력 교체 시험이라 부르겠습니다.
기준선이 하나 필요합니다. 우리 정책은 같은 입력을 두 번 넣어도 답이 조금씩 다릅니다. 행동을 확률적으로 뽑기 때문입니다. 그 “같은 입력끼리의 차이”를 잡음 바닥으로 두고, 입력을 바꿨을 때의 차이가 잡음 바닥의 몇 배인지 봅니다. 1배면 안 읽는 것이고, 수십 배면 읽는 것입니다.
21편 정책에 이 시험을 걸었습니다. 지시문을 바꾸면 1.7배, 대상 큐브의 좌표를 바꾸면 58배였습니다. 좌표는 읽고 지시문은 안 읽습니다. 읽을 이유가 없었으니까요.
좌표를 전부 주고, 고르는 일을 정책에게 맡기면
그러면 고르는 일을 정책에게 돌려줍니다. 좌표 10개를 정해진 순서로 전부 넣어 주고, 어느 큐브를 어느 받침에 놓을지는 지시문을 읽어 정하게 합니다. 이 정책을 v8이라 부르겠습니다. 큐브와 받침이 같은 자리에 놓인 장면이라면 지시문만 다르고 나머지 입력은 완전히 같으니, 지시문을 읽지 않고는 어느 큐브를 집어야 할지 알 길이 없습니다.
판정 기준은 학습 전에 적어 두었습니다. 지시문을 무시하고 한 조합만 외운 정책이라면 학습 조합 25시행 중 5번쯤 맞고, 본 적 없는 조합(홀드아웃) 5시행은 0입니다.
결과는 그보다도 낮았습니다. 30시행 중 0. 학습 loss는 21편 정책과 같은 0.04인데 성공은 하나도 없습니다. 큐브를 한 번도 들어 올리지 못했고, 엉뚱한 큐브를 건드린 시행이 9번입니다.
처음 세운 가설은 “장면을 통째로 외웠다”였습니다. 학습 데이터에서는 장면 하나에 지시문이 하나뿐이었습니다. 그러니 좌표 10개만 보고 “이 장면이면 이 큐브”를 외워도 학습 데이터는 맞출 수 있습니다. 확인은 간단합니다. 학습에 쓴 장면 20개를 그대로 재현해서 굴려 보면 됩니다. 외운 거라면 여기서는 돼야 합니다. 20시행 중 0. 손끝은 어느 큐브에서도 11cm쯤 떨어진 곳으로 갔습니다. 외운 것도 아니었습니다.
그래서 입력 교체 시험을 전부 걸었습니다. 지시문 바꾸기, 대상 큐브의 좌표 바꾸기, 대상이 아닌 큐브의 좌표 바꾸기, 받침 좌표 바꾸기, 그리고 좌표를 전부 0으로 지우기.

무엇을 바꿔도 잡음 바닥이었습니다. 좌표를 전부 0으로 지워도 행동이 달라지지 않습니다. 게다가 잡음 바닥 자체가 21편 정책의 열 배였습니다. 같은 입력을 두 번 넣었을 때의 차이가 그만큼 커졌다는 뜻이고, 정책이 뭘 할지를 스스로도 정하지 못한 상태라는 뜻입니다. 좌표도 언어도 안 보는 정책입니다. 그런데 loss는 낮습니다. 19편에서 만났던 정책, 순서는 아는데 눈은 뜨지 않았던 정책이 모습만 바꿔 돌아온 겁니다.
지시문을 다섯 개로 흔들어도
08편에서 배운 것이 있습니다. 명령을 흔들어야 명령을 듣는다. 장면마다 지시문이 하나뿐이면 정답이 이미 정해져 있으니 지시문을 읽을 이유가 없습니다. 그래서 장면 하나마다 학습에 쓰는 지시문 다섯 개를 전부 시연했습니다. 200장면 곱하기 5, 1,000편입니다. 같은 이미지, 같은 좌표에서 지시문만 다르고 행동이 달라야 하니, 지시문을 읽는 것 말고는 학습 데이터를 맞출 길이 없습니다. 이 정책이 v9입니다.
30시행 중 3. 입력 교체 시험은 그대로 잡음 바닥이었습니다. 계획서에 “예상되는 함정”으로 적어 두었던 언어 무시 정책이 그대로 나왔고, 예상해 둔 처방은 듣지 않았습니다.
지름길의 정체
남는 설명은 하나입니다. 카메라 이미지에는 팔이 보입니다. 팔이 지금 어느 쪽으로 움직이고 있는지가 보이면, 다음 행동은 그 방향으로 조금 더 가는 것입니다. 모방학습은 “이 순간 전문가가 어떤 행동을 했나”를 프레임마다 맞히는 학습이라, 이 방법은 공짜에 가까운 지름길입니다. 한 에피소드 300프레임 가운데 팔이 아직 출발 자세에 있는 첫 50프레임만 지시문과 좌표가 필요하고, 나머지는 팔 자세를 따라 하면 됩니다.
21편까지는 이 지름길이 문제가 되지 않았습니다. 좌표 4개가 곧 답이라, 정답을 계산하는 길이 지름길만큼 짧았습니다. 이번에는 정답으로 가는 길에 계산이 하나 더 끼었습니다. 지시문을 읽고 열 개 좌표 중 넷을 고르는 일입니다. 그 계산이 지름길보다 어려우면 정책은 지름길로 갑니다. 지시문을 아무리 흔들어도, 지름길이 데이터 안에 있는 한 그렇습니다.
눈을 감기고 시계를 주다
그러면 지름길을 없앱니다. 정책에 들어가는 이미지를 전부 회색으로 지웠습니다. 이제 목표를 알 길은 지시문과 좌표뿐입니다.
다만 하나가 빠집니다. 이미지가 없고 좌표는 에피소드 내내 같으니, 정책은 지금이 집으러 가는 중인지 옮기는 중인지 알 수 없습니다. 그러면 첫 1초의 행동만 계속 반복할 겁니다. 그래서 입력 끝에 시간을 한 칸 붙였습니다. 에피소드 시작이 0, 끝이 1인 숫자 하나입니다. 시간은 단계를 알려 주되 목표는 흘리지 않습니다. 이 정책이 v10입니다.
v10은 도중에 아무것도 보지 않습니다. 처음 읽은 좌표만 믿고 끝까지 갑니다. 이런 방식을 열린 고리라고 부르고, 보면서 고치는 방식을 닫힌 고리라고 부릅니다. 큐브는 4cm, 그리퍼는 8cm까지 벌어지고, 좌표 오차는 0.8cm이니 열린 고리로도 성립은 할 겁니다. 19편의 스크립트 전문가도 열린 고리였습니다.
| v8 (이미지 봄) | v9 (지시문 5개) | v10 (이미지 지움) | |
|---|---|---|---|
| 학습 조합 | 0/25 | 3/25 | 19/25 |
| 홀드아웃 | 0/5 | 0/5 | 0/5 |
| 손끝이 지시한 큐브 쪽으로 간 시행 | 11/30 | 11/30 | 29/30 |
| 지시문을 바꿨을 때 행동 변화 | 1.2배 | 0.9배 | 65배 |
지시문을 바꾸면 행동이 65배 달라지고, 대상 큐브의 좌표를 바꾸면 62배 달라지는데, 대상이 아닌 큐브의 좌표는 5.5배만 움직입니다. 좌표 열 칸을 한 칸씩 다른 위치로 바꿔 보면 더 선명합니다. 집으러 가는 동안은 지시한 큐브의 칸에만(41~83배), 옮기는 동안은 지시한 받침의 칸에만(66~84배) 반응합니다. 단계에 따라 봐야 할 칸을 바꾸는 것까지 배웠습니다.

전체 영상:
눈을 반쯤 돌려주면
이미지가 없으니 집는 순간을 보면서 고칠 수가 없습니다. 그래서 이미지를 프레임마다 확률 0.7로 지워 봤습니다. 지름길을 믿을 수 없게 만들되, 30%의 프레임에서는 볼 수 있게 한 겁니다. 이 정책이 v11입니다.
지시문 읽기는 살아남았습니다. 지시문을 바꾸면 실제 이미지를 넣었을 때 67배, 회색을 넣었을 때 59배 달라집니다. 그런데 성공률은 실제 이미지로 평가하면 25시행 중 13, 같은 장면을 회색으로 평가하면 18이었습니다. 이미지를 보여 주면 더 못합니다. 이미지를 안 쓰는 게 아니라 해롭게 씁니다. 실제 프레임이 보이는 순간 팔 자세를 따라 하는 버릇이 조금 섞여 들어, 처음 읽은 좌표로 가던 궤적을 흐리는 것으로 봅니다.
남은 실패는 누구 탓인가요
v10의 학습 조합 25시행 중 실패 6건은 전부 큐브를 못 집은 것이었습니다. 용의자 셋을 차례로 불렀습니다.
지각이 아닙니다. 지각망이 읽은 좌표 대신 실제 좌표를 넣어도 19/25이고, 실패한 장면까지 같습니다.
학습 시간도 아닙니다. 같은 조건으로 두 배인 40k 스텝을 돌렸습니다. loss는 0.007까지 내려가 바닥을 쳤는데, 20k에서 40k까지 성적은 19~20/25에서 움직이지 않습니다.
큐브가 놓인 자리입니다. v10·v11의 평가 150시행을, 지시한 큐브가 작업공간 경계에서 얼마나 떨어져 있었는지로 나눠 봤습니다.

학습 데이터에는 경계 근처 장면이 오히려 많습니다. 장면을 뽑을 때 큐브와 받침이 서로 겹치지 않게 밀어내다 보니 바깥쪽으로 몰립니다. 그러니 데이터가 부족한 게 아니라 그 자리가 어려운 겁니다. 작업공간의 먼 끝은 팔을 거의 다 뻗어야 하고 가까운 끝은 몸통 바로 앞이라 팔을 깊이 접어야 합니다. 열린 고리에서는 같은 좌표 오차가 그런 자세에서 더 큰 손끝 오차로 번집니다. 21편의 반복 측정에서 봤던 “먼 쪽과 구석에서 실패”와 같은 이야기입니다.
경계에서 3cm 이상 안쪽인 장면만 골라 조합당 10회씩 굴리면 학습 조합 50시행 중 41, 82% 입니다. 이미지 없이 지시문과 좌표만으로, 이미지가 있고 고르기를 코드가 대신해 준 21편의 87%에 거의 붙습니다.
본 적 없는 조합은요
노란 큐브를 보라 받침에. 학습 데이터에 없는 조합입니다. 30시행 시험에서는 5번 중 0이었는데, 입력 교체 시험을 보면 정책은 봐야 할 칸을 맞게 보고 있습니다. 노란 큐브 칸에 41배, 보라 받침 칸에 81배. 고르기는 됐는데 집기가 안 되는 겁니다. 짚이는 것이 둘 있었습니다. 보라 받침은 학습 데이터에서 빨간 큐브, 초록 큐브와만 짝지어졌으니 “purple”이라는 단어가 빨간 큐브의 좌표를 조금 끌어옵니다(11배). 그리고 노란 큐브는 대상이 되는 조합이 하나뿐이라, 다른 큐브의 절반밖에 배우지 못했습니다.
40k까지 돌린 정책을 경계에서 3cm 이상 안쪽인 장면에서 다시 굴렸습니다. 홀드아웃 10시행 중 7. 20k 정책은 같은 장면에서 1이었습니다. 6장면이 실패에서 성공으로 바뀌었고 되돌아간 장면은 없습니다. 입력 교체 시험에서 노란 큐브 칸의 반응이 41배에서 73배로 커졌습니다. 학습 시간은 어려운 자리에는 답이 아니었고, 표본이 적은 단어에는 답이었습니다. “yellow”와 “purple”을 따로 읽어 합치는 일, 그러니까 본 적 없는 조합으로의 일반화가 성립합니다. 다만 경계 근처에서는 다른 조합과 똑같이 무너집니다. 앞서 0/5였던 30시행 시험의 홀드아웃 다섯 장면은 하필 전부 경계 근처였습니다.
이번 편에서 남은 것
- 27/30은 언어의 성적이 아니었습니다. 정책은 좌표를 읽었고 지시문은 읽지 않았습니다(1.7배).
- 좌표를 전부 주고 고르게 하면 0/30. 장면을 외운 것도 아니고, 입력 자체를 보지 않습니다. 지시문을 다섯 개로 흔들어도 3/30. 원인은 이미지 속 팔 자세를 따라 하는 지름길이고, 데이터로는 막지 못했습니다.
- 이미지를 지우고 시간을 주자 지시문을 읽습니다. 집을 때는 지시한 큐브를, 옮길 때는 지시한 받침을 봅니다. 경계에서 떨어진 장면에서 82%, 본 적 없는 조합도 10번 중 7번.
- 이미지를 반쯤 돌려주면 지시문 읽기는 지키지만 집기는 더 나빠집니다. 남은 실패는 지각도 학습 시간도 아니고 작업공간의 양끝이며, 그건 보면서 고쳐야 하는 자리입니다. 보면서 고치게 해 주는 눈이 지름길도 열어 준다는 것이 이번 편의 매듭입니다.
- 정책이 무엇을 읽는지는 성공률로는 알 수 없고, 입력을 바꿔 넣어 봐야 압니다. 이번 편의 판정은 전부 시뮬레이션을 돌리기 전에 입력 교체 시험에서 먼저 나왔습니다.
로봇이 드디어 시키는 대로 집습니다. 눈을 가린 채로요. 다음 편은 그 눈을 지름길 없이 돌려주는 방법을 찾습니다. 손목 카메라만 남기는 것부터 시작합니다. 손목에서는 팔이 안 보이고 큐브와 손가락만 보입니다.
이 시리즈의 전체 글 목록 → 시리즈 목차