강화학습(Reinforcement Learning, RL)은 머신러닝의 한 분야로, 에이전트가 환경과 상호작용하면서 최적의 행동을 학습하는 방법론입니다. 이 글에서는 Python을 사용하여 강화학습 환경을 구축하는 방법과 기본적인 RL 에이전트를 구현하고 학습하는 과정을 살펴보겠습니다.
1. 강화학습의 기초 개념
강화학습의 기본 구성 요소는 다음과 같습니다:
- 에이전트(Agent): 환경과 상호작용하는 주체입니다.
- 환경(Environment): 에이전트가 상호작용하는 세계입니다. 에이전트는 행동을 통해 환경의 상태를 변화시키고, 환경은 이에 대한 보상을 제공합니다.
- 상태(State): 환경의 현재 상태를 나타냅니다.
- 행동(Action): 에이전트가 환경에서 취할 수 있는 행동입니다.
- 보상(Reward): 에이전트가 특정 행동을 취했을 때 환경에서 얻는 피드백입니다.
2. Python 환경 설정
강화학습을 구현하기 위해 필요한 Python 라이브러리는 다음과 같습니다:
- NumPy: 수치 계산을 위한 라이브러리입니다.
- OpenAI Gym: 다양한 강화학습 환경을 제공하는 라이브러리입니다.
- Matplotlib: 결과를 시각화하는 데 유용합니다.
이 라이브러리를 설치하려면 다음 명령어를 사용하십시오:
pip install numpy gym matplotlib
3. 강화학습 환경 구축
이제 OpenAI Gym을 사용하여 간단한 강화학습 환경을 구축해 보겠습니다. 가장 기본적인 환경 중 하나는 CartPole입니다. 이 환경은 막대기가 세워진 수직 막대를 중심으로 균형을 잡는 것이 목표입니다.
3.1 CartPole 환경 만들기
import gym
# CartPole 환경 생성
env = gym.make('CartPole-v1')
obs = env.reset()
# 환경을 5번 실행해보기
for _ in range(5):
env.render() # 환경 시각화
obs, reward, done, info = env.step(env.action_space.sample()) # 무작위 행동 선택
if done:
obs = env.reset() # 환경 초기화
env.close()
위 코드를 실행하면 CartPole 환경이 생성되고, 에이전트가 랜덤 행동을 통해 환경을 탐색하는 모습을 볼 수 있습니다.
3.2 사용자 정의 환경 만들기
OpenAI Gym은 다양한 기본 환경을 제공하지만, 때때로 개인의 필요에 맞는 사용자 정의 환경이 필요할 수 있습니다. 사용자 정의 환경을 만들기 위해서는 gym.Env 클래스를 상속하여 새로운 클래스를 정의하면 됩니다.
import gym
from gym import spaces
class CustomEnv(gym.Env):
def __init__(self):
super(CustomEnv, self).__init__()
self.action_space = spaces.Discrete(2) # 0 또는 1 선택
self.observation_space = spaces.Box(low=0, high=1, shape=(1,), dtype=float)
self.state = 0
def step(self, action):
if action == 1:
self.state = 1
reward = 1
else:
self.state = 0
reward = 0
return self.state, reward, False, {}
def reset(self):
self.state = 0
return self.state
# 환경 사용 예
env = CustomEnv()
obs = env.reset()
print(obs)
위의 코드 예제는 간단한 사용자 정의 환경을 생성하는 방법을 보여줍니다. 이 환경은 두 가지 행동(0 또는 1)을 선택하고, 그에 따라 보상을 제공합니다.
4. 기본 RL 에이전트 구현
이제 에이전트를 구현할 차례입니다. 가장 기본적인 RL 알고리즘인 Q-Learning을 사용하여 에이전트를 구현해 보겠습니다.
4.1 Q-Learning 이해하기
Q-Learning은 모델프리 강화학습 알고리즘으로, 에이전트는 상태-행동 쌍에 대한 Q값을 학습하여 최적의 행동을 선택합니다. Q값은 상태와 행동에 대한 보상의 기대값을 나타냅니다.
4.2 Q-Learning 알고리즘 구현
다음은 Q-Learning 알고리즘을 사용하여 CartPole 환경에서 에이전트를 학습하는 코드입니다:
import numpy as np
# Q-Learning 알고리즘 구현
class QLearningAgent:
def __init__(self, n_states, n_actions, alpha=0.1, gamma=0.99, epsilon=1.0, epsilon_decay=0.995):
self.q_table = np.zeros((n_states, n_actions))
self.alpha = alpha # Learning rate
self.gamma = gamma # Discount factor
self.epsilon = epsilon # Explore rate
self.epsilon_decay = epsilon_decay # Epsilon decay factor
def choose_action(self, state):
if np.random.rand() < self.epsilon:
return np.random.randint(0, self.q_table.shape[1]) # Random action
return np.argmax(self.q_table[state]) # Exploit learned values
def update(self, state, action, reward, next_state):
best_next_action = np.argmax(self.q_table[next_state])
td_target = reward + self.gamma * self.q_table[next_state][best_next_action]
td_delta = td_target - self.q_table[state][action]
self.q_table[state][action] += self.alpha * td_delta
# 에이전트 학습 과정
env = gym.make('CartPole-v1')
n_states = 10 # 단순화를 위해 상태 수를 축소
n_actions = env.action_space.n
agent = QLearningAgent(n_states, n_actions)
for episode in range(1000):
state = env.reset()
done = False
while not done:
action = agent.choose_action(state)
next_state, reward, done, _ = env.step(action)
agent.update(state, action, reward, next_state)
state = next_state
env.close()
위의 Q-Learning 에이전트를 사용하여 CartPole 환경에서 학습을 수행합니다. 에피소드 수를 조절하여 에이전트가 환경에 적응하는 모습을 확인할 수 있습니다.
5. 학습 과정 시각화
에이전트의 학습 과정을 시각화하는 것은 매우 중요합니다. Matplotlib를 사용하여 에이전트가 각 에피소드에서 얻은 총 보상을 그래프로 나타내도록 하겠습니다.
import matplotlib.pyplot as plt
rewards = []
for episode in range(1000):
# 기존 학습 코드와 동일
total_reward = 0
state = env.reset()
done = False
while not done:
action = agent.choose_action(state)
next_state, reward, done, _ = env.step(action)
agent.update(state, action, reward, next_state)
state = next_state
total_reward += reward
rewards.append(total_reward)
plt.plot(rewards)
plt.xlabel('Episode')
plt.ylabel('Total Reward')
plt.title('Training Progress')
plt.show()
위 코드는 에이전트의 학습 진행 상황을 보여줍니다. 에이전트가 환경을 잘 탐색할수록 총 보상은 증가하게 됩니다.
6. 심화 학습: DQN
기본 Q-Learning은 간단하지만, 더 복잡한 환경에서는 Deep Q-Networks (DQN)와 같은 심층 강화학습 방법이 더 효과적입니다. DQN은 딥러닝을 사용하여 Q값을 근사합니다. 이 부분에 대해서는 별도의 강좌로 다룰 예정입니다.
7. 결론
이 글에서는 Python을 활용하여 강화학습 환경을 구축하고, Q-Learning 알고리즘을 이용한 기본 에이전트를 구현하며 학습하는 과정을 살펴보았습니다. 강화학습은 다양한 분야에 응용될 수 있으며, 보다 발전된 알고리즘과 기법들도 존재하므로 앞으로의 학습과 탐색이 중요합니다.
강화학습은 매력적인 분야로, 다양한 문제를 해결하기 위한 많은 가능성을 제공하고 있습니다. 여러분의 연구와 프로젝트에 도움이 되길 바랍니다.