¿Qué es el descenso de gradiente estocástico?

Autor

Anna Gutowska

AI Engineer, Developer Advocate

IBM

¿Qué es el descenso de gradiente estocástico?

El descenso de gradiente estocástico (SGD) es un algoritmo de optimización comúnmente utilizado para mejorar el rendimiento de los modelos de machine learning. Es una variante del algoritmo tradicional de descenso de gradiente, con una modificación clave: en lugar de depender de todo el conjunto de datos para calcular el gradiente en cada paso, SGD emplea una sola muestra de datos a la vez.

Descenso de gradiente

El descenso de gradiente (GD) es un algoritmo de optimización que minimiza iterativamente una función objetivo. En el contexto del machine learning (ML), el descenso de gradiente es fundamental para mejorar el rendimiento de los modelos de aprendizaje supervisado durante su fase de entrenamiento. Los modelos de machine learning, como las redes neuronales, son complejos, no lineales y de alta dimensión. Por lo tanto, no existe una ecuación normal para tales modelos que pueda calcular la ponderaciones óptimas, a diferencia de la regresión lineal. En su lugar, se pueden utilizar métodos de aproximación como las variantes de descenso de gradiente, los métodos de Newton y la maximización de expectativas, entre otros.

Cada modelo tiene una función de pérdida, a veces llamada función de costo. Esta función mide qué tan lejos están las predicciones de un modelo de los puntos de datos reales. Piense en esto como una medida de cuán "equivocadas" son las predicciones del modelo. Por ejemplo, el error cuadrático medio a menudo sirve como función de pérdida en problemas de regresión. La fase de entrenamiento del modelo está diseñada para encontrar los valores de los parámetros que minimizan esta pérdida. El descenso de gradiente suele ser la técnica de optimización utilizada en el entrenamiento por este motivo. El algoritmo calcula el gradiente, o la pendiente, de la pérdida con respecto a los parámetros del modelo. Con este gradiente, da un paso en la dirección opuesta para reducir la pérdida. La tasa de aprendizaje (también conocida como tamaño de paso o alfa) es el tamaño de los pasos y permanece fija para todos los parámetros del modelo. Este proceso se repite hasta que el modelo logra una convergencia cercana a un mínimo.

Representación gráfica de la convergencia Representación gráfica de la convergencia

Lo ideal es que la convergencia se produzca en el mínimo global. En la siguiente visualización, puede ver que el valor de pérdida es menor en un mínimo local que en su área circundante inmediata, pero no necesariamente el valor más bajo en general. El mínimo global es el valor absoluto más bajo de la función de pérdida en todo su dominio, lo que representa la mejor solución posible para el problema.

Mínimo local y global en un espacio tridimensional Mínimo local y global en un espacio tridimensional

Si la tasa de aprendizaje no es lo suficientemente pequeña, el algoritmo a menudo convergerá en un mínimo local. Una tasa bien elegida es esencial para minimizar la función de pérdida y lograr la convergencia en un mínimo global.

Efecto de la tasa de aprendizaje en la convergencia Efecto de la tasa de aprendizaje en la convergencia

Esta visualización representa el efecto de la tasa de aprendizaje en la convergencia. Una tasa de aprendizaje pequeña conduce a una convergencia lenta, pero estable (izquierda), mientras que una tasa de aprendizaje grande puede causar exceso e inestabilidad (derecha).

De GD a SGD

El diferenciador clave entre el descenso de gradiente tradicional y el descenso de gradiente estocástico es que SGD actualiza las ponderaciones del modelo utilizando un solo ejemplo de entrenamiento a la vez. El ejemplo se elige aleatoriamente en cada iteración.1 El descenso de gradiente utiliza todo el conjunto de datos de entrenamiento para calcular el gradiente antes de cada actualización de parámetros. Esta diferencia en el uso de datos es lo que hace que SGD sea mucho menos costoso computacionalmente y más fácil de escalar para grandes conjuntos de datos. Alternativamente, el comportamiento de convergencia de SGD es más ruidoso que el ruido de GD porque el punto de datos de ejemplo podría no ser una buena representación del conjunto de datos. Esta tergiversación actualiza los puntos en una dirección ligeramente "incorrecta". Sin embargo, esta aleatoriedad es lo que hace que SGD sea más rápido y, a veces, mejor para problemas de optimización no convexa porque puede escapar de mínimos locales poco profundos o puntos de silla.

Estrictamente hablando, SGD se definió originalmente para actualizar los parámetros utilizando exactamente una muestra de entrenamiento a la vez. En el uso moderno, el término "SGD" se utiliza vagamente para referirse a "descenso de gradiente de minilotes", una variante de GD en la que se utilizan pequeños lotes de datos de entrenamiento a la vez. La principal ventaja de usar subconjuntos de datos en lugar de una muestra singular es un nivel de ruido más bajo, porque el gradiente es igual al promedio de pérdidas del minilote. Por esta razón, el descenso de gradiente de minilotes es el valor predeterminado en el aprendizaje profundo. Por el contrario, el SGD estricto rara vez se utiliza en la práctica. Estos términos incluso se combinan en la mayoría de las bibliotecas de machine learning como PyTorch y TensorFlow; los optimizadores a menudo se denominan "SGD", aunque suelen utilizar minilotes.

La siguiente ilustración proporciona una descripción más clara de cómo aumentar el tamaño de la muestra de los datos de entrenamiento reduce las oscilaciones y el "ruido".

Variantes del descenso de gradiente

Hay varias otras variantes de GD que se basan en el descenso de gradiente básico al agregar mecanismos para mejorar la velocidad, la estabilidad y la convergencia.

Métodos basados en el impulso:

Al acumular impulso en dimensiones con gradientes constantes y amortiguar las actualizaciones en dimensiones con gradientes cambiantes, el impulso ayuda a SGD a converger más rápido y con menos oscilación.2

SGD con y sin impulso
  • Descenso de gradiente de impulso: incorpora un término de “velocidad”, un promedio de gradientes anteriores que le da más importancia a los recientes. Este enfoque reduce el zigzagueo o las oscilaciones, lo que ayuda a que el algoritmo se mueva más rápido en la dirección correcta.

  • NAG (gradiente acelerado de Nesterov): un método de impulso mejorado que acelera y suaviza la convergencia "mirando hacia adelante" hacia dónde se dirigen los parámetros antes de calcular el gradiente. En otras palabras, anticipa el gradiente futuro y utiliza esta información para informar el paso de actualización actual.3

Métodos de tasa de aprendizaje adaptativo:

Los métodos de tasa de aprendizaje adaptativo, como AdaGrad y RMSProp, son únicos en el sentido de que adaptan la tasa de aprendizaje para cada parámetro individualmente. Este enfoque contrasta con los métodos SGD, que utilizan una tasa de aprendizaje fija para todos los parámetros.

  • AdaGrad (algoritmo de gradiente adaptativo): adapta la tasa de aprendizaje para cada parámetro en función de sus gradientes anteriores. Las características que aparecen con menos frecuencia reciben tasas de aprendizaje más altas, y las características frecuentes reciben tasas más bajas. Este enfoque significa que las características poco frecuentes se aprenden más rápido que con SGD. Esta tasa de aprendizaje adaptativo significa que es un gran método para el procesamiento de lenguaje natural (PLN) y los sistemas de recomendación con datos dispersos, en los que hay una gran discrepancia en la frecuencia de las características.2
     

  • RMSProp (propagación de la raíz cuadrada media): otra técnica de optimización de la tasa de aprendizaje adaptativa que escala la tasa de aprendizaje para cada parámetro mediante el uso de un promedio móvil de gradientes cuadrados recientes. El conocimiento del gradiente pasado se descarta y solo se conserva el conocimiento del gradiente actual.4 La tasa de aprendizaje se vuelve mayor para parámetros con gradientes pequeños y menor para aquellos con gradientes grandes. Este método elimina el problema de la tasa de aprendizaje decreciente con AdaGrad. RMSProp ayuda a mantener estable el entrenamiento en aprendizaje profundo, especialmente para modelos como redes neuronales recurrentes, y funciona bien en problemas donde el objetivo sigue cambiando, como en el aprendizaje por refuerzo.

Métodos híbridos:

  • Adam (estimación adaptativa del momento): combina la GD basada en el impulso con RMSProp mediante el seguimiento tanto de los gradientes pasados como del promedio de los gradientes al cuadrado.Esta combinación permite una rápida tasa de convergencia incluso para conjuntos de datos ruidosos y dispersos.3 Además, los hiperparámetros predeterminados, como una tasa de aprendizaje de 0.001 en muchas infraestructuras, funcionan bien de inmediato. Sin embargo, para conjuntos de datos a muy gran escala, SGD con impulso puede conducir a una mejor generalización. Los agresivos ajustes por parámetro de Adam pueden dar como resultado un sobreajuste de los datos de entrenamiento o establecer mínimos precisos que no se generalizan tan bien.

SGD y otras variantes de GD son útiles cuando el tiempo de entrenamiento es el cuello de botella.5

VarianteDatos utilizados por pasoCaracterísticas claveUso común
GDTodos los datosEstable, pero lentoPequeños conjuntos de datos
SGD1 muestra para SGD clásicoRuidoso, pero rápidoAprendizaje en línea
GD de minilotePocas muestrasEquilibrado y escalableAprendizaje profundo
MomentumLote/miniloteAcelera en la dirección correctaRedes neuronales
NAGLote/miniloteImpulso de anticipaciónConvergencia más rápida
AdaGradMiniloteTasa de aprendizaje adaptativoDatos dispersos
RMSPropMiniloteArreglos del deterioro de AdaGradRNN, redes profundas
AdamMiniloteImpulso + RMSPropOpción predeterminada hoy

Comprender las matemáticas

El objetivo de SGD es encontrar parámetros θ que hacen que las predicciones de nuestro modelo sean lo más cercanas posible a los valores verdaderos y . En otras palabras, queremos minimizar la función de pérdida. L(θ) .

En el caso de la regresión lineal, esos parámetros son w (ponderación) y b (sesgo). En este caso, minimizar L(θ) es lo mismo que minimizar  L(w,b) .

 yi^=w·xi+b

L(w,b)=1ni=1n(yi-yi^)2

Una analogía comúnmente utilizada cuando se enseña el descenso de gradiente es que GD es como caminar cuesta abajo en una montaña hasta llegar a un valle (la pérdida mínima). Imagine el gradiente de la función de pérdida, L , apunta cuesta arriba y para ir cuesta abajo, debemos dar un paso en la dirección opuesta.

La regla de actualización general para un parámetro θ  es:

θ:=θ-η·θL(θ)

dónde η es la tasa de aprendizaje y θL(θ) es el gradiente de la pérdida con respecto a θ .

SGD utiliza solo una muestra elegida al azar (xi,yi) para aproximar el gradiente:

θL(θ)θ(xi,yi;θ)

Observe que la minúscula (xi,yi;θ) representa la pérdida de un solo ejemplo de entrenamiento. Mientras que la mayúscula L(θ) es la función de pérdida general (el promedio de todas las pérdidas individuales en el conjunto de datos). Este error global es lo que realmente estamos tratando de minimizar en el entrenamiento.

Ejemplo: regresión lineal con SGD

Terminemos con el ejemplo de regresión lineal con SGD.

Para una muestra (xi,yi) , la predicción es:

 yi^=w·xi+b

La pérdida local es el error cuadrático para una muestra:

 (xi,yi;w,b)=(yi-(wxi+b))2

Ahora, durante la retropropagación, los parámetros del modelo se actualizan mediante la regla de cadena que calcula los gradientes de la función de pérdida con respecto a cada parámetro.5 Los gradientes (derivados) son:

 w=-2xi(yi-(wxi+b))

 b=-2(yi-(wxi+b))

Con SGD, actualizamos cada uno de estos parámetros, w y b , mediante las siguientes reglas:

 w:=w-η·(-2xi(yi-(wxi+b)))

 b:=b-η·(-2(yi-(wxi+b)))

En lugar de calcular un gradiente promedio pesado en todo el conjunto de datos, SGD utiliza una estimación aleatoria ligera.

Implementación simple de SGD en Python

Cuando se trabaja con infraestructuras de machine learning, hay clases de optimizador SGD integradas que se pueden usar. Por ejemplo, torch.optim.SGD  para PyTorchtf.keras.optimizers.SGD  para Keras integrado en TensorFlow, y SGDRegressor  para Scikit-learn.

Con fines de aprendizaje, veamos una implementación simple de SGD en Python desde cero.

Para reiterar, nuestro objetivo es encontrar los mejores parámetros (ponderaciones del modelo) que minimicen la función de pérdida (una medida de cuán equivocadas son nuestras predicciones). Actualizaremos una muestra a la vez o un tamaño de lote muy pequeño.

Para empezar, podemos inicializar los valores de los parámetros (parámetros) de forma aleatoria. A continuación, podemos seleccionar un punto de datos aleatorio (x,y) . A partir de ahí, calculamos la predicción y el error. Para esta sencilla demostración, intentemos ajustar una línea simple: y=mx+b . El siguiente paso en el proceso es la retropropagación, en la que se calculan los gradientes de la función de pérdida con respecto a los parámetros. Estos gradientes (derivados) se utilizan para actualizar los parámetros durante el proceso de optimización de SGD. Debido a que el gradiente apunta a la dirección de aumento de la función de pérdida, SGD resta cada gradiente de su respectivo valor de parámetro actual. Podemos pensar en esto como moverse en la dirección opuesta al gradiente para disminuir la función de pérdida. Por lo tanto, el "descenso" en el descenso de gradiente estocástico. Repetimos estos pasos hasta un número fijo de épocas o una vez que la pérdida sea menor que la tolerancia. Esto último significaría que la pérdida apenas está cambiando y ya no estamos mejorando la función objetivo. En otras palabras, nos detenemos una vez que el algoritmo converge.

import numpy as np 
 
def stochastic_gradient_descent(X, y, lr=0.01, epochs=100, tol=1e-6): 
    “”” 
    Perform Stochastic Gradient Descent (SGD) to fit a line y = w*x + b 
     
    Parameters: 
        X (ndarray): Input features 
        y (ndarray): Target values 
        lr (float): Learning rate (step size for updates) 
        epochs (int): Number of iterations through the dataset 
     
    Returns: 
        w (float): Learned weight 
        b (float): Learned bias 
    “”” 
    # Initialize parameters randomly 
    w = np.random.randn() 
    b = np.random.randn() 
     
    n = len(X) 
 
    prev_loss = float(‘inf’) 
     
    for epoch in range(epochs): 
        # Shuffle the data for each epoch 
        indices = np.arange(n) 
        np.random.shuffle(indices) 
         
        for i in indices: 
            xi = X[i] 
            yi = y[i] 
             
            # Prediction 
            y_pred = w * xi + b 
             
            # Compute gradients (derivatives) 
            dw = -2 * xi * (yi - y_pred)   # derivative wrt w 
            db = -2 * (yi - y_pred)        # derivative wrt b 
             
            # Update parameters 
            w -= lr * dw 
            b -= lr * db 
         
        
        # Compute loss at the end of the epoch 
        loss = np.mean((y - (w*X + b))**2) 
         
        # Check stopping condition 
        if abs(prev_loss - loss) < tol: 
            print(f”Stopped early at epoch {epoch+1}”) 
            break 
                 
        prev_loss = loss 
             
    return w, b

Aplicaciones de SGD

SGD es el método de optimización más común para entrenar redes neurales. En el aprendizaje profundo, un subconjunto de machine learning dentro del campo más amplio de la ciencia de datos, el objetivo es que las computadoras simulen el complejo poder de toma de decisiones del cerebro humano. Los modelos tradicionales de ML utilizan redes neuronales simples que constan de una o dos capas. Mientras que los modelos de aprendizaje profundo utilizan tres o más capas. Por lo general, se necesitan cientos o miles de capas para entrenar los modelos. Dada la facilidad de SGD para escalar para grandes conjuntos de entrenamiento, a menudo es el enfoque de referencia para entrenar redes neuronales profundas. Otras aplicaciones del entrenamiento SGD incluyen la regresión de cresta,la regresión logística regularizada y la optimización de la función de pérdida hinge utilizada en máquinas de vectores de soporte (SVM) con un kernel lineal.

Conclusión

SGD es una variante de GD que minimiza la función de pérdida de un modelo de machine learning por el uso de una sola muestra de datos a la vez. Este enfoque es diferente a GD, que depende de todo el conjunto de datos en cada paso para calcular el gradiente. Hay varias otras variantes de GD que se pueden agrupar como métodos de aprendizaje basados en el impulso o adaptativos. El descenso de gradiente de impulso y el gradiente acelerado de Nesterov son ejemplos de lo primero. Estos métodos aprovechan el impulso acumulado en dimensiones con gradientes constantes y amortiguan las actualizaciones en dimensiones con gradientes cambiantes. Por lo tanto, ayudan a SGD a converger más rápido y con menos oscilación. Los métodos de tasa de aprendizaje adaptativo, como AdaGrad y RMSProp, adaptan la tasa de aprendizaje para cada parámetro individualmente, a diferencia del SGD tradicional, que utiliza una tasa de aprendizaje fija. Además, los métodos híbridos como Adam ofrecen una alternativa poderosa al combinar las fortalezas de GD basado en impulso y RMSProp.

Soluciones relacionadas
IBM watsonx.ai

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.

Descubra watsonx.ai
Soluciones de inteligencia artificial

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.

Explore las soluciones de IA
Consultoría y servicios de IA

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.

Conozca los servicios de IA
Dé el siguiente paso

Obtenga acceso único a capacidades que abarcan el ciclo de vida del desarrollo de IA. Produzca potentes soluciones de IA con interfaces fáciles de usar, flujos de trabajo y acceso a API y SDK estándar de la industria.

Explore watsonx.ai Reserve una demostración en vivo
Notas de pie de página

Bottou, L. (2010). Large-Scale Machine Learning with Stochastic Gradient DescentLechevallier, Y., Saporta, G. (eds) Proceedings of COMPSTAT’2010. Physica-Verlag HD. 

Ruder, S. (2016). An overview of gradient descent optimization algorithms

Tian, Y., Zhang, Y., & Zhang, H. (2023). Recent Advances in Stochastic Gradient Descent in Deep LearningMathematics, 11(3), 682. 

Haji, S. H., & Abdulazeez, A. M. (2021). Comparison of optimization techniques based on gradient descent algorithm: A review. PalArch’s Journal of Archaeology of Egypt/Egyptology, 18(4), 2715-2743.

Bottou, L. (2012). Stochastic Gradient Descent TricksMontavon, G., Orr, G.B., Müller, KR. (eds) Neural Networks: Tricks of the Trade. Lecture Notes in Computer Science, vol 7700. Springer, Berlín, Heidelberg.