Geometry-Change VLA (GC-VLA) - HABILIS Brain 0

Geometry-Change VLA (GC-VLA) - HABILIS Brain 0

투모로로보틱스의 HABILIS Brain 0(GC-VLA)는 '장면이 어떻게 바뀌는가'를 토큰으로 먼저 배우고, 그 위에서 액션을 배운다. Geometry-Change Token, 4단계 학습, 데이터, 추론, LIBERO 결과까지 정리한다.

Geometry-Change VLA (GC-VLA) - HABILIS Brain 0

Introduction


오늘은 한국에서 최전선에서 로봇 학습을 진행중인 회사 중 하나인, 투모로로보틱스에서 최신 (2026.09)에 발표한 정책 모델, 논문을 리뷰해보자. 기존 해외 기업들의 VLA와 비슷할 것 같다고 솔직하게 예상을 했지만, Unique한 특징을 지닌다. 어떤 특징이 있고, 왜 그렇게 특징을 잡았는지를 하나하나 살펴보자. 투모로 로보틱스라는 회사에서 발표한 정책 모델이름은, HABILIS Brain 0 이고, 아카이브를 참고해서 리뷰 블로그를 작성해보자.

핵심 아이디어를 한문장으로 표현한게 바로 이것이다. 로봇의 형체에 상관이 없이 단지 visual interface geometry change를 기반으로 학습을 시킨다는 것. → 관절값이 다른 여러 로봇 하드웨어에 대해서도 적용가능함.

This design is motivated by the goal of learning an embodiment-agnostic visual interface that can be pretrained across robot and egocentric video before robot-specific action alignment.

(!!그리고 여기서 egocentric video = 사람이 머리에 카메라 달고 찍은 영상이다. 즉, 로봇 액션 라벨이 없는 사람 영상까지 pretraining에 쓸 수 있다는 게 포인트)

Contents


  • Architecture
  • Training
  • Data
  • Inference
  • Results
  • Future work & Company vision

Architecture


논문 원문 · Figure 1

아주 재미있는 아키텍쳐이다. 일단, 내가 이해하기로 기존 VLA와 다른 핵심 특징은 3가지이다.

  1. Geometry-Change Tokens ($y^{GC}$)
  2. GC - VLM
  3. DINO & Depth Anything3 (정답 토큰 만드는 용도, offline)

1. Geometry-Change Token


여기서 Geometry - Change Token 이 이 논문의 핵심 포인트이다. 즉, 현재 프레임과 약 0.5초 뒤 프레임 사이에 장면의 geometry(물체의 위치, 모양 → 기계공학으로 치면 Deformation, Motion)가 얼마나, 어디서 바뀌었는지를 token으로 표현한다는 것이다.

  • 카메라 view 하나당 10×10 grid = 100개의 discrete token (LLM이 다음 단어 ID를 맞히듯이 token ID를 맞히는 분류 문제)
  • head 카메라 1개 + wrist 카메라 2개 = 총 300개 token
  • head view는 장면 전체의 변화, wrist view는 그리퍼–물체가 닿는 국소적인 변화를 담당한다.

!!여기서 햇갈리면 안되는게, 논문에서 $c_t$라는 기호는 따로 있다. Stage4 GCRF가 받는 96차원 context 벡터가 $c_t$이다. 그래서 이 글에서는 geometry-change 토큰을 $y^{GC}$라고 부르겠다.

2. GC-VLM


GC-VLM은 기존 VLM(Molmo2-ER)이 output으로 Geometry-Change token을 예측하도록 학습을 진행한 모델이다.

  • Backbone: Molmo2-ER (36 layer)
  • 그 위에 transformer block 12개를 추가하는데, 새로 random init 하는게 아니라 앞쪽 12개 block을 그대로 복사해서 초기화한다. → 이미 잘 학습된 가중치에서 출발하는 것.
  • 이 추가된 12개 block이 geometry-change 예측을 담당하는 윗층이 된다.

그리고 이 GC 정보를 Action Expert에 넘겨주는 통로가 GeometryReader이다. learned query로 GC hidden state를 pooling하고, Action Expert의 몇몇 block에 cross-attention으로 더해준다. 재밌는건 output projection을 0으로 초기화해서, 학습 초기에는 아무것도 안 하는 no-op에서 시작한다는 것. (원래 액션 경로를 망가뜨리지 않으려고)

3. DINO & Depth Anything3


처음에 나는 Action Expert가 만든 액션 chunk로부터 미래 관측을 얻고, 그걸 DINO/DA3에 넣는다고 이해했는데 → 아니다!!

정답 토큰은 데이터셋에 실제로 찍혀 있는 미래 프레임 $o_{t+H}$ 로 학습 전에 미리(offline) 만들어둔다. Action Expert와는 아무 상관이 없다.

1
2
3
4
5
현재 RGB o_t,  미래 RGB o_t+H  (H ≈ 0.5초, 데이터셋에 있는 실제 프레임)
-> Depth Anything3 : RGB -> pseudo-depth map (깊이 지도)
-> DINOv2 : depth map -> feature (10x10 grid)
-> Δe = e_t+H - e_t   (feature 차이)
-> quantize -> view당 100개의 discrete token ID = 정답 y_GC

즉 Depth Anything3가 깊이 정보를 만들고, DINOv2는 Segmentation을 하는게 아니라 그 depth map을 feature로 요약하는 역할이다. 결국 “깊이 지도가 어디서 얼마나 바뀌었는가”를 토큰으로 포착하는 것.

논문 원문 · Figure 2 (a) 현재 RGB (b) 미래 RGB (c–d) DA3 depth (e) DINO feature 차이 크기 (f) 양자화된 GC token ID (g) 현재 이미지 위 overlay

그리고 이제 GC-VLM은 현재 프레임만 보고 이 정답 토큰 ID를 맞히도록 cross entropy로 학습하는 것이다.

\[\mathcal{L}_{GC} = \mathrm{CE}\left(g_{GC}(F_\Theta(x_t)),\ y^{GC}_{t,H}\right)\]

Future frames are labels, not inputs.

→ 미래 프레임은 정답으로만 쓰이고 절대 입력으로 들어가지 않는다. (들어가면 cheating이니까)

Training


아주아주 신기하게도, 이 논문은 총 4가지 Stage로 트레이닝을 실시한다.

Stage 1 trains a geometry-change vision-language model (GC-VLM).

Stage 2 introduces a continuous ActionExpert and aligns it with robot actions while stopping action-flow gradients at the VLM interface.

Stage 3 enables these gradients to update the trainable VLM components jointly with the ActionExpert.

Stage 4 freezes GC-VLA and applies Geometry-Conditioned Residual Flow (GCRF), using a binary intervention router and a single bounded residual velocity policy learned from closed-loop feedback.

Stage데이터Loss학습되는 것
1: GC-VLM영상 frame pair (사람 영상 포함)GC token CEGC-VLM만 (Action Expert 없음)
2: detached로봇 demo (EEF action)CE + λ·Flow Matching둘 다, 단 액션 gradient는 VLM에서 차단
3: coupledLIBEROCE + λ·Flow Matching둘 다, 액션 gradient도 VLM까지 흐름
4: GCRFclosed-loop rollout 성공/실패BCE + advantageResidual policy, Router, Value head만 (나머지 Frozen)

Stage1


GC-VLM is initialized from Molmo2-ER and trained on current–future frame pairs with offline geometry-change targets. Robot-action labels are not required, and no ActionExpert is used in this stage.

맨처음에 우리가 할 것은 GC-VLM을 학습시키는 일이다. 그리고 여기에 사용된 것이 바로, Molmo2-ER 이라는 pretrained model을 기반으로 학습을 시켰다고 밝히고 있다.

여기서 액션 라벨이 필요 없다는 게 핵심이다. → 그래서 사람 egocentric 영상(HoloAssist)도 여기에 넣을 수 있는 것.

Stage2


자 이제 Action Expert (Flow Matching 기반 continuous action model)를 붙여서 로봇 액션을 학습시키는데, 여기서 포인트는 gradient를 어디까지 흘려보내냐이다.

1
2
3
4
현재 관측 x_t -> GC-VLM -> hidden h_t
  ├─ GC head      -> GC token 예측      : L_CE (정답은 offline으로 만든 y_GC)
  └─ Action Expert(h_t, q_t) -> action chunk : L_FM (flow matching)
                    ↑ L_FM의 gradient는 여기서 차단 (stop-gradient), VLM으로 안 넘어감
\[\mathcal{L}_2 = \mathcal{L}_{CE} + \lambda_{FM}\,\mathcal{L}_{FM}\]

즉 GC-VLM을 얼리는 게 아니다!! geometry loss로는 GC-VLM이 계속 학습되고, 액션 loss만 VLM 안으로 못 들어오게 막는 것이다. → 아직 덜 학습된 Action Expert가 Stage1에서 열심히 만든 geometry 표현을 망가뜨리지 않도록.

Stage3


여기서 Stage3는 이제 재미있는 사실이 action expert의 가중치만 수정하는 것이 아니라 GC-VLM 또한 같이 수정한다는 것이다. 즉 Stage2에서 막아뒀던 액션 gradient를 풀어서 VLM까지 흘려보낸다.

\[\mathcal{L}_3 = \mathcal{L}_{CE} + \lambda_{FM}\,\mathcal{L}_{FM} \quad (\text{stop-gradient 해제})\]

나만의 언어로 정리하면 → Stage2 = “VLM은 보는 법만 배우고, 액션은 옆에서 따로 배워라”, Stage3 = “이제 액션 잘하는 방향으로 보는 법도 같이 맞춰라”. 데이터는 LIBERO를 사용한다.

Stage4


Stage 4에서는 Stage 3까지 학습한 GC-VLA를 Frozen하고, Closed-loop 실행에서 얻은 성공/실패 피드백으로 별도의 Geometry-Conditioned Residual Flow(GCRF) 를 학습한다.

여기서 Velocity는 로봇 팔의 물리적 속도가 아니라, Action Expert가 Noise → Action Chunk를 생성하는 Flow Matching Velocity이다.

\[v_{final}=v_{base}+b_t\,\epsilon\tanh(z_t)\]
  • $v_{base}$: 기존 Frozen Action Expert의 Flow Velocity
  • $z_t$: Residual Policy가 생성한 보정 벡터
  • $b_t\in\{0,1\}$: 보정 적용 여부를 결정하는 Router
  • $\epsilon\tanh(z_t)$: 크기가 제한된 보정 Velocity

즉 Action을 완성한 뒤 수정하는 것이 아니라, Flow Integration 과정에서 Velocity를 수정해 최종 Action Chunk를 바꾼다.

그리고 Residual Policy가 보는 입력이 바로 논문의 $c_t$이다. (기존 액션 velocity 32차원 + GC feature 32차원 + flow history 32차원 = 96차원) 여기 GC feature도 DA3/DINO를 다시 돌리는게 아니라 모델 내부 표현에서 가져온다.

어떻게 학습할까? (Loss)

Closed-loop 실행에서 Context $c$, Residual $z$, 성공/실패 $y\in\{0,1\}$를 수집한다.

  1. Value Head: $Q(c,z)$가 성공 여부를 예측하도록 Binary Cross Entropy(BCE) 로 학습한다. 성공한 Residual이 보정 없음(No-op)보다 높게 평가되도록 Margin도 사용한다.
  2. Residual Policy: $A(c,z)=Q(c,z)-Q(c,0)$를 Advantage로 정의하고, No-op보다 유리한 보정을 더 잘 생성하도록 학습한다.
  3. Intervention Router: Closed-loop 피드백을 사용해 언제 보정할지 학습한다.

논문은 Policy의 최적화 방향은 설명하지만 전체 Loss 계수와 Router의 정확한 Loss 식은 공개하지 않는다.

결론: Stage 4는 기존 VLA를 다시 학습하는 것이 아니라, 성공/실패 피드백으로 Action Flow의 생성 경로를 미세 보정하는 Post-training이다.

Data


Stage마다 쓰는 데이터가 다르다. 핵심만 보면,

데이터S1S2S3역할
HoloAssistO––사람 egocentric 영상, 액션 loss 없음
ALOHAO––양팔 wrist 카메라 geometry pretraining
Hy-Embodied, HABIT, MolmoAct, Bimanual YAM, FMB/DROID100OO–geometry + 액션 둘 다
Austin Sailor / Berkeley UR5 / Berkeley Fanuc–O–단일 팔 demo → EEF 액션으로 변환
LIBERO––Odownstream 적응 + 평가

여기서 봐야할 포인트는 2가지이다.

  • Stage1에만 들어가는 데이터(HoloAssist, ALOHA)가 있다. → 액션 라벨이 없어도 “장면이 어떻게 바뀌는가”는 배울 수 있으니까. 이게 embodiment-agnostic이라는 주장의 근거.
  • 로봇마다 관절 구성이 다르니까 액션은 전부 EEF(End-effector, 로봇 손끝 기준) 좌표로 통일했다. 관절값이 아니라 손끝 위치/자세로 맞춰버리는 것.

논문 원문 · Figure 3 데이터 소스별 geometry-change 정답 예시 (현재 RGB / 미래 RGB / GC overlay)

아쉬운 점은 몇 시간, 몇 episode를 썼는지 같은 데이터 규모는 공개하지 않았다는 것.

Inference


학습할때는 DA3, DINOv2, 미래 프레임까지 다 썼지만, 추론할때는 훨씬 단순하다.

1
2
3
4
5
입력: 언어 지시 + 현재 RGB (multi-view) + 로봇 state q_t
-> GC-VLM (DA3, DINOv2는 아예 안 돌림!!)
-> GeometryReader -> Action Expert
-> flow 10 step 적분 (+ Stage4 Router가 켜면 residual velocity 더함)
-> action chunk (LIBERO 기준 horizon 10)

즉 DA3, DINOv2는 정답 만드는 용도로만 쓰고 버리는 것이다. 추론 비용이 늘지 않는다는 게 장점.

(다만 latency나 몇 Hz로 도는지는 논문에 안 나와있다.)

Results


평가는 LIBERO (4개 suite × 10 task × 50 초기상태 = 2,000 rollout) 하나로만 했다.

MethodSpatialObjectGoalLongAvg
π0.598.898.298.092.496.9
GR00T N1.797.797.598.594.497.0
ABot-M0.5100.099.899.498.499.4
Online SRPO (RL)98.8100.099.498.699.2
HABILIS Brain 0 (+GCRF)99.4100.099.499.499.55
  • Stage1–3까지만 하면 95.20%, Stage4 GCRF를 붙이면 99.55% (+4.35%p). 특히 제일 어려운 LIBERO-Long에서 99.4로 제일 높다.
  • 다만 비교군 중 99점대는 대부분 RL/closed-loop post-training을 한 모델들이라, GCRF 없는 95.20은 π0.5보다 낮다는 점은 같이 봐야한다.

Ablation (재밌는 것만)


  • Geometry-change target vs 현재 depth만: 같은 조건에서 현재 depth만 토큰으로 쓰면 82.1%, head+wrist depth 변화량을 쓰면 86.1% (+4.0%p) → “지금 모양”보다 “어떻게 바뀌는가”가 액션에 더 유용하다는 근거.
  • Residual을 어디에 넣을까: flow 10 step 전부에 나눠 넣으면 97.5%, 마지막 액션에 한방에 넣거나 첫 step에 몰아 넣으면 86.5% → 앞에서 말한 “Flow 과정에서 Velocity를 수정”하는 방식이 실제로 효과가 있다.
  • GeometryReader를 빼도 82.5% → 80.0%로 통계적으로 유의미한 차이는 없었다. → 성능은 Reader보다는 backbone이 GC pretraining으로 배운 표현 쪽에서 오는 것 같다는게 논문의 해석.

LIBERO-PRO (perturbation 평가)


물체 위치를 바꾸거나, 지시를 바꾸는 등 흔들어놓은 LIBERO-PRO에서는 평균 51.09% 로 π0.5(53.35%)보다 살짝 낮다. 그래도 Task perturbation 축에서는 21.45%로 비교군 중 가장 높다. (π0.5는 0.8%)

→ 솔직하게, LIBERO 99.55%는 LIBERO 분포에 맞춰 post-training한 결과라는걸 감안하고 봐야 한다.

Future work & Company vision


논문에 Future work 섹션은 따로 없고, Limitations에서 스스로 인정하는 부분은 이렇다.

  • 99.55%는 GC pretraining + LIBERO 위 closed-loop post-training을 합친 결과라서, pretraining 효과만 따로 떼어서 말할 수 없다.
  • LIBERO-PRO 결과도 GCRF가 얼마나 기여했는지는 분리되지 않았다.

그리고 내가 보기에 다음에 꼭 보고싶은 것.

  • 실제 로봇 결과. 지금은 시뮬레이션(LIBERO)만 있다.
  • 사람 영상(HoloAssist)을 뺐을 때 얼마나 떨어지는지. embodiment-agnostic이 핵심 주장인데 이걸 직접 보여주는 ablation이 없다.
  • 데이터 규모, 모델 전체 크기, latency 공개.

그래도 “액션 라벨 없이, 장면이 어떻게 바뀌는지를 먼저 배우고 → 그걸로 액션을 배운다”는 방향은 사람 영상을 대량으로 쓸 수 있는 길이라 아주 흥미롭다. 투모로로보틱스가 이걸 실제 로봇에서 어떻게 보여줄지 기대된다.