Contenido del curso

Redes neuronales con PyTorch

Bucle de entrenamiento con SGD en PyTorch

Resumen

Entrenar un modelo de regresión lineal en PyTorch implica elegir una función de pérdida, configurar un optimizador y construir un bucle de entrenamiento que actualice los parámetros con cada época. Si estás dando tus primeros pasos en deep learning, este flujo te servirá como base para modelos más complejos.

La idea es simple: defines cómo medir el error, escoges un algoritmo que ajuste los pesos y dejas que el modelo aprenda iterando sobre los datos. PyTorch te entrega los bloques listos a través de torch.nn y torch.optim.

Qué función de pérdida usar para regresión lineal

La función de pérdida es la fórmula que mide qué tan lejos están tus predicciones de los valores reales. En PyTorch tienes acceso a un catálogo amplio dentro del módulo nn, y la documentación oficial muestra la definición matemática, los parámetros y ejemplos de uso de cada una.

Para este caso usamos torch.nn.L1Loss, también conocida como Mean Absolute Error (MAE). Funciona muy bien con datos tabulares, una X y una Y claras, y valores continuos como los que tenemos aquí [02:55].

¿Qué es L1Loss en PyTorch? Es una función de pérdida que calcula el promedio de la diferencia absoluta entre las predicciones y los valores reales. Se usa comúnmente en problemas de regresión con valores continuos.

python fn_perdida = torch.nn.L1Loss()

Por qué importa elegir bien la pérdida

La función de pérdida define qué significa "mejorar" para tu modelo. Si la eliges mal, el modelo puede entrenar bien numéricamente pero resolver el problema equivocado. Por eso vale la pena revisar la documentación antes de comprometerte con una sola opción.

Cómo configurar el optimizador SGD y la tasa de aprendizaje

El optimizador es el algoritmo que ajusta los pesos del modelo en cada paso. Aquí usamos Stochastic Gradient Descent (SGD) desde torch.optim, porque es el más típico y un buen punto de partida [03:35].

El SGD necesita dos cosas: los parámetros que va a optimizar y una tasa de aprendizaje (learning rate). La tasa de aprendizaje controla qué tan agresivo es cada cambio.

  • Si es muy alta, el modelo da saltos grandes y puede salirse del mínimo que buscas.
  • Si es muy baja, el modelo mejora lento y tal vez no llegue a tiempo.
  • Una buena práctica es comenzar con 0.01 y experimentar desde ahí.

python optimizador = torch.optim.SGD(params=model_1.parameters(), lr=0.01)

¿Qué es la tasa de aprendizaje? Es un hiperparámetro que define cuánto cambian los pesos del modelo en cada actualización del gradiente. Valores típicos arrancan en 0.01 y se ajustan por prueba y error.

La tasa de aprendizaje y el número de épocas son hiperparámetros, no se aprenden: tú los defines y los ajustas según el comportamiento del modelo.

Cuáles son los pasos del bucle de entrenamiento en PyTorch

Antes de entrenar, fijamos la semilla con torch.manual_seed(42) para obtener resultados reproducibles, definimos epocas = 100 y creamos dos listas vacías para registrar la pérdida de entrenamiento y la de prueba en cada vuelta [05:20].

Una época es una pasada completa por los datos de entrenamiento. Con 100 épocas, el modelo verá los datos cien veces y ajustará sus pesos en cada una.

Los cinco pasos dentro de cada época

Dentro del bucle for epoca in range(epocas), el entrenamiento sigue una secuencia fija que conviene memorizar:

  1. Pon el modelo en modo entrenamiento con model_1.train(). Esto activa el cálculo de gradientes.
  2. Calcula la predicción con y_pred = model_1(X_train). Internamente PyTorch ejecuta el método forward.
  3. Calcula la pérdida comparando predicción contra valores reales: perdida = fn_perdida(y_pred, y_train).
  4. Reinicia los gradientes con optimizador.zero_grad(). Si no lo haces, los gradientes se acumulan de épocas anteriores y contaminan el cálculo.
  5. Ejecuta perdida.backward() para calcular los nuevos gradientes vía retropropagación, y luego optimizador.step() para que el SGD aplique la actualización a los pesos.

python model_1.train() y_pred = model_1(X_train) perdida = fn_perdida(y_pred, y_train) optimizador.zero_grad() perdida.backward() optimizador.step()

El paso backward saca la derivada de la pérdida respecto a los parámetros: te dice si la pérdida sube o baja cuando mueves cada peso. El step usa esa información junto con la tasa de aprendizaje para acercarte a un punto donde la pérdida sea menor [08:10].

Cómo evaluar el modelo en cada época

Después de entrenar, cambias el modelo a modo evaluación con model_1.eval(). En este modo ya no se calculan gradientes, solo haces inferencia [09:15].

  • Generas predicciones con los datos de prueba: prueba_pred = model_1(X_test).
  • Calculas la pérdida en prueba comparando contra y_test.
  • Conviertes los tensores a float para prevenir errores de tipo de datos.

python model_1.eval() prueba_pred = model_1(X_test) perdida_prueba = fn_perdida(prueba_pred, y_test.type(torch.float))

¿Por qué separar entrenamiento y evaluación? Porque en entrenamiento el modelo ajusta pesos usando los datos vistos, mientras que en evaluación mides su desempeño en datos nuevos para detectar si está generalizando o memorizando.

Con estas dos pérdidas guardadas por época, tendrás insumos para graficar cómo desciende el error en entrenamiento y prueba, y detectar si tu modelo está aprendiendo de forma sana o si necesita ajustes en la tasa de aprendizaje, el número de épocas o incluso la función de pérdida.

¿Qué hiperparámetros has tenido que ajustar más en tus propios entrenamientos? Cuéntame en los comentarios.