← Volver a proyectos

Egoist

Bot de Rocket League 1v1 entrenado desde cero con aprendizaje por refuerzo.

En entrenamiento activo
Python 3.11PyTorch (CUDA)RLGym v2RocketSimPPORLBot

Egoist es un bot de Rocket League 1v1 entrenado desde cero con aprendizaje por refuerzo: PPO sobre el simulador RocketSim a través de RLGym v2, corriendo en una sola máquina de escritorio. Esta bitácora documenta el pipeline de entrenamiento, evaluación y despliegue en el juego real, además de cada experimento y lo que salió mal por el camino, sin pulir los resultados.

No hay demo jugable pública todavía. El bot corre localmente vía RLBot.

1.100 millones de pasos: la entropía cede y el pool de oponentes está listo

Estado actual

Pasos de entrenamiento1,100 millones y subiendo (run hacia 1,500 M en curso)
Champion actualchampion_1099200556
Último resultado179 victorias / 21 derrotas en 200 partidas contra el champion anterior
Entropía de la política3.94 (máximo teórico 4.50); empezó en 4.42
Velocidad de entrenamiento~12.000 pasos/s con 20 workers, i7-12700H + RTX 8 GB
Nivel de juegopersigue, tira y defiende con criterio; todavía muy lejos de un humano bueno

Lo siguiente en la cola, ya construido y probado: pool de oponentes (25% de los episodios contra champions anteriores congelados) y estados de arranque variados (40% kickoff, 45% estados reales de replays de profesionales, 15% física aleatoria) para que aparezcan aéreos, saves y recoveries sin programarlos a mano.

Cómo funciona

  • Entorno: RLGym 2.0 + RocketSim 2.2, 1v1, observación DefaultObs de 92 valores, 90 acciones discretas (LookupTableAction), una decisión cada 8 ticks (15 por segundo).
  • Recompensas: gol +10, gol en contra −10, toque 0.2, velocidad hacia el balón 0.05, velocidad del balón hacia la portería 0.18. Nada específico para saltos ni mecánicas: las mecánicas deben emerger, no programarse.
  • Aprendizaje: PPO (rlgym-ppo, fork vendorizado con una corrección en el cálculo de ventajas GAE), red 512×512, coeficiente de entropía 0.003, self-play.
  • Evaluación: partidas entre checkpoints congelados identificados por SHA-256, promoción a champion solo con victoria significativa en 100-200 partidas; auditoría de saltos reproducible; comparación contra replays de profesionales.
  • Juego real: el bot corre en RLBot con la misma observación reconstruida desde el paquete del juego, muestreo estocástico y sincronía por ticks de física.

La corrección de GAE mencionada arriba es sobre esto. La ventaja de una transición se calcula acumulando residuos de diferencia temporal:

δt=rt+γV(st+1)−V(st),A^t=∑l=0∞(γλ)l δt+l\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t), \qquad \hat A_t = \sum_{l=0}^{\infty} (\gamma\lambda)^l\, \delta_{t+l}

El bug estaba en cómo se conseguía V(st+1)V(s_{t+1}): en vez del valor del estado que realmente sigue a cada transición, el backend original tomaba el valor de la transición siguiente en el buffer, que en un buffer con muchos episodios pegados casi nunca es el mismo estado.

Lo aprendido, en tres líneas

  1. Recortar la recompensa de toque no quita los saltos: costó 100 M de pasos sin ganar nada y el bot tocaba el balón un 25% menos. Revertido.
  2. El coeficiente de entropía era el freno: bajarlo de 0.01 a 0.003 hizo que la política se comprometiera en 100 M de pasos, con la mitad de saltos, el triple de tiempo en el suelo y 179-21 contra el champion anterior.
  3. Windows 11 manda el entrenamiento a los E-cores cuando hay una app en primer plano: fijar los procesos a los P-cores multiplicó la velocidad por 2.5. Ahora es automático.

Comparado contra 19 replays profesionales de RLCS (~368 M de pasos del bot en esa comparación), Egoist está en 10-15% de los toques y goles por segundo de un humano, pero 25-33% de su velocidad de auto/balón. Se mueve con energía real, pero convierte eso en contacto y goles muchas menos veces. Esto motivó subir el peso de ball_velocity_to_goal en el próximo hito de 500 M de pasos.