본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Proximal Policy Optimization, PPO; PPO
새 정책과 이전 정책의 확률비를 잘라 한 번의 갱신이 너무 커지지 않게 하면서, 같은 데이터로 여러 번 미니배치 갱신을 하는 정책 경사 알고리즘

PPO(Proximal Policy Optimization, 근접 정책 최적화)는 2017년 OpenAI의 존 슐먼(John Schulman) 등이 발표한 강화 학습 알고리즘이다.[1] 같은 저자의 TRPO(Trust Region Policy Optimization)가 KL 발산 제약 아래 2차 최적화로 얻던 안정성을, 확률비를 자르는(clipping) 1차 목적 함수 하나로 근사했다. 일반 정책 경사 방법이 표본 하나로 한 번만 갱신하는 데 비해, PPO는 모은 데이터로 여러 에포크의 미니배치 갱신을 해 표본 효율이 좋다.

OpenAI는 2017년 7월 PPO를 공개하며 쓰기 쉽고 성능이 좋아 자사의 기본 강화 학습 알고리즘이 되었다고 밝혔고,[2] 2018년 도타 2를 하는 OpenAI Five도 규모를 키운 PPO를 GPU 256개와 CPU 코어 12만 8천 개로 돌려 자기 대국으로 학습했다.[3] 이처럼 로봇 제어, 게임, 그리고 대형 언어 모델의 인간 피드백 기반 강화 학습(RLHF)에서 기본 알고리즘으로 쓰였다. InstructGPT와 ChatGPT의 강화 학습 단계가 PPO였다.[4][5] 이 문서는 알고리즘의 수식과 구현, 그리고 언어 모델에 적용할 때 달라지는 점을 다룬다. 정책 경사와 액터-크리틱의 기초는 정책 경사, 액터-크리틱 문서를 참고한다.

배경: 왜 갱신 크기를 제한하는가

편집 원본 편집

정책 경사의 기본 추정량은 g^=𝔼^t[∇θlog⁡πθ(at|st)A^t]다. 이 식은 현재 정책으로 모은 데이터에서만 맞으므로, 같은 데이터로 여러 번 갱신하면 정책이 데이터와 동떨어지고 성능이 무너질 수 있다. 이전 정책 πθold로 모은 데이터를 쓰려면 중요도 표본 추출(importance sampling) 비율을 곱한 대리 목적 함수(surrogate objective)를 쓴다.

ρt(θ)=πθ(at|st)πθold(at|st),LCPI(θ)=𝔼^t[ρt(θ)A^t]

LCPI를 제약 없이 최대화하면 갱신이 지나치게 커진다. TRPO는 𝔼^t[KL[πθold,πθ]]≤δ 제약을 걸고 켤레 기울기법으로 풀었는데, 구현이 복잡하고 드롭아웃이나 정책·가치 공유 구조와 맞추기 어려웠다.[6]

클리핑 대리 목적 함수

편집 원본 편집

PPO의 핵심 식은 다음과 같다.[1]

LCLIP(θ)=𝔼^t[min⁡(ρt(θ)A^t,clip⁡(ρt(θ),1−ϵ,1+ϵ)A^t)]

두 항 가운데 작은 쪽을 고르므로 결과는 원래 목적의 비관적 하한이 된다. 경우를 나누면 동작이 분명해진다.

어드밴티지 확률비 범위 선택되는 항 기울기
A^t>0 (좋은 행동) ρt≤1+ϵ ρtA^t 있음. 확률을 올린다
A^t>0 ρt>1+ϵ (1+ϵ)A^t 0. 이미 충분히 올렸으므로 멈춘다
A^t<0 (나쁜 행동) ρt≥1−ϵ ρtA^t 있음. 확률을 내린다
A^t<0 ρt<1−ϵ (1−ϵ)A^t 0. 이미 충분히 내렸으므로 멈춘다

즉 정책을 개선하는 방향으로 확률비가 [1−ϵ,1+ϵ]를 벗어나면 기울기를 끊고, 반대로 정책을 나쁘게 만드는 방향의 변화는 자르지 않아 되돌릴 수 있게 한다. 논문의 MuJoCo 실험에서 ϵ을 0.1, 0.2, 0.3으로 바꿨을 때 정규화 점수는 각각 0.76, 0.82, 0.70이었고, 자르기도 KL 벌점도 없는 경우는 -0.39였다.[1]

논문은 클리핑 대신 KL 벌점을 쓰는 변형도 제시했다. LKLPEN=𝔼^t[ρtA^t−βKL[πθold(⋅|st),πθ(⋅|st)]]를 최적화하고, 갱신 뒤 측정한 KL d가 목표값 dtarg의 1.5배보다 크면 β를 두 배로, 1/1.5보다 작으면 절반으로 바꾼다. 실험에서는 클리핑보다 성능이 낮았다.[1] 2019년 언어 모델 RLHF 연구는 이와 비슷하게 참조 모델과의 KL이 목표값에 머물도록 KL 계수를 동적으로 조절했다.[7]

정책과 가치 함수가 신경망을 공유하면 가치 손실과 엔트로피 보너스를 더해 함께 최적화한다.[1]

LtCLIP+VF+S(θ)=𝔼^t[LtCLIP(θ)−c1(Vθ(st)−Vttarg)2+c2S[πθ](st)]

c1은 가치 손실 계수, c2는 탐험을 돕는 엔트로피 보너스 계수다.

일반화 어드밴티지 추정(GAE)

편집 원본 편집

어드밴티지 A^t는 보통 일반화 어드밴티지 추정(Generalized Advantage Estimation, GAE)으로 구한다.[8] 한 단계 TD 오차를 δt=rt+γV(st+1)−V(st)로 두면 GAE는 그 지수 가중 합이다.

A^tGAE(γ,λ)=∑l=0∞(γλ)lδt+l=δt+γλA^t+1

λ=0이면 한 단계 TD 오차 δt로, 분산은 작지만 가치 함수가 틀린 만큼 편향된다. λ=1이면 실제 할인 이득에서 V(st)를 뺀 몬테카를로 추정으로, 편향은 없지만 분산이 크다. λ는 그 사이를 조절하는 손잡이로, TD(λ)와 같은 구조다. 가치 함수의 학습 목표는 Vttarg=A^t+V(st)로 둔다.

논문의 액터-크리틱 형태 PPO는 다음과 같다.[1]

  1. 액터 N개가 각자 현재 정책 πθold로 환경을 T 단계 진행해 궤적을 모은다.
  2. 각 시점의 어드밴티지 A^1,…,A^T를 GAE로 계산한다.
  3. 모은 NT개 표본으로 K 에포크 동안 크기 M의 미니배치 SGD(보통 Adam)로 대리 손실을 최적화한다.
  4. θold←θ로 두고 1로 돌아간다.
하이퍼파라미터 MuJoCo(100만 단계) 아타리
수집 길이 T 2048 128
Adam 학습률 3×10−4 2.5×10−4×α
에포크 K 10 3
미니배치 크기 64 32×8
할인율 γ 0.99 0.99
GAE λ 0.95 0.95
액터 수 (표에 없음) 8
클리핑 ϵ 0.2 0.1×α
c1, c2 정책과 가치 신경망 분리, 엔트로피 없음 1, 0.01

아타리의 α는 학습 동안 1에서 0으로 선형 감소한다. 논문은 아타리 49개 게임에서 학습 전체 평균 보상 기준으로 A2C 1개, ACER 18개, PPO 30개 게임에서 가장 높았다고 보고했다(마지막 100에피소드 기준으로는 ACER 28개, PPO 19개).[1]

GAE와 손실 계산 부분을 PyTorch로 쓰면 다음과 같다(PyTorch 2.5에서 실행 확인).

import torch
import torch.nn.functional as F

def compute_gae(rewards, values, dones, last_value, gamma=0.99, lam=0.95):
    """rewards, values, dones: [T] 텐서. last_value: 마지막 상태의 V(s_T)."""
    T = rewards.shape[0]
    advantages = torch.zeros(T)
    gae = 0.0
    for t in reversed(range(T)):
        next_value = last_value if t == T - 1 else values[t + 1]
        not_done = 1.0 - dones[t]
        delta = rewards[t] + gamma * next_value * not_done - values[t]
        gae = delta + gamma * lam * not_done * gae
        advantages[t] = gae
    returns = advantages + values          # 가치 함수의 학습 목표
    return advantages, returns

def ppo_loss(new_logp, old_logp, adv, new_v, ret, entropy,
             clip_eps=0.2, vf_coef=0.5, ent_coef=0.01):
    adv = (adv - adv.mean()) / (adv.std() + 1e-8)        # 어드밴티지 정규화
    ratio = torch.exp(new_logp - old_logp)               # rho_t
    surr1 = ratio * adv
    surr2 = torch.clamp(ratio, 1 - clip_eps, 1 + clip_eps) * adv
    policy_loss = -torch.min(surr1, surr2).mean()        # L^CLIP의 부호를 바꿔 최소화
    value_loss = F.mse_loss(new_v, ret)
    return policy_loss + vf_coef * value_loss - ent_coef * entropy.mean()

old_logp는 데이터를 모을 때 계산해 고정해 두고, new_logp는 갱신할 때마다 다시 계산한다. 첫 미니배치에서는 둘이 같아 확률비가 1이어야 한다. 논문에 적히지 않았지만 성능에 큰 영향을 주는 구현 세부(어드밴티지 정규화, 가치 손실 클리핑, 관측 정규화, 학습률 감소, 기울기 노름 자르기 등)가 많다는 점이 이후 재현 연구에서 지적되었다.[9]

언어 모델에서의 PPO

편집 원본 편집

RLHF에서는 언어 모델을 정책으로, 토큰 하나를 행동으로, 지금까지의 프롬프트와 생성 토큰을 상태로 본다. 응답이 끝나면 보상 모델이 점수 하나를 준다.

네 개의 모델

편집 원본 편집
모델 역할 학습 여부
정책(액터) 응답을 생성하고 갱신된다. SFT 모델로 초기화 학습
가치 모델(크리틱) 토큰마다 V(st)를 예측해 GAE에 쓴다. InstructGPT는 보상 모델로 초기화했다[4] 학습
보상 모델 완성된 응답에 스칼라 점수를 준다 고정
참조 모델 KL 벌점 계산용. SFT 모델 사본 고정

정책과 같은 크기의 모델 넷을 올려야 하므로 메모리 부담이 크다. 가치 모델을 없앤 GRPO, RLOO, REINFORCE 계열이 나온 주된 이유다.[10][11]

보상 모델 점수는 마지막 토큰에만 주고, 모든 토큰에는 참조 모델과의 KL 벌점을 준다.[10][12]

rt=𝟙[t=T]⋅rϕ(x,y)−βlog⁡πθ(yt∣x,y<t)πref(yt∣x,y<t)

이 보상으로 GAE를 계산하고 위의 클리핑 손실로 갱신한다. 2024년 OpenAI TL;DR 요약 실험을 처음부터 재현한 연구의 기본 설정은 KL 계수 0.05, 할인율 1.0, GAE λ 0.95, 클리핑 0.2, PPO 반복 4회, 학습률 3×10−6이었다.[12]

같은 재현 연구는 20개 넘는 구현 세부를 정리했다. 언어 모델 PPO에서 특히 중요한 것은 다음과 같다.[12]

  • 드롭아웃 끄기: 생성 단계와 학습 단계의 로그 확률이 달라지면 첫 에포크부터 확률비가 1이 아니게 되어 클리핑이 엉뚱하게 걸린다.
  • EOS 처리: 정해진 길이만큼 생성한 뒤 EOS가 없으면 보상을 정의할 수 없으므로 낮은 점수를 준다. 튈루 3는 EOS로 끝나지 않은 응답에 -10을 주었다.[13]
  • 보상과 어드밴티지 정규화(whitening): 미니배치 단위로 평균과 표준편차를 맞춘다. 보상 정규화는 응답을 짧게 만드는 경향이 있었다.
  • 가치 모델 초기화: 보상 모델에서 초기화한다.

PPO는 하이퍼파라미터에 민감하고 메모리를 많이 써서, 2023년 이후 공개 모델의 선호 학습에는 직접 선호 최적화(DPO) 같은 오프라인 방법이 대안으로 쓰였다. 튈루 3도 선호 학습 단계에 DPO를 썼다.[13] 그러나 2024년 ICML 논문은 PPO를 제대로 조정하면 대화와 코드 생성 시험 환경 전체에서 DPO를 앞선다고 보고했고,[14] 반대로 RLHF에서는 PPO의 여러 구성 요소가 불필요하며 더 단순한 REINFORCE 계열이 PPO와 DPO를 모두 앞선다는 연구도 나왔다.[11] 추론 모델 학습에서는 가치 모델 없는 GRPO와 그 변형이 주류가 되었고, 튈루 3는 검증 가능한 보상 강화 학습에 PPO를 썼다.[13]

허깅 페이스 TRL은 라이브러리 출발점이었던 PPOTrainer를 2026년 9월 10일 v1.13.0에서 제거했다. 유지 보수가 끊겼고 입력 형식이 다른 트레이너와 맞지 않았다는 이유였다.[15] 현재 TRL로 온라인 강화 학습을 하려면 GRPOTrainer나 RLOOTrainer를 쓰고, 가치 모델을 쓰는 PPO가 필요하면 DAPO 공개 코드가 기반으로 삼은 verl 같은 별도 RL 프레임워크를 쓴다.[16]

관련 알고리즘 비교

편집 원본 편집
알고리즘 갱신 제한 방식 가치 모델 비고
REINFORCE 없음 없음(기준선 선택) 가장 단순, 분산 큼
TRPO[6] KL 제약, 켤레 기울기 + 선 탐색 있음 2차 근사, 구현 복잡
PPO[1] 확률비 클리핑 있음 1차 최적화, 여러 에포크 재사용
GRPO[10] 확률비 클리핑 + 참조 모델 KL 항 없음 같은 프롬프트 응답 묶음의 상대 보상을 어드밴티지로
RLOO[11] 없음(REINFORCE) 없음 다른 표본의 평균을 기준선으로(leave-one-out)
DAPO[16] 비대칭 클리핑(ϵlow=0.2,ϵhigh=0.28) 없음 GRPO 개량, KL 항 제거
  1. ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, Oleg Klimov, 〈Proximal Policy Optimization Algorithms〉, 2017. arXiv:1707.06347
  2. ↑ Proximal Policy Optimization, OpenAI, 2017-07-20.
  3. ↑ OpenAI Five, OpenAI, 2018-06-25.
  4. ↑ 4.0 4.1 Long Ouyang 외, 〈Training language models to follow instructions with human feedback〉, NeurIPS 2022. arXiv:2203.02155
  5. ↑ Introducing ChatGPT, OpenAI, 2022-11-30.
  6. ↑ 6.0 6.1 John Schulman 외, 〈Trust Region Policy Optimization〉, ICML 2015. arXiv:1502.05477
  7. ↑ Daniel M. Ziegler 외, 〈Fine-Tuning Language Models from Human Preferences〉, 2019. arXiv:1909.08593
  8. ↑ John Schulman 외, 〈High-Dimensional Continuous Control Using Generalized Advantage Estimation〉, ICLR 2016. arXiv:1506.02438
  9. ↑ Logan Engstrom 외, 〈Implementation Matters in Deep Policy Gradients: A Case Study on PPO and TRPO〉, ICLR 2020. arXiv:2005.12729
  10. ↑ 10.0 10.1 10.2 Zhihong Shao 외, 〈DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models〉, 2024. arXiv:2402.03300
  11. ↑ 11.0 11.1 11.2 Arash Ahmadian 외, 〈Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs〉, 2024. arXiv:2402.14740
  12. ↑ 12.0 12.1 12.2 Shengyi Huang 외, 〈The N+ Implementation Details of RLHF with PPO: A Case Study on TL;DR Summarization〉, 2024. arXiv:2403.17031
  13. ↑ 13.0 13.1 13.2 Nathan Lambert 외, 〈Tulu 3: Pushing Frontiers in Open Language Model Post-Training〉, 2024. arXiv:2411.15124
  14. ↑ Shusheng Xu 외, 〈Is DPO Superior to PPO for LLM Alignment? A Comprehensive Study〉, ICML 2024. arXiv:2404.10719
  15. ↑ TRL v1.13.0 릴리스 노트, 허깅 페이스, 2026-09-10.
  16. ↑ 16.0 16.1 Qiying Yu 외, 〈DAPO: An Open-Source LLM Reinforcement Learning System at Scale〉, 2025. arXiv:2503.14476