este problema se puede solucionar de variadas maneras, pero en este caso te damos la que en nuestra opinión es la solución más completa.
Solución:
La retropropagación funciona con una lógica muy similar a la de feed-forward. La diferencia es la dirección del flujo de datos. En el paso de avance, tiene las entradas y la salida observadas. Puede propagar los valores hacia adelante tren las neuronas por delante.
En el paso de retropropagación, no puede conocer los errores que ocurrieron en cada neurona, excepto los de la capa de salida. Calcular los errores de los nodos de salida es sencillo: puede tomar la diferencia entre la salida de la neurona y la salida real para ese caso en el conjunto de entrenamiento. Las neuronas en las capas ocultas deben corregir sus errores a partir de esto. Por lo tanto, debe devolverles los valores de error. A partir de estos valores, las neuronas ocultas pueden actualizar sus pesos y otros parámetros utilizando la suma ponderada de errores de la capa anterior.
Aquí se puede encontrar una demostración paso a paso de los pasos de propagación de retroalimentación y retroalimentación.
Editar
Si es un principiante en las redes neuronales, puede comenzar a aprender de Perceptrón, luego avance a NN, que en realidad es un perceptrón multicapa.
Descripción de alto nivel del algoritmo de retropropagación
La retropropagación está tratando de hacer un descenso de gradiente sobre el superficie de error de la red neuronal, ajustando los pesos con programación dinámica técnicas para mantener los cálculos manejables.
Intentaré explicar, en términos de alto nivel, todos los conceptos que acabamos de mencionar.
Superficie de error
Si tiene una red neuronal con, digamos, N neuronas en la capa de salida, eso significa que su salida es realmente un vector N-dimensional, y ese vector vive en un espacio N-dimensional (o en una superficie N-dimensional). hace el resultado “correcto” contra el que estás entrenando. También lo hace el diferencia entre su respuesta “correcta” y la salida real.
Esa diferencia, con un acondicionamiento adecuado (especialmente alguna consideración de valores absolutos) es la vector de error, viviendo en la superficie del error.
Descenso de gradiente
Con ese concepto, puede pensar en entrenar la red neuronal como el proceso de ajustar los pesos de sus neuronas para que la función de error sea pequeña, idealmente cero. Conceptualmente, haces esto con cálculo. Si solo tuviera una salida y un peso, esto sería simple: tome algunas derivadas, que le dirán en qué “dirección” moverse, y haga un ajuste en esa dirección.
Pero no tiene una neurona, tiene N de ellas y sustancialmente más pesos de entrada.
El principio es el mismo, excepto que en lugar de usar cálculo en líneas en busca de pendientes que puedas imaginar en tu cabeza, las ecuaciones se convierten en expresiones de álgebra vectorial que no puedes imaginar fácilmente. El término degradado es el análogo multidimensional de Pendiente en una línea, y descendencia significa que quieres moverte abajo esa superficie de error hasta que los errores son pequeños.
Programación dinámica
Sin embargo, hay otro problema: si tiene más de una capa, no puede ver fácilmente el cambio de los pesos en alguna capa sin salida en comparación con la salida real.
La programación dinámica es un método de contabilidad para ayudar a rastrear lo que está sucediendo. En el nivel más alto, si ingenuamente intentas hacer todo este cálculo vectorial, terminas calculando algunas derivadas una y otra vez. El algoritmo moderno de retropropagación evita algo de eso, y sucede que primero actualiza la capa de salida, luego la segunda a la última capa, etc. Las actualizaciones son propagándose al revés de la salida, de ahí el nombre.
Por lo tanto, si tiene la suerte de haber estado expuesto al descenso de gradiente o al cálculo vectorial antes, es de esperar que haya hecho clic.
La derivación completa de la retropropagación se puede condensar en una página de matemática simbólica estricta, pero es difícil entender el algoritmo sin una descripción de alto nivel. (Es francamente intimidante, en mi opinión). Si no tiene un buen manejo del cálculo vectorial, entonces, lo siento, lo anterior probablemente no fue útil. Pero para que la propagación hacia atrás funcione realmente, no es necesario comprender la derivación completa.
Encontré el siguiente artículo (de Rojas) muy útil, cuando estaba tratando de entender este material, incluso si es un PDF grande de un capítulo de su libro.
http://page.mi.fu-berlin.de/rojas/neural/chapter/K7.pdf
Intentaré explicarlo sin profundizar demasiado en el código o las matemáticas.
Básicamente, calcula la clasificación de la red neuronal y la compara con el valor conocido. Esto le da un error en el nodo de salida.
Ahora, desde el nodo de salida, tenemos N enlaces entrantes de otros nodos. Propagamos el error a la última capa antes del nodo de salida. Luego, propague a la siguiente capa (cuando hay más de un enlace ascendente, suma los errores). Y luego propagarse recursivamente a la primera
Para ajustar los pesos para el entrenamiento, para cada nodo, básicamente, haga lo siguiente:
for each link in node.uplinks
error = link.destination.error
main = learningRate * error * node.output // The amount of change is based on error, output, and the learning rate
link.weight += main * alpha * momentum // adjust the weight based on the current desired change, alpha, and the "momentum" of the change.
link.momentum = main // Momentum is based on the last change.
learningRate y alpha son parámetros que puede configurar para ajustar la rapidez con la que se concentra en una solución frente a la precisión con la que (con suerte) la resuelve al final.