이 글은 서강대 가상융합 전문대학원(구 메타버스 전문대학원) 강화학습 자료를 기반으로 작성되었습니다.
PPO 완벽 해부: 가장 강력하고 안정적인 표준 알고리즘
앞선 논의를 통해 우리는 정책과 가치를 결합하는 Actor-Critic 구조가 정책 그래디언트의 불안정성을 상당 부분 해결했음을 확인하였다. A2C와 A3C는 평론가(Critic)의 평가 신호를 안정화하여 배우(Actor)가 올바른 방향으로 나아가도록 도왔다. 그러나 여전히 정책 학습에는 해결되지 않은 근본적인 문제가 남아 있었다. 바로 정책 자체가 한 번의 업데이트로 너무 멀리 이동해 버리면 학습 전체가 다시 무너질 수 있다는 점이다. 학습률(Learning Rate)을 작게 잡으면 안정적이지만 속도가 느리고, 크게 잡으면 속도는 빠르지만 정책이 급격히 붕괴되는 '정책 붕괴(Policy Collapse)' 현상이 발생한다. 이 문제는 단순한 하이퍼파라미터 튜닝의 문제가 아니라, 정책 업데이트의 크기에 대한 구조적 제약이 없기 때문에 발생하는 현상이었다.
이 질문, 즉 "정책은 얼마나 조심스럽게 바뀌어야 하는가"에 대한 해답을 제시한 것이 바로 PPO(Proximal Policy Optimization) 알고리즘이다. PPO는 Actor-Critic 구조 위에 '정책 업데이트 제어 장치'를 얹어, 정책이 안정적인 '신뢰 구간' 안에서만 움직이도록 강제한다. 이는 On-Policy 정책 그래디언트 계열에 속하지만, 안정성 면에서는 Actor–Critic의 장점을 강하게 흡수하여 간단함과 안정성 사이의 균형을 맞춘 알고리즘이다.
정책 업데이트의 크기를 제한하려는 시도는 TRPO(Trust Region Policy Optimization)에서 처음으로 정식화되었다. TRPO는 정책 업데이트가 이전 정책으로부터 KL 다이버전스(KL divergence) 기준으로 일정 범위를 넘지 않도록, 즉 '신뢰 구간' 안에서만 움직이도록 수학적 제약을 두었다. 그러나 TRPO는 복잡한 제약 최적화를 요구하여 구현 난이도와 계산 비용이 매우 높다는 단점이 있었다.
PPO는 TRPO의 핵심 아이디어를 계승하되, 복잡한 연산 대신 클리핑(Clipping)이라는 단순하고 실용적인 장치로 이를 구현하였다. PPO의 핵심은 중요도 샘플링 비율 에 있다. 이 비율은 과거 정책 기준으로 수집된 행동이 새로운 정책에서는 얼마나 더 자주(혹은 덜) 선택될지를 정량적으로 나타낸다. 만약 새 정책이 과거 정책에서 너무 멀리 이동해 이 비율 이 1에서 크게 벗어나면, 기존 데이터는 더 이상 새 정책을 대표하지 못하게 되어 학습 신호가 왜곡된다.
PPO는 비율$r$이 $1 \pm \epsilon$범위를 벗어날 때, 더 이상의 이득을 업데이트 목적 함수에 반영하지 않도록 설계한다. 이것이 바로 PPO의 핵심인 클리핑 된 목적 함수(Clipped Objective)이다.
1. 칭찬받을 때 (Advantage가 양수): 특정 행동의 확률을 높이고 싶더라도, 비율이 이상으로 커지면 그 이상의 업데이트 유인이 잘려 나간다.
2. 꾸중들을 때 (Advantage가 음수): 특정 행동의 확률을 낮추고 싶더라도, 비율이 이하로 줄어들면 그 이상의 추가 업데이트 유인이 제한된다.
이 구조는 마치 가속 페달에 브레이크가 함께 달린 것과 같아서, 더 가고 싶어도 일정 이상은 가지 못하게 만든다. 이를 통해 정책이 스스로 조심스러워지는 효과를 만들어내며, $\epsilon$의 전형적인 범위는 0.1 ~ 0.3으로 설정된다.
PPO 역시 안정적인 정책 업데이트를 위해 GAE(Generalized Advantage Estimation)를 사용하여 어드밴티지를 추정한다. GAE는 Monte Carlo 방식(분산 높고 편향 낮음)과 TD(0) 방식(분산 낮고 편향 높음) 사이의 절충점을 찾는 기법이다. GAE의 파라미터 $\lambda$는 단기 보상과 장기 보상을 균형 있게 반영하도록 조절되며, PPO에서는 $\lambda \approx 0.95$를 사용하는 것이 표준적이다. GAE는 미래 정보가 현재 평가에 반영되는 구조를 구현하기 위해 항상 Backward 방식(뒤에서 앞으로)으로 계산된다.
강화학습의 안정성을 확보하기 위해 PPO는 두 가지 서로 다른 클리핑 기법을 동시에 활용한다. 이 둘을 명확히 구분하는 것은 구현의 핵심이다.
1. 일반적인 '그래디언트 클리핑' (Gradient Clipping): 이는 Actor-Critic 계열(A2C, A3C 등)을 포함한 딥러닝 전반에서 사용되는 범용적인 안전장치이다. loss.backward()로 계산된 기울기 벡터의 크기(norm)가 특정 임계값(예: 0.5)을 넘지 않도록 강제로 제한하여, 드물게 발생하는 폭발적인 기울기로 인해 파라미터가 망가지는 것을 방지한다.
2. PPO 고유의 '목적 함수 클리핑' (Objective Clipping): 이는 PPO 알고리즘의 정체성이자 핵심 설계이다. 기울기가 아니라 정책의 변화 비율 ) 자체를 목적 함수 단계에서 범위로 잘라낸다. 이는 정책이 데이터 수집 시점의 정책에서 '너무 멀리 이동하는 것'을 구조적으로 막는 역할을 한다.
PPO는 On-Policy 계열임에도 불구하고, 클리핑 메커니즘 덕분에 수집된 데이터를 여러 Epoch에 걸쳐 재사용할 수 있어 샘플 효율이 높다. 이 과정에서 롤아웃(Roll-out) 개념이 중요하다. 롤아웃은 에이전트가 현재 정책을 따라 환경과 상호작용하며 데이터를 수집하는 과정을 의미한다.
구현 단계에서 가장 주의해야 할 점은 과거 정책과 현재 정책의 분리이다. 롤아웃 시 수집된 log_prob_old와 value_old는 업데이트 시점에서는 단순한 상수 취급을 받아야 한다. PyTorch 등의 프레임워크에서는 이 값들에 반드시 detach()를 적용하여 그래디언트가 과거로 흐르는 것을 막아야 한다. 이를 지키지 않으면 비율 계산 시 분모까지 미분되어 수식이 엉키고 학습이 붕괴하게 된다.
PPO 학습이 제대로 되고 있는지 판단할 때, 단순히 손실(Loss) 값만 보는 것은 불충분하다. PPO에는 학습 상태를 진단하는 '속도계와 브레이크' 역할을 하는 두 가지 핵심 지표가 있다.
1. KL 다이버전스 (KL divergence): 이전 정책과 현재 정책 사이의 평균적인 변화량(속도계).
2. 클립 비율 (Clip Fraction): 전체 샘플 중 클리핑이 실제로 적용된 비율(브레이크 작동률).
이 두 지표는 함께 해석되어야 한다. KL이 크고 Clip 비율이 높다면, 정책이 너무 공격적으로 변하고 있다는 뜻이므로 학습률을 줄이거나 클립 범위를 좁혀야 한다. 반대로 KL이 작고 Clip 비율이 낮다면, 정책이 지나치게 보수적이므로 학습률을 올리거나 클립 범위를 넓혀 더 적극적인 학습을 유도해야 한다. "Always check KL divergence and clip fraction first"는 PPO 디버깅의 제1원칙이다.
PPO는 이산 행동뿐만 아니라 로봇 제어와 같은 연속 제어(Continuous Control) 문제로도 자연스럽게 확장된다. 이때는 가우시안 분포를 사용하여 평균과 분산을 학습하며, 행동의 물리적 한계(상한/하한)를 맞추기 위해 tanh 함수로 행동을 압축(Squash)하고 Jacobian 보정을 수행하는 정교한 처리가 필요하다.
마지막으로 PPO는 하이퍼파라미터 설정에 민감한데, 경험적으로 검증된 '안정 영역'이 존재한다. 롤아웃 길이는 반응 속도와 추정 정확도 사이의 타협점인 1024~2048 스텝이, GAE 파라미터 는 0.95 내외가, 데이터 재사용 횟수인 Epoch는 4~10회가 표준적으로 사용된다.
PPO는 TRPO의 이론적 토대 위에 클리핑이라는 실용성을 입히고, GAE와 각종 공학적 디테일로 안정성을 완성한 알고리즘이다. 통제된 작은 개선을 반복하는 강화학습의 철학을 가장 잘 구현한 PPO는 오늘날 현대 정책 최적화 연구의 가장 중요한 기준점(Baseline)으로 자리 잡았다.
'Reinforcement learning' 카테고리의 다른 글
| [강화학습 정복하기] 11강: 게임을 넘어 현실로-인간과 소통하고 미래를 설계하는 지능 (0) | 2025.12.22 |
|---|---|
| [강화학습 정복하기] 9강: 배우와 평론가의 만남: Actor-Critic (A2C)과 GAE (0) | 2025.12.22 |
| [강화학습 정복하기] 8강: 가치에서 정책으로-REINFORCE 알고리즘과 정책 그래디언트 (0) | 2025.12.22 |
| [강화학습 정복하기] 7강: DQN 성능 높이기-Dueling DQN 구조와 학습 안정화 팁 (0) | 2025.12.22 |
| [강화학습 정복하기] 6강: DQN의 탄생-딥러닝이 강화학습을 만났을 때 (Replay Buffer & Target Network) (0) | 2025.12.22 |