☰
Awesome-ML-SYS-Tutorial 强化学习笔记:Dyna-Q 与 DQN 算法详解
2026/9/29 2:33:13 网站建设 项目流程
  • 文档
  • 教程
  • 人工智能
  • 大模型
  • RLHF

【免费下载链接】Awesome-ML-SYS-Tutorial

My learning notes for ML SYS.

项目地址:https://gitcode.com/gh_mirrors/aw/Awesome-ML-SYS-Tutorial
点击查看免费下载

本指南基于 Awesome-ML-SYS-Tutorial 仓库中 rlhf/rl-walk-through/part-5.md 展开,聚焦两条从表格型价值方法走向实用化的重要路径:一是引入环境模型的Dyna-Q(Q-planning),二是用神经网络做函数拟合的DQN(深度 Q 网络)。读完本文,你将掌握基于模型与无模型强化学习的区别、Dyna-Q 如何用模拟采样降低样本复杂度,以及 DQN 中经验回放与目标网络两大稳定训练模块的设计动机与完整实现流程,为后续理解策略梯度、Actor-Critic 乃至 PPO/GRPO 等现代 RLHF 算法建立直观基础。

一、背景:基于模型 vs 无模型的强化学习

在强化学习中,"模型"通常指与智能体交互的环境模型,即对环境的状态转移概率和奖励函数进行建模。根据是否具有环境模型,强化学习算法分为两类:

  • 基于模型的强化学习(model-based):模型可以是事先已知的,也可以是根据智能体与环境交互采样到的数据学习得到的,然后用这个模型帮助策略提升或价值估计。动态规划中的策略迭代与价值迭代(见 part-3.md)便是基于模型的强化学习方法,但其中环境模型是事先已知的。
  • 无模型的强化学习(model-free):不依赖环境模型,直接根据与环境交互采样到的数据做策略提升或价值估计。时序差分算法 Sarsa 和 Q-learning(见 part-4.md)便是两种典型代表,它们在状态转移概率无法写出的场景下,直接使用交互采样的数据来学习。

本小结介绍的Dyna-Q 算法是非常基础的基于模型的强化学习算法,其独特之处在于:它的环境模型是通过采样数据估计得到的,而非事先给定。

二、强化学习的两个评价指标

强化学习算法有两个重要的评价指标:

  1. 期望回报:算法收敛后的策略在初始状态下的期望回报;
  2. 样本复杂度:算法达到收敛结果需要在真实环境中采样的样本数量。

基于模型的强化学习算法由于具有一个环境模型,智能体可以额外和环境模型交互,对真实环境中样本的需求量往往就会减少,因此通常会比无模型的强化学习算法具有更低的样本复杂度。但需要注意,环境模型可能并不准确,不能完全代替真实环境,因此基于模型的强化学习算法收敛后其策略的期望回报可能不如无模型的强化学习算法——这构成了基于模型方法"省样本"与"模型误差"之间的根本权衡。

从 ML SYS 视角看,样本复杂度的直接含义是 rollout(采样)成本:真实环境交互(例如 RLHF 中调用大模型生成数据)昂贵,若能用廉价的环境模型替代部分采样,可显著降低训练成本,这正是 Dyna-Q 思想的实用价值所在。

三、Dyna-Q:用 Q-planning 与模型模拟数据共同改进策略

3.1 Q-planning 的核心思想

Dyna-Q 算法采用一种叫做Q-planning的方法来基于模型生成模拟数据,然后用模拟数据和真实数据一起改进策略。Q-planning 每次选取一个曾经访问过的状态,采取一个曾经在该状态下执行过的动作,通过模型得到转移后的状态以及奖励,并根据这个模拟数据,用 Q-learning 的更新方式来更新动作价值函数。

简单来说,Dyna-Q 在每次迭代中,会进行一步真实采样和多步与模型进行的模拟采样,然后利用模拟采样数据和真实采样数据一起改进策略。

3.2 Dyna-Q 完整伪代码

- 初始化 Q(s, a),初始化模型 M(s, a) - for 序列 e = 1 -> E do: - 得到初始状态 s - for t = 1 -> T do: - 用 ε-贪婪策略根据 Q 选择当前状态 s 下的动作 a - 得到环境反馈的 r,s' - Q(s, a) ← Q(s, a) + α [r + γ max_{a'} Q(s', a') - Q(s, a)] - M(s, a) ← r, s' - for 次数 n = 1 -> N do: 1. 随机选择一个曾经访问过的状态 s_m 2. 获取一个曾经在状态 s_m 下执行过的动作 a_m 3. r_m, s'_m ← M(s_m, a_m) 4. Q(s_m, a_m) ← Q(s_m, a_m) + α [r_m + γ max_{a'} Q(s'_m, a') - Q(s_m, a_m)] - end for - s ← s' - end for - end for

可以看到,在每次环境反馈交互执行一次 Q-learning 之后,Dyna-Q 会进行n 次 Q-planning:

  • 第 3 行:真实环境交互得到的转移 $(s, a, r, s')$ 先用来按 Q-learning 更新规则更新一次 $Q(s, a)$,这是无模型学习部分;
  • 第 4 行:同一经验同时用来投射/更新环境模型$M(s, a) \leftarrow r, s'$,这是模型学习部分;
  • 第 5~9 行:从已访问过的状态-动作对中随机取样,让模型 $M$ 产生模拟转移 $(s_m, a_m) \to (r_m, s'_m)$,再按同样的 Q-learning 规则更新 $Q(s_m, a_m)$,这是基于模型的规划(planning)部分。

Q-planning 次数 N 是一个可调节的参数:当 N = 0 时,Dyna-Q 就退化为普通的 Q-learning。需要特别指出,上述 Dyna-Q 算法执行在一个简单且确定的环境中,所以当看到一条经验数据 $(s, a, r, s')$ 时,可以直接投射模型做出更新,即 $M(s, a) \leftarrow r, s'$;在随机环境中,模型通常需要记录多次转移的统计信息(如频率计数),而不能用单条经验直接覆盖。

衔接前文:第 1 步的 ε-贪婪策略是 exploration/exploitation 平衡的标准做法,其 Q 值增量式更新的思想来自多臂老虎机一节(见 part-1.md);第 2 步的 Q-learning 更新公式正是 off-policy 的时序差分更新(见 part-4.md),Dyna-Q 的 Q-planning 沿用了同一更新算子。

四、DQN:用神经网络函数拟合解决连续状态问题

4.1 动机:Q 表格的局限

Q-learning 算法需要将每个状态下所有动作的 Q 值表格存储下来,当状态空间过大时,这个表格会非常大;而实际上很多情况下动作和状态都不是离散的,根本无法穷举。因此只能通过函数来拟合估计 Q 值。这里介绍的 DQN(deep Q network)用于解决连续状态、离散动作的问题。

CartPole 是一个非常经典的连续状态和离散动作问题:智能体的任务是通过左右移动保持车上的杆竖直,若杆的倾斜度数过大,或车子离初始位置左右的偏离程度过大,或坚持时间到达 200 帧,则游戏结束。智能体的状态是一个维数为 4 的向量,每一维都是连续的;动作是离散的,只能左移或右移,动作空间大小为 2。

4.2 函数拟合思想与 Q 网络

假设小车的动作价值函数为 $Q(s, a)$,由于状态是连续的,无法使用表格记录,一个常见的解决方法是使用**函数拟合(function approximation)**思想,即用一个神经网络来表示 Q:

  • 若动作是**连续(无限)**的:神经网络的输入是状态 $s$ 和动作 $a$,输出一个标量,表示在状态 $s$ 下采取动作 $a$ 能获得的价值;
  • 若动作是离散(有限)的:除了上述"状态+动作"输入的方式,还可以在状态 $s$ 输入到神经网络后,使其同时输出每一个动作的 Q 值。

需要注意的是,DQN(以及 Q-learning)只能处理动作离散的情况,因为在 Q 的更新过程中有 $\max_a$ 这一操作。假设神经网络参数为 $w$,即单个状态 $s$ 下所有可能动作 $a$ 的 Q 值都可以表示为 $Q_w(s, a)$,我们将用于拟合函数的神经网络称为Q 网络。

4.3 从 Q-learning 更新规则构造损失函数

回顾 Q-learning 的更新规则:

$$Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a' \in A} Q(s', a') - Q(s, a) \right]$$

上述公式用时序差分(temporal difference, TD)学习目标 $r + \gamma \max_{a' \in A} Q(s', a')$ 来增量式更新 $Q(s, a)$,也就是说要使 $Q(s, a)$ 和 TD 目标 $r + \gamma \max_{a' \in A} Q(s', a')$ 靠近。于是对于一组数据 ${(s_i, a_i, r_i, s'_i)}$,可以很自然地将 Q 网络的损失函数构造为均方误差形式:

$$\omega^* = \arg \min_{\omega} \frac{1}{2N} \sum_{i=1}^N \left[ Q_{\omega}(s_i, a_i) - \left( r_i + \gamma \max_{a'} Q_{\omega}(s'_i, a') \right) \right]^2$$

至此,就可以将 Q-learning 扩展到神经网络形式——深度 Q 网络(deep Q network, DQN)算法。由于 DQN 是off-policy 算法,因此在收集数据的时候可以使用一个 ε-贪婪策略来平衡探索与利用,将收集到的数据存储起来,在后续的训练中使用。DQN 中还有两个非常重要的模块——经验回放和目标网络,它们能够帮助 DQN 取得稳定、出色的性能。

五、经验回放(Experience Replay)

在一般的有监督学习中,假设训练数据是独立同分布的,每次训练神经网络时从训练数据中随机采样一个或若干个数据来进行梯度下降,随着学习的不断进行,每一个训练数据会被使用多次。而在原来的 Q-learning 算法中,每一个数据只会用来更新一次值。

为了更好地将 Q-learning 和深度神经网络结合,DQN 采用了**经验回放(experience replay)**方法:维护一个回放缓冲区,将每次从环境中采样得到的四元组数据(状态、动作、奖励、下一状态)存储到回放缓冲区中,训练 Q 网络时再从回放缓冲区中随机采样若干数据进行训练。这样做有两个作用:

  1. 使样本满足独立假设:在 MDP 中,交互采样得到的数据本身不满足独立假设,因为这一时刻的状态和上一时刻的状态有关。非独立同分布的数据对训练神经网络影响很大,会使神经网络拟合到最近训练的数据上。采用经验回放可以打破样本之间的相关性,让其满足独立假设。
  2. 提高样本效率:每一个样本可以被使用多次,十分适合深度神经网络的梯度学习。

注意到,Q-learning 是 off-policy 算法,但off-policy 并不意味着经验会被反复利用——"离线策略"与"经验复用"是两个不同的概念,DQN 正是通过经验回放机制显式地将二者结合起来。

六、目标网络(Target Network)

DQN 最终更新的目标是让 $Q_w(s, a)$ 逼近 $r + \gamma \max_{a'} Q_w(s', a')$。由于 TD 误差目标本身就包含神经网络的输出,因此在更新网络参数的同时目标也在不断被改变,这非常容易造成神经网络训练的不稳定性和震荡性。

为了解决这一问题,DQN 使用了目标网络(target network)的思想:既然训练过程中 Q 网络的不断更新会导致目标不断变化,不如暂时先将 TD 目标中的 Q 网络固定住。为了实现这一思想,需要利用两套 Q 网络:

  1. 训练网络 $Q_w(s, a)$:用于计算损失函数 $\frac{1}{2} \left[ Q_w(s, a) - \left( r + \gamma \max_{a'} Q_w(s', a') \right) \right]^2$ 中的 $Q_w(s, a)$;
  2. 目标网络 $Q_{\hat{w}}(s, a)$:用于计算 TD 误差目标 $r + \gamma \max_{a'} Q_{\hat{w}}(s', a')$ 的值,其中 $\hat{w}$ 表示目标网络的参数。

如果两套网络的参数始终保持一致,则仍然会出现震荡的情况,因此可以定期更新目标网络的参数$\hat{w}$,比如每隔若干步更新一次,即 $\hat{w} \leftarrow w$。这样做的目的是让目标网络的参数相对稳定,从而使得 TD 误差目标的计算稳定下来。

这一"固定 TD 目标、定期同步参数"的设计在此仓库笔记系列中持续复用:在 part-7.md 的 Actor-Critic 一节中,Critic 价值网络的更新同样采取了"类似于目标网络的方法"将 $r + \gamma V_w(s_{t+1})$ 作为不含梯度的 TD 目标来稳定训练,可见该思想是深度价值学习方法的核心工程手段。

七、DQN 完整算法流程

综合以上模块,DQN 的完整流程如下:

- 用随机初始参数 w 初始化网络 Q_w(s, a) - 复制相同的参数 w^- ← w 来初始化目标网络 Q_{w^-} - 初始化经验回放池 R - for 序列 e = 1 -> E do: - 获取环境初始状态 s_1 - for 时间步 t = 1 -> T do: 1. 根据当前网络 Q_w(s, a) 以 ε-贪婪策略选择动作 a_t 2. 执行动作 a_t,获得环境反馈 r_t,环境状态变为 s_{t+1} 3. 将 (s_t, a_t, r_t, s_{t+1}) 存入经验回放池 R 中 4. 若 R 中数据足够,从 R 中采样 N 个数据 {(s_i, a_i, r_i, s_{i+1})}_{i=1,...,N} 5. for 每个数据 i do: - 计算目标值 y_i = r_i + γ max_{a'} Q_{w^-}(s_{i+1}, a') - 最小化目标损失 L = (1/N) Σ_i (y_i - Q_w(s_i, a_i))^2,以此更新当前网络 Q_w 6. 更新目标网络 - end for - end for

关键流程拆解如下:

  • 步骤 1~3(数据收集):用当前 Q 网络配合 ε-贪婪策略与环境交互,并把四元组存入经验回放池——ε-贪婪是 off-policy 数据收集的标配(见 part-1.md 多臂老虎机一节);
  • 步骤 4(经验采样):只有当回放池中数据足够时才开始训练,从池中随机采样 N 个数据,打破时间相关性;
  • 步骤 5(损失与更新):目标值 $y_i$ 使用目标网络$Q_{w^-}$ 计算(参数被固定),而损失项 $Q_w(s_i, a_i)$ 使用训练网络计算,对 $w$ 求梯度做梯度下降;
  • 步骤 6(目标同步):定期将训练网络参数拷贝到目标网络,保证 TD 目标相对稳定。

八、总结与系列衔接

本小结覆盖了两条价值方法的核心演进路径:

  • Dyna-Q 回答了"如何减少真实采样":通过一个由经验数据学习到的环境模型 $M$,在每次真实交互后额外执行 N 次 Q-planning 模拟更新,N 从 0 调大即从纯 Q-learning 逐步走向基于模型的强化学习,属于价值函数方法与规划的结合。
  • DQN 回答了"状态连续时 Q 值如何表示":用神经网络 $Q_w$ 替代 Q 表格,通过均方误差损失最小化 TD 误差;经验回放解决样本相关性与样本效率问题,目标网络解决训练目标漂移导致的震荡问题,二者共同保证了深度价值网络训练的稳定性。

在整个笔记系列中,本小结承上启下:前承 part-1.md(MDP 与价值函数定义)、part-3.md(动态规划策略迭代/价值迭代)、part-4.md(Sarsa/Q-learning 时序差分与 on/off-policy 概念);后启 part-6.md(策略梯度与 REINFORCE,转向基于策略的方法)、part-7.md(Actor-Critic、TRPO、PPO)。理解本小结的 off-policy、TD 目标、函数拟合与稳定训练思想,是理解后续策略优化乃至现代 RLHF(如 PPO/GRPO)算法的必要基础。

  • 文档
  • 教程
  • 人工智能
  • 大模型
  • RLHF

【免费下载链接】Awesome-ML-SYS-Tutorial

My learning notes for ML SYS.

项目地址:https://gitcode.com/gh_mirrors/aw/Awesome-ML-SYS-Tutorial
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询