근접 정책 최적화(PPO)
클리핑된 대리 목적 함수, GAE 어드밴티지 추정, stable-baselines3를 활용한 PPO를 다룹니다.
근접 정책 최적화(PPO)은(는) CoddyKit의 무료 Learn AI with Python 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn AI with Python 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
PPO인 이유
PPO는 오늘날 기본으로 사용되는 RL 알고리즘입니다. 안정적이고 표본 효율적이며 조정하기 쉽습니다. 정책 경사법의 핵심 문제인 정책을 파괴할 정도로 큰 업데이트를 해결하기 위해 업데이트마다 정책이 변경될 수 있는 정도를 제한합니다.
큰 업데이트의 위험
한 번의 지나치게 큰 정책 업데이트만으로도 성능이 무너질 수 있으며, RL은 온폴리시 방식이므로 회복하기 어렵습니다. PPO는 안전성을 유지하기 위해 각 업데이트를 현재 정책에 가깝게 유지합니다.
확률 비율
PPO는 새로운 행동 확률과 기존 행동 확률의 비율을 추적합니다. ratio = pi_new(a|s) / pi_old(a|s) 비율이 1에 가까우면 정책이 거의 변하지 않았다는 뜻이고, 1에서 멀면 큰 변화가 있었다는 뜻입니다.
ratio = torch.exp(new_log_prob - old_log_prob)클리핑 목적함수
PPO의 대표적인 특징은 클리핑된 대리 목적함수입니다. 비율에 어드밴티지를 곱하되 비율을 [1-eps, 1+eps] 범위로 클리핑하여 정책을 지나치게 변경할 유인을 없앱니다.
clipped = torch.clamp(ratio, 1 - eps, 1 + eps)
objective = torch.min(ratio * adv, clipped * adv)
loss = -objective.mean()엡실론 클리핑 임계값
eps(일반적으로 0.2)는 클리핑 임계값입니다. 비율이 1에서 얼마나 멀어질 수 있는지를 제한하므로 어드밴티지가 크더라도 정책 업데이트가 제한된 범위 안에서 안정적으로 이루어집니다.
eps = 0.2 # allow at most +/-20% change in probabilitymin()과 클리핑이 작동하는 이유
클리핑된 목적함수와 클리핑되지 않은 목적함수 중 min을 취하면 제한이 보수적으로 적용됩니다. 클리핑 범위를 넘어선 개선에는 추가 보상이 없으므로 최적화기가 지나치게 업데이트할 이유가 사라집니다.
일반화 어드밴티지 추정
PPO는 GAE를 사용하여 어드밴티지를 추정합니다. GAE는 gamma와 lambda 매개변수를 사용해 여러 단계의 누적 보상을 혼합합니다. GAE는 편향과 분산 사이의 균형을 조절하여 매끄럽고 신뢰할 수 있는 어드밴티지 추정값을 제공합니다.
def gae(rewards, values, gamma=0.99, lam=0.95):
adv, gae_acc = [], 0
for t in reversed(range(len(rewards))):
delta = rewards[t] + gamma * values[t+1] - values[t]
gae_acc = delta + gamma * lam * gae_acc
adv.insert(0, gae_acc)
return adv배치당 여러 에포크
REINFORCE와 달리 PPO는 수집한 각 데이터 배치를 여러 최적화 에포크에 걸쳐 재사용합니다. 클리핑 덕분에 이 방식이 안전해지고 표본 효율성이 크게 향상됩니다.
for _ in range(n_epochs):
# recompute ratio and clipped loss on the same batch
optimizer.zero_grad()
loss.backward()
optimizer.step()Stable-Baselines3로 PPO 사용하기
실제로는 PPO를 직접 코딩하는 일이 거의 없습니다. Stable-Baselines3가 검증된 구현을 제공합니다. 정책 유형, 환경, 출력 상세도를 지정하여 생성한 다음 learn을 호출하면 됩니다.
from stable_baselines3 import PPO
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=100_000)학습된 에이전트 사용하기
학습이 끝난 후에는 predict를 사용하여 새로운 관측에 대한 행동을 얻습니다. 평가할 때 deterministic=True로 설정하면 표본을 추출하는 대신 가능성이 가장 높은 행동을 선택합니다.
obs, _ = env.reset()
action, _ = model.predict(obs, deterministic=True)
model.save("ppo_agent")PPO가 널리 사용되는 이유
PPO는 안정적인 클리핑 업데이트, GAE 어드밴티지, 데이터 재사용을 결합하여 조정이 거의 필요 없고 다양한 작업에 적용할 수 있는 강력하고 범용적인 알고리즘을 제공합니다. 이것이 로봇공학부터 RLHF까지 모든 분야에서 사용되는 이유입니다.
빠른 확인
PPO에 대한 이해도를 확인해 보세요.
복습: PPO
확률 비율과 클리핑 임계값 eps를 사용해 업데이트를 제한하는 PPO의 클리핑된 대리 목적함수, 어드밴티지 추정을 위한 GAE, 여러 에포크에 걸친 데이터 재사용을 배웠습니다. Stable-Baselines3에서 PPO("MlpPolicy", env, verbose=1)로 PPO를 쉽게 실행해 보았습니다.
자주 묻는 질문
“근접 정책 최적화(PPO)” 강의는 무료인가요?
네 — “근접 정책 최적화(PPO)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn AI with Python 강의 전체를 잠금 해제할 수 있습니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
“근접 정책 최적화(PPO)”에서 뭘 배우나요?
클리핑된 대리 목적 함수, GAE 어드밴티지 추정, stable-baselines3를 활용한 PPO를 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Learn AI with Python을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn AI with Python을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn AI with Python은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“근접 정책 최적화(PPO)” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn AI with Python 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn AI with Python 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 정책 그래디언트 방법: REINFORCE
- 액터-크리틱 방법(A2C)
- 근접 정책 최적화(PPO)
- 사용자 지정 Gymnasium 환경