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.