최근 G1 실험에서는 PPO 업데이트를 거친 로봇이 넘어지지 않고 계속 걸었는데도 새 정책을 채택하지 않았습니다. 느린 보행 경로가 기준보다 짧아졌기 때문입니다. 이 경험은 PPO를 이해할 때 자주 빠지는 오해를 보여 줍니다. PPO는 로봇에게 올바른 행동을 알려 주는 알고리즘이 아닙니다. 현재 정책이 만든 경험에서 어느 행동의 확률을 높이고 낮출지 계산하고, 한 번의 변경이 지나치게 커지지 않도록 제한하는 알고리즘입니다.
이 글에서는 PPO(Proximal Policy Optimization)를 수식 암기용으로 설명하지 않습니다. 로봇이 시뮬레이터에서 경험을 모으는 순간부터 actor와 critic이 학습되고, clipping을 거쳐 다음 정책이 만들어지는 과정까지 한 번의 업데이트를 따라가 봅니다. 마지막에는 clipping이 있는데도 왜 정책이 나빠질 수 있는지를 현재 G1 작업과 연결합니다.

한 번의 PPO 업데이트를 먼저 한눈에 봅니다
PPO를 처음 읽을 때 가장 혼란스러운 부분은 로봇의 한 제어 step과 학습 iteration을 같은 단위처럼 받아들이는 것입니다. 현재 G1에서는 policy가 20 ms마다 행동을 내지만, 그때마다 신경망 weight를 고치지 않습니다. 4,096개 환경에서 각각 24 step, 즉 환경별 0.48초의 경험을 먼저 모은 뒤에야 한 번의 PPO iteration이 시작됩니다.
| 단계 | 현재 G1에서 들어오는 것 | 그 단계가 만드는 것 | 아직 증명하지 못하는 것 |
|---|---|---|---|
| 1. 행동 생성 | 73차원 관측, actor의 Gaussian 분포 | 29차원 sampled action | 그 행동이 좋은 보행이라는 판정 |
| 2. rollout | 4,096환경 × 24 step | 98,304개 transition | 새 정책의 성능 |
| 3. return·advantage | reward, done, critic value | critic target과 Â | reward가 실제 목표와 일치한다는 보증 |
| 4. 최적화 | 4 mini-batch × 5 epoch | 20번의 optimizer step | 모든 상태에서 정책 변화가 작다는 보증 |
| 5. 재수집 | 갱신된 현재 정책 | 다음 on-policy rollout | checkpoint 승격 |
이 구분을 해 두면 학습 로그의 숫자가 서로 다른 시간을 가리킨다는 사실도 보입니다. reward는 simulation step에서 생기고, episode length는 종료된 episode를 요약하며, surrogate loss와 value loss는 모아 둔 mini-batch를 학습할 때 생깁니다. 자세한 시간축은 physics step·decimation·vector rollout 글, 관측·행동·보상·종료 조건은 로봇 강화학습 환경 소개글에 분리해 두었습니다.
PPO가 바꾸는 것은 행동 자체가 아니라 행동의 확률입니다
강화학습에서 policy는 관측을 받았을 때 어떤 행동을 선택할지 정하는 규칙입니다. 로봇 보행에서는 관측에 몸통의 속도와 방향, 관절 위치·속도, 목표 속도 등이 들어가고, 행동은 각 관절에 보낼 목표값이 됩니다. 연속 제어의 actor는 보통 하나의 고정 행동만 출력하지 않고 행동 분포의 평균과 분산을 만듭니다. 학습 중에는 이 분포에서 행동을 뽑기 때문에 같은 상태에서도 조금씩 다른 시도를 할 수 있습니다.
관측 o_t → actor π_θ(a|o_t) → 행동 a_t
행동 a_t → 시뮬레이터 → reward r_t, 다음 관측 o_(t+1)
정책의 파라미터 θ를 바꾸면 같은 관측에서 각 행동이 선택될 확률밀도가 달라집니다. PPO 업데이트의 직접적인 목표는 좋은 결과와 연결된 행동의 확률을 높이고, 나쁜 결과와 연결된 행동의 확률을 낮추는 것입니다. 관절 목표를 정답 라벨과 비교하는 지도학습과 달리, “이 상태에서는 무릎을 정확히 몇 도 움직여야 한다”는 답을 미리 제공하지 않습니다.
on-policy라는 말은 현재 정책의 경험으로 학습한다는 뜻입니다
PPO는 on-policy 알고리즘입니다. 업데이트 전의 현재 정책으로 시뮬레이션을 실행하고, 그 정책이 실제로 만든 관측·행동·보상·종료 신호를 rollout으로 모읍니다. 수집된 rollout은 여러 미니배치와 epoch에서 반복해 사용할 수 있지만, 정책을 갱신한 뒤에는 새 정책으로 경험을 다시 모읍니다. 오래된 경험을 replay buffer에 계속 쌓아 두고 재사용하는 SAC 같은 off-policy 방법과 다른 지점입니다.
이 방식은 표본 효율 면에서는 불리합니다. 정책이 바뀔 때마다 새 데이터가 필요하기 때문입니다. 반면 Isaac Lab에서는 수천 개의 환경을 GPU에서 동시에 실행할 수 있어 이 단점이 줄어듭니다. 현재 G1 설정을 예로 들면 4,096개 환경이 각각 24 step을 모으므로 한 번의 업데이트에 98,304개의 transition이 들어갑니다. 화면에서 로봇 한 대를 24번 움직이는 것이 아니라, 서로 다른 초기 상태를 가진 4,096대가 동시에 짧은 경험을 만드는 구조입니다.
critic은 행동을 고르지 않고 기대치를 만듭니다
reward 하나만 보고 행동을 평가하면 판단이 흔들립니다. 같은 +1의 reward도 넘어지기 직전의 상태에서는 좋은 결과일 수 있고, 이미 안정적으로 걷는 상태에서는 기대보다 나쁜 결과일 수 있습니다. 그래서 PPO는 actor와 함께 critic을 학습합니다. critic의 value function V(o_t)는 현재 관측에서 앞으로 받을 할인된 reward 합을 예측합니다.
actor가 필요한 값은 return 자체보다 advantage입니다. advantage는 실제 결과가 critic의 기대보다 얼마나 좋거나 나빴는지를 나타냅니다.
TD 오차: δ_t = r_t + γV(o_(t+1)) - V(o_t)
GAE: Â_t = δ_t + γλδ_(t+1) + (γλ)²δ_(t+2) + ...
Â_t가 양수라면 그 행동은 예상보다 좋은 결과와 연결됐고, 음수라면 예상보다 나빴다는 뜻입니다. GAE(Generalized Advantage Estimation)는 여러 시점의 TD 오차를 섞어 advantage를 추정합니다. 멀리 있는 reward까지 많이 포함하면 장기 결과를 반영할 수 있지만 추정 분산이 커지고, 가까운 정보만 보면 안정적인 대신 편향이 커집니다. γ와 λ는 이 절충을 조절합니다.
clipping은 새 정책이 이전 정책에서 너무 멀어지는 것을 억제합니다
rollout은 이전 정책 π_old가 만든 데이터입니다. 그런데 이 데이터로 새 정책 π_θ를 여러 번 업데이트하면, 새 정책이 경험을 만든 정책과 빠르게 달라질 수 있습니다. 그러면 “이 행동이 좋았다”는 과거 데이터의 의미도 불안정해집니다. PPO는 같은 행동의 새 정책 확률밀도와 이전 정책 확률밀도의 비율을 사용해 변화를 측정합니다.
r_t(θ) = π_θ(a_t|o_t) / π_old(a_t|o_t)
L_CLIP = E[min(
r_t(θ) Â_t,
clip(r_t(θ), 1-ε, 1+ε) Â_t
)]
비율이 1이면 해당 행동의 확률밀도가 바뀌지 않았다는 뜻입니다. 현재 G1 설정처럼 ε=0.2라면 기준 구간은 0.8~1.2가 됩니다. advantage가 양수인 행동의 비율을 1보다 크게 만들면 목적함수가 좋아지지만, 1.2를 넘은 부분에서는 추가 이득이 잘립니다. 반대로 advantage가 음수인 행동의 확률을 과도하게 낮추려는 유인도 0.8 쪽에서 제한됩니다.
여기서 “clip이 정책 확률을 반드시 0.8~1.2 안에 가둔다”고 이해하면 안 됩니다. clipping은 surrogate objective의 이득을 잘라 내는 장치이지 모든 행동의 확률비나 신경망 파라미터를 강제로 묶는 hard constraint가 아닙니다. 여러 샘플의 gradient가 함께 작용하면 전체 정책 거리가 예상보다 커질 수 있습니다. 그래서 실제 구현은 KL divergence도 관찰하고, 현재 G1 설정은 desired KL을 0.01로 두어 학습률을 적응적으로 조절합니다.
한 번의 PPO 업데이트에는 세 가지 목적이 함께 들어갑니다
PPO 학습 로그를 볼 때 policy loss 하나만 보면 흐름을 놓치기 쉽습니다. 실제 actor–critic 학습에는 보통 세 부분이 함께 들어갑니다.
- clipped policy objective: advantage 방향으로 행동 확률을 바꾸되 과도한 갱신 이득을 제한합니다.
- value loss: critic의 value 예측이 계산된 return에 가까워지게 합니다.
- entropy bonus: 행동 분포가 너무 빨리 좁아지지 않게 해 탐색을 유지합니다.
현재 G1 설정은 PPO clip 0.2, γ=0.99, GAE λ=0.95, entropy coefficient 0.002를 사용합니다. rollout 하나를 4개 미니배치로 나누고 5 epoch 동안 갱신합니다. actor와 critic의 gradient가 너무 커지는 것을 막기 위해 최대 gradient norm도 1.0으로 제한합니다. 이 값들은 각각 다른 종류의 불안정을 다룹니다. clip은 policy ratio, value loss는 기대치 추정, entropy는 탐색 붕괴, gradient norm은 한 번의 수치적 폭주와 관련됩니다.
PPO가 휴머노이드 보행에서 자주 쓰이는 이유
휴머노이드 보행은 20~30개가 넘는 관절을 동시에 움직이는 연속 제어 문제입니다. 한 발 지지와 충돌처럼 동역학이 불연속적으로 바뀌고, 잘못된 행동 몇 번이면 episode가 끝납니다. PPO는 복잡한 환경 모델이나 replay buffer 없이 현재 rollout과 actor–critic만으로 학습할 수 있고, 대규모 병렬 시뮬레이션과 결합하기 쉽습니다. 구현 사례와 튜닝 경험이 축적돼 있다는 점도 실제 연구에서는 큽니다.
대신 on-policy 방식이라 새 경험을 계속 수집해야 하고, reward가 드문 태스크에서는 학습 신호가 약합니다. 또한 PPO의 안정성은 “주어진 reward를 비교적 안정적으로 최적화한다”는 의미에 가깝습니다. reward가 우리가 원하는 행동을 정확히 표현한다는 보장은 없습니다. 발을 들도록 주는 보상이 잘못 설계되면 제자리에서 발만 크게 움직일 수 있고, 살아 있는 시간의 비중이 너무 크면 전진하지 않고 버티는 정책이 나올 수 있습니다.
clip은 잘못된 방향으로 가는 작은 걸음을 막지 못합니다
이 구분이 현재 G1 실험과 직접 연결됩니다. v590과 v600은 PPO가 실행됐고 낙상과 발 교차도 없었지만, 느린 보행 이동거리가 기존 기준보다 각각 0.7199 m와 0.2479 m 줄었습니다. reward 압력은 학습 로그에서 관찰됐으므로 loss가 완전히 죽어 있던 상황과도 달랐습니다. 정책이 업데이트되기는 했지만 우리가 보존하려던 보행 경로와 형태를 함께 개선하지 못했습니다.
clip은 이 문제를 해결하지 않습니다. clip이 제한하는 것은 직전 정책에서 한 번에 얼마나 공격적으로 멀어질지입니다. reward가 잘못된 대리 목표를 가리키거나 advantage 추정에 편향이 있다면, PPO는 작은 걸음으로도 원하지 않는 방향을 따라갈 수 있습니다. 따라서 reward 합계와 PPO loss는 학습이 진행됐다는 증거일 뿐, 행동 품질이 좋아졌다는 판정이 아닙니다.
그래서 G1에서는 PPO 밖에 별도의 평가 gate를 둡니다. 고정된 느린·정상 속도 조건에서 이동거리, 낙상, 발 교차, 허리·고관절·팔의 형태, commanded action과 raw action을 비교합니다. 이 gate를 넘지 못한 후보는 checkpoint가 생성됐더라도 다음 학습의 기준으로 승격하지 않습니다. 현재 PPO를 멈추고 비학습 인과 진단을 먼저 진행하는 이유도 여기에 있습니다.
PPO 로그를 읽을 때 확인할 순서
제가 PPO 실행을 다시 볼 때는 episode reward부터 보지 않습니다. 먼저 rollout이 현재 정책에서 정상적으로 수집됐는지 확인하고, advantage의 분포와 value loss가 무너지는지 봅니다. 다음으로 KL, entropy, gradient norm, clip이 적용된 샘플 비율을 확인합니다. 이 값들은 업데이트가 너무 크거나 탐색이 급격히 사라지는 문제를 보여 줍니다.
그 다음에야 환경별 reward 항과 고정 조건 평가를 연결합니다. 특정 penalty가 줄었다면 정책이 정말 원하는 자세를 만들었는지, 아니면 그 penalty가 발생하는 상황을 회피하면서 전진 능력을 잃었는지 trace로 확인해야 합니다. PPO 내부 지표는 업데이트의 상태를 설명하고, 외부 평가는 그 업데이트를 받아들일지를 결정합니다.
PPO를 한 문장으로 줄이면 이렇습니다. 현재 정책의 경험에서 예상보다 좋았던 행동은 더 자주, 나빴던 행동은 덜 선택하도록 만들되, 한 번의 업데이트가 너무 멀리 가지 않게 제어하는 방법입니다. 이 설명에서 reward와 평가가 빠지면 절반만 이해한 것입니다. PPO가 다시 열리는 다음 실험에서 확인해야 할 질문도 단순한 reward 상승이 아니라, 제한된 한 번의 업데이트가 기존 보행 경로를 보존하면서 목표한 형태 지표까지 개선했는가입니다.
프로젝트에서 이어 읽기: G1 보행 정책을 어떻게 학습하고 있는가 · PPO 학습 로그 읽는 법 · PPO 하이퍼파라미터를 바꾸는 순서 · 휴머노이드 보행은 무엇으로 평가해야 하는가 · Learning to Walk in Minutes 논문 읽기
원문과 구현: Proximal Policy Optimization Algorithms · High-Dimensional Continuous Control Using Generalized Advantage Estimation · RSL-RL 공식 저장소
기술 기준 시점: 2026-07-21. 프로젝트 예시는 origin/main@ee4d96e의 G1 환경과 PPO 설정을 기준으로 작성했습니다. v590·v600의 one-iteration PPO는 실행됐지만 두 checkpoint 모두 기각됐고, 추가 PPO 실행은 현재 승인되지 않았습니다.