Skip to content

← JAX Foundations step 10 of 25

Easy Primitives

Gradient with jax.grad

Jump to the task

A gradient measures sensitivity

A derivative tells you how a function's output changes when one input changes slightly. For a scalar loss with several inputs, its gradient collects these derivatives. JAX computes them from the operations in your function using jax.grad.

Pass the function itself to jax.grad, then call the function it returns:

import jax
import jax.numpy as jnp

def score(w, x):
    return jnp.sum(w * x)

x = jnp.array([1.0, 3.0])
jax.grad(score)(2.0, x)                 # 4.0
jax.grad(score, argnums=1)(2.0, x)      # [2.0, 2.0]

The first call varies w while holding x fixed. Here the score is 4*w, so its derivative is 4. The second call varies each element of x while holding w fixed. Each element is multiplied by 2, giving a gradient with two entries.

Choose the loss and the argument

By default, argnums=0 selects the first positional argument. Use argnums=(0, 1) to return a tuple containing both gradients.

The loss must be scalar: an array with shape () qualifies, but shape (1,) does not. If your function returns several values, decide which scalar objective you want to differentiate. Summing and averaging give different gradients; neither is an automatic fix for every problem. To keep the derivatives of separate outputs, use a Jacobian instead.

This exercise uses real floating-point inputs. An integer argument selected for differentiation is rejected by default. Write 1.0 instead of 1 when you mean a continuous scalar parameter.

Problem

Implement grad_of_quadratic(w, b, x) using jax.grad. w and b are real floating-point scalars, and x is a one-dimensional floating-point array. Define the loss as sum((w*x + b)**2) and return its derivative with respect to w only, as a scalar. Hold b and x fixed. Use a sum, not a mean.

For example, with w=1.0, b=2.0, and x=[3.0], the term before squaring is 5. Its derivative with respect to w is 3, so the loss derivative is 2 * 5 * 3 = 30.0.

To check your result by hand, sum 2 * (w*x_i + b) * x_i over the entries of x. Practice constructing the derivative with jax.grad; numerical output checks alone cannot distinguish it from this formula.