16 - Práctica 4: Diferencia Temporal con OpenAI Gym y Python

Lección 16 del curso Aprendizaje por Refuerzo Nivel Intermedio.

Introducción

En esta última sección hemos visto los diferentes algoritmos de Diferencia Temporal para la evaluación y optimización de una política: la [predicción con Diferencia Temporal] y los algoritmos de control SARSA y Q-learning.

Así que ya estamos listos para poner en práctica todo lo aprendido hasta el momento. Entonces en esta cuarta y última práctica del curso entrenaremos un agente para que emule la toma de decisiones de un taxista que debe recoger un pasajero y llevarlo a un destino dentro de un pequeño tablero de juego.

Con esta práctica veremos entonces cómo usar los algoritmos de diferencia temporal con OpenAI Gym y Python para resolver un problema de aprendizaje por refuerzo.

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

El juego del taxi

Este juego ha sido tomado del ejemplo propuesto por Dietterich (2008) en su artículo Hierarchical Reinforcement Learning with the MAXQ Value Function Decomposition y que corresponde a un entorno ya implementado en OpenAI Gym.

Características del entorno

El taxi (agente) debe ir a la ubicación del pasajero (“origen”), recogerlo y dejarlo en el “destino”. El episodio culmina cuando el taxi deja al pasajero en este “destino”.

En total se tendrán 500 posibles estados: 25 casillas x 5 posibles ubicaciones del pasajero (R, G, Y, B o dentro del taxi) x 4 posibles destinos (R, G, Y o B).

Objetivo de la práctica

Entrenar al agente (es decir encontrar la política) de forma tal que se obtenga el máximo retorno posible en cada episodio.

El entorno

Al igual que en las prácticas anteriores, usaremos el módulo gym de Python para importar OpenAI Gym, crear el entorno y generar las diferentes interacciones.

Funciones auxiliares

Usaremos inicialmente el algoritmo de control SARSA visto anteriormente.

Antes de realizar la implementación, necesitamos dos funciones auxiliares:

Control con SARSA

Ahora sí entrenemos el agente con el algoritmo de control SARSA. Para ello usaremos la función sarsa, definiendo inicialmente los hiperparámetros sin un criterio en particular.

Al analizar la curva de entrenamiento tenemos el comportamiento esperado: a mayor cantidad de interacciones mejoraremos progresivamente el retorno obtenido por el agente.

Pero ¿será que podemos mejorar este desempeño? La respuesta es sí, y para esto debemos realizar un ajuste de los hiperparámetros.

Ajuste de hiper-parámetros

Este ajuste se debe hacer de forma sistemática, es decir modificando sólo uno de ellos, dejando los demás fijos, y observando si mejora/empeora el entrenamiento.

Una vez afinados estos hiper-parámetros re-entrenamos el agente obteniendo la función Q asociada a este algoritmo SARSA.

Control con Q-learning

Seguiremos la misma lógica usada para el control con SARSA para llevar a cabo el entrenamiento de nuestro agente usando el algoritmo Q-learning.

En este caso usaremos la funcion q_learning que implementa este algoritmo.

Y de nuevo, al igual que con SARSA, en este caso debemos hacer un ajuste de hiper-parámetros para re-entrenar posteriormente al Agente.

Control SARSA vs. Q-learning

Ahora sí, con el agente entrenado usando los dos métodos, intentemos ver cuál de ellos tiene el mejor desempeño.

Para ello podemos simplemente graficar las curvas de entrenamiento obtenidas en cada caso.

Vemos que la convergencia de Q-learning es significativamente más rápida que SARSA: en la iteración 1.000 (aprox.) ya se estabiliza el primero y su retorno ya es positivo, mientras que para esa misma iteración SARSA aún no se estabiliza (de hecho en la iteración 4.000 su retorno sigue siendo negativo en ocasiones).

Esto confirma que Q-learning permite entrenar el agente de forma adecuada y con un menor número de iteraciones en comparación con SARSA.

Contenido exclusivo suscriptores

Recuerda suscribirte para acceder al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusión

¡Te felicito por haber completado este curso de Aprendizaje por Refuerzo Nivel Intermedio!

En esta última práctica hemos visto de forma aplicada los métodos de Diferencia Temporal, la tercera familia de algoritmos clásicos del Aprendizaje por Refuerzo.

Como lo mencionamos al comienzo de la sección, esta familia ha marcado un hito importante en el Aprendizaje por Refuerzo y es la precursora de algoritmos más sofisticados que se usan actualmente y que veremos en próximos cursos.

A lo largo del curso hemos visto todos los conceptos asociados a las tres principales familias de algoritmos del Aprendizaje por Refuerzo clásico: la Programación Dinámica, los métodos de Monte Carlo y el Aprendizaje por Diferencia Temporal.

Y también hemos puesto en práctica estos conceptos para resolver diferentes problemas básicos de Aprendizaje por Refuerzo, usando Python y en particular la librería OpenAI Gym.

Además, los algoritmos que acabamos de ver son la base de métodos más sofisticados que permiten entrenar un agente en situaciones donde tengamos muchos más estados y acciones que en los ejemplos vistos hasta el momento; y estos métodos serán precisamente el tema del próximo curso de “Aprendizaje por Refuerzo Nivel Avanzado”.

Te invito entonces a evaluar el curso en el enlace que encontrarás en la descripción de este video, y también te invito a dejar tus comentarios y sugerencias para seguir mejorando el contenido de la Academia.

¡Así que te envío un saludo y nos vemos en el próximo curso!

Ver todas las lecciones de este curso