9

Decidí ir con una red neuronal para crear comportamientos para un motor de animación que tengo. La red neuronal tiene 3 vectores3 y 1 ángulo de Euler para cada parte del cuerpo que tengo. El primer vector3 es la posición, el segundo es su velocidad, y el tercero es su velocidad angular. El ángulo de Euler es en qué rotación está la parte del cuerpo. y tengo 7 partes del cuerpo Cada uno de esos tipos de datos tiene 3 flotantes. 7 * 4 * 3 = 84, entonces tengo 84 entradas para mi red neuronal. Las salidas están mapeadas a los músculos del personaje. Proporcionan la cantidad de fuerza para aplicar a cada músculo, y hay 15 de ellos.Tamaño de red neuronal para el sistema de animación

Estoy ejecutando 15 redes simultáneamente durante 10 segundos, calificando su estado físico calculando el menor consumo de energía, teniendo la menor cantidad de movimientos zyx, y si las partes del cuerpo están en la posición y correcta en comparación con el resto (hips.y> upperleg.y, upperleg.y> lowerleg.y etc.), y luego ejecutarlos a través de un algoritmo genético. Estaba ejecutando una red neuronal de 168 neuronas por capa oculta, con 8 capas ocultas. Intento que el personaje se ponga de pie y no se mueva demasiado. Ejecuté esto por 3000 generaciones y ni siquiera me acerqué.

La red neuronal y el algoritmo genético son versiones C# de this tutorial. Cambié el método de cruce de un punto a fusión.

Tengo 84 entradas y 15 salidas. ¿Qué tan grande debe ser mi red neuronal?

Respuesta

5

El problema que quiere resolver es bastante complicado, dudo que cualquier GA "vanilla" (especialmente que use una arquitectura fija para las redes) lo resuelva (en un tiempo razonable). Tampoco creo que alguna vez encuentres el "número correcto de neuronas" en la capa oculta.

Sin embargo, si está dispuesto a pasar un tiempo en él, eche un vistazo a HyperNEAT for Locomotion Control in Modular Robots que trata con más o menos el mismo problema. Utilizan una técnica de GA bastante avanzada llamada HyperNEAT e informan algunos buenos resultados.

HyperNEAT está construido sobre NEAT (Neuroevolution of augmenting topologies). NEAT puede evolucionar no solo los pesos de las RNA, sino también su estructura. Comienza con redes simples y lentamente las hace más complejas hasta que alcances tu objetivo (o te rindas).

Luego NEAT está ligeramente alterado, para poder usar varias funciones de activación. Le permitirá producir una amplia variedad de "patrones" cuando se aplica a un conjunto de puntos, p.en un sistema de coordenadas. Los patrones pueden tener algunos rasgos interesantes, como la simetría perfecta/imperfecta o pueden ser periódicos. Esta variante se llama Compositional pattern-producing network o CPPN. Una aplicación espectacular de esta tecnología es PicBreeder donde las redes se usan para "dibujar" imágenes.

En HyperNEAT, las CPPN se utilizan para crear otras ANN. La capa oculta de las nuevas redes está representada por un llamado sustrato, que se puede imaginar como si las neuronas de la capa se pusieran en un sistema de coordenadas 2D/3D. Luego, para cada posible par de neuronas (todas desde la capa de entrada hasta todas las ocultas, desde todas las salidas ocultas), el CPPN se usa para determinar el peso. Así pues, tenemos una codificación indirecta, que

  • en sí mismo es pequeña
  • pueden producir grandes redes arbitrarias al final
  • que también pueden mostrar un comportamiento bastante complejo
  • patrones que se muestran en la realidad/naturaleza (nuevamente, simetría, comportamiento periódico) puede surgir con relativa facilidad. Tenga en cuenta que para la animación/locomoción efectiva ambos son muy ventajosos (si no es obligatorio).

En total, le daría la oportunidad de resolver su problema complejo.

Como puedes ver, hay varias capas de esta técnica, por lo que implementarla por tu cuenta no es tan fácil. Afortunadamente, hay algunas buenas implementaciones, puede encontrarlas en NEAT home page, junto con muchos otros documentos, documentos y tutoriales.

+0

No me gusta su respuesta, pero parece ser cierto. Gracias por los avisos. Tengo curiosidad después de mirar a través de la literatura. La diferencia entre NEAT e HyperNEAT es la CPPN, ¿correcto? ¿El CPPN puede crear redes neuronales, pero no es una red neuronal? ¿O es una red neuronal que evoluciona y luego crea otras redes neuronales? Muy útil, gracias. – DrSammyD

+0

NEAT utiliza una codificación directa, lo que significa que para cada neurona y conexión en el genoma tendrá lo mismo en la red final. HyperNEAT usa codificación indirecta. El genoma es una red (la CPPN evolucionó con NEAT) que, cuando se aplica en pares de neuronas del sustrato (~ neuronas de la segunda red + algo más de información, generalmente sus coordenadas en un sistema de coordenadas 2D/3D), producirá los pesos de conexión Creo que técnicamente el CPPN también es un NN, pero puede usar funciones de activación sofisticadas, en lugar del sigmoid/tanh habitual. Sin embargo, podría haber algunas otras pequeñas diferencias. –

0

¿Se puede simplificar hasta las necesidades básicas? Tener un pie y una espinilla, y eso es todo; dos partes del cuerpo, dos ángulos, y haz que se levante.

0

¡Un enfoque interesante! He estado pensando en algo similar por un tiempo, me encantaría escuchar los resultados que obtienes.

Tendrás que probar, pero supongo que tienes demasiadas capas ocultas. Creo que esta aplicación podría funcionar con uno o dos como máximo.

También debe consultar su función de aptitud: sospecho que podría ser "demasiado difícil" proporcionar aprendizaje, en el sentido de que al principio no tiene ninguna posibilidad de levantarse. Por lo tanto, el "mínimo local" en el que caes es aprender a caer con el menor esfuerzo. No es muy útil. En general, las GA sufren de mínimos locales bastante.

Para mejorar su función de acondicionamiento físico, intentaría algo así como penalizar la desviación de la posición vertical en cada cuadro. Esto otorgará algo de crédito a las soluciones que administran el saldo parcial, por lo que debe haber una ruta de mejora. No me molestaría en el uso de la energía hasta que hayas equilibrado.

+0

En realidad, me deshice de la métrica en pie, y solo me enfoqué en minimizar la energía y permanecer en una ubicación x z. Incluso eso no está funcionando en menos de 30 generaciones. – DrSammyD

+0

Es posible que algo esté mal con mi algoritmo genético. – DrSammyD

+0

Fue algo malo con la forma en que estaba calculando la condición física. Ha empezado a trabajar para la baja energía y permanecer en una ubicación x z. Te dejo saber cómo va con la situación. – DrSammyD

Cuestiones relacionadas