smolvla_v10 — 목표를 언어 대신 관측으로 준 SmolVLA
섞여 있는 알약 중 지정한 색 하나만 집어 약통에 담습니다.
lerobot/smolvla_base 를 224 에피소드로 미세조정했습니다.
실기 결과: 색을 구분해 집는 데 성공 — SmolVLA 계열로는 처음 (2026-08-22)
왜 언어를 안 쓰는가
"pick red pill" 이라는 문장으로 목표를 준 판을 아홉 번 만들었고
전부 실패했습니다 (자기색 대비 0.89 ~ 2.02, 기준선 1.02).
원인을 모델 내부에서 직접 쟀습니다.
| 토큰 수 | 값 크기 |
|---|
| 이미지 임베딩 | 64 | 123.5 |
| 언어 임베딩 | 48 | 1.43 |
86배 작습니다. 지시문을 바꿔도 prefix 가 0.017% 밖에 안 변합니다.
무시해도 손실이 오르지 않으니 실제로 무시합니다.
신호를 86배 증폭하고 FiLM 을 붙여 79배(0.017% → 1.335%) 로 키운 판도
1.09 였습니다. 신호 크기만으로는 안 됩니다 — 사전학습된 언어 경로가
이미 무시하도록 굳어 있습니다.
그래서 경로를 바꿨습니다
SmolVLA 의 상태는 32차원까지 채워지는데 로봇 관절은 6개뿐이라 26칸이
비어 있습니다. 그 자리에 목표 좌표를 넣었습니다.
observation.state = [관절 6] + [goal_u, goal_v] × 13
이 경로는 train_state_proj=True 인 학습되는 선형층을 지납니다.
초기 신호는 오히려 더 약했지만(0.013% 대 언어 0.079%), 그래디언트가
직접 키우므로 초기값이 아니라 학습 가능성이 관건입니다.
학습량은 목표 추종을 바꾸지 못했습니다
2.0 → 9.8 에폭까지 22시간을 돌려 확인했습니다.
| 에폭 | 자유 좌표 상관 |
|---|
| 2.0 | +0.310 |
| 5.9 | +0.314 |
| 7.8 | +0.310 |
| 9.8 | +0.312 |
| ACT (8.1) | +0.484 |
5배를 더 돌려 +0.002 입니다. 같은 8~10 에폭에서 ACT 는 0.484 이므로
학습 부족이 아니라 구조의 차이입니다. 기울기는 +0.30 대 +0.29 로 같아
"요구한 만큼 움직이는 정도"는 같고, 상관이 낮은 것은 흔들림이 크다는 뜻입니다.
체크포인트를 080000 으로 고른 이유
실기로 하나씩 확인해 골랐습니다. 오프라인으로는 고를 수 없었습니다.
| 체크포인트 | 오프라인 | 실기 |
|---|
| 020000 | +0.310 | 움직임이 거침 |
| 070000 | +0.322 (1위) | 알약을 떨어뜨림 |
| 080000 | +0.310 | 가장 나음 |
오프라인 1위가 실기에서 실패했습니다. 회복 시연 7개가 "실패하면 재시도"를
가르친 영향으로 보입니다.
쓰는 법
1from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
2policy = SmolVLAPolicy.from_pretrained("kimy0420/smolvla_v10")
observation.state 의 6번 칸부터 목표 좌표를 (u,v) × 13 으로 채워야 합니다.
데이터셋:
kimy0420/pill_v3_uvstate
사양
| 항목 | 값 |
|---|
| 기반 | lerobot/smolvla_base (SmolVLM2-500M + Action Expert) |
| 구조 | flow matching, chunk 50 |
| 학습 | 80,000 스텝 · 배치 24 · 7.8 에폭 |
| 관측 | top·wrist 카메라, 관절 6 + 목표 좌표 26 |
| 체크포인트 | 080000 |
알아둘 것
- 색 판별은 정책이 아니라 HSV 검출기가 합니다. 언어로 색을 이해하는
SmolVLA 는 이 데이터 규모(224 에피소드)에서는 만들지 못했습니다.
검출기 없이 색을 구분하는 것은 act_film_224 를 보십시오.
- temporal ensembling 은 쓸 수 없습니다 (ACT 전용 설정입니다).
- ACT 대비 목표 추종이 덜 정밀합니다 (+0.31 대 +0.48).