Q-learning을 신경망으로 확장한 DQN!!
Deep Q-Network(DQN)은 2015년 DeepMind가 발표한 Q-learning + 딥러닝 기반의 강화학습 알고리즘입니다. DQN은 Atari 2600 게임에서 인간 이상의 성능을 보이며 크게 주목받았으며, 특히 픽셀 단위의 이미지 입력을 CNN으로 처리하고, Q값으로 행동을 결정하는 구조는 강화학습에서 딥러닝의 활용 가능성을 처음으로 입증했습니다.
기존 Q-learning이 테이블 기반이라 확장에 한계가 있었던 반면, DQN은 고차원 상태 공간에서도 작동할 수 있도록 **Q 함수를 신경망으로 근사**함으로써 획기적인 전환점을 만들었습니다.
이 글에서는 DQN의 구조, 수식, 작동 원리, 그리고 실용적인 개선 방법까지 상세하게 살펴봅니다.
Q-learning의 한계와 동기
Q-learning은 \[ Q(s, a) \] 테이블을 직접 업데이트합니다. 이 방식은 상태와 행동이 적을 때는 잘 작동하지만, 이미지와 같이 수천~수백만 차원의 상태 공간에서는 테이블을 생성할 수조차 없습니다. 이를 해결하기 위해 Q값을 테이블이 아닌 함수로 근사하자는 아이디어가 등장했고, 그 함수로 딥러닝을 사용한 것이 바로 DQN입니다.
DQN은 다음과 같은 핵심 아이디어를 기반으로 작동합니다:
- Q-함수를 딥러닝 모델(신경망)으로 근사
- Experience Replay: 경험을 메모리에 저장하고 무작위 샘플링하여 학습
- Target Network: 학습 대상과 업데이트 대상 네트워크를 분리하여 안정성 확보
DQN 수식 및 손실 함수
딥러닝을 이용한 DQN의 학습 목표는 Q-learning의 벨만 최적 방정식을 만족하는 Q 함수를 학습하는 것입니다. 수식은 다음과 같습니다:
$$ y = r + \gamma \cdot \max_{a'} Q_{\text{target}}(s', a') $$
$$ L(\theta) = \mathbb{E}_{(s, a, r, s') \sim \mathcal{D}} \left[ \left( y - Q_{\theta}(s, a) \right)^2 \right] $$
- theta: Q-network의 파라미터
- D: 경험 리플레이 버퍼
- Q_target: 타깃 네트워크 (파라미터 고정된 복사본)
- y: 현재 상태-행동 쌍의 목표 Q값
- Q_theta(s, a): 현재 네트워크가 예측한 Q값
손실 함수는 현재 Q 예측값과 벨만 목표값 사이의 평균제곱오차(MSE)입니다. 이 손실을 줄이는 방향으로 신경망의 파라미터 (theta)를 업데이트합니다.
DQN의 구성 요소 상세 설명
1) Q-Network
상태(s)를 입력으로 받아 가능한 모든 행동(a)에 대한 Q값을 출력하는 신경망입니다. 일반적으로 이미지 입력의 경우 CNN(합성곱 신경망), 벡터 입력의 경우 MLP 등을 사용합니다.
2) Experience Replay
과거의 경험 (s, a, r, s')을 버퍼에 저장하고, 학습 시 무작위로 배치(batch)를 추출해 사용합니다. 이렇게 하면 샘플 간 상관관계를 줄이고, 데이터 효율성을 높이며 학습 안정성이 향상됩니다.
3) Target Network
Q-learning에서는 다음 상태의 Q값 ( max Q(s', a') )이 미래 예측값에 의존합니다. 이를 그대로 사용하면 추정값이 불안정하게 흔들립니다. DQN은 일정 주기마다 기존 네트워크를 복사해 Q_target
으로 사용함으로써 업데이트를 안정화시킵니다.
간단한 코드 예시
1) Q-함수를 근사하는 신경망
우선, 각 상태-행동 쌍에 대해 Q(s, a)값을 근사하는 신경망을 정의합니다.
아래는 간략한 DQN 네트워크 예시로 상태 s를 받아 가능한 행동에 대한 Q값을 모두 출력합니다.
$$ Q(s, \cdot) \rightarrow [Q(s, a_1), Q(s, a_2), \dots] $$
class DQN(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, action_dim)
)
def forward(self, x):
return self.net(x)
2) 행동 선택 – ε-greedy 정책
DQN은 학습 초반에는 탐험이 중요하므로, epsilon 확율로 무작위 행동을 수행합니다.
epsilon은 점점 줄어들며, 탐험(exploration)에서 활용(exploitation)로 전환됩니다.
def select_action(state, epsilon):
if random.random() < epsilon:
return env.action_space.sample()
else:
with torch.no_grad():
q_values = policy_net(torch.FloatTensor(state))
return q_values.argmax().item()
3) 경험 리플레이 (Replay Buffer)
강화학습은 순차적 데이터로 학습되기 때문에, 과거 데이터를 무작위로 섞어 사용하는 경험 재사용이 중요합니다.
리플레이 버퍼는 DQN의 핵심 요소 중 하나로, 샘플 간 상관성 제거와 샘플 효율 향상에 도움이 된다고 합니다.
class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity)
def push(self, transition):
self.buffer.append(transition)
def sample(self, batch_size):
batch = random.sample(self.buffer, batch_size)
return map(np.array, zip(*batch))
4) 학습 – Q-value 업데이트
위애서 언급하였듯이 DQN은 MSE 손실 함수를 통해 Q값을 업데이트합니다.
$$ y = r + \gamma \cdot \max_{a'} Q_{\text{target}}(s', a') $$
즉, 손실은 현재 Q 예측값과 벨만 최적 방정식에 기반한 타깃값(y)의 차이를 최소화합니다.
참고로 아래의 policy_net과 target_net은 모두 위 1)번의 DQN 객체입니다.
def train_step():
if len(memory) < BATCH_SIZE:
return
states, actions, rewards, next_states, dones = memory.sample(BATCH_SIZE)
q_values = policy_net(states)
next_q_values = target_net(next_states)
q_value = q_values.gather(1, actions.unsqueeze(1)).squeeze(1)
max_next_q_value = next_q_values.max(1)[0]
expected_q = rewards + GAMMA * max_next_q_value * (1 - dones)
loss = nn.MSELoss()(q_value, expected_q.detach())
optimizer.zero_grad()
loss.backward()
optimizer.step()
5) 타깃 네트워크 갱신
DQN은 (max Q(s', a') 계산 시 동일한 네트워크를 사용하면 Q값이 흔들릴 수 있어, 일정 주기마다 복사한 Target Network를 사용합니다.
if episode % TARGET_UPDATE == 0:
target_net.load_state_dict(policy_net.state_dict())
DQN의 한계와 개선
DQN도 몇 가지 구조적 한계를 가지고 있습니다:
- Overestimation: Q값이 과대추정되는 경향 → Double DQN
- 학습 비효율성: 경험 샘플을 균등하게 학습 → Prioritized Replay
- 정책 표현 한계: Q값만으로 정밀한 정책 구성 어려움 → Actor-Critic 계열 필요
이러한 문제를 해결하기 위해 다음과 같은 개선 알고리즘들이 있습니다:
- Double DQN: Q값의 과대추정을 줄이기 위해 행동 선택과 평가를 분리
- Dueling DQN: 상태의 가치와 각 행동의 상대적 이점을 분리하여 표현
- Prioritized Experience Replay: TD 오차가 큰 샘플에 더 집중
감사합니다.
'인공지능 > 강화학습' 카테고리의 다른 글
[강화학습] PPO 란? (10) | 2025.06.30 |
---|---|
[강화학습] Actor-Critic 이란? (0) | 2025.06.29 |
[강화학습] Q-learning 이란? (10) | 2025.06.26 |