En el tema anterior vimos que la función de pérdida nos dice qué tan equivocada está una red neuronal. Pero todavía falta responder una pregunta fundamental: ¿cómo usa la red esa información para mejorar?
La respuesta está en uno de los algoritmos más importantes del aprendizaje automático: el descenso del gradiente, o Gradient Descent.
Este algoritmo permite ajustar los parámetros del modelo, como pesos y bias, para que la pérdida sea cada vez menor. En otras palabras, es uno de los mecanismos centrales que hacen posible el aprendizaje en Deep Learning.
Una red neuronal tiene muchos parámetros. Al comienzo del entrenamiento, esos parámetros suelen tener valores aleatorios, por lo que la red comete errores importantes. El objetivo es encontrar mejores valores para esos parámetros de modo que la pérdida disminuya.
Podemos pensar esto como un problema de optimización:
El descenso del gradiente es justamente un procedimiento para acercarse a esa solución.
Una forma muy útil de entender el descenso del gradiente es imaginar un paisaje con montañas y valles. Supongamos que estás parado en una ladera y quieres llegar al punto más bajo del terreno.
Si pudieras mirar a tu alrededor y detectar hacia dónde el terreno desciende más, entonces podrías dar un pequeño paso en esa dirección. Si repites este proceso muchas veces, poco a poco bajarás hacia una zona más baja.
En esta analogía:
Para saber hacia dónde bajar, el algoritmo necesita una medida de la pendiente. Esa medida es el gradiente.
El gradiente indica cómo cambia la función de pérdida cuando cambian los parámetros del modelo. Más precisamente, nos dice:
Como nosotros queremos reducir la pérdida, en lugar de movernos en la dirección del gradiente, nos movemos en la dirección contraria. Por eso se llama descenso del gradiente.
El algoritmo sigue una lógica repetitiva muy simple:
Con cada iteración, si todo funciona bien, la pérdida debería ir disminuyendo.
La regla de actualización del descenso del gradiente puede escribirse de manera conceptual así:
Esto significa que tomamos el valor actual del parámetro y le restamos una fracción del gradiente.
Esa fracción depende de un valor muy importante llamado tasa de aprendizaje.
La tasa de aprendizaje, o learning rate, controla el tamaño del paso que damos en cada actualización.
Si la tasa de aprendizaje es muy grande:
Si la tasa de aprendizaje es muy pequeña:
Elegir una buena tasa de aprendizaje es una de las decisiones más importantes del entrenamiento.
Volvamos a la analogía de la montaña. Si das pasos demasiado grandes, puedes saltar de un lado al otro del valle sin estabilizarte. Si das pasos demasiado pequeños, bajarás con mucha lentitud.
La tasa de aprendizaje determina el equilibrio entre avanzar rápido y avanzar con estabilidad.
Imaginemos un caso muy simple con un solo parámetro. La función de pérdida depende solo de ese parámetro. En cada paso:
Así vamos acercándonos a una zona donde la pendiente es pequeña y la pérdida es menor.
En redes neuronales reales no hay un solo parámetro, sino miles o millones. Por eso, la optimización ocurre en un espacio de muchas dimensiones.
Aunque esto no puede visualizarse fácilmente, la idea sigue siendo la misma:
El principio matemático es el mismo, aunque el problema sea mucho más grande.
El descenso del gradiente no resuelve todo en un solo paso. El aprendizaje ocurre de manera gradual y repetitiva.
En cada iteración del entrenamiento:
Después de muchas iteraciones, el modelo suele mejorar sus predicciones.
En teoría, el descenso del gradiente busca un mínimo de la pérdida. En la práctica, no siempre llega al mínimo global perfecto, y eso no necesariamente es un problema.
En muchos casos basta con encontrar una región donde la pérdida sea suficientemente baja y el modelo generalice bien.
El objetivo práctico no es la perfección matemática absoluta, sino un modelo útil y estable.
En una función compleja pueden existir varios puntos bajos. El más bajo de todos se llama mínimo global. Otros puntos bajos, pero no los mejores posibles, se llaman mínimos locales.
En teoría, un algoritmo de optimización puede quedar atrapado en un mínimo local. En redes neuronales profundas la situación es más compleja, pero esta idea sigue siendo útil para entender que la optimización no siempre encuentra la solución ideal absoluta.
Una forma de aplicar el algoritmo es calcular la pérdida y el gradiente usando todo el conjunto de entrenamiento a la vez. Esto se conoce como Batch Gradient Descent.
Ventajas:
Desventajas:
Otra opción es actualizar los parámetros usando un solo ejemplo a la vez. Esto se conoce como Stochastic Gradient Descent, o SGD.
Ventajas:
Desventajas:
Aun así, SGD y sus variantes son extremadamente importantes en Deep Learning.
En la práctica, la estrategia más usada suele ser un punto intermedio: el mini-batch gradient descent. En lugar de usar todo el dataset o un solo ejemplo, se usan pequeños lotes de datos.
Esto combina ventajas de los dos enfoques anteriores:
Por eso, cuando entrenamos modelos modernos, normalmente trabajamos con batches de tamaño intermedio.
Conviene conectar este tema con otros conceptos del entrenamiento:
Durante cada época, el descenso del gradiente realiza muchas actualizaciones, una por cada batch procesado.
Si la tasa de aprendizaje es excesiva, el algoritmo puede volverse inestable. En lugar de acercarse al mínimo, puede:
En estos casos, el entrenamiento puede fallar o producir resultados erráticos.
Si la tasa de aprendizaje es demasiado pequeña, el algoritmo puede mejorar, pero de manera muy lenta. El entrenamiento puede requerir mucho tiempo para llegar a una solución útil.
En problemas grandes, esto puede volver el proceso poco práctico.
Podemos pensar el descenso del gradiente como un estudiante que ajusta su método de estudio según los errores de un examen de práctica.
Si cambia demasiado, puede perder lo que ya funcionaba. Si cambia demasiado poco, tardará mucho en mejorar. La clave está en ajustar con criterio.
Es importante diferenciar dos conceptos que suelen aparecer juntos:
Es decir:
Ambos trabajan juntos durante el entrenamiento.
Aunque el descenso del gradiente básico es la idea central, en la práctica suelen usarse versiones mejoradas llamadas optimizadores. Algunos muy conocidos son:
Estos métodos agregan mejoras para hacer el aprendizaje más estable o más rápido. Sin embargo, todos parten de la idea básica de moverse en dirección opuesta al gradiente.
La razón principal es que ofrece una forma sistemática de mejorar gradualmente los parámetros del modelo usando información local de la pérdida.
No necesita conocer toda la estructura del problema de una sola vez. Le basta con saber, en cada punto, hacia dónde conviene moverse para bajar.
Esa simplicidad, combinada con el poder del cálculo diferencial y el cómputo moderno, lo convirtió en una de las bases del Deep Learning.
Aunque es muy poderoso, el descenso del gradiente no es mágico. Algunas dificultades prácticas incluyen:
Por eso suelen usarse estrategias complementarias y optimizadores más avanzados.
En PyTorch, el descenso del gradiente y sus variantes se implementan mediante optimizadores. Más adelante usaremos componentes como:
torch.optim.SGDtorch.optim.AdamEstos optimizadores automatizan la actualización de parámetros a partir de los gradientes calculados durante el entrenamiento.
Podemos resumir el papel del descenso del gradiente dentro del entrenamiento así:
Este ciclo se repite una y otra vez hasta que el modelo mejora lo suficiente.
El descenso del gradiente es uno de los pilares del entrenamiento de redes neuronales. Gracias a él, la red puede usar la información que aporta la función de pérdida para corregirse de manera progresiva.
Entender este algoritmo es fundamental porque conecta la noción de error con la mejora real del modelo. El siguiente paso natural será profundizar en cómo se calculan esos gradientes de manera eficiente mediante backpropagation.