더블 DQN

Python으로 배우는 Deep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

더블 Q-러닝

  • Q-learning은 Q-값을 과대평가하여 학습 효율을 저해
  • 원인: 최대화 편향
  • 더블 Q-러닝: 행동 선택과 가치 추정을 분리해 편향 제거

두 개의 Q-테이블(과정 “Reinforcement Learning with Gymnasium using Python”의 일러스트); 더블 Q-러닝은 두 테이블을 번갈아 사용

Python으로 배우는 Deep Reinforcement Learning

DDQN의 핵심 아이디어

  • 완성된 DQN(고정 Q-타깃 사용)에서 시작
  • DQN의 TD 타깃:
    • 행동 선택: 타깃 네트워크
    • 가치 추정: 타깃 네트워크
  • DDQN의 TD 타깃:
    • 행동 선택: 온라인 네트워크
    • 가치 추정: 타깃 네트워크
  • 완전한 더블 Q-러닝은 아님(교대 Q-네트워크 없음)
  • 최소 변경으로 대부분의 이점 획득

벨먼 오차(DQN, 고정 Q-타깃): Q_online(s_t, a_t) - (r_t+1 + gamma max(Q_target(s_t+1, a)))

벨먼 오차(DDQN, 고정 Q-타깃): Q_online(s_t, a_t) - (r_t+1 + gamma Q_target(s_t+1, tilde a)), 단 tilde a = argmax_a(Q_online(s_t+1, a))

Python으로 배우는 Deep Reinforcement Learning

더블 DQN 구현

DQN:

... # instantiate online and target networks
q_values = (online_network(states)
            .gather(1, actions).squeeze(1))

with torch.no_grad():
# # next_q_values = (target_network(next_states) .amax(1))
target_q_values = (rewards + gamma * next_q_values * (1 - dones))
loss = torch.nn.MSELoss()(q_values, target_q_values) ... # gradient descent ... # target network update

DDQN:

... # instantiate online and target networks
q_values = (online_network(states)
            .gather(1, actions).squeeze(1))

with torch.no_grad():

target_q_values = (rewards + gamma * next_q_values * (1 - dones))
loss = torch.nn.MSELoss()(q_values, target_q_values) ... # gradient descent ... # target network update
Python으로 배우는 Deep Reinforcement Learning

더블 DQN 구현

DQN:

... # instantiate online and target networks
q_values = (online_network(states)
            .gather(1, actions).squeeze(1))

with torch.no_grad():
next_actions = (target_network(next_states) .argmax(1).unsqueeze(1))
next_q_values = (target_network(next_states) .gather(1, next_actions).squeeze(1))
target_q_values = (rewards + gamma * next_q_values * (1 - dones))
loss = torch.nn.MSELoss()(q_values, target_q_values) ... # gradient descent ... # target network update

DDQN:

... # instantiate online and target networks
q_values = (online_network(states)
            .gather(1, actions).squeeze(1))

with torch.no_grad():
next_actions = (online_network(next_states) .argmax(1).unsqueeze(1))
next_q_values = (target_network(next_states) .gather(1, next_actions).squeeze(1))
target_q_values = (rewards + gamma * next_q_values * (1 - dones))
loss = torch.nn.MSELoss()(q_values, target_q_values) ... # gradient descent ... # target network update
Python으로 배우는 Deep Reinforcement Learning

DDQN 성능

 

  • Atari 게임에서 DDQN, DQN, 인간 성능 비교
  • DDQN: 원래 DQN보다 더 높은 점수
  • 항상 그렇진 않음 → 둘 다 시도

막대 차트: DQN은 중앙값 게임에서 인간에 근접, 평균은 초인적; DDQN은 중앙값과 평균에서 인간과 DQN을 모두 능가.

1 https://arxiv.org/abs/2303.11634
Python으로 배우는 Deep Reinforcement Learning

연습해 봅시다!

Python으로 배우는 Deep Reinforcement Learning

Preparing Video For Download...