Estoy intentando programar mi propio sistema para ejecutar una red neuronal. Para reducir la cantidad de nodos necesarios, se sugirió que tratara las rotaciones de la entrada por igual.
Mi red tiene como objetivo aprender y predecir el Juego de la vida de Conway al observar cada cuadro y sus cuadrados circundantes en una cuadrícula, y dar la salida para ese cuadrado. Su entrada es una cadena de 9 bits:
Lo anterior se representa como 010 001 111.
Sin embargo, hay otras tres rotaciones de esta forma, y todas producen la misma salida:
Mi topología de red es de 9 nodos de entrada y 1 nodo de salida para el siguiente estado del cuadrado central en la entrada. ¿Cómo puedo construir la (s) capa (s) oculta (s) para que tomen cada una de estas rotaciones de la misma manera, reduciendo el número de posibles entradas a un cuarto del original?
Editar:
También hay un giro de cada rotación que produce un resultado idéntico. La incorporación de estos reducirá mis entradas en 1/8. Con el planeador, mi objetivo es que todas estas entradas sean tratadas exactamente igual. ¿Esto tendrá que hacerse con preprocesamiento o puedo incorporarlo a la red?
fuente
Respuestas:
Si entiendo bien, su nodo de salida único será el siguiente estado del cuadrado en el medio. No necesita preocuparse por la cantidad de nodos en las capas ocultas mientras tiene recursos suficientes para entrenar el modelo. Este problema es muy fácil de aprender para una red neuronal, por lo que no hay problemas de tamaño.
Debe realizar una capacitación supervisada, lo que significa que debe ingresar los datos de entrada y la salida esperada correspondiente. Debes asegurarte de que en tus datos de entrenamiento las 4 rotaciones estén asignadas a la misma salida. De esta manera, su red debería aprender a tratarlos de la misma manera.
Me despertaste curiosidad, así que lo intenté yo mismo. Mi solución podría aprender 100% correcto en aproximadamente 20 épocas ejecutándose en unos pocos segundos en mi vieja computadora portátil. Solo cambié ligeramente la salida para que sea categórica [0,1] o [1,0], pero eso da el mismo resultado que estás buscando. Solo para referencia aquí está el código escrito en python:
fuente
Ha identificado una optimización en su espacio problemático y desea incorporarlo a su red neuronal. Sugiero el preprocesamiento: componga su optimización con una red neuronal que haga un subconjunto de lo que desea.
En otras palabras, normalice su entrada codificando manualmente un algoritmo de rotación que gira las entradas para capturar la equivalencia resaltada en su publicación. Luego alimente la salida de esta transformación a su red neuronal, para entrenamiento y todos los demás usos. Esto significa que está entrenando la red neuronal para abordar el subproblema que identificó: las rotaciones son redundantes.
Pruebe su normalizador generando una entrada aleatoria, girándola a las cuatro transformaciones potenciales, ejecute el normalizador en cada una, luego verifique que todas sean equivalentes.
fuente
Para ser purista al respecto, comience considerando la entrada de manera diferente, como una matriz circular de tamaño cuatro, cada elemento que contiene un par de bits y, además, un bit central:
A lo largo del diseño de la red, continúe esta estructura circular y el paradigma del punto central.
fuente