English · Español
Fase 7 — Cuestionarios¶
🇪🇸 Espejo legible de
data/quizzes/phase-07-scalar-autograd.yaml. Incluye la traza de la "diamante" (aycapareciendo dos veces).
Fuente de verdad: data/quizzes/phase-07-scalar-autograd.yaml.
q-07-01 — ¿Por qué += y no = en la acumulación de _backward?¶
- Porque
+=es más rápido. - Porque un nodo puede aparecer múltiples veces en el grafo (diamante); cada aparición contribuye un gradiente parcial que debe sumarse;
=sobrescribe todos menos el último. - Porque
=rompe el topo-sort. - Porque
=no está implementado para floats.
Respuesta
**Opción 2.** El patrón en diamante es el fallo canónico: `a` alimenta a dos hijos, ambos alimentan a la pérdida. Cada uno contribuye con un parcial. Con `=`, solo el último queda — los tests sin diamantes pasan, el test de diamante falla.q-07-02 — ¿Por qué orden topológico inverso? (opción múltiple)¶
- Cuando se ejecuta
_backwardde N, leeN.grad, que debe contener ya el gradiente upstream total. - El topo inverso garantiza que cada hijo de N ya se ha ejecutado, por lo que
N.gradestá completo. - Visitar en orden directo durante el backward propaga gradientes antes de conocer los valores upstream.
- El topo inverso también es necesario para AD en forward-mode.
- El orden no importa mientras se use
+=.
Respuesta
**Opciones 1, 2, 3.** La opción 4 es incorrecta (forward-mode va hacia adelante). La opción 5 es la idea errónea común: incluso con `+=`, un nodo visitado demasiado pronto lee un `.grad` incompleto y propaga la magnitud equivocada a sus padres.q-07-03 — Traza del diamante (libre)¶
L = (a*b + c)*(a - c) con a=2, b=3, c=4. Calcula los gradientes, muestra los dos caminos hasta ∂L/∂a.
Respuesta
- **∂L/∂a** vía `(a·b + c)`: `f · b = -2 · 3 = -6`. - **∂L/∂a** vía `(a - c)`: `e · 1 = 10 · 1 = 10`. - **Suma:** `-6 + 10 = 4`. - **∂L/∂b** = `f · a = -2 · 2 = -4`. - **∂L/∂c** = `-2 + (-10) = -12`.q-07-04 — Diferencias finitas vs PyTorch como oráculo (libre)¶
Respuesta
Las diferencias finitas arrastran dos errores: **truncamiento** (`O(ε²)` para diferencias centradas) y **cancelación en coma flotante** (grande para ε pequeño). El ε "correcto" depende del problema; apilas tolerancias sobre tolerancias. PyTorch (o cualquier AD simbólico) computa la derivada **exacta** algebraicamente — reproducible a precisión de máquina, mejor oráculo.q-07-05 — Necesidad de zero_grad¶
- Porque backward filtra memoria si los gradientes no se resetean.
- Porque backward acumula con
+=; olvidar poner a cero significa que el gradiente del paso N es la suma de los pasos 1..N — el tamaño de paso efectivo crece linealmente, la pérdida diverge. - Porque
optimizer.stepno es idempotente. - Porque PyTorch lanza excepción si
.gradno es None.