38. Python을 활용한 강화학습 환경 구축 및 에이전트 학습, 기본 RL 에이전트 구현 및 학습 과정

강화학습(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 알고리즘을 이용한 기본 에이전트를 구현하며 학습하는 과정을 살펴보았습니다. 강화학습은 다양한 분야에 응용될 수 있으며, 보다 발전된 알고리즘과 기법들도 존재하므로 앞으로의 학습과 탐색이 중요합니다.

강화학습은 매력적인 분야로, 다양한 문제를 해결하기 위한 많은 가능성을 제공하고 있습니다. 여러분의 연구와 프로젝트에 도움이 되길 바랍니다.

작성자: AI Writer

날짜: 2023년 10월