Aprende Aprendizaje por Refuerzo jugando a Doom

21 de Noviembre de 2024 · 5 min de lectura

IMG_3797

Introducción

En la edición PyConES 24 celebrada en Vigo, Nagarro presentó una charla sobre ViZDoom, una plataforma que combina el clásico videojuego Doom con el aprendizaje automático y la inteligencia artificial.

En este artículo, se verá cómo ViZDoom permite a desarrolladores e investigadores entrenar agentes inteligentes en entornos complejos y realistas, utilizando técnicas de aprendizaje por refuerzo y otras metodologías de IA. El objetivo es dar a conocer la aplicación y animar al lector a experimentar con ella.

¿Qué es ViZDoom?

ViZDoom es una plataforma de simulación que utiliza el videojuego Doom como entorno para el desarrollo y entrenamiento de agentes de inteligencia artificial. Creado como un entorno de aprendizaje basado en refuerzo (Reinforcement Learning), ViZDoom ofrece un espacio interactivo y visualmente complejo donde los algoritmos de IA pueden aprender a tomar decisiones estratégicas, navegar entornos tridimensionales, y competir contra otros agentes usando información visual, es decir, únicamente a partir de los fotogramas del buffer de imágenes, sin conocer el valor de las variables del juego.

Gracias a su integración con Python y bibliotecas como TensorFlow y PyTorch, ViZDoom es una herramienta accesible tanto para investigadores como para desarrolladores. Combina lo mejor de los videojuegos y la IA, convirtiéndose en una plataforma ideal para experimentar y avanzar en el campo de la inteligencia artificial aplicada.

ViZDoom está basado en ZDoom, el source-port más popular y moderno de Doom. Esto significa que tiene compatibilidad con una enorme gama de herramientas y recursos que se pueden utilizar para crear escenarios personalizados, disponibilidad de documentación detallada del motor y las herramientas y el apoyo de la comunidad Doom.

Características principales

Ventajas

  • Fácil configuración y personalización: Proporciona un entorno rápido y accesible para la experimentación sin necesidad de desarrollar un motor gráfico desde cero. También permite personalizar los escenarios.
  • Interfaz intuitiva: Incluye APIs para lenguajes populares como Python y C++, facilitando su integración con bibliotecas de aprendizaje profundo como TensorFlow o PyTorch.
  • Comunidad activa: Cuenta con una base de usuarios que comparten escenarios, scripts y resultados, enriqueciendo el ecosistema. También se han organizado competiciones a nivel mundial.
  • Open Source y Farama Foundation: En 2022 ViZDoom se unió a la Farama Foundation, lo que hace que el proyecto cumpla unos requisitos mínimos y tenga mantenimiento.
  • Multiplataforma: Compatible en Linux, MacOS y Windows.
  • Rápido y ligero: Pesa unos pocos MB y no es necesario un hardware potente para ejecutarlo.

Desventajas

  • Coste computacional alto para la fase de entrenamiento: Si no se tiene el hardware adecuado, el entrenamiento de modelos complejos puede ser largo, especialmente en tareas que involucren redes neuronales profundas.
  • Competencia más actualizada: Herramientas como Unity ML-Agents ofrecen entornos más versátiles y gráficos modernos.

Crea y juega con tu agente

El repositorio incluye varios ejemplos de algoritmos que pueden usarse para entrenar y ejecutar agentes, se encuentran en la carpeta examples/.

Pero, lo más interesante es crear un agente desde cero. En este caso se usará el algoritmo de Reinforcement Learning Proximal Policy Optimization (PPO) y la librería gymnasium para la comunicación entre el algoritmo y el entorno. A continuación se detallan los pasos principales a seguir:

Paso 1: Se crea la función que montará el entorno del agente.

# Función de creación del entorno
def create_env():
    env = gymnasium.make('VizdoomBasic-v0')
    env.unwrapped.game.set_doom_game_path("../scenarios/doom2.wad")
    # Se quita la ventana durante el entrenamiento para ahorrar recursos
    env.unwrapped.game.set_window_visible(False)
    env.unwrapped.game.add_game_args("+vid_forcesurface 1")
    return env

Paso 2: Usando la función anterior, se crean dos entornos, el primero para el entrenamiento y el otro para la fase de evaluación:

training_env = make_vec_env(
    create_env,
    n_envs=1,
)
eval_env = make_vec_env(
    create_env,
    n_envs=1,
)

Paso 3: Se crea el agente usando el algoritmo PPO:

def create_agent(env, **kwargs):
    return PPO(
        policy=policies.ActorCriticCnnPolicy,
        env=env,
        n_steps=4096,
        batch_size=32,
        learning_rate=1e-4,
        tensorboard_log="logs/tensorboard",
        verbose=0,
        **kwargs
    )

agent = create_agent(training_env)

Paso 4: Se configura la evaluación de callback que revisará periódicamente el rendimiento del agente durante el entrenamiento y guardará el mejor modelo encontrado hasta ese momento. El agente será evaluado durante 10 episodios completos cada 5000 timesteps.

evaluation_callback = callbacks.EvalCallback(
    eval_env,
    n_eval_episodes=10,
    eval_freq=5000,
    log_path="logs/evaluations/basic",
    best_model_save_path="logs/models/basic",
)

Un episodio es una secuencia completa de interacciones desde un estado inicial hasta un estado terminal en el entorno, y un timestep representa un paso en el que el agente observa, toma una acción y recibe una recompensa.

Paso 5: Último paso, ¡a entrenar!

agent.learn(
    total_timesteps=40000,
    tb_log_name="ppo_basic",
    callback=evaluation_callback
)

Nota: Estos pasos se han simplificado con el objetivo de no sobrecargar el artículo. El código completo puede verse en este enlace.

Resultados

A continuación se muestran algunos resultados de los agentes generados:

Ejemplo 1: El primer ejemplo funciona bastante bien, identificando al enemigo y moviéndose hasta estar delante de él para dispararle. También es el escenario más sencillo:

Ejemplo 2: En un mapa abierto el agente se sitúa en el centro y gira 360º mientras dispara a los enemigos del campo de visión:

En Machine Learning, entrenar un modelo de forma prolongada no garantiza una mejora continua en su desempeño, ya que este puede alcanzar un límite máximo (performance ceiling). Este caso es particularmente interesante porque dicho límite puede observarse visualmente: El agente empieza a perder vida cuando se queda sin balas, ya que recargar no es una acción considerada dentro de su conjunto de decisiones.

Ejemplo 3: Este último necesita ajustar los parámetros del modelo PPO o considerar otro algoritmo ya que solo es capaz de disparar al enemigo de la izquierda sin tener en cuenta el de la derecha:

Conclusión

ViZDoom es una excelente iniciativa para quienes desean experimentar en la intersección de los videojuegos y la inteligencia artificial. Su plataforma ofrece varios modos para entrenar agentes, lo que permite adaptar el aprendizaje a diferentes escenarios y niveles de complejidad.

Una de las características más destacadas es la capacidad de entrenar agentes utilizando entradas visuales, emulando así la forma en que los humanos percibimos nuestro entorno. Esto no solo enriquece el proceso de aprendizaje, sino que también proporciona resultados más realistas y aplicables a situaciones del mundo real.

Además, al contribuir con la comunidad de ViZDoom, los desarrolladores e investigadores tienen la oportunidad de mejorar y ampliar esta herramienta, fomentando la colaboración y el avance colectivo en el campo del aprendizaje automático. Participar en este proyecto es una manera efectiva de impulsar la innovación y apoyar a otros en sus esfuerzos por explorar nuevas fronteras tecnológicas.

Enlaces de interés

Comparte este artículo
Etiquetas
Artículos recientes