21. 눈을 붙이다 — 평균은 멀쩡한데 꼬리가 망치고 있었습니다

20편에서 병목은 눈으로 확정됐습니다. 좌표를 공짜로 주면 92%, 안 주면 0%입니다. 이 편에서는 그 눈을 실제로 만들어 붙입니다. 그 과정에서 진단 도구가 세 번째로 고장 나고, 마지막에는 “학습 데이터의 평균 오차”가 아니라 드물게 크게 틀린 49편이 범인이었다는 결말에 도착합니다.


이미지에 정보가 없는 걸까요, 못 꺼내는 걸까요

두 가능성의 처방이 완전히 다릅니다. 정보가 없으면 해상도와 시점을 손봐야 하고, 있는데 못 꺼내는 거라면 추출 방식을 손봐야 합니다.

가르는 방법은 간단합니다. 작은 전용 신경망에게 같은 이미지로 좌표를 맞히게 하는 겁니다. 0.5M짜리 CNN이 읽어내면 정보는 있는 겁니다. 못 읽으면 이미지가 부족한 겁니다.

1,000편에서 뽑은 5,000장으로 40에포크를 돌렸습니다.

대상 평균만 찍는 기준선 우리 지각망
물체 19.53cm 5.83cm
받침 16.41cm 13.25cm

큐브 한 변이 4cm라 2cm 이하가 필요한데 5.83cm입니다. 받침은 기준선을 거의 못 벗어났습니다. “이미지가 부족하다”고 적을 뻔했습니다.

세 번째로 고장 난 진단 도구

적기 전에 곡선을 봤습니다. 학습 loss는 0.36에서 0.0034로 100배 떨어졌는데 시험 오차는 10에포크 이후 전혀 개선되지 않았습니다. 전형적인 과적합입니다.

이유도 분명합니다. 장면이 정지한 구간에서 프레임을 뽑았으니, 표본 5,000개라 해도 서로 다른 장면은 850개뿐입니다. 그러니 5.83cm는 “이미지의 한계”가 아니라 “이 프로브가 도달한 한계”일 수 있습니다. 판정할 자격이 없는 상태였습니다.

시즌 3에서 진단 도구가 발목을 잡은 게 이번이 세 번째입니다. 앞의 둘은 결정계수 −37이 나온 선형 회귀와, 한 번만 재고 추세를 그렸던 접지 프로브였습니다.

곁가지로 기각한 가설도 하나 적어 둡니다. 받침이 안 읽히길래 “파란 받침이 청회색 배경에 묻히나” 의심하고 색 마스크를 돌렸습니다. 화면의 13.8%가 파랑으로 잡혀 그림이 그럴듯했는데, 그 13.8%는 받침이 아니라 바닥이었습니다. 실제 받침 색만 세어 보니 받침은 큐브보다 오히려 3~8배 넓게 찍히고 있었습니다. 더 크게 보이는 쪽을 더 못 읽고 있었던 겁니다. 마스크를 느슨하게 잡은 게 이 진단의 첫 오답이었습니다.

프로브를 고칩니다 — 한 번에 한 가지씩

과적합부터 걷어내야 합니다. 두 가지를 준비했습니다.

하나, 라벨을 늘립니다. 지금은 “지시가 가리키는” 물체와 받침의 좌표 4개만 맞히게 합니다. 큐브 3개와 받침 2개 전부, 좌표 10개를 맞히게 하면 한 장면에서 배우는 양이 늘어납니다. 그런데 그 라벨이 데이터에 없습니다. 다시 수집해야 할까요.

아닙니다. 수집기는 난수를 배치 뽑기에만 씁니다. 씨앗만 알면 시뮬레이터 없이 그날의 배치를 그대로 재생성할 수 있습니다. 1,000편 전건을 저장된 좌표와 대조해 100% 일치를 확인하는 데 1.2초 걸렸습니다. 재수집 0분, 감독 신호 2.5배입니다.

둘, 머리를 바꿉니다. 원래 프로브는 합성곱 뒤에 평균 풀링으로 공간을 2×2로 뭉개고 있었습니다. 좌표를 읽어야 하는 망이 마지막에 위치를 평균으로 날리고 있었던 겁니다. 공간 소프트맥스로 바꿨습니다. 채널마다 특징 지도의 무게중심을 뽑는 방식이라, 뭉개는 대신 위치만 남깁니다.

씨앗을 박고 3회씩 반복 측정했습니다.

라벨 머리 증강 대상 물체 오차 대상 받침 오차
기준선(평균만 찍기) 19.53cm 16.41cm
A (예전 판 재현) 대상 4개 평균 풀링 없음 5.84 15.06
B 전체 10개 평균 풀링 없음 4.13 2.36
C 전체 10개 공간 소프트맥스 없음 1.24 0.64
D 전체 10개 공간 소프트맥스 색 흔들기 1.59 0.90
E 대상 4개 공간 소프트맥스 없음 5.43 2.50

C는 시험 오차가 40에포크 내내 학습 loss를 따라 내려갑니다. 판정할 자격이 생겼고, 결과는 1.24cm — 필요 정밀도 2cm를 밑돕니다.

정보는 이미지에 있었습니다. 지난번 5.83cm는 프로브의 한계였습니다.

평균 하나에 고장이 두 개 숨어 있었습니다

받침 오차가 15.06cm에서 2.36cm로 떨어진 게 이상했습니다. 바뀐 건 라벨뿐인데요. 그래서 “예측이 정답보다 다른 후보에 더 가까운 비율”을 세어 봤습니다. 위치를 잘못 읽은 것과 대상을 잘못 고른 것을 가르는 잣대입니다.

체크포인트 물체 혼동률 맞게 고른 표본의 오차 받침 혼동률
A (평균 풀링, 대상 라벨) 13.6% 3.63cm 47.1%
E (공간 소프트맥스, 대상 라벨) 10.5% 3.76cm 0.0%
C (공간 소프트맥스, 전체 라벨) 0.0% 1.23cm 0.0%

47.1%는 동전 던지기입니다. 받침 15cm의 정체는 “못 봤다”가 아니라 “둘 중 어느 것인지 못 골랐다”였습니다. 받침이 큐브보다 넓게 찍히는데도 더 못 읽히던 수수께끼가 여기서 풀립니다. 넓이와는 무관한 문제였습니다.

계획대로 안 된 것도 적어 둡니다. 데이터 증강은 손해였습니다(D가 C보다 나쁩니다). 과적합이 이미 사라진 뒤라 색 흔들기는 신호만 깎았습니다. 무작위 이동은 아예 넣지 않았습니다. 화면이 움직이면 픽셀과 실제 좌표의 대응이 깨져 라벨 자체가 틀려지기 때문입니다. 1픽셀이 2.7mm입니다. 증강이라고 다 공짜가 아닙니다.

2단 구조 — 오라클을 예측으로 갈아 끼우다

이제 붙일 차례입니다. 20편의 오라클은 상태 자리에 실제 좌표를 넣었습니다. 그 자리에 지각망이 읽은 좌표를 넣으면, 지각을 진짜로 붙였을 때 어디까지 따라붙는지가 나옵니다.

여기서 조심할 게 하나 있습니다. 지각망을 학습에 쓴 에피소드에 그대로 돌리면 예측이 비현실적으로 정확합니다. 외운 값이니까요. 그 좌표로 정책을 학습시키면 정책은 실전에 없는 정밀도를 믿도록 배웁니다. 20편에서 겪은 “학습 때만 있는 공짜 정보” 함정과 같은 구조입니다. 그래서 데이터를 두 겹으로 나눠, 자기를 학습에 쓰지 않은 망이 예측한 좌표만 썼습니다.

그렇게 만든 좌표의 품질은 대상 물체 1.59cm, 받침 0.81cm. 물체 좌표가 4cm 넘게 틀린 에피소드가 48편(받침까지 치면 49편)입니다.

지각망이 읽은 위치(붉은 십자)와 실제 위치(동그라미). 대부분은 1cm 안쪽인데 가끔 이렇게 크게 틀립니다

이전 실험들 오라클 2단 구조(v6)
학습 조합 0~1 / 25 23 / 25 18 / 25
홀드아웃 0 / 5 5 / 5 5 / 5
합계 0~1 / 30 28 / 30 23 / 30

0/30에서 23/30입니다. 시즌 3에서 과제가 실제로 풀린 건 이번이 처음입니다.

남은 격차의 범인은 뜻밖이었습니다

오라클 28에 못 미치는 5건이 남았습니다. 무엇 때문일까요. 평가할 때마다 지각 오차를 함께 실측하게 해 뒀으니 바로 확인됩니다.

실패 7건 중 지각 오차가 큰 것은 1건(3.5cm)뿐이고, 나머지 6건 중 5건은 1.0cm 이하였습니다 (하나는 1.9cm). 좌표를 1cm 안쪽으로 정확히 읽고도 실패합니다. 실패는 지각 탓이 아닙니다.

남은 용의자는 학습에 들어간 좌표의 잡음이었습니다. 평가 때 받는 좌표는 0.80cm인데 학습 때 받은 좌표는 평균 1.59cm에 최악이 21.6cm였습니다. 가끔 크게 틀린 좌표로 배우면 정책이 좌표를 덜 믿는 쪽으로 학습될 수 있습니다. 오라클에는 그 갈등이 없었습니다.

그래서 꼬리만 잘랐습니다. 예측이 4cm(큐브 한 변) 넘게 틀린 49편을 학습에서 뺐습니다. 좌표를 더 정확하게 준 게 아니라 크게 틀린 라벨만 제외한 겁니다. 951편이 남고, 평균 오차는 1.59에서 1.29cm로 조금 줄었습니다.

오라클 2단 구조(v6) 꼬리 제거(v7)
학습 조합 23 / 25 18 / 25 22 / 25
홀드아웃 5 / 5 5 / 5 5 / 5
합계 28 / 30 23 / 30 27 / 30

오라클과 실질적으로 같습니다. 30시행에서 1건 차이는 구분되지 않습니다. 절반만 학습한 시점에도 25/30으로 이전 판의 완주 성적을 넘었습니다.

꼬리를 자르고 학습한 정책. 상태 자리에는 카메라 영상에서 읽은 좌표만 들어갑니다. 빨간 큐브를 집어 파란 받침에 올립니다

전체 영상:

평균 오차는 1.59에서 1.29cm로 조금 줄었을 뿐인데 성적은 23에서 27로 뛰었습니다. 평균이 문제가 아니라 드물게 크게 틀린 라벨이 문제였습니다. 데이터 품질을 평균으로만 보고 있으면 이 49편은 영원히 안 보입니다. 전체의 4.9%입니다.

정직한 단서 하나

홀드아웃 5/5를 “언어 일반화 성공”으로 읽으면 안 됩니다. 2단 구조에서 “노랑 큐브”를 고르는 일은 색 이름 대조로 정책 바깥에서 처리됩니다. 상태 자리에 이미 목표 좌표가 들어 있으니, 정책 입장에서는 새 조합이랄 게 없습니다. 지금 성적은 “지각을 외부에서 풀어 준” 조건부 성공입니다. 진짜 언어 시험은 지각과 선택을 모두 정책 안으로 넣은 뒤에야 의미가 있습니다.

이번 편에서 남은 것

  • 이미지에는 정보가 있었습니다. 못 꺼낸 쪽이 문제였고, 프로브의 머리를 바꾸자 1.24cm로 읽혔습니다.
  • 평균 오차 하나에 “위치 읽기”와 “대상 고르기” 두 고장이 섞여 있었습니다. 갈라 봐야 보입니다.
  • 지각을 붙이자 0/30이 23/30이 되고, 학습 라벨의 꼬리를 자르자 27/30이 됐습니다.
  • 데이터 품질은 평균이 아니라 꼬리로 봐야 합니다.

로봇이 드디어 빨간 큐브를 파란 받침에 올립니다. 다섯 번의 기각과 세 번의 프로브 고장을 지나서요. 그동안 우리가 배운 게 로봇 제어인지 자기 도구를 의심하는 법인지는 아직 모르겠습니다. 아마 둘 다일 겁니다.


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