Double DQN

Deep Reinforcement Learning bằng Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Double Q-learning

  • Q-learning đánh giá cao quá mức Q-value, làm giảm hiệu quả học
  • Do thiên lệch tối đa hóa
  • Double Q-learning khử thiên lệch bằng cách tách chọn hành động và ước lượng giá trị

Hai Q-table (minh họa từ khóa học Reinforcement Learning with Gymnasium using Python); double Q-learning luân phiên dùng từng bảng

Deep Reinforcement Learning bằng Python

Ý tưởng đằng sau DDQN

  • Bắt đầu từ DQN hoàn chỉnh (với Q-target cố định)
  • Trong DQN, TD target:
    • Chọn hành động: mạng target
    • Ước lượng giá trị: mạng target
  • Trong DDQN, TD target:
    • Chọn hành động: mạng online
    • Ước lượng giá trị: mạng target
  • Không hoàn toàn là double Q-learning (không thay phiên Q-network)
  • Đạt phần lớn lợi ích, thay đổi tối thiểu

Sai số Bellman (DQN với Q-target cố định): Q_online(s_t, a_t) - (r_t+1 + gamma max(Q_target(s_t+1, a)))

Sai số Bellman (DDQN với Q-target cố định): Q_online(s_t, a_t) - (r_t+1 + gamma Q_target(s_t+1, tilde a)) với tilde a = argmax_a(Q_online(s_t+1, a))

Deep Reinforcement Learning bằng Python

Cài đặt Double 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
Deep Reinforcement Learning bằng Python

Cài đặt Double 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
Deep Reinforcement Learning bằng Python

Hiệu năng DDQN

 

  • So sánh hiệu năng DDQN, DQN và người chơi trên Atari
  • DDQN: điểm cao hơn DQN gốc
  • Không phải lúc nào cũng đúng -> thử cả hai

Biểu đồ cột cho thấy DQN gần bằng người chơi ở trò chơi trung vị và vượt trội trung bình; DDQN vượt cả người chơi và DQN ở trung vị và trung bình.

1 https://arxiv.org/abs/2303.11634
Deep Reinforcement Learning bằng Python

Luyện tập nhé!

Deep Reinforcement Learning bằng Python

Preparing Video For Download...