Double Q-learning

Reinforcement Learning con Gymnasium en Python

Fouad Trad

Machine Learning Engineer

Q-learning

  • Estima la función óptima de valor-acción
  • Sobreestima Q al actualizar con el máximo Q
  • Puede llevar a una política subóptima

 

Imagen con la fórmula matemática de la actualización de Q-learning.

Reinforcement Learning con Gymnasium en Python

Double Q-learning

  • Mantiene dos tablas Q
  • Cada tabla se actualiza a partir de la otra
  • Reduce el riesgo de sobreestimar Q

Imagen que muestra dos tablas Q, Q0 y Q1, y cada una se actualiza según la otra.

Reinforcement Learning con Gymnasium en Python

Actualizaciones en Double Q-learning

  • Selecciona una tabla al azar

Imagen que muestra dos tablas Q, Q0 y Q1, y cada una se actualiza según la otra.

Reinforcement Learning con Gymnasium en Python

Actualización de Q0

Imagen que muestra dos tablas Q, Q0 y Q1, y cada una se actualiza según la otra.

Imagen que muestra cómo encontrar la mejor acción siguiente al actualizar Q0.

Imagen que muestra la regla de actualización de Q0.

Reinforcement Learning con Gymnasium en Python

Actualización de Q1

Imagen que muestra dos tablas Q, Q0 y Q1, y cada una se actualiza según la otra.

Imagen que muestra cómo encontrar la mejor acción siguiente al actualizar Q1.

Imagen que muestra la regla de actualización de Q1.

Reinforcement Learning con Gymnasium en Python

Double Q-learning

Imagen que muestra dos tablas Q, Q1 y Q2, y cada una se actualiza según la otra.

  • Reduce el sesgo de sobreestimación
  • Alterna actualizaciones entre Q0 y Q1
  • Ambas tablas aportan al aprendizaje
Reinforcement Learning con Gymnasium en Python

Implementación con Frozen Lake

env = gym.make('FrozenLake-v1', 
               is_slippery=False)

num_states = env.observation_space.n
n_actions = env.action_space.n
Q = [np.zeros((num_states, n_actions))] * 2

num_episodes = 1000 alpha = 0.5 gamma = 0.99

Imagen de un agente navegando por Frozen Lake.

Reinforcement Learning con Gymnasium en Python

Implementar update_q_tables()

def update_q_tables(state, action, reward, next_state):
    # Select a random Q-table index (0 or 1)
    i = np.random.randint(2)

# Update the corresponding Q-table best_next_action = np.argmax(Q[i][next_state])
Q[i][state, action] = (1 - alpha) * Q[i][state, action] + alpha * (reward + gamma * Q[1-i][next_state, best_next_action])

Imagen que muestra la regla de actualización de Q1.

Imagen que muestra la regla de actualización de Q2.

Reinforcement Learning con Gymnasium en Python

Entrenamiento

for episode in range(num_episodes):
    state, info = env.reset()
    terminated = False

    while not terminated:
        action = np.random.choice(n_actions)  
        next_state, reward, terminated, truncated,  info = env.step(action)
        update_q_tables(state, action, reward, next_state)
        state = next_state

final_Q = (Q[0] + Q[1])/2 # OR final_Q = Q[0] + Q[1]
Reinforcement Learning con Gymnasium en Python

Política del agente

policy = {state: np.argmax(final_Q[state]) 
          for state in range(num_states)}
print(policy)
{ 0: 1,  1: 0,  2: 0,  3: 0, 
  4: 1,  5: 0,  6: 1,  7: 0, 
  8: 2,  9: 1, 10: 1, 11: 0, 
 12: 0, 13: 2, 14: 2, 15: 0}

Imagen que muestra la política aprendida por el agente, indicando qué acción tomar en cada estado.

Reinforcement Learning con Gymnasium en Python

¡Vamos a practicar!

Reinforcement Learning con Gymnasium en Python

Preparing Video For Download...