feat(ml-alpha): decision-stride loader + CLI + Mamba2 dt_s scaling (Phase 2A)
Decision-stride S lets a length-K sequence span ((K-1)*S + 1) raw snapshots instead of K consecutive ones — expands the effective time-window covered by each sequence at the same K-positions compute cost. With K=64 and S=4, the window covers 256 ticks (~5s on ES MBP-10 at 20ms-tick) instead of 64 ticks (~1.3s). Loader (crates/ml-alpha/src/data/loader.rs): - `MultiHorizonLoaderConfig.decision_stride: usize` (default 1, must pre-existing call sites add the new field). - `next_sequence` reads snapshot at `anchor + k * stride`; labels at the same indices (labels stay in absolute-snapshot horizons regardless of stride, e.g. h=6000 always means "predict 6000 raw snapshots forward"). - `prev` snapshot for microstructure features (prev_mid, prev_ts_ns) now points to the prior K-position (`anchor + (k-1)*stride`), NOT the consecutive-snapshot prior, so `Δt = ts_ns - prev_ts_ns` carries the actual elapsed time between K-positions (consumed by Mamba2's dt_s and the planned Phase 2C TGN Fourier features). - New `#[ignore]` real-data test: `loader_stride_4_yields_correct_spacing` asserts Δt monotonicity at stride=4. Mamba2 dt_s (crates/ml-alpha/src/trainer/perception.rs): - `PerceptionTrainerConfig.decision_stride: usize` plumbs the stride through. dispatch_train_step + evaluate_batched now use `dt_s = decision_stride as f32` so Mamba2's selective scan `exp(-dt * sigmoid(a))` reflects the real elapsed time. With stride=1 the behaviour is identical to before. CLI (crates/ml-alpha/examples/alpha_train.rs): - `--decision-stride <S>` flag (default 1) wired into both train and val loaders + PerceptionTrainerConfig. Argo workflow: - `decision-stride` parameter on the template (default "1") + `--decision-stride` script flag + propagation into the train pod's alpha_train invocation. Synthetic smoke (tests/perception_overfit.rs): - `stacked_trainer_loss_shrinks_with_stride_4` proves the trainer-level dt_s=4.0 keeps the Mamba2+LN+CfC+GRN chain numerically stable. Converges 0.32 → 0.0000 (matches stride=1 smoke trajectory — dt_s scaling didn't break the SSM dynamics). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,7 @@ EARLY_STOP_PATIENCE=5
|
||||
CV_FOLD=0
|
||||
CV_N_FOLDS=1
|
||||
CV_TRAIN_WINDOW=0
|
||||
DECISION_STRIDE=1
|
||||
WATCH=false
|
||||
|
||||
usage() {
|
||||
@@ -53,6 +54,7 @@ Usage: $0 [OPTIONS]
|
||||
--cv-fold <k> CV fold index (default: $CV_FOLD)
|
||||
--cv-n-folds <N> Total CV folds (default: $CV_N_FOLDS)
|
||||
--cv-train-window <W> Files per train window (default: $CV_TRAIN_WINDOW = auto)
|
||||
--decision-stride <S> Snapshot stride for sequence sampling (default: $DECISION_STRIDE)
|
||||
--watch Follow logs via argo watch
|
||||
EOF
|
||||
}
|
||||
@@ -77,6 +79,7 @@ while [[ $# -gt 0 ]]; do
|
||||
--cv-fold) CV_FOLD="$2"; shift 2 ;;
|
||||
--cv-n-folds) CV_N_FOLDS="$2"; shift 2 ;;
|
||||
--cv-train-window) CV_TRAIN_WINDOW="$2"; shift 2 ;;
|
||||
--decision-stride) DECISION_STRIDE="$2"; shift 2 ;;
|
||||
--watch) WATCH=true; shift ;;
|
||||
-h|--help) usage; exit 0 ;;
|
||||
*) echo "Unknown option: $1"; usage; exit 1 ;;
|
||||
@@ -147,4 +150,5 @@ argo submit -n foxhunt --from=wftmpl/alpha-perception \
|
||||
-p cv-fold="$CV_FOLD" \
|
||||
-p cv-n-folds="$CV_N_FOLDS" \
|
||||
-p cv-train-window="$CV_TRAIN_WINDOW" \
|
||||
-p decision-stride="$DECISION_STRIDE" \
|
||||
$WATCH_FLAG
|
||||
|
||||
Reference in New Issue
Block a user