监督学习从带标签的样本中学习映射,强化学习则面对一个会被行动改变的环境:智能体做出选择,环境进入新状态并给出奖励,之后的选择又会受到前面结果影响。

真正困难的地方不是“怎样获得一次高奖励”,而是怎样处理延迟回报、探索未知行动,并从带噪声的交互中学到长期有效的策略。本文先建立最小概念框架,再用一个不依赖第三方库的 Q-learning 示例把公式落到代码。

1. 强化学习在解决什么问题

强化学习的核心是一个循环:

在时刻 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* 最大的动作。

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
2
3
target   = r + γ max Q(s', a')
TD error = target - Q(s, a)
Q(s, a) = Q(s, a) + α × TD error

其中 α 是学习率。若 s' 已经是终止状态,目标通常只保留奖励 r,不应继续从终止状态自举。

Q-learning 是离策略方法:收集数据时可以使用带探索的行为策略,更新目标却假设下一步选择当前价值最大的动作。

7. 一个可直接运行的走廊环境

下面构造一条包含 7 个位置的走廊。智能体从中央出发,可以向左或向右:

  • 到达最右端获得 +1 并结束;
  • 到达最左端获得 -1 并结束;
  • 普通移动获得 -0.02,鼓励尽快结束;
  • 使用 ε-greedy 在探索与利用之间切换。

代码只依赖 Python 标准库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import random


STATE_COUNT = 7
ACTION_COUNT = 2
LEFT = 0
RIGHT = 1
START_STATE = 3


def step(state, action):
movement = -1 if action == LEFT else 1
next_state = max(0, min(STATE_COUNT - 1, state + movement))

if next_state == STATE_COUNT - 1:
return next_state, 1.0, True
if next_state == 0:
return next_state, -1.0, True
return next_state, -0.02, False


def greedy_action(q_table, state):
return max(range(ACTION_COUNT), key=lambda action: q_table[state][action])


random.seed(42)
q_table = [[0.0] * ACTION_COUNT for _ in range(STATE_COUNT)]

learning_rate = 0.1
discount = 0.95
episode_count = 5000

for episode in range(episode_count):
state = START_STATE
epsilon = max(0.05, 1.0 - episode / 4000)

while True:
if random.random() < epsilon:
action = random.randrange(ACTION_COUNT)
else:
action = greedy_action(q_table, state)

next_state, reward, terminated = step(state, action)

if terminated:
target = reward
else:
target = reward + discount * max(q_table[next_state])

td_error = target - q_table[state][action]
q_table[state][action] += learning_rate * td_error
state = next_state

if terminated:
break

symbols = {LEFT: "←", RIGHT: "→"}
learned_policy = [
symbols[greedy_action(q_table, state)]
for state in range(1, STATE_COUNT - 1)
]

print("learned policy:", " ".join(learned_policy))

固定随机种子运行后,五个非终止位置应都倾向向右:

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 将 terminatedtruncated 分开返回:前者表示任务定义的终止,后者常表示时间限制等外部截断。二者对价值自举的含义不完全相同。

13. 推荐阅读顺序

第一层:建立概念

  1. Sutton 与 Barto《Reinforcement Learning: An Introduction》第二版:先读第 1~6 章,系统理解老虎机、MDP、动态规划、蒙特卡洛和时序差分;
  2. OpenAI Spinning Up:Key Concepts in RL:用较短篇幅串联状态、动作、轨迹、回报、策略和价值函数。

第二层:开始动手

  1. Gymnasium 官方文档:理解 reset()step()、终止与截断,并从 FrozenLake 或 CliffWalking 练习表格方法;
  2. Gymnasium:Tabular Q-learning 教程:观察 Q 表训练、探索衰减和评估怎样组织成完整实验。

第三层:进入深度强化学习

  1. DQN 原始论文:Human-level control through deep reinforcement learning:关注经验回放、目标网络以及从像素估计动作价值的动机;
  2. PPO 原始论文:Proximal Policy Optimization Algorithms:在理解策略梯度和 Actor-Critic 后,再阅读裁剪目标如何限制策略更新。

推荐顺序比推荐数量更重要。先能独立解释一个表格型 Q-learning 更新,再运行标准环境,最后阅读 DQN 和 PPO,许多术语会自然落到已经理解的框架里。

14. 下一步怎样练习

可以按下面的顺序扩展本文代码:

  1. 记录每 100 个 episode 的平均回报;
  2. 把走廊改成二维网格并加入障碍;
  3. 比较固定 ε 与衰减 ε;
  4. 实现 SARSA,观察在线目标与 Q-learning 最大化目标的差别;
  5. 使用 Gymnasium 的 FrozenLake 验证随机转移;
  6. 最后再用神经网络替换 Q 表。

算法基础可以从 前缀和与差分三题 继续巩固;如果更关心 AI 系统如何建立可重复评测,可阅读 RAG 知识库评测。它们解决的问题不同,但都强调把目标、状态、指标和边界写清楚后再优化。