[파이썬] PyTorch 강화 학습 구현

강화 학습(Reinforcement Learning)은 인공지능 분야에서 매우 중요한 기술로써, 주어진 환경에서 에이전트가 최적의 액션을 학습하여 목표를 달성하는 방법을 탐구합니다. PyTorch는 딥 러닝 라이브러리로써, 강화 학습 알고리즘 구현과 실험에 매우 적합한 환경을 제공합니다.

이 블로그 포스트에서는 PyTorch를 사용하여 강화 학습을 구현하는 방법을 알아보겠습니다.

환경 설정

먼저, PyTorch와 관련된 라이브러리들을 설치해야 합니다. 다음 명령을 사용해서 필요한 패키지들을 설치할 수 있습니다.

pip install torch torchvision gym

이제 PyTorch와 강화 학습에 필요한 라이브러리들이 설치되었습니다.

예제: 간단한 강화 학습 게임

강화 학습의 개념을 이해하기 위해 간단한 게임을 예로 들어보겠습니다. 이 게임에는 에이전트와 환경이 있습니다. 에이전트는 현재 상태를 관찰하고 액션을 선택하여 환경에 영향을 줄 수 있습니다. 이때, 에이전트는 보상을 통해 액션의 성능을 평가하고 학습합니다.

아래는 간단한 강화 학습 게임을 구현하는 예제 코드입니다.

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import gym

# 신경망 모델 정의
class DQN(nn.Module):
    def __init__(self, state_size, action_size):
        super(DQN, self).__init__()
        self.fc1 = nn.Linear(state_size, 64)
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, action_size)
        
    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 강화 학습 에이전트 클래스 정의
class DQNAgent:
    def __init__(self, state_size, action_size):
        self.state_size = state_size
        self.action_size = action_size
        self.model = DQN(state_size, action_size)
        self.optimizer = optim.Adam(self.model.parameters(), lr=0.001)
        self.criteria = nn.MSELoss()
        
    def get_action(self, state):
        state = torch.FloatTensor(state).unsqueeze(0)
        q_value = self.model(state)
        action = torch.argmax(q_value, dim=1).item()
        return action
    
    def train(self, state, action, next_state, reward, done):
        state = torch.FloatTensor(state).unsqueeze(0)
        next_state = torch.FloatTensor(next_state).unsqueeze(0)
        action = torch.LongTensor([action])
        reward = torch.FloatTensor([reward])
        done = torch.FloatTensor([done])
        
        # Q-Learning 식으로 손실 계산
        q_value = self.model(state).gather(1, action.unsqueeze(1))
        next_q_value = self.model(next_state).max(dim=1)[0].detach()
        expected_q_value = reward + (1 - done) * next_q_value
        loss = self.criteria(q_value, expected_q_value)
        
        # 모델 업데이트
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()

# 게임 환경 생성
env = gym.make('CartPole-v1')

# 하이퍼파라미터 설정
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
episodes = 1000
steps = 500

# 에이전트 생성
agent = DQNAgent(state_size, action_size)

# 강화 학습
for episode in range(episodes):
    state = env.reset()
    
    for step in range(steps):
        # 액션 선택
        action = agent.get_action(state)
        
        # 액션 수행 후 다음 상태, 보상, 게임 종료 여부 얻기
        next_state, reward, done, _ = env.step(action)
        
        # 학습
        agent.train(state, action, next_state, reward, done)
        
        # 상태 업데이트
        state = next_state
        
        if done:
            break

    # 에피소드마다 성능 출력
    if episode % 100 == 0:
        print(f"Episode: {episode}, Score: {step + 1}")

# 학습된 모델 저장
torch.save(agent.model.state_dict(), "dqn_model.pt")

위 예제 코드에서는 PyTorch를 사용하여 DQN이라는 신경망 모델과 DQNAgent라는 강화 학습 에이전트를 정의했습니다. 그리고 OpenAI Gym 라이브러리를 사용하여 CartPole-v1 환경을 생성하고, 해당 환경에서 에이전트를 강화 학습시키는 코드를 작성했습니다.

이제 이 코드를 실행하여 강화 학습을 구현하고 결과를 확인해보세요.

마치며

이 블로그 포스트에서는 PyTorch를 사용하여 강화 학습을 구현하는 방법에 대해 알아보았습니다. PyTorch를 사용하면 강화 학습 알고리즘을 쉽게 구현하고 실험해볼 수 있습니다.

더 많은 강화 학습 알고리즘에 대해 궁금하다면, PyTorch 공식 문서와 관련 강의를 참고하시기 바랍니다.