간단한 게임 에이전트 만들기 (CartPole 예제)
1. 강화 학습이란?
강화 학습(Reinforcement Learning, RL)은 환경(Environment)과 에이전트(Agent) 간의 상호작용을 통해 최적의 행동을 학습하는 기법입니다. 에이전트는 특정한 상태(State)에서 행동(Action)을 수행하고, 환경으로부터 보상(Reward)을 받아 이를 바탕으로 학습합니다.
이 과정에서 에이전트는 보상을 최대화하는 정책(Policy)을 학습하게 됩니다. 강화 학습은 주로 게임 AI, 로봇 제어, 추천 시스템 등에 활용됩니다.
이번 포스팅에서는 강화 학습의 대표적인 실습 예제 중 하나인 CartPole 환경을 활용하여 간단한 게임 에이전트를 만들어 보겠습니다.
2. CartPole 환경 소개
CartPole은 OpenAI의 Gym 라이브러리에서 제공하는 대표적인 강화 학습 환경입니다. 수직으로 세워진 막대(Pole)를 움직이는 카트(Cart)에 고정시킨 후, 카트를 좌우로 이동시켜 막대가 넘어지지 않도록 유지하는 것이 목표입니다.
CartPole 환경의 구성 요소
- 상태(State): 카트의 위치, 속도, 막대의 각도, 각속도 (4가지 변수)
- 행동(Action): 왼쪽(0) 또는 오른쪽(1)으로 카트를 이동
- 보상(Reward): 매 타임스텝에서 막대가 쓰러지지 않고 유지되면 +1
- 에피소드 종료 조건: 막대가 일정 각도 이상 기울어지거나, 카트가 경계를 벗어나면 종료
이제 Python을 활용하여 CartPole 환경을 실행해 보고, 강화 학습을 적용한 게임 에이전트를 만들어 보겠습니다.
3. CartPole 환경 실행하기
먼저 gymnasium 라이브러리를 설치하고 CartPole 환경을 실행해 보겠습니다.
3.1 필요한 라이브러리 설치
pip install gymnasium[classic-control] numpy matplotlib
3.2 CartPole 환경 실행 코드
아래 코드를 실행하면 CartPole 환경을 초기화하고, 랜덤한 행동을 수행하는 모습을 확인할 수 있습니다.
import gymnasium as gym
import numpy as np
import matplotlib.pyplot as plt
# 환경 생성
env = gym.make("CartPole-v1", render_mode="human")
# 환경 초기화
state, _ = env.reset()
done = False
while not done:
action = env.action_space.sample() # 무작위 행동 선택
state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
env.close()
위 코드를 실행하면 랜덤한 행동을 수행하는 CartPole 환경이 동작하는 것을 확인할 수 있습니다.
4. 간단한 강화 학습 에이전트 구현 (Q-Learning)
강화 학습을 적용하기 위해 Q-Learning 알고리즘을 활용하여 CartPole 에이전트를 학습시켜 보겠습니다.
4.1 Q-Learning이란?
Q-Learning은 Q-테이블을 사용하여 상태와 행동에 대한 보상을 학습하는 방식입니다.
Q(state, action)값을 업데이트하는 기본 공식:$$ Q(s, a) \leftarrow Q(s, a) + \alpha (r + \gamma \max_{a'} Q(s', a') - Q(s, a)) $$
여기서:
- $ \alpha $ : 학습률 (Learning Rate)
- $ \gamma $ : 할인율 (Discount Factor)
- $ s, a $ : 현재 상태와 행동
- $ s', a' $ : 다음 상태와 최적 행동
- $ r $ : 보상
4.2 Q-Learning을 활용한 CartPole 학습 코드
import gymnasium as gym
import numpy as np
import random
# 환경 생성
env = gym.make("CartPole-v1")
# Q-테이블 초기화
state_bins = [np.linspace(-4.8, 4.8, 10), # Cart Position
np.linspace(-4, 4, 10), # Cart Velocity
np.linspace(-0.418, 0.418, 10), # Pole Angle
np.linspace(-4, 4, 10)] # Pole Velocity
q_table = np.zeros([10, 10, 10, 10, 2]) # (State bins, Actions)
# 하이퍼파라미터 설정
alpha = 0.1 # 학습률
gamma = 0.99 # 할인율
epsilon = 1.0 # 탐색 확률
min_epsilon = 0.01
epsilon_decay = 0.995
# 상태를 이산화하는 함수
def discretize_state(state):
indices = []
for i in range(len(state)):
indices.append(np.digitize(state[i], state_bins[i]) - 1)
return tuple(indices)
# 학습 루프
num_episodes = 1000
for episode in range(num_episodes):
state, _ = env.reset()
state = discretize_state(state)
done = False
total_reward = 0
while not done:
if random.uniform(0, 1) < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(q_table[state])
next_state, reward, terminated, truncated, _ = env.step(action)
next_state = discretize_state(next_state)
done = terminated or truncated
total_reward += reward
# Q-값 업데이트
best_next_action = np.argmax(q_table[next_state])
q_table[state][action] += alpha * (reward + gamma * q_table[next_state][best_next_action] - q_table[state][action])
state = next_state
# 탐색 확률 감소
epsilon = max(min_epsilon, epsilon * epsilon_decay)
print(f"Episode {episode+1}, Total Reward: {total_reward}")
env.close()
5. 결론
이번 포스팅에서는 강화 학습의 기본 개념을 이해하고, CartPole 환경에서 Q-Learning을 활용한 간단한 에이전트를 구현하였습니다.
Q-Learning은 강화 학습의 기초적인 알고리즘으로, 실제로는 DQN(Deep Q-Network)과 같은 심층 신경망 기반의 방법을 사용하여 더 복잡한 환경에서도 학습할 수 있습니다.
'Python > Deep Learning' 카테고리의 다른 글
| Deep Q-Learning (DQN) 개념 및 구현 (0) | 2026.01.21 |
|---|---|
| Q-Learning 알고리즘의 이해 및 구현 (0) | 2026.01.20 |
| 강화 학습(Reinforcement Learning)이란? 기초 개념 정리 (0) | 2026.01.19 |
| 전이 학습을 활용한 스타일 변환(Style Transfer) (1) | 2026.01.18 |
| Fine-Tuning을 이용한 모델 성능 개선 (1) | 2026.01.15 |