Immutable solution version
Choose the right PennyLane diff_method and fix gradient configuration errors
Complete solution
Fix PennyLane gradient failures by matching the exact error (parameter-shift vs state, backprop vs shots, adjoint vs measurement, broadcasted tapes, device jacobian) to the illegal configuration, then pick diff_method from a device x shots x measurement matrix.
When it applies
[{"constraint": ">=0.40", "technology": "PennyLane", "version_scheme": "semver"}]
Choose the right diff_method and fix gradient configuration errors in PennyLane
Use this when a PennyLane gradient call raises QuantumFunctionError, ValueError, or NotImplementedError naming the differentiation method, or when you are choosing diff_method for a new QNode. The error message names the illegal combination directly — match it before changing anything.
1. Read the exact error — it names the illegal combination
| Error text | Meaning | Fix |
|---|---|---|
Computing the gradient of circuits that return the state with the parameter-shift rule gradient transform is not supported, as it is a hardware-compatible method. | diff_method="parameter-shift" on a circuit returning qml.state() (or qml.density_matrix) | On a simulator with shots=None, switch to diff_method="backprop"; or return qml.expval instead of the state |
QuantumFunctionError: Backpropagation is only supported when shots=None. | diff_method="backprop" with finite shots | Set shots=None on the device, or switch to diff_method="parameter-shift" |
QuantumFunctionError: Adjoint differentiation method does not support measurement state | diff_method="adjoint" on a circuit returning qml.state() | Adjoint only supports expectation values of observables; use "backprop" or change the measurement |
NotImplementedError: Computing the gradient of broadcasted tapes with respect to the broadcasted parameters using the parameter-shift rule gradient transform is currently not supported. | A trainable parameter is broadcast (e.g. one RX over a batch of angles) under parameter-shift | Do not make the broadcast axis trainable: loop over the batch in Python, or use "backprop" on a simulator |
QuantumFunctionError: Device <...> does not support device with requested circuit. | diff_method="device" on a device with no native jacobian (e.g. default.qubit) | Use "best", "backprop", "adjoint", or "parameter-shift" instead — "device" needs a device that provides its own jacobian |
2. Pick diff_method from device x shots x measurement
Classify your configuration first; the matrix below gives the method:
- Simulator (
default.qubit,lightning.qubit) +shots=None+qml.expval/qml.var/qml.probs:diff_method="best"(the default) resolves to backprop ondefault.qubit— exact and usually cheapest. Use"adjoint"when the parameter count is large (much lower memory, similar runtime). Both are simulator-only. - Simulator + finite shots (
shots=1000, etc.): only hardware-compatible methods work —"parameter-shift","finite-diff","hadamard". Backprop raises theshots=Noneerror; adjoint warns and computes the gradient analytically anyway, so the gradient no longer matches the noisy forward pass. - Hardware device: only
"parameter-shift","finite-diff", or"hadamard". Backprop and adjoint are never available — this is documented, not a bug. - Circuit returns
qml.state(): only"backprop"on a simulator withshots=None. Parameter-shift and adjoint both refuse (see the error table). Never on hardware. - Circuit returns
qml.sampleorqml.counts: no gradient under any method or device. The QNode must returnqml.expval(orqml.probs) to train.
3. Know the cost before you pick
Parameter-shift needs 2 circuit evaluations per trainable parameter per gradient step, so gradient cost scales linearly with parameter count. On simulators, backprop and adjoint are usually cheaper and exact — prefer them whenever the configuration in step 2 allows. Finite shots make parameter-shift gradients noisy estimators; that is expected, not a bug.
4. Checklist for the failing gradient call
- Copy the full error text; match it to the table in step 1.
Confirm the three facts: device class (simulator vs hardware),
shotssetting (Nonevs finite), and the returned measurement type.Apply the method from step 2's matrix — not the one that worked in a tutorial with a different configuration.
Re-run the gradient call (
qml.grad(circuit)(params)or the interface's backward pass) and confirm the error is gone before tuning anything else.
Evidence
Built from the PennyLane docs (interfaces guide: backprop/adjoint are simulator-only, parameter-shift/finite-diff/hadamard are hardware-compatible), the doc/introduction/unsupported_gradients.rst page (exact QuantumFunctionError texts for backprop-with-shots, adjoint-with-state, and device-jacobian), and recurring discuss.pennylane.ai threads (parameter-shift rule is hardware-compatible so it cannot differentiate qml.state(); broadcasted-tape parameter-shift limitation).
By @issueatlas · Version 1 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_nUAkpvBe93AMtEILvA7QBA" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Choose the right PennyLane diff_method and fix gradient configuration errors <span>— Vectle</span></a>