Crear red neuronal para la función xor

8

Es un hecho bien conocido que una red de 1 capa no puede predecir la función xor, ya que no es separable linealmente. Intenté crear una red de 2 capas, utilizando la función sigmoide logística y el backprop, para predecir xor. Mi red tiene 2 neuronas (y un sesgo) en la capa de entrada, 2 neuronas y 1 sesgo en la capa oculta, y 1 neurona de salida. Para mi sorpresa, esto no convergerá. si agrego una nueva capa, entonces tengo una red de 3 capas con input (2 + 1), hidden1 (2 + 1), hidden2 (2 + 1) y output, funciona. Además, si mantengo una red de 2 capas, pero aumento el tamaño de la capa oculta a 4 neuronas + 1 sesgo, también converge. ¿Hay alguna razón por la cual una red de 2 capas con 3 o menos neuronas ocultas no podrá modelar la función xor?

usuario
fuente
2
Puedes predecir XOR usando esa estructura. De hecho, ni siquiera necesitas prejuicios (ver aquí ).
krychu
¿Necesito inicializar mis pesos de alguna manera especial para lograr la convergencia? Estoy probando una red neuronal simple con pesos entre (-1,1) inicializados al azar, pero no puedo lograr que converja (incluso usando sesgos)
usuario
En realidad, el uso del sigmoide logístico converge a veces, pero no todas las veces, depende de la elección inicial de pesos aleatorios.
usuario
Su rango parece bastante grande, intente (-0.1, 0.1). De lo contrario, corre el riesgo de que la señal de entrada a una neurona sea grande desde el principio, en cuyo caso el aprendizaje de esa neurona es lento. También es posible que desee disminuir la tasa de aprendizaje y aumentar el número de iteraciones.
krychu
Por el contrario, los valores más grandes hacen que converja más rápido. He intentado una tasa de aprendizaje más pequeña y muchas iteraciones. Creo que la respuesta de Neil Slater a continuación resume los problemas, aunque todavía no estoy seguro de por qué.
usuario

Respuestas:

7

Sí, hay una razón Tiene que ver con cómo inicializas tus pesas.

Hay 16 mínimos locales que tienen la mayor probabilidad de converger entre 0.5 - 1.

ingrese la descripción de la imagen aquí

Aquí hay un artículo que analiza el problema xor.

Emil
fuente
2
Parece que el enlace está roto.
Adam Kingsley
@Emil Entonces, si los pesos son muy pequeños, ¿estás diciendo que nunca convergerán? También te arreglé el enlace.
usuario
@usuario Correcto.
Emil
6

Una red con una capa oculta que contiene dos neuronas debería ser suficiente para separar el problema XOR. La primera neurona actúa como una puerta OR y la segunda como una puerta NO Y. Agregue ambas neuronas y si pasan el umbral es positivo. Puede usar neuronas de decisión lineal para esto con el ajuste de los sesgos para los umbrales. Las entradas de la puerta NOT AND deben ser negativas para las entradas 0/1. Esta imagen debería dejarlo más claro, los valores en las conexiones son los pesos, los valores en las neuronas son los sesgos, las funciones de decisión actúan como decisiones 0/1 (o simplemente la función de signo también funciona en este caso).

Red neuronal XOR

Imagen gracias al "blog de Abhranil"

Jan van der Vegt
fuente
Gracias, entonces no es posible hacer esto usando un sigmoide logístico, ya que restringe el valor a (0,1)
usuario
No, aún debería ser posible aprender esto con un sigmoide logístico, solo debería aprender los umbrales / pesos de manera diferente
Jan van der Vegt
El sesgo en la puerta NAND debería ser un +1,5.
Marc
4

Si está utilizando un descenso de gradiente básico (sin otra optimización, como el impulso) y una red mínima de 2 entradas, 2 neuronas ocultas, 1 neurona de salida, entonces definitivamente es posible entrenarlo para aprender XOR, pero puede ser bastante complicado y poco confiable.

  • Es posible que deba ajustar la tasa de aprendizaje. El error más habitual es configurarlo demasiado alto, de modo que la red oscile o diverja en lugar de aprender.

  • Puede llevar una cantidad sorprendentemente grande de épocas entrenar la red mínima usando el descenso de gradiente en línea o en lotes. Tal vez se requerirán varios miles de épocas.

  • Con un número tan bajo de pesos (solo 6), a veces la inicialización aleatoria puede crear una combinación que se atasca fácilmente. Por lo tanto, es posible que deba probar, verificar los resultados y luego reiniciar. Le sugiero que use un generador de números aleatorios sembrados para la inicialización y ajuste el valor inicial si los valores de error se atascan y no mejoran.

Neil Slater
fuente
Sí, eso es lo que estoy observando, con algunos valores semilla converge, otros no. Además, si uso tangente hiperbólica en lugar de sigmoide, funciona bastante bien todo el tiempo, con sigmoide depende de la semilla, como observaste. ¿Cuál es la razón por la que es tan complicado?
usuario
No estoy completamente seguro de cuál es la razón matemática, esto es solo por mi experiencia escribiendo un conjunto de pruebas sobre el aprendizaje xor. En mi caso, agregar impulso ayudó, pero creo que casi cualquier ajuste fuera de la red más simple y / o optimizador ayuda.
Neil Slater