강화 학습: Deep Q-Networks (DQN) 기본 이해
강화 학습은 에이전트가 환경과 상호 작용하며 보상을 최대화하는 정책을 배우는 머신 러닝의 한 분야입니다. Deep Q-Networks (DQN)는 이러한 강화 학습의 핵심 알고리즘 중 하나로, 딥 러닝의 강력한 기능을 활용하여 복잡한 환경에서도 효과적으로 학습할 수 있도록 설계되었습니다. 이 글에서는 DQN의 기본적인 개념과 작동 원리에 대해 자세히 알아보겠습니다.
🌱 1. Q-러닝 (Q-Learning) 복습 (Review of Q-Learning)
Q-러닝은 강화 학습의 기본적인 알고리즘 중 하나로, Q-테이블을 사용하여 학습합니다. Q-테이블은 각 상태(state)와 행동(action)의 조합에 대한 Q-값(Q-value)을 저장합니다. Q-값은 특정 상태에서 특정 행동을 취했을 때 얻을 수 있는 예상된 미래 보상의 합을 나타냅니다. 에이전트는 Q-값을 업데이트하면서 최적의 정책(policy)을 찾아갑니다. Q-러닝의 핵심은 벨만 방정식(Bellman equation)을 사용하여 Q-값을 업데이트하는 것입니다.
예를 들어, 4개의 방이 있는 간단한 환경을 상상해 봅시다. 에이전트는 각 방에서 다른 방으로 이동할 수 있습니다. Q-테이블은 각 방(상태)과 에이전트가 취할 수 있는 행동(예: 다른 방으로 이동)에 대한 Q-값을 저장합니다. 에이전트가 특정 행동을 취하고 보상을 받으면, Q-테이블의 해당 Q-값이 업데이트됩니다.
Q-러닝의 수식은 다음과 같습니다:
Q(s, a) = Q(s, a) + α * [R(s, a) + γ * max(Q(s', a')) - Q(s, a)]
- Q(s, a): 상태 s에서 행동 a를 했을 때의 Q-값
- α: 학습률 (learning rate), 0과 1 사이의 값으로, 새로운 정보가 기존 정보를 얼마나 대체할지 결정
- R(s, a): 상태 s에서 행동 a를 했을 때 받는 즉시 보상
- γ: 할인율 (discount factor), 0과 1 사이의 값으로, 미래 보상에 대한 중요도를 결정
- s': 다음 상태 (next state)
- a': 다음 상태 s'에서 취할 수 있는 모든 행동
- max(Q(s', a')): 다음 상태 s'에서 최적의 행동 a'를 했을 때의 최대 Q-값
💡 2. 딥 Q-네트워크 (DQN)의 등장 배경 (Background of Deep Q-Networks)
Q-러닝은 간단한 환경에서는 잘 작동하지만, 상태 공간(state space)이 크거나 연속적인 환경에서는 Q-테이블을 저장하고 업데이트하는 것이 비효율적입니다. 예를 들어, 100x100 픽셀의 이미지를 입력으로 받는 환경에서는 가능한 상태의 수가 매우 많아집니다. 이러한 문제를 해결하기 위해 딥 러닝을 활용하여 Q-함수를 근사하는 방법이 제안되었습니다. DQN은 Q-함수를 딥 뉴럴 네트워크(DNN)로 표현하여, 입력으로 상태를 받고 출력으로 각 행동에 대한 Q-값을 예측합니다. 이렇게 하면, Q-테이블을 저장할 필요 없이, 딥 뉴럴 네트워크를 학습시켜 Q-함수를 근사할 수 있습니다.
🧠 3. DQN의 작동 원리 (How DQN Works)
DQN은 다음과 같은 주요 구성 요소로 구성됩니다.
- Q-네트워크 (Q-Network): 상태를 입력으로 받아 각 행동에 대한 Q-값을 출력하는 딥 뉴럴 네트워크입니다. 이 네트워크는 Q-함수를 근사합니다.
- 경험 재생 (Experience Replay): 에이전트가 환경과 상호 작용하면서 얻은 경험(상태, 행동, 보상, 다음 상태)을 저장하는 메모리입니다. 학습 시, 경험 재생에서 무작위로 경험을 샘플링하여 학습 데이터를 생성합니다. 이렇게 하면, 학습 데이터 간의 상관 관계를 줄이고, 학습의 안정성을 높일 수 있습니다.
- 타겟 네트워크 (Target Network): Q-네트워크와 동일한 구조를 가지지만, 주기적으로 Q-네트워크의 가중치를 복사하여 고정된 목표를 제공합니다. 타겟 네트워크는 Q-값의 계산을 안정화하여 학습의 안정성을 높입니다. Q-네트워크의 가중치가 매번 업데이트되면, 학습이 불안정해질 수 있습니다. 타겟 네트워크를 사용하면, Q-값의 목표가 상대적으로 안정적으로 유지되므로 학습이 효과적으로 이루어집니다.
DQN의 학습 과정은 다음과 같습니다.
- 에이전트는 환경과 상호 작용하며 경험을 얻습니다 (상태, 행동, 보상, 다음 상태).
- 경험을 경험 재생 메모리에 저장합니다.
- 경험 재생 메모리에서 무작위로 미니 배치(mini-batch)를 샘플링합니다.
- 미니 배치를 사용하여 Q-네트워크를 학습시킵니다. 손실 함수(loss function)를 사용하여 Q-네트워크의 가중치를 업데이트합니다. 손실 함수는 예측된 Q-값과 타겟 Q-값 간의 차이를 측정합니다.
- 주기적으로 타겟 네트워크의 가중치를 Q-네트워크의 가중치로 업데이트합니다.
💻 4. DQN의 구현 (Implementation of DQN)
다음은 간단한 DQN의 파이썬 코드 예시입니다 (PyTorch 사용):
import torch
import torch.nn as nn
import torch.optim as optim
import random
import numpy as np
# Q-네트워크 정의
class QNetwork(nn.Module):
def __init__(self, state_size, action_size):
super(QNetwork, 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, state):
x = torch.relu(self.fc1(state))
x = torch.relu(self.fc2(x))
return self.fc3(x)
# 경험 재생 메모리
class ReplayMemory:
def __init__(self, capacity):
self.capacity = capacity
self.memory = []
self.position = 0
def push(self, state, action, reward, next_state):
if len(self.memory) < self.capacity:
self.memory.append(None)
self.memory[self.position] = (state, action, reward, next_state)
self.position = (self.position + 1) % self.capacity
def sample(self, batch_size):
return random.sample(self.memory, batch_size)
def __len__(self):
return len(self.memory)
# 하이퍼파라미터 설정
state_size = 4 # 예시: CartPole 환경의 상태 수
action_size = 2 # 예시: CartPole 환경의 행동 수
learning_rate = 0.001
batch_size = 32
gamma = 0.99 # 할인율
epsilon = 1.0 # ϵ-탐욕 정책에서 사용
epsilon_decay = 0.995
epsilon_min = 0.01
# Q-네트워크 및 옵티마이저 초기화
q_network = QNetwork(state_size, action_size)
optimizer = optim.Adam(q_network.parameters(), lr=learning_rate)
memory = ReplayMemory(10000)
# 학습 루프
num_episodes = 1000
for episode in range(num_episodes):
# 환경 초기화 (예시: CartPole 환경)
state = env.reset()
state = torch.tensor(state, dtype=torch.float32).unsqueeze(0) # 텐서로 변환
done = False
while not done:
# ϵ-탐욕 정책으로 행동 선택
if random.random() < epsilon:
action = random.randint(0, action_size - 1)
else:
with torch.no_grad():
q_values = q_network(state)
action = q_values.argmax().item()
# 행동 수행 및 환경 관찰
next_state, reward, done, _ = env.step(action)
next_state = torch.tensor(next_state, dtype=torch.float32).unsqueeze(0) # 텐서로 변환
reward = torch.tensor([reward], dtype=torch.float32)
# 경험 저장
memory.push(state, action, reward, next_state)
state = next_state
# 경험 재생을 통해 학습
if len(memory) > batch_size:
# 미니 배치 샘플링
transitions = memory.sample(batch_size)
states, actions, rewards, next_states = zip(*transitions)
states = torch.cat(states)
actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1)
rewards = torch.cat(rewards)
next_states = torch.cat(next_states)
# Q-값 계산
q_values = q_network(states).gather(1, actions)
# 타겟 Q-값 계산
next_q_values = q_network(next_states).detach().max(1)[0].unsqueeze(1)
target_q_values = rewards.unsqueeze(1) + gamma * next_q_values
# 손실 계산 및 옵티마이저 업데이트
loss = torch.nn.functional.mse_loss(q_values, target_q_values)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# ϵ 감소
epsilon = max(epsilon_min, epsilon * epsilon_decay)
print(f'Episode {episode + 1}, Epsilon: {epsilon:.2f}')
위의 코드는 DQN의 기본적인 구조를 보여주는 예시입니다. 실제 환경에 적용하기 위해서는 환경에 맞는 입력과 출력을 정의하고, 하이퍼파라미터를 튜닝해야 합니다. 또한, 경험 재생과 타겟 네트워크를 통해 학습의 안정성을 높이는 것도 중요합니다.
🌟 5. DQN의 장점과 한계 (Advantages and Limitations of DQN)
장점 (Advantages):
- 높은 성능 (High Performance): 복잡한 환경에서도 효과적으로 학습할 수 있습니다.
- 유연성 (Flexibility): 다양한 종류의 환경에 적용 가능합니다 (예: Atari 게임).
- 일반화 (Generalization): Q-함수를 근사하여, 새로운 상태에 대한 예측을 할 수 있습니다.
한계 (Limitations):
- 과대평가 문제 (Overestimation Problem): DQN은 Q-값을 과대평가하는 경향이 있습니다. 이로 인해 학습의 안정성이 저하될 수 있습니다.
- 수렴의 불안정성 (Instability of Convergence): 하이퍼파라미터에 민감하며, 수렴이 불안정할 수 있습니다.
- 계산 비용 (Computational Cost): 딥 뉴럴 네트워크를 학습해야 하므로, 계산 비용이 많이 듭니다.
🚀 6. DQN의 발전된 형태 (Advanced Forms of DQN)
DQN은 여러 가지 개선된 형태로 발전했습니다.
- Double DQN (이중 DQN): 과대평가 문제를 해결하기 위해, Q-값을 선택하는 네트워크와 Q-값을 계산하는 네트워크를 분리하여 사용합니다.
- Dueling DQN (듀얼링 DQN): 상태 가치 함수와 행동 장점 함수를 분리하여, 학습 효율을 높입니다.
- Prioritized Experience Replay (우선순위 경험 재생): 중요도가 높은 경험을 더 자주 샘플링하여, 학습 효율을 높입니다.
✅ 7. 결론 (Conclusion)
DQN은 강화 학습의 중요한 알고리즘이며, 딥 러닝을 활용하여 복잡한 환경에서 효과적으로 학습할 수 있습니다. DQN의 기본 원리를 이해하고, 다양한 개선된 형태를 학습하면, 강화 학습 분야에서 더욱 발전된 연구를 수행할 수 있습니다.
핵심 용어 요약 (Summary of Key Terms)
- 강화 학습 (Reinforcement Learning): 에이전트가 환경과 상호 작용하며 보상을 최대화하는 정책을 배우는 머신 러닝 분야.
- Q-러닝 (Q-Learning): Q-테이블을 사용하여 Q-값을 학습하는 강화 학습 알고리즘.
- Q-값 (Q-value): 특정 상태에서 특정 행동을 취했을 때 얻을 수 있는 예상된 미래 보상의 합.
- DQN (Deep Q-Networks): 딥 러닝을 활용하여 Q-함수를 근사하는 강화 학습 알고리즘.
- Q-네트워크 (Q-Network): 상태를 입력으로 받아 각 행동에 대한 Q-값을 출력하는 딥 뉴럴 네트워크.
- 경험 재생 (Experience Replay): 에이전트가 환경과 상호 작용하면서 얻은 경험을 저장하는 메모리.
- 타겟 네트워크 (Target Network): Q-네트워크와 동일한 구조를 가지며, 주기적으로 가중치를 업데이트하여 Q-값의 계산을 안정화하는 네트워크.
- 벨만 방정식 (Bellman equation): Q-값을 업데이트하기 위한 핵심 방정식.
- 상태 공간 (state space): 환경에서 가능한 모든 상태의 집합.
- 행동 (action): 에이전트가 환경에서 수행할 수 있는 동작.
- 보상 (reward): 에이전트가 특정 행동을 취했을 때 받는 신호.
- 학습률 (learning rate): 새로운 정보가 기존 정보를 얼마나 대체할지 결정하는 하이퍼파라미터.
- 할인율 (discount factor): 미래 보상에 대한 중요도를 결정하는 하이퍼파라미터.
영어 용어 (English Terms)
- Reinforcement Learning
- Q-Learning
- Q-value
- Deep Q-Networks (DQN)
- Q-Network
- Experience Replay
- Target Network
- Bellman equation
- State space
- Action
- Reward
- Learning Rate
- Discount Factor