앞선 글에서 RLlib을 이용하면 Config 기반으로 알고리즘과 파라미터를 손쉽게 변경할 수 있음을 확인했습니다. 이번 글에서는 이산적 행동 공간 환경(Discrete Action Space)에서 DQN과 그 변형(Double DQN, Dueling DQN, Prioritized Replay 등)을 RLlib으로 실행하는 방법을 자세히 살펴보고, 다양한 환경(예: CartPole, Atari)을 적용하는 예제를 소개하겠습니다.
이산 행동 알고리즘과 RLlib
DQN은 이산적 행동 공간을 전제로 개발된 알고리즘으로, RLlib에서 DQNTrainer를 통해 바로 사용할 수 있습니다. 지난 글에서 DQN에 Double/Dueling 옵션을 추가하는 방법을 봤는데, 여기서는 좀 더 다양한 설정(우선순위 리플레이, Atari 환경 적용)을 시도해보겠습니다.
주요 옵션 정리
- Double Q-learning 활성화:
.training(double_q=True)
Q값 과추정을 줄이기 위해 target selection 시 다른 Q네트워크를 활용하는 Double DQN 기법. - Dueling Network 활성화:
.training(dueling=True)
V(s)와 A(s,a)를 분리해 Q(s,a)=V(s)+A(s,a)-평균(A) 구조로 학습 효율 개선. - Prioritized Experience Replay (PER):
.training(replay_buffer_config={"type":"PrioritizedReplayBuffer", "alpha":0.6})
이처럼 replay_buffer_config를 통해 우선순위 리플레이 버퍼로 교체 가능. α는 우선순위 정도를 결정. - Atari 환경 지원:
Atari 환경은 OpenAI Gym [atari] 플러그인을 설치한 후 env="BreakoutNoFrameskip-v4" 같은 이름으로 사용 가능. RLlib이 Atari 전처리(wrappers)도 지원해 효율적 학습 가능.
CartPole 예제: Double+Dueling+DQN+PER 결합
아래 예제 코드에서는 CartPole 환경에 Double DQN, Dueling DQN, 그리고 Prioritized Replay를 모두 활성화한 구성으로 학습해봅니다. 이렇게 하면 매우 적은 코드 변경으로 다양한 기능 조합을 시험할 수 있습니다.
예제 코드 (dqn_variations_cartpole.py)
import ray
from ray.rllib.algorithms.dqn import DQNConfig
if __name__ == "__main__":
ray.init(ignore_reinit_error=True)
config = (
DQNConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=2, rollout_fragment_length=200)
.training(
train_batch_size=1000,
lr=1e-4,
dueling=True, # 듀얼링 DQN 활성화
double_q=True, # 더블 DQN 활성화
# Prioritized Replay 설정
replay_buffer_config={
"type": "PrioritizedReplayBuffer",
"capacity": 100000,
"alpha": 0.6,
"beta": 0.4, # 중요도 샘플링 가중치 초기값
},
exploration_config={
"type": "EpsilonGreedy",
"initial_epsilon":1.0,
"final_epsilon":0.01,
"epsilon_timesteps":50000
}
)
)
trainer = config.build()
for i in range(20):
result = trainer.train()
mean_reward = result["episode_reward_mean"]
eps_value = result["info"]["exploration"]["epsilon"]
print(f"Iter {i+1}: mean_reward={mean_reward:.2f}, epsilon={eps_value:.2f}")
ckpt_path = trainer.save()
print("Checkpoint saved at:", ckpt_path)
ray.shutdown()
코드 해설
- replay_buffer_config로 Prioritized Replay 활성화: "type":"PrioritizedReplayBuffer" 지정, α, β 파라미터 설정.
- Double+Dueling 활성화: .training(dueling=True, double_q=True)로 쉽게 설정.
- Epsilon Greedy 탐색전략, rollout, batch size, learning rate 등 손쉬운 조정.
- 결과: 학습 iteration 마다 mean_reward 증가 추세 관찰. Prioritized Replay와 Double/Dueling 조합으로 더 빠른 성능 개선 기대.
Atari 환경 적용 예제
Atari 환경은 행동 공간이 이산적이며, RL 연구에서 자주 사용되는 벤치마크입니다. RLlib은 Atari 환경을 지원하기 위해 일부 전처리(프레임 스킵, 흑백 변환, 크기 조정 등)를 내장하고 있습니다.
아래 예제는 Breakout 환경을 PPO로 돌리는 것이지만, DQN 계열로도 비슷하게 적용할 수 있습니다. 단, Atari 환경을 사용하려면 추가 패키지 설치가 필요합니다.
pip install gym[atari] autorom[accept-license]
예제 코드 (dqn_atari_breakout.py)
import ray
from ray.rllib.algorithms.dqn import DQNConfig
if __name__ == "__main__":
ray.init(ignore_reinit_error=True)
config = (
DQNConfig()
.environment(env="BreakoutNoFrameskip-v4")
# Atari 환경은 NoFrameskip 버전을 주로 사용
.rollouts(num_rollout_workers=2)
.framework("torch")
.training(
train_batch_size=32000, # Atari는 더 큰 배치 사용 권장
lr=1e-4,
dueling=True,
double_q=True,
# Atari 전용 exploration 설정은 기본값 사용 가능
# 필요하다면 exploration_config 수정 가능
)
.resources(num_gpus=1) # GPU 활용 가능하면 설정
)
trainer = config.build()
for i in range(10):
result = trainer.train()
print(f"Iter {i+1}: mean_reward={result['episode_reward_mean']:.2f}")
ray.shutdown()
코드 해설
- env="BreakoutNoFrameskip-v4": Breakout Atari 환경 지정. RLlib이 내부적으로 프레임스킵, observation wrapper 적용.
- train_batch_size=32000 정도로 늘려서 안정적 업데이트. Atari 학습에는 상대적으로 큰 배치/롤아웃 스텝이 필요할 수 있음.
- Dueling, Double Q는 Atari에서도 유용.
- exploration_config 생략해 기본값 사용하거나, 필요시 별도 설정 가능.
실행 시 초기 평균 리워드는 낮지만, 수만 스텝 이상 학습해야 의미 있는 성능 개선을 볼 수 있습니다. 실제 Atari 학습은 CPU/GPU 자원과 더 많은 iteration이 필요할 수 있습니다.
다양한 이산 행동 환경 적용
- CartPole, MountainCar, LunarLander, Atari 등 다양한 이산 행동 환경에 DQN 계열 알고리즘 적용 가능.
- Config를 통해 파라미터를 조정하며, 더 복잡한 환경일수록 더 큰 batch, 더 오랜 학습 필요할 수 있음.
- exploration_config나 model_config를 수정해 CNN 모델 사용, 관측 전처리, action masking 등도 가능.
예: LunarLander
from ray.rllib.algorithms.dqn import DQNConfig
config = (
DQNConfig()
.environment(env="LunarLander-v2")
.framework("torch")
.rollouts(num_rollout_workers=1)
.training(
lr=5e-4,
double_q=True,
dueling=False,
train_batch_size=5000
)
)
trainer = config.build()
여기서 dueling=False로 변경, lr 조정 등으로 성능 변화를 관찰할 수 있습니다.
마무리
핵심 포인트 정리:
- DQN 변형(Double, Dueling, PER) 적용: Config 한두 줄 변경으로 다양한 기법 조합 가능.
- 이산 행동 환경(예: CartPole, Atari)에서 RLlib 사용 시, batch size, rollout length, exploration 전략, replay buffer 타입 등 파라미터를 손쉽게 조정해 성능 개선 탐색 가능.
- Atari 환경 적용 시 gym[atari], autorom 패키지 설치 후 env에 "NoFrameskip" 접미사 사용.
- 성능 개선을 위해 워커 수, GPU 사용, 배치 크기 조절, 두얼링/더블 Q 활성화 등 다양한 실험 가능.
이번 글에서는 이산 행동 환경에서 DQN과 그 변형 알고리즘(Double, Dueling, PER)을 RLlib을 통해 손쉽게 실행하는 방법을 살펴보았습니다. 환경 변경, 파라미터 조정, 다양한 옵션 활성화를 Config로 쉽게 처리할 수 있음을 확인했습니다.
다음 글에서는 정책기반 알고리즘(PPO, A2C)으로 넘어가, 이들을 다양한 환경에 적용하는 방법과 Config 설정, 로그 분석, 성능 비교 방법을 소개할 예정입니다.
'개발 이야기 > PyTorch (파이토치)' 카테고리의 다른 글
[Ray RLlib로 강화학습 쉽게 사용하기] 4편: 정책기반 알고리즘 (A2C, PPO) 손쉽게 사용하기 (0) | 2024.12.22 |
---|---|
[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 |