Double DQN

Deep Reinforcement Learning v Pythonu

Timothée Carayol

Principal Machine Learning Engineer, Komment

Double Q-učení

  • Q-učení nadhodnocuje Q-hodnoty, což snižuje efektivitu učení
  • Příčinou je zkreslení maximalizací
  • Double Q-učení odstraňuje zkreslení oddělením výběru akce a odhadu hodnoty

Dvě Q-tabulky (ilustrace z kurzu Reinforcement Learning with Gymnasium using Python); double Q-učení je střídavě využívá

Deep Reinforcement Learning v Pythonu

Princip DDQN

  • Vychází z kompletního DQN (s fixními Q-cíli)
  • TD cíl v DQN:
    • Výběr akce: cílová síť
    • Odhad hodnoty: cílová síť
  • TD cíl v DDQN:
    • Výběr akce: online síť
    • Odhad hodnoty: cílová síť
  • Není přesně double Q-učení (žádné střídání Q-sítí)
  • Většina výhod s minimální změnou

Bellmanova chyba (DQN s fixními Q-cíli): Q_online(s_t, a_t) - (r_t+1 + gamma max(Q_target(s_t+1, a)))

Bellmanova chyba (DDQN s fixními Q-cíli): Q_online(s_t, a_t) - (r_t+1 + gamma Q_target(s_t+1, tilde a)) kde tilde a = argmax_a(Q_online(s_t+1, a))

Deep Reinforcement Learning v Pythonu

Implementace 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 v Pythonu

Implementace 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 v Pythonu

Výkon DDQN

 

  • Porovnání výkonu DDQN, DQN a lidských hráčů na Atari hrách
  • DDQN: vyšší skóre než původní DQN
  • Neplatí vždy – vyzkoušejte obojí

Sloupcový graf: DQN se přibližuje lidskému výkonu na mediánu a dosahuje nadlidských výsledků v průměru; DDQN překonává lidský výkon i DQN na mediánu i průměru.

1 https://arxiv.org/abs/2303.11634
Deep Reinforcement Learning v Pythonu

Pojďme si procvičit!

Deep Reinforcement Learning v Pythonu

Preparing Video For Download...