Inicio · Parte 08 — Cálculo multivariable, matricial y autodiferenciación
J ∈ ℝ^(m×n) para F: ℝⁿ → ℝᵐ
fila i = ∇Fᵢ
VJP: vᵀJ · JVP: Jv
Cuando la función devuelve un vector en lugar de un escalar, su derivada es una matriz: el Jacobiano. Su fila i es el gradiente de la componente i de la salida, y su columna j recoge cómo afecta la entrada j a todas las salidas.
Su tamaño es el problema. Para una capa que va de 1000 entradas a 1000 salidas, el Jacobiano tiene un millón de entradas; para un modelo completo, sería inmanejable. Por eso los frameworks nunca lo construyen.
Lo que sí calculan son productos con el Jacobiano. El VJP (vector-Jacobian product), vᵀJ, es lo que hace backward(): propaga un gradiente hacia atrás sin materializar la matriz. El JVP (Jacobian-vector product), Jv, es lo que hace el modo directo. Cada uno cuesta aproximadamente lo mismo que evaluar la función una vez.
La elección entre modos depende de la forma. Si hay muchas entradas y una sola salida —el caso de una función de pérdida, con millones de parámetros y un escalar— el modo reverso obtiene todos los gradientes con un solo barrido. Si hay pocas entradas y muchas salidas, el modo directo es más eficiente. El entrenamiento de redes es el primer caso, y por eso backpropagation es modo reverso.
Jacobiano de una función de ℝ² en ℝ³.
F(x,y) = (x²+y, sin(x)·y, x−3y) en (1,2)
J (shape 3×2):
[[2x, 1 ] [[2.0, 1.0 ]
[cos(x)·y, sin(x)] = [1.0806, 0.8415]
[1, −3 ]] [1.0, −3.0 ]]
fila 1 = ∇(x²+y) = (2x, 1) = (2, 1) ✓
VJP (modo reverso): vᵀJ, coste ≈ 1 evaluación
JVP (modo directo): Jv, coste ≈ 1 evaluación
Jacobiano de una función vectorial.
python classes/part-08-calculo-multivariable-matricial-y-autodiferenciacion/168-jacobiano/lab.py
compmath run 168
Fpuntoshape_del_jacobianojacobianofila_i_es_el_gradiente_de_Fianalitico_fila_1vjpjvp{
"F": "(x²+y, sin(x)·y, x-3y)",
"punto": [
1.0,
2.0
],
"shape_del_jacobiano": [
3,
2
],
"jacobiano": [
[
2.0,
1.0
],
[
1.080605,
0.841471
],
[
1.0,
-3.0
]
],
"fila_i_es_el_gradiente_de_Fi": true,
"analitico_fila_1": [
2.0,
1.0
]
}
Autodiferenciación, cambio de variable en densidades, cinemática de robots y análisis de sensibilidad de sistemas con varias salidas.
Autograd de PyTorch y JAX es exactamente el modo reverso del grafo de cómputo que se construye en esta parte a mano.