로봇에게 원하는 행동을 보상으로 알려 주면, 그 행동만 더 좋아질까요? 휴머노이드 보행을 학습시키며 이 질문에 여러 번 “아니다”라는 답을 얻었습니다. 팔의 움직임을 줄이려고 reward를 고쳤더니 팔은 거의 그대로였고, 대신 발이 교차하거나 로봇이 뒤로 이동했습니다. 이번 글에서는 네 번의 reward 변경 전후를 같은 평가 조건으로 비교해 무엇이 실제로 변했는지 정리합니다.
reward 하나가 보행 전체를 건드리는 이유
강화학습에서 reward는 로봇이 방금 한 행동을 얼마나 선호할지 알려 주는 점수입니다. PPO(Proximal Policy Optimization)는 이 점수를 이용해 정책을 조금씩 바꾸는 학습 방법인데, 여기서 정책은 현재 관측을 받아 다음 관절 명령을 고르는 함수입니다. 문제는 휴머노이드의 팔과 다리가 독립적으로 움직이지 않는다는 점입니다. 팔을 흔드는 동작이 보기에는 과해도, 현재 정책에는 불안정한 하체를 보완하는 방법일 수 있습니다.
처음에는 팔 동작이 지나치게 커 보였기 때문에 팔 관련 reward를 직접 고치면 된다고 판단했습니다. 넘어지지 않는지, 발이 교차하지 않는지, 앞으로 얼마나 이동했는지를 함께 확인하면 부작용도 걸러낼 수 있다고 생각했습니다. 그래서 이전 정책에서 학습을 이어 가되 한 단계마다 reward의 핵심 조건 하나만 바꾸고, 같은 평가기를 다시 실행했습니다. 결과는 “팔 점수”를 고치는 일이 전신의 균형 전략을 다시 협상하는 일에 가깝다는 것을 보여 줬습니다.
비교 조건을 먼저 고정했습니다
학습 화면에서 reward가 올라가는 모습만 비교하면 변경의 효과를 판단하기 어렵습니다. 그래서 네 단계 모두 명령 속도 1.0m/s, 단계별 32개 에피소드, 최대 15초라는 같은 조건으로 평가했습니다. 에피소드는 로봇이 초기 상태에서 출발해 종료될 때까지의 한 번의 시도입니다. 학습에 사용한 점수가 아니라 별도 평가에서 측정한 전진 거리, 낙상률, 발 교차 비율, 팔 action 평균을 비교했습니다.
팔 action은 물리적인 관절 각도가 아니라 정책이 출력한 팔 명령의 절댓값 평균입니다. 당시 평가 기준에서는 이 값이 2.0 이하여야 팔 사용이 허용 범위에 들어왔습니다. 전진 거리가 음수라면 앞으로 걸으라는 명령을 받았는데도 뒤로 이동했다는 뜻입니다. 발 교차 비율은 평가 시간 중 양발의 좌우 관계가 무너진 구간의 비율이므로 낮을수록 좋습니다.


| 단계 | reward에서 바꾼 판단 | 낙상률 | 전진 거리 | 발 교차 비율 | 팔 action 평균 |
|---|---|---|---|---|---|
| A | 상체 자세가 기준에 가까우면 완만하게 점수를 줌 | 0% | -1.770m | 3.48% | 3.413 |
| B | 발이 교차하지 않을 때만 팔 개선 점수를 허용 | 0% | 2.690m | 1.78% | 3.502 |
| C | 팔 명령 크기와 변화율을 직접 감점 | 0% | -2.718m | 10.27% | 3.456 |
| D | 깨끗한 하체 동작과 상체 안정이 함께 나타날 때만 점수를 줌 | 6.25% | 2.426m | 2.08% | 3.498 |
이 표에서 한 열만 보고 “좋아졌다”고 말할 수 있는 단계는 없습니다. B는 전진 거리와 발 교차가 좋아졌지만 정작 줄이려던 팔 action은 더 커졌습니다. C는 팔 action을 3.502에서 3.456으로 조금 낮췄지만 로봇이 2.718m 뒤로 이동했고 발 교차 비율도 10.27%로 늘었습니다. D는 하체 움직임을 다시 회복했지만 팔 action은 여전히 기준 2.0과 거리가 있었습니다.
A: 상체를 한 덩어리로 평가하자 팔은 빠져나갔습니다
첫 번째 선택은 허리, 엉덩이, 팔이 전반적으로 안정된 자세에 가까우면 제한된 추가 점수를 주는 방식이었습니다. 팔 하나만 강하게 누르면 균형이 무너질 수 있다고 보았기 때문에, 상체 전체의 형태를 먼저 부드럽게 유도하는 쪽을 골랐습니다. 학습 후 느린 속도와 보통 속도에서 낙상률은 0%였고, 발 교차도 이전보다 줄었습니다. 그러나 보통 속도 명령에서 전진 거리는 -1.770m였고 팔 action은 3.413으로 남았습니다.
원인을 추적해 보니 상체 점수를 받기 위한 조건이 너무 느슨했습니다. 정책은 허리와 엉덩이 일부를 정리하는 방식으로 점수를 받을 수 있었고, 팔은 큰 명령을 유지해도 됐습니다. 실제 추적 데이터 2,000개 행 가운데 팔 action이 기준 2.0 이하로 들어간 행은 하나도 없었습니다. 하나의 합산 점수 안에서는 쉬운 항목의 개선이 어려운 항목의 실패를 가릴 수 있다는 점을 배웠습니다.
B: 팔 개선을 필수 조건으로 만들었지만 팔은 더 커졌습니다
두 번째에는 허리나 엉덩이의 개선으로 팔 문제를 대신할 수 없도록 조건을 분리했습니다. 발이 교차하지 않고 지지 상태가 안정됐으며, 직전 시점보다 팔 action이 줄어든 경우에만 팔 개선 점수를 주었습니다. 학습 전 검사에서는 이 점수가 실제 데이터에서 활성화되고, 발이 교차한 구간에서는 차단되는 것을 확인했습니다. 따라서 적어도 reward 코드가 의도와 다르게 작동하는 문제는 아니었습니다.
평가 결과는 예상과 달랐습니다. 전진 거리는 -1.770m에서 2.690m로 회복됐고 발 교차 비율도 3.48%에서 1.78%로 줄었지만, 팔 action은 3.413에서 3.502로 오히려 커졌습니다. 정책은 순간적으로 팔을 덜 쓰는 구간을 만들어 개선 점수를 받을 수 있었지만, 평가 전체에서 팔을 안정된 범위로 옮기지는 않았습니다. “이전보다 조금 나아짐”에 주는 점수와 “목표 범위에 도달함”은 서로 다른 조건이었습니다.
C: 팔을 직접 누르자 하체가 대가를 치렀습니다
세 번째에는 순간적인 개선 점수를 버리고 팔 action의 크기와 변화율을 직접 감점했습니다. 앞 단계에서 팔 action이 전혀 목표 구간으로 이동하지 않았기 때문에, 더 직접적인 신호가 필요하다고 판단했습니다. 안정된 지지 상태에서만 감점이 적용되도록 제한해 발 동작을 보호하려 했습니다. 학습 전 추적에서도 팔 감점은 충분한 구간에서 활성화됐습니다.
팔 action은 3.502에서 3.456으로 줄었지만 변화량은 작았습니다. 반면 전진 거리는 2.690m에서 -2.718m로 뒤집혔고 발 교차 비율은 1.78%에서 10.27%로 증가했습니다. 팔을 덜 쓰게 만드는 압력은 전달됐지만, 정책은 그 비용을 하체와 전진 추적을 포기하는 방식으로 지불했습니다. reward가 의도한 항목을 움직였다는 사실만으로 전체 행동이 나아졌다고 볼 수 없었습니다.
팔은 단순한 보기 싫은 동작이 아니었습니다
여기서 reward 계수를 다시 높이기 전에 팔 동작을 평가 단계에서 강제로 줄여 봤습니다. 팔 action을 절반으로 만들자 전진 거리는 0.052m까지 줄고 발이 잘못 교차한 추적 행은 2,000개 중 484개로 증가했습니다. 팔 action을 완전히 0으로 만들면 팔 기준은 모두 통과했지만 전진 거리는 0.042m에 그쳤고 잘못 교차한 행은 720개가 됐습니다. 팔의 큰 움직임은 독립적인 결함이라기보다 불안정한 하체를 보상하는 현재 정책의 일부였습니다.
이 진단 때문에 네 번째 선택은 팔만 누르는 방식이 아니었습니다. 발이 교차하지 않고 앞으로 진행하는 하체 조건이 먼저 만족됐을 때만 상체 안정 점수를 허용했습니다. 팔을 고정해 놓고 점수를 받는 우회도 막았습니다. 즉, 상체 개선을 하체가 깨끗하게 작동하는 구간 안에서만 인정하도록 reward의 순서를 바꿨습니다.
D: 하체는 회복했지만 팔 문제는 남았습니다
결합 조건을 사용하자 전진 거리는 -2.718m에서 2.426m로 회복됐고 발 교차 비율도 10.27%에서 2.08%로 줄었습니다. 추적 데이터에서도 잘못 교차한 행이 263개에서 12개로 감소했습니다. 팔을 줄이는 대신 하체를 포기했던 C의 우회 경로는 상당 부분 막힌 셈입니다. 다만 낙상률은 6.25%로 늘었고 팔 action은 3.498로 다시 높아졌습니다.
이 단계도 보행 성공으로 판정하지 않았습니다. 전진과 발 배치는 회복됐지만 팔 action 기준은 2.0 이하인데 실제 값은 3.498이었고, 허리와 엉덩이 자세도 별도의 허용 범위를 넘었습니다. reward 조건을 결합하면 한 지표의 개선이 다른 지표를 망치는 현상은 줄일 수 있었지만, 팔 포화의 원인 자체를 제거하지는 못했습니다. 다음 문제는 reward 계수보다 정책의 action 분포, 기본 자세, 관절 매핑과 하체 불안정의 원인을 확인하는 쪽으로 옮겨 갔습니다.
학습 reward가 올라도 평가를 따로 해야 하는 이유
최종 평가만 보면 정책이 학습 도중 reward를 제대로 따라갔는지 알 수 없습니다. 그래서 네 단계의 TensorBoard 로그에서 100 iteration 동안 기록된 평균 episode reward와 평균 episode length를 다시 꺼냈습니다. episode length는 로봇이 한 번 시작한 뒤 종료 조건에 걸리기 전까지 버틴 시간에 해당합니다. 얇은 순간 변동보다 전체 추이를 보기 위해 그래프에는 7개 지점의 이동평균을 사용했습니다.

| 단계 | 평균 reward 처음 → 마지막 | 평균 episode length 처음 → 마지막 | 같은 조건의 최종 보행 |
|---|---|---|---|
| A | -37.2 → 167.6 | 20.8 → 634.9 | 1.770m 후진 |
| B | -22.8 → 583.7 | 20.2 → 878.7 | 2.690m 전진, 팔 action 증가 |
| C | -37.6 → 235.4 | 22.1 → 907.2 | 2.718m 후진, 발 교차 10.27% |
| D | -35.7 → 375.5 | 22.3 → 957.1 | 2.426m 전진, 팔 기준 미통과 |
먼저 주의할 점이 있습니다. 각 단계에서 reward 항목과 결합 조건이 달라졌으므로 B의 583.7이 D의 375.5보다 “더 좋은 정책”이라는 뜻은 아닙니다. 이 숫자는 서로 다른 시험지에서 받은 점수에 가깝습니다. 단계 사이의 절댓값보다 각 단계 안에서 정책이 새 점수표를 따라 올라갔는지를 보는 용도로만 사용해야 합니다.
그 기준으로 보면 네 정책은 모두 학습 신호를 따라갔습니다. 평균 reward는 음수에서 양수로 올라갔고, episode length도 모든 단계에서 크게 늘었습니다. 특히 C는 100 iteration이 끝날 때까지 평균 episode length가 907.2까지 늘었지만, 고정 평가에서는 2.718m 뒤로 이동하고 발 교차 비율이 10.27%까지 커졌습니다. 오래 버티며 높은 점수를 얻는 방법을 학습한 것과, 앞으로 안정적으로 걷는 방법을 학습한 것이 분리된 사례였습니다.
B와 D를 비교해도 같은 문제가 보입니다. B는 네 단계 중 마지막 평균 reward가 가장 높았지만 팔 action은 오히려 증가했습니다. D는 reward 상승 폭이 B보다 작았어도 전진과 발 배치를 함께 회복했습니다. 따라서 학습 곡선은 “최적화가 작동했는가”에는 답하지만 “최적화한 목표가 올바른가”에는 답하지 못합니다.
이후에는 reward 그래프를 버리는 대신 역할을 제한했습니다. reward와 episode length는 학습이 멈추거나 붕괴하지 않았는지를 확인하는 1차 지표로 사용하고, 고정 시나리오의 전진 거리·낙상·발 교차·상체 사용량은 행동이 실제 요구 조건을 만족하는지 확인하는 2차 지표로 분리했습니다. 두 종류의 지표를 함께 통과해야 다음 학습으로 넘어가도록 기준을 바꿨습니다.
이 사례는 기존 글인 평균 reward가 올랐는데 왜 로봇은 망가졌을까에서 설명한 원리를 실제 네 번의 변경으로 좁혀 본 기록입니다. reward hacking의 기본 개념은 보상 함수는 어떻게 실패하는가에서 먼저 볼 수 있습니다. 이후 학습 루프 자체를 어떻게 바꿨는지는 보상을 다시 고치기 전에 학습 루프를 다시 짠 이유에 정리했습니다.
이번 비교에서 남은 판단
이번에 배운 것은 “원하지 않는 관절을 더 세게 벌주면 된다”가 아니었습니다. 휴머노이드의 한 동작은 다른 관절의 실패를 보완하는 전략일 수 있으므로, reward 변경은 반드시 전진·접촉·균형·상체 지표를 함께 비교해야 합니다. 다음 단계에서는 팔 감점을 더 키우지 않고, 팔이 큰 명령을 내야만 했던 하체 상태와 action 표현을 먼저 분리해서 확인하려 합니다.