IA 101

¿Qué es el Descenso de Gradiente?

mm

¿Qué es el Descenso de Gradiente?

Si has leído sobre cómo se entrenan las redes neuronales, casi con certeza has encontrado el término “descenso de gradiente” antes. El descenso de gradiente es el método principal para optimizar el rendimiento de una red neuronal, reduciendo la tasa de error/pérdida de la red. Sin embargo, el descenso de gradiente puede ser un poco difícil de entender para aquellos que son nuevos en el aprendizaje automático, y este artículo intentará darte una intuición decente de cómo funciona el descenso de gradiente.

El descenso de gradiente es un algoritmo de optimización. Se utiliza para mejorar el rendimiento de una red neuronal realizando ajustes en los parámetros de la red de tal manera que la diferencia entre las predicciones de la red y los valores reales/esperados de la red (denominados pérdida) sea lo más pequeña posible. El descenso de gradiente toma los valores iniciales de los parámetros y utiliza operaciones basadas en cálculo para ajustar sus valores hacia los valores que harán que la red sea lo más precisa posible. No necesitas conocer mucho cálculo para entender cómo funciona el descenso de gradiente, pero debes tener una comprensión de las gradientes.

¿Qué son las Gradientes?

Supongamos que hay un gráfico que representa la cantidad de error que comete una red neuronal. La parte inferior del gráfico representa los puntos de menor error, mientras que la parte superior es donde el error es mayor. Queremos movernos desde la parte superior del gráfico hacia abajo. Una gradiente es solo una forma de cuantificar la relación entre el error y los pesos de la red neuronal. La relación entre estas dos cosas puede graficarse como una pendiente, con pesos incorrectos que producen más error. La inclinación de la pendiente/gradiente representa lo rápido que el modelo está aprendiendo.

Una pendiente más pronunciada significa que se están realizando reducciones grandes en el error y el modelo está aprendiendo rápido, mientras que si la pendiente es cero, el modelo está en un platillo y no está aprendiendo. Podemos movernos hacia abajo por la pendiente hacia menos error calculando una gradiente, una dirección de movimiento (cambio en los parámetros de la red) para nuestro modelo.

Vamos a cambiar ligeramente la metáfora y a imaginar una serie de colinas y valles. Queremos llegar al fondo del valle y encontrar la parte del valle que representa la pérdida más baja. Cuando empezamos en la parte superior de la colina, podemos dar pasos grandes hacia abajo y estar seguros de que nos dirigimos hacia el punto más bajo del valle.

Sin embargo, a medida que nos acercamos al punto más bajo del valle, nuestros pasos deben volverse más pequeños, o de lo contrario podríamos sobrepasar el punto real de menor pérdida y terminar en el otro lado. De manera similar, es posible que al ajustar los pesos de la red, los ajustes puedan alejarla realmente del punto de menor pérdida, y por lo tanto los ajustes deben volverse más pequeños con el tiempo. En el contexto de descender una colina hacia un punto de menor pérdida, la gradiente es un vector/instrucciones que detallan el camino que debemos tomar y cuán grandes deben ser nuestros pasos.

Ahora que sabemos que las gradientes son instrucciones que nos dicen hacia dónde movernos (qué coeficientes deben actualizarse) y cuán grandes deben ser nuestros pasos (cuánto deben actualizarse los coeficientes), podemos explorar cómo se calcula la gradiente.

Cálculo de Gradientes y Descenso de Gradiente

El descenso de gradiente comienza en un lugar de alta pérdida y, a través de múltiples iteraciones, da pasos en la dirección de menor pérdida, con el objetivo de encontrar la configuración óptima de pesos. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

Para llevar a cabo el descenso de gradiente, primero debemos calcular las gradientes. Para calcular la gradiente, necesitamos conocer la función de pérdida/costo. Utilizaremos la función de costo para determinar la derivada. En cálculo, la derivada se refiere simplemente a la pendiente de una función en un punto determinado, así que básicamente estamos calculando la pendiente de la colina en función de la función de pérdida. Determinamos la pérdida ejecutando los coeficientes a través de la función de pérdida. Si representamos la función de pérdida como “f”, entonces podemos establecer que la ecuación para calcular la pérdida es la siguiente (estamos ejecutando los coeficientes a través de nuestra función de costo elegida):

Pérdida = f(coeficiente)

Luego calculamos la derivada, o determinamos la pendiente. Obtener la derivada de la pérdida nos dirá hacia dónde es hacia abajo en la pendiente, al darnos el signo apropiado para ajustar nuestros coeficientes. Representaremos la dirección apropiada como “delta”.

delta = función_derivada(pérdida)

Hemos determinado hacia dónde es hacia abajo en la pendiente hacia el punto de menor pérdida. Esto significa que podemos actualizar los coeficientes en los parámetros de la red neuronal y esperar reducir la pérdida. Actualizaremos los coeficientes en función de los coeficientes anteriores menos el cambio apropiado en valor, según la dirección (delta) y un argumento que controla la magnitud del cambio (el tamaño de nuestro paso). El argumento que controla el tamaño de la actualización se llama “tasa de aprendizaje” y lo representaremos como “alfa”.

coeficiente = coeficiente – (alfa * delta)

Luego simplemente repetimos este proceso hasta que la red haya convergido alrededor del punto de menor pérdida, que debería estar cerca de cero.

Es muy importante elegir el valor correcto para la tasa de aprendizaje (alfa). El valor elegido para la tasa de aprendizaje debe ser ni demasiado pequeño ni demasiado grande. Recuerda que a medida que nos acercamos al punto de menor pérdida, nuestros pasos deben volverse más pequeños, o de lo contrario podríamos sobrepasar el punto real de menor pérdida y terminar en el otro lado. El punto de menor pérdida es pequeño y si nuestra tasa de cambio es demasiado grande, el error puede aumentar nuevamente. Si los tamaños de los pasos son demasiado grandes, el rendimiento de la red seguirá saltando alrededor del punto de menor pérdida, sobrepasándolo en un lado y luego en el otro. Si esto sucede, la red nunca convergerá en la configuración óptima de pesos.

En contraste, si la tasa de aprendizaje es demasiado pequeña, la red puede tardar un tiempo extraordinariamente largo en converger en los pesos óptimos.

Tipos de Descenso de Gradiente

Ahora que entendemos cómo funciona el descenso de gradiente en general, veamos algunos de los tipos de descenso de gradiente.

Descenso de Gradiente por Lotes: Esta forma de descenso de gradiente procesa todas las muestras de entrenamiento antes de actualizar los coeficientes. Este tipo de descenso de gradiente es probablemente el más eficiente computacionalmente, ya que los pesos solo se actualizan una vez que se ha procesado todo el lote, lo que significa que hay menos actualizaciones en total. Sin embargo, si el conjunto de datos contiene un gran número de ejemplos de entrenamiento, el descenso de gradiente por lotes puede hacer que el entrenamiento tarde mucho tiempo.

Descenso de Gradiente Estocástico: En el descenso de gradiente estocástico, solo se procesa un ejemplo de entrenamiento por cada iteración del descenso de gradiente y la actualización de parámetros. Esto ocurre para cada ejemplo de entrenamiento. Debido a que solo se procesa un ejemplo de entrenamiento antes de que se actualicen los parámetros, tiende a converger más rápido que el descenso de gradiente por lotes, ya que las actualizaciones se realizan antes. Sin embargo, debido a que el proceso debe realizarse en cada elemento del conjunto de entrenamiento, puede tardar mucho tiempo en completarse si el conjunto de datos es grande, y por lo tanto se prefiere usar uno de los otros tipos de descenso de gradiente.

Descenso de Gradiente por Minilotes: El descenso de gradiente por minilotes opera dividiendo el conjunto de entrenamiento completo en subsecciones. Crea minilotes más pequeños que se procesan en la red, y cuando se ha utilizado el minilote para calcular el error, se actualizan los coeficientes. El descenso de gradiente por minilotes encuentra un punto medio entre el descenso de gradiente estocástico y el descenso de gradiente por lotes. El modelo se actualiza con más frecuencia que en el caso del descenso de gradiente por lotes, lo que significa una convergencia ligeramente más rápida y robusta en los parámetros óptimos del modelo. También es más eficiente computacionalmente que el descenso de gradiente estocástico

Bloguero y programador con especialidades en Machine Learning y Deep Learning temas. Daniel espera ayudar a otros a utilizar el poder de la IA para el bien social.