jgrusewski
9c249e2a27
fix(dqn): symmetric distributional support + near-zero output init to unfreeze Q-values
Root cause: C51 distributional DQN Q-values frozen at ~7.0 for all 30 epochs.
Asymmetric hyperopt support (v_min=-6.7, v_max=17.6) caused init Q ≈ midpoint
= 5.48, creating a self-reinforcing equilibrium that gradient signal couldn't
escape. Additionally, log_q_values() queried the wrong (untrained) network.
Three fixes:
1. Enforce symmetric support in hyperopt: v_min=-v_range, v_max=+v_range
(midpoint always 0, Q starts unbiased)
2. Near-zero init for distributional output layers (value_out, advantage_out):
0.01× Xavier scale → softmax ≈ uniform → Q ≈ midpoint regardless of support
3. Fix log_q_values() to use self.forward() (unified dispatch through
dist_dueling → dueling → standard) instead of self.q_network.forward()
Tests: 350 ml-dqn + 841 ml + 3 ml-core = 1194 passed, 0 failed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 18:11:22 +01:00
..
2026-03-01 22:47:39 +01:00
2026-03-08 02:42:53 +01:00
2026-03-05 00:22:04 +01:00
2026-03-01 22:47:39 +01:00
2026-03-07 23:28:18 +01:00
2026-03-01 22:47:39 +01:00
2026-03-01 22:47:39 +01:00
2026-03-08 18:11:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 18:11:22 +01:00
2026-03-01 22:47:39 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 18:11:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:21:46 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-08 15:17:22 +01:00
2026-03-01 22:47:39 +01:00
2026-03-05 23:19:38 +01:00
2026-03-01 22:47:39 +01:00
2026-03-01 22:47:39 +01:00
2026-03-05 00:18:58 +01:00
2026-03-01 22:47:39 +01:00
2026-03-03 22:16:35 +01:00