十二:强化学习:Q-learning、Dyna-Q 与 DQN¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247483936&idx=1&sn=77e7cfef0eaa8d3954de8027088730ab&chksm=f01eb159c769384f1a1dc8a6a12ba993d928f127c768b15a98f1d7ee7c01c269d3806375bcd5#rd
1. 学习定位¶
第十一天已经学习了 Sarsa 与多步 Sarsa。第十二天继续强化学习值函数方法,从表格型 Q-learning 过渡到函数近似,再进入 DQN(Deep Q-Network)。 本日知识链路:
Sarsa: on-policy TD control
-> Q-learning: off-policy TD control
-> Dyna-Q: real experience + learned model planning
-> function approximation: 用参数模型近似 Q(s,a)
-> DQN: 用深度神经网络近似 Q 函数
-> experience replay + target network 稳定训练
-> Double DQN / Dueling DQN / PER / Rainbow 等改进
2. Q-learning¶
Q-learning 是 off-policy TD control。它用行为策略采样数据,但学习目标是贪心目标策略。 更新公式:
TD target:
TD error:Sarsa 与 Q-learning 的关键区别:
Sarsa target:
R + gamma Q(S', A')
A' 是行为策略实际采样动作
Q-learning target:
R + gamma max_a Q(S', a)
使用下一状态的贪心动作
3. Dyna-Q 的基本思想¶
Dyna-Q 把 model-free learning 和 model-based planning 结合起来。智能体每次真实交互后,做两件事:
1. 用真实 transition 更新 Q。
2. 用真实 transition 更新环境模型。
3. 从模型中采样过去的 state-action,生成模拟 transition,再额外更新 Q。
observe real transition (S,A,R,S')
Q-learning update using real transition
Model(S,A) <- (R,S')
repeat n times:
sample previously observed (S,A)
get simulated (R,S') from Model
Q-learning update using simulated transition
4. 表格方法(代表算法:Q-learning、Sarsa、Dyna-Q)的局限¶
表格型方法为每个状态动作对存一个数:
局限: - 状态空间巨大时无法存储。-
连续状态无法直接查表。
-
从未访问过的状态动作对没有泛化能力。
-
图像、文本、传感器数据等高维观测不能直接作为表格索引。
因此需要函数近似:
其中w 是可学习参数,可以是线性模型、决策树、神经网络或深度网络。
5. 函数近似的 Q 学习¶
用参数模型近似 Q 函数后,一次 TD 更新可以写成监督学习形式:
半梯度更新:
称为 semi-gradient,是因为 target 里也含有当前参数w,但更新时通常只对 prediction 求梯度,不对 target 反传。
函数近似带来泛化能力,但也带来不稳定性。尤其是 off-policy、bootstrapping、function approximation 同时出现时,训练可能发散,这被称为 deadly triad。
6. DQN 的核心定义¶
DQN 用深度神经网络近似动作价值函数:
经典 Atari DQN 中:input:
多帧游戏画面堆叠,例如 84 x 84 x 4
network:
CNN feature extractor + MLP
output:
每个离散动作对应一个 Q 值
shape = [num_actions]
max_a Q(s,a),通常需要 DDPG、SAC 等连续控制算法。
7. DQN 损失函数¶
DQN 的目标是最小化 TD target 和当前 Q 预测之间的差。
使用 target network theta^- 时:
done=True:
损失函数:
这就是均方误差损失(MSE)。常用 Huber loss 替代 MSE,以降低异常 TD error 对训练的冲击。
8. Experience Replay经验回放¶
Experience replay 维护一个 replay buffer:
每次和环境交互得到的经验先存起来,训练时不只用最新 transition,而是从 buffer 中随机采样 minibatch 更新网络。 作用: - 打破连续样本之间的强相关性。-
提高样本利用率。
-
让训练数据分布更平滑。
-
允许多次复用过去经验。
Replay buffer 也有代价:样本可能过旧,off-policy 偏差更明显;buffer 太小会相关性强,太大可能包含过时策略数据。
9. Target Network¶
如果 target 和 prediction 都使用同一个网络,target 会随着参数更新同时移动,训练容易震荡:
DQN 使用 target network:target network 每隔若干步从 online network 复制参数:
或者使用 soft update: 作用是让 TD target 更稳定。10. DQN 训练流程¶
典型流程:
initialize online Q network theta
initialize target Q network theta^- = theta
initialize replay buffer D
for each environment step:
choose action using epsilon-greedy(Q_theta)
execute action, observe r, s', done
store (s,a,r,s',done) in D
sample minibatch from D
y = r + gamma * (1-done) * max_a' Q(s',a';theta^-)
minimize loss (y - Q(s,a;theta))^2
periodically update theta^- <- theta
11. DQN 与监督学习的关系¶
DQN 的单步更新看起来像监督学习:
但它不是普通监督学习,原因是: - label 是 bootstrap target,由模型自身估计生成。-
数据分布由当前策略和 replay buffer 决定。
-
target 会随参数和策略变化而变化。
-
探索策略会影响训练数据覆盖。
因此 DQN 的训练稳定性比普通监督学习更敏感。
12. Double DQN¶
标准 DQN 的 target 使用同一个 target network 完成动作选择和动作评估:
max 操作容易带来过估计,因为噪声较大的动作可能被选中。
Double DQN 解耦动作选择和动作评估:
online network 选择动作,target network 评估该动作,从而缓解 Q 值过估计。
13. Dueling DQN¶
Dueling DQN 把 Q 值拆成状态价值和优势函数:
为了避免 V 和 A 不可辨识,常用聚合方式:
直觉:在很多状态下,知道“这个状态整体好不好”比精细区分每个动作更重要。Dueling 结构可以更有效地学习状态价值,尤其在动作之间差异不明显时有帮助。
14. Prioritized Experience Replay PER 优先回放¶
普通 replay buffer 均匀采样。Prioritized Experience Replay(PER)让 TD error 大的样本更可能被采样:
为了修正非均匀采样带来的偏差,使用 importance sampling weight:
PER 能更频繁学习“当前模型误差大”的样本,但也可能放大噪声样本。
15. Rainbow DQN 的常见组件¶
Rainbow DQN 把多种 DQN 改进组合起来: - Double DQN:减少过估计。
-
Dueling network:分离状态价值和优势。
-
Prioritized replay:优先学习高 TD error 样本。
-
Multi-step return:加快奖励传播。
-
Distributional RL:学习回报分布而不只是期望。
-
Noisy Nets:用参数噪声改进探索。
面试中不一定要推导 Rainbow,但要能说出每个组件解决的问题。
16. 实现细节与排错¶
常见实现要点:
Q_values = q_net(states) # [batch, num_actions]
Q_sa = Q_values.gather(1, actions) # [batch, 1]
with no_grad:
next_Q = target_net(next_states).max(dim=1)
y = rewards + gamma * (1-dones) * next_Q
done=True 时没有去掉 bootstrap。
-
actionsshape 不对,gather取错维度。 -
target network 没有冻结梯度。
-
replay buffer 初始样本太少就训练。
-
epsilon 衰减过快导致探索不足。
-
Q 值尺度爆炸导致 loss 不稳定。
-
evaluation 时仍然使用高 epsilon。
17. DQN 的局限¶
DQN 的局限包括: - 主要适合离散动作空间。
-
对超参数和奖励尺度敏感。
-
样本效率仍然不高。
-
off-policy + bootstrapping + function approximation 组合可能不稳定。
-
对部分可观测任务,需要帧堆叠、RNN 或记忆机制。
-
在复杂文本/Agent 场景中,动作空间和状态空间远超 Atari。
18. 与 LLM、RLHF、Agent 的联系¶
DQN 本身不是 LLM RLHF 的主流算法,但它提供了重要思想: - 用神经网络近似价值函数。
-
用 replay buffer 提高样本利用率。
-
用 target network 稳定 bootstrap target。
-
用 Double/Dueling/PER 等技术处理估计偏差和训练效率。
在 Agent 场景中,如果高层动作是有限工具集合,理论上可以用 DQN 类方法学习工具选择策略。但真实系统通常还要处理巨大状态、非平稳用户、稀疏奖励和安全约束。
19. 核心总结¶
第十二天需要掌握的最小闭环:
Q-learning:
target = r + gamma max_a Q(s',a)
off-policy TD control
Dyna-Q:
real experience update + learned model planning update
Function Approximation:
Q(s,a) ≈ Q(s,a;theta)
DQN:
neural network approximates Q
output one Q value per discrete action
loss = TD target - Q prediction
Stabilization:
experience replay: reduce sample correlation, reuse data
target network: stabilize bootstrap target
Improvements:
Double DQN: reduce overestimation
Dueling DQN: V/A decomposition
PER: sample important transitions more often
Rainbow: combine major DQN improvements
20. 参考资料¶
-
CSDN:函数估计的强化学习方法讲解:https://blog.csdn.net/qq_64671439/article/details/136629758
-
动手学强化学习:Dyna-Q 算法:http://hrl.boyuai.com/chapter/1/dyna-q%E7%AE%97%E6%B3%95/
-
动手学强化学习:DQN 算法:http://hrl.boyuai.com/chapter/2/dqn%E7%AE%97%E6%B3%95/
-
动手学强化学习:DQN 改进算法:http://hrl.boyuai.com/chapter/2/dqn%E6%94%B9%E8%BF%9B%E7%AE%97%E6%B3%95/
-
Playing Atari with Deep Reinforcement Learning:https://arxiv.org/abs/1312.5602
-
Human-level control through deep reinforcement learning:https://www.nature.com/articles/nature14236
-
Deep Reinforcement Learning with Double Q-learning:https://arxiv.org/abs/1509.06461
-
Prioritized Experience Replay:https://arxiv.org/abs/1511.05952
-
Dueling Network Architectures for Deep Reinforcement Learning:https://arxiv.org/abs/1511.06581
-
Rainbow: Combining Improvements in Deep Reinforcement Learning:https://arxiv.org/abs/1710.02298
预览时标签不可点<div class="