지금까지는 DQN 계열(가치기반) 알고리즘에 집중했지만, 강화학습에는 정책기반 접근도 중요한 축을 차지합니다. 정책기반 알고리즘은 상태→행동 확률분포를 직접 파라미터화하는 방식으로, 연속형 행동공간이나 고차원 문제에서 장점을 발휘하고, DQN 대비 다른 하이퍼파라미터 특징을 갖습니다.
RLlib은 대표적인 정책기반 알고리즘인 A2C(Advantage Actor-Critic)와 PPO(Proximal Policy Optimization)를 기본 지원합니다. 이 글에서는 A2C, PPO를 다양한 환경에서 간단히 실행해보고, Config를 통해 파라미터를 조정하는 방법을 살펴봅니다.
A2C와 PPO 간단히 복습
- A2C(Advantage Actor-Critic):
Actor-Critic 구조를 사용하여 상태 가치함수를 Critic이 추정하고, Actor가 정책을 업데이트할 때 Advantage(우위)를 사용해 분산을 줄이는 방법입니다.
REINFORCE보다 더 빈번하고 안정적인 업데이트가 가능하지만, 여전히 단일 워커에서 동작한다면 학습 속도나 안정성에 한계가 있습니다. - PPO(Proximal Policy Optimization):
최근 강화학습 표준 알고리즘 중 하나. 정책 업데이트 시 policy ratio를 클리핑하여 정책이 한 번에 크게 변하지 않도록 제약, 안정적이고 효율적인 학습을 제공. 분산 환경에서 쉽게 동작하며, 다양한 환경(Atari, MuJoCo)에서 좋은 성능을 보입니다.
RLlib에서 이 알고리즘들을 사용하면, 복잡한 수식이나 구현 없이도 Config 설정으로 바로 시도해볼 수 있습니다.
A2C 예제: CartPole 적용
A2C를 RLlib에서 실행하려면 from ray.rllib.algorithms.a3c import A2CConfig를 사용하면 됩니다. A2C/A3C는 비동기적 분산 학습에 용이하지만, 여기서는 단순히 CartPole에 A2C를 적용해보겠습니다.
예제 코드 (a2c_cartpole.py)
import ray
from ray.rllib.algorithms.a3c import A2CConfig
if __name__ == "__main__":
ray.init(ignore_reinit_error=True)
config = (
A2CConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=2) # 워커 2개 사용
.training(
lr=1e-3,
gamma=0.99,
sample_batch_size=200, # 단계 조정 가능
)
)
trainer = config.build()
for i in range(10):
result = trainer.train()
mean_reward = result["episode_reward_mean"]
print(f"A2C Iter {i+1}: mean_reward={mean_reward:.2f}")
ray.shutdown()
코드 해설
- A2CConfig()를 사용해 A2C 알고리즘 Config 생성.
- CartPole에 적용, 2개의 워커로 데이터 수집 가속.
- LR, gamma, sample_batch_size 등 파라미터 조정 가능.
- 결과: 몇 iteration 후 평균 리워드 상승, DQN 대비 다른 속도로 수렴할 수 있음.
이처럼 A2C 역시 Config를 통해 간단히 파라미터를 바꾸며 실험할 수 있습니다.
PPO 예제: 다양한 환경 적용
PPO는 RLlib에서 널리 사용되는 알고리즘 중 하나이며, 학습 안정성, 성능 모두 우수합니다. 이산 행동 환경뿐 아니라 연속 행동 환경(예: MuJoCo)에도 PPO를 적용하기 쉽습니다.
기본 PPO 예제 (ppo_cartpole.py)
import ray
from ray.rllib.algorithms.ppo import PPOConfig
if __name__ == "__main__":
ray.init(ignore_reinit_error=True)
config = (
PPOConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=2, rollout_fragment_length=200)
.training(
lr=5e-4,
train_batch_size=4000, # PPO는 큰 batch size를 권장
sgd_minibatch_size=128, # PPO에서 minibatch로 SGD 수행
num_sgd_iter=10, # 한 iteration 당 SGD 반복 횟수
)
)
trainer = config.build()
for i in range(10):
result = trainer.train()
mean_reward = result["episode_reward_mean"]
print(f"PPO Iter {i+1}: mean_reward={mean_reward:.2f}")
ray.shutdown()
코드 해설
- PPOConfig() 사용.
- PPO는 rollout 후 수집된 데이터를 여러 번(SGD iter) 재활용해 효율성 증가.
- train_batch_size, sgd_minibatch_size, num_sgd_iter등 PPO 특유의 파라미터 조정 가능.
- iteration을 거치며 평균 리워드 증가 추세 관찰, DQN이나 A2C와 성능 비교 가능.
연속 행동 환경에 PPO 적용
PPO는 연속 행동 환경(MuJoCo, PyBullet)에서도 탁월한 성능을 발휘합니다. 예를 들어, env="MountainCarContinuous-v0"에 PPO를 적용해보겠습니다.
from ray.rllib.algorithms.ppo import PPOConfig
config = (
PPOConfig()
.environment(env="MountainCarContinuous-v0")
.framework("torch")
.rollouts(num_rollout_workers=1)
.training(
lr=3e-4,
train_batch_size=4000,
sgd_minibatch_size=128,
num_sgd_iter=10
)
)
trainer = config.build()
여기서 별도 action space 관련 설정 없이도 RLlib이 연속 행동에 맞는 모델을 자동 할당합니다. 필요하다면 model_config를 통해 policy network 구조 수정도 가능합니다.
여러 정책기반 알고리즘 비교
RLlib은 PPO 외에도 A3C, IMPALA, APPO 등 다양한 정책기반 알고리즘을 지원합니다. Config를 통해 알고리즘 전환도 간단합니다.
예: A3C로 CartPole
from ray.rllib.algorithms.a3c import A3CConfig
config = A3CConfig().environment(env="CartPole-v1").framework("torch").training(lr=1e-3)
trainer = config.build()
A3C는 A2C와 유사하지만 비동기 병렬 학습에 초점을 둔 알고리즘입니다. RLlib 내에서 워커 수를 늘리면 유사하게 동작할 수 있습니다.
마무리
핵심 포인트 정리:
- 정책기반 알고리즘(A2C, PPO)도 RLlib Config와 Trainer를 통해 쉽게 실행 가능.
- PPO: 클리핑된 Objective, 다중 epoch SGD로 안정적 업데이트. train_batch_size, num_sgd_iter 등 파라미터 조정.
- A2C: Actor-Critic 구조 기반으로 간단히 실행, 워커 수 조정으로 병렬 데이터 수집.
- 연속 행동 환경(MountainCarContinuous, MuJoCo)에도 PPO 적용 간단. RLlib이 automatically stochastic policy를 구성.
- 다양한 정책기반 알고리즘(A3C, IMPALA, APPO) 적용 가능. 알고리즘 선택, 파라미터 변경 모두 Config로 제어 가능.
이번 글에서는 A2C, PPO 등 정책기반 알고리즘을 RLlib으로 손쉽게 실행하는 방법을 알아보았습니다. Config 수정으로 파라미터나 알고리즘을 자유롭게 변경 가능하며, 이산·연속 환경 모두에 쉽게 적용할 수 있습니다.
다음 글에서는 로그 관리, 시각화, 체크포인트 활용 등 RLlib을 실험적으로 활용하는 과정에서 유용한 팁들을 다루고, 성능 모니터링 및 결과 해석 방법을 소개할 예정입니다.
'개발 이야기 > PyTorch (파이토치)' 카테고리의 다른 글
[Ray RLlib로 강화학습 쉽게 사용하기] 3편: 이산 행동 알고리즘(DQN 변형) 쉽게 돌려보기 (1) | 2024.12.21 |
---|---|
[Ray RLlib로 강화학습 쉽게 사용하기] 2편: RLlib 구성 이해하기 – Config, Trainer, 그리고 기본 구조 (0) | 2024.12.20 |
[Ray RLlib로 강화학습 쉽게 사용하기] 1편: Ray와 RLlib 소개 및 환경 설정 (2) | 2024.12.19 |
[PyTorch로 시작하는 강화학습 입문] 11편: 마무리 및 다음 단계 제안 (1) | 2024.12.18 |
[PyTorch로 시작하는 강화학습 입문] 10편: 연속 행동 공간에 도전 – Soft Actor-Critic(SAC) 소개 및 기초 구현 (0) | 2024.12.17 |