La época de entrenamiento y retropropagación
Combina el forward pass con sigmoide, la función de costo MSE y la regla de la cadena para calcular gradientes y actualizar parámetros sobre un conjunto de datos.
Constrúyelo en tu lenguaje
El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.
Fundamentos: La regla de la cadena y la retropropagación sin miedo
La retropropagaciónAlgoritmo para entrenar redes neuronales que calcula los gradientes de la función de costo respecto a cada parámetro utilizando la regla de la cadenaVer documentación oficial (backpropagation) suele presentarse como algo intimidante, pero su núcleo es una idea intuitiva: rastrear la causa de un error hacia atrás.
Imagina una cadena de engranajes: giras una perilla (peso ), que mueve una rueda (combinación lineal ), que activa una válvula (sigmoide ), que finalmente afecta la presión del sistema (pérdida ). Si la presión final es incorrecta, ¿cuánto debes girar la perilla inicial?
La regla de la cadena del cálculo dice simplemente que multiplicamos las tasas de cambio de cada eslabón de la cadena:
Desglosemos cada eslabón con total claridad:
- Eslabón 1 (¿Cómo cambia la pérdida respecto a la predicción?): Para la pérdida cuadrática individual , su derivada es sencillamente:
- Eslabón 2 (¿Cómo cambia la activación sigmoide respecto a ?): Una de las propiedades matemáticas más hermosas de la función sigmoide es que su derivada se calcula usando su propio valor de salida:
- Eslabón 3 (¿Cómo cambia la suma lineal respecto al peso o al sesgo ?): Como :
Al multiplicar los dos primeros eslabones obtenemos el término de error local :
Y por lo tanto, el gradiente para cada parámetro en una muestra es:
¿Qué es una época (epoch)?
Una época es una pasada completa a través de todos los ejemplos del conjunto de entrenamiento:
- Para cada muestra del lote, calculamos la predicción y acumulamos sus gradientes y su pérdida.
- Al terminar todas las muestras, calculamos el gradiente promedio dividiendo entre el total de muestras .
- Actualizamos los pesos y el sesgo usando la regla de gradiente que programaste en la etapa anterior.
Tu objetivo en esta etapa
Cuando la entrada contenga "op": "train-epoch", procesa:
learning_rate: tasa de aprendizajeweights: lista de pesos actualesbias: sesgo actualsamples: lista de muestras, cada una con formato{"x": [x_1, ..., x_d], "y": y_target}
Algoritmo del bucle paso a paso
- Inicializa
total_loss = 0.0,grad_w = [0.0] * d,grad_b = 0.0. - Para cada muestra
sensamples:- Calcula .
- Calcula .
- Suma a
total_lossla pérdida individual: . - Calcula el delta: .
- Para cada peso : suma en
grad_w[j]. - Suma en
grad_b.
- Calcula el promedio dividiendo entre :
mean_loss = total_loss / Ngrad_w_mean[j] = grad_w[j] / Ngrad_b_mean = grad_b / N
- Actualiza los parámetros:
Dirección de implementación
Separa la acumulación de gradientes de la actualización de parámetros. Comprueba los valores intermedios con el ejemplo numérico. Mantén entrenamiento e inferencia como operaciones distintas; escribe tú los bucles y reutiliza las funciones anteriores.
Reglas de validación y salida
- Si
samplesestá vacío o la dimensión del vectorxde alguna muestra no coincide conweights, emiteerrorenstderry sal con código1. - Redondea todos los flotantes a 4 decimales con
round_value(los enteros o cero se emiten como enteros, ej.0). - Emite el JSON con claves ordenadas alfabéticamente (
"bias","loss","weights"):json { "bias": 0, "loss": 0.125, "weights": [0.0063, -0.0063] }
Aquí la pérdida de entrenamiento es la mitad del MSE de la etapa anterior: 0.5 * mean((prediction - target)^2). El factor 0.5 cancela el factor 2 de la derivada. Mantén toda la precisión durante el cálculo y redondea solo al emitir resultados. En entrenamiento de varias épocas, no reutilices parámetros ya redondeados.
Formato de salida y errores
Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto.
Para entradas inválidas, usa stderr con la palabra error, stdout vacío y código 1. Para entradas válidas, código 0. Usa números JSON enteros cuando el resultado sea entero; en neural-network aplica el redondeo a cuatro decimales indicado en la etapa.