Cuando calculamos L = (a × b) + a, los números intermedios no desaparecen. Se guardan en un grafo. Ese grafo es lo que luego permite propagar los gradientes.
Para hacer una torta necesitas: mezclar harina + huevos, batir mantequilla + azúcar, y luego unir ambas mezclas. Si alguien te pregunta "¿qué pasa si uso menos harina?", tienes que rastrear el efecto: menos harina → mezcla más líquida → torta más densa → tiempo de horneado diferente.
Cada paso depende de los anteriores. Si tuvieras el mapa de todas esas dependencias, podrías responder sistemáticamente cualquier pregunta del tipo "¿qué cambia si cambio X?".
Vamos a construir el grafo de este cálculo paso a paso, con a = 2 y b = 3.
Tenemos dos inputs: a = 2, b = 3 Paso 1: Calculamos c = a × b c = 2 × 3 = 6 → Nodo 'c' aparece en el grafo → Sus "padres" son a y b (vienen de esos dos nodos) → La operación que lo creó: multiplicación (×) Paso 2: Calculamos L = c + a L = 6 + 2 = 8 → Nodo 'L' aparece en el grafo → Sus "padres" son c y a → La operación que lo creó: suma (+) El grafo resultante: a ──┬──→ [×] ──→ c ──→ [+] ──→ L b ──┘ │ ↑ a ─────────────────┘────────────┘ ↑ Nota: 'a' aparece dos veces en el grafo (entra a la multiplicación Y a la suma)
El nodo 'a' participa en dos operaciones: la multiplicación con b, y la suma con c. Esto es importante para el backpropagation.
La pregunta que nos interesa es: "Si cambio a en 0.01, ¿cuánto cambia L?" Eso es exactamente lo que necesitamos para actualizar los pesos.
Sin el grafo, tendríamos que recalcular todo desde cero para cada pequeño cambio. Con el grafo, podemos ir hacia atrás usando las derivadas de cada operación, que son mucho más simples de calcular.
Value en la siguiente lección.
Mueve los sliders para cambiar a y b. El grafo se actualiza en tiempo real mostrando cómo cambia cada nodo.