Deep learning and neural networksLoading progress…

Local derivatives

Apply the chain rule through a graph and implement the core of a scalar reverse-mode autodiff engine.

Every operation knows its own slope

A local derivative answers a tiny question about one node: if I nudge one of this node's inputs, how much does this node's output move? Each operation has a simple rule, and the rule often uses the values from the forward pass.

operationoutputlocal derivative(s)
adda + b1 and 1
multiplya · bb with respect to a, a with respect to b
squareu²2u
tanht = tanh(z)1 − t²
relumax(0, z)1 if z > 0, otherwise 0

Predict first. For p = a·b, what is dp/da?

Local derivative times upstream gradient

One node never looks beyond its neighbours. It takes the gradient that arrives from above (how much the loss cares about this node's output), multiplies it by each local derivative, and hands the products to its inputs. That single move, repeated, is the chain rule.

a2b3a·b6c1p + c7u²49∂ 1
0 of 3 operation nodes processed
start: ∂L/∂L = 1, because the loss changes one-for-one with itself.
Take a=2, b=3, c=1, so u = 7 and L = 49. Press the button to send the gradient back one node at a time and read the arithmetic.
Chapter context

Backpropagation organizes repeated applications of the chain rule. The graph stores how values depend on earlier values. Reverse traversal accumulates how the final loss changes with each intermediate quantity.

Chapter reference: math, worked example & code

This section belongs to the whole chapter, so it is the same on every lesson in it and may cover a different lesson's topic. The code for the experiment you just ran is inside the experiment itself.

Math and notation

If u=ab+cu=ab+c and L=u2L=u^2, then

∂L∂a=2ub,∂L∂b=2ua,∂L∂c=2u.\frac{\partial L}{\partial a}=2ub,\quad \frac{\partial L}{\partial b}=2ua,\quad \frac{\partial L}{\partial c}=2u.

At a shared node x, add all downstream contributions: ∂L/∂x=∑j(∂L/∂uj)(∂uj/∂x)\partial L/\partial x=\sum_j(\partial L/\partial u_j)(\partial u_j/\partial x).

Worked example

Take a=2,b=3,c=1. Then u=7 and L=49. The upstream gradient into u is 14, giving dL/da=14×3=42, dL/db=14×2=28 and dL/dc=14. These are sensitivities, not new parameter values; an optimizer still needs a step size.

Reference code

The following example uses the Python standard library and does not call a remote service.

from math import isclose
a,b,c = 2.,3.,1.
u = a*b+c
assert u*u == 49
assert (2*u*b,2*u*a,2*u) == (42,28,14)
h = 1e-5
f = lambda x: (x*b+c)**2
assert isclose((f(a+h)-f(a-h))/(2*h), 42, rel_tol=1e-7)

Python examples are provided for study and local execution; this page does not execute Python.

Common mistakes

Forward values and gradients are different objects. Shared branches require addition of gradient contributions. Backpropagation computes derivatives; the optimizer changes parameters.