Inicio · Parte 15 — Matemática de Deep Learning
cada operación es un nodo; cada dependencia, una arista
orden topológico inverso para el paso hacia atrás
nodo con k consumos: dL/dv = Σ de las k contribuciones
Representar una expresión como grafo —nodos para las operaciones, aristas para las dependencias— convierte la derivación en un procedimiento mecánico. Cada tipo de nodo sabe derivar su operación local, y la regla de la cadena encadena esas derivadas locales a lo largo del grafo.
La regla que genera más errores al implementar autodiferenciación a mano es la acumulación. Si una variable se usa en varios sitios, su gradiente total es la suma de las contribuciones de todos sus consumos, no la última calculada. Sobrescribir en vez de sumar produce gradientes silenciosamente incorrectos, y el entrenamiento simplemente converge peor sin dar ningún error.
El ejemplo mínimo lo muestra: en y = x² + x, la variable x alimenta dos ramas. La derivada es 2x + 1, que es exactamente la suma de las dos contribuciones. Si solo se tomara una, el gradiente sería 2x o 1, y ambos son incorrectos.
Esa misma regla explica un detalle práctico de PyTorch que confunde al principio: optimizer.zero_grad() hace falta precisamente porque el framework acumula por diseño. Esa acumulación no es un fallo: es lo que permite simular lotes grandes sumando gradientes de varios lotes pequeños antes de actualizar.
Dos expresiones con nodos reutilizados.
Expresión 1: y = x² + x en x = 2
y = 4 + 2 = 6,0
rama 1: d(x²)/dx = 2x = 4
rama 2: d(x)/dx = 1
acumulado: dy/dx = 4 + 1 = 5,0
comprobación analítica 2x + 1 = 5,0 ✓
Si se sobrescribiera en vez de sumar, saldría 4 o 1.
Expresión 2: e = (ab + a)·(ab) en a = 3, b = 4
el producto ab se usa dos veces:
su gradiente acumula ambas contribuciones.
El grafo de cómputo y la acumulación de gradientes en nodos reutilizados.
python classes/part-15-matematica-de-deep-learning/306-computational-graphs/lab.py
compmath run 306
expresion_1ydy/dxdy/dx_analitico_2x+1acumulacion_correctaexpresion_2ede/dade/dbnodos_con_multiples_consumidoreserror_clasico{
"expresion_1": "y = x² + x en x=2",
"y": 6.0,
"dy/dx": 5.0,
"dy/dx_analitico_2x+1": 5.0,
"acumulacion_correcta": true,
"expresion_2": "e = (ab + a)·(ab) en a=3, b=4"
}
Implementación de autodiferenciación, capas personalizadas, acumulación de gradientes para lotes grandes y depuración de frameworks.
Toda arquitectura moderna, incluido el Transformer, se construye sobre estos bloques y sobre este mismo mecanismo de derivación.