revert(loader): multi-resolution default '1:32' (single-scale) after htpp6 falsification

The Phase 1 multi-resolution layout (10 raw + 10 agg@30 + 12 agg@100)
regressed ALL horizons in alpha-perception-htpp6 (2026-05-22):
- auc_h100:  0.681 -> 0.512  (-0.169)
- auc_h300:  0.617 -> 0.506  (-0.111)
- auc_h1000: 0.576 -> 0.526  (-0.050)

Hypothesis falsified. Root cause: Mamba2+CfC SSM encoder already used
all 32 raw ticks effectively via state-recurrence; replacing 22 raw
ticks with arithmetic-mean aggregates destroyed within-window
microstructure variance (the actual h100 signal) AND broke temporal
continuity that the recurrence relies on. Δt Fourier encoder
couldn't compensate.

Architectural pearl: SSM/RNN/CfC + multi-resolution input is
incompatible without separate-encoder-per-scale or explicit scale
tokens. Transformer-style positional encoding tolerates scale-mixing;
recurrent state updates assume consecutive positions.

Reverts default to '1:32'. Adds explicit single_scale_32() constructor
for callers (harness, tests). Keeps default_three_scale() in code with
deprecation note for future sub-variant experiments. Production
defaults across alpha_train CLI, Argo template, dispatcher script,
ml-backtesting harness now match the proven baseline.
This commit is contained in:
jgrusewski
2026-05-22 21:21:21 +02:00
parent 30db01ccc8
commit f68e0a1d0d
8 changed files with 30 additions and 18 deletions

View File

@@ -14,7 +14,7 @@
//! --mbp10-data-dir <path> \
//! --predecoded-dir <path> \
//! --epochs 5 \
//! --multi-resolution 1:10,30:10,100:12 \
//! --multi-resolution 1:32 \
//! --mamba2-state-dim 16 \
//! --lr-cfc 3e-3 \
//! --lr-mamba2 1e-3 \
@@ -56,12 +56,13 @@ struct Cli {
epochs: usize,
/// Multi-resolution input window: `<scale>:<count>[,<scale>:<count>]...`.
/// Default `1:10,30:10,100:12` gives 32 positions covering 1510 ticks
/// (10 raw + 10 aggregated@30 + 12 aggregated@100). Use `1:32` for the
/// degenerate single-scale parity-check config.
///
/// See `docs/superpowers/plans/2026-05-22-multi-resolution-input.md`.
#[arg(long, default_value = "1:10,30:10,100:12")]
/// Default `1:32` (single-scale 32 raw ticks) restores the proven
/// baseline. The Phase 1 experimental `1:10,30:10,100:12` layout
/// regressed all horizons in alpha-perception-htpp6 (2026-05-22; see
/// `docs/superpowers/plans/2026-05-22-multi-resolution-input.md` and
/// the falsification commit message). Sub-variants like
/// `1:28,100:4` may be tried in future experiments.
#[arg(long, default_value = "1:32")]
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig,
#[arg(long, default_value_t = 16)]

View File

@@ -24,10 +24,21 @@ pub struct MultiResolutionConfig {
}
impl MultiResolutionConfig {
/// Phase 1 design: 10 raw + 10 aggregated@30 + 12 aggregated@100.
/// Total 32 positions covering 1510 ticks. This is the default for
/// the alpha_train binary; tests use it unless they need a degenerate
/// single-scale config for diagnostic comparisons.
/// Production default: 32 raw ticks (single-scale). Restores the
/// pre-multi-resolution baseline behavior because the experimental
/// `default_three_scale` Phase 1 layout regressed all horizons in
/// the alpha-perception-htpp6 smoke (2026-05-22; auc_h100: 0.681 →
/// 0.512, auc_h1000: 0.576 → 0.526). Used by alpha_train CLI default
/// and ml-backtesting harness.
pub fn single_scale_32() -> Self {
Self { scales: vec![(1, 32)] }
}
/// Phase 1 EXPERIMENTAL design: 10 raw + 10 aggregated@30 + 12
/// aggregated@100 = 32 positions covering 1510 ticks. Falsified by
/// alpha-perception-htpp6 (2026-05-22) — all horizons regressed
/// vs single-scale. Retained for future variant experiments
/// (sub-variants like 28 raw + 4 agg@100); NOT the production default.
pub fn default_three_scale() -> Self {
Self { scales: vec![(1, 10), (30, 10), (100, 12)] }
}

View File

@@ -21,7 +21,7 @@ fn cfg_from_env() -> Option<MultiHorizonLoaderConfig> {
Some(MultiHorizonLoaderConfig {
files,
predecoded_dir: predec,
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::default_three_scale(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::single_scale_32(),
horizons: HORIZONS,
n_max_sequences: 100,
seed: 0xA1A2_A3A4,
@@ -65,7 +65,7 @@ fn loader_errors_on_empty_files() {
let cfg = MultiHorizonLoaderConfig {
files: Vec::new(),
predecoded_dir: PathBuf::from("/tmp/does_not_exist_foxhunt_test"),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::default_three_scale(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::single_scale_32(),
horizons: HORIZONS,
n_max_sequences: 10,
seed: 0,

View File

@@ -247,7 +247,7 @@ impl BacktestHarness {
let loader_cfg = MultiHorizonLoaderConfig {
files,
predecoded_dir: cfg.predecoded_dir.clone(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::default_three_scale(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::single_scale_32(),
horizons: ml_alpha::heads::HORIZONS,
n_max_sequences: 0,
seed: 0,

View File

@@ -43,7 +43,7 @@ fn try_loader() -> Option<MultiHorizonLoader> {
let cfg = MultiHorizonLoaderConfig {
files,
predecoded_dir: mbp10.clone(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::default_three_scale(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::single_scale_32(),
horizons: ml_alpha::heads::HORIZONS,
n_max_sequences: 0,
seed: 0xCAFE_F00D,

View File

@@ -30,7 +30,7 @@ fn try_loader(inference_only: bool) -> Option<MultiHorizonLoader> {
let cfg = MultiHorizonLoaderConfig {
files,
predecoded_dir: mbp10.clone(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::default_three_scale(),
multi_resolution: ml_alpha::data::aggregation::MultiResolutionConfig::single_scale_32(),
horizons: ml_alpha::heads::HORIZONS,
n_max_sequences: 1,
seed: 0xCAFEF00D,

View File

@@ -49,7 +49,7 @@ spec:
- name: epochs
value: "5"
- name: multi-resolution
value: "1:10,30:10,100:12"
value: "1:32"
- name: mamba2-state-dim
value: "16"
- name: lr-cfc

View File

@@ -20,7 +20,7 @@ SHA=HEAD
BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo "ml-alpha-phase-a")
GPU_POOL=ci-training-l40s
EPOCHS=5
MULTI_RESOLUTION="1:10,30:10,100:12"
MULTI_RESOLUTION="1:32"
MAMBA2_STATE_DIM=16
LR_CFC=3e-3
LR_MAMBA2=1e-3