Pregunta: ¿es posible entrenar a un NN para distinguir entre números pares e impares solo usando como entrada los números mismos?
Tengo el siguiente conjunto de datos:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
Entrené a un NN con dos neuronas de entrada (una es el Número variable, la otra es una neurona sesgada), nueve neuronas en la capa oculta y una neurona de salida usando un algoritmo genético muy simple: en cada época, dos conjuntos de pesas "luchan" " unos contra otros; el que tiene el error más alto pierde y se reemplaza por una versión modificada del ganador.
El script resuelve fácilmente problemas simples como los operadores AND, OR y XOR, pero se atasca al intentar categorizar números pares e impares. En este momento, lo mejor que logró hacer fue identificar 53 números de 100 y tomó varias horas. Si normalizo o no las entradas parece no hacer ninguna diferencia.
Si quisiera hacer trampa, podría preprocesar los datos y alimentar% 2 al NN como entrada, pero no quiero hacer eso; NN debería poder aproximar cada función, incluido el operador de módulo ( creo ). ¿Qué estoy haciendo mal?
Respuestas:
Al igual que con cualquier tarea de aprendizaje automático, la representación de su aportación juega un papel crucial en lo bien que aprende y generaliza.
Creo que el problema con la representación es que la función (módulo) es altamente no lineal y no es uniforme en la representación de entrada que ha elegido para este problema.
Intentaría lo siguiente:
Pruebe un mejor algoritmo de aprendizaje (propagación hacia atrás / descenso de gradiente y sus variantes).
Intente representar los números en binario usando una precisión de longitud fija.
Si su representación de entrada es un número de bits b, me aseguraría de que su conjunto de entrenamiento no esté sesgado hacia números pequeños o grandes. Tenga números que se elijan de manera uniforme e independiente al azar del rango .[ 0 , 2si- 1 ]
Como lo ha hecho, use una red de varias capas (pruebe primero con 2 capas: es decir, oculta + salida, antes de usar más capas).
Use un conjunto de entrenamiento + prueba por separado. No evalúe su desempeño en el conjunto de entrenamiento.
fuente
Aprender a clasificar números impares y pares es un problema difícil. Un patrón simple se repite infinitamente. 2,4,6,8 ..... 1,3,5,7 .....
Las funciones de activación no lineal como sin (x) y cos (x) se comportan de manera similar. Por lo tanto, si cambia sus neuronas para implementar pecado y cos en lugar de funciones de activación populares como tanh o relu, creo que puede resolver este problema con bastante facilidad utilizando una sola neurona.
Las transformaciones lineales siempre preceden a las transformaciones no lineales. Por lo tanto, una sola neurona terminará aprendiendo sin (ax + b) que para la combinación correcta de a & b generará 0 y 1 alternativamente en la frecuencia deseada que queremos, que en este caso es 1.
Nunca he probado el pecado o el cos en mis redes neuronales antes. Entonces, disculpas si termina siendo una muy mala idea.
fuente
Ahora estoy trabajando con redes neuronales y me encontré con el mismo problema que tú. Lo que terminé haciendo fue representar el número de entrada como una matriz con valores iguales a la representación binaria del número. Como lo que estamos haciendo es clasificar, representé mi salida como una matriz, no como un solo valor. ex:
¡Espero que esto ayude!
fuente
Llegué aquí donde estaba luchando con un problema similar. Entonces escribo lo que logré.
Hasta donde yo sé, el perceptrón de una capa es capaz de resolver todos los problemas, que al final pueden simplificarse para dividir objetos en cualquier geometría usando una línea recta. Y este es este tipo de problema. Si dibuja el último bit de representación binaria en papel, también puede dibujar una línea, y todos los números impares están en un lado, e incluso en el otro. Por la misma razón, es imposible resolver el problema xor con una red de una capa.
Okay. Este problema parece muy simple, así que tomemos el paso Heaviside como función de activación. Después de jugar un poco con mi número, me di cuenta de que el problema aquí es el sesgo. Busco un poco en Google, y lo que encontré es que si te quedas con la representación de la geometría, el sesgo te permite cambiar el lugar de activación en el sistema de coordenadas.
Problema muy educativo
fuente
Es bien sabido que las puertas lógicas NOT, AND, OR se pueden hacer con redes neuronales muy simples (NN), y que se puede construir una calculadora aritmética completa con puertas lógicas utilizando números binarios como entrada. Por lo tanto, debería poder crear un NN para calcular n módulo k, para cualquier número n y k expresado en la base 2.
Si desea calcular n módulo k para un número k fijo (por ejemplo, k = 4), puede crear un NN extremadamente simple que haga eso: exprese el número de entrada n en la base k e ignore todos los dígitos que no sean el rango más bajo dígito, y tienes la respuesta!
fuente
Una idea para evadir el uso del "mod 2" explícito en la entrada podría ser codificar el número como una secuencia de píxeles, entonces el problema equivale a reconocer si el segmento se puede dividir en dos segmentos iguales. Este es un problema de visión artificial y eso podría ser aprendido por las redes convencionales.
En el otro extremo, si el número se almacena como flotante, la pregunta se reduce (o generaliza) para reconocer cuándo un número flotante es aproximadamente un número entero.
fuente
Creé una red así aquí .
La representación que dio @William Gottschalk fue la base.
Solo usa 1 neurona en la primera capa oculta con 32 entradas. La capa de salida tiene solo 2 neuronas para una codificación de 0 y 1 en caliente.
fuente
Mi solucion
Además, dividir entre otros números (digamos, 7) también está bien:
Explicación:
Tengo 2 soluciones diferentes. Ambos son buenos:
1. el pecado como activación
2. piso (o int) como activación
Es imposible encontrar los mejores pesos usando el descenso de gradiente, y yo uso el algoritmo genético (de scikit-opt )
fuente