Entrenamiento convergente e inferencia
Entrena los pesos y el sesgo durante múltiples épocas para aprender patrones lógicos y clasificar nuevas entradas.
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 culminación: De ceros a un modelo inteligente
Has construido cada pieza fundamental de la inteligencia artificial moderna:
- La neurona lineal: Realiza la suma ponderada de estímulos.
- La función de activación: Comprime la salida en una probabilidad no lineal .
- La función de pérdida: Mide con rigor cuánto se equivoca el modelo.
- El paso de optimización: Da pasos en la ladera descendente del error.
- La época de entrenamiento: Aplica la regla de la cadena para calcular gradientes sobre todo el conjunto de datos.
En esta etapa final, unirás todas las piezas para construir el ciclo completo de entrenamiento e inferenciaFase donde un modelo ya entrenado procesa datos nunca antes vistos para tomar decisionesVer documentación oficial.
El problema: Enseñar lógica booleana a una neurona
Imagina la tabla de verdad de la compuerta lógica AND:
- Entradas
- Entradas
- Entradas
- Entradas
Al inicio, inicializamos los pesos en () y el sesgo en (). Con estos valores iniciales, la neurona no sabe nada: para cualquier entrada calcula y su sigmoide arroja (máxima incertidumbre).
Pero a medida que el bucle ejecuta 200 épocas de optimización:
- En cada época, la red calcula sus errores frente a la tabla de verdad.
- La retropropagación calcula los gradientes promedio.
- Los pesos aumentan progresivamente mientras el sesgo se vuelve negativo.
- Al final del entrenamiento, los parámetros han convergido a un estado donde la suma ponderada solo supera el umbral cuando ambas entradas están activas.
¡Acabas de entrenar a una máquina para aprender una regla lógica a partir de datos!
Tu objetivo en esta etapa
Cuando la entrada contenga "op": "train-and-predict", tu programa debe leer:
epochs: cantidad de épocas completas a iterar (entero positivo)learning_rate: tasa de aprendizajesamples: conjunto de datos de entrenamiento con pares{"x": [...], "y": 0 o 1}test_inputs: lista de vectores de entrada a clasificar tras el entrenamiento
Procedimiento paso a paso
-
Inicialización:
- Determina la dimensión observando la longitud de
samples[0]["x"]. - Inicializa los pesos con ceros:
weights = [0.0] * d. - Inicializa el sesgo en cero:
bias = 0.0. - Total de muestras: .
- Determina la dimensión observando la longitud de
-
Bucle de entrenamiento (ejecutar
epochsveces):- Inicializa acumuladores de gradientes:
grad_w = [0.0] * dygrad_b = 0.0. - Para cada muestra en
samples:- .
- .
- .
- Acumula en
grad_w[j] += delta * s.x[j]ygrad_b += delta.
- Actualiza los pesos y el sesgo restando la media del gradiente multiplicada por
learning_rate:
- Inicializa acumuladores de gradientes:
-
Fase de inferencia:
- Para cada vector en
test_inputs:- Evalúa la neurona con los pesos y el sesgo aprendidos:
- Emite la clase predicha con el umbral estándar de decisión:
- Para cada vector en
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.
Lección de ingeniería de ML
Observa cómo las fases están nítidamente separadas:
- Entrenamiento: Se modifican los pesos mediante gradientes usando las etiquetas reales
y. - Inferencia: Los pesos quedan congelados (frozen weights) y el modelo solo hace predicciones hacia adelante sobre nuevas entradas sin calcular derivadas ni conocer la respuesta correcta.
Reglas de validación y salida
- Si
samplesestá vacío oepochs <= 0, escribeerrorenstderry termina con código1. - Emite un objeto JSON con la lista de enteros predichos:
json { "predictions": [0, 0, 0, 1] }
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.