machine-learning - redes - red neuronal recurrente
Cómo entrenar una red neuronal artificial para jugar Diablo 2 usando la entrada visual? (7)
Asumiendo que en cualquier momento podrías generar un conjunto de ''resultados'' (podría involucrar probabilidades) a partir de un conjunto de todos los ''movimientos'' posibles, y que hay cierta noción de consistencia en el juego (ej. Puedes jugar el nivel X una y otra vez de nuevo), puede comenzar con N redes neuronales con pesos aleatorios y hacer que cada uno de ellos juegue de la siguiente manera:
1) Para cada "movimiento" posible, genere una lista de posibles "resultados" (con probabilidades asociadas) 2) Para cada resultado, use su red neuronal para determinar un "valor" (puntaje) asociado del "resultado" (p. número entre -1 y 1, siendo 1 el mejor resultado posible, -1 siendo el peor) 3) Elija el ''movimiento'' que lleva al puntaje máximo de prob * 4) Si el movimiento lo llevó a ''ganar'' o ''perder'', detener, de lo contrario volver al paso 1.
Después de una cierta cantidad de tiempo (o un "ganar" / "perder"), evalúe qué tan cerca estaba la red neuronal del "objetivo" (esto probablemente implicará algún conocimiento del dominio). Luego arroje el 50% (o algún otro porcentaje) de los NN que estaban más alejados de la meta, realice un cruce / mutación del 50% superior y vuelva a ejecutar el nuevo conjunto de NN. Continúa corriendo hasta que salga un NN satisfactorio.
Actualmente estoy tratando de obtener una ANN para jugar un videojuego y esperaba obtener ayuda de la maravillosa comunidad aquí.
Me he decidido por Diablo 2. El juego se desarrolla en tiempo real y desde un punto de vista isométrico, con el jugador controlando un solo avatar con el que la cámara se centra.
Para hacer que las cosas sean más concretas, la tarea es obtener puntos de experiencia de tu personaje x sin que su nivel de vida baje a 0, donde se obtienen puntos de experiencia al matar monstruos. Aquí hay un ejemplo de la jugabilidad:
Ahora, dado que quiero que la red funcione basándose únicamente en la información que obtiene de los píxeles en la pantalla, debe aprender una representación muy rica para poder jugar de manera eficiente, ya que esto presumiblemente requeriría saber (implícitamente al menos) cómo divide el mundo del juego en objetos y cómo interactuar con ellos.
Y toda esta información debe ser enseñada a la red ... de alguna manera. No puedo, por mi vida, pensar en cómo entrenar esto. Mi única idea es tener un programa separado para extraer visualmente algo innatamente bueno / malo en el juego (por ejemplo, salud, oro, experiencia) de la pantalla, y luego usar esa estadística en un procedimiento de aprendizaje de refuerzo. Creo que eso será parte de la respuesta, pero no creo que sea suficiente; hay demasiados niveles de abstracción desde la entrada visual en bruto hasta el comportamiento orientado a los objetivos para que estos comentarios limitados entrenen una red en mi vida.
Entonces, mi pregunta: ¿qué otras formas puedes pensar de entrenar una red para hacer al menos una parte de esta tarea? preferiblemente sin hacer miles de ejemplos etiquetados ...
Solo por un poco más de dirección: estoy buscando otras fuentes de aprendizaje de refuerzo y / o cualquier método no supervisado para extraer información útil en esta configuración. O un algoritmo supervisado si puede pensar en una forma de sacar datos etiquetados de un mundo de juego sin tener que etiquetarlos manualmente.
ACTUALIZACIÓN (27/04/12):
Extrañamente, todavía estoy trabajando en esto y parece que estoy progresando. El mayor secreto para hacer funcionar un controlador ANN es utilizar las arquitecturas ANN más avanzadas apropiadas para la tarea. Por lo tanto, he estado utilizando una red de creencias profunda compuesta de máquinas restringidas condicional condicionadas de Boltzmann que he entrenado de forma no supervisada (en video de mí jugando el juego) antes de afinar con la propagación inversa de diferencia temporal (es decir, aprendizaje de refuerzo con estándar feedforward ANNs).
Todavía estoy buscando entradas más valiosas, especialmente sobre el problema de la selección de acciones en tiempo real y cómo codificar imágenes en color para el procesamiento ANN :-)
ACTUALIZACIÓN (10/21/15):
Acabo de recordar que hice esta pregunta de vuelta en el día, y pensé que debería mencionar que ya no es una idea loca. Desde mi última actualización, DeepMind publicó su documento de naturaleza sobre cómo obtener redes neuronales para jugar juegos de atari desde entradas visuales . De hecho, lo único que me impide usar su arquitectura para jugar, un subconjunto limitado, de Diablo 2 es la falta de acceso al motor del juego subyacente. Prestar a la pantalla y luego redirigirlo a la red es demasiado lento para entrenar en un tiempo razonable. Por lo tanto, probablemente no veamos este tipo de bot jugando a Diablo 2 en el corto plazo, pero solo porque jugará algo ya sea de código abierto o con acceso API al objetivo de renderizado. (¿temblor quizás?)
Como primer paso, puede ver la diferencia de cuadros consecutivos. Tienes que distinguir entre los sprites de fondo y los monstruos reales. Supongo que el mundo también puede contener animaciones. Para encontrarlos, haría que el personaje se moviera y recogiera todo lo que se mueve con el mundo en una gran imagen de fondo / animación.
Podrías detectar e identificar enemigos con correlación (usando FFT). Sin embargo, si las animaciones se repiten con exactitud de píxel, será más rápido simplemente mirar algunos valores de píxeles. Su tarea principal será escribir un sistema robusto que identificará cuándo aparecerá un nuevo objeto en la pantalla y gradualmente todos los marcos del marco de sprite a una base de datos. Probablemente también tengas que construir modelos para efectos de arma. Esos deben ser restados para que no llenen la base de datos de tu oponente.
Creo que su mejor apuesta sería una arquitectura compleja que involucre algunas redes / may: es decir, una que reconozca y responda a los elementos, una para la tienda, una para el combate (tal vez aquí necesitaría una para el reconocimiento del enemigo, una para los ataques), etc. .
Luego intenta pensar en el juego de Diablo II más simple posible, probablemente un bárbaro. Luego, al principio, manténgalo simple, como el Acto I, primero solo área.
Entonces creo que los "objetivos" valiosos serían la desaparición de objetos enemigos y la disminución de la barra de salud (anotada inversamente).
Una vez que haya tenido en cuenta estas tareas separadas y "más simples", puede usar una ANN "maestra" para decidir qué sub-ANN activar.
En cuanto a la capacitación, solo veo tres opciones: puede usar el método evolutivo descrito anteriormente, pero luego debe seleccionar manualmente los "ganadores", a menos que codifique un programa completo para eso. Podrías hacer que las redes ''miren'' a alguien jugar. Aquí aprenderán a emular el estilo de un jugador o grupo de jugadores. La red trata de predecir la siguiente acción del jugador, se refuerza para una suposición correcta, etc. Si realmente obtienes la ANN que deseas, esto podría hacerse con un videojuego, sin necesidad de un juego en vivo real. Finalmente, puedes dejar que la red juegue el juego, teniendo muertes enemigas, subiendo de nivel, recuperando la salud, etc. como refuerzo positivo y muertes de jugadores, pérdida de salud, etc. como refuerzo negativo. Pero viendo cómo incluso una red simple requiere miles de pasos de entrenamiento concretos para aprender incluso tareas simples, necesitaría mucha paciencia para esta.
En general, su proyecto es muy ambicioso. Pero, por mi parte, creo que podría ''en teoría hacerse'', dado el tiempo suficiente.
Espero que ayude y buena suerte!
El problema que persigue es insoluble en la forma en que lo ha definido. Por lo general, es un error pensar que una red neuronal aprenderá "mágicamente" una rica representación de un problema. Un buen hecho a tener en cuenta al decidir si ANN es la herramienta adecuada para una tarea es que se trata de un método de interpolación. Piense, si puede enmarcar su problema como encontrar una aproximación de una función, donde tiene muchos puntos de esta función y mucho tiempo para diseñar la red y entrenarla.
El problema que propones no pasa esta prueba. El control del juego no es una función de la imagen en la pantalla. Hay mucha información que el jugador tiene que mantener en la memoria. Para un ejemplo simple, a menudo es cierto que cada vez que ingresas a una tienda en un juego, la pantalla se ve igual. Sin embargo, lo que compras depende de las circunstancias. No importa cuán complicada sea la red, si los píxeles de la pantalla son su entrada, siempre realizaría la misma acción al ingresar a la tienda.
Además, está el problema de la escala. La tarea que propone es simplemente demasiado complicada de aprender en un período de tiempo razonable. Deberías ver a aigamedev.com para saber cómo funciona el juego AI. Las Redes Neuronales Artificiales se han utilizado con éxito en algunos juegos, pero de forma muy limitada. Game AI es difícil y, a menudo, costoso de desarrollar. Si hubiera un enfoque general para construir redes neuronales funcionales, la industria probablemente se hubiera aprovechado de ello. Recomiendo que comiences con ejemplos mucho más simples, como el tres en raya.
Parece que el corazón de este proyecto es explorar lo que es posible con una ANN, así que te sugiero que elijas un juego donde no tengas que lidiar con el procesamiento de imágenes (que a partir de las respuestas de otros aquí parece una tarea realmente difícil en juego en tiempo real). Podrías usar la API de Starcraft para construir tu bot, te dan acceso a todos los estados de juego relevantes.
Veo que está preocupado acerca de cómo entrenar la ANN, pero este proyecto esconde una complejidad de la que quizás no tenga conocimiento. Reconocimiento de objetos / caracteres en juegos de computadora a través del procesamiento de imágenes es una tarea muy desafiante (no es una locura para los juegos de FPS y RPG). No dudo de tus habilidades y tampoco digo que no se pueda hacer, pero puedes pasar 10 veces más tiempo trabajando en reconocer cosas que implementando la ANN (suponiendo que ya tienes experiencia con las técnicas de procesamiento de imágenes digitales ). )
Creo que tu idea es muy interesante y también muy ambiciosa . En este punto, es posible que desee reconsiderarlo. Siento que este proyecto es algo que estás planeando para la universidad, así que si el enfoque del trabajo es realmente ANN, probablemente deberías elegir otro juego, algo más simple.
Recuerdo que alguien más vino a buscar consejos sobre un proyecto diferente pero de alguna manera similar no hace mucho tiempo. Vale la pena echarle un vistazo.
Por otro lado, podría haber mejores enfoques para identificar objetos en el juego si estás aceptando sugerencias. Pero primero, llamemos a este proyecto por lo que quiere que sea: un bot inteligente .
Un método para implementar bots accede a la memoria del cliente del juego para encontrar información relevante, como la ubicación del personaje en la pantalla y su estado de salud. Leer la memoria de la computadora es trivial, pero averiguar exactamente en qué memoria buscar no lo es. Los escáneres de memoria como Cheat Engine pueden ser muy útiles para esto.
Otro método , que funciona bajo el juego, implica la manipulación de la información de representación. Todos los objetos del juego deben mostrarse en la pantalla. Esto significa que las ubicaciones de todos los objetos 3D eventualmente se enviarán a la tarjeta de video para su procesamiento. Prepárate para una depuración seria.
En esta respuesta, describí brevemente 2 métodos para lograr lo que desea a través del procesamiento de imágenes. Si estás interesado en ellos, puedes encontrar más sobre ellos en Exploiting Online Games (capítulo 6), un excelente libro sobre el tema.
ACTUALIZACIÓN 2017-01: el campo se está moviendo muy rápido desde el éxito de AlphaGo, y existen nuevos marcos para facilitar el desarrollo de algoritmos de aprendizaje automático en los juegos casi todos los meses. Aquí hay una lista de los últimos que he encontrado:
- Universo de OpenAI : una plataforma para jugar prácticamente cualquier juego utilizando el aprendizaje automático . La API está en Python, y ejecuta los juegos detrás de un entorno de escritorio remoto de VNC, por lo que puede capturar las imágenes de cualquier juego. ¡Probablemente puedas usar Universo para jugar Diablo II a través de un algoritmo de aprendizaje automático!
- Gimnasio OpenAI : Similar al Universo, pero apunta específicamente a los algoritmos de aprendizaje de refuerzo (por lo que es una especie de generalización del marco utilizado por AlphaGo, pero a muchos más juegos). Hay un curso sobre Udemy que cubre la aplicación del aprendizaje automático a juegos como Breakout o Doom usando OpenAI Gym.
- TorchCraft : un puente entre Torch (marco de aprendizaje automático) y StarCraft: Brood War.
- pyGTA5 : un proyecto para construir autos sin conductor en GTA5 utilizando solo capturas de pantalla (con muchos videos en línea ).
Tiempos muy emocionantes!
ACTUALIZACIÓN IMPORTANTE (2016-06): Tal como lo señala OP, este problema de entrenar redes artificiales para jugar utilizando solo entradas visuales está siendo abordado por varias instituciones serias, con resultados bastante prometedores, como DeepMind Deep-Qlearning-Network (DQN )
Y ahora, si quieres enfrentarte al desafío de siguiente nivel, puedes usar una de las varias plataformas de desarrollo de juegos de visión de IA como ViZDoom , una plataforma altamente optimizada (7000 fps) para entrenar redes para jugar Doom usando solo entradas visuales :
ViZDoom permite el desarrollo de robots de IA que reproducen Doom utilizando solo la información visual (el buffer de la pantalla). Está destinado principalmente a la investigación en el aprendizaje visual de máquina, y el aprendizaje de refuerzo profundo, en particular. ViZDoom se basa en ZDoom para proporcionar la mecánica del juego.
Y los resultados son bastante sorprendentes, ¡ mira los videos en su página web y el buen tutorial (en Python) aquí!
También hay un proyecto similar para Quake 3 Arena, llamado Quagents , que también proporciona acceso API fácil a los datos subyacentes del juego, pero puedes eliminarlo y solo usar capturas de pantalla y la API solo para controlar a tu agente.
¿Por qué es útil una plataforma como esta si solo utilizamos capturas de pantalla? Incluso si no accede a los datos subyacentes del juego, dicha plataforma proporciona:
- implementación de juegos de alto rendimiento (¡puede generar más datos / juegos / generaciones de aprendizaje con menos tiempo para que sus algoritmos de aprendizaje puedan converger más rápido!).
- una API simple y receptiva para controlar a tus agentes (es decir, si tratas de usar entradas humanas para controlar un juego, algunos de tus comandos pueden perderse, por lo que también lidiarías con la falta de fiabilidad de tus resultados ...).
- fácil configuración de escenarios personalizados .
- Representación personalizable (puede ser útil para "simplificar" las imágenes que obtiene para facilitar el procesamiento)
- Reproducción sincronizada ("giro por giro") (por lo que no es necesario que el algoritmo trabaje en tiempo real al principio, es una gran reducción de complejidad).
- características de conveniencia adicionales como la compatibilidad con plataformas cruzadas, la retrocompatibilidad (no arriesgas que tu bot no trabaje más con el juego cuando hay una nueva actualización del juego), etc.
En resumen, lo mejor de estas plataformas es que alivian gran parte de los problemas técnicos previos con los que se tuvo que lidiar (cómo manipular las entradas del juego, cómo configurar escenarios, etc.) para que simplemente tenga que lidiar con el algoritmo de aprendizaje sí mismo.
Así que ahora, ponte a trabajar y haz que seamos el mejor robot visual de IA de todos los tiempos;)
Publicación anterior que describe los problemas técnicos del desarrollo de una inteligencia artificial basada únicamente en las entradas visuales:
Contrariamente a algunos de mis colegas anteriores, no creo que este problema sea insoluble. Pero seguramente es una hella difícil!
El primer problema, como se señaló anteriormente, es el de la representación del estado del juego : no se puede representar el estado completo con una sola imagen, es necesario mantener algún tipo de memorización (salud, pero también objetos equipados y elementos disponibles). usar, misiones y objetivos, etc.). Para obtener dicha información, tiene dos formas: accediendo directamente a los datos del juego, que es el más confiable y fácil; o bien puede crear una representación abstracta de estas informaciones implementando algunos procedimientos simples (abrir inventario, tomar una captura de pantalla, extraer los datos). Por supuesto, la extracción de datos de una captura de pantalla le permitirá realizar algún procedimiento supervisado (que usted defina por completo) o no supervisado (a través de un algoritmo de aprendizaje automático, pero luego ampliará mucho la complejidad ...). Para el aprendizaje automático no supervisado, necesitará utilizar un tipo bastante reciente de algoritmos llamados algoritmos de aprendizaje estructural (que aprenden la estructura de los datos en lugar de cómo clasificarlos o predecir un valor). Uno de esos algoritmos es la Red neuronal recursiva (no confundir con la red neuronal recurrente) por Richard Socher: http://techtalks.tv/talks/54422/
Entonces, otro problema es que incluso cuando haya obtenido todos los datos que necesita, el juego solo es parcialmente observable . Por lo tanto, debes inyectar un modelo abstracto del mundo y alimentarlo con información procesada del juego, por ejemplo, la ubicación de tu avatar, pero también la ubicación de los objetos de misión, objetivos y enemigos fuera de la pantalla. Tal vez pueda buscar filtros de partículas Mixture por Vermaak 2003 para esto.
Además, necesita tener un agente autónomo , con objetivos generados dinámicamente. Una arquitectura conocida que puedes probar es el agente BDI, pero probablemente tendrás que modificarla para que esta arquitectura funcione en tu caso práctico. Como alternativa, también existe la Red de Petri Recursiva, que probablemente puede combinar con todo tipo de variaciones de las redes de Petri para lograr lo que desea, ya que es un marco muy bien estudiado y flexible, con grandes procedimientos de formalización y pruebas.
Y, por último, incluso si haces todo lo anterior, necesitarás encontrar una manera de emular el juego a velocidad acelerada (usar un video puede ser agradable, pero el problema es que tu algoritmo solo se verá sin control y podrá intentarlo por sí mismo es muy importante para aprender). De hecho, es bien sabido que el algoritmo de última generación requiere mucho más tiempo para aprender lo mismo que un ser humano puede aprender (incluso más con el aprendizaje de refuerzo), por lo tanto, si no puede acelerar el proceso ( es decir, si no puedes acelerar el tiempo de juego), tu algoritmo ni siquiera converge en una sola vida ...
Para concluir, lo que quiere lograr aquí está en el límite (y tal vez un poco más allá) de los algoritmos actuales de última generación . Creo que puede ser posible, pero incluso si lo es, vas a pasar mucho tiempo , porque esto no es un problema teórico, sino un problema práctico al que te estás acercando aquí, y por lo tanto necesitas implementar y combinar mucho. de diferentes enfoques de IA para resolverlo.
Varias décadas de investigación con todo un equipo trabajando en ello podrían no ser suficientes, así que si estás solo y trabajas en él a tiempo parcial (ya que probablemente tengas un trabajo para ganarte la vida) puedes pasar toda una vida sin llegar a ningún lado una solución de trabajo.
Así que mi consejo más importante aquí sería que bajes tus expectativas y trates de reducir la complejidad de tu problema utilizando toda la información que puedas, y evita tanto como sea posible confiando en capturas de pantalla (es decir, intenta conectarlo directamente al juego, busque inyección de DLL) y simplifique algunos problemas implementando procedimientos supervisados, no permita que su algoritmo aprenda todo (es decir, deje de procesar imágenes por ahora tanto como sea posible y confíe en la información interna del juego, más adelante si su algoritmo funciona bien , puede reemplazar algunas partes de su programa de IA con procesamiento de imágenes, logrando así su objetivo completo, por ejemplo, si puede hacer que algo funcione bien, puede tratar de complejizar su problema y reemplazar los procedimientos supervisados y los datos del juego de memoria sin supervisión. algoritmos de aprendizaje automático en capturas de pantalla).
¡Buena suerte, y si funciona, asegúrese de publicar un artículo, seguramente puede ser reconocido por resolver un problema práctico tan difícil!