Una vez, explorando las profundidades de Internet, me topé con un video donde una persona entrena a una serpiente usando un algoritmo genético. Y yo quería lo mismo. Pero solo tomar lo mismo y escribir en Python no sería interesante. Y decidí utilizar un enfoque más moderno para la formación de sistemas de agentes, a saber, Q-network. Pero comencemos desde el principio.
Entrenamiento de refuerzo
En el aprendizaje automático, RL (aprendizaje por refuerzo) es bastante diferente de otras áreas. La diferencia es que el algoritmo ML clásico ya está entrenado en los datos terminados, mientras que el RL, por así decirlo, crea estos datos por sí mismo. La idea de RL es que, además del algoritmo en sí, que se llama agente, existe un entorno en el que se coloca este agente. En cada etapa, el agente debe realizar alguna acción (acción), y el entorno responde con una recompensa (recompensa) y su estado (estado), en función del cual el agente realiza la acción.
Dqn
Debería haber una explicación de cómo funciona el algoritmo, pero dejaré un enlace a donde las personas inteligentes lo explican.
Implementación de serpiente
Después de descubrir c rl, necesitamos crear un entorno en el que ubicaremos al agente. Afortunadamente, no hay necesidad de reinventar la rueda, ya que una empresa como open-ai ya ha escrito la biblioteca del gimnasio, con la que puede escribir su propio entorno. En la biblioteca ya están en grandes números. Desde simples juegos de atari hasta complejos modelos 3d. Pero entre todo esto no hay serpiente. Por lo tanto, procedemos a su creación.
No describiré todos los momentos de crear un ambiente en el gimnasio, pero mostraré solo la clase principal, en la que se requiere implementar varias funciones.
import gym class Env(gym.Env): def __init__(self): pass def step(self, action): """ . , """ def reset(self): """ """ def render(self, mode='human'): """ """
Pero para implementar estas funciones, necesitamos crear un sistema de recompensas y de qué forma daremos información sobre el medio ambiente.
Condición
En el video, un hombre le dio a la serpiente la distancia a la pared, la serpiente y la manzana en 8 direcciones. Esos son 24 números. Decidí reducir la cantidad de datos, pero complicarlos un poco. Primero, combinaré la distancia a las paredes con la distancia a la serpiente. En pocas palabras, le diremos la distancia al objeto más cercano que puede matar en una colisión. En segundo lugar, solo habrá 3 direcciones y dependerán de la dirección del movimiento de la serpiente. Por ejemplo, al comenzar, la serpiente mira hacia arriba, por lo que le diremos la distancia a las paredes superior, izquierda y derecha. Pero cuando la cabeza de la serpiente gira hacia la derecha, entonces ya informaremos la distancia a las paredes derecha, superior e inferior. En aras de la simplicidad, daré una imagen.

También decidí jugar con la manzana. Presentaremos información al respecto en forma de coordenadas (x, y) en el sistema de coordenadas, que se origina en la cabeza de la serpiente. El sistema de coordenadas también cambiará su orientación detrás de la cabeza de la serpiente. Después de la imagen, creo que definitivamente debería quedar claro.

Recompensa
Si puede encontrar algún tipo de características con el estado y esperar que la red neuronal lo resuelva, con el premio todo será más complicado. Depende de ella si el agente aprenderá y si él aprenderá lo que queremos.
Daré inmediatamente el sistema de recompensas con el que he logrado un entrenamiento estable.
- En cada paso, la recompensa es -0.25.
- Al morir -10.
- A la muerte, hasta 15 pasos -100.
- Al comer una manzana cuadrada ( número de manzanas consumidas ) * 3.5.
Y también dé ejemplos de lo que conduce a un mal sistema de recompensa.
- Si no das una recompensa lo suficientemente pequeña por la muerte en los primeros pasos, entonces la serpiente preferirá matar contra la pared. Es más fácil que buscar manzanas :)
- Si das una recompensa positiva por los pasos, la serpiente comenzará a girar sin cesar. Porque en su opinión será más rentable que buscar manzanas.
- Y muchos otros casos donde la serpiente simplemente no aprenderá.
Bueno, un ejemplo de lo que la serpiente aprendió en 2000 episodios. Resumen
El principal interés en escribir la serpiente era ver cómo aprende la serpiente al saber tan poco sobre su entorno. Y estudió bien, ya que la tasa promedio de manzanas consumidas llegó a 23, lo que, a mi parecer, no es muy malo. Por lo tanto, el experimento puede considerarse exitoso.
Código fuente