La retropropagación es el algoritmo utilizado para calcular cómo cambia la pérdida de una red neuronal con respecto a cada uno de sus pesos, aplicando la regla de la cadena del cálculo hacia atrás a través de las capas de la red. Es el mecanismo que hace que el entrenamiento de redes profundas con descenso de gradiente sea computacionalmente viable, ya que calcula todos los gradientes necesarios para una actualización en aproximadamente el mismo tiempo que una sola pasada hacia adelante, en lugar de requerir un cálculo costoso y separado para cada peso individual.
Historia
La técnica matemática detrás de la retropropagación, la diferenciación automática en modo inverso, se describió en varias formas a partir de la década de 1960, y Paul Werbos la aplicó explícitamente a las redes neuronales en su tesis doctoral de 1974 en Harvard, aunque el trabajo pasó en gran medida desapercibido en ese momento. La retropropagación entró en la corriente principal de la investigación en IA después de un artículo de 1986 en Nature de David Rumelhart, Geoffrey Hinton y Ronald Williams, "Learning representations by back-propagating errors", que demostró que el método podía entrenar redes multicapa para descubrir representaciones internas útiles, respondiendo directamente a las limitaciones que Marvin Minsky y Seymour Papert habían identificado en los perceptrones de una sola capa dos décadas antes. El artículo de 1986 es ampliamente acreditado por ayudar a poner fin al segundo invierno de la IA y revivir el interés en los enfoques conexionistas de la IA durante finales de la década de 1980 y la de 1990.
Cómo funciona
La pasada hacia adelante de una red calcula una salida y un valor de función de pérdida a partir de las entradas y los pesos actuales. La retropropagación entonces trabaja hacia atrás desde esa pérdida, utilizando la regla de la cadena para calcular, capa por capa, cuánto contribuyó cada peso al error, produciendo un gradiente para cada parámetro de la red en una sola pasada hacia atrás. Estos gradientes son utilizados luego por un optimizador, típicamente una variante del descenso de gradiente, para ajustar cada peso en la dirección que reduce la pérdida. La eficiencia de este cálculo hacia atrás, formalmente una instancia de diferenciación automática en modo inverso, es lo que hace práctico entrenar redes con miles de millones de parámetros; un enfoque numérico ingenuo que recalculase cada gradiente de forma independiente sería computacionalmente inviable a esa escala.
Adopción y limitaciones
A pesar de su popularización en 1986, la retropropagación no dominó de inmediato: durante las décadas de 1990 y 2000, las redes profundas entrenadas con retropropagación sufrían de gradientes que se desvanecían o explotaban en redes con muchas capas, lo que limitaba la profundidad práctica y contribuyó a una preferencia por modelos más superficiales y métodos alternativos como las máquinas de vectores de soporte. Las soluciones arquitectónicas, incluidos los mecanismos de compuerta en las redes LSTM, la inicialización cuidadosa de pesos y, más tarde, las conexiones residuales y las capas de normalización, resolvieron gradualmente estos problemas y permitieron las redes muy profundas, incluidas las redes neuronales convolucionales y, finalmente, los transformadores, que definen el aprendizaje profundo moderno. La retropropagación en sí misma también ha atraído críticas científicas, más prominentemente de Geoffrey Hinton en años posteriores, por su falta de plausibilidad biológica, ya que el cerebro no tiene un mecanismo conocido para las señales de error hacia atrás precisas y simétricas que requiere el algoritmo, lo que motiva la investigación continua en reglas de aprendizaje alternativas y más plausibles biológicamente que hasta ahora no han igualado su rendimiento práctico.
Importancia
La retropropagación sigue siendo el método de entrenamiento casi universal para redes neuronales en todos los dominios, desde la visión por computadora hasta el procesamiento del lenguaje natural, y todos los principales marcos de aprendizaje profundo, incluidos PyTorch y TensorFlow, están construidos en torno a motores de diferenciación automática que la implementan a escala.