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?


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:



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"


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.