이번 단계 목표: 08편에서 위상 게이트는 네 번 연속 무시당했습니다. 용의자 넷을 하나씩 지워 나가면서, 정작 목록에 없던 진범을 찾습니다. 그리고 핵심 단들을 5개 seed로 재학습해 여기까지의 이야기가 운이었는지 확인합니다.
용의자 넷
08편 끝에 남은 가설은 이랬습니다.
- 경쟁 항목 —
feet_air_time이 잰걸음을 지지하고 있다 - 최적화 실패 — 명세상 정렬이 최적인데 탐색이 못 간다
- 가중치 부족 — 0.5가 작다
- 학습량 부족 — 1500 iteration이 모자라다
1번은 실험 한 번으로 지울 수 있습니다. air_time을 빼고 게이트만 남긴 단(L1′)을 돌리면 되니까요.
L1′ — 용의자 1 기각, 그리고 뜻밖의 정체
| 지표 | L1 (게이트+air_time) | L1′ (게이트만) |
|---|---|---|
| 걸음 빈도 | 2.95 Hz | 3.95 Hz — 더 빨라짐 |
| 보폭 | 14.7 cm | 9.3 cm |
| 발 들림 | 8.9 / 6.8 cm | 4.3 / 3.5 cm |
| 양발 동시 접지 | 10% | 35% |
| 게이트 획득 | 0.49 | 0.51 — 여전히 동전 던지기 |
영상:
두 가지가 결정됐습니다.
첫째, 용의자 1은 무죄입니다. air_time이 없어도 게이트는 똑같이 무시당했어요(0.51 정체). “air_time이 게이트를 가로막는다”는 제 설명은 틀렸습니다.
둘째, air_time의 진짜 역할이 드러났습니다. 그것은 게이트의 경쟁자가 아니라 내장 세트에서 유일하게 셔플을 억누르던 항목이었습니다. 체공 0.4초를 채점하는 이 통계 항목을 빼자 정책은 남은 명세의 진짜 최적점으로 내려갔어요. 4Hz, 보폭 9cm, 들림 4cm의 초잔걸음. 시즌 1의 셔플(8Hz)로 가는 길목이 다시 보인 셈입니다.
방향을 거꾸로 짚고 있었던 겁니다. ETH 계열의 이 “통계적” 항목은 순진한 게 아니라 실제로 일을 하고 있었어요. 제가 “구식”이라고 여겼던 항목이 사실은 유일한 방파제였다는 것 — 남의 설정을 읽을 때 가장 조심해야 할 종류의 오독입니다.
사다리의 마지막 단 — 통째로 옮기면?
항목 하나씩이 안 되니, 세트를 통째로 옮겨 보기로 했습니다. 공식 보상 항목 전부를 그대로 넣은 단(L6)입니다. 결과는 이랬어요.
| 지표 | L4 (사다리 최고) | L6 (공식 세트 이식) |
|---|---|---|
| 전진 실측 | 0.49 m/s | 0.01 m/s — 제자리 |
| 양발 동시 접지 | 24% | 100% (발을 안 뗌) |
| 무릎 가동 | 27~57° | 4°에서 동결 |
| 파워 | 107 W | 10 W |
로봇이 조각상이 됐습니다. 이 사건은 그 자체로 한 편이 필요해서 10편에 따로 뒀고, 여기서는 이 정책을 채점용 표본으로만 씁니다. 걷는 정책들과 나란히 놓고 비교할 수 있는 “극단적으로 다른 행동”이 하나 생긴 셈이거든요.
교차 평가 — 명세에게 직접 물어보기
게이트 무시가 “명세가 정렬을 안 좋아해서”인지 “좋아하는데 학습이 못 찾아서”인지는 결과만 봐선 알 수 없습니다. 그래서 도구를 하나 만들었습니다. 정책을 서로 바꿔 채점하기예요.
우리 손에 있는 모든 정책(여러 잰걸음들, 조각상)을 하나의 보상 세트 아래에서 재생해 초당 보상을 재면, 그 세트가 자기가 만들지 않은 행동 중 무엇을 선호하는지 순위로 드러납니다. 학습을 다시 돌릴 필요 없이 명세에게 직접 물어보는 거죠.
L1 세트(게이트가 들어간 명세)로 채점한 결과입니다.
L4 걷기 +2.43/s ≈ L1 +2.40 ≈ L0 +2.39 > 조각상 +1.83
이 명세는 2.5Hz부터 3.9Hz까지의 걸음 스타일들을 총점 0.04/s 차이로 사실상 구분하지 못합니다. 게이트 정렬에는 +0.5/s가 걸려 있는데(0.5에서 1.0까지 여지가 있어요), 어떤 학습도 그리로 가지 않았습니다.
게이트 점수만 따로 보면 더 선명합니다. 조각상 0.55, 모든 걸음 0.51±0.02. 골짜기가 아니라 고원이에요. 지역 탐색이 오를 경사가 없습니다.
진범 — 정책은 심판을 볼 수 없었다
여기서 뒤늦게 깨달았습니다. 게이트는 에피소드 시계로 채점합니다. 0.8초 주기의 위상을 계산해서 “지금은 왼발이 땅에 있어야 할 시각”인지 판정하죠.
그런데 정책의 관측에는 그 시계가 없습니다. 04편의 관측 표를 다시 보면 위상 클록 칸이 비어 있어요. 기억도 없는 MLP가 매 스텝 몸 상태만 보고 있는데, 지금이 주기의 어느 지점인지 알 방법이 없습니다.
보이지 않는 심판에게 박자를 맞추라는 명세였던 겁니다. 정렬하려면 “우연히 클록과 같은 주기·같은 위상으로 걷기”를 통째로 발견해야 하는데, 그 방향으로 가는 국소적 경사가 없으니 정책은 합리적으로 행동한 겁니다. 평균 0.5점을 챙기면서 원래 걸음을 유지하기.
시즌 1의 10편에서 우리가 클록 보상과 함께 관측에 sin/cos를 넣었던 이유가 사후적으로 정확해졌습니다. 그때는 “그냥 그렇게 하길래” 따라 했는데, 그 두 줄은 한 쌍이었어요.
개념 박스 — 채점 기준과 관측의 쌍 보상 항목은 “무엇을 채점하는가”만으로 정의되지 않습니다. “그 채점 변수를 정책이 지각할 수 있는가”와의 쌍으로만 작동해요. 정책이 볼 수 없는 변수로 채점하면, 그 항목은 정책 입장에서 통제 불가능한 무작위 보너스가 됩니다. 최적화기는 통제할 수 없는 것을 최적화하지 않습니다.
P12 등록 — 그리고 L7
가설이 섰으니 예측을 먼저 적었습니다.
P12 (2026-09-05 02:20, 학습 전 고정): L1의 관측에 클록 sin/cos 2차원을 추가하면 게이트 획득이 0.8/s를 넘고, 걸음 빈도가 1.25Hz ± 0.25로 떨어진다. 기각 조건: 그래도 0.6 이하 정체면 부분 관측성 가설을 버린다.
| 지표 | L1 (게이트만) | L7 (게이트+클록 관측) | 판정 |
|---|---|---|---|
| 게이트 획득 | 0.49 (동전 던지기) | 0.93~0.96 / 1.0 | 적중 |
| 걸음 빈도 | 2.95 Hz | 1.20 Hz | 적중 |
| 보폭 | 14.7 cm | 39.0 cm | 시즌 1 교정 걸음(32cm) 이상 |
| 스윙 시간 | 161 ms | 380 ms | |
| 전진 실측 | 0.46 | 0.50 m/s (−0%) | 완벽 추종 |
| 파워 | 132 W | 97 W (사다리 최저) |
영상:
보상은 한 글자도 안 바꿨습니다. 관측에 숫자 두 개를 추가했을 뿐인데, 일곱 번의 학습에서 요지부동이던 잰걸음이 클록 주기 그대로의 성큼걸음으로 바뀌었습니다.
유일한 흠은 발 들림 25cm로 과하다는 것(air_time + 게이트 + 긴 스윙의 상호작용으로 추정합니다 — 사후 가설이에요). 걸음 스타일의 잔손질은 시즌 1이 이미 걸었던 길이고 이 편의 질문 밖이라 여기서 멈춥니다.
5개 seed로 다시 — 운이었나
여기까지 전부 단일 seed였습니다. RL은 seed 하나로 이야기를 만들면 안 되는 분야라, 핵심 여섯 단을 각 5개 seed, 총 24회 22시간으로 재학습했습니다. 가설도 미리 등록했고요.

| 가설 | 핵심 수치 (평균±표준편차, n=5) | 판정 |
|---|---|---|
| H1 구조 불변 항목은 흡수된다 | L4 대 L0: 추종 0.49±0.01 대 0.42±0.03 | 5/5 |
| H2 클록 관측 없으면 게이트 무시 | L1·L1′·L4 전부 0.49~0.50 ± 0.01 | 5/5 |
| H3 클록 관측만으로 정렬 | L7: 게이트 0.95±0.01, 빈도 1.20±0.00 Hz | 5/5 |
| H4 세트 통이식 → 조각상 | L6: 전진 0.00±0.00 m/s | 5/5 |
| H5 교차 평가 순위 재현 | 두 세트 모두 순위 관계 유지 | 5/5 |
H3의 1.20±0.00을 보세요. 다섯 개 seed가 소수점 둘째 자리까지 같은 값입니다.
그리고 여기서 생각지도 못한 지표가 하나 나왔습니다. 명세가 침묵하는 축은 seed마다 흔들리고, 명세된 축은 분산이 붕괴한다. 걸음 빈도의 seed 간 표준편차가 L0에서는 ±0.32Hz인데 L7에서는 ±0.00입니다. 몸통 높이도 벌점을 넣은 단부터 분산이 무너지고요.
이건 미리 등록해 둔 2차 분석 세 개가 전부 성립한 결과입니다. “채점 안 하는 자유도는 최적화가 마음대로 쓴다”는 명제를 분산으로 측정할 수 있다는 뜻이에요. 결과값이 아니라 결과의 흔들림을 보면, 그 명세가 무엇에 대해 침묵하는지 읽힙니다.
덤으로 재미있는 것도. 상대 비대칭이 가장 큰 단은 L7이었습니다(28%). 들림 항목이 없는 단에서 큰 스윙은 아무도 채점하지 않으니까요. 하나를 명세하면 다른 침묵이 드러납니다.
08편에서 세운 사후 가설들의 운명도 정해졌습니다. “구조 안 바꾸고 얻는 항목만 흡수된다”는 H1·H2로 지지됐고, “두더지 잡기”는 seed마다 방향이 흔들려 탐색적 관찰로 강등했습니다. 한 번 본 패턴에 이름을 붙이면 안 된다는 얘기죠.
여기까지의 결론
격차의 분해가 절반 끝났습니다.
- 항목 이식으로 닫히는 부분: 들림 대칭, 자세·높이, 에너지·부드러움. “행동 구조를 안 바꾸고 얻을 수 있는” 성분들입니다.
- 항목 이식으로 안 닫히는 부분: 박자. 게이트 보상만으로는 고원이라 학습이 오를 경사가 없고, 정책이 채점 기준을 관측할 수 있어야 비로소 작동합니다.
- 방법론적 소득: 보상을 감사할 때 “각 항목의 채점 변수를 정책이 볼 수 있는가”를 반드시 물어야 합니다. 이 질문을 실험 전에 못 했고, 그래서 P1~P3을 다 틀렸습니다.
남은 절반은 조각상입니다. 세트를 통째로 옮기면 왜 로봇이 서 버리는지 → 10. 이식 실패의 분해