¿Cómo puedo hacer que mi red trate las rotaciones de la entrada por igual?

11

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:

Planeador

Lo anterior se representa como 010 001 111.

Sin embargo, hay otras tres rotaciones de esta forma, y ​​todas producen la misma salida:

Rotaciones de planeadores

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?

Aric
fuente
¡Pregunta excepcional! Tengo un problema similar e impedidor con mi propio proyecto y estaré muy interesado en aprender sobre las técnicas más eficientes para reducir la simetría.
DukeZhou
@DukeZhou Tengo la impresión de que tomará un tiempo obtener una respuesta. Estoy preparado para usar mi escaso suministro de representante para establecer una recompensa si es necesario ...
Aric
Otra solución es preprocesar la entrada, de modo que las 4 rotaciones se conviertan en la misma imagen antes de ser alimentadas a la red.
BlueMoon93

Respuestas:

4

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:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)
Manngo
fuente
La red que usaré será simulada por una clase escrita por mí mismo, de ahí la preocupación de la memoria.
Aric
Si desea reducir el uso de memoria por parte de la red, reducir el número de entradas posibles (mediante rotación) ayudará a tener una red más pequeña. Cuanto más fácil es la tarea de aprendizaje, se necesita una red más pequeña. En este caso, el preprocesamiento sería mejor. Sin embargo, NN es para el aprendizaje de conceptos y para aprender el concepto de Juego de la vida que debes alimentar en todos los patrones. Si su objetivo es minimizar la huella de la memoria, resuelva el problema de forma lineal.
Manngo
Si la memoria no es una preocupación, prefiero que la red realice esta operación por las mismas razones que usted indicó. El preprocesamiento elimina parte de la tarea de la red, simplificándola.
Aric
Correcto, luego vaya al preprocesamiento. Creo que con esto se responde la pregunta. Puede optar por implementarlo si tiene problemas con la memoria. Consejo: use flotante para los pesos que solo requieren 32 bits en lugar del doble que toma 64. Esto usará menos memoria.
Manngo
4

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.

Harrichael
fuente
1

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:

... 01, 01, 11, 10 ...

0 0

A lo largo del diseño de la red, continúe esta estructura circular y el paradigma del punto central.

Douglas Daseeco
fuente