Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 4. Aprende Q-Learning con el juego "Taxi", parte 1 de 2

Ahora que hemos resuelto un entorno de juegos como CartPole, vamos a dar un paso más para aprender técnicas un poco más avanzadas de aprendizaje. Uno de los métodos de RL más utilizados el llamado Q-Learning, válido siempre y cuando tengamos un número no muy grande de acciones y estados

. Para resolver juegos más complejos como MsPacman o similares, se utilizan técnicas como DQN, Deep Q-Network, pero para poder comprenderlas mejor, es necesario aprender previamente algunos conceptos de Q-Learning. Sea cual sea la técnica que utilicemos, a partir de ahora comprobaremos que la clave de aprendizaje será el análisis de los estados anteriores.
- α es la media de aprendizaje
- γ cuantifica la importancia que le daremos a las futuras recompensas el cual varía entre 1 y 0. Si el valor es cercano a 1 las futuras recompensas tendrán más peso.
- MAX[Q(st,at) calcula el valor máximo de Q dentro de todas las posibles acciones que aparecen en el siguiente estado, se resta con los valores del estado actual y se calcula el máximo.

import gym
import numpy as np
env = gym.make("Taxi-v2")
observation=env.reset()
# Visualizamos el valor devuelto al resetear el entorno
print(observation)
#Mostrar el estado actual del entorno
env.render()

En la visualización del estado podemos ver las siguientes variables:
- El recuadro amarillo representa al taxi y su ubicación. El taxi se volverá de color verde cuando tenga a un pasajero a bordo.
- La carretera, o el camino por donde puede circular el taxi, está marcada por los “:”
- Una barrera (edificio, valla, etc.) está caracterizada por “|”
- La letra con color azul indicará la ubicación de recogida (el caso 1 será la “G”, en el dos la “R” y el tres la “R” de nuevo.
- El color magenta indicará la localización de destino (el caso 1 es la “B”, en el dos la “G” y el tercero la letra “B” de nuevo).
acciones=env.action_space
print (acciones)
- (0) abajo / sur
- (1) arriba / norte
- (2) derecha / este
- (3) izquierda / oeste
- (4) recoger pasajero
- (5) dejar pasajero
import gym import numpy as np env = gym.make("Taxi-v2") observation=env.reset() # Visualizamos el valor devuelto al resetear el entorno print(observation) #Mostrar el estado actual del entorno env.render() #Movimientos del taxi action=1 #mover arriba (north) el taxi observation, reward, done, info = env.step(action) print (env.step(action)) env.render() action=2 #mover derecho (east) el taxi observation, reward, done, info = env.step(action) print (env.step(action)) env.render()

import gym
import numpy as np
env = gym.make("Taxi-v2")
#Inicializacion de variables
Q=np.zeros([env.observation_space.n, env.action_space.n])
alpha=0.2
def run_episode(observation1, movimiento):
observation2, reward, done, info = env.step(movimiento)
Q[observation1,movimiento] += alpha * (reward + np.max(Q[observation2]) - Q[observation1,movimiento])
return done,reward, observation2
for episode in range (0,2000):
out_done=None
reward = 0
rewardstore=0
observation = env.reset()
print("Estado inicial:")
print(env.render()) # muestra estado inicial
while out_done != True:
action = np.argmax(Q[observation])
#print(env.render()) # muestra estados intermedios
out_done, out_totrwd, out_observation = run_episode(observation,action)
rewardstore += out_totrwd
observation = out_observation
print("Estado final:")
print(env.render()) # muestra estado final
print('Episodio ',episode,' Recompensa: ',rewardstore)
Se puede observar cómo los valores de salida, la recompensa total, pasa de ser negativa en los primeros episodios a positiva en los finales. Esto quiere decir que las tablas Q se van ajustando con los valores óptimos en cada episodio realizando el mejor trayecto posible para recoger al pasajero y llevarlo al destino. En la segunda parte del vídeo, se activa la renderización para ver gráficamente los estados del episodio inicial y final, y de esa forma comprobar el recorrido realizado (lo veremos en mayor detalle en el siguiente episodio).
En el siguiente artículo analizaremos el código fuente paso a paso y veremos internamente cómo funcionan las tablas Q así como la evolución del algoritmo encontrando la solución, no te lo pierdas.
Otros episodios de esta serie:
Cómo entrenar tu IA jugando videojuegos, Parte 1
Cómo entrenar tu IA jugando videojuegos, Parte 2
Cómo entrenar tu IA jugando videojuegos, Parte 3