Si has estado siguiendo estos posts sabrás que soy de fan de Python con Keras. Keras es una biblioteca Python súper poderosa y fácil de usar para construir redes neuronales y redes de aprendizaje profundo. En el resto de esta entrada del blog, voy a demostrar cómo construir una red neuronal simple usando Python y Keras, y luego aplicarla a la tarea de clasificación de imágenes.

Conectar4

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.

Conectar4

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 sus colores en una fila, cada uno verticalmente, horizontalmente o diagonalmente, gana. Si toda la cuadrícula se llena sin crear cuatro en fila, se dibuja el juego.

Aquí hay un resumen de los archivos clave que forman 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 de 0 a 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 tomar acción El método 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, en principio, el algoritmo aprenderá la estrategia a través del juego propio, de acuerdo con las reglas que le haya dado.

run.ipynb

Este contiene el código que inicia el proceso de aprendizaje. Carga las reglas del juego y luego recorre el bucle principal del algoritmo, que consta de tres etapas:

  1. Juego propio
  2. Reentrenamiento de la red neuronal
  3. Evaluando la red neuronal

Hay dos agentes involucrados en este bucle, el mejor jugador y el jugador_actual.

El best_player contiene la red neuronal de 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 de best_player se cambia por la red neuronal dentro de current_player, y el bucle comienza de nuevo.

agente.py

Esto contiene la clase de agente (un jugador en el juego). Cada jugador se inicializa con su propia red neuronal y el Árbol de búsqueda de Monte Carlo.

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

los acto El método 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 ejecutar el movimiento.

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

model.py

Una muestra de la red residual convolucional construida con 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 red neuronal en el papel AlphaGoZero, es decir, una capa convolucional, seguida de muchas capas residuales, que luego se divide en un valor y una cabeza 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 utiliza 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 el moveToLeaf y rellenar los métodos mencionados anteriormente, y las instancias de la clase Edge almacenan las estadísticas sobre cada movimiento potencial.

config.py

Aquí es donde se configuran 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 tardan mucho tiempo en hacerlo. Para acelerar el algoritmo, pruebe los siguientes parámetros en su lugar.

funciones.py

Contiene el playMatches y playMatchesBetweenVersions Funciones que juegan partidos entre dos agentes.

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

from game import Game
desde funcs import playMatchesBetweenVersions
importar loggers como lg
env = Juego ()
playMatchesBetweenVersions (
env
, 1 # el número de versión de ejecución donde se encuentra el reproductor de 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 # dónde registrar el juego
, 0 # a qué jugador ir primero - 0 para azar
)

inicializar.py

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

Para reiniciar el algoritmo desde este punto de control más adelante, 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 la versión de la memoria en el archivo initialise.py, correspondiente a la ubicación de los archivos relevantes en la carpeta run_archive. La ejecución del algoritmo como de costumbre comenzará a partir de este punto de control.

memory.py

Una instancia de la clase de memoria almacena las memorias de juegos anteriores, que el algoritmo utiliza para volver a entrenar la red neuronal del current_player.

pérdida.py

Este archivo contiene una función de pérdida personalizada, que enmascara 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 el Iniciar sesión carpeta 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 te ayudará a entender cómo funciona el algoritmo y ver dentro de su “mente”. Por ejemplo, aquí hay una muestra del archivo logger.mcts.

Salida del archivo logger.mcts

Igualmente, desde el archivo logger.tourney, puede ver las probabilidades adjuntas a cada movimiento, durante la fase de evaluación:

Salida del archivo logger.tourney

Resultados

La capacitación 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 de mini lotes

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 línea inferior es el error en la cabecera del valor (el error cuadrático medio entre el valor real del juego y la predicción de la red neuronal del valor). La línea media es un promedio de los dos.

Claramente, la red neuronal está mejorando en 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, y ambos jugadores tuvieron 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 seguirán fortaleciéndose, aprendiendo estrategias más complejas y más intrincadas.

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

Primera versión de la red neuronal

Versión 30 de red neuronal

Esta es una buena estrategia, ya que muchas líneas requieren la columna central: afirmar esto temprano asegura que su oponente no puede aprovecharse de esto. Esto ha sido aprendido por la red neuronal, sin ninguna intervención humana.

Aprendiendo un juego diferente

Hay un archivo game.py para un juego llamado ‘Metasquares’ en el juegos carpeta. Esto implica colocar marcadores X y O en una cuadrícula para tratar de formar cuadrados de diferentes tamaños. Las casillas más grandes anotan más puntos que las casillas más pequeñas y el jugador con más puntos cuando la cuadrícula está llena gana.

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

Resumen

Esperamos que encuentre útil este artículo; avíseme en los comentarios a continuación si encuentra algún error tipográfico o si tiene preguntas sobre algo en la base de código o en el artículo y le responderé lo antes posible.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *