21 de Noviembre de 2024 · 5 min de lectura
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.
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.
Ventajas
Desventajas
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.
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:
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.