들어가며
강화학습(Reinforcement Learning)은 에이전트가 환경과 상호작용하며 보상을 최대화하는 방향으로 학습하는 머신러닝 기법입니다. 특히 게임 AI 개발에서 강화학습은 AlphaGo의 성공 이후 폭발적인 관심을 받고 있습니다. 이번 시리즈에서는 강화학습을 이용해 게임 AI를 만드는 전 과정을 다룹니다.
첫 편인 이번 글에서는 강화학습의 기본 개념과 OpenAI Gym 환경 설정, 그리고 가장 간단한 에이전트를 구현해보겠습니다.
강화학습의 핵심 개념
강화학습은 다음 4가지 핵심 요소로 구성됩니다.
| 요소 | 설명 |
|---|---|
| 에이전트(Agent) | 학습하고 행동하는 주체 |
| 환경(Environment) | 에이전트가 상호작용하는 게임 세계 |
| 상태(State) | 현재 환경의 상황 정보 |
| 행동(Action) | 에이전트가 취할 수 있는 동작 |
| 보상(Reward) | 행동에 대한 피드백 신호 |
강화학습의 학습 과정은 다음과 같습니다.
1. 에이전트가 현재 상태(State)를 관찰
2. 정책(Policy)에 따라 행동(Action) 선택
3. 환경에 행동을 전달
4. 환경이 새로운 상태와 보상(Reward)을 반환
5. 에이전트가 보상을 바탕으로 정책 개선
6. 1~5 반복
OpenAI Gym 환경 설정
OpenAI Gym은 강화학습 알고리즘을 테스트할 수 있는 표준화된 환경을 제공하는 라이브러리입니다. 최근에는 Gymnasium으로 이름이 변경되었지만, 사용법은 거의 동일합니다.
설치하기
# Gymnasium 설치
pip install gymnasium
# 추가 게임 환경 설치
pip install gymnasium[atari]
pip install gymnasium[accept-rom-license]
# 시각화를 위한 라이브러리
pip install pygame
첫 환경 실행하기
가장 간단한 CartPole 환경으로 시작해봅시다. CartPole은 막대를 균형잡는 게임으로, 강화학습 입문에 최적화된 환경입니다.
import gymnasium as gym
# 환경 생성
env = gym.make('CartPole-v1', render_mode='human')
# 환경 초기화
state, info = env.reset()
print(f"상태 공간: {env.observation_space}")
print(f"행동 공간: {env.action_space}")
print(f"초기 상태: {state}")
# 환경 종료
env.close()
출력 결과:
상태 공간: Box([-4.8 -inf -0.418 -inf], [4.8 inf 0.418 inf], (4,), float32)
행동 공간: Discrete(2)
초기 상태: [ 0.01234567 -0.00123456 0.02345678 0.01234567]
CartPole의 상태는 4개의 값으로 구성됩니다.
– 카트의 위치
– 카트의 속도
– 막대의 각도
– 막대의 각속도
행동은 2개입니다: 0(왼쪽), 1(오른쪽)
랜덤 에이전트 구현
가장 간단한 에이전트는 무작위로 행동을 선택하는 랜덤 에이전트입니다. 이것이 기준선(baseline)이 됩니다.
import gymnasium as gym
import numpy as np
def random_agent(episodes=10):
env = gym.make('CartPole-v1', render_mode='human')
total_rewards = []
for episode in range(episodes):
state, info = env.reset()
episode_reward = 0
done = False
while not done:
# 무작위 행동 선택
action = env.action_space.sample()
# 환경에 행동 전달
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
episode_reward += reward
state = next_state
total_rewards.append(episode_reward)
print(f"Episode {episode+1}: Reward = {episode_reward}")
env.close()
print(f"\n평균 보상: {np.mean(total_rewards):.2f}")
return total_rewards
# 실행
rewards = random_agent(episodes=10)
랜덤 에이전트는 평균적으로 20~30 스텝 정도 버틸 수 있습니다. 이제 이보다 나은 에이전트를 만드는 것이 목표입니다.
단순 정책 기반 에이전트
랜덤보다는 나은 간단한 휴리스틱 정책을 구현해봅시다. 막대가 오른쪽으로 기울면 오른쪽으로, 왼쪽으로 기울면 왼쪽으로 움직이는 전략입니다.
def simple_policy_agent(episodes=10):
env = gym.make('CartPole-v1', render_mode='human')
total_rewards = []
for episode in range(episodes):
state, info = env.reset()
episode_reward = 0
done = False
while not done:
# 막대의 각도(state[2])를 기반으로 행동 결정
angle = state[2]
action = 1 if angle > 0 else 0
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
episode_reward += reward
state = next_state
total_rewards.append(episode_reward)
print(f"Episode {episode+1}: Reward = {episode_reward}")
env.close()
print(f"\n평균 보상: {np.mean(total_rewards):.2f}")
return total_rewards
# 실행
rewards = simple_policy_agent(episodes=10)
이 간단한 정책만으로도 평균 40~50 스텝 이상을 버틸 수 있습니다. 하지만 이는 여전히 최적의 정책이 아닙니다.
환경 탐색하기
Gym은 다양한 게임 환경을 제공합니다. 다음 편에서 다룰 Atari 게임을 미리 살펴봅시다.
import gymnasium as gym
# 사용 가능한 환경 목록 확인
from gymnasium import envs
print("등록된 환경 개수:", len(envs.registry))
print("\nAtari 환경 예시:")
for env_id in list(envs.registry.keys())[:10]:
if 'ALE' in env_id:
print(f" - {env_id}")
주요 환경 카테고리:
– Classic Control: CartPole, MountainCar, Acrobot
– Atari: Pong, Breakout, SpaceInvaders
– Box2D: LunarLander, BipedalWalker
– MuJoCo: 로봇 시뮬레이션 (라이선스 필요)
다음 편 예고
지금까지 강화학습의 기본 개념과 OpenAI Gym 환경 설정, 그리고 간단한 에이전트를 구현해봤습니다. 하지만 휴리스틱 기반 정책은 복잡한 게임에서는 작동하지 않습니다.
다음 편에서는 DQN(Deep Q-Network) 알고리즘을 이용해 Atari 게임을 학습시키는 방법을 다룹니다. 딥러닝과 강화학습을 결합하여 픽셀 입력만으로 게임을 마스터하는 AI를 만들어보겠습니다.
마무리
이번 글에서는 강화학습의 기본 개념부터 OpenAI Gym 환경 설정, 그리고 첫 에이전트 구현까지 다뤘습니다. 랜덤 에이전트와 단순 정책 에이전트를 구현하며 강화학습의 기본 흐름을 익혔습니다.
핵심 포인트:
– 강화학습은 에이전트가 환경과 상호작용하며 보상을 최대화하는 학습 방법
– OpenAI Gym(Gymnasium)은 표준화된 강화학습 테스트 환경 제공
– 간단한 정책만으로도 기본 성능 개선 가능
– 복잡한 게임을 위해서는 딥러닝 기반 알고리즘 필요
다음 편에서는 본격적으로 딥러닝을 활용한 강화학습 알고리즘을 구현하며 게임 AI의 성능을 크게 향상시켜보겠습니다.
이 글이 도움이 되셨나요?
Buy me a coffee
답글 남기기