FEATURED · 精选文章

强化学习顿悟记:从 Q 表到 DQN,三个击穿本质的思维跃迁

发布时间 / 2026/9/6 2:18:02
来源 / 创域科博编辑部
栏目 / 资讯中心
强化学习顿悟记:从 Q 表到 DQN,三个击穿本质的思维跃迁 强化学习顿悟记从 Q 表到 DQN三个击穿本质的思维跃迁在学习强化学习RL从传统算法迈向深度强化学习DQN的过程中很多人会被密密麻麻的数学公式、神经网络结构、复杂的循环搞得晕头转向。但当你真正看透代码底层的那一刻你会发现复杂的 DQN 本质上只是传统 Q-Learning 的一种“自然演化”。本文记录我在剖析源码时的三次关键顿悟带你一眼看穿 DQN 的核心底牌。顿悟一反向传播不过是传统“改表格”的暗度陈仓很多人把深度强化学习当成一个全新的黑盒但对比下面两段代码你会发现它们在物理意义上完全等价1. 传统 Q-Learning显式“硬改表格”在状态少的小游戏如走格子里Q 值是一张矩阵大表# 1. 算出目标与当前预测的差距updatetarget-value# 2. 乘以学习率直接把对应格子的数值挪过去Q[row,col,action]lr*update逻辑非常朴素算出来差多少就直接修改内存矩阵里(状态, 动作)那个格子的数字强行对齐。2. 深度强化学习 DQN隐式“反向传播”当游戏变得像王者荣耀、Atari 画面那样状态多到几亿种内存存不下这张大表了。于是我们用神经网络充当“查表函数”输入状态sss输出每个动作的价值Q(s,a)Q(s, a)Q(s,a)。但神经网络没有格子给你直接赋值该怎么更新# 1. 计算均方误差损失 (MSE)lossloss_fn(value,target)# 相当于 (value - target)^2# 2. 反向传播更新网络参数loss.backward()optimizer.step()核心结论DQN 的反向传播本质上就是在用梯度下降去实现传统表格里那句Q 步长 * (target - value)传统方法状态有限直接修改格子的绝对数值显式硬改。深度学习状态无限把 Target 当作临时标签通过损失函数与反向传播调整全网权重间接让输出逼近 Target隐式逼近。顿悟二双模型之谜——动作模型modelvs 经验模型prev_model在 DQN 训练中最让人头疼的代码往往是为什么需要两个模型一个动作模型model一个经验模型prev_model。1. 贪吃蛇打靶隐喻移动的靶子强化学习的 Target 是通过下一步的预估算出来的TargetRewardγmax⁡Q(Snext,A′)\text{Target} \text{Reward} \gamma \max Q(S_{next}, A)TargetRewardγmaxQ(Snext​,A′)如果你只用一个模型你射出一箭预测当前value。同时靶子也在跑target也由正在更新的模型实时计算。结果就是边打靶靶子边晃网络参数剧烈震荡训练彻底崩溃。2. 角色分工与协作模型角色代码变量名实际输入核心职责动作模型model(state, action)负责做决策、算当前value每一步都在反向传播更新动态射手经验模型prev_model(next_state)负责算未来的最大期望target权重暂时冻结静止靶子每隔固定步数例如 10 步才会把model的最新参数同步给prev_modelif(i1)%100:prev_model.load_state_dict(model.state_dict())核心本质经验模型prev_model本质上就是“上一个阶段沉淀下来的老模型”。用历史阶段沉淀下的稳定自己prev_model冻结参数定出固定靶心来考核当前正在努力学习的自己model反向传播往前跨一步。靶子定住训练自然稳定顿悟三目标同步的艺术——游戏镜头“弹簧缓动Spring”式的软更新在看到每隔 10 步生硬地全盘拷贝权重时if (i 1) % 10 0:很多人的第一直觉是“能不能根据指标来比如等Loss 降低到指定阈值才同步是不是更科学”1. 强化学习的陷阱Loss 变小 ≠ 策略变强在监督学习里Loss 越低越好但在强化学习中直接拿 Loss 当阈值是个巨大陷阱局部死锁模型如果陷入原地打转的死胡同行为极度单一Loss 也会趋近于 0容易“假性早熟”把 Target 锁死在错误目标上。探索剧震当 Agent 偶然吃到大奖探索到全新领域Loss 会瞬间暴增。门槛两难阈值高了震荡阈值低了可能一辈子也达不到导致prev_model永远无法更新。2. 游戏开发者的灵感摄像机弹簧缓动Spring / Lerp现代强化学习如 DDPG、TD3、SAC采用了一种极其优雅且物理感十足的方案——软更新Soft Update / Polyak 平均。这与游戏引擎里**第三人称摄像机的弹簧臂Spring Arm / Lerp 缓动跟随**完全是同一个数学原理# 游戏镜头跟踪角色避免镜头瞬移生硬使用线性插值平滑跟随camera_posLerp(camera_pos,player_pos,tau)# 强化学习软更新避免 Target 断崖式跳跃让经验模型像弹簧阻尼一样丝滑跟随forprev_param,paraminzip(prev_model.parameters(),model.parameters()):prev_param.data.copy_(0.005*param.data0.995*prev_param.data)θprev←τ⋅θmodel(1−τ)⋅θprev(τ0.005)\theta_{\text{prev}} \leftarrow \tau \cdot \theta_{\text{model}} (1 - \tau) \cdot \theta_{\text{prev}} \quad (\tau 0.005)θprev​←τ⋅θmodel​(1−τ)⋅θprev​(τ0.005)硬更新% 10就像摄像机每隔 10 秒“瞬移”一次画面产生突兀的跳跃。软更新Spring 跟随经验模型prev_model带着惯性和微小阻尼永远在每一步悄悄向主模型靠拢一点点。既不会让靶子乱晃又告别了生硬顿挫训练曲线稳如磐石终极总结表格 vs DQN查表是手动填数DQN 是借反向传播调权重两者都在把value拉向target。动作模型 vs 经验模型一个是活泼好学的当前射手model一个是沉稳冻结的历史靶子prev_model靶子定住射手才能练出神准枪法。硬同步 vs 软跟随别用 Loss 阈值防踩坑用游戏镜头式的“弹簧阻尼缓动Lerp”让经验模型丝滑跟随稳步迭代
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻