descenso de gradiente primario

Descenso de gradiente: una introducción a 1 de los algoritmos más populares del aprendizaje automático

Eche un vistazo de alto nivel al descenso de gradiente, uno de los algoritmos más populares de ML

El descenso de gradiente es, con mucho, la estrategia de optimización más popular utilizada en  el aprendizaje automático y el aprendizaje profundo en este momento. Se utiliza cuando se entrenan modelos de datos, se puede combinar con todos los algoritmos y es fácil de entender e implementar. Todos los que trabajan con aprendizaje automático deben comprender su concepto. Veremos cómo funciona el descenso de gradiente, qué tipos se usan hoy en día y sus ventajas y desventajas.

Tabla de contenido

  • Introducción
  • ¿Qué es un gradiente?
  • Cómo funciona el descenso de gradiente
  • Tasa de aprendizaje
  • Cómo asegurarse de que funciona correctamente
  • Tipos de descenso de gradiente: batch, estocástico, mini-batch

Introducción al descenso de gradiente

El descenso de gradiente es un algoritmo de optimización que se usa cuando se entrena un modelo de aprendizaje automático. Se basa en una función convexa y modifica sus parámetros de forma iterativa para minimizar una función dada a su mínimo local.

¿Qué es el descenso de gradiente?

Gradient Descent es un algoritmo de optimización para encontrar un mínimo local de una función diferenciable. El descenso de gradiente se usa simplemente en el aprendizaje automático para encontrar los valores de los parámetros de una función (coeficientes) que minimizan una función de costo en la medida de lo posible.

Comienza definiendo los valores de los parámetros iniciales y, a partir de ahí, el descenso de gradiente usa el cálculo para ajustar iterativamente los valores para que minimicen la función de costo dada. Para comprender este concepto en su totalidad, es importante conocer los gradientes. 

¿Qué es un gradiente?

«Un gradiente mide cuánto cambia la salida de una función si cambias un poco las entradas». —Lex Fridman (MIT)

Un gradiente simplemente mide el cambio en todos los pesos con respecto al cambio en el error. También puedes pensar en un gradiente como la pendiente de una función. Cuanto mayor sea el gradiente, más pronunciada será la pendiente y más rápido podrá aprender un modelo. Pero si la pendiente es cero, el modelo deja de aprender. En términos matemáticos, un gradiente es una derivada parcial con respecto a sus entradas.

¿Qué es un gradiente?

En el aprendizaje automático, un gradiente es una derivada de una función que tiene más de una variable de entrada. Conocido como la pendiente de una función en términos matemáticos, el gradiente simplemente mide el cambio en todos los pesos con respecto al cambio en el error.

montaña de descenso de gradiente

Imagine un hombre con los ojos vendados que quiere subir a la cima de una colina con la menor cantidad de pasos posible en el camino. Podría comenzar a subir la colina dando pasos realmente grandes en la dirección más empinada, lo que puede hacer siempre que no esté cerca de la cima. Sin embargo, a medida que se acerca a la cima, sus pasos se hacen cada vez más pequeños para evitar sobrepasarlo. Este proceso se puede describir matemáticamente usando el gradiente.

Imagina que la imagen a continuación ilustra nuestra colina desde una vista de arriba hacia abajo y las flechas rojas son los pasos de nuestro escalador. Piense en un gradiente en este contexto como un vector que contiene la dirección del paso más empinado que puede dar el hombre con los ojos vendados y también cuánto debe durar ese paso.

rango de descenso de gradiente

Tenga en cuenta que el gradiente que va de X0 a X1 es mucho más largo que el que va de X3 a X4. Esto se debe a que la inclinación/pendiente de la colina, que determina la longitud del vector, es menor. Esto representa perfectamente el ejemplo de la colina porque la colina se vuelve menos empinada a medida que se sube. Por lo tanto, una pendiente reducida va acompañada de una pendiente reducida y un tamaño de paso reducido para el escalador.

Cómo funciona el descenso de gradiente

En lugar de escalar una colina, piense en el descenso de pendientes como caminar hasta el fondo de un valle. Esta es una mejor analogía porque es un algoritmo de minimización que minimiza una función dada.

La siguiente ecuación describe lo que hace el descenso de gradiente: b  es la siguiente posición de nuestro escalador, mientras que a  representa su posición actual. El signo menos se refiere a la parte de minimización del descenso de gradiente. La gamma en el medio es un factor de espera y el término de gradiente ( Δf(a) ) es simplemente la dirección del descenso más pronunciado.

ecuación de descenso de gradiente

Entonces, esta fórmula básicamente nos dice la siguiente posición a la que debemos ir, que es la dirección del descenso más pronunciado. Veamos otro ejemplo para realmente llevar el concepto a casa. 

Imagine que tiene un problema de aprendizaje automático y desea entrenar su algoritmo con descenso de gradiente para minimizar su función de costo J ( w , b ) y alcanzar su mínimo local ajustando sus parámetros ( w y b ). La siguiente imagen muestra que los ejes horizontales representan los parámetros ( w y b ), mientras que la función de costo J ( w , b ) está representada en los ejes verticales. El descenso de gradiente es una función convexa.

función convexa de descenso de gradiente

Sabemos que queremos encontrar los valores de w  y b  que corresponden al mínimo de la función de costo (marcada con la flecha roja). Para comenzar a encontrar los valores correctos, inicializamos w  y b  con algunos números aleatorios. Luego, el descenso de gradiente comienza en ese punto (alrededor de la parte superior de nuestra ilustración), y da un paso tras otro en la dirección descendente más pronunciada (es decir, desde la parte superior hasta la parte inferior de la ilustración) hasta que alcanza el punto donde el costo función es lo más pequeña posible.

Importancia de la Tasa de Aprendizaje

El tamaño de los pasos que toma el descenso de gradiente en la dirección del mínimo local está determinado por la tasa de aprendizaje, que calcula qué tan rápido o lento nos moveremos hacia los pesos óptimos.

Para que el gradiente de descenso alcance el mínimo local, debemos establecer la tasa de aprendizaje en un valor adecuado, que no sea ni demasiado bajo ni demasiado alto. Esto es importante porque si los pasos que da son demasiado grandes, es posible que no alcance el mínimo local porque rebota de un lado a otro entre la función convexa del descenso de gradiente (vea la imagen de la izquierda a continuación). Si configuramos la tasa de aprendizaje en un valor muy pequeño, el descenso del gradiente finalmente alcanzará el mínimo local, pero eso puede llevar un tiempo (ver la imagen de la derecha). 

tasa de aprendizaje de descenso de gradiente

Por lo tanto, la tasa de aprendizaje nunca debe ser demasiado alta o demasiado baja por este motivo. Puede verificar si su tasa de aprendizaje está funcionando bien trazándola en un gráfico.

Cómo asegurarse de que funciona correctamente

Una buena manera de asegurarse de que el descenso de gradiente se ejecute correctamente es trazar la función de costo a medida que se ejecuta la optimización. Coloque el número de iteraciones en el eje x y el valor de la función de costo en el eje y. Esto lo ayuda a ver el valor de su función de costo después de cada iteración de descenso de gradiente y proporciona una manera de detectar fácilmente qué tan apropiada es su tasa de aprendizaje. Simplemente puede probar diferentes valores para él y trazarlos todos juntos. La imagen de la izquierda a continuación muestra un gráfico de este tipo, mientras que la imagen de la derecha ilustra la diferencia entre las tasas de aprendizaje buenas y malas.

gráfico de tasa de aprendizaje de descenso de gradiente

Si el descenso de gradiente funciona correctamente, la función de costo debería disminuir después de cada iteración.

Cuando el descenso de gradiente ya no puede disminuir la función de costo y permanece más o menos en el mismo nivel, ha convergido. El número de iteraciones que necesita el descenso de gradiente para converger a veces puede variar mucho. Puede tomar 50 iteraciones, 60 000 o tal vez incluso 3 millones, lo que hace que la cantidad de iteraciones para la convergencia sea difícil de estimar por adelantado.

Hay algunos algoritmos que pueden decirle automáticamente si el descenso de gradiente ha convergido, pero debe definir un umbral para la convergencia de antemano, que también es bastante difícil de estimar. Por esta razón, las gráficas simples son la prueba de convergencia preferida.

Otra ventaja de monitorear el descenso de gradiente a través de gráficos es que nos permite detectar fácilmente si no funciona correctamente, por ejemplo, si la función de costo está aumentando. La mayoría de las veces, la razón de una función de costo creciente cuando se usa el descenso de gradiente es una tasa de aprendizaje que es demasiado alta. 

Si la gráfica muestra la curva de aprendizaje subiendo y bajando, sin llegar realmente a un punto más bajo, intente disminuir la tasa de aprendizaje. Además, cuando comience con el descenso de gradiente en un problema dado, simplemente intente 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, etc., como tasas de aprendizaje y observe cuál funciona mejor.

Este video introductorio al descenso de gradiente ayuda a explicar uno de los algoritmos más útiles del aprendizaje automático.

Tipos de descenso de gradiente

Hay tres tipos populares de descenso de gradiente que difieren principalmente en la cantidad de datos que utilizan: 

Descenso de gradiente por lotes

El descenso de gradiente por lotes, también llamado descenso de gradiente de vainilla, calcula el error para cada ejemplo dentro del conjunto de datos de entrenamiento, pero solo después de que se hayan evaluado todos los ejemplos de entrenamiento, el modelo se actualiza. Todo este proceso es como un ciclo y se llama época de entrenamiento.

Algunas ventajas del descenso de gradiente por lotes son su eficiencia computacional, produce un gradiente de error estable y una convergencia estable. Algunas desventajas son que el gradiente de error estable a veces puede dar como resultado un estado de convergencia que no es el mejor que puede lograr el modelo. También requiere que todo el conjunto de datos de entrenamiento esté en la memoria y disponible para el algoritmo.

Descenso de gradiente estocástico

Por el contrario, el descenso de gradiente estocástico (SGD) hace esto para cada ejemplo de entrenamiento dentro del conjunto de datos, lo que significa que actualiza los parámetros para cada ejemplo de entrenamiento uno por uno. Dependiendo del problema, esto puede hacer que SGD sea más rápido que el descenso de gradiente por lotes. Una ventaja es que las actualizaciones frecuentes nos permiten tener una tasa de mejora bastante detallada.

Sin embargo, las actualizaciones frecuentes son más costosas desde el punto de vista computacional que el enfoque de descenso de gradiente por lotes. Además, la frecuencia de esas actualizaciones puede generar gradientes ruidosos, lo que puede hacer que la tasa de error salte en lugar de disminuir lentamente.

Descenso de gradiente de mini lotes

El descenso de gradiente de minilotes es el método de referencia, ya que es una combinación de los conceptos de SGD y el descenso de gradientes de lotes. Simplemente divide el conjunto de datos de entrenamiento en lotes pequeños y realiza una actualización para cada uno de esos lotes. Esto crea un equilibrio entre la solidez del descenso de gradiente estocástico y la eficiencia del descenso de gradiente por lotes.

Los tamaños comunes de mini lotes oscilan entre 50 y 256, pero como cualquier otra técnica de aprendizaje automático, no existe una regla clara porque varía según las diferentes aplicaciones. Este es el algoritmo de referencia cuando se entrena una red neuronal y es el tipo más común de descenso de gradiente dentro del aprendizaje profundo.

Relacionado: Leer más sobre ciencia de datos