Cómo construir tu propia IA AlphaZero usando Python y Keras

Enseñe a una máquina a aprender la estrategia Connect4 a través del juego propio y el aprendizaje profundo

En este artículo intentaré cubrir tres cosas:

  1. Dos razones por las cuales AlphaZero es un gran paso adelante para la Inteligencia Artificial
  2. Cómo puedes construir una réplica de la metodología AlphaZero para jugar al juego Connect4
  3. Cómo puedes adaptar el código para conectar otros juegos

AlphaGo → AlphaGo Zero → AlphaZero

En marzo de 2016, AlphaGo de Deepmind venció 18 veces al campeón mundial Go player Lee Sedol 4–1 en una serie vista por más de 200 millones de personas. Una máquina había aprendido una estrategia sobrehumana para jugar Go, una hazaña que antes se creía imposible, o al menos, al menos a una década de lograrse.

Partido 3 de AlphaGo vs Lee Sedol

Esto en sí mismo, fue un logro notable. Sin embargo, el 18 de octubre de 2017, DeepMind dio un salto gigante más allá.

El artículo "Dominar el juego de Go sin conocimiento humano" reveló una nueva variante del algoritmo, AlphaGo Zero, que había derrotado a AlphaGo 100-0. Increíblemente, lo hizo aprendiendo únicamente a través del juego propio, comenzando "tabula rasa" (estado en blanco) y encontrando gradualmente estrategias que superaran las encarnaciones anteriores de sí mismo. Ya no se requería una base de datos de juegos expertos humanos para construir una IA superhumana.

Un gráfico de

Apenas 48 días después, el 5 de diciembre de 2017, DeepMind lanzó otro artículo 'Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm' que muestra cómo AlphaGo Zero podría adaptarse para vencer a los programas campeones mundiales StockFish y Elmo en el ajedrez y shogi Todo el proceso de aprendizaje, desde mostrar los juegos por primera vez, hasta convertirse en el mejor programa de computadora del mundo, había llevado menos de 24 horas.

Con esto, nació AlphaZero, el algoritmo general para ser bueno en algo, rápidamente, sin ningún conocimiento previo de la estrategia experta humana.

Hay dos cosas sorprendentes sobre este logro:

1. AlphaZero requiere cero experiencia humana como entrada

No se puede exagerar lo importante que es esto. Esto significa que la metodología subyacente de AlphaGo Zero se puede aplicar a CUALQUIER juego con información perfecta (el estado del juego es completamente conocido por ambos jugadores en todo momento) porque no se requiere experiencia previa más allá de las reglas del juego.

Así fue como DeepMind pudo publicar los papeles de ajedrez y shogi solo 48 días después del papel original de AlphaGo Zero. Literalmente, todo lo que necesitaba cambiar era el archivo de entrada que describe la mecánica del juego y ajustar los hiperparámetros relacionados con la red neuronal y la búsqueda de árboles de Monte Carlo.

2. El algoritmo es ridículamente elegante.

Si AlphaZero usara algoritmos súper complejos que solo un puñado de personas en el mundo entendería, aún sería un logro increíble. Lo que lo hace extraordinario es que muchas de las ideas en el documento son en realidad mucho menos complejas que las versiones anteriores. En el fondo, se encuentra el siguiente mantra maravillosamente simple para aprender:

Juegue mentalmente a través de posibles escenarios futuros, dando prioridad a caminos prometedores, al tiempo que considera cómo es más probable que otros reaccionen a sus acciones y continúe explorando lo desconocido.
Después de alcanzar un estado que no le resulta familiar, evalúe qué tan favorable cree que es la posición y regrese la puntuación a través de posiciones anteriores en el camino mental que condujo a este punto.
Una vez que haya terminado de pensar en las posibilidades futuras, realice la acción que más ha explorado.
Al final del juego, regrese y evalúe dónde calculó mal el valor de las posiciones futuras y actualice su comprensión en consecuencia.

¿No se parece mucho a cómo aprendes a jugar? Cuando juegas un mal movimiento, es porque juzgaste mal el valor futuro de las posiciones resultantes o juzgaste mal la probabilidad de que tu oponente juegue un movimiento determinado, así que no pensaste en explorar esa posibilidad. Estos son exactamente los dos aspectos del juego que AlphaZero está capacitado para aprender.

Cómo construir tu propio AlphaZero

En primer lugar, consulte la hoja de trucos AlphaGo Zero para obtener una comprensión de alto nivel de cómo funciona AlphaGo Zero. Vale la pena tener que referirse a eso a medida que recorremos cada parte del código. También hay un gran artículo aquí que explica cómo funciona AlphaZero con más detalle.

El código

Clone este repositorio de Git, que contiene el código al que haré referencia.

Para comenzar el proceso de aprendizaje, ejecute los dos paneles superiores en el cuaderno run.ipynb Jupyter. Una vez que haya acumulado suficientes posiciones de juego para llenar su memoria, la red neuronal comenzará a entrenar. A través del auto-juego y el entrenamiento adicionales, gradualmente mejorará la predicción del valor del juego y los próximos movimientos desde cualquier posición, lo que dará como resultado una mejor toma de decisiones y un juego general más inteligente.

Ahora veremos el código con más detalle y mostraremos algunos resultados que demuestran que la IA se fortalece con el tiempo.

N.B .: Esta es mi propia comprensión de cómo funciona AlphaZero en función de la información disponible en los documentos mencionados anteriormente. Si alguno de los siguientes es incorrecto, ¡disculpas y me esforzaré por corregirlo!

Connect4

El juego que nuestro algoritmo aprenderá a jugar es Connect4 (o Four In A Row). No es tan complejo como Go ... pero todavía hay 4,531,985,219,092 posiciones de juego en total.

Connect4

Las reglas del juego son sencillas. Los jugadores se turnan para ingresar una pieza de su color en la parte superior de cualquier columna disponible. El primer jugador en obtener cuatro de su color en una fila, cada uno vertical, horizontal o diagonal, gana. Si toda la cuadrícula se llena sin que se cree un cuatro en una fila, se dibuja el juego.

Aquí hay un resumen de los archivos clave que componen la base de código:

game.py

Este archivo contiene las reglas del juego para Connect4.

A cada cuadrado se le asigna un número del 0 al 41, de la siguiente manera:

Cuadrados de acción para Connect4

El archivo game.py proporciona la lógica detrás de pasar de un estado de juego a otro, dada una acción elegida. Por ejemplo, dado el tablero vacío y la acción 38, el método takeAction devuelve un nuevo estado de juego, con la pieza del jugador inicial en la parte inferior de la columna central.

Puede reemplazar el archivo game.py con cualquier archivo de juego que se ajuste a la misma API y el algoritmo, en principio, aprenderá la estrategia a través del juego propio, en función de las reglas que le ha dado.

run.ipynb

Contiene el código que inicia el proceso de aprendizaje. Carga las reglas del juego y luego itera a través del bucle principal del algoritmo, que consta de tres etapas:

  1. Auto-juego
  2. Reentrenamiento de la red neuronal
  3. Evaluando la red neuronal

Hay dos agentes involucrados en este ciclo, el best_player y el current_player.

Best_player contiene la red neuronal con mejor rendimiento y se utiliza para generar las memorias de reproducción automática. El current_player luego vuelve a entrenar su red neuronal en estos recuerdos y luego se lanza contra el best_player. Si gana, la red neuronal dentro del best_player se cambia por la red neuronal dentro del current_player, y el bucle comienza de nuevo.

agent.py

Contiene la clase de agente (un jugador en el juego). Cada jugador se inicializa con su propia red neuronal y Monte Carlo Search Tree.

El método de simulación ejecuta el proceso de búsqueda de árbol de Monte Carlo. Específicamente, el agente se mueve a un nodo hoja del árbol, evalúa el nodo con su red neuronal y luego rellena el valor del nodo a través del árbol.

El método act repite la simulación varias veces para comprender qué movimiento desde la posición actual es más favorable. Luego devuelve la acción elegida al juego, para promulgar el movimiento.

El método de reproducción vuelve a entrenar la red neuronal, utilizando recuerdos de juegos anteriores.

model.py

Una muestra de la construcción residual de la red convolucional usando Keras

Este archivo contiene la clase Residual_CNN, que define cómo construir una instancia de la red neuronal.

Utiliza una versión condensada de la arquitectura de la red neuronal en el documento AlphaGoZero, es decir, una capa convolucional, seguida de muchas capas residuales, que luego se divide en un valor y un jefe de política.

La profundidad y el número de filtros convolucionales se pueden especificar en el archivo de configuración.

La biblioteca Keras se usa para construir la red, con un backend de Tensorflow.

Para ver filtros convolucionales individuales y capas densamente conectadas en la red neuronal, ejecute lo siguiente dentro del cuaderno run.ipynb:

current_player.model.viewLayers ()
Filtros convolucionales de la red neuronal.

MCTS.py

Contiene las clases Node, Edge y MCTS, que constituyen un Árbol de búsqueda de Monte Carlo.

La clase MCTS contiene los métodos moveToLeaf y backFill mencionados anteriormente, y las instancias de la clase Edge almacenan las estadísticas sobre cada movimiento potencial.

config.py

Aquí es donde establece los parámetros clave que influyen en el algoritmo.

El ajuste de estas variables afectará el tiempo de ejecución, la precisión de la red neuronal y el éxito general del algoritmo. Los parámetros anteriores producen un reproductor Connect4 de alta calidad, pero lleva mucho tiempo hacerlo. Para acelerar el algoritmo, pruebe los siguientes parámetros.

funcs.py

Contiene las funciones playMatches y playMatchesBetweenVersions que juegan coincidencias entre dos agentes.

Para jugar contra tu creación, ejecuta el siguiente código (también está en el cuaderno run.ipynb)

de juego de importación Juego
desde funcs import playMatchesBetweenVersions
importar registradores como lg
env = Juego ()
playMatchesBetweenVersions (
env
, 1 # el número de versión de ejecución donde se encuentra el reproductor de la computadora
, -1 # el número de versión del primer jugador (-1 para humanos)
, 12 # el número de versión del segundo jugador (-1 para humanos)
, 10 # cuantos juegos jugar
, lg.logger_tourney # donde registrar el juego
, 0 # qué jugador ir primero - 0 para aleatorio
)

initialise.py

Cuando ejecuta el algoritmo, todos los archivos de modelo y memoria se guardan en la carpeta de ejecución, en el directorio raíz.

Para reiniciar el algoritmo desde este punto de control más tarde, transfiera la carpeta de ejecución a la carpeta run_archive, adjuntando un número de ejecución al nombre de la carpeta. Luego, ingrese el número de ejecución, el número de versión del modelo y el número de versión de la memoria en el archivo initialise.py, correspondiente a la ubicación de los archivos relevantes en la carpeta run_archive. Ejecutar el algoritmo como siempre comenzará desde este punto de control.

memory.py

Una instancia de la clase Memory almacena las memorias de juegos anteriores, que el algoritmo usa para reentrenar la red neuronal del jugador actual.

pérdida.py

Este archivo contiene una función de pérdida personalizada, que oculta las predicciones de movimientos ilegales antes de pasar a la función de pérdida de entropía cruzada.

settings.py

Las ubicaciones de las carpetas run y run_archive.

loggers.py

Los archivos de registro se guardan en la carpeta de registro dentro de la carpeta de ejecución.

Para activar el registro, establezca los valores de las variables logger_disabled en False dentro de este archivo.

Ver los archivos de registro lo ayudará a comprender cómo funciona el algoritmo y a ver dentro de su "mente". Por ejemplo, aquí hay una muestra del archivo logger.mcts.

Salida del archivo logger.mcts

Del mismo modo, desde el archivo logger.tourney, puede ver las probabilidades asociadas a cada movimiento, durante la fase de evaluación:

Salida del archivo logger.tourney

Resultados

El entrenamiento durante un par de días produce el siguiente cuadro de pérdida contra el número de iteración de mini lotes:

Pérdida contra el número de iteración mini-lote

La línea superior es el error en el encabezado de la política (la entropía cruzada de las probabilidades de movimiento MCTS, contra la salida de la red neuronal). La conclusión es el error en la cabeza del valor (el error cuadrático medio entre el valor real del juego y la red neuronal predicen el valor). La línea media es un promedio de los dos.

Claramente, la red neuronal está mejorando para predecir el valor de cada estado del juego y los próximos movimientos probables. Para mostrar cómo esto se traduce en un juego cada vez más fuerte, corrí una liga entre 17 jugadores, desde la primera iteración de la red neuronal hasta la 49. Cada pareja jugó dos veces, con ambos jugadores teniendo la oportunidad de jugar primero.

Aquí están las posiciones finales:

Claramente, las versiones posteriores de la red neuronal son superiores a las versiones anteriores, ganando la mayoría de sus juegos. También parece que el aprendizaje aún no se ha saturado: con más tiempo de entrenamiento, los jugadores continuarán fortaleciéndose, aprendiendo estrategias cada vez más complejas.

Como ejemplo, una estrategia clara que la red neuronal ha favorecido con el tiempo es tomar la columna central temprano. Observe la diferencia entre la primera versión del algoritmo y diga, la versión 30:

Primera versión de la red neuronal

30a versión de red neuronal

Esta es una buena estrategia, ya que muchas líneas requieren la columna central: reclamar esto temprano asegura que su oponente no pueda aprovechar esto. Esto ha sido aprendido por la red neuronal, sin ningún aporte humano.

Aprendiendo un juego diferente

Hay un archivo game.py para un juego llamado "Metasquares" en la carpeta de juegos. Esto implica colocar marcadores X y O en una cuadrícula para intentar formar cuadrados de diferentes tamaños. Los cuadrados más grandes obtienen más puntos que los cuadrados más pequeños y el jugador con más puntos cuando la cuadrícula está llena gana.

Si cambia el archivo Connect4 game.py por el archivo Metasquares game.py, el mismo algoritmo aprenderá a jugar Metasquares en su lugar.

Resumen

Espero que encuentre útil este artículo; avíseme en los comentarios a continuación si encuentra algún error tipográfico o tiene preguntas sobre cualquier cosa en la base de código o artículo y me comunicaré con usted lo antes posible.

Si desea obtener más información sobre cómo nuestra empresa, Applied Data Science desarrolla soluciones innovadoras de ciencia de datos para empresas, no dude en ponerse en contacto a través de nuestro sitio web o directamente a través de LinkedIn.

... y si te gusta esto, no dudes en dejar unos aplausos abundantes :)

Applied Data Science es una consultora con sede en Londres que implementa soluciones de ciencia de datos de extremo a extremo para empresas, brindando un valor medible. Si está buscando hacer más con sus datos, hablemos.