What a certificate of forgetting actually certifies
Notes on (ε, δ)-certified removal, the Newton-step update behind it, and what the guarantee does and does not say about a deployed model.
On this page
Sample post: the maths below is a faithful sketch, but treat the numbers as illustrative.
Machine unlearning asks a deceptively simple question: after a model has been trained on a dataset , how do we remove the influence of one example without paying for a full retrain? The interesting part is not the removal. It is deciding what it means to say the removal worked.
The definition
Let be a learning algorithm and a removal mechanism. Write . We say performs -certified removal if, for every measurable set of models ,
and symmetrically with the two probabilities swapped. This borrows its shape from differential privacy, but notice the asymmetry: the reference distribution is retraining from scratch, not a neighbouring dataset in the abstract.1
The practical reading is a hypothesis test. An adversary who sees the final weights should not be able to tell, with advantage larger than and allow, whether was ever in the training set.
A one-step removal for convex losses
For an -regularised, strongly convex objective, a single Newton step gives a closed-form correction. If minimises the loss on and is the Hessian of the loss over at , then
The residual gradient norm is bounded by a term that shrinks like under smoothness assumptions, so for large datasets the approximation is excellent. Adding calibrated Gaussian noise to the training objective then converts that small residual into a formal statement.
import numpy as np
def remove_example(theta, X, y, i, lam):
"""One Newton step that removes example i from a ridge-regularised logistic model."""
n, d = X.shape
keep = np.arange(n) != i
Xk, yk = X[keep], y[keep]
p = 1.0 / (1.0 + np.exp(-Xk @ theta))
H = (Xk.T * (p * (1 - p))) @ Xk + lam * (n - 1) * np.eye(d)
pi = 1.0 / (1.0 + np.exp(-X[i] @ theta))
grad_i = (pi - y[i]) * X[i] # gradient of the removed example's loss
return theta + np.linalg.solve(H, grad_i) The cost is one Hessian solve, , independent of once is cached. Retraining is .
What it does not certify
The guarantee is about the weights. It says nothing about everything downstream of them. A short, deliberately incomplete list:
| Artefact | Covered by the certificate? | Why |
|---|---|---|
| Final weights | Yes | This is what the definition constrains |
| Logged training gradients | No | Not part of ‘s output |
| Embeddings cached in a vector store | No | Computed from weights before removal |
| Outputs already served to users | No | History cannot be edited |
| Fine-tuned descendants | No | They inherit the old weights |
Where this leaves deep networks
Everything above leans on convexity. For deep networks the Hessian is indefinite and the residual bound is unavailable, so published methods fall back to empirical audits: membership-inference tests, or comparing against retrained models over many seeds. Those are useful, but they estimate risk; they do not certify it.2
Open questions
- Can the residual bound be restored for overparameterised models near initialisation, where training behaves almost linearly?
- How should a certificate compose when removal requests arrive sequentially and each uses a noisy update?
- What is the right reference distribution when the “retrained” model would itself depend on random data order?
Footnotes#
-
The reference distribution being retraining is the key design choice. It makes the guarantee operational: the regulator’s mental model is “as if you had never seen it”. ↩
-
Reporting an empirical audit alongside a certificate on the convex part of a pipeline is, in my view, the honest middle ground. ↩