Thibaut Forest
docs: phase 67 - T4 count-flat campaign (6 lanes, ~50 arms) all rejected with mechanisms; 60d65da = count-flat ceiling
e4aaa05
|
Raw History Blame Contribute Delete
4.47 kB
# T4 SEQUENCE lane: GRU temporal encoder on raw daily telemetry (NEGATIVE)
Date 2026-08-23. Baseline: head 60d65da (order .50 logbag(vm7) + .30 wiener
+ .20 gapHGB; values logbag @ alpha 1.0; planner tw 2.0 / split 3), reference
per-cell CSV /tmp/ref_head_1541.csv, CV 1541.3 on bgkf. All arms paired vs
that reference on the 48 all-building scenario totals.
## Hypothesis
The whole stack is snapshot features; degradation SHAPE (knees, dips,
recovery, plateau texture) in the raw daily series is unexploited. A small
recurrent encoder (CMAPSS / battery-SoH literature) on the last 60 days of
daily telemetry as a new order source.
## Method
- Sequences: per (device, origin) row of the feature table, the 60 calendar
days ENDING at the origin (leak spot-checked). 4 channels: daily median
v_corr (v - 0.005*(t-20), last-obs-carried-forward, fixed physical
normalization - nothing fitted), observed mask, days-since-last-obs
(GRU-D-style delta, /90), temp-gated in-band coverage mask. Built once for
all 71,878 rows (no cross-device stats, so one cache serves every fold).
Builder: /tmp/c22/build_seqs.py -> /tmp/c22/seqs.npz.
- Encoder: GRU(4 -> hidden 48, 2 layers, dropout 0.1) -> linear logit on
dies42. BCE, pos_weight = neg/pos, positives urgency-weighted (RankNet
'days' precedent). Adam lr 3e-3, wd 1e-3, 30 epochs, batch 1024.
- Fold safety: exact replication of run_bgkf's split (cv.build_folds) and
train subset (closed rows, fold-train buildings only). NO self-supervised
pretraining, no test-fold telemetry in any fit (phase-51 lesson honored).
Seed ensemble = 5 seeds, combined as mean of within-fleet pct ranks.
Fitter: /tmp/c22/fit_seq.py -> /tmp/c22/seq_scores_f{0..4}.parquet.
- Measurement: cv.run_bgkf(kind='logbag', variant='vm7', blend=(arm,1.0),
p_star=1.0, split_days=3, timing_weight=2.0) - value-preserving order
mapping, counts fixed. Driver /tmp/c22/run.py; per-cell CSVs
/tmp/cv_bgkfcand_c22_*.csv.
- Parity control: re-implemented champion order reproduces the reference
EXACTLY (+0.0, 46/48 cells identical), so arm deltas are clean.
## Encoder quality (out-of-fold, test-building closed real-origin rows)
| fold | seq AUC | -v_last AUC | pos |
|------|---------|-------------|-----|
| 0 | 0.951 | 0.944 | 123 |
| 1 | 0.942 | 0.946 | 91 |
| 2 | 0.939 | 0.964 | 80 |
| 3 | 0.908 | 0.779 | 71 |
| 4 | 0.956 | 0.954 | 61 |
The encoder is real (it generalizes across buildings; fold 3 shows it beats
the raw level where v_last fails) but overall only ~matches a single strong
snapshot feature.
## Results (paired vs head 1541.3; 48 scenarios)
| arm | order | SCORE | delta +/- SE | sig | W/L | wilcoxon | swaps |
|-----|-------|-------|--------------|-----|-----|----------|-------|
| champ (parity) | .50/.30/.20/- | 1541.3 | +0.0 +/- 0.0 | 0.4 | 1W/1L | nan | 2.27 |
| (d) seq_alone | 0/0/0/1.0 | 1935.7 | +394.4 +/- 71.3 | 5.5 | 9W/39L | 0.000 | 2.26 |
| (a) seq_g20 | .50/.30/0/.20 | 1654.3 | +113.0 +/- 36.5 | 3.1 | 14W/21L | 0.017 | 2.27 |
| (c) seq_w30 | .50/0/.20/.30 | 1613.8 | +72.5 +/- 27.1 | 2.7 | 20W/22L | 0.089 | 2.25 |
| (b) seq_4th | .45/.27/.18/.10 | 1584.1 | +42.8 +/- 20.4 | 2.1 | 9W/14L | 0.140 | 2.27 |
| dose ctrl | .475/.285/.19/.05 | 1562.9 | +21.6 +/- 16.9 | 1.3 | 6W/7L | 0.508 | 2.27 |
All arms count-flat (2.25-2.27 vs ref 2.27). Dose-response is MONOTONE
against the source: 0 -> +0.0, .05 -> +21.6, .10 -> +42.8, .20 -> +113.0.
Every insertion point (gap slot, wiener slot, 4th source, any weight) makes
the order worse; the losses are significant in the wrong direction.
## Verdict
REJECTED (new-mechanism tier needs >= 2 sigma IMPROVEMENT; we have 2-5 sigma
degradation). The temporal-shape signal the GRU extracts is already captured
by the snapshot stack (slopes, accel, drop_recent, wiener drift, gap
features); at the margin the encoder adds noise, not recall. Standalone
anchor (1935.7) confirms it is far from champion-grade on its own.
Do NOT retest: GRU/temporal encoder on daily (v_corr, mask, delta, in-band)
sequences as an order source at any slot/weight in the 3-way order. A
materially different attempt would need a different signal (e.g. sub-daily
texture), not different weights.
## Deployment cost (moot, for the record)
Fit: ~7 s/epoch uncontended at 2 torch threads -> ~3.5 min/seed, ~17.5 min
for the 5-seed ensemble (deployment fits once on full train); inference on
the whole table <10 s. Inside the 30-min budget, but not shipped.