소개
피지컬 AI 모방학습 해커톤에서 최우수상이라는 좋은 결과가 있었지만, 부트캠프 수업 + 프로젝트 + 해커톤 준비가 겹치면서 시간적으로 아쉬웠던 부분들이 많았습니다. Develop하고 싶은 부분들이 있어 이번 모방학습 교육 기간에 다시 해보고자 했습니다.
다른 태스크에도 도전해볼 수 있었지만, 모방학습에서 가장 기본이 되는 Pick & Place에 대해 일가견이 있어야 한다고 생각했습니다. 목표는 단 하나 — "로봇팔이 닿을 수 있는 거리라면 어디든지 인형을 집고 컵에 넣을 수 있도록 하자."
데모 영상
최종 채택한 모델의 동작 영상입니다.
데이터셋 설계
데이터 수집에서 가장 중요한 점은 "사람의 직관을 믿으면 안 된다"는 것입니다. 해커톤 때도 겪었지만, 사람이 랜덤하게 물체를 놓았다고 생각해도 무의식적으로 특정 위치에 편향되기 마련입니다.
데이터 수집 전략
먼저 해커톤 때와 같이 프레임을 만들었습니다. 사람이 인지하지 못하는 공간과 경우의 수를 시각적으로 확인하기 위해서입니다.
- 좌표 17개 — OMX 로봇암이 닿을 수 있는 범위 내에서 인형이 놓일 수 있는 위치
- 방향 8가지 — 상, 하, 좌, 우, 상좌, 상우, 하좌, 하우
- 총 17 × 8 = 136개의 에피소드
녹화 방식도 신경 썼습니다.
- 프레임 기반 배치 — 컵을 기준으로 프레임을 두고, 프레임에 맞춰 특정 위치에 인형을 배치한 뒤 녹화 시작 직전에 프레임만 빼내어 녹화 영상에는 프레임이 나오지 않도록 했습니다.
- Wrist View 활용 — wrist 카메라 뷰에 항상 인형이 보이도록 조작했습니다. 인형을 집기 전에 wrist view에서 인형이 보이는 최대 높이까지 올린 뒤, 인형의 각도에 따라 손목 관절을 회전하고, 인형이 위치한 높이로 내려가는 방식으로 녹화했습니다. 이를 통해 모델이 depth(깊이)를 학습하는 데 도움이 되지 않을까 하는 생각이었습니다.
| 항목 | 값 | 비고 |
|---|---|---|
| 에피소드 | 136개 | 17좌표 × 8방향 |
| 워킹스페이스 | 38 × 22 cm | OMX 도달 범위 |
| 배치 사이즈 | 4 | 8과 비교 후 채택 |
| 훈련 스텝 | 200,000 |
카메라 필터링 (Top View)
해커톤 때 제대로 활용하지 못했던 top view 카메라 필터를 이번에는 정밀하게 조절했습니다. 인형과 배경, 그리고 컵을 확연히 구분할 수 있도록 구성했고, 전체 워크스페이스도 빛 반사가 최대한 일어나지 않도록 조성했습니다.
| 파라미터 | 설정값 | 기본값 |
|---|---|---|
| brightness | -150 | 5 |
| contrast | 140 | 140 |
| saturation | 230 | 230 |
| white_balance_temperature | 7800 | 5000 |
| gamma | 45 | 45 |
| exposure_time_absolute | 296 | 312 |
brightness를 -150까지 낮춘 이유는 배경을 최대한 어둡게 만들어 인형과 로봇암만 부각시키기 위함입니다.
모델 & 훈련
해커톤 때 사용했던 ACT(Action Chunking with Transformers) 를 그대로 사용했습니다. 데이터를 다 쌓은 후 여기서 한 가지 실험을 해보고 싶었습니다 — 배치 사이즈를 다르게 했을 때 어떤 차이가 있는지 비교해보는 것입니다.
- PC 1 — batch size = 4, steps = 200,000
- PC 2 — batch size = 8, steps = 100,000
단순하게 batch size × steps의 값이 같을 때(총 샘플 수 800,000) 어떤 batch size가 더 나은지 비교해보고 싶었습니다.
배치 사이즈 비교 실험
다음 날 각각의 모델을 비교해보았습니다. 두 모델 모두 task를 잘 수행했고, 실패율도 크게 다르지 않았습니다. 하지만 차이는 떨림에 있었습니다. 엄청나게 큰 차이는 아니지만 batch 4는 떨림이 덜했고, 그로 인한 실패도 덜했습니다. 그래서 batch 4 모델을 채택했습니다.
Batch Size = 4 (채택)
Batch Size = 8
왜 Batch 4가 나았을까?
batch size × steps가 같으면 총 본 샘플 수는 같지만, 학습 dynamics가 다릅니다.
| batch 4 × 200k | batch 8 × 100k | |
|---|---|---|
| 총 샘플 수 | 800,000 | 800,000 |
| weight 업데이트 횟수 | 200,000번 | 100,000번 |
| gradient 특성 | noisy (들쭉날쭉) | smooth (안정적) |
- 큰 수의 법칙 — batch가 작으면 gradient가 noisy합니다. 평균을 구할 때 샘플 수가 많을수록 진짜 평균에 가까워지는데, batch 4는 4개 샘플의 평균이라 매번 방향이 흔들리고, batch 8은 상대적으로 안정적입니다.
- Learning Rate(LR)과의 관계 — LR은 weight 업데이트 시 이동하는 보폭입니다(
새 weight = 기존 weight − LR × gradient). batch를 키우면 gradient는 안정적이지만 업데이트 횟수가 줄어 LR이 작은 것처럼 행동합니다. 일반적으로 batch를 2배 키우면 LR도 2배 키워줘야 하는데(linear scaling rule), 이번 실험에서는 LR을 동일하게 유지한 채 batch만 바꿨기 때문에 batch 8은 충분히 학습되지 않았을 가능성이 있습니다. - 결론 — 데이터가 136개로 매우 적은 이 프로젝트에서는 작은 batch + 많은 steps가 유리했습니다. noisy gradient가 오히려 과적합 방지(regularization) 역할을 하고, 업데이트 횟수가 많아 더 세밀한 학습이 가능했기 때문입니다.
추론 시 떨림 개선
batch 4 모델을 채택한 후에도 추론 과정에서 약간의 떨림이 남아있었는데, 추론 명령어에 다음 두 줄을 추가하자 동작이 눈에 띄게 부드러워졌습니다.
--policy.temporal_ensemble_coeff=0.01 \
--policy.n_action_steps=1
적용 후 (부드러움)
적용 전 (떨림 있음)
이 두 파라미터를 이해하려면 먼저 ACT의 Chunk 개념을 알아야 합니다.
Chunk란?
ACT 모델은 추론할 때 현재 카메라 입력을 보고 "앞으로 N스텝 동안 이렇게 움직이겠다"를 한꺼번에 예측합니다. 이 N이 바로 chunk_size입니다. 예를 들어 chunk_size=100이면 현재 시점에서 100스텝 앞까지의 관절 각도를 한 번에 출력합니다.
그런데 100개를 예측했다고 100개를 다 실행하는 건 아닙니다. n_action_steps는 그 중 실제로 몇 스텝만 실행하고 다시 추론할지를 결정합니다.
n_action_steps=100(= chunk_size) — 100개를 예측하고 100개를 전부 실행. 실행 중간에 카메라를 다시 보지 않으므로 반응이 느리고, 청크 경계에서 동작이 끊길 수 있습니다.n_action_steps=1— 100개를 예측하되 첫 1스텝만 실행하고 바로 새로운 카메라 입력으로 다시 추론. 매 스텝마다 최신 관측값을 반영하기 때문에 환경 변화에 가장 빠르게 대응합니다.
Temporal Ensemble
n_action_steps=1로 하면 반응성은 좋아지지만, 매번 새로운 예측을 하기 때문에 예측 간 차이로 인한 떨림이 생길 수 있습니다. 여기서 temporal_ensemble_coeff가 등장합니다.
- 이전 추론 결과와 현재 추론 결과를 블렌딩하는 계수입니다.
- 값이 작을수록(0에 가까울수록) 이전 예측의 비중이 높아져 동작이 부드러워집니다.
- 0.01로 설정하면 새로운 예측이 급격하게 반영되지 않고 이전 동작과 자연스럽게 섞이면서 떨림이 크게 줄어듭니다.
| 파라미터 | 역할 | 설정값 |
|---|---|---|
| chunk_size | 한 번에 예측하는 미래 스텝 수 | 기본값 유지 |
| n_action_steps | 예측 중 실제 실행할 스텝 수 (이후 재추론) | 1 |
| temporal_ensemble_coeff | 이전/현재 예측 블렌딩 비율 | 0.01 |
이슈
- Recovery 동작 없음 — 인형을 집고 이동하는 도중 놓쳐버리면 다시 집으려는 시도를 하지 않습니다. 에피소드에 "실패 후 재시도" 상황을 포함시키지 않았기 때문입니다.
- 다중 객체 평균값 문제 — 인형 두 개를 동시에 놓으면 그리퍼가 두 인형 사이의 중간 지점으로 이동합니다. 훈련 데이터에 인형 1개만 있는 상황만 포함시켰기 때문에 발생하는 문제입니다.
회고
해커톤 때 아쉬웠던 부분들 중 특히 떨림 현상과 인형 좌표에 정확하게 도착 후 집기를 개선해볼 수 있었습니다. 체계적인 프레임 기반 데이터 수집, 카메라 필터 정밀 조절, 그리고 배치 사이즈 비교 실험까지 — 해커톤에서는 시간에 쫓겨 못 했던 것들을 차분하게 해볼 수 있었습니다. 역시나 중요한 것은 많은 양의 데이터보다 정확하고 일관성 있는 '질 좋은' 데이터를 수집하는 것이 중요하다! 였습니다.
다만 recovery 동작과 다중 객체 대응은 여전히 해결해야 하는 문제라고 생각합니다. 다음에는 실패 상황을 의도적으로 만들어 recovery 에피소드를 녹화하고, 물체 개수를 다양하게 구성한 데이터셋으로 훈련해볼 계획입니다. 혹은 다른 task에 도전해볼 예정인데, 2025년 11월 17일에 출간된 𝜋0.6 논문을 참고하여 모방학습 + 강화학습을 구현해볼까 합니다.