La retropropagación es una técnica de machine learning esencial para la optimización de neural networks. Facilita el uso de algoritmos de descenso de gradiente para actualizar los pesos de la red, que es cómo “aprenden” los modelos de aprendizaje profundo que impulsan la inteligencia artificial (IA) moderna.
Abreviatura de "propagación hacia atrás del error", la propagación hacia atrás es un método elegante para calcular cómo los cambios en cualquiera de los pesos o sesgos de una Neural Networks afectarán la precisión de las predicciones del modelo. Es esencial el uso del aprendizaje supervisado, el aprendizaje semisupervisado o el aprendizaje autosupervisado para capacitar neural networks.
Aunque se propusieron de forma independiente equivalentes y predecesores de la retropropagación en diversos contextos que se remontan a la década de 1960, David E. Rumelhart, Geoffrey Hinton y Ronald J. Williams publicaron por primera vez el algoritmo de aprendizaje formal. Su artículo de 1986, “Learning representations by backpropagating bugs”, proporcionó la derivación del algoritmo de retropropagación tal como se usa y se entiende en un contexto moderno de machine learning.
La lógica de la retropropagación es que las capas de neuronas en las neural Networks artificiales son esencialmente una serie de funciones matemáticas anidadas. Durante el entrenamiento, esas ecuaciones interconectadas se anidan en otra función: una "función de pérdida" que mide la diferencia (o "pérdida") entre la salida deseada (o "verdad fundamental") para una entrada dada y la salida real de Neural Networks.
Por lo tanto, podemos emplear la "regla de la cadena", un principio de cálculo que se remonta al siglo XVII, para calcular la tasa a la que cada neurona contribuye a la pérdida general. Al hacerlo, podemos calcular el impacto de los cambios en cualquier variable, es decir, en cualquier peso o sesgo, dentro de las ecuaciones que representan esas neuronas.
En términos matemáticos, la retropropagación funciona hacia atrás desde la salida para calcular eficazmente el "gradiente" de la función de pérdida: un vector de derivadas para cada ecuación de la red. Este gradiente indica a algoritmos de optimización como "gradient descent" qué ecuaciones ajustar y en qué dirección hacerlo para reducir las pérdidas.
Estos tres procesos entrelazados (una función de pérdida que rastrea el error del modelo en diferentes entradas, la propagación hacia atrás de ese error para ver cómo las diferentes partes de la red contribuyen al error y los algoritmos de descenso de gradiente que ajustan los pesos del modelo en consecuencia) son cómo "aprenden" los modelos de aprendizaje profundo. Como tal, la retropropagación es fundamental para capacitar modelos de Neural Networks, desde los perceptrones multicapa más básicos hasta las complejas arquitecturas de Neural Networks profundas empleadas para la IA generativa.
Boletín de la industria
Manténgase al día sobre las tendencias más importantes e intrigantes de la industria sobre IA, automatización, datos y más con el boletín Think. Consulte la Declaración de privacidad de IBM.
Su suscripción se entregará en inglés. En cada boletín, encontrará un enlace para darse de baja. Puede gestionar sus suscripciones o darse de baja aquí. Consulte nuestra Declaración de privacidad de IBM para obtener más información.
Debido a que el proceso de retropropagación es tan fundamental para la forma en que se capacitan las neural networks, una explicación útil del proceso requiere una comprensión práctica de cómo las neural networks hacen predicciones.
Lo más importante es que es útil comprender el propósito y el contexto de los "pesos" y "sesgos": los parámetros ajustables del modelo que se optimizan mediante la retropropagación y el descenso del gradiente.
Las Neural networks tienen como objetivo imitar aproximadamente la estructura del cerebro humano. Se componen de muchos nodos interconectados (o neuronas), dispuestos en capas. Las redes neuronales hacen predicciones una vez que los datos de entrada originales hicieron un "paso hacia adelante" a través de toda la red.
Las neuronas de la "capa de entrada" reciben datos de entrada, generalmente como una incrustación vectorial, y cada neurona de entrada recibe una característica individual del vector de entrada. Por ejemplo, un modelo que trabaja con imágenes en escala de grises de 10x10 pixeles normalmente tendrá 100 neuronas en su capa de entrada, y cada neurona de entrada corresponde a un pixel individual. Por lo tanto, Neural networks suelen requerir entradas de tamaño fijo, aunque técnicas como la agrupación o la normalización pueden proporcionar cierta flexibilidad.
En una red neuronal de retroalimentación hacia adelante estándar, cada neurona en la capa de entrada está conectada a cada una de las neuronas en la siguiente capa, que a su vez están conectadas a las neuronas en la siguiente capa, y así sucesivamente hasta la capa de salida donde se hacen las predicciones finales. Las capas intermedias entre la capa de entrada y la de salida, llamadas capas ocultas de la red, son donde ocurre la mayor parte del “aprendizaje”.
Si bien algunas arquitecturas de redes neuronales especializadas, como la combinación de modelos expertos o redes neuronales convolucionales, implican variaciones, adiciones o excepciones a esta disposición sencilla, todas las neural Networks emplean esta estructura central.
Aunque cada neurona recibe información de cada nodo de la capa anterior, no todas esas entradas tienen la misma importancia. A cada conexión entre dos neuronas se le asigna un "peso" único: un multiplicador que aumenta o disminuye la contribución de una neurona a una neurona en la siguiente capa.
A cada neurona individual también se le puede dar un "sesgo": un valor agregado constante a la suma de las entradas ponderadas de las neuronas en la capa anterior.
El objetivo final de la retropropagación y el descenso del gradiente es calcular los pesos y sesgos que producirán las mejores predicciones del modelo. Las neuronas correspondientes a características de datos que se correlacionan significativamente con predicciones precisas reciben mayores ponderaciones; a otras conexiones se les puede dar pesos cercanos a cero.
Las neural networks profundas modernas, a menudo con docenas de capas ocultas que contienen muchas neuronas cada una, pueden incluir miles, millones o -en el caso de la mayoría de los grandes modelos lingüísticos (LLM)- miles de millones de parámetros ajustables.
Cada neurona está configurada para realizar una operación matemática, llamada "función de activación", sobre la suma de las entradas ponderadas de peso variable que recibe de los nodos de la capa anterior. Las funciones de activación introducen "no linealidad", lo que permite que el modelo capture patrones complejos en los datos de entrada y gradientes de rendimiento que se pueden optimizar. El uso de solo funciones de activación lineal esencialmente colapsa la red de Neural Networks en un modelo de regression lineal .
Las funciones de activación comunes en neural networks incluyen:
Consideremos una hipotética unidad oculta z, con una función de activación tanh y un término de sesgo t, en la segunda capa de una neural network con 3 nodos de entrada, a, b y c, en su capa de entrada. Cada una de las conexiones entre los nodos de entrada y el nodo z tiene un peso único, w. Podemos describir el valor de salida que el nodo z pasará a las neuronas de la siguiente capa con la ecuación simplificada z = tanh(waz*a+wbz*b + wcz*c + t).
La neurona z está conectada a las neuronas de la siguiente capa. Esa ecuación para z es, por lo tanto, parte de las funciones de activación en la siguiente capa y, por extensión, también parte de cada función de activación para cualquier neurona en cualquier capa posterior.
Como se explicará en las secciones siguientes, la retropropagación es un algoritmo extraordinariamente rápido y eficaz para desenmarañar la enorme red de variables y ecuaciones interconectadas de una Neural Network.
Para ilustrar la eficiencia de la retropropagación, Michael Nielsen la compara con un enfoque alternativo simple e intuitivo para calcular el gradiente de la función de pérdida de una neural network en su libro de texto en línea, "Neural Networks and Deep Learning".
Como explica Nielsen, se puede estimar fácilmente el impacto de los cambios en cualquier peso específico wj en la red simplemente completando un pase hacia adelante para dos valores ligeramente diferentes de wj, manteniendo todos los demás parámetros sin cambios y comparando la pérdida resultante para cada pase. Al formalizar ese proceso en una ecuación directa e implementar algunas líneas de código en Python, puede automatizar ese proceso para cada peso en la red.
Pero ahora imagine que hay 1 millón de pesos en su modelo, lo que sería bastante modesto para un modelo moderno de aprendizaje profundo. Para calcular todo el gradiente, tendría que completar 1,000,001 de pases hacia adelante a través de la red: 1 para establecer una línea de base y, a continuación, otro pase para evaluar los cambios en cada uno de los millones de pesos.
La retropropagación puede lograr el mismo objetivo en dos pases: un pase hacia adelante y un pase hacia atrás.
Para simplificar la explicación del funcionamiento de la retropropagación, será útil repasar brevemente algunos conceptos matemáticos y terminología básicos.
La regla de la cadena es esencial para calcular las derivadas de las funciones de activación en neural networks, que se componen de las salidas de las funciones de activación de otras neuronas en capas anteriores.
Aunque la lógica detrás de la retropropagación es relativamente sencilla, las matemáticas y la notación pueden volverse muy complejas, especialmente para aquellos que no están familiarizados con el cálculo de variables.
Trabajando hacia atrás desde la salida del modelo, la retropropagación aplica la "regla de la cadena" para calcular la influencia de los cambios en cada parámetro individual de las Neural Networks en el error general de las predicciones del modelo.
Abstractamente hablando, el propósito de la retropropagación es entrenar una Neural Network para hacer mejores predicciones a través del aprendizaje supervisado. Más fundamentalmente, el objetivo de la retropropagación es determinar cómo se deben ajustar los pesos y sesgos del modelo para minimizar el error medido por una "función de pérdida".
A nivel técnico y matemático, el objetivo de la retropropagación es calcular el gradiente de la función de pérdida con respecto a cada uno de los parámetros individuales de las Neural Networks. En términos más simples, la retropropagación emplea la regla de la cadena para calcular la velocidad a la que cambia la pérdida en respuesta a cualquier cambio en un peso (o sesgo) específico en la red.
En términos generales, el entrenamiento de neural networks con retropropagación implica los siguientes pasos:
Las neural Networks sacan predicciones a través de la propagación hacia adelante. La propagación hacia adelante es esencialmente una serie larga de ecuaciones anidadas, con las salidas de las funciones de activación de una capa de neuronas sirviendo como entradas a las funciones de activación de las neuronas en la siguiente capa.
El entrenamiento del modelo suele comenzar con un inicio aleatorio de ponderaciones y sesgos. Los hiperparámetros del modelo, como el número de capas ocultas, el número de nodos en cada capa y las funciones de activación para neuronas específicas, se configuran manualmente y no están sujetos a entrenamiento.
En cada pase hacia adelante, se toma una muestra de entrada del conjunto de datos de entrenamiento. Los nodos de la capa de entrada reciben el vector de entrada y cada uno pasa su valor (multiplicado por un peso inicial aleatorio) a los nodos de la primera capa oculta. Las unidades ocultas toman la suma ponderada de estos valores de salida como entrada a una función de activación, cuyo valor de salida (condicionado por un peso inicial aleatorio) sirve como entrada a las neuronas de la siguiente capa. Esto continúa hasta la capa de salida, donde se produce una predicción final.
Considere este ejemplo simplificado de una Neural Network que clasifica las entradas en una de 5 categories:
En una red bien capacitada, este modelo generará constantemente un valor de alta probabilidad para la clasificación correcta y valores de baja probabilidad para las otras clasificaciones incorrectas. Sin embargo, esta Neural Network aún no está capacitada. En este punto, sus pesos y sesgos tienen valores iniciales aleatorios, por lo que sus predicciones son generalmente inexactas.
Después de cada pase hacia adelante, una "función de pérdida" mide la diferencia (o “pérdida”) entre la salida predicha del modelo para una entrada dada y las predicciones correctas (o “verdad fundamental”) para esa entrada. En otras palabras, mide qué tan diferente es la salida real del modelo de la salida deseada.
En el aprendizaje supervisado, que emplea datos etiquetados, la verdad sobre el terreno se proporciona mediante anotaciones manuales. En el aprendizaje autosupervisado, que enmascara o transforma partes de muestras de datos sin etiquetar y modelos de tareas reconstruyéndolos, la muestra original sirve como verdad fundamental.
El objetivo de esta función de pérdida es cuantificar la inexactitud de una manera que refleje adecuadamente tanto la naturaleza como la magnitud del error de la salida del modelo para cada entrada. Las diferentes fórmulas matemáticas para la pérdida son las más adecuadas para tareas específicas: por ejemplo, las variantes de error cuadrático medio funcionan bien para problemas de regression, mientras que las variantes de pérdida por entropía cruzada funcionan bien para la clasificación.
Debido a que la función de pérdida toma la salida de una neural Networks como entrada, y esa salida es una función compuesta que comprende muchas funciones de activación anidadas de neuronas individuales, diferenciar la función de pérdida implica diferenciar toda la red. Para ello, la retropropagación emplea la regla de la cadena.
¿"Función de pérdida", "función de costo" o "función de error"?
Vale la pena señalar rápidamente que en algunos contextos, los términos función de costo o función de error se utilizan en lugar de función de pérdida, con “costo” o “error” reemplazando a “pérdida”.
Aunque parte de la literatura sobre el aprendizaje automático asigna matices únicos a cada término, generalmente son intercambiables.1 Una función objetivo es un término más amplio para cualquier función de evaluación que queramos minimizar o maximizar. La función de pérdida, la función de costo o la función de error se refieren específicamente a los términos que queremos minimizar.
A partir de la capa final, un "pase hacia atrás" diferencia la función de pérdida para calcular cómo cada parámetro individual de la red contribuye al error general para una sola entrada.
Volviendo a nuestro ejemplo anterior del modelo clasificador, comenzaríamos con las 5 neuronas en la capa final, a la que llamaremos capa L. El valor softmax de cada neurona de salida representa la probabilidad (de 1) de que una entrada pertenezca a sus Categories. En un modelo perfectamente capacitado, la neurona que representa la clasificación correcta tendría un valor de salida cercano a 1 y las otras neuronas tendrían un valor de salida cercano a 0.
Por ahora, nos centraremos en la unidad de salida que representa la predicción correcta, a la que llamaremos Lc.La función de activación de Lces una función compuesta, que contiene las numerosas funciones de activación anidadas de toda la neural Network, desde la capa de entrada hasta la capa de salida. Minimizar la función de pérdida implicaría realizar ajustes en toda la red que acerquen a 1 la salidade la función de activación de Lc .
Para hacerlo, necesitaremos saber cómo cualquier cambio en las capas anteriores modificará la propia salida de Lc . En otras palabras, tendremos que encontrar las derivadas parciales de la función de activación de Lc .
La salida de la función de activación de Lcdepende de las contribuciones que recibe de las neuronas en la penúltima capa, que llamaremos capa L-1. Una forma de cambiar la salida de Lces cambiar los pesos entre las neuronas en L-1 y Lc. Al calcular la derivada parcial de cada peso L-1 con respecto a los otros pesos, podemos ver cómo aumentar o disminuir cualquiera de ellos traerá la salida de Lc más cerca (o más lejos) de 1.
Pero esa no es la única forma de cambiar la salida de Lc . Las contribuciones que Lc recibe de las neuronas L-1 están determinadas no solo por los pesos aplicados a los valores de salida de L-1 , sino por los propios valores de salida reales (preponderados). Los valores de salida de las neuronas L-1 , a su vez, están influidos por los pesos aplicados a las entradas que reciben de L-2. Así que podemos diferenciar las funciones de activación en L-1 para encontrar las derivadas parciales de los pesos aplicados a las contribuciones de L-2 . Estas derivadas parciales nos muestran cómo cualquier cambio en un peso L-2 afectará las salidas en L-1, lo que posteriormente afectaría el valor de salida de Lc y, por lo tanto, afectaría la función de pérdida.
Por esa misma lógica, también podríamos influir en los valores de salida que las neuronas L-1 reciben de las neuronas L-2 ajustando las contribuciones que las neuronas L-2 reciben de las neuronas en L-3. Así que encontramos las derivadas parciales en L-3, y así sucesivamente, repitiendo de forma recurrente este proceso hasta que llegamos a la capa de entrada. Cuando terminamos, tenemos el gradiente de la función de pérdida: un vector de su derivada parcial para cada parámetro de peso y sesgo en la red.
Ahora completamos un pase hacia adelante y un pase hacia atrás para un solo ejemplo de entrenamiento. Sin embargo, nuestro objetivo es capacitar el modelo para generalizar bien a nuevas entradas. Para hacerlo, se requiere entrenamiento en una gran cantidad de muestras que reflejen la diversidad y el rango de entradas que el modelo tendrá la tarea de hacer predicciones luego del entrenamiento.
Ahora que tenemos los gradientes de la función de pérdida con respecto a cada parámetro de ponderación y sesgo en la red, podemos minimizar la función de pérdida (y, por lo tanto, optimizar el modelo) empleando el descenso de gradiente para actualizar los parámetros del modelo.
Al moverse hacia abajo ( descender ), el gradiente de la función de pérdida disminuirá la pérdida. Dado que el gradiente que calculamos durante la retropropagación contiene las derivadas parciales de cada parámetro del modelo, sabemos en qué dirección "escalonar" cada uno de nuestros parámetros para reducir la pérdida.
Cada paso refleja el “aprendizaje” del modelo a partir de sus datos de entrenamiento. Nuestro objetivo es actualizar iterativamente los pesos hasta que alcanzamos el gradiente mínimo. El objetivo de los algoritmos de descenso de gradiente es encontrar los ajustes de parámetros específicos que nos moverán hacia abajo en el gradiente de manera más eficiente.
El tamaño de cada paso es un hiperparámetro ajustable, llamado tasa de aprendizaje. Elegir el ritmo de aprendizaje adecuado es importante para una formación eficiente y eficaz.
Recuerde que las funciones de activación en una red neuronal no son lineales. Algunos gradientes pueden tener aproximadamente forma de U: al dar un paso en una dirección, se mueve hacia abajo el gradiente, pero al continuar dando pasos en esa dirección, eventualmente se moverá hacia arriba el gradiente.
Una tasa de aprendizaje baja asegura que siempre vamos en la dirección correcta, pero calcular tantos cambios requiere mucho tiempo y es computacionalmente costoso. Una tasa alta de aprendizaje es computacionalmente eficiente, pero corre el riesgo de sobrepasar el mínimo.
Otra consideración en el descenso de gradiente es la frecuencia con la que se actualizan los pesos. Una opción es calcular los gradientes para cada ejemplo en el conjunto de datos de entrenamiento, luego tomar un promedio de esos gradientes y usarlo para actualizar los parámetros. El proceso se repite iterativamente en una serie de épocas de entrenamiento hasta que la tasa de error se estabiliza. Este método es el descenso de gradiente por lotes.
Cuando el conjunto de datos de entrenamiento es muy grande, como suele ser en el aprendizaje profundo, el descenso del gradiente por lotes implica tiempos de procesamiento prohibitivamente largos. Calcular gradientes para millones de ejemplos para cada iteración de actualizaciones de peso se vuelve ineficiente. En el descenso de gradiente estocástico (SGD), cada época utiliza un único ejemplo de entrenamiento para cada paso. Si bien la pérdida puede fluctuar de una época a otra, converge rápidamente al mínimo a lo largo de muchas actualizaciones.
El descenso de gradiente mediante minilotes representa un enfoque intermedio. Los ejemplos de entrenamiento se toman aleatoriamente en lotes de tamaño fijo y luego se calculan y promedian sus gradientes juntos. Esto mitiga los requisitos de almacenamiento de memoria del descenso de gradiente por lotes y al mismo tiempo reduce la inestabilidad relativa de SGD.
Entrene, valide, ajuste y despliegue IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de próxima generación para creadores de IA. Diseñe aplicaciones de IA en menos tiempo y con menos datos.
Ponga la IA a trabajar en su negocio con la experiencia en IA líder en la industria y la cartera de soluciones de IBM a su lado.
Reinvente los flujos de trabajo y las operaciones críticas añadiendo IA para maximizar las experiencias, la toma de decisiones en tiempo real y el valor empresarial.
¹ "Deep Learning", Goodfellow et al, MIT Press, 2016.