Elastic Weight Consolidation prevents catastrophic forgetting when the on-device model learns new CSI tasks. The Fisher information matrix protects important weights from past tasks while leaving capacity for the next one.
Each task is a distinct CSI classification target the model has learned. Consolidated tasks contribute to the EWC penalty; the active task is currently being trained.
| ID | Name | Samples | Accuracy | Fisher norm | Status |
|---|
The diagonal Fisher matrix estimates parameter importance for each consolidated task. Larger values pin weights closer to their previous optimum, raising the EWC penalty when they drift.
| Layer | Index | Weight θ | θ* | F |
|---|
θ* snapshots are taken at every consolidation event. The EWC penalty Σ Fᵢ (θᵢ − θ*ᵢ)² is computed against these anchors during subsequent training.
| Snapshot | Task | Stored | Bytes | ‖θ*‖₂ |
|---|
All weight_consolidated, task_learned, and fisher_updated events emitted by the on-device runtime.
Hyperparameters and runtime configuration for the EWC lifelong learning loop.
A short field guide to running Elastic Weight Consolidation on a 24 KB ESP32-S3 model fed by raw WiFi CSI.
When a small on-device model is fine-tuned on a new task, gradient descent quickly overwrites the weights that mattered for past tasks — a problem known as catastrophic forgetting.
EWC measures, per parameter, how much it mattered for past tasks (the diagonal Fisher information F) and adds a quadratic penalty that pulls important weights back toward their consolidated values θ*. The model keeps spare capacity for the new task while preserving what it has already learned.
Fine-tune on the new task until rolling accuracy ≥ threshold (default 92%).
Compute diagonal Fisher over a held-out CSI batch (default 512 samples).
Persist current weights as a new anchor. Emit weight_consolidated.
Activate the next task. The EWC penalty kicks in immediately.
When the 24 KB budget is hit, the oldest anchor is purged and F is merged.
task_id: "T05" name: "breathing-rate" accuracy: 0.93 samples: 1893
batch_size: 512 mean_f: 0.0084 max_f: 0.612 duration_ms: 214
anchor_id: "A05" task_id: "T05" bytes: 3712 norm_l2: 12.8
Anchor capacity is ⌊(24 − model − fisher − buffers) / 3.7⌋. On this footprint that leaves room for ~1 anchor at a time, so older anchors are recycled (their F is merged into the kept anchor) when a new task consolidates.