Concept 7 of 7 · Fixing the bias

Error mitigation: why more shots can’t save you, but ZNE might

More shots only shrink random scatter; they do nothing to the systematic bias that dominates a deep-circuit QPU result. Zero-Noise Extrapolation (ZNE) is the one bias-fighter you can run on today’s hardware, and it is now wired into wh_qpu_validation.py behind an opt-in mitigation flag.

amplified noise ×5 ×3 ×1 raw run ZNE estimate 0 1 3 5 noise factor energy
Zero-noise extrapolation. You can’t run the chip at zero noise, so you measure the energy at amplified noise factors (×1, ×3, ×5) and fit the trend back to the noise-free limit.

Two completely different kinds of error

Every QPU energy carries two kinds of error that behave nothing alike. One is random shot noise (statistical / variance); the other is systematic bias:

Shot noiseSystematic bias
SourceMeasurement is a coin flip; you average finite samplesImperfect gates, decoherence, readout bias, crosstalk
DirectionRandom: scatters both waysConsistent: pushes the answer the same way every shot
Shrinks with more shots?Yes, as 1/√N (4× shots → ½ the scatter)No: averaging just converges onto the biased value
AnalogyA fuzzy bathroom scaleA scale miscalibrated +10 lb
Why not just take more shots?

This is the whole answer: more shots make a wrong answer more precise, not more correct. You converge, beautifully, onto the biased number.

The evidence is already in our own data

The H2 and WH− validations both used 4096 shots. If shot noise were the bottleneck, their errors would be similar. Instead WH− was ~6.5× worse (199.8 vs 30.6 mHa), and that ratio tracks circuit depth, not shot count. Shot noise is blind to depth; gate-error bias grows with it. That 6.5× is the fingerprint of bias, which is exactly what more shots cannot touch.

How ZNE fights the bias

You can’t measure the zero-noise answer directly, but you can measure how the answer drifts as you deliberately make the chip noisier, then extrapolate back to the noise-free limit you can’t reach. The diagram above traces exactly this.

In practice (qiskit-ibm-runtime EstimatorV2):

ZNE only suppresses real hardware noise, so it is a no-op on the noiseless simulator and roughly multiplies QPU cost by the number of noise factors (~3× here, more with readout learning).

How to run it in this repo

The baseline (unmitigated) path remains the default; its only schema change is an added mitigation_detail field recording that no mitigation was applied:

# baseline: raw hardware (now records mitigation_detail = {"method": "none"})
python scripts/wh_qpu_validation.py qpu

# mitigated: ZNE + readout mitigation
python scripts/wh_qpu_validation.py qpu --mitigation zne

The mitigated run writes a separate artifact so the baseline proof stays intact:

results/qpu_runs/wh_qpu_validation_zne_<DATE>.json

That JSON records the full mitigation configuration, so the run is reproducible and self-describing:

{
  "mitigation": "zne",
  "mitigation_detail": {
    "method": "zne",
    "measure_mitigation": true,
    "zne_noise_factors": [1, 3, 5],
    "zne_extrapolator": ["exponential", "linear"],
    "note": "..."
  },
  "E_qpu_total_ha": "...",        // mitigated energy
  "delta_E_mHa": "...",           // residual vs the simulator
  "interpretation": "...compare against the unmitigated baseline..."
}

What to realistically expect

ZNE will help, but it will not make WH− “right”:

The ladder, for orientation: shots fight variance · ZNE fights bias · error correction fights both (the last only arrives with fault-tolerant hardware; see 05 · Scaling roadmap).

Result (2026-05-31): a textbook “edge of reliability” outcome

Ran on ibm_marrakesh (job d8e6ucjo3njc73eub3v0, 4096 shots, noise factors [1, 3, 5]). What ZNE did to the WH− error:

Unmitigated baselineZNE
ΔE vs simulator+199.8 mHa−97.9 mHa
|error| magnitude199.8 mHa97.9 mHa (≈2× smaller)
vs exact CASCI ground state (−67.4545 Ha)above it~87 mHa below it

So ZNE roughly halved the error magnitude, and 97.9 < 110, so it dipped under the well depth. But the sign flipped: the mitigated energy (−67.5411 Ha) landed below the exact ground state, which is physically impossible for a true expectation value. ZNE over-extrapolated, trading a +200 mHa bias for an ~−87 mHa overshoot.

Edge of reliability

This is exactly the failure mode this primer predicted: at ~30 layers / ~100 two-qubit gates, the 3× and 5× points are so degraded that the extrapolation overshoots. Verdict: a genuine magnitude improvement, but a methodology data point, not a trustworthy chemistry result. A single ZNE point also carries its own variance, so the overshoot is indicative, not a precise bias measurement.

Full record: wh_qpu_validation_zne_2026-05-31.json. The unmitigated baseline remains the reference result.