본 강좌에서는 딥러닝의 기초 지식과 함께 마르코프 보상 프로세스(Markov Decision Process, MDP)에 대해
알아보고, 이를 파이토치(Pytorch)를 활용하여 구현하는 방법에 대해 설명합니다. MDP는 강화학습
분야에서 중요한 개념으로, 목표를 달성하기 위한 최적의 행동을 찾는 데 중요한 수학적 모델입니다.
1. 마르코프 보상 프로세스란?
마르코프 보상 프로세스(MDP)는 어떤 환경에서 에이전트(행동하는 주체)가
최적의 결정을 내리기 위해 고려해야 할 요소들을 정의하는 수학적 프레임워크입니다. MDP는
다음의 5가지 주요 요소로 구성됩니다:
- 상태 집합 (S): 환경의 모든 가능한 상태를 나타내는 집합입니다.
- 행동 집합 (A): 각 상태에서 에이전트가 취할 수 있는 가능한 행동의 집합입니다.
- 전환 확률 (P): 현재 상태에서 특정 행동을 취했을 때, 다음 상태로 전환될 확률을 나타냅니다.
- 보상 함수 (R): 특정 상태에서 특정 행동을 통해 얻는 보상을 정의합니다.
- 할인율 (γ): 미래 보상이 현재 보상에 비해 얼마나 중요한지를 결정하는 값입니다.
2. 마르코프 보상 프로세스의 수학적 정의
MDP는 일반적으로 튜플 (S, A, P, R, γ)로 정의되며, 에이전트는 이 정보를 바탕으로 정책(보다 나은 행동을 선택하는 규칙)을 배웁니다. MDP의 목표는 장기적인 보상(Reward)을 최대화하는 최적의 정책을 찾는 것입니다.
상태와 행동의 상관관계
각 상태 s ∈ S에서 행동 a ∈ A를 취했을 때, 다음 상태 s’ ∈ S로 전이될 확률은 P(s’|s, a)로 나타냅니다. 보상 함수는 R(s, a)로 표현되며, 이는 에이전트가 상태 s에서 행동 a를 취할 때 얻는 즉각적인 보상을 나타냅니다.
정책 π
정책 π는 상태 s에서 어떤 행동 a를 취할 확률을 정의합니다. 이를 통해 에이전트는 주어진 상태에서 최적의 행동을 선택할 수 있습니다.
3. 파이토치로 MDP 구현하기
이제 마르코프 보상 프로세스를 파이토치로 구현해보겠습니다. 아래 코드는 MDP를 정의하고,
에이전트가 최적의 정책을 학습하는 과정을 보여줍니다. 이 예제에서는 간단한 그리드 환경에서의
MDP를 사용하여 에이전트가 목표 지점에 도달하는 과정을 시뮬레이션합니다.
필요한 라이브러리 설치하기
pip install torch numpy matplotlib
코드 예제
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# 환경 정의
class GridWorld:
def __init__(self, grid_size):
self.grid_size = grid_size
self.state = (0, 0) # 초기 상태
self.goal = (grid_size - 1, grid_size - 1) # 목표 상태
self.actions = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 오른쪽, 왼쪽, 아래, 위
def step(self, action):
next_state = (self.state[0] + action[0], self.state[1] + action[1])
# 경계를 초과하면 상태를 변경하지 않음
if 0 <= next_state[0] < self.grid_size and 0 <= next_state[1] < self.grid_size:
self.state = next_state
# 보상 및 완료 조건
if self.state == self.goal:
return self.state, 1, True # 목표 도달
return self.state, 0, False
def reset(self):
self.state = (0, 0)
return self.state
# Q-네트워크 정의
class QNetwork(nn.Module):
def __init__(self, input_dim, output_dim):
super(QNetwork, self).__init__()
self.fc1 = nn.Linear(input_dim, 24) # 첫 번째 은닉층
self.fc2 = nn.Linear(24, 24) # 두 번째 은닉층
self.fc3 = nn.Linear(24, output_dim) # 출력층
def forward(self, x):
x = nn.functional.relu(self.fc1(x))
x = nn.functional.relu(self.fc2(x))
return self.fc3(x)
# Q-learning 학습기
class QLearningAgent:
def __init__(self, state_space, action_space):
self.q_network = QNetwork(state_space, action_space)
self.optimizer = optim.Adam(self.q_network.parameters(), lr=0.001)
self.criterion = nn.MSELoss()
self.gamma = 0.99 # 할인율
self.epsilon = 1.0 # 탐험 비율
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
def choose_action(self, state):
if np.random.rand() <= self.epsilon:
return np.random.randint(0, 4) # 무작위 행동
q_values = self.q_network(torch.FloatTensor(state)).detach().numpy()
return np.argmax(q_values) # 최적 행동 반환
def train(self, state, action, reward, next_state, done):
target = reward
if not done:
target = reward + self.gamma * np.max(self.q_network(torch.FloatTensor(next_state)).detach().numpy())
target_f = self.q_network(torch.FloatTensor(state)).detach().numpy()
target_f[action] = target
# 학습
self.optimizer.zero_grad()
output = self.q_network(torch.FloatTensor(state))
loss = self.criterion(output, torch.FloatTensor(target_f))
loss.backward()
self.optimizer.step()
# 탐험 비율 감소
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
# 메인 루프
def main():
env = GridWorld(grid_size=5)
agent = QLearningAgent(state_space=2, action_space=4)
episodes = 1000
rewards = []
for episode in range(episodes):
state = env.reset()
done = False
total_reward = 0
while not done:
action = agent.choose_action(state)
next_state, reward, done = env.step(env.actions[action])
agent.train(state, action, reward, next_state, done)
state = next_state
total_reward += reward
rewards.append(total_reward)
# 결과 시각화
plt.plot(rewards)
plt.xlabel('Episode')
plt.ylabel('Reward')
plt.title('Training Rewards over Episodes')
plt.show()
if __name__ == "__main__":
main()
4. 코드 설명
위의 코드는 5×5의 그리드 환경에서의 MDP를 구현한 예제입니다.
GridWorld 클래스는 에이전트가 움직일 수 있는 그리드 환경을 정의합니다. 에이전트는 제공된
행동 집합을 기반으로 이동하며, 목표 지점에 도달할 때 보상을 받습니다.
QNetwork 클래스는 Q-러닝에서 사용하는 심층 신경망 모델을 정의합니다.
입력으로 상태 차원을 받고, 출력으로 각 행동에 대한 Q-값을 반환합니다.
QLearningAgent 클래스는 실제 강화 학습의 학습 과정을 수행하는 에이전트를
나타냅니다. 이 에이전트는 정책을 사용하여 행동을 선택하고, Q-값을 업데이트합니다.
main 함수에서는 환경을 초기화하고, 에피소드를 실행하는 주 루프가 포함되어 있습니다.
각 에피소드에서 에이전트는 주어진 상태에 대해 행동을 선택하고, 환경의 다음 상태를 통해 보상을
받으며, 이를 학습합니다. 훈련이 완료되면 보상을 시각화하여 에이전트의 성과를 확인할 수 있습니다.
5. 학습 결과 분석
학습 과정을 살펴보면, 에이전트가 환경을 탐색하면서 맵을 효과적으로 탐색하여 목표에 도달하게 됩니다.
보상의 추세를 시각화한 그래프를 통해 학습이 진행됨에 따라 보상이 어떻게 변화하는지를 확인할 수
있습니다. 이상적인 경우, 에이전트는 점차 높은 보상을 얻는 방향으로 학습하게 됩니다.
6. 결론 및 향후 방향
본 강좌에서는 딥러닝, 파이토치, 그리고 마르코프 보상 프로세스의 기초 개념들에 대해
설명하였습니다. 파이토치를 사용하여 MDP를 구현하는 과정과 같이 실습을 통해 관련 개념을
보다 깊이 이해할 수 있었습니다. 강화학습은 매우 광범위한 분야이며, 다양한 알고리즘과
적용 가능한 환경들이 존재합니다.
향후에는 더 복잡한 환경 및 다양한 정책 학습 알고리즘(예: DQN, Policy Gradients 등)을
다루는 심화 강좌를 진행할 예정입니다.