AWS Summit 2019: participamos en la DeepRacer League

Toda la comunidad técnica esperamos cada año con cierta inquietud uno de los eventos tecnológicos que se celebran en nuestros país: el AWS Summit, un encuentro donde Amazon presenta las principales novedades en sus productos y servicios.

Pero este año, además, AWS Summit 2019 traía una novedad especial: la DeepRacer League, una competición en la que desde Paradigma ¡no nos pudimos resistir a participar!

Pero, ¿qué es la DeepRacer League y cuál fue nuestra experiencia? Hoy en el blog, te contamos cómo nos preparamos para competir en esta liga y qué aprendimos de esta divertida carrera.

Qué es DeepRacer

DeepRacer es una versión 1:18 de un vehículo real que cuenta con una cámara frontal y un ordenador de abordo, que corre una versión de Ubuntu y un software que permite traducir los outputs de una RNA a acciones que el coche puede ejecutar (por ejemplo: acelerar, frenar, girar).

Fuente

Esto le permite decidir, de forma autónoma, cuál de las posibles acciones tiene que ejecutar en base a la imagen proporcionada por la cámara y a la salida de la red neuronal que dicha imagen alimenta.

Por tanto, el objetivo final es que el DeepRacer, cargado con un modelo entrenado, sea capaz de circular autónomamente por un circuito, completándolo en el menor tiempo posible y basándose únicamente en la imagen que le llega de su cámara.

AWS nos provee con un servicio virtual donde poder entrenar y evaluar nuestro DeepRacer digital, y que luego podemos descargar sobre un modelo real en el AWS Summit para competir en la DeepRacer League.

¿Cómo funciona?

El objetivo de AWS al crear DeepRacer es acercar a desarrolladores al aprendizaje por refuerzo de una red neuronal artificial. Esta clase de aprendizaje completa los otros dos, más conocidos y usados, llamados entrenamiento supervisado y no supervisado.

El aprendizaje por refuerzo o RL (Reinforcement Learning) consiste en premiar o penalizar las acciones aleatorias que toma un agente en un estado determinado, modificando la probabilidad de las mismas en iteraciones sucesivas.

Aplicado al caso del DeepRacer, premiamos acciones que mantienen al coche en la pista, por ejemplo que se mantenga cerca de la línea central, y castigamos comportamientos que reducen la capacidad del coche para conducir eficientemente, como por ejemplo dar giros bruscos o salirse de la pista. Estas directrices se recogen en lo que se conoce como función de recompensa.

Espacio de acciones del DeepRacer

Durante el entrenamiento, la red utiliza esta función de recompensa para ajustar los pesos de la RNA, de forma que el agente (vehículo) trata de maximizar la recompensa que recibe por cada acción que toma.

La interfaz de DeepRacer esconde en realidad otros dos servicios de AWS sobre los que corre:

  • AWS Sagemaker es el encargado de realizar los entrenamientos de la red y generar la salidas.
  • AWS Robomaker genera el entorno virtual donde se entrena nuestro vehículo digital (no olvidemos que cada estado es una imagen de la cámara, por tanto, necesitamos generar una pista virtual para realizar nuestro entrenamiento).
Imagen virtual generada por Robomaker

Función de recompensa

Es la piedra angular del sistema de aprendizaje por refuerzo y ajustarla adecuadamente es clave para poder ser competitivo con el DeepRacer.

La función de recompensa recibe parámetros inferidos de la imagen de la cámara y de la situación actual del vehículo, que le permiten determinar su estado actual, tales como distancia al centro, ancho de la pista, las coordenadas del coche en el circuito, la velocidad y ángulo de giro actuales, etc.

Esta es la información que utiliza para determinar qué tiene que hacer en cada momento. El estado se actualiza con una frecuencia de 15 veces por segundo.

Paradigma es una empresa nativamente ágil, y por ello hemos generado nuestra función usando una metodología Lean: empezar por algo sencillo e ir mejorando de forma iterativa.

Esto es muy importante, ya que comenzar por una función compleja tiene el inconveniente de que no sabremos qué componentes están contribuyendo al desempeño y será difícil hacer modificaciones relevantes.

Además, la implementación de la función ha estado apoyada en tests, que nos permitían comprobar, antes de realizar el entrenamiento, que nuestra función devuelve los resultados esperados en tiempo de desarrollo.

Escribir la función de recompensa

En una primera aproximación sencilla, podemos penalizar al coche por situarse lejos del centro:

# Recompensa base
reward = 1
if distance_from_center > distance_threshold:
	reward *= 0.5</p>

Con este sencillo código, penalizamos al coche si se separa del centro más que distance_threshold.

Podemos añadir a esto una recompensa por velocidad, ya que de no hacerlo, el coche tenderá a ir despacio y permanecer en la pista porque esto le reporta recompensas altas:

if speed > speed_threshold:
	reward *= 1.5

Con estas dos simples instrucciones, ya podemos comenzar a entrenar nuestro modelo de DeepRacer. Sin embargo, esta función es muy sencilla y probablemente tendrá muchas limitaciones a la hora de que el vehículo aprenda a conducir eficientemente.

Ejemplo función de recompensa de AWS

Durante el entrenamiento del modelo, si nuestra función de recompensa es buena, podremos ver cómo crece a medida que el coche “aprende” a circular.

Función de recompensa creciente

Técnicas avanzadas

Para lograr un mejor desempeño del vehículo, agregamos diversas instrucciones avanzadas que afinan nuestra función. Algunos ejemplos son:

  • Evitar giros bruscos.
  • Evitar acercarse mucho al borde.
  • Premiar que el coche esté alineado al eje longitudinal de la pista.

Se pueden implementar muchas mejoras con la información disponible en la función de recompensa. Si vemos que la recompensa acumulada no crece con el tiempo, entonces es que nuestro modelo no está aprendiendo: ¡es momento de mejorar nuestra función!

Una vez hemos afinado la función de recompensa, puede ser que estemos teniendo problemas para que el coche continúe aprendiendo. En ocasiones podemos exprimir un poco más el sistema, tuneando un poco los hiperparámetros del modelo.

Ventana de configuración de hiperparámetros

Por ejemplo, podemos reducir el learning rate para lograr un entrenamiento más fino o jugar con la entropía para balancear cómo de aleatorias son las acciones que toma el coche.

Para entender en detalle qué hace cada uno de ellos, os recomendamos que leáis la documentación oficial de DeepRacer.

La carrera

¡Por fin! Llega el día del AWS Summit 2019 Madrid y nos disponemos a probar nuestros modelos en la pista real de DeepRacer.

Nuestro compañero Alberto Grande en AWS DeepRacer League

Tras haber corrido en el circuito un par de veces, os podemos dar un par de consejos por si alguno se anima a participar el año que viene o en otra edición del AWS Summit:

  • Hay una diferencia entre cómo se comporta el coche en el simulador respecto del circuito real. Para evitar sorpresas, lo mejor es ser genérico en la función de recompensa de forma que el coche aprenda a generalizar bien.
  • Empezad con poca velocidad e id aumentando a medida que os sintáis seguros con el coche, ya que en el circuito real se puede controlar la velocidad con una tablet.
  • Practice makes perfect: intentad participar tantas veces como podáis, mejorando el modelo entre una y otra. Los ganadores de esta edición tomaron varios turnos hasta hacer su mejor tiempo.

Nuestra experiencia

Al final, logramos un tiempo de unos 17 segundos en el simulador y de algo más de 18 en la carrera real. ¿Cómo lo logramos? Aquí van nuestros consejos:

  • Es importante comenzar por una función sencilla e ir añadiendo mejoras iterativamente para comprender si esas mejoras ayudan o no. Nosotros teníamos varias líneas distintas de modelos que íbamos mejorando poco a poco.
  • Jugar con las diferentes recompensas que producen las posibles acciones, variando la cantidad entre unas y otras para encontrar un buen equilibrio.
  • No perdáis de vista las diferentes versiones para comprender qué cosas han funcionado y cuáles no.

Algo que sin duda os recomendamos es realizar iteraciones sobre el modelo entrenado, clonándolo, y ajustar la función de recompensa y los hiperparámetros para afinar el resultado.

Esto nos permite aprovecharnos del entrenamiento previo y añadir mejoras incrementales o incluso especializar ciclos de entrenamiento para lograr objetivos específicos, por ejemplo:

  • Ciclo 1: lograr que el coche se mantenga en pista y llegue a dar vueltas completas.
  • Ciclo 2: mejorar la trazada del vehículo, haciendo que se mantenga cerca del centro de la pista y no gire bruscamente cuando no sea necesario.
  • Ciclo 3: mejorar la velocidad del vehículo.

Si tenéis algo que aportar a esto, no dudéis en dejar un comentario. ¡Suerte!

Conclusiones

DeepRacer es una forma única y divertida de acercar el reinforcement learning a desarrolladores y curiosos de todos los niveles técnicos. Hemos disfrutado mucho generando nuestras funciones de recompensa y viendo a nuestra criatura completar varias vueltas al circuito sin salirse, ¡qué orgullo!

Desde Paradigma nos mantenemos en la vanguardia en Machine Learning y Deep Learning para seguir incorporando este tipo de tecnologías en muchos de nuestros proyectos. Tenemos la suerte de tener a grandes expertos en nuestros equipos que nos permiten ofrecer a nuestros clientes lo último en tecnología.

Foto de juaniglesias

Ingeniero de telecomunicación por la UAM, mi carrera profesional ha estado muy ligada al ámbito de las telecomunicaciones en diferentes vertientes, con especial foco en la detección de fraude de bypass de llamadas. En ello he trabajado como analista de datos, preventa y liderando un pequeño equipo. Además, he desarrollado modelos predictivos para detección de fraude usando técnicas de Machine Learning.

Ver toda la actividad de Juan Iglesias

Escribe un comentario