[Ray RLlib로 강화학습 쉽게 사용하기] 4편: 정책기반 알고리즘 (A2C, PPO) 손쉽게 사용하기

지금까지는 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을 실험적으로 활용하는 과정에서 유용한 팁들을 다루고, 성능 모니터링 및 결과 해석 방법을 소개할 예정입니다.

반응형