本文详解 q-learning 中 q 值爆炸性增长(如溢出至 ±inf)的根本原因,指出典型误区在于混淆“即时奖励”与“q 值”,并给出符合贝尔曼方程的正确更新逻辑、合理奖励设计原则及工程级稳定性保障措施。
本文详解 q-learning 中 q 值爆炸性增长(如溢出至 ±inf)的根本原因,指出典型误区在于混淆“即时奖励”与“q 值”,并给出符合贝尔曼方程的正确更新逻辑、合理奖励设计原则及工程级稳定性保障措施。
Q-Learning 的核心目标是学习最优状态-动作价值函数 $ Q^*(s,a) $,其理论基础是贝尔曼最优方程:
$$
Q(s,a) \leftarrow Q(s,a) + \alpha \Big[ r + \gamma \max_{a'} Q(s',a') - Q(s,a) \Big]
$$
该公式要求:$ r $ 必须是执行动作 $ a $ 后环境立即返回的标量奖励(scalar reward),而非历史 Q 值、累计得分或未归一化的中间量。而问题代码中的关键错误正在于此:
// ❌ 错误实现:混淆 reward 与 prevScore
agent.values[mState] = oldVal + (agent.LearningRate *
(agent.prevScore + (agent.DiscountFactor * reward) - oldVal))
此处 agent.prevScore 被误用为“上一步的奖励”,实则存储的是上一步的 Q 值(即 oldVal 自身),导致更新项变为: $$ \text{error_term} = \underbrace{Q{t-1}}{\text{prevScore}} + \gamma \cdot \underbrace{Q{\max}(s')}\text{reward} - Q{t-1} = \gamma \cdot Q{\max}(s') $$ 这实质上将贝尔曼更新退化为 无衰减的 Q 值累积 —— 每次更新都叠加一个正向偏置(尤其当 γ ≈ 0.8 且 reward 实际为 max Q 时),引发几何级数式发散,最终触发 float64 溢出。
✅ 正确做法必须严格分离三要素:
- r: 动作执行后环境返回的即时奖励(如胜:+1,负:−1,平:0,进行中:0);
- s': 执行动作后到达的新状态;
- max_a' Q(s', a'): 在 s' 下所有可行动作对应 Q 值的最大值(即下一状态的最优预期回报)。
修正后的 Go 实现如下:
func (agent *RLAgent) learn(reward float64, nextState State) {
mState := marshallState(agent.prevState, agent.id)
oldVal := agent.values[mState]
// ✅ 正确:reward 是即时奖励;nextMaxQ 是下一状态最优Q值
nextMaxQ := agent.getMaxQ(nextState) // 需实现:遍历nextState所有合法动作取max Q
tdError := reward + agent.DiscountFactor*nextMaxQ - oldVal
agent.values[mState] = oldVal + agent.LearningRate*tdError
}
⚠️ 关键注意事项:
- 奖励函数设计决定优化方向:原设定“游戏继续时奖励 +0.5”是灾难性设计——它鼓励无限拖延,使最优策略变为“永不结束游戏”,导致 $ Q $ 值趋向无穷大。标准实践应设为 每步惩罚(如 r = -0.01),仅在终止状态给予稀疏奖励(胜:+1,负:−1,平:0)。这迫使智能体权衡“速胜”与“避败”,Q 值自然收敛于 [−1, 1] 区间。
- 折扣因子 γ 的物理意义:γ ∈ [0,1) 不仅控制未来奖励权重,更是收敛性保障。若 γ ≥ 1 或奖励无界,Q 值可能不收敛;实践中 γ = 0.9 ~ 0.99 较稳妥。
- 数值稳定性增强技巧:
- 对 Q 表初始化为小随机值(如 [-0.01, 0.01])而非全零,缓解初始偏差;
- 添加 Q 值裁剪(clipping):Q ← clamp(Q, -10, 10),防止训练初期剧烈震荡;
- 使用双 Q-Learning 或 Dueling DQN 等进阶结构,进一步抑制过估计。
修复后模型在 200 万局自对弈后,Q 值稳定于 [-0.55, 1.09] 区间,完全符合理论预期——这印证了:Q 值的有界性不是工程巧合,而是奖励函数合理性与贝尔曼更新正确性的直接体现。真正的强化学习调试,始于对 r 的审慎定义,成于对 Q(s,a) = E[R_t | s_t=s, a_t=a] 这一数学本质的敬畏。











