neural-network - ejemplos - redes neuronales para la prediccion
Entrenando una red neuronal para agregar (4)
Puede ser demasiado tarde, pero una solución simple es usar un RNN ( Red Neuronal Recurrente ).
Después de convertir sus números a dígitos, su NN tomará un par de dígitos de la secuencia de dígitos de izquierda a derecha.
El RNN tiene que repetir una de sus salidas para que pueda entender automáticamente que hay un dígito para llevar (si la suma es 2, escriba un 0 y cargue 1).
Para entrenarlo, tendrá que darle las entradas que constan de dos dígitos (uno del primer número, el segundo del segundo número) y el resultado deseado. Y el RNN terminará encontrando cómo hacer la suma.
Tenga en cuenta que este RNN solo necesitará conocer los 8 casos siguientes para aprender cómo sumar dos números:
- 1 + 1, 0 + 0, 1 + 0, 0 + 1 con llevar
- 1 + 1, 0 + 0, 1 + 0, 0 + 1 sin llevar
Necesito entrenar una red para multiplicar o agregar 2 entradas, pero no parece aproximarse bien para todos los puntos después de 20000 iteraciones. Más específicamente, lo entreno en todo el conjunto de datos y se aproxima bien a los últimos puntos, pero parece que no está mejorando para los primeros puntos finales. Normalizo los datos para que estén entre -0.8 y 0.8. La red en sí misma consta de 2 entradas 3 neuronas ocultas y 1 neurona de salida. También configuré la tasa de aprendizaje de la red en 0.25 y la uso como función de aprendizaje tanh (x).
Se aproxima bastante bien a los puntos que están entrenados en último lugar en el conjunto de datos, pero para los primeros puntos parece que no se puede aproximar bien. Me pregunto qué es, que no está ayudando a que se ajuste bien, ya sea la topología que estoy usando o alguna otra cosa.
Además, ¿cuántas neuronas son apropiadas en la capa oculta para esta red?
Piense qué pasaría si reemplazara su función de umbral de tanh(x)
con una función lineal de x - llámese ax
- y trate a
como el único parámetro de aprendizaje en cada neurona. Eso es lo que optimizará su red; es una aproximación del cruce por cero de la función tanh
.
Ahora, ¿qué sucede cuando capas neuronas de este tipo lineal? Se multiplica la salida de cada neurona a medida que el pulso pasa de entrada a salida. Estás tratando de aproximar la suma con un conjunto de multiplicaciones. Eso, como dicen, no computa.
Una red que consta de una sola neurona con pesos = {1,1}, sesgo = 0 y la función de activación lineal realiza la adición de los dos números de entrada.
La multiplicación puede ser más difícil. Aquí hay dos enfoques que una red puede usar:
- Convierta uno de los números en dígitos (por ejemplo, binario) y realice la multiplicación como lo hizo en la escuela primaria.
a*b = a*(b0*2^0 + b1*2^1 + ... + bk*2^k) = a*b0*2^0 + a*b1*2^1 + ... + a*bk*2^k
. Este enfoque es simple, pero requiere un número variable de neuronas proporcional a la longitud (logaritmo) de la entradab
. - Tome los logaritmos de las entradas, agréguelos y exponga el resultado.
a*b = exp(ln(a) + ln(b))
Esta red puede trabajar en números de cualquier longitud siempre que pueda aproximar el logaritmo y el exponente lo suficientemente bien.
Si quieres mantener las cosas neuronales (los enlaces tienen pesos, la neurona calcula la suma ponderada de las entradas por los pesos y las respuestas 0 o 1 dependiendo del sigmoide de la suma y usas la retropropagación del gradiente), entonces debes pensar sobre una neurona de la capa oculta como clasificadores . Definen una línea que separa el espacio de entrada en clases: 1 clase corresponde a la parte donde la neurona responde 1, la otra cuando responde 0. Una segunda neurona de la capa oculta definirá otra separación y así sucesivamente. La neurona de salida combina las salidas de la capa oculta al adaptar sus pesos para que su salida corresponda a los que presentaste durante el aprendizaje.
Por lo tanto, una sola neurona clasificará el espacio de entrada en 2 clases (tal vez corresponde a una adición que depende de la base de datos de aprendizaje). Dos neuronas podrán definir 4 clases. Tres neuronas 8 clases, etc. Piense en la salida de las neuronas ocultas como potencias de 2: h1*2^0 + h2*2^1+...+hn*2^n
, donde hi
es la salida de la neurona oculta i
. NB: necesitarás n neuronas de salida. Esto responde la pregunta sobre la cantidad de neuronas ocultas que se usarán.
Pero el NN no calcula la suma. Lo ve como un problema de clasificación basado en lo que aprendió. Nunca podrá generar una respuesta correcta para los valores que están fuera de su base de aprendizaje. Durante la fase de aprendizaje, ajusta los pesos para colocar los separadores (líneas en 2D) para producir la respuesta correcta. Si sus entradas están en [0,10]
, aprenderá a producir para corregir respuestas para adiciones de valores en [0,10]^2
pero nunca dará una buena respuesta para 12 + 11
.
Si sus últimos valores son bien aprendidos y los primeros olvidados, trate de reducir la tasa de aprendizaje: las modificaciones de los pesos (dependiendo del gradiente) de los últimos ejemplos pueden anular el primero (si está utilizando el backprop estocástico). Asegúrate de que tu base de aprendizaje sea justa. También puede presentar los ejemplos mal aprendidos más a menudo. Y pruebe muchos valores de la tasa de aprendizaje hasta que encuentre una buena.