Baird's Counterexample
Seven states, zero rewards, linear values, yet off policy TD blows up. Three ingredients together break the contraction that keeps learning stable.
Why Does This Exist?
Linear values feel safe. Squared error is a bowl, so gradient steps should roll downhill. Baird showed in 1995 that this intuition fails once three things combine: function approximation, bootstrapping, and off policy data. That trio is the deadly triad.
His 7-state star MDP has zero reward everywhere, discount , and a linear value that can fit the truth exactly. Target policy always picks the solid move to the hub. Behavior mostly picks the dashed move that spreads across the rim. Semi-gradient TD with importance weights still explodes. This page covers the construction and the blow up. Neighbors cover the trio in the deadly triad, the sampling shift in off policy with approximation, and true gradient fixes in gradient TD.
You need TD learning first: update toward while ignoring how the target itself moves with .
Think of It Like This
A mic facing its own speaker
A whisper enters the mic, the amp adds a little gain, the speaker throws it back into the mic, and the loop repeats. Gain above one turns quiet into squeal even with no singer in the room.
Bootstrapped targets are the mic, semi-gradient pushes are the amp, and off policy sampling aims the speaker at the mic. Zero reward is the quiet room. It still squeals because the loop gain sits above one.
Where it stops: a real amp clips at voltage rails while these weights grow with no ceiling until floats overflow. The math also names the gain exactly through eigenvalues, which air acoustics never does.
How It Actually Works
Six rim states to plus hub . Solid action goes to . Dashed action lands uniform on the rim. All . Features with as unit vectors:
Behavior picks dashed with and solid with . Dashed steps get importance ratio and contribute nothing. Solid steps get and update toward . In expectation the cancels the visit rate, leaving:
for a fixed matrix . On policy stays positive definite and pulls inward. Here has eigenvalues with negative real parts near and . Then has gain above one along that mode:
Each pass multiplies that component, so norms grow like .
Worked example
Start with . Norm:
Expected semi-gradient steps push outward from the start:
The drift compounds. By steps norm is about , by about , by about . Zero rewards, small step, exact representation, yet infinity bound.
Code
Norm growth only, hand checkable without a full simulator.
import numpy as np
def weight_norm(w: np.ndarray) -> float: """Euclidean norm of the 7-dim Baird weight vector.""" return float(np.linalg.norm(w))
w0 = np.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 10.0])print(f"{weight_norm(w0):.4f}") # -> 10.2956
w1 = np.array([1.0241, 1.0244, 1.0244, 1.0244, 1.0244, 1.0244, 10.0726])print(f"{weight_norm(w1):.4f}") # -> 10.3804First print is . Second matches the one step expected update quoted above.
Watch Out For
Blaming nonlinearity or reward scale
It is tempting to blame ReLUs or big rewards when values explode. Baird rules both out: linear model, zero rewards, tiny step.
Symptom: clipping gradients or rescaling rewards changes nothing. Fix: break the triad. Go on policy, switch to true gradient TD such as GTD2 or TDC, or reweight with emphatic traces. Check sampling and bootstrapping before touching the network.
The Quick Version
- Baird's 7-state star uses zero rewards and linear features that can fit truth exactly.
- Off policy ratios plus bootstrapping make matrix indefinite, with modes near .
- Update gain exceeds one, so weights multiply outward each pass.
- Norms run to at 100 steps to at 1000 steps.
- Fix by removing one leg: on policy data, true gradients, or emphatic weighting.