Backpropagation-BP es un método de aprendizaje de las RNA. El primero que trabaja con la “Backpropagation-BP” fue Seppo Linnainmaa quién lo introduce en 1.970 como un modelo de diferenciación automática (AD). Fue implementado en los ordenadores de aquella época como se utiliza actualmente en la retrocesión y en los perceptrones multicapa.
Más tarde, Paul John Werbos en 1.974, lo propone en su tesis doctoral “Beyond regression: new tools for prediction and analysis in the behavioral sciences”, como un método de optimización general para realizar la diferenciación automática de funciones complejas anidadas, pero no fue utilizado, como lo conocemos hoy, hasta que se producen los siguientes acontecimientos:
- 1.985 David E.Rumelhart, Geoffrey E.Hinton y Ronald J. William publican “Learning representations by back-propagating errors”.
- 1.986 David Parker, David Rumelhart y Yann LeCun amplían las espectativas del algoritmo basándose en los trabajos de Werbos, denominándolo BPTT (Backpropagation Through Time).
- 1.986 Yann Le Cun, publica “Learning Processes in a Asymetric Threshold Network. In Disordered Systems and Biological Organization”
- 1.986 David E.Rumelhart y James Macclelland publicaron “Parallel distributed processing: explorations in the microstructure of cognition”.
Backpropagation es un método para el aprendizaje supervisado que se basa en el cálculo del gradiente. El fundamento es fácil, tomamos la salida de nuestra red y evaluamos ese valor contra el resultado deseado. Si el error es grande y no nos satisface, los pesos entre capas se modifican (hacia atrás, desde la salida hacia la entrada) y se vuelven a procesar, así repetidamente hasta que el resultado sea el esperado. La implementación no es tan fácil, además, tiene algunas deficiencias que son solucionadas por Cascade Correlation.
Visto de otra forma: La idea del aprendizaje es la aplicación repetida de la regla de la cadena para calcular la influencia de cada peso en la red con respecto a una función de error f(e):
wij es el peso de la neurona j a la neurona i.
s es el resultado
neti es la suma ponderada de las entradas de la neurona i.
Una vez que se conoce la derivada parcial para cada peso, el objetivo es reducir la función de error y se logra realizando un descenso de gradiente simple. En la página gradiente descendente se puede ver un ejemplo en lenguaje Java.
Pongamos un ejemplo básico de Retrocesión.
En el algoritmo de retrocesión cada ciclo de entrenamiento implica que la salida actual es comparada con la salida deseada, entonces se calcula el error para las unidades de salida y los pesos en la salida son ajustados para reducir el error, esto da un error estimado para las neuronas ocultas y así sucesivamente.
Para no complicarlo se han tomado solo dos neuronas, no se actualizan los sesgos. Se ha preferido poner el ejemplo en hoja de cálculo, puede ser más legible que haberlo escrito en un lenguaje de programación. Adelantamos el resultado de 2 ciclos, en solo dos pasadas se ve como mejoramos y con el gráfico lo complementamos.
Valores de entrada:
x1= 0,055
x2 = 0,598
Salida deseada:
e1 = 0,500
e2 = 1,000
Pesos (w), según entrada ciclo 1
Ciclo 1 |
Ciclo 2 |
Resumen: Evolución de la retrocesión en los dos primeros ciclos | |||
Error | Ciclo 1 | ciclo2 | Reducción error |
Salida capa 1 | 0,02529616742974 | 0,02455469408033 | -0,0007414733494 |
Salida capa 2 | 0,03075306299364 | 0,02996516814885 | -0,0007878948448 |
Error Total | 0,05604923042338 | 0,05451986222918 | -0,0015293681942 |