Calculus·Unidad 9

Calc-09 — Matrix calculus

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 WW). 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 (ax\nabla \mathbf{a}^\top\mathbf{x}, xAx\nabla \mathbf{x}^\top A\mathbf{x}, Axb2\nabla |A\mathbf{x}-\mathbf{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:RnRf:\mathbb{R}^n\to\mathbb{R}, entonces xf\nabla_{\mathbf{x}}f es un vector con (f)i=f/xi(\nabla f)_i=\partial f/\partial x_i (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\mathbf{a}, AA constantes, AA simétrica donde aplique):

Expresión f(x)f(\mathbf{x}) Gradiente xf\nabla_{\mathbf{x}} f
ax=xa\mathbf{a}^\top\mathbf{x} = \mathbf{x}^\top\mathbf{a} a\mathbf{a}
xx=x2\mathbf{x}^\top\mathbf{x} = |\mathbf{x}|^2 2x2\mathbf{x}
xAx\mathbf{x}^\top A\mathbf{x} (A+A)x(A + A^\top)\mathbf{x} = 2Ax2A\mathbf{x} si AA simétrica
AxA\mathbf{x} (Jacobian) AA
Axb2|A\mathbf{x}-\mathbf{b}|^2 2A(Axb)2A^\top(A\mathbf{x}-\mathbf{b})

Respecto a matrices: Wf\nabla_W f es una matriz del mismo tamaño que WW. Ejemplos clave: W(aWb)=ab\nabla_W (\mathbf{a}^\top W\mathbf{b}) = \mathbf{a}\mathbf{b}^\top; y en una capa z=Wx\mathbf{z}=W\mathbf{x}, el gradiente de la loss respecto a WW es WL=(zL)x\nabla_W L = (\nabla_{\mathbf{z}}L),\mathbf{x}^\top (un outer product — justo lo que usa backprop).

Derivación estrella — gradiente de la regresión lineal: L(w)=Xwy2=(Xwy)(Xwy).L(\mathbf{w}) = |X\mathbf{w}-\mathbf{y}|^2 = (X\mathbf{w}-\mathbf{y})^\top(X\mathbf{w}-\mathbf{y}). Usando la identidad de arriba, wL=2X(Xwy)\nabla_{\mathbf{w}}L = 2X^\top(X\mathbf{w}-\mathbf{y}). Igualando a cero: XXw=XyX^\top X\mathbf{w}=X^\top\mathbf{y} → las normal equations (LA-06/10). Así se conectan cálculo y álgebra lineal en un solo resultado.

Worked example

f(x)=xAxf(\mathbf{x})=\mathbf{x}^\top A\mathbf{x} con A=[2003]A=\begin{bmatrix}2&0\0&3\end{bmatrix} (simétrica). Entonces f=2x12+3x22f=2x_1^2+3x_2^2 y a mano f=(4x1,6x2)\nabla f=(4x_1,6x_2). Con la identidad: f=2Ax=2[2003]x=(4x1,6x2)\nabla f = 2A\mathbf{x}=2\begin{bmatrix}2&0\0&3\end{bmatrix}\mathbf{x}=(4x_1,6x_2). ✓ Coincide.

Notebook exercises (by hand)

  1. Calcula x(ax)\nabla_{\mathbf{x}}(\mathbf{a}^\top\mathbf{x}) desarrollando componente a componente y confirma que es a\mathbf{a}.
  2. Calcula x(xx)\nabla_{\mathbf{x}}(\mathbf{x}^\top\mathbf{x}) y confirma 2x2\mathbf{x}.
  3. Deriva x(xAx)\nabla_{\mathbf{x}}(\mathbf{x}^\top A\mathbf{x}) para AA general y muestra que da (A+A)x(A+A^\top)\mathbf{x}.
  4. Deriva wXwy2\nabla_{\mathbf{w}}|X\mathbf{w}-\mathbf{y}|^2 paso a paso e iguala a 0 para recuperar las normal equations.
  5. Verifica dimensiones: si XX es m×nm\times n, ¿qué forma tiene wL\nabla_{\mathbf{w}}L? ¿Cuadra con w\mathbf{w}?
  6. Para z=Wx\mathbf{z}=W\mathbf{x}, argumenta por qué WL=(zL)x\nabla_W L=(\nabla_{\mathbf{z}}L)\mathbf{x}^\top 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

  1. Calcula x(ax)\nabla_{\mathbf x}(\mathbf a^\top\mathbf x) y x(xx)\nabla_{\mathbf x}(\mathbf x^\top\mathbf x).
  2. Para AA simétrica, calcula x(xAx)\nabla_{\mathbf x}(\mathbf x^\top A\mathbf x).

🟠 Medio-difícil

  1. Deriva wXwy2\nabla_{\mathbf w}|X\mathbf w-\mathbf y|^2 y verifica dimensiones (XRm×nX\in\mathbb{R}^{m\times n}).
  2. Para una capa z=Wx\mathbf z=W\mathbf x, deriva LW\frac{\partial L}{\partial W} en función de Lz\frac{\partial L}{\partial \mathbf z} y x\mathbf x, y confirma que es un outer product de la forma correcta.

🔴 Difícil

  1. Deriva el gradiente de la loss de ridge regression L(w)=Xwy2+λw2L(\mathbf w)=|X\mathbf w-\mathbf y|^2+\lambda|\mathbf w|^2, iguala a 0 y muestra que w^=(XX+λI)1Xy\hat{\mathbf w}=(X^\top X+\lambda I)^{-1}X^\top\mathbf y. Explica por qué el término λI\lambda I hace la matriz siempre invertible (relación con LA-08).
  2. Deriva el gradiente de la cross-entropy con softmax: para L=kyklogskL=-\sum_k y_k\log s_k con s=softmax(z)\mathbf s=\text{softmax}(\mathbf z), demuestra el resultado famoso Lz=sy\frac{\partial L}{\partial \mathbf z}=\mathbf s-\mathbf y.
✅ Soluciones
  1. (ax)=a\nabla(\mathbf a^\top\mathbf x)=\mathbf a; (xx)=2x\nabla(\mathbf x^\top\mathbf x)=2\mathbf x.
  2. (xAx)=(A+A)x=2Ax\nabla(\mathbf x^\top A\mathbf x)=(A+A^\top)\mathbf x=2A\mathbf x (simétrica).
  3. w=2X(Xwy)\nabla_{\mathbf w}=2X^\top(X\mathbf w-\mathbf y). Dimensiones: XX^\top es n×mn\times m, (Xwy)(X\mathbf w-\mathbf y) es m×1m\times1 ⇒ resultado n×1n\times1, misma forma que w\mathbf w. ✓
  4. LW=Lzx\frac{\partial L}{\partial W}=\frac{\partial L}{\partial\mathbf z}\mathbf x^\top. Si Lz\frac{\partial L}{\partial\mathbf z} es dz×1d_z\times1 y x\mathbf x es dx×1d_x\times1, el outer product es dz×dxd_z\times d_x = forma de WW. ✓
  5. L=2X(Xwy)+2λw=0(XX+λI)w=Xy\nabla L=2X^\top(X\mathbf w-\mathbf y)+2\lambda\mathbf w=0\Rightarrow(X^\top X+\lambda I)\mathbf w=X^\top\mathbf y. XXX^\top X es PSD (eigenvalues 0\ge0); sumar λI\lambda I (λ>0\lambda>0) los vuelve todos λ>0\ge\lambda>0 ⇒ positive definite ⇒ invertible siempre (incluso con colinealidad).
  6. Con sk=ezkjezjs_k=\frac{e^{z_k}}{\sum_j e^{z_j}}: Lzi=kyklogskzi=kyk(δkisi)=yi+sikyk=siyi\frac{\partial L}{\partial z_i}=-\sum_k y_k\frac{\partial\log s_k}{\partial z_i}=-\sum_k y_k(\delta_{ki}-s_i)=-y_i+s_i\sum_k y_k=s_i-y_i (usando kyk=1\sum_k y_k=1 para one-hot). Vector: sy\mathbf s-\mathbf y.