diff --git a/crates/ml-alpha/cuda/smoothness_lambda_controller.cu b/crates/ml-alpha/cuda/smoothness_lambda_controller.cu index 0a58e75a2..1ebb41065 100644 --- a/crates/ml-alpha/cuda/smoothness_lambda_controller.cu +++ b/crates/ml-alpha/cuda/smoothness_lambda_controller.cu @@ -4,7 +4,7 @@ // Reads `raw_per_h[5]` (emitted by output_smoothness_loss_and_grad), // maintains a per-horizon Wiener-α-floor EMA of observed jitter, // derives per-horizon target by anchoring on observed h30 jitter -// scaled by HORIZONS[0]/HORIZONS[h], and emits next-step λ[h] with a +// scaled by sqrt(HORIZONS[0]/HORIZONS[h]), and emits next-step λ[h] with a // permanent floor. // // Per `pearl_controller_anchors_isv_driven`: target is signal-derived, @@ -33,14 +33,21 @@ #define SLC_ALPHA_FLOOR 0.5f // HORIZONS = {30, 100, 300, 1000, 6000}. -// Ratios HORIZONS[0]/HORIZONS[h] = {1, 0.3, 0.1, 0.03, 0.005}. -// Constant array known at compile time. +// Target ratio sqrt(HORIZONS[0]/HORIZONS[h]) = {1, 0.5477, 0.3162, 0.1732, 0.0707}. +// +// Rationale (2026-05-21 local-smoke trace finding): the linear ratio +// {1, 0.3, 0.1, 0.03, 0.005} gave h6000 a 200x stronger target-undershoot +// signal than h30, causing the controller to bombard h6000 with smoothness +// gradient while h30 saw little. At base_lambda=0.1 local smoke this +// collapsed h6000 val_auc to 0.514 (near-random) while middle horizons +// improved. Square-root scaling caps the differential at ~14x, preserving +// h6000 predictive capacity while still pushing toward slower change. __device__ __constant__ float TARGET_K_RATIO[SLC_N_HORIZONS] = { - 1.0f, - 30.0f / 100.0f, - 30.0f / 300.0f, - 30.0f / 1000.0f, - 30.0f / 6000.0f, + 1.0f, // sqrt(30/30) = 1.0 + 0.5477226f, // sqrt(30/100) + 0.3162278f, // sqrt(30/300) + 0.1732051f, // sqrt(30/1000) + 0.0707107f, // sqrt(30/6000) }; extern "C" __global__ void smoothness_lambda_controller(