强化学习入门:从 MDP、价值函数到 Q-learning
监督学习从带标签的样本中学习映射,强化学习则面对一个会被行动改变的环境:智能体做出选择,环境进入新状态并给出奖励,之后的选择又会受到前面结果影响。
真正困难的地方不是“怎样获得一次高奖励”,而是怎样处理延迟回报、探索未知行动,并从带噪声的交互中学到长期有效的策略。本文先建立最小概念框架,再用一个不依赖第三方库的 Q-learning 示例把公式落到代码。
1. 强化学习在解决什么问题
强化学习的核心是一个循环:
flowchart LR
A[智能体 Agent] -->|选择动作 aₜ| B[环境 Environment]
B -->|观察 sₜ₊₁ 与奖励 rₜ₊₁| A
A --> C[更新策略或价值估计]
C --> A
在时刻 t,智能体观察状态 s_t,根据策略选择动作 a_t。环境随后返回奖励 r_{t+1} 和下一状态 s_{t+1}。智能体的目标不是让当前奖励最大,而是让一段交互中的累计回报尽可能大。
典型任务包括:
- 游戏中根据局面连续选择动作;
- 机器人根据传感器状态控制运动;
- 调度系统在资源和延迟之间做长期权衡;
- 推荐系统在即时点击与长期满意度之间选择;
- 大模型根据人类偏好或可验证反馈进一步优化行为。
并不是所有“有反馈的优化”都是强化学习。若每个样本相互独立、行动不会改变后续数据分布,普通监督学习、排序学习或多臂老虎机可能更合适。
2. MDP:把交互问题写清楚
马尔可夫决策过程(Markov Decision Process,MDP)通常写成五元组:
1 | (S, A, P, R, γ) |
| 符号 | 含义 | 建模时要问的问题 |
|---|---|---|
S |
状态集合 | 做决定所需的信息是否都在状态里 |
A |
动作集合 | 每个状态允许哪些动作 |
P |
状态转移 | 执行动作后,下一状态如何产生 |
R |
奖励函数 | 哪些结果被鼓励或惩罚 |
γ |
折扣因子 | 未来奖励相对当前奖励有多重要 |
状态与观察不一定相同
状态应包含预测未来所需的信息;观察则是智能体实际能看到的部分。棋盘局面接近完全可观测状态,摄像头的一帧画面却可能看不到速度、遮挡物和历史信息。
如果当前观察不足以推断未来,问题更接近部分可观测 MDP。常见处理方式是堆叠历史观察、使用循环网络,或显式维护一个信念状态。
马尔可夫性不是“没有历史”
马尔可夫性要求:给定当前状态后,预测下一步不再需要更早历史。状态完全可以包含历史摘要,例如最近几帧画面、库存变化或到目前为止的关键事件。
3. 奖励、回报与延迟信用
即时奖励只评价一步,回报则把未来奖励汇总起来。常用的折扣回报是:
1 | G_t = r_{t+1} + γr_{t+2} + γ²r_{t+3} + ... |
当 γ 接近 0,智能体更关注眼前收益;当 γ 接近 1,远期结果更重要。折扣也能让无限时域任务中的回报保持有限,但它不只是数学技巧,还表达了任务对时间的偏好。
强化学习的一个核心难题是信用分配:终点得到的奖励,应该归因于之前哪几个动作?若只有任务完成时才给奖励,学习信号稀疏;若每一步都设计大量奖励,又可能诱导智能体利用规则漏洞。
奖励设计时要区分:
- 目标指标:真正希望系统最终做到什么;
- 训练信号:为了帮助学习而加入的中间奖励;
- 安全约束:即使能提高奖励也不能违反的边界。
奖励是目标的代理,而不是目标本身。上线前需要主动寻找“高奖励但行为不对”的反例。
4. 策略与价值函数
策略 π(a|s) 描述在状态 s 下选择动作 a 的方式。确定性策略直接给出一个动作,随机策略则给出动作概率分布。
价值函数用于估计长期回报:
V^π(s):从状态s出发并遵循策略π,预期能获得多少回报;Q^π(s, a):在状态s先执行动作a,之后遵循策略π,预期能获得多少回报。
二者的区别在于 Q 多固定了第一步动作。因此,如果已经学到最优动作价值 Q*,就可以在每个状态选择 Q* 最大的动作。
flowchart TD
S[当前状态 s] --> A1[动作 a₁]
S --> A2[动作 a₂]
S --> A3[动作 a₃]
A1 --> Q1[Q s,a₁]
A2 --> Q2[Q s,a₂]
A3 --> Q3[Q s,a₃]
Q1 --> M[选择估计长期回报最大的动作]
Q2 --> M
Q3 --> M
5. Bellman 关系:把长期问题拆成一步
价值函数之所以可学,是因为长期回报可以递归分解:
1 | 当前价值 = 即时奖励 + 折扣后的下一状态价值 |
对最优动作价值,可以写成:
1 | Q*(s, a) = E[r + γ max Q*(s', a')] |
这个关系把一个无限向后的问题变成“观察一步,再使用已有估计”。动态规划、时序差分学习和 Q-learning 都建立在这种自洽关系上。
需要注意,右侧仍然是估计值。学习早期的目标本身会变化,这也是强化学习训练容易不稳定的原因之一。
6. Q-learning:用时序差分更新动作价值
表格型 Q-learning 为每个“状态—动作”组合保存一个数值。每次获得一条转移 (s, a, r, s') 后,使用下面的更新:
1 | target = r + γ max Q(s', a') |
其中 α 是学习率。若 s' 已经是终止状态,目标通常只保留奖励 r,不应继续从终止状态自举。
Q-learning 是离策略方法:收集数据时可以使用带探索的行为策略,更新目标却假设下一步选择当前价值最大的动作。
7. 一个可直接运行的走廊环境
下面构造一条包含 7 个位置的走廊。智能体从中央出发,可以向左或向右:
- 到达最右端获得
+1并结束; - 到达最左端获得
-1并结束; - 普通移动获得
-0.02,鼓励尽快结束; - 使用 ε-greedy 在探索与利用之间切换。
代码只依赖 Python 标准库。
1 | import random |
固定随机种子运行后,五个非终止位置应都倾向向右:
1 | learned policy: → → → → → |
这不代表代码解决了复杂强化学习问题。它刻意使用很小的离散状态空间,让每个 Q(s, a) 都能直接存进表格,从而把注意力放在交互、探索和时序差分更新上。
8. 探索与利用为什么不能只选一个
如果智能体永远选择当前估计最好的动作,早期一次偶然结果就可能让它错过更优路线;如果永远随机探索,又无法稳定使用已经学到的知识。
ε-greedy 用一个简单概率平衡两者:
- 以
ε的概率随机选择动作; - 以
1 - ε的概率选择当前Q最大的动作。
训练初期使用较大 ε,之后逐渐降低,是常见做法。但不应机械套用同一衰减曲线:环境是否变化、奖励是否稀疏、失败代价是否可接受,都会影响探索策略。
在真实系统中,随机动作可能造成成本或安全问题。可以先在模拟器训练,限制可探索动作集合,或使用离线数据与安全约束。
9. 从表格方法到深度强化学习
当状态空间很大时,无法为每个状态单独保存 Q 表。深度强化学习用神经网络近似价值函数、策略或环境模型。
| 路线 | 学习对象 | 常见代表 | 适合的问题 |
|---|---|---|---|
| 价值型 | Q(s, a) |
DQN | 离散动作 |
| 策略梯度 | `π(a | s)` | REINFORCE |
| Actor-Critic | 策略 + 价值基线 | A2C、PPO、SAC | 更一般的离散或连续控制 |
| 基于模型 | 转移或世界模型 | Dyna、规划型方法 | 可利用预测与规划的任务 |
| 离线强化学习 | 固定数据集上的策略 | 多种保守价值/策略方法 | 不能自由在线探索的场景 |
DQN 用神经网络从高维输入估计动作价值,并通过经验回放和目标网络缓解训练不稳定。PPO 属于策略优化方法,通过限制单次策略更新幅度,避免新策略偏离旧策略过远。
不要从 Q-learning 示例直接跳到大规模训练。先在表格环境中理解终止、自举、探索和评估,再进入函数近似,调试成本会低很多。
10. 强化学习、老虎机与监督学习的边界
| 问题类型 | 行动是否影响未来状态 | 是否处理延迟回报 | 典型方法 |
|---|---|---|---|
| 监督学习 | 通常不影响 | 否 | 分类、回归 |
| 上下文老虎机 | 通常不建模长期状态 | 主要看即时奖励 | UCB、Thompson Sampling |
| 强化学习 | 会影响 | 是 | Q-learning、PPO、SAC |
如果推荐一条内容不会明显改变用户未来状态,只需优化即时点击或转化,老虎机模型可能已经足够。只有当连续行动、状态转移和长期回报都不可忽略时,完整强化学习建模才真正必要。
11. 评估时不要只看最高回报
强化学习结果对随机种子、环境细节和超参数很敏感。至少应记录:
- 多个随机种子的平均回报与波动;
- 成功率、失败率和任务长度;
- 训练期间回报与独立评估回报;
- 样本效率,即达到目标表现需要多少环境交互;
- 约束违反次数和最坏情况;
- 对环境扰动、初始状态变化的鲁棒性。
评估策略时通常应关闭或固定探索噪声,并把训练环境与评估环境的随机种子分开。只展示一次最好运行,很容易把运气误当成算法提升。
12. 常见失败模式
- 奖励投机:智能体找到了提高数值却违背真实意图的方法;
- 稀疏奖励:绝大多数交互没有学习信号,探索难以到达成功状态;
- 分布漂移:策略改变后,采集到的数据分布也随之变化;
- 过度自举:错误价值估计被反复用于构造新目标;
- 训练不稳定:函数近似、离策略数据和自举结合时可能发散;
- 模拟到现实差距:模拟器中有效的策略依赖现实中不存在的细节;
- 终止处理错误:把真正终止与时间截断混为一谈,导致目标值计算错误。
最后一点在现代环境 API 中尤其值得注意。Gymnasium 将 terminated 与 truncated 分开返回:前者表示任务定义的终止,后者常表示时间限制等外部截断。二者对价值自举的含义不完全相同。
13. 推荐阅读顺序
第一层:建立概念
- Sutton 与 Barto《Reinforcement Learning: An Introduction》第二版:先读第 1~6 章,系统理解老虎机、MDP、动态规划、蒙特卡洛和时序差分;
- OpenAI Spinning Up:Key Concepts in RL:用较短篇幅串联状态、动作、轨迹、回报、策略和价值函数。
第二层:开始动手
- Gymnasium 官方文档:理解
reset()、step()、终止与截断,并从 FrozenLake 或 CliffWalking 练习表格方法; - Gymnasium:Tabular Q-learning 教程:观察 Q 表训练、探索衰减和评估怎样组织成完整实验。
第三层:进入深度强化学习
- DQN 原始论文:Human-level control through deep reinforcement learning:关注经验回放、目标网络以及从像素估计动作价值的动机;
- PPO 原始论文:Proximal Policy Optimization Algorithms:在理解策略梯度和 Actor-Critic 后,再阅读裁剪目标如何限制策略更新。
推荐顺序比推荐数量更重要。先能独立解释一个表格型 Q-learning 更新,再运行标准环境,最后阅读 DQN 和 PPO,许多术语会自然落到已经理解的框架里。
14. 下一步怎样练习
可以按下面的顺序扩展本文代码:
- 记录每 100 个 episode 的平均回报;
- 把走廊改成二维网格并加入障碍;
- 比较固定 ε 与衰减 ε;
- 实现 SARSA,观察在线目标与 Q-learning 最大化目标的差别;
- 使用 Gymnasium 的 FrozenLake 验证随机转移;
- 最后再用神经网络替换 Q 表。
算法基础可以从 前缀和与差分三题 继续巩固;如果更关心 AI 系统如何建立可重复评测,可阅读 RAG 知识库评测。它们解决的问题不同,但都强调把目标、状态、指标和边界写清楚后再优化。