10. 이식 실패의 분해 — 공식 보상을 통째로 옮기면 왜 조각상이 되나

이번 단계 목표: 09편에서 공식 보상 세트를 통째로 옮기자 로봇이 걷기를 포기하고 서 버렸습니다. 이번 편은 그 “조각상”의 원인을 요인 실험으로 쪼갭니다. 로봇 모델 탓인가, 커리큘럼 탓인가, 밀치기 탓인가. 답은 셋 다 아니었고, 대신 보상 항목이 로봇에 따라 의미가 바뀌는 장면과 커리큘럼이 정지 정책에게 해킹당하는 장면을 보게 됩니다.


출발점 — 통이식은 5개 seed 전부 조각상

09편의 L6은 다중 seed로 승격해도 결과가 같았습니다. 5개 seed 전부 정지입니다. 전진 0.00±0.00 m/s, 양발 100% 접지, 무릎 동결, 몸통 높이는 목표값 정확히. “우연히 나쁜 seed”가 아니라 구조적 결과라는 뜻이에요.

영상:

— 10초 내내 아무 일도 일어나지 않습니다. 그게 결과입니다.

조각상은 그 자체로는 발견이 아니라 교란입니다. 원인 후보가 얽혀 있으니까요.

  1. 기체 공적응 — 공식 세트는 Unitree의 29관절 모델에 맞춰 튜닝됐고, 우리 37관절 모델에서는 항목의 의미가 달라졌을 수 있다.
  2. 학습 절차 공적응 — 공식 스택에는 명령 커리큘럼(±0.1에서 시작해 추종률 80%를 넘을 때마다 확장)과 이벤트(5초마다 밀치기, 질량·마찰 랜덤화)가 붙어 있는데, 우리는 보상만 옮기고 이것들은 안 옮겼다.

그래서 요인 실험을 짰습니다. 로봇 {우리 37관절, 공식 29관절} × 커리큘럼 {없음, 공식}, 그리고 가장 완전한 칸에 공식 이벤트까지 얹은 칸. 각 3개 seed, 1,500 iteration(05편과 동일 예산). 예측은 학습 전에 등록했습니다 — “공식 로봇 + 공식 커리큘럼이면 걷는다”가 그중 하나였고, 이건 보기 좋게 빗나갑니다.


결과 — 12칸 전부 조각상

보상 로봇 커리큘럼 이벤트 결과 (1,500 iter)
L6 공식 37관절 정지 5/5
L6C 공식 37관절 공식 정지 3/3
L6R 공식 29관절 (공식) 정지 3/3
L6RC 공식 29관절 공식 정지 3/3
L6RCE 공식 29관절 공식 공식 정지 3/3 (밀쳐도 스텝 없이 버팀)
L0R 범용 29관절 정지 (역방향 이식도 실패)
L0 (05편) 범용 37관절 걷기 (잰걸음이지만)

공식 로봇으로 바꿔도, 공식 커리큘럼을 붙여도, 5초마다 밀쳐도 섭니다. 심지어 우리 범용 보상을 공식 로봇에 얹어도 섭니다.

이 예산에서 걷는 칸은 딱 하나, 05편의 범용 보상 × 우리 37관절 모델뿐입니다. 그 모델의 유일한 특징은 가공의 액추에이션이에요. 모든 관절 토크 한계가 300N·m로, 실물 무릎 (139N·m)의 두 배가 넘습니다.

개념 박스 — 커리큘럼이 해킹당하는 산수 공식 커리큘럼의 관문은 “에피소드 추종 보상이 최대의 80%를 넘는가”입니다. 그런데 추종 보상은 속도 오차 제곱의 지수함수라, 가만히 서 있어도 명령이 ±0.1 m/s면 96%가 나옵니다. 정지 정책이 관문을 통과하고, 범위가 ±0.2, ±0.3으로 넓어지고, 정지로 80%가 안 나오는 ±0.6 근처에서 멈춥니다. 우리 커리큘럼 셀들이 정확히 이 계단을 밟았어요(37관절은 ±0.6, 29관절은 ±0.4까지). 한 번도 발을 떼지 않고요. 정지 끌개에서의 탈출로로 설계된 장치가, 그 끌개에게 점거당한 겁니다.

커리큘럼 레벨 궤적


진단 도구 — 명세는 뭘 원하나

09편에서 만든 교차 평가를 다시 꺼냅니다. 이번엔 공식 세트로 채점합니다.

공식 세트 × 우리 37관절 로봇:

조각상 +2.44/s  ≫  걷기 정책들 +0.67 ~ +0.94/s

정지가 명세의 진짜 선호였습니다. 범인도 항목 단위로 특정됩니다. 전 관절 dof_pos_limits(가중치 −5.0)가 걷는 정책들에게서 초당 1.8점을 뜯어가고 조각상에겐 0입니다.

Unitree 모델은 걸을 때 관절 한계 근처에 안 갑니다. 우리 모델은 발목·무릎이 한계 근처에서 일하고요. 그래서 같은 가중치가 우리 쪽에서만 “걷기 세금”이 됩니다. 같은 항목, 같은 숫자가 로봇이 바뀌면 의미가 바뀌는 겁니다. (5개 seed에서 순위 재현.)

공식 세트 × 공식 29관절 로봇으로 채점하면 반대가 나옵니다(11편에서 얻을 29관절 보행 정책으로 채점한 결과예요).

걷기 +2.97/s  >  조각상 +2.52/s

공식 로봇 위에서는 명세가 걷기를 선호합니다. 즉 29관절 셀들의 정지는 명세 문제가 아니라 최적화 문제입니다. 걷기가 더 좋은데 1,500 iteration 안에 못 찾은 것이죠.

이 구분이 다음 편의 예측 도구가 됩니다. “명세가 걷기를 선호하는 칸은 시간을 주면 걷고, 정지를 선호하는 칸은 시간을 줘도 안 걷는다.”


덤으로 잡힌 공적응 두 개

종료 조건 × 자기충돌. 공식 29관절 모델은 자기충돌이 켜져 있고 기본 자세의 굽힌 팔이 몸통에 닿습니다. 우리 환경의 “몸통 접촉 = 종료”와 만나자 모든 에피소드가 3스텝 만에 끝나 학습이 아예 불가능했어요(원판은 높이·자세 기반 종료라 무해합니다). 자기충돌을 끄고 일탈 로그에 기록했습니다. 로봇 설정과 종료 조건도 서로 맞물려 있다는 뜻입니다.

가짜 완료 사고. 후속 실험에서 체크포인트 경로 오류로 즉사한 학습이 있었는데, 평가기가 엉뚱한 정책으로 채점해 “그럴듯한 결과”를 냈습니다. 수치가 이전 결과와 소수점까지 같은 게 단서였어요. 평가기는 체크포인트가 없으면 하드 에러를 내도록 고쳤습니다. 사전 등록 문화가 없었으면 그대로 “예측 적중”으로 둔갑했을 사고입니다.


이 편의 결론

조각상의 원인을 셋으로 쪼개 봤더니 이렇습니다. 우리 로봇에서는 관절한계 벌점의 의미 변화(명세 문제)였고, 공식 로봇에서는 로봇도 커리큘럼도 밀치기도 아닌 무언가 (최적화 문제)였습니다.

그 “무언가”를 찾다가 원판 설정 파일에서 한 줄을 발견했습니다.

max_iterations = 50000

우리는 1,500으로 통제하고 있었습니다. 33배 차이예요. 다음 편은 여기서 시작합니다 → 11. 시간이라는 성분

주장의 지위 “12칸 전부 정지”, “세금 초당 1.8점”, “순위 5/5 재현”은 측정입니다. “커리큘럼 해킹의 산수”는 로그로 확인된 기전이고요. “로봇이 바뀌면 항목의 의미가 바뀐다”는 교차 평가가 직접 보여준 것이지만, 그 일반화(“보상은 기체에 공적응된다”)는 이 로봇 한 쌍에서만 검증된 주장입니다.

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.