Detecting Model Degradation in Production
Degradation — a slow decline in a deployed model's accuracy or calibration — is caught by tracking performance against delayed ground truth and independent references.
The slow failure
Some production failures are sudden and caught instantly by output monitors. Degradation is the opposite: a gradual erosion of accuracy or calibration as the machine ages, components condition, and operating regimes shift. It rarely trips a single-cycle alarm, so it is detected by tracking performance trends over time against ground truth that arrives with delay.
Because the outcome of a pulse is known only after the pulse, degradation detection is inherently retrospective. As labels arrive into L0, the model's realized error and calibration are recomputed over rolling windows and compared to its validated baseline. A statistically significant, sustained decline is degradation, distinct from noise or a single bad pulse.
Degradation indicators
- Rising rolling error against delayed ground truth
- Calibration decay: predicted uncertainty no longer matches realized error
- Rising abstention or out-of-envelope frequency
- Growing disagreement with the physics twin over time
- Increasing correction magnitude applied by downstream L1 limiters
def degradation_score(model, window, baseline):
err = rolling_error(model, window) # vs delayed labels
cal = rolling_ece(model, window)
dz_e = zscore(err, baseline.err)
dz_c = zscore(cal, baseline.cal)
return max(dz_e, dz_c) # > threshold, sustained -> flag retrain
Confirmed degradation lowers the model's confidence weighting in the twin and schedules a prioritized L0 retrain; if it crosses a hard threshold, it can force rollback to the previous certified version. Degradation is a normal, expected fact of running real machines over years, which is exactly why the continual-learning loop exists — to refresh models faster than they decay.