Double DQN

Глибоке навчання з підкріпленням у Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Double Q-learning

  • Q-learning завищує Q-значення, що знижує ефективність навчання
  • Причина — упередження максимізації
  • Double Q-Learning усуває упередження, розділяючи вибір дії та оцінювання значення

Дві Q-таблиці (ілюстрація з курсу Reinforcement Learning with Gymnasium using Python); double Q-learning почергово використовує кожну з них

Глибоке навчання з підкріпленням у Python

Ідея DDQN

  • Почніть із повного DQN (зі фіксованими Q-цілями)
  • У DQN TD-ціль:
    • Вибір дії: target-мережа
    • Оцінювання значення: target-мережа
  • У DDQN TD-ціль:
    • Вибір дії: online-мережа
    • Оцінювання значення: target-мережа
  • Це не зовсім double Q-learning (без почергових 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

Реалізація 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
Глибоке навчання з підкріпленням у Python

Реалізація 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
Глибоке навчання з підкріпленням у Python

Продуктивність DDQN

 

  • Порівняйте продуктивність DDQN, DQN і людей у іграх Atari
  • DDQN: вищі бали, ніж у оригінального DQN
  • Так не завжди буває → спробуйте обидва підходи

Стовпчикова діаграма: DQN майже відповідає людській грі для медіанної гри й у середньому досягає надлюдських результатів; DDQN перевершує і людей, і DQN за медіаною та середнім.

1 https://arxiv.org/abs/2303.11634
Глибоке навчання з підкріпленням у Python

Давайте потренуємось!

Глибоке навчання з підкріпленням у Python

Preparing Video For Download...