feat(generalization): CQL alpha 0.1→1.0, gradient budget 15%→25%

CQL was effectively disabled (0.1 alpha × 0.15 budget = 1.5% of gradient).
Now: alpha=1.0 × 0.25 budget = 25% of gradient enforces conservatism.
C51 reduced from 70% to 60% to accommodate.

CQL penalizes Q-values for actions not in the data — directly prevents
the model from being "confident but wrong" on OOS state-action pairs.

Hyperopt search range updated: [0.0, 1.0] → [0.5, 5.0].

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-03-29 23:40:30 +02:00
parent c3ea0e57d1
commit ae99567362
6 changed files with 8 additions and 8 deletions

View File

@@ -39,7 +39,7 @@ tau = [0.005, 0.01] # log scale in adapter
hidden_dim_base = [128, 256] # capped at production default: 512 is 4x slower for marginal benefit
# CQL regularization
cql_alpha = [0.0, 1.0]
cql_alpha = [0.5, 5.0]
# Training dynamics
lr_decay_type = [0, 2] # discrete: 0=constant, 1=linear, 2=cosine

View File

@@ -62,7 +62,7 @@ n_steps = 3
tau = 0.005
c51_warmup_epochs = 5
her_ratio = 0.2
cql_alpha = 0.1
cql_alpha = 1.0
curiosity_weight = 0.1
iqn_lambda = 0.25
spectral_norm_sigma_max = 1.5

View File

@@ -67,7 +67,7 @@ n_steps = 3
tau = 0.005
c51_warmup_epochs = 5
her_ratio = 0.2
cql_alpha = 0.1
cql_alpha = 1.0
curiosity_weight = 0.1
iqn_lambda = 0.25
spectral_norm_sigma_max = 1.5

View File

@@ -66,7 +66,7 @@ n_steps = 3
tau = 0.005
c51_warmup_epochs = 5
her_ratio = 0.2
cql_alpha = 0.1
cql_alpha = 1.0
curiosity_weight = 0.1
iqn_lambda = 0.25
spectral_norm_sigma_max = 1.5

View File

@@ -1514,7 +1514,7 @@ impl DQNHyperparameters {
adam_epsilon: 1e-8, // f32 Adam (master weights are f32)
// Conservative Q-Learning (CQL)
cql_alpha: 0.1, // Default: mild conservatism (0.1 of 0.0-1.0 range)
cql_alpha: 1.0, // Strong conservatism — penalizes OOS-destructive Q-values
// QR-DQN (complementary to C51 — IQN for quantile estimation)
num_quantiles: 32, // Default: 32 quantiles

View File

@@ -46,9 +46,9 @@ use super::DQNHyperparameters;
/// Per-component gradient norm budget fractions for auxiliary objectives.
/// C51 gets whatever remains: `1.0 - sum(active_auxiliary_budgets)`.
/// When all auxiliaries are active: C51=70%, CQL=15%, IQN=10%, Ens=5%.
/// When auxiliaries are disabled, their budget automatically goes to C51.
pub(crate) const CQL_GRAD_BUDGET: f32 = 0.15;
/// When all auxiliaries are active: C51=60%, CQL=25%, IQN=10%, Ens=5%.
/// CQL at 25% (was 15%) to enforce conservatism on OOS-destructive Q-values.
pub(crate) const CQL_GRAD_BUDGET: f32 = 0.25;
pub(crate) const IQN_GRAD_BUDGET: f32 = 0.10;
pub(crate) const ENS_GRAD_BUDGET: f32 = 0.05;