En ML nunca derivas respecto a una variable: derivas la loss respecto a vectores y matrices de parámetros (los pesos $W$). Matrix calculus te da las identidades compactas para hacerlo sin desglosar millones de parciales a mano. Es el lenguaje en el que están escritos los gradientes de todos los papers. Domina un puñado de identidades y podrás derivar los gradientes de casi cualquier modelo lineal.
Why this matters for ML
En ML nunca derivas respecto a una variable: derivas la loss respecto a vectores y matrices de parámetros (los pesos W). Matrix calculus te da las identidades compactas para hacerlo sin desglosar millones de parciales a mano. Es el lenguaje en el que están escritos los gradientes de todos los papers. Domina un puñado de identidades y podrás derivar los gradientes de casi cualquier modelo lineal.
Concepts covered
- Derivadas respecto a vectores y matrices
- Layout conventions (numerator vs. denominator)
- Identidades clave (∇a⊤x, ∇x⊤Ax, ∇∥Ax−b∥2)
- Gradiente de la loss de regresión lineal (derivación completa)
- Conexión con Jacobian (Calc-06)
Intuition first
📄 "The Matrix Calculus You Need For Deep Learning" — Parr & Howard (explained.ai/matrix-calculus). Es el recurso definitivo y gratuito para este módulo. MML sección 5.5 también.
Theory & key results
Gradiente respecto a un vector: si f:Rn→R, entonces ∇xf es un vector con (∇f)i=∂f/∂xi (esto ya lo viste en Calc-05). Matrix calculus solo lo extiende a expresiones con matrices.
Layout convention: hay dos convenciones (numerator/denominator layout) que difieren en si el resultado sale traspuesto. Elige una y sé consistente. Aquí usamos denominator layout (el gradiente tiene la misma forma que la variable — lo más común en ML). Lo importante: verifica siempre las dimensiones.
Identidades esenciales (con a, A constantes, A simétrica donde aplique):
| Expresión f(x) |
Gradiente ∇xf |
| a⊤x=x⊤a |
a |
| x⊤x=∥x∥2 |
2x |
| x⊤Ax |
(A+A⊤)x = 2Ax si A simétrica |
| Ax (Jacobian) |
A |
| ∥Ax−b∥2 |
2A⊤(Ax−b) |
Respecto a matrices: ∇Wf es una matriz del mismo tamaño que W. Ejemplos clave: ∇W(a⊤Wb)=ab⊤; y en una capa z=Wx, el gradiente de la loss respecto a W es ∇WL=(∇zL)x⊤ (un outer product — justo lo que usa backprop).
Derivación estrella — gradiente de la regresión lineal:
L(w)=∥Xw−y∥2=(Xw−y)⊤(Xw−y).
Usando la identidad de arriba, ∇wL=2X⊤(Xw−y). Igualando a cero: X⊤Xw=X⊤y → las normal equations (LA-06/10). Así se conectan cálculo y álgebra lineal en un solo resultado.
Worked example
f(x)=x⊤Ax con A=[2003] (simétrica). Entonces f=2x12+3x22 y a mano ∇f=(4x1,6x2). Con la identidad: ∇f=2Ax=2[2003]x=(4x1,6x2). ✓ Coincide.
Notebook exercises (by hand)
- Calcula ∇x(a⊤x) desarrollando componente a componente y confirma que es a.
- Calcula ∇x(x⊤x) y confirma 2x.
- Deriva ∇x(x⊤Ax) para A general y muestra que da (A+A⊤)x.
- Deriva ∇w∥Xw−y∥2 paso a paso e iguala a 0 para recuperar las normal equations.
- Verifica dimensiones: si X es m×n, ¿qué forma tiene ∇wL? ¿Cuadra con w?
- Para z=Wx, argumenta por qué ∇WL=(∇zL)x⊤ tiene la forma correcta.
Python lab
import numpy as np
# verifica ∇(xᵀAx) = (A+Aᵀ)x con gradiente numérico
def num_grad(f, x, h=1e-6):
g = np.zeros_like(x)
for i in range(len(x)):
e = np.zeros_like(x); e[i] = h
g[i] = (f(x+e) - f(x-e))/(2*h)
return g
A = np.array([[2., 1.],[0., 3.]])
x = np.array([1., 2.])
f = lambda v: v @ A @ v
print("numérico:", num_grad(f, x))
print("identidad:", (A + A.T) @ x) # coinciden
# gradiente de la loss de regresión y check con las normal equations
rng = np.random.default_rng(0)
X = rng.normal(size=(20, 3)); w_true = np.array([1., -2., 0.5])
y = X @ w_true + rng.normal(0, 0.1, 20)
grad = lambda w: 2*X.T @ (X @ w - y)
w_star = np.linalg.solve(X.T @ X, X.T @ y) # normal equations
print("grad en w_star ~ 0:", np.round(grad(w_star), 6))
Examen final 📝
Intenta cada nivel antes de abrir las soluciones.
🟡 Medio
- Calcula ∇x(a⊤x) y ∇x(x⊤x).
- Para A simétrica, calcula ∇x(x⊤Ax).
🟠 Medio-difícil
- Deriva ∇w∥Xw−y∥2 y verifica dimensiones (X∈Rm×n).
- Para una capa z=Wx, deriva ∂W∂L en función de ∂z∂L y x, y confirma que es un outer product de la forma correcta.
🔴 Difícil
- Deriva el gradiente de la loss de ridge regression L(w)=∥Xw−y∥2+λ∥w∥2, iguala a 0 y muestra que w^=(X⊤X+λI)−1X⊤y. Explica por qué el término λI hace la matriz siempre invertible (relación con LA-08).
- Deriva el gradiente de la cross-entropy con softmax: para L=−∑kyklogsk con s=softmax(z), demuestra el resultado famoso ∂z∂L=s−y.
✅ Soluciones
- ∇(a⊤x)=a; ∇(x⊤x)=2x.
- ∇(x⊤Ax)=(A+A⊤)x=2Ax (simétrica).
- ∇w=2X⊤(Xw−y). Dimensiones: X⊤ es n×m, (Xw−y) es m×1 ⇒ resultado n×1, misma forma que w. ✓
- ∂W∂L=∂z∂Lx⊤. Si ∂z∂L es dz×1 y x es dx×1, el outer product es dz×dx = forma de W. ✓
- ∇L=2X⊤(Xw−y)+2λw=0⇒(X⊤X+λI)w=X⊤y. X⊤X es PSD (eigenvalues ≥0); sumar λI (λ>0) los vuelve todos ≥λ>0 ⇒ positive definite ⇒ invertible siempre (incluso con colinealidad).
- Con sk=∑jezjezk: ∂zi∂L=−∑kyk∂zi∂logsk=−∑kyk(δki−si)=−yi+si∑kyk=si−yi (usando ∑kyk=1 para one-hot). Vector: s−y.