Skip to content

← JAX Autodiff step 22 of 25

Hard Primitives

Jacobian with jacrev

Jump to the task

Compute a Jacobian with reverse-mode differentiation

A Jacobian contains the derivatives of every output with respect to every input. jax.jacrev constructs it using reverse-mode differentiation. For a vector input of length d and vector output of length k, the result has shape (k, d): outputs in rows, inputs in columns.

import jax
import jax.numpy as jnp

def f(x):
    return jnp.array([x[0], x[0] + x[1]])

J = jax.jacrev(f)(jnp.array([1.0, 2.0]))
# [[1.0, 0.0],
#  [1.0, 1.0]]

The first output depends only on x[0], giving the row [1, 0]. The second adds both inputs, giving [1, 1]. Pass the function itself to jax.jacrev, then evaluate the returned function at x.

Choose a mode without changing the derivative

Reverse-mode builds Jacobian rows from output weights. Forward-mode jax.jacfwd builds columns from input directions. For a full Jacobian, reverse-mode often suits functions with many inputs and few outputs. Actual time and memory use also depend on the function and compiler; the number of inputs or outputs alone is not a complete cost model.

For the smooth functions here, both methods compute the same mathematical Jacobian, allowing for floating-point differences. Composing them, as in jax.jacrev(jax.jacfwd(f)), differentiates the Jacobian again. For this exercise's three-output function, that would produce second derivatives with shape (3, d, d), not the requested first derivatives with shape (3, d).

Problem

Implement jacobian_mixed(x) using jax.jacrev. The input is a one-dimensional real floating-point JAX array with shape (d,). Define a function returning the three-element JAX array [sum(x), sum(2*x), sum(x**2)].

Return its Jacobian with shape (3, d). The first row contains ones, the second contains twos, and the third contains 2*x. For x=[-2.0, 0.5], return:

[[ 1.0, 1.0],
 [ 2.0, 2.0],
 [-4.0, 1.0]]

Keep the function name jacobian_mixed used by the starter code. The required calculation is a single reverse-mode Jacobian, not a composition of differentiation methods. Practice using jacrev; numerical tests cannot distinguish it from the equivalent formula.