Skip to content

English · Español

Fase 07 — Autograd escalar desde cero (minigrad.scalar)

Requiere: 04 — Cálculo y optimización para IA · 06 — Python para ingeniería de IA Enseña: autograd · computation-graph · reverse-mode · topological-sort · dag Salta a cualquier capítulo desde el índice de referencia de fases.

Mapa del capítulo

Pre-escrita según LYNX_CORTEX_ADDENDUM.md §A12. Teoría y enunciados de laboratorio pre-escritos; las soluciones se rellenan justo a tiempo en la apertura de fase.

🇪🇸 La idea de retropropagación (backprop), en su forma más pequeña: cada operación entre dos números crea un nodo en un grafo, cada nodo guarda una pequeña función que dice "cómo paso el gradiente a mis padres", y al final recorremos el grafo en orden topológico inverso. Cuando lo construyes a mano para un escalar, PyTorch deja de ser magia.


Objetivo

Construir, a mano, el motor de diferenciación automática más pequeño posible: una clase Value que envuelve un único float de Python, soporta + - * / ** exp log relu tanh, acumula gradientes mediante recorrido topológico inverso y entrena un MLP de 2 capas sobre una tarea microscópica de identidad de tiempo verbal usando solo este motor.

La afirmación pedagógica: si entiendes minigrad.scalar, entiendes la retropropagación para siempre. Todo framework — PyTorch, JAX, TensorFlow — hace fundamentalmente lo mismo al grano de tensor.

Anclaje temático (§A13). Cada ejemplo trabajado usa la rejilla de gramática verbal inglesa: una pérdida como L = sum_i (logit_i - target_i)^2 sobre los 5 tiempos de un verbo (p. ej., work), derivar a mano dL/dlogit_i, ver que coincide con lo que computa el autograd. El código del autograd es agnóstico a la gramática — Value no sabe nada de verbos — pero las demostraciones se anclan en el corpus §A13 para que el tema se repase de forma continua.

Al cierre de fase, Borja tendrá:

  • src/minigrad/scalar.py, ~150 LOC, su propia implementación.
  • Una suite de tests que contrasta cada operación contra PyTorch FP64.
  • Un renderizado de graphviz de un pequeño DAG forward+backward de pérdida de gramática con valores y gradientes anotados.
  • Un MLP de identidad de tiempo verbal entrenado extremo a extremo sin numpy en el núcleo del autograd.

Orden de lectura

  1. theory/00-motivation.md — por qué el autograd escalar es el punto correcto para empezar.
  2. theory/01-computation-graphs.md — qué es un DAG, cómo lo construye el forward pass.
  3. theory/02-op-derivatives.md — derivar a mano la Jacobiana local para cada operación que implementaremos.
  4. theory/03-worked-backprop.md — un ejemplo completo trabajado: forward + backward a mano para una expresión pequeña, luego verificado por diferencias finitas.
  5. theory/04-reverse-mode-vs-forward-mode.md — por qué elegimos reverse-mode para ML (n_outputs << n_inputs).
  6. lab/00-value-skeleton.md — escribir el esqueleto de la clase Value, todavía sin operaciones.
  7. lab/01-implement-ops.md — rellenar + - * / ** exp log relu tanh con sus backwards.
  8. lab/02-train-xor.md (nombre de archivo conservado por historial git; la tarea ahora es identidad de tiempo verbal de 5 vías para un verbo — ver cabecera del lab) — construir un MLP de 2 capas desde neuronas Value y entrenarlo en la tarea de identidad de tiempo verbal de 5 entradas.

solutions/ se rellena en la apertura de fase.

Definición de hecho (DoD)

Ver PHASE_07_PLAN.md §6. Brevemente:

  • src/minigrad/scalar.py pasa mypy --strict, ruff, todos los tests; contrastado contra PyTorch FP64 hasta 1e-9.
  • tests/test_scalar_graph.py cubre dependencias en diamante (un nodo usado en varios cómputos descendientes).
  • experiments/07-train-tense-logits/ muestra pérdida < 0.5 dentro de 300 epochs.
  • experiments/07-visualize-graph/graph.svg commiteado; nodos etiquetados con valor forward y gradiente backward.
  • /quiz 07 ≥ 70%.

Lo que esta fase deliberadamente NO cubre

  • Tensores / NumPy. La Fase 8 lleva todo a arrays NumPy. La Fase 7 es deliberadamente solo-float — añadir broadcasting a la vez que autograd es demasiada complejidad de golpe.
  • GPU. Fase 23+.
  • Derivadas de orden superior. Factibles en este framework (construir un grafo sobre un grafo), pero fuera de alcance; mención solo descriptiva en theory/04.
  • jit / reescritura de grafos. Sin pases de optimización. Pura ejecución eager.
  • Optimizadores como clases. Fase 9. Aquí hacemos a mano p.data -= lr * p.grad en línea dentro del bucle de entrenamiento XOR.
  • Seguridad de producción. Sin clamp de nan, sin recorte de gradientes, sin detach. Estos llegan en la Fase 8 / Fase 18 cuando se ganan su sitio.

El alcance de la Fase 7 es exactamente: DAG + recorrido inverso + regla de la cadena + ~10 operaciones, todo al grano de float. Resiste la expansión de alcance.

Lecturas recomendadas

Opcional — enriquece pero no es necesario para aprobar la fase.