English · Español
01 — Derivadas, gradientes, Jacobianas¶
🇪🇸 La derivada en una variable es una pendiente; el gradiente en varias variables es un vector que apunta a la subida más rápida; el Jacobiano de una función vectorial es la matriz que generaliza ambos. Todo backprop opera sobre estos tres objetos.
Derivada de una variable¶
Para f: R → R, la derivada (derivada) en x es
Geométrico: pendiente de la recta tangente en x. Numérico: cuánto cambia f por unidad de cambio en x, en el límite.
Derivadas útiles para memorizar en frío (cualquier derivación posterior va más rápida si estas son reflejas):
f(x) |
f'(x) |
|---|---|
x^n |
n x^{n-1} |
e^x |
e^x |
log x |
1/x |
sin x |
cos x |
cos x |
-sin x |
tanh x |
1 - tanh² x |
relu x |
1 if x > 0 else 0 (sub-gradiente en 0) |
sigmoid x |
sigmoid(x) (1 - sigmoid(x)) |
softplus x |
sigmoid x |
1/x |
-1/x² |
Las últimas seis se derivan a mano en el lab 00 como calentamiento para la derivación de softmax.
Derivada parcial¶
Para f: R^n → R:
Trata todas las demás coordenadas como constantes; deriva como en el caso de una variable.
Ejemplo trabajado. f(x, y) = x² y + sin(y). Entonces:
Gradiente¶
El gradiente (gradiente) de f: R^n → R es el vector de derivadas parciales:
Por convención, un vector columna.
Significado geométrico: ∇f(x) apunta en la dirección de máximo ascenso de f en x. Su magnitud es la tasa de cambio en esa dirección. La dirección de máximo descenso es -∇f(x). Esta es la razón completa por la que el descenso de gradiente funciona.
Para el ejemplo de arriba:
Jacobiana¶
Para una función vectorial f: R^n → R^m, la Jacobiana (Jacobiana) es la matriz de derivadas parciales:
Cada fila es el gradiente de una coordenada de salida, tratada como vector fila. La forma m × n es "dim de salida por dim de entrada".
Casos especiales:
- Si
m = 1(salida escalar):J_fes un vector fila1 × n; la transpuesta de∇f(que esn × 1). - Si
n = 1(entrada escalar):J_fes un vector columnam × 1; la derivada de cada salida respecto a la única entrada. - Si
m = n: Jacobiana cuadrada. Si es invertible, se aplica localmente el teorema de la función inversa.
Linealidad: la Jacobiana es la aproximación lineal de f cerca de x:
Esto es el teorema de Taylor en primer orden. Cada pieza posterior del cálculo multivariable se construye sobre esto.
Hessiana¶
Para f: R^n → R, la Hessiana (Hessiana) es la matriz de derivadas parciales segundas:
H_f ∈ R^{n × n}, y es simétrica (bajo las suposiciones estándar de regularidad — teorema de Clairaut).
Significado geométrico: la Hessiana describe la curvatura de f en x. Eigenvalores:
- Todos positivos → mínimo local, forma de "cuenco".
- Todos negativos → máximo local.
- Signos mezclados → punto de silla.
- Uno cero → degenerado (plano en alguna dirección).
Por qué nos importa para ML: el número de condición de la Hessiana de la superficie de pérdida (λ_max / λ_min) determina la velocidad de convergencia del descenso de gradiente. Hessiana anisotrópica (valle largo y estrecho) = GD lento. Adam aproxima un precondicionador diagonal que hace la superficie de pérdida "más redonda".
No calcularemos Hessianas explícitamente en este currículo — cuestan O(n²) en almacenamiento y O(n³) en invertir, inviable para modelos de un millón de parámetros. Razonaremos sobre ellas conceptualmente.
La jungla notacional¶
Distintas fuentes usan distintas convenciones:
| Convención | ∇f (salida escalar) |
J_f (salida vectorial) |
Regla de la cadena |
|---|---|---|---|
| Layout de numerador (Wikipedia, Stanford CS) | fila 1 × n |
m × n |
J_{fg} = J_f · J_g |
| Layout de denominador (econometría) | columna n × 1 |
n × m |
J_{fg} = J_g · J_f |
Este currículo usa layout de numerador (gradientes/Jacobianas dispuestos para que el matmul de la regla de la cadena se lea naturalmente). PyTorch usa vectores en layout de denominador internamente pero expone gradientes en layout de numerador. No pelees con la convención; solo elige una y mantente.
En código:
grad = np.array([df_dx_i for i in range(n)])— forma(n,). Los vectores 1-D de NumPy se tratan convencionalmente como columnas o filas indistintamente; en derivaciones, trátalos como columnas.jacobian = np.empty((m, n))— forma(m, n), filai= gradiente def_i.
Trabajado: gradiente de ||x||²¶
Sea f(x) = ||x||² = x^T x = Σ x_i².
Esta es la regla más simple "el gradiente es la función evaluada como vector". Usada en regularización L2: ∇(λ ||θ||²) = 2λθ. Los coeficientes difieren por convenciones de factor-de-2; fija cuál usa tu código.
Trabajado: Jacobiana de y = Wx + b¶
Para W: (m, n), x: (n,), b: (m,), la salida y ∈ R^m. Por componente:
Jacobiana respecto a x:
Eso es todo. La Jacobiana de una capa lineal respecto a su entrada es la propia matriz de pesos. Esta es la Jacobiana más usada en todo aprendizaje profundo.
La Jacobiana respecto a W es más complicada — W tiene m × n entradas, así que la "Jacobiana" de y: (m,) respecto a W: (m, n) es un objeto de rango 3 de forma (m, m, n). La mayoría de librerías autograd expresan esto implícitamente: la regla de la cadena produce una contribución ∂L/∂W = ∂L/∂y · x^T (producto exterior), sin materializar nunca la Jacobiana completa de rango 3.
Derivaremos esta contribución explícitamente en theory/02-chain-rule-and-backprop.md.
Trabajado: Jacobiana de f(x) elemento a elemento¶
Para y = f(x) elemento a elemento (así y_i = f(x_i) — p. ej., f = relu, sigmoid, tanh):
La Jacobiana es diagonal con entradas f'(x_i). En código: no materialices la diagonal completa; solo multiplica elemento a elemento.
Para ReLU: J_ii = 1 if x_i > 0 else 0. Para tanh: J_ii = 1 - tanh²(x_i). Para sigmoid: J_ii = σ(x_i)(1 - σ(x_i)). Cada una aparece en las ops de autograd de la Fase 7.
Problemas de práctica¶
Soluciones en solutions/01-derivatives-gradients-jacobians-ref.md en la apertura de fase.
- Para
f(x, y) = x² + 3xy + y³: calcula∇fyH_f. - Para
f(x) = ||Ax - b||²dondeA: (m, n), x: (n,), b: (m,): deriva∇fyH_f. - Verifica simetría: para
f(x, y) = x² sin(y), comprueba∂²f/∂x∂y = ∂²f/∂y∂x. - Para
y = softmax(x)(longitudn): ¿cuál es la forma deJ_y(x)? Calcúlala parax = [0, 0, 0](n=3). - Para una MLP de 2 capas
y = W_2 · relu(W_1 x + b_1) + b_2con entradax: (n,), W_1: (h, n), W_2: (m, h): ¿cuál es la forma deJ_y(x)?
Si dos o más se sienten tambaleantes, vuelve a leer.
Recapitulación en un párrafo¶
La derivada de una variable se generaliza al gradiente (vector de parciales, para funciones de salida escalar) y a la Jacobiana (matriz de parciales, para funciones de salida vectorial). La Jacobiana es la aproximación lineal de una función cerca de un punto: f(x + h) ≈ f(x) + J_f(x) h. La Hessiana es la matriz de segundas derivadas y describe la curvatura; sus eigenvalores clasifican los puntos críticos (mín/máx/silla), y su número de condición gobierna la velocidad de convergencia de la optimización de primer orden (GD). La Jacobiana más usada en aprendizaje profundo es la de una capa lineal y = Wx + b, cuya Jacobiana respecto a x es simplemente W. Las activaciones elemento a elemento tienen Jacobianas diagonales, por eso son baratas. Cada derivación posterior en la Fase 4 — softmax, cross-entropy, regla de la cadena — depende de este vocabulario.
Siguiente: theory/02-chain-rule-and-backprop.md.