PPO: clipped surrogate objective는 무엇을 지키는가
Proximal Policy Optimization Algorithms (Schulman et al., OpenAI, arXiv 2017)
Introduction
3부(10~13편)에서 다룬 문제는 한결같았다. reward model이 학습 분포를 벗어난 입력에서 잘못된 점수를 준다는 것, 그리고 정책이 그 빈틈을 정확히 찾아내 파고든다는 것. Overoptimization scaling law(10편)는 이 붕괴를 KL divergence의 함수로 정량화했고, length correlation(11편)과 ODIN(12편)은 그 붕괴가 구체적으로 어떤 axis에서 일어나는지 보여줬고, WARM(13편)은 reward model 여러 개를 평균 내서 hacking에 덜 취약하게 만드는 방향으로 답했다. 그런데 이 네 편의 글은 전부 “reward를 어떻게 더 단단하게 설계할 것인가”에 관한 이야기였다. reward가 아무리 단단해도, 그 reward를 정책 업데이트에 반영하는 과정 자체가 통제 불능이면 소용없다. 한 번의 큰 gradient step이 정책을 이상한 지역으로 밀어버리면, reward model이 아무리 정교해도 그 지역에서의 점수는 애초에 의미가 없다.
이 글에서 다루는 Proximal Policy Optimization(PPO)은 이 두 번째 문제, 즉 “설계한 reward를 정책에 얼마나 안전하게 반영할 것인가”를 다룬다. 2017년에 나온 순수 RL 논문이고 언어 모델이나 사람 선호는 한 줄도 등장하지 않는다. 하지만 이 논문이 도입한 clipped surrogate objective는 이후 InstructGPT(2편, /blog/2026/instructgpt/)를 비롯한 거의 모든 RLHF 파이프라인의 최적화 단계에 그대로 들어갔고, 지금 이 시리즈의 4부 전체(14~18편)가 이 논문이 만든 프레임 위에서 진행된다. PPO 자체의 실전 트러블슈팅은 15편(Secrets of RLHF I, /blog/2026/secrets-rlhf-ppo/)이 다루고, PPO의 무거운 value network를 아예 걷어내는 시도는 16편(GRPO, /blog/2026/grpo-deepseekmath/)이 다룬다. 이 글은 그 두 글을 읽기 전에 먼저 짚어야 할 기반, 즉 “왜 정책 업데이트에 제약이 필요한가”와 “그 제약을 어떻게 값싸게 구현할 것인가”를 정리한다.
Background
vanilla policy gradient가 무너지는 이유
정책 경사법(policy gradient)의 기본 추정량은 다음과 같다.
\[\hat{g} = \hat{\mathbb{E}}_t\left[\nabla_\theta \log \pi_\theta(a_t \mid s_t)\hat{A}_t\right]\]- \(\pi_\theta\): 파라미터 \(\theta\)로 표현되는 정책
- \(a_t, s_t\): 시점 \(t\)에서의 행동과 상태
- \(\hat{A}_t\): 그 행동이 평균보다 얼마나 좋았는지를 나타내는 advantage 추정치
- \(\hat{\mathbb{E}}_t[\cdot]\): 유한한 배치에 대한 경험적 평균
이 추정량은 다음 목적함수를 미분해서 얻을 수 있다.
\[L^{PG}(\theta) = \hat{\mathbb{E}}_t\left[\log \pi_\theta(a_t \mid s_t)\hat{A}_t\right]\]문제는 이 \(L^{PG}\)를 하나의 배치로 여러 스텝 최적화하고 싶을 때 생긴다. 데이터 하나 모아서 gradient step 한 번 밟고 버리는 건 낭비다. 그런데 같은 배치로 여러 epoch을 돌리면, 정책이 그 데이터를 만들어낸 원래 정책에서 점점 멀어지면서 \(\hat{A}_t\) 추정치 자체가 더 이상 유효하지 않은 영역으로 진입한다. 이 논문의 표현을 그대로 빌리면 “destructively large policy update”가 일어난다.
여기서 중요한 포인트는, 이게 학습률을 낮춘다고 해결되는 문제가 아니라는 점이다. 학습률은 파라미터 공간에서 얼마나 이동할지를 정할 뿐, 그 이동이 정책의 행동 분포를 얼마나 바꾸는지는 알려주지 않는다. 신경망 파라미터 공간의 특정 방향은 아주 작은 이동만으로도 특정 state에서 정책의 행동 확률을 완전히 뒤집어버릴 수 있다. 자동차 핸들에 비유하면, 학습률은 “핸들을 얼마나 돌릴까”를 정하는 값인데, 같은 각도라도 저속에서는 살짝 방향만 바뀌지만 고속에서는 차선을 이탈해버린다. 학습률이라는 스칼라 하나로는 이런 방향별·상황별 민감도 차이를 전혀 통제할 수 없다.
TRPO: 신뢰 영역이라는 무거운 정답
TRPO(Trust Region Policy Optimization, Schulman et al. 2015)는 이 문제를 “정책의 행동 분포가 얼마나 바뀌었는가”를 직접 제약하는 방식으로 풀었다.
\[\text{maximize}_\theta \quad \hat{\mathbb{E}}_t\left[\frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}\hat{A}_t\right]\] \[\text{subject to} \quad \hat{\mathbb{E}}_t\left[\mathrm{KL}[\pi_{\theta_{old}}(\cdot \mid s_t), \pi_\theta(\cdot \mid s_t)]\right] \leq \delta\]목적함수는 확률비(probability ratio)로 가중된 advantage, 제약은 이전 정책과 새 정책 사이 평균 KL divergence가 임계값 \(\delta\)를 넘지 않도록 하는 것이다. 파라미터 공간이 아니라 “행동 분포 공간”에서 이동 거리를 재기 때문에, 이동량 하나로 통제가 안 되던 vanilla policy gradient의 문제를 정확히 겨냥한다.
문제는 이 제약을 실제로 푸는 비용이다. 목적함수를 선형 근사, 제약을 이차 근사한 뒤 conjugate gradient로 근사해를 구해야 한다. 이 과정에서 KL divergence의 Hessian(=Fisher information matrix)과 벡터의 곱을 반복 계산해야 하고, 그 위에 line search까지 추가로 필요하다.
| TRPO | PPO | |
|---|---|---|
| 제약 방식 | 하드 제약 (\(\mathrm{KL} \leq \delta\)) | 목적함수 clipping (소프트) |
| 최적화 차수 | 2차 (conjugate gradient + line search) | 1차 (SGD/Adam) |
| 필요 연산 | Fisher-vector product 반복 계산 | gradient만 |
| dropout 등 노이즈 있는 구조 | 비호환 (KL 추정이 깨짐) | 호환 |
| policy/value 파라미터 공유 | 비호환 | 호환 |
| 구현 난이도 | 높음 (별도 2차 최적화 루틴 필요) | 낮음 (기존 PG 구현에 한두 줄 추가) |
TRPO의 이론적 근거를 그대로 따라가면, 사실 하드 제약이 아니라 penalty 형태로도 같은 문제를 풀 수 있다.
\[\text{maximize}_\theta \; \hat{\mathbb{E}}_t\left[\frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}\hat{A}_t - \beta \,\mathrm{KL}[\pi_{\theta_{old}}(\cdot \mid s_t), \pi_\theta(\cdot \mid s_t)]\right]\]하지만 TRPO 저자들은 굳이 하드 제약을 택했는데, 이유는 단일한 \(\beta\) 값이 문제마다 다르게 필요할 뿐 아니라, 학습이 진행되면서 정책의 특성이 변하면 같은 문제 안에서도 계속 바뀌기 때문이다. 이 관찰이 그대로 PPO가 풀어야 할 숙제가 된다: 1차 최적화만으로, 그리고 고정된 하이퍼파라미터로 TRPO에 준하는 안정성을 얻고 싶다.
Method
확률비와 clipped surrogate objective
PPO는 TRPO의 목적함수에 등장하는 확률비를 그대로 가져온다.
\[r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}, \quad r_t(\theta_{old}) = 1\]- \(\pi_\theta\): 현재 업데이트 중인 정책
- \(\pi_{\theta_{old}}\): 데이터를 수집할 때 썼던 (업데이트 이전) 정책
- \(r_t(\theta)\): 같은 행동 \(a_t\)에 대해 새 정책이 이전 정책보다 얼마나 더/덜 선호하는지의 비율. 1보다 크면 그 행동을 더 선호하게 됐다는 뜻, 1보다 작으면 덜 선호하게 됐다는 뜻이다.
TRPO가 최적화하는 surrogate objective는 conservative policy iteration(Kakade & Langford, 2002)에서 가져온 것으로, 다음과 같이 다시 쓸 수 있다.
\[L^{CPI}(\theta) = \hat{\mathbb{E}}_t\left[\frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}\hat{A}_t\right] = \hat{\mathbb{E}}_t\left[r_t(\theta)\hat{A}_t\right]\]제약 없이 이 \(L^{CPI}\)를 그냥 최대화하면 \(r_t(\theta)\)를 한없이 키우거나 줄이는 방향으로 정책이 폭주한다. PPO가 제안하는 해법은 제약을 별도로 거는 대신, 목적함수 자체를 깎아버리는 것이다.
\[L^{CLIP}(\theta) = \hat{\mathbb{E}}_t\left[\min\left(r_t(\theta)\hat{A}_t, \; \mathrm{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t\right)\right]\]- \(\epsilon\): clip 폭을 정하는 하이퍼파라미터, 논문은 \(\epsilon = 0.2\)를 기본값으로 쓴다
- 첫 번째 항 \(r_t(\theta)\hat{A}_t\)는 그냥 \(L^{CPI}\)
- 두 번째 항은 \(r_t(\theta)\)를 \([1-\epsilon, 1+\epsilon]\) 구간 밖으로 못 나가게 자른(clip) 뒤 advantage를 곱한 것
- 이 둘 중 작은 값을 취한다
\(\min\)을 취하는 이유가 핵심이다. \(r_t\)가 트러스트 리전을 벗어나 목적함수를 “개선”시키는 방향으로 움직이면 clip된 항이 선택되어 그 이상의 개선을 막는다. 반대로 \(r_t\)가 트러스트 리전 밖에서 목적함수를 “악화”시키는 방향으로 움직이면 clip되지 않은 항이 선택되어 그 악화를 그대로 반영한다. 즉 \(L^{CLIP}\)은 \(L^{CPI}\)의 하한(lower bound), 그것도 비관적인(pessimistic) 하한이다. \(\theta = \theta_{old}\) 근방, 즉 \(r_t = 1\) 근처에서는 \(L^{CLIP}\)과 \(L^{CPI}\)가 1차 근사까지 일치하지만, \(\theta\)가 멀어질수록 둘은 갈라진다.

논문 Figure 1을 그대로 옮긴 그림이다. \(A>0\)일 때(왼쪽)는 \(r\)이 커질수록 목적함수가 선형으로 증가하다 \(1+\epsilon\) 지점에서 평평해지고, \(A<0\)일 때(오른쪽)는 \(r\)이 \(1-\epsilon\)보다 작은 구간에서 평평하다가 그 이후로는 계속 감소한다. 빨간 점은 최적화가 시작되는 지점, 즉 \(r=1\)이다. 두 그래프 모두 “그래프가 꺾여서 평평해지는 쪽”이 clip이 실제로 작동하는 구간이라는 걸 시각적으로 보여준다.
논문은 여기에 한 가지 그림을 더 붙인다. Hopper-v1 환경에서 실제 PPO 업데이트 한 번을 수행한 뒤, \(\theta_{old}\)에서 업데이트된 \(\theta\) 방향으로 선형 보간하면서 \(L^{CPI}\), \(L^{CLIP}\), KL divergence가 각각 어떻게 변하는지 그린 것이다.

보간 계수가 1인 지점, 즉 실제 업데이트가 끝나는 지점에서 \(L^{CLIP}\)(빨간 선)이 최댓값을 찍고 꺾인다. 반면 clip이 없는 \(L^{CPI}\)(주황 선)는 그 지점을 넘어서도 계속 증가한다. KL divergence(파란 선)는 이 지점에서 약 0.02 수준이다. 즉 clip은 KL divergence를 직접 계산하지 않고도, “이 지점을 넘어서면 더 이상 개선으로 치지 않겠다”는 신호만으로 TRPO의 신뢰 영역과 비슷한 효과를 낸다.
토이 예제: advantage 부호에 따라 clip은 비대칭으로 작동한다
말로 풀면 헷갈리니 숫자로 확인한다. \(\epsilon = 0.2\)로 고정하면 clip 구간은 \([0.8, 1.2]\)다. 확률비 \(r_t \in \{0.5, 1.0, 1.5\}\) 세 값에 대해, advantage가 \(+1\)일 때와 \(-1\)일 때 각각 계산한다.
advantage \(\hat{A}_t = +1\) (좋은 행동)
| \(r_t\) | unclipped: \(r_t \hat{A}_t\) | clipped: \(\mathrm{clip}(r_t, 0.8, 1.2)\hat{A}_t\) | \(L^{CLIP}=\min\) | 해석 |
|---|---|---|---|---|
| 0.5 | 0.5 | 0.8 | 0.5 (unclipped) | 확률을 오히려 낮춰버린 상태 — clip 작동 안 함, 확률을 원래대로 올리라는 gradient가 그대로 살아있다 |
| 1.0 | 1.0 | 1.0 | 1.0 | 시작점, 변화 없음 |
| 1.5 | 1.5 | 1.2 | 1.2 (clipped) | 확률을 이미 트러스트 리전 밖까지 올린 상태 — clip 작동, 더 올려도 목적함수가 늘지 않는다 |
advantage \(\hat{A}_t = -1\) (나쁜 행동)
| \(r_t\) | unclipped: \(r_t \hat{A}_t\) | clipped: \(\mathrm{clip}(r_t, 0.8, 1.2)\hat{A}_t\) | \(L^{CLIP}=\min\) | 해석 |
|---|---|---|---|---|
| 0.5 | -0.5 | -0.8 | -0.8 (clipped) | 확률을 이미 트러스트 리전 밖까지 낮춘 상태 — clip 작동, 더 낮춰도 목적함수가 늘지 않는다 |
| 1.0 | -1.0 | -1.0 | -1.0 | 시작점, 변화 없음 |
| 1.5 | -1.5 | -1.2 | -1.5 (unclipped) | 확률을 오히려 높여버린 상태 — clip 작동 안 함, 확률을 다시 낮추라는 gradient가 그대로 살아있다 |
두 표를 나란히 보면 clip이 언제 작동하는지가 명확해진다. advantage가 양수든 음수든, clip은 “이미 옳은 방향으로 트러스트 리전을 벗어난” 경우에만 작동해서 추가 개선분을 깎아버린다. 반대로 “틀린 방향으로 트러스트 리전을 벗어난” 경우에는 clip이 전혀 개입하지 않고, gradient가 그 실수를 온전히 교정하도록 놔둔다. clip은 대칭적인 트러스트 리전이 아니라, 정책을 원래 방향으로 되돌리는 쪽의 gradient는 항상 살려두고 그 방향으로 과도하게 밀어붙이는 쪽의 gradient만 깎아내는 비대칭 장치다.
전체 목적함수: GAE, value loss, entropy bonus
실전에서는 \(L^{CLIP}\) 하나만 쓰지 않는다. policy와 value function이 파라미터를 공유하는 신경망 구조를 쓰면 value function의 오차도 같이 최소화해야 하고, 탐색이 너무 빨리 죽지 않도록 엔트로피 보너스도 필요하다.
\[L_t^{CLIP+VF+S}(\theta) = \hat{\mathbb{E}}_t\left[L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\theta) + c_2 S[\pi_\theta](s_t)\right]\]- \(L_t^{VF}(\theta) = (V_\theta(s_t) - V_t^{targ})^2\): value function의 제곱오차 손실
- \(S[\pi_\theta](s_t)\): 정책 엔트로피, 클수록 탐색을 더 많이 한다는 뜻
- \(c_1, c_2\): 각 항의 가중치 하이퍼파라미터
advantage 추정치 \(\hat{A}_t\)는 generalized advantage estimation(GAE, Schulman et al. 2015)의 truncated 버전을 쓴다.
\[\hat{A}_t = \delta_t + (\gamma\lambda)\delta_{t+1} + \cdots + (\gamma\lambda)^{T-t+1}\delta_{T-1}, \quad \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)\]\(\lambda = 1\)이면 몬테카를로 방식의 advantage 추정(분산은 크고 편향은 작음)으로, \(\lambda = 0\)이면 1-step TD 추정(편향은 크고 분산은 작음)으로 수렴한다. PPO 논문은 \(\lambda = 0.95\)를 기본값으로 쓴다.
학습 루프는 단순하다. \(N\)개의 actor가 각각 \(T\) 스텝씩 병렬로 데이터를 모으고(\(NT\)개의 샘플), 이 배치로 \(K\) epoch만큼 minibatch SGD를 돌린 뒤 \(\theta_{old} \leftarrow \theta\)로 갱신하고 다음 라운드로 넘어간다. TRPO처럼 매 스텝 새로 conjugate gradient를 풀 필요가 없다는 점이 구현을 극적으로 단순하게 만든다.
LLM RLHF로 옮기기
원 논문은 로봇 시뮬레이션과 Atari 게임만 다루지만, InstructGPT(2022) 이후 이 프레임은 그대로 언어 모델 정렬에 이식됐다.
| PPO 개념 | LLM RLHF에서의 대응 |
|---|---|
| 정책 \(\pi_\theta\) | 언어 모델 (SFT 체크포인트로 초기화) |
| 행동 \(a_t\) | 다음 토큰 하나 |
| 상태 \(s_t\) | 프롬프트 + 지금까지 생성한 토큰들 |
| episode | 응답 하나 (첫 토큰부터 EOS까지) |
| reward | 응답 종료 시 reward model이 매기는 스칼라 점수 (+ 토큰별 KL 페널티) |
| \(\theta_{old}\) | rollout을 생성한 시점의 정책 스냅샷 |
| value function \(V(s_t)\) | reward model에서 초기화하는 별도의 critic 헤드 |
여기서 반드시 구분해야 할 지점이 있다. PPO 자체가 갖고 있는 안전장치는 clip 하나뿐이다. clip은 “한 번의 업데이트에서 정책이 얼마나 바뀔 수 있는가”를 제한한다. 그런데 InstructGPT가 실제로 쓰는 목적함수는 여기에 또 다른 항을 얹는다.
\[\text{objective}(\phi) = \mathbb{E}_{(x,y)\sim\pi_\phi^{RL}}\left[r_\theta(x,y) - \beta \log\left(\frac{\pi_\phi^{RL}(y \mid x)}{\pi^{SFT}(y \mid x)}\right)\right] + \gamma\,\mathbb{E}_{x\sim D_{pretrain}}\left[\log \pi_\phi^{RL}(x)\right]\]- \(r_\theta(x, y)\): reward model이 프롬프트 \(x\)와 응답 \(y\)에 매기는 점수
- \(\beta \log(\pi_\phi^{RL}/\pi^{SFT})\): 지금 학습 중인 정책이 SFT 정책에서 얼마나 멀어졌는지에 대한 페널티
- \(\gamma \,\mathbb{E}[\log \pi_\phi^{RL}(x)]\): 사전학습 성능이 무너지지 않게 잡아주는 항 (PPO-ptx일 때만 사용, \(\gamma=0\)이면 그냥 “PPO”)
이 KL 페널티 항은 \(r_\theta(x,y) - \beta\,\mathrm{KL}\) 전체가 “보상”으로 취급되어 advantage 계산에 들어간다는 점에서, PPO의 clip과는 완전히 다른 층위의 제약이다. clip은 “한 번의 gradient step에서 \(\pi_\theta\)가 \(\pi_{\theta_{old}}\)에서 얼마나 벗어날 수 있는가”를 제한하는 최적화 단계의 장치고, KL 페널티는 “여러 스텝에 걸쳐 학습된 정책이 SFT 참조 정책에서 얼마나 멀어질 수 있는가”를 제한하는 reward 설계 단계의 장치다. 전자는 매 업데이트마다 리셋되고(\(\theta_{old}\)가 계속 갱신되므로), 후자는 학습 내내 고정된 기준점(SFT 정책)을 기준으로 누적된다.
등산에 비유하면 clip은 한 걸음에 내디딜 수 있는 최대 보폭을 제한하는 장치이고, KL 페널티는 베이스캠프에서 벗어날 수 있는 최대 반경, 즉 자일 길이에 가깝다. 전자는 한 걸음이 지나치게 크지 않도록 막을 뿐 얼마나 멀리 가는지는 신경 쓰지 않고, 후자는 아무리 조심스럽게 한 걸음씩 걸어도 자일이 허용하는 반경 밖으로는 나갈 수 없게 붙잡아 둔다. RLHF 파이프라인은 이 둘을 동시에 쓴다.
이렇게 보면 이 KL 페널티는 10편(/blog/2026/reward-model-overoptimization/)에서 다룬 overoptimization 방어 장치와 정확히 같은 물건이다. reward model이 학습 분포를 벗어난 응답에 잘못된 고득점을 주는 걸 막을 수 없다면, 적어도 정책이 그 응답까지 도달하는 경로 자체를 비싸게 만들어서 문제를 완화하자는 것이다. \(\beta\)는 사실상 10편에서 다룬 KL divergence 축을 따라 얼마나 멀리까지 최적화를 허용할지 정하는 다이얼이고, PPO의 clip이 이 다이얼과 무관하게 별도로 붙어있다는 점을 놓치면 InstructGPT의 학습 안정성을 절반만 이해하게 된다.
Experiments
continuous control: clip이 KL penalty보다 낫다
논문은 먼저 MuJoCo 기반 7개 연속 제어 환경(HalfCheetah, Hopper, InvertedDoublePendulum, InvertedPendulum, Reacher, Swimmer, Walker2d)에서 100만 스텝씩 학습시켜, clip과 KL penalty 변형들을 비교했다. 점수는 무작위 정책을 0, 각 환경에서 최고 점수를 1로 정규화한 뒤 21회 실행(7개 환경 x 3 시드) 평균이다.
| 알고리즘 | 정규화 점수 |
|---|---|
| clip/penalty 없음 | -0.39 |
| clip, \(\epsilon=0.1\) | 0.76 |
| clip, \(\epsilon=0.2\) | 0.82 |
| clip, \(\epsilon=0.3\) | 0.70 |
| adaptive KL, \(d_{targ}=0.01\) | 0.74 |
| fixed KL, \(\beta=1\) | 0.71 |
clip/penalty를 아예 안 쓰면 점수가 음수로 떨어진다(HalfCheetah 환경 하나에서 무작위 정책보다도 나쁜 정책으로 붕괴하기 때문). \(\epsilon=0.2\)의 clip이 모든 KL penalty 변형(고정이든 적응형이든)보다 높은 점수를 냈고, 이게 논문이 \(\epsilon=0.2\)를 기본값으로 채택한 근거다. 같은 연속 제어 벤치마크에서 PPO(clip)를 TRPO, A2C, A2C+trust region, CEM(cross-entropy method), 적응형 스텝사이즈를 쓰는 vanilla PG와 비교했을 때도 거의 모든 환경에서 PPO가 가장 빠르게, 가장 높은 점수로 수렴했다.
Atari: 단순한 알고리즘이 튜닝된 baseline과 맞먹는다
Arcade Learning Environment의 49개 게임에서 A2C, ACER(경험 재생을 쓰는 actor-critic), PPO를 비교했다. A2C와 ACER는 이 벤치마크에 맞게 따로 튜닝된 하이퍼파라미터를 쓴 반면, PPO는 연속 제어에서 찾은 설정을 거의 그대로 썼다.
| 채점 기준 | A2C 승 | ACER 승 | PPO 승 | 무승부 |
|---|---|---|---|---|
| 학습 전 구간 평균 reward | 1 | 18 | 30 | 0 |
| 마지막 100 episode 평균 reward | 1 | 28 | 19 | 1 |
학습 전체를 평균 내는 기준(빠른 학습 속도를 우대)에서는 PPO가 49개 게임 중 30개를 이겼고, 마지막 100 episode 평균(최종 성능을 우대)에서는 ACER가 근소하게 앞섰다. PPO는 최종 수렴 성능에서 ACER와 비슷한 수준을 내면서, 경험 재생 버퍼나 off-policy 보정 같은 ACER의 복잡한 장치 없이도 이걸 해낸다.
하이퍼파라미터
논문 부록에 실린 값들은 이후 대부분의 PPO 구현이 기본값으로 물려받은 숫자들이다.
| 하이퍼파라미터 | MuJoCo (연속 제어) | Atari |
|---|---|---|
| horizon \(T\) | 2048 | 128 |
| epoch 수 \(K\) | 10 | 3 |
| minibatch 크기 | 64 | 32 x 8 |
| discount \(\gamma\) | 0.99 | 0.99 |
| GAE \(\lambda\) | 0.95 | 0.95 |
| clip \(\epsilon\) | 0.2 | \(0.1 \times \alpha\) |
| entropy coeff \(c_2\) | 사용 안 함 | 0.01 |
Atari에서는 \(\alpha\)가 학습 진행에 따라 1에서 0으로 선형으로 감소하는 계수라, clip 폭도 학습 후반부로 갈수록 좁아진다. epoch 수가 MuJoCo(10)보다 Atari(3)에서 훨씬 적은 것도 눈에 띄는데, 픽셀 입력 기반 정책은 같은 배치를 너무 여러 번 재사용하면 \(r_t(\theta)\)가 더 빨리 clip 경계를 벗어나기 때문으로 보인다. 3D humanoid locomotion(RoboschoolHumanoid 계열) 실험에서는 5천만~1억 스텝까지 학습을 늘려, clip 기반 PPO가 목표 지점을 향해 뛰다가 방향이 바뀌면 회전해서 다시 쫓아가는 정책까지 학습해내는 것을 보여줬다. 이 규모의 실험이 가능했던 것 자체가 “구현이 단순해서 대규모로 병렬화하기 쉽다”는 PPO의 강점을 보여주는 사례다.
Conclusion
PPO는 reward를 다시 설계하지 않는다. 대신 설계된 reward가 gradient를 통해 정책에 반영되는 통로에 안전장치를 하나 추가했을 뿐이다. clipped surrogate objective는 TRPO가 2차 최적화로 풀던 신뢰 영역 제약을, min과 clip 두 연산만으로 1차 최적화 루프 안에 욱여넣는다. 그 대가로 TRPO가 갖고 있던 monotonic improvement 보장은 사라지지만, 실전에서는 그 보장이 없어도 거의 모든 벤치마크에서 TRPO급 성능을 훨씬 적은 코드로 얻어냈다.
이 안전장치가 중요한 이유는 지금 시리즈가 서 있는 자리 때문이다. 3부에서 reward model을 아무리 견고하게 만들어도, 정책이 한 번의 업데이트로 그 reward model이 한 번도 보지 못한 지역으로 튀어버리면 방어는 무의미해진다. clip은 그 튀는 폭 자체를 제한한다. 그리고 InstructGPT가 여기에 얹은 KL 페널티는 clip과는 다른 층위에서, 정책이 SFT 참조점에서 누적으로 얼마나 멀어질 수 있는지를 제한한다. 이 둘을 하나로 뭉뚱그려 “PPO가 안정성을 보장한다”고 말하면, 실제로 어느 장치가 어떤 실패를 막는지를 놓치게 된다.
PPO가 남긴 부채도 분명하다. \(\epsilon\), \(\beta\), GAE의 \(\lambda\), epoch 수, minibatch 크기 모두 여전히 손으로 맞춰야 하는 하이퍼파라미터이고, value function을 따로 학습시키는 비용도 크다. 15편(Secrets of RLHF I, /blog/2026/secrets-rlhf-ppo/)은 이 하이퍼파라미터들을 언어 모델 스케일에서 어떻게 안정화시키는지 다루고, 16편(GRPO, /blog/2026/grpo-deepseekmath/)은 아예 value network를 버리고 그룹 상대 advantage로 대체하는 방향으로 PPO의 구조 자체를 다시 묻는다.
RLHF Reward 설계 시리즈
이 글은 RLHF Reward 설계 시리즈의 열네 번째 글이다.
1부. 지형도
- Deep RL from Human Preferences (Christiano 2017) — 선호로 보상을 배우는 원형
- InstructGPT (Ouyang 2022) — RLHF 3단계 표준 레시피
- HH-RLHF (Bai 2022) — helpful·harmless preference model
2부. 스칼라 RM 해부
- Rethinking Bradley-Terry (2024) — reward 변환의 수학적 기반
- Secrets of RLHF II (2024) — 선호 데이터 노이즈와 RM 일반화
- Skywork-Reward (2024) — 데이터 큐레이션이 아키텍처를 이긴다
- ArmoRM (2024) — 다목적 분해와 MoE 게이팅
- Llama 2 (2023) — helpfulness·safety RM 분리 프로덕션 레시피
- RewardBench 2 (2025) — RM을 어떻게 평가할 것인가
3부. Reward Hacking
- Overoptimization Scaling Laws (2022) — Goodhart의 법칙 정량화
- Length Correlations in RLHF (2023) — 성능 향상의 얼마가 길이인가
- ODIN (2024) — 길이를 reward에서 분리
- WARM (2024) — weight averaging으로 hacking 방어
4부. reward를 정책으로
- (현재 글) PPO (2017) — clipped surrogate objective
- Secrets of RLHF I (2023) — PPO 학습 안정화 트릭
- GRPO / DeepSeekMath (2024) — value network를 버리다
- RLOO (2024) — REINFORCE로 충분한가
- DPO (2023) — reward를 없애면 어떻게 되는가
5부. Process & Verifiable Reward
- Let’s Verify Step by Step (2023) — 과정 감독이 결과 감독을 이긴다
- Math-Shepherd (2023) — 사람 라벨 없는 PRM
- DeepSeek-R1 (2025) — RLVR, 규칙이 reward가 될 때
6부. Generative Reward Model
- Generative Verifiers (2024) — reward를 next-token prediction으로
- Generative Reward Models (2024) — GenRM과 선호 학습의 결합
- DeepSeek-GRM / SPCT (2025) — inference-time scaling
- Rubrics as Rewards (2025) — 비검증 도메인으로
- One Token to Fool LLM-as-a-Judge (2025) — GenRM도 뚫린다
참고 문헌
- Schulman et al., 2017. Proximal Policy Optimization Algorithms. arXiv 2017.
- Schulman et al., 2015. Trust Region Policy Optimization.
- Schulman et al., 2015. High-Dimensional Continuous Control Using Generalized Advantage Estimation.
- Ouyang et al., 2022. Training language models to follow instructions with human feedback.
- OpenAI blog: Proximal Policy Optimization
Enjoy Reading This Article?
Here are some more articles you might like to read next: