强化学习:从入门到进阶
强化学习:从入门到进阶
纯新手的系统学习手册
从直觉、数学基础、Bellman 方程,到 Q-learning、DQN、PPO 与大模型 RLHF
学习原则:先理解问题,再理解公式;先跑通小例子,再进入复杂算法。
版本:2026-09 学习版
生成:OpenAI Codex
阅读说明
这是一份面向纯新手的强化学习学习文档。你不需要先会深度学习,也不需要一开始就掌握复杂的概率论。只要具备以下基础,就可以顺利读下去:
• 会一点 Python,至少知道变量、函数、列表、循环;
• 了解矩阵和向量的大致含义;
• 知道什么是概率,例如“30% 的概率成功”;
• 愿意先理解小例子,再进入复杂算法。
本文档的使用方式不是“一口气看完”,而是边读边写代码、边做练习。建议每读完一章,都完成该章后面的思考题和小练习。
强化学习真正的门槛不是算法名字,而是理解:长期回报、价值、Bellman 方程、探索、偏差与方差、分布偏移。
学习路线总览
| 阶段 | 目标 | 核心内容 | 建议时间 |
| 第一阶段 | 建立直觉 | Agent、环境、状态、动作、奖励、策略 | 2 天 |
| 第二阶段 | 掌握数学骨架 | MDP、回报、价值、Bellman 方程 | 1 周 |
| 第三阶段 | 学会基础算法 | 动态规划、Monte Carlo、TD、SARSA、Q-learning | 2 周 |
| 第四阶段 | 进入深度强化学习 | 函数近似、DQN、Replay Buffer、Target Network | 2 周 |
| 第五阶段 | 学习策略优化 | REINFORCE、Actor-Critic、GAE、PPO | 2 周 |
| 第六阶段 | 选择方向 | SAC、模型式、离线 RL、多智能体、RLHF | 2 周以上 |
符号表
| 符号 | 含义 |
| s | 状态(state) |
| a | 动作(action) |
| r | 奖励(reward) |
| π(a|s) | 策略:在状态 s 下选择动作 a 的概率 |
| γ | 折扣因子,通常取 0.9、0.95、0.99 |
| V(s) | 状态价值 |
| Q(s,a) | 动作价值 |
| α | 学习率 |
| ε | 探索概率 |
| θ | 神经网络参数 |
| τ | 一条轨迹 |
| A(s,a) | 优势函数 |
最重要的一句话
强化学习研究的是:
在一个会因为我的动作而变化的环境里,我应该连续做什么,才能最大化长期收益?
它不是简单地“输入到输出”,而是“观察、行动、获得反馈、调整行为”的循环。

图 1:强化学习的基本交互循环。智能体选择动作,环境返回新的状态和奖励。
第一篇 建立直觉
1.1 一个贯穿全文的例子
假设有一个机器人在两个房间之间活动:
• 房间 A:待着不动,每步得到奖励 +1;
• 房间 B:待着不动,每步得到奖励 +2;
• 从 A 去 B,需要走一步,立即奖励为 0;
• 机器人可以选择留在原地,或者去另一个房间。
人类很容易看出:应该去 B,因为 B 的长期收益更高。
但机器人一开始不知道每个动作的长期后果。它需要不断尝试:
1. 在 A 选择“留下”,得到 +1;
2. 在 A 选择“去 B”,转移以后得到 +2;
3. 发现 B 的奖励更高;
4. 学会在 A 时选择去 B。
这个例子虽然简单,却包含了强化学习的主要元素:状态、动作、奖励、转移、策略、长期回报和策略改进。

图 2:两房间例子。奖励是眼前的,价值是长期的。
1.2 智能体和环境的边界
强化学习把整个系统分成两部分:智能体(Agent)和环境(Environment)。
智能体
智能体是做决策的一方。它可以是一个程序、一个机器人、一个游戏 AI,或者一个大语言模型。
环境
环境是智能体之外、会影响结果的一切。环境接收动作,返回新状态和奖励。
边界不是固定不变的。例如训练一个机械臂时:
• 如果目标是控制关节,那么关节电机和物理世界都属于环境;
• 如果目标是调度整个工厂,那么机器人和订单系统都可能属于环境的一部分。
状态
状态是智能体做决定时掌握的信息。理想情况下,状态应该满足 Markov 性:
只要知道当前状态,就不需要再看更久之前的历史。
如果状态不满足 Markov 性,例如机器人只能看到一个很小的局部视野,那么它面对的是部分可观测 MDP(POMDP)。
1.3 和监督学习、无监督学习的区别
监督学习
监督学习给每个输入一个正确答案:
图片 -> “猫”
邮件 -> “垃圾邮件”
句子 -> “正面情绪”
模型学习的是输入到标签的映射。
无监督学习
无监督学习通常寻找数据中的结构,例如聚类、降维、生成模型。
强化学习
强化学习没有每一步的标准答案。它只得到奖励信号,而且奖励可能延迟:
动作 -> 环境变化 -> ... -> 很多步后 -> 最终奖励
一个动作现在看起来好,不一定长期好;现在看起来差,也可能为未来创造机会。这就是强化学习最本质的困难。
1.4 四个核心困难
第一,延迟奖励
现在做的事情,可能几十步甚至几百步后才出现结果。下棋时,开局的一步可能到几十步后才证明是好棋。
第二,探索与利用
利用:选择当前认为最好的动作,立刻获取已知收益。
探索:尝试不确定的动作,可能发现更好的策略。
如果永远利用,可能陷入局部最优;如果永远探索,就学不会稳定的好策略。
第三,数据不独立同分布
智能体的行为会改变未来看到的数据。一个从不向右走的机器人,可能永远不知道右边有出口。
第四,信用分配
最终得到奖励时,不知道是哪一步的功劳。例如一局游戏赢了,是开局策略好,还是最后一步操作好?
强化学习算法的大量设计,都在处理这四个问题。
1.5 算法大分类
可以按“学什么”来分:
| 类型 | 学什么 | 代表算法 |
| 基于价值 | 学 V 或 Q | Q-learning、SARSA、DQN |
| 基于策略 | 直接学 π | REINFORCE、PPO |
| Actor-Critic | 同时学策略和价值 | A2C、A3C、PPO、SAC |
| 模型式 | 学环境模型或使用规划 | Dyna、MCTS、MuZero |
也可以按“是否需要环境模型”分:
• Model-free:不显式学习环境转移和奖励函数;
• Model-based:学习或已知环境模型,并用模型进行规划。
还可以按数据来源分:
• On-policy:只学习当前策略产生的数据;
• Off-policy:可以学习其他策略产生的数据;
• Offline RL:只能使用预先收集好的固定数据。

图 3:强化学习算法地图。先知道算法属于哪一类,再去理解细节。
1.6 本篇练习
1. 举出三个可以用强化学习描述的现实问题。
2. 对每个问题写出状态、动作和奖励。
3. 思考:哪个问题的奖励最延迟?哪个问题最怕探索出错?
4. 用自己的话解释探索和利用的区别。
第二篇 数学骨架
2.1 为什么需要数学
数学不是为了增加难度,而是为了精确回答四个问题:
1. 什么叫“长期好”?
2. 一个状态到底值多少?
3. 当前动作对未来有什么影响?
4. 怎样根据经验改进策略?
强化学习把这四个问题写成一个统一模型:MDP。
2.2 MDP 的五个组成部分
一个有限 MDP 可以写成:
(S, A, P, r, γ)
• S:状态集合;
• A:动作集合;
• P:状态转移概率;
• r:奖励函数;
• γ:折扣因子。
有时还会加入初始状态分布 ρ₀,或者把状态和奖励合并成环境模型。
状态转移
在状态 s 执行动作 a,转移到状态 s′ 的概率是:
P(s′ | s, a) = Pr[S_(t+1)=s′ | S_t=s, A_t=a]
例如一个清洁机器人:
• 向前走 80% 成功;
• 20% 因为打滑留在原地。
这就是随机转移。
奖励
奖励可以写成 r(s,a),也可以写成 r(s,a,s′)。它表示这一步行为得到的即时反馈。
要注意:奖励是环境给出的数字,不一定等于你真正想要的目标。
2.3 策略
策略是智能体的行为规则。随机策略写成:
π(a | s)
它表示在状态 s 下选择动作 a 的概率。
确定性策略写成:
a = μ(s)
在状态 s 下只选择一个动作。
为什么需要随机策略?
• 前期需要探索;
• 对手博弈时需要避免被预测;
• 连续控制中,随机策略更容易表达多种可行动作;
• 最大熵强化学习把“保持适当随机性”直接写进目标函数。
2.4 轨迹
从时刻 0 开始,一条轨迹是:
τ = (s_0, a_0, r_1, s_1, a_1, r_2, s_2, …)
轨迹由环境动力学和策略共同产生。
“策略决定动作,环境决定下一步状态和奖励。”理解这一点,就能分清强化学习中哪些东西由智能体控制,哪些东西由环境控制。
2.5 回报:长期收益
从时刻 t 开始的回报定义为:
G_t = r_(t+1) + γ r_(t+2) + γ² r_(t+3) + …
如果 γ=0.9,那么当前的 1 分奖励,和 10 步后的 0.9¹⁰≈0.35 分等价。
为什么使用折扣
第一,未来奖励通常更不确定。
第二,无限任务的累计奖励可能不收敛,加入 γ 后更容易保证有限。
第三,它表达偏好:我们通常更重视近期收益。
γ 越接近 1,智能体越有远见;γ 越接近 0,智能体越短视。
2.6 状态价值函数
状态价值函数回答:
如果我现在处于状态 s,之后一直按照策略 π 行动,平均能拿多少回报?
V^π(s) = E_π[G_t | S_t=s]
其中 E 表示期望。它不是某一次轨迹的实际回报,而是多次可能轨迹的平均结果。
2.7 动作价值函数
动作价值函数回答:
如果我处于状态 s,先执行动作 a,之后按照策略 π 行动,平均能拿多少回报?
Q^π(s,a) = E_π[G_t | S_t=s, A_t=a]
两者关系:
V^π(s) = Σ_a π(a|s) Q^π(s,a)
动作价值比状态价值多回答了一个问题:“在这个状态下,哪个动作更好?”
2.8 Bellman 期望方程
Bellman 方程把长期回报拆成两部分:
• 当前得到的奖励;
• 下一步之后的价值。
状态价值形式:
V^π(s) = Σ_a π(a|s) [ r(s,a) + γ Σ_s′ P(s′|s,a) V^π(s′) ]
动作价值形式:
Q^π(s,a) = r(s,a) + γ Σ_s′ P(s′|s,a) Σ_a′ π(a′|s′) Q^π(s′,a′)
如果只看文字,它表达的是:
今天的价值 = 今天的奖励 + 折扣后的明天价值。
Bellman 方程为什么重要
它把一个“无限长的累计奖励问题”变成了一个“当前奖励 + 下一步价值”的递归问题。
没有 Bellman 方程,我们很难高效地估计长期价值;有了它,才能使用动态规划、TD、Q-learning 和 Actor-Critic。

图 4:广义策略迭代。评估当前策略,再改进策略,不断循环。
2.9 最优价值与最优策略
最优状态价值:
V*(s) = max_π V^π(s)
最优动作价值:
Q*(s,a) = max_π Q^π(s,a)
最优 Bellman 方程:
Q*(s,a) = E_s′[ r(s,a) + γ max_a′ Q*(s′,a′) ]
如果知道 Q*,最优策略就很简单:
π*(s) = argmax_a Q*(s,a)
在这里,“贪心”不再盲目,因为 Q* 已经包含了长期的后果。
2.10 用两房间例子算一次
继续使用前面的例子。
假设 γ=0.9:
• 在 A 留下,每步奖励 +1;
• 在 B 留下,每步奖励 +2;
• 从 A 去 B,立即奖励为 0。
如果策略是一直待在 B,B 的价值是:
V(B) = 2 + 0.9×2 + 0.9²×2 + … = 2/(1-0.9) = 20
在 A 选择“去 B”的动作价值是:
Q(A,去B) = 0 + 0.9 × V(B) = 18
在 A 选择“留 A”的动作价值,如果以后仍然留 A,则是:
Q(A,留A) = 1 + 0.9×10 = 10
因此:
Q(A,去B) > Q(A,留A)
策略改进后,A 应该去 B。
这就是价值评估和策略改进的一个最小例子。
2.11 本篇练习
1. 写出你熟悉的一个游戏或生活决策的 MDP 五元组。
2. 如果 γ=0.95,计算 10 步后的折扣系数。
3. 解释 V 和 Q 的区别。
4. 写出最优 Bellman 方程,并解释其中 max 的含义。
5. 为什么说奖励不是目标本身?举一个奖励被“钻空子”的例子。
第三篇 动态规划
3.1 动态规划适用条件
动态规划(Dynamic Programming,DP)需要知道完整的环境模型:
• P(s′|s,a);
• r(s,a)。
如果模型已知,并且状态空间有限,可以用 DP 迭代计算价值。
如果模型未知,就不能直接使用标准 DP,只能通过采样估计。
3.2 策略评估
给定策略 π,反复应用 Bellman 期望方程:
V(s) ← Σ_a π(a|s) [ r(s,a) + γ Σ_s′ P(s′|s,a) V(s′) ]
一直更新,直到 V 变化很小。
这个过程叫迭代策略评估。
3.3 策略改进
有了 Q^π 以后,对每个状态选择当前最好的动作:
π′(s) = argmax_a Q^π(s,a)
策略改进定理告诉我们:只要新策略在某个状态做了更好的选择,并且其他状态不变,新策略的价值就不会比旧策略差。
3.4 策略迭代
策略迭代交替执行:
1. 策略评估:计算当前 π 的 V^π;
2. 策略改进:根据 Q^π 更新 π;
3. 重复,直到策略不再变化。
代码结构可以写成:
policy = initial_policy()
while True:
V = policy_evaluation(policy, env, gamma=0.95)
new_policy = policy_improvement(V, env)
if new_policy == policy:
break
policy = new_policy
3.5 价值迭代
价值迭代把评估和改进合并成一个更新:
V(s) ← max_a [ r(s,a) + γ Σ_s′ P(s′|s,a) V(s′) ]
重复直到收敛。
价值迭代并不维护显式策略,最后再根据最终 V 或 Q 取贪心策略。
3.6 为什么它会收敛
在有限 MDP 中,如果 γ<1,Bellman 最优算子是一个 γ-压缩映射。
直观解释:
每迭代一次,价值估计的误差至少缩小到原来的 γ 倍。
因此只要不断迭代,最终会收敛到唯一的 V*。
这是动态规划部分最重要的理论保证之一。
3.7 GridWorld 示例
下面用一个 4×4 网格理解价值迭代:
• 左上角是起点;
• (1,1) 是障碍;
• (3,3) 是目标,奖励 +1;
• 每走一步有微小负奖励;
• 越靠近目标,价值通常越高。

图 5:GridWorld 示例。价值迭代会把目标的收益逐步传播到周围状态。
一个简单的价值迭代代码骨架
import numpy as np
n = 4
gamma = 0.95
V = np.zeros((n, n))
actions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
def step(r, c, action):
dr, dc = action
nr, nc = r + dr, c + dc
if not (0 <= nr < n and 0 <= nc < n):
return r, c, -1.0
if (nr, nc) == (1, 1):
return r, c, -1.0
if (nr, nc) == (3, 3):
return nr, nc, 1.0
return nr, nc, -0.04
for _ in range(1000):
new_V = V.copy()
for r in range(n):
for c in range(n):
if (r, c) == (3, 3):
continue
values = []
for a in actions:
nr, nc, reward = step(r, c, a)
values.append(reward + gamma * V[nr, nc])
new_V[r, c] = max(values)
if np.max(np.abs(new_V - V)) < 1e-6:
break
V = new_V
练习时建议把每一步的价值打印出来,观察目标价值如何逐渐扩散到周围状态。
3.8 本篇练习
1. 为什么动态规划需要模型?
2. 策略评估和策略改进分别做什么?
3. 把 GridWorld 代码改成 5×5,并加入一个陷阱。
4. 观察 γ=0.5 和 γ=0.99 时价值图的区别,解释原因。
第四篇 不依赖模型的预测
动态规划需要完整模型。现实中通常只能通过交互获得样本,因此需要采样方法。
4.1 Monte Carlo 方法
Monte Carlo 的思想非常直接:
1. 先跑完一个完整回合;
2. 记录每个状态得到的真实回报 G;
3. 用实际回报更新价值。
更新公式:
V(s_t) ← V(s_t) + α [ G_t - V(s_t) ]
优缺点
优点:
• 不需要环境模型;
• 回报是无偏的;
• 很容易理解。
缺点:
• 必须等回合结束;
• 回报方差很大;
• 连续任务或非常长的任务不适合。
4.2 时序差分 TD
TD 不等待回合结束,而是使用下一步的估计值:
V(s_t) ← V(s_t) + α [ r_(t+1) + γ V(s_(t+1)) - V(s_t) ]
定义 TD 误差:
δ_t = r_(t+1) + γ V(s_(t+1)) - V(s_t)
直觉:
如果下一状态估计是 5,这次又拿到 1 的奖励,那么当前状态价值应该接近 6。
TD 使用已有估计更新估计,这叫作 bootstrap。
优缺点
优点:
• 可以在线更新;
• 方差通常比 Monte Carlo 小;
• 不需要等回合结束。
缺点:
• 使用了估计值,所以有偏差;
• 早期价值估计不准时,偏差可能传播。

图 6:Monte Carlo 与 TD 的更新时机不同。
4.3 偏差和方差
考虑一个简单比喻:
• Monte Carlo 像等考试完全结束后,再根据最终成绩反思;
• TD 像每做一道题就根据下一步预期修正判断。
Monte Carlo:
• 偏差小;
• 方差大;
• 样本利用慢。
TD:
• 偏差较大;
• 方差小;
• 能快速在线学习。
实际算法通常在这两者之间做权衡。
4.4 n-step TD
不只用一步,也不等到结束,而是使用 n 步回报:
G_t^(n) = r_(t+1) + γ r_(t+2) + … + γ^(n-1) r_(t+n) + γ^n V(s_(t+n))
• n=1:普通 TD;
• n 很大:接近 Monte Carlo;
• n 介于两者之间:平衡偏差和方差。
4.5 TD(λ)
TD(λ) 给不同长度的回报加权,λ 控制权重衰减。
• λ=0:只看一步 TD;
• λ=1:接近 Monte Carlo;
• 0<λ<1:融合多种时间尺度。
现代策略梯度中的 GAE,本质上就是优势估计版本的多步 TD 思想。
4.6 本篇练习
1. 写一段代码,让随机策略在 GridWorld 中跑 100 个回合。
2. 用 Monte Carlo 估计起点价值。
3. 用 TD(0) 估计状态价值。
4. 比较两条价值曲线的波动大小。
5. 解释 bootstrap 的含义。
第五篇 从预测到控制
预测问题只估计价值,控制问题还要学到行动策略。
5.1 SARSA
SARSA 的更新使用当前策略实际选择的下一个动作 a′:
Q(s,a) ← Q(s,a) + α [ r + γ Q(s′,a′) - Q(s,a) ]
名字来自更新过程中用到的五元组:
(s, a, r, s′, a′)
SARSA 是 on-policy 方法:它学习的是当前行为策略,包括探索行为。
如果在悬崖边使用 ε-greedy:
• 有时候会随机走向悬崖;
• SARSA 会把这个风险考虑进去;
• 因此通常会学到一条更安全的路径。
5.2 Q-learning
Q-learning 使用下一步最大 Q 值:
Q(s,a) ← Q(s,a) + α [ r + γ max_a′ Q(s′,a′) - Q(s,a) ]
它是 off-policy 方法:行为策略可以随机探索,但目标始终是学习最优策略。
SARSA 与 Q-learning 的关键区别
| 算法 | 下一个动作 | 类型 | 特点 |
| SARSA | 当前策略实际选择的 a′ | On-policy | 更考虑探索风险 |
| Q-learning | 最大化 Q(s′,a′) | Off-policy | 学习最优策略,训练可能更冒险 |
在 Cliff Walking 中:
• SARSA 常常学到远离悬崖的安全路径;
• Q-learning 学到贴近悬崖的最短路径;
• Q-learning 的训练行为策略仍可能因为探索掉下悬崖。
注意:这不代表 Q-learning “错误”。它学习的最优策略确实是安全的最短路径,只是训练时使用了随机行为策略。
5.3 一个最小 Q-learning 实现
import numpy as np
n_states = 16
n_actions = 4
Q = np.zeros((n_states, n_actions))
alpha = 0.1
gamma = 0.95
epsilon = 1.0
for episode in range(5000):
state = reset()
done = False
while not done:
if np.random.rand() < epsilon:
action = np.random.randint(n_actions)
else:
action = np.argmax(Q[state])
next_state, reward, done, info = step(state, action)
target = reward
if not done:
target += gamma * np.max(Q[next_state])
Q[state, action] += alpha * (target - Q[state, action])
state = next_state
epsilon = max(0.05, epsilon * 0.995)
要点:
• 终止状态不再 bootstrap;
• epsilon 逐渐降低;
• 每对 (s,a) 都要被访问足够多次,表格 Q-learning 才有收敛保证。
5.4 Expected SARSA
Expected SARSA 不采样 a′,而是对所有动作求期望:
Q(s,a) ← Q(s,a) + α [ r + γ Σ_a′ π(a′|s′) Q(s′,a′) - Q(s,a) ]
它通常比 SARSA 方差更低。
5.5 Double Q-learning
普通 Q-learning 使用最大值,容易高估 Q 值。
Double Q-learning 使用两个 Q 函数:
• 一个网络选择动作;
• 另一个网络评价该动作。
这可以减少乐观偏差,也是 Double DQN 的基础。
5.6 探索策略
如果永远选择当前最优动作,智能体可能无法发现更好的策略。
ε-greedy
以 1−ε 的概率选择当前最优动作,以 ε 的概率随机选择。
优点是简单;缺点是在随机探索时也会选择明显很差的动作。
Softmax
按照动作价值的概率分布选择动作,通常越好的动作概率越高。
UCB
使用“价值 + 不确定性”选择动作:
a = argmax_a [ Q(a) + c sqrt(ln t / N(a)) ]
前半部分负责利用,后半部分鼓励访问次数少的动作。
Thompson Sampling
维护动作价值的后验分布,从后验中采样,然后选择价值最高的动作。
内在奖励
稀疏奖励环境下,可以额外奖励“新奇”或“不确定”的状态:
• 计数奖励;
• 好奇心;
• 随机网络蒸馏 RND;
• Intrinsic Curiosity Module。
探索策略的选择往往比换一个算法更影响最终效果。
5.7 On-policy 与 Off-policy
On-policy
只使用当前策略产生的数据更新。
例子:SARSA、REINFORCE、PPO。
优点:理论简单,优化目标和数据来源一致。
缺点:数据用一次就丢,样本效率较低。
Off-policy
可以使用其他策略产生的数据。
例子:Q-learning、DQN、DDPG、SAC。
优点:可以重复利用历史数据,样本效率可能更高。
缺点:数据分布和当前策略不一致,需要处理分布偏移。
5.8 本篇练习
1. 在同一环境中实现 SARSA 和 Q-learning,比较路径。
2. 把 ε 固定为 0.5,观察效果。
3. 画出 epsilon 随训练下降的曲线。
4. 解释为什么终止状态不能继续使用 γQ(s′,a′)。
5. 思考:为什么 off-policy 方法更容易出现不稳定?
第六篇 函数近似与 DQN
6.1 为什么表格不够用
假设状态是 84×84 的灰度图像:
• 每个像素有 256 种取值;
• 状态总数是 256^(84×84)。
这个数量远远超过宇宙中的原子数,不可能用表格存储每个状态的 Q 值。
如果是连续状态,例如机器人位置、速度和角度,状态甚至不可数。
因此必须使用函数近似:
Q_θ(s,a) ≈ Q*(s,a)
θ 可以是线性权重,也可以是神经网络参数。
6.2 从表格更新到参数更新
表格 Q-learning:
Q(s,a) ← Q(s,a) + α[ target - Q(s,a) ]
函数近似版本:
θ ← θ - α ∇_θ ( target - Q_θ(s,a) )²
其中目标通常是:
target = r + γ max_a′ Q_θ−(s′,a′)
这里 θ− 是目标网络参数,稍后会详细说明。
6.3 半梯度方法
如果 target 里也包含 θ,对它求梯度会很复杂。
深度 Q-learning 通常把 target 当作常数,只对当前 Q 求梯度:
L(θ) = ( r + γ max_a′ Q_θ−(s′,a′) - Q_θ(s,a) )²
这叫半梯度方法。
它不保证在所有情况下收敛,但配合经验回放和目标网络,通常在实践中表现很好。
6.4 Deadly Triad
Deep RL 不稳定的经典原因是三个因素叠加:
1. 函数近似;
2. 自举更新;
3. Off-policy 数据。
这三者被称为 deadly triad。
• 函数近似让参数互相影响;
• 自举让误差不断传播;
• Off-policy 让数据分布和当前策略不一致。
Deep RL 工程的大部分稳定性技巧,都是为了让这三者不要同时失控。
6.5 DQN 的核心思想
DQN 是用神经网络近似 Q 函数的 Q-learning 变体。

图 7:DQN 用神经网络从状态直接预测多个动作的 Q 值。
它有三个关键组件:
1. 经验回放 Replay Buffer
存储经验:
(s, a, r, s′, done)
训练时随机抽取一个小批量。
解决了两个问题:
• 连续样本高度相关;
• 过去的经验只能使用一次。
2. 目标网络 Target Network
如果目标值一直随着当前网络改变,训练就像追逐自己的尾巴。
因此使用一个延迟更新的目标网络:
θ− ← θ
每隔 C 步同步一次,或者使用软更新:
θ− ← τθ + (1−τ)θ−
3. 随机探索
通常使用 ε-greedy:
• 训练开始时 ε 接近 1;
• 随着训练逐渐减小;
• 后期主要利用已学策略。
6.6 DQN 损失函数
L(θ) = E[ ( r + γ max_a′ Q_θ−(s′,a′) - Q_θ(s,a) )² ]
如果回合结束:
target = r
不再加上未来价值。
实际中还会使用 Huber loss,减少异常梯度。
6.7 DQN 训练伪代码
初始化在线网络 Qθ 和目标网络 Qθ−
初始化 Replay Buffer D
for episode in 1..N:
获得初始状态 s
while 未结束:
用 ε-greedy 根据 Qθ 选择动作 a
执行 a,得到 r, s′, done
将 (s,a,r,s′,done) 存入 D
从 D 随机采样一个 batch
对每个样本计算 target:
target = r if done
target = r + γ max Qθ−(s′) otherwise
用 (target - Qθ(s,a))² 更新 θ
每隔 C 步令 θ− ← θ
s ← s′
6.8 DQN 常见改进
Double DQN
普通 DQN 使用 max,容易高估。
Double DQN 让在线网络选择动作,让目标网络评价动作:
target = r + γ Q_θ−(s′, argmax_a′ Q_θ(s′,a′))
Dueling DQN
把 Q 分解成:
Q(s,a) = V(s) + A(s,a) - mean_a′ A(s,a′)
这样网络可以分别学习状态价值和动作优势。
Prioritized Replay
优先采样 TD error 较大的样本,但需要重要性采样权重修正。
NoisyNet
在网络参数中加入噪声,让探索成为学习的一部分。
Rainbow
组合 Double、Dueling、Prioritized、n-step、Distributional、Noisy 等多种改进。
6.9 DQN 的适用边界
DQN 适合:
• 离散动作空间;
• 可以从环境中大量采样;
• 状态是高维的,例如图像;
• 动作数量不太大。
不适合:
• 连续动作空间;
• 动作数量极大;
• 需要严格安全约束;
• 不能在线交互的真实系统。
6.10 DQN 调试清单
1. 先在 CartPole 这样的小环境跑通。
2. 打印平均回报、损失、Q 值和 epsilon。
3. 检查 done 的处理是否正确。
4. 检查目标网络是否真的在更新。
5. 检查 Replay Buffer 是否太小或采样比例失衡。
6. 用多个随机种子,不要看一次训练曲线。
7. 先减小网络,再调学习率和 batch size。
8. 不要用训练时最低损失判断策略好坏,关键看评测回报。
6.11 本篇练习
1. 手写一个容量为 10000 的 Replay Buffer。
2. 对比有无目标网络的 DQN 训练曲线。
3. 实现 Double DQN。
4. 在 CartPole 上训练并达到稳定高回报。
5. 解释为什么 replay buffer 能降低样本相关性。
第七篇 策略梯度与 Actor-Critic
7.1 为什么要直接学习策略
DQN 先学习 Q,再通过 argmax 选择动作。它适合离散动作,但有几个局限:
• 连续动作很难对 Q 做全局最大化;
• 随机最优策略不容易用确定性 Q 表达;
• 策略更新不是直接优化策略目标。
策略梯度方法直接参数化策略:
π_θ(a|s)
然后直接最大化期望回报:
J(θ) = E_{τ∼π_θ}[ Σ_t γ^t r_t ]
7.2 策略梯度定理
对策略目标求梯度,可以得到:
∇_θ J(θ) = E[ ∇_θ log π_θ(a|s) Q^π(s,a) ]
这个公式是策略梯度的基础。
直观解释:
• 如果某个动作的 Q 值高,就提高它的概率;
• 如果某个动作的 Q 值低,就降低它的概率;
• 提高或降低的力度由 Q 值决定。
为什么要用 log
因为:
∇_θ π_θ = π_θ ∇_θ log π_θ
这样一来,可以把对轨迹概率求梯度转换成对每个动作的对数概率求梯度,从而用采样估计。
7.3 REINFORCE
最简单的策略梯度使用整条轨迹的回报 G:
∇_θ J(θ) = E[ ∇_θ log π_θ(a_t|s_t) G_t ]
对应更新:
for each episode:
用 πθ 采样一条完整轨迹
计算每个时刻的累计回报 G_t
loss = -log πθ(a_t|s_t) * G_t
反向传播并更新 θ
缺点:
• G 的方差很大;
• 一条轨迹可能只得到一次最终奖励;
• 训练很慢。
7.4 Baseline 与优势函数
给回报减去一个基线 b(s),不改变期望,却可以降低方差:
∇_θ J = E[ ∇_θ log π_θ(a|s) (G - b(s)) ]
如果选择基线:
b(s) = V^π(s)
就得到动作优势:
A^π(s,a) = Q^π(s,a) - V^π(s)
优势的含义:
这个动作比当前状态下的平均表现好多少。
• A>0:这个动作比平均好,提高概率;
• A<0:这个动作比平均差,降低概率。
7.5 Actor-Critic
Actor-Critic 同时学习:
• Actor:策略 πθ(a|s);
• Critic:价值函数 Vφ(s) 或 Qφ(s,a)。

图 8:Actor 负责行动,Critic 负责评价。
Critic 提供优势估计,降低策略梯度的方差。
训练有两个损失:
L_actor = -log π_θ(a|s) A(s,a)
L_critic = ( V_φ(s) - target )²
实际中还会加入熵奖励鼓励探索:
L = L_actor + c_1 L_critic - c_2 H(π_θ)
7.6 GAE 优势估计
GAE 使用多步 TD 误差:
δ_t = r_(t+1) + γ V(s_(t+1)) - V(s_t)
A_t^GAE = δ_t + γλδ_(t+1) + (γλ)²δ_(t+2) + …
λ 控制偏差和方差的平衡:
• λ=0:接近一步 TD;
• λ=1:接近 Monte Carlo;
• 常见值:0.95 左右。
7.7 熵奖励
策略熵表示策略的随机程度。
熵越大,动作分布越平均;熵越小,策略越接近确定性。
强化学习常用:
H(π(·|s)) = -Σ_a π(a|s) log π(a|s)
在损失中减去熵,等价于鼓励探索和保持多种动作的可能性。
7.8 策略梯度的方差问题
策略梯度是高方差方法,主要原因:
1. 轨迹随机;
2. 奖励可能稀疏且延迟;
3. 早期价值估计不准;
4. 动作概率的梯度可能非常大。
常用的降方差方法:
• 使用 reward-to-go,而不是整条轨迹的总回报;
• 使用 baseline;
• 使用 advantage;
• 使用 GAE;
• 使用多个并行环境;
• 归一化 advantage;
• 限制策略更新幅度。
7.9 本篇练习
1. 用 PyTorch 重写 REINFORCE。
2. 在 CartPole 上比较“有 baseline”和“无 baseline”的方差。
3. 写出 A(s,a)=Q(s,a)−V(s) 的文字解释。
4. 解释为什么直接最大化似然不能解决强化学习。
5. 思考:策略网络输出的动作概率过小会发生什么?
第八篇 PPO 与连续控制
8.1 为什么要限制策略更新
普通策略梯度可能一步更新太大,导致策略突然变差,之后很难恢复。
TRPO 通过信任域约束更新幅度,但实现复杂。
PPO(Proximal Policy Optimization)用一种更简单的方式实现“不要离旧策略太远”。
8.2 概率比
定义新旧策略的概率比:
r_t(θ) = π_θ(a_t|s_t) / π_old(a_t|s_t)
• r=1:新旧策略概率相同;
• r>1:新策略提高了这个动作的概率;
• r<1:新策略降低了这个动作的概率。
8.3 PPO Clip 目标
PPO 对抗目标函数为:
L_clip(θ) = E[ min( r_t A_t, clip(r_t, 1−ε, 1+ε) A_t ) ]
通常 ε=0.1 或 0.2。
理解方式:
• 如果优势 A>0,提高动作概率是好事,但提高太多后不再获得额外好处;
• 如果优势 A<0,降低动作概率是好事,但降低太多后也不再获得额外好处;
• 这可以防止一次更新让策略偏得太远。

图 9:PPO 用裁剪限制新旧策略的概率比。
8.4 PPO 的完整流程
for iteration=1..N:
用旧策略 π_old 收集 T 步数据
计算回报和目标价值
使用 GAE 计算优势 A_t
对优势做标准化
for epoch=1..K:
计算 ratio = π_new(a|s) / π_old(a|s)
计算 PPO clip 损失
计算价值损失和熵损失
合并损失并更新网络
丢弃旧数据,更新 π_old
PPO 是 on-policy 的:每次更新后,旧数据只能有限地重复使用几次。
8.5 PPO 损失组成
典型 PPO 总损失:
L = L_clip + c_1 L_value - c_2 L_entropy
注意:`
• L_clip 用于优化策略;
• L_value 用于训练 Critic;
• L_entropy 用于鼓励探索;
• c1、c2 是超参数。
实际实现常写成:
L = -L_clip + c_1 L_value - c_2 H(π)
具体符号取决于框架是最小化还是最大化损失。
8.6 PPO 常见超参数
| 超参数 | 作用 | 常见初值 |
| learning rate | 学习率 | 3e-4 |
| gamma | 折扣因子 | 0.99 |
| lambda | GAE 系数 | 0.95 |
| clip range | 概率比裁剪范围 | 0.2 |
| rollout length | 每次采样长度 | 2048 或更大 |
| batch size | 小批量大小 | 64 到 4096 |
| update epochs | 同一批数据训练轮数 | 3 到 10 |
| entropy coef | 熵奖励系数 | 0.0 到 0.01 |
不要照搬超参数,先根据奖励尺度、动作空间和网络结构调整。
8.7 PPO 什么时候好用
PPO 的优点:
• 离散和连续动作都能用;
• 相对稳定;
• 实现简单;
• 可并行采样;
• 通用性强。
PPO 的缺点:
• 样本效率不如 off-policy 方法;
• 对奖励尺度敏感;
• 需要调节 clip、GAE、学习率和并行环境数量;
• 不能简单处理非常昂贵的数据采集。
8.8 连续动作控制
连续动作空间中:
a ∈ R^n
不能简单枚举所有动作求 max。
DDPG
• Actor 输出确定性动作 μθ(s);
• Critic 评价 Qφ(s,a);
• 使用 replay buffer;
• 使用目标网络。
问题:对超参数敏感,Q 值容易高估。
TD3
在 DDPG 上加入:
1. 双 Critic,取较小值;
2. 延迟更新 Actor;
3. 目标动作平滑。
因此比 DDPG 稳定。
SAC
SAC 最大化回报和策略熵:
J(π) = E[ Σ_t ( r(s_t,a_t) + α H(π(·|s_t)) ) ]
好处:
• 自动鼓励探索;
• 不容易过早收敛;
• 连续控制中通常有较好样本效率。
三种方法的选择
| 场景 | 建议 |
| 想快速开始、通用性强 | PPO |
| 连续控制、样本效率优先 | SAC |
| 需要确定性策略、稳定性优先 | TD3 |
| 环境简单、离散动作 | DQN 或 Q-learning |
8.9 本篇练习
1. 用伪代码写出一个 PPO 训练循环。
2. 解释 ratio 的含义。
3. 当 A>0 且 ratio>1+ε 时,PPO 会发生什么?
4. 比较 PPO 和 SAC 的数据使用方式。
5. 在 Pendulum 环境中训练 PPO,记录平均回报。
第九篇 模型式强化学习与进阶方向
9.1 为什么要学习环境模型
Model-free 方法直接从交互数据学习价值或策略。
Model-based 方法学习环境模型:
P_φ(s′|s,a), r_φ(s,a)
或者学习一个只对规划有用的潜变量模型。
模型式方法可以在模型里“想象”很多轨迹,从而减少真实环境交互次数。
9.2 Dyna
Dyna 同时使用真实经验和模型产生的经验:
循环:
在真实环境中执行动作
用真实数据更新模型
用真实数据更新价值或策略
在模型里采样若干条想象轨迹
用想象数据继续更新价值或策略
Dyna 的思想非常经典:真实数据和模拟数据共同训练。
9.3 MCTS
Monte Carlo Tree Search(MCTS)通过搜索树规划未来:
1. Selection:从根节点选择当前最有希望的节点;
2. Expansion:扩展一个未访问节点;
3. Simulation:从该节点模拟到结束;
4. Backup:把模拟结果回传更新路径上的统计量。
AlphaGo、AlphaZero 使用神经网络提供先验概率和状态价值,再由 MCTS 搜索。
9.4 AlphaZero 与 MuZero
AlphaZero 的特点:
• 不依赖人类棋谱;
• 使用自我博弈产生数据;
• 神经网络预测策略和价值;
• MCTS 负责规划;
• 策略和价值网络边训练边变强。
MuZero 更进一步:
• 不要求显式重建真实环境;
• 学习一个适合规划的潜变量模型;
• 预测奖励、价值和策略;
• 在多个游戏中达到很强性能。
9.5 Dreamer 与世界模型
Dreamer 在潜空间中学习世界模型,然后在想象中训练 Actor-Critic。
优点是样本效率高,适合视觉控制和机器人任务。
风险是模型误差会在长 rollout 中累积,导致策略利用模型的错误。
9.6 离线强化学习
Offline RL 只能使用一个预先收集好的固定数据集,不能与环境继续交互。
核心问题是分布偏移:
数据由旧策略产生,但新策略可能访问数据分布之外的状态动作。
典型方法:
• BCQ:限制新策略选择数据集中出现过的动作;
• CQL:惩罚没有数据支持的高 Q 值;
• IQL:避免直接查询未知动作的 Q 值;
• TD3+BC:在 TD3 上加行为克隆约束;
• Decision Transformer:把 RL 变成序列建模问题。
Offline RL 适合医疗、金融、自动驾驶、推荐系统等不能随便在线试错的场景。
9.7 模仿学习与逆强化学习
Behavior Cloning
直接监督学习专家动作:
min_θ E[ -log π_θ(a_expert|s) ]
问题是遇到数据分布外状态时容易出错。
Inverse RL
不直接模仿动作,而是从专家行为反推奖励函数。
GAIL
使用对抗学习,让智能体状态动作分布接近专家。
9.8 多智能体强化学习
多个智能体同时学习时,环境对其他智能体来说是非平稳的。
常见结构:
• 独立学习:每个智能体各自学习;
• 集中训练、分散执行:CTDE;
• MADDPG:连续动作多智能体;
• QMIX:值分解;
• MAPPO:多智能体 PPO。
多智能体还会涉及合作、竞争、通信和信用分配。
9.9 分层强化学习
长时程任务可以分解为多个层次:
• 高层策略选择子目标;
• 低层策略完成子目标。
比如:
• 高层:去厨房;
• 低层:走路、开门、拿杯子。
代表方法包括 Options、HAM、FeUdal Networks。
9.10 其他进阶方向
| 方向 | 核心问题 | 代表方法 |
| Distributional RL | 学回报分布而不只是均值 | C51、QR-DQN、IQN |
| Safe RL | 满足安全约束 | CPO、Lagrangian 方法 |
| Meta RL | 快速适应新任务 | MAML、RL² |
| Hierarchical RL | 长时程和子目标 | Options、FeUdal |
| Multi-Agent RL | 多个智能体互动 | QMIX、MAPPO |
| Generalization RL | 换环境仍能工作 | Domain Randomization |
| Causal RL | 区分相关和因果 | 因果模型 + RL |
9.11 本篇练习
1. 比较 model-free 和 model-based 的优缺点。
2. 用一句话解释 MCTS 的四个步骤。
3. 为什么 offline RL 特别怕分布外动作?
4. 举一个适合分层强化学习的任务。
5. 思考多智能体环境和单智能体环境最大的区别。
第十篇 大语言模型中的强化学习
10.1 语言模型生成也是序列决策
大语言模型生成文本可以写成一个 MDP:
• 状态:prompt + 已经生成的 token;
• 动作:下一个 token;
• 策略:语言模型;
• 环境:上下文、工具、对话状态;
• 奖励:整段回答结束后由人类偏好或奖励模型给出。
这就是为什么 RLHF(Reinforcement Learning from Human Feedback)可以用于语言模型对齐。

图 10:RLHF 的典型流程。SFT、奖励模型和策略优化三步。
10.2 RLHF 三步流程
第一步:监督微调 SFT
用高质量示范回答训练模型,让它学会基本格式和任务模式。
第二步:训练奖励模型
让人类对同一问题的多个回答排序,训练一个奖励模型 Rφ(x,y),预测哪个回答更符合偏好。
第三步:策略优化
用 PPO 等方法优化语言模型,让它生成奖励更高的回答。
目标通常写成:
max_π E[ R_φ(x,y) ] - β KL( π(y|x) || π_ref(y|x) )
其中:
• 第一项希望回答获得高奖励;
• 第二项希望不要偏离参考模型太远;
• β 控制两者平衡。
10.3 为什么需要 KL 惩罚
如果只追求奖励模型分数,模型可能:
• 学会讨好奖励模型;
• 生成重复但高分的内容;
• 失去语言流畅性;
• 利用奖励模型偏差;
• 产生不安全回答。
KL 惩罚相当于一个“不要走太远”的约束,让模型在提升偏好的同时保持原有语言能力。
10.4 PPO 与 LLM
在 LLM 中:
• Actor 是语言模型;
• Critic 估计预期回报;
• 奖励模型提供最终奖励;
• KL 作为每步或序列级惩罚;
• 生成 token 的过程构成轨迹。
PPO 的优点是稳定、成熟;缺点是训练复杂、需要价值网络,内存和计算成本较高。
10.5 DPO
DPO(Direct Preference Optimization)直接用偏好对 (x, y_win, y_lose) 优化策略,不显式训练奖励模型,也不进行在线采样。
核心思想是:
把“偏好奖励”转化为一种对策略概率比较的损失。
优点:
• 流程简单;
• 不需要维护 PPO 的 Critic;
• 训练通常更稳定。
需要注意:DPO 属于偏好优化方法,和标准的在线强化学习不完全相同,但它来自相同的偏好优化目标。
10.6 GRPO
GRPO(Group Relative Policy Optimization)对同一问题采样多个回答,用组内相对排名或相对奖励作为基线。
特点:
• 不需要独立的 Critic 网络;
• 使用组内均值作为 baseline;
• 降低方差和显存开销;
• 适合大模型训练场景。
10.7 奖励黑客
奖励黑客(reward hacking)指模型发现了一条能提高奖励、但不符合真实目标的行为。
例子:
• 游戏智能体发现卡在某个状态可以反复得分;
• 语言模型学会输出奖励模型喜欢的模板;
• 机器人为了“移动距离”奖励而原地旋转。
解决方法:
• 设计更稳健的奖励;
• 加入约束;
• 使用多个奖励模型;
• 人工审核;
• 使用 KL 正则;
• 从真实任务指标而不是代理奖励判断效果。
10.8 本篇练习
1. 把“生成一段回答”写成状态、动作、奖励。
2. 解释 RLHF 中 KL 惩罚的作用。
3. 比较 PPO、DPO、GRPO 的流程。
4. 举出两个奖励黑客的例子。
5. 思考:语言模型 RL 和游戏 RL 最大的区别是什么?
第十一篇 实战项目与调试
11.1 学习强化学习必须写代码
只看公式会形成一种错觉:好像理解了,但遇到环境、终止条件和数据形状时仍然不会实现。
建议从最小的环境开始,自己实现算法,不要一开始就使用现成库。
11.2 项目一:GridWorld 动态规划
目标:
• 自己定义网格世界;
• 实现环境转移;
• 实现价值迭代;
• 打印价值表和策略箭头;
• 观察 γ 对策略的影响。
验收标准:
• 目标状态价值最高;
• 策略能稳定到达目标;
• 修改障碍位置后结果合理。
11.3 项目二:Tabular Q-learning
目标:
• 实现 FrozenLake 或 Cliff Walking;
• 使用 ε-greedy;
• 记录每个回合回报;
• 比较 SARSA 和 Q-learning。
验收标准:
• Q-learning 最终找到最优路径;
• SARSA 在悬崖环境中倾向安全路径;
• 能解释两者的差别。
11.4 项目三:DQN CartPole
目标:
• 使用 PyTorch 或 TensorFlow 实现 DQN;
• 加入 Replay Buffer;
• 加入 Target Network;
• 在 CartPole 上达到稳定回报。
验收标准:
• 训练曲线在多个随机种子下总体上升;
• 评测时使用 greedy policy;
• 能解释不稳定的可能原因。
11.5 项目四:PPO 连续控制
目标:
• 在 Pendulum 或 MuJoCo 环境中训练 PPO;
• 记录 rollout、advantage、value loss、policy loss;
• 调整 clip range 和 GAE λ。
验收标准:
• 回报明显高于随机策略;
• 训练过程基本稳定;
• 能说明 KL、clip 和 entropy 的作用。
11.6 项目五:离线 RL 或玩具 RLHF
选择其一:
• 使用 D4RL 数据集训练 IQL 或 CQL;
• 构造一个小型偏好数据集,实现 DPO 或简化 PPO;
• 分析不同 beta、KL 系数和奖励模型对结果的影响。
这个项目的目的不是追求 SOTA,而是理解新的数据分布和训练约束。
11.7 12 周学习计划
| 周数 | 学习内容 | 输出物 |
| 第 1 周 | 强化学习直觉、MDP、回报 | 写一页概念笔记 |
| 第 2 周 | Bellman、动态规划 | GridWorld 价值迭代 |
| 第 3 周 | Monte Carlo、TD | 两种价值预测对比 |
| 第 4 周 | SARSA、Q-learning | Cliff Walking 项目 |
| 第 5 周 | 探索、函数近似 | 完成 CartPole DQN |
| 第 6 周 | Replay、Target、Double DQN | DQN 消融实验 |
| 第 7 周 | 策略梯度、Baseline | REINFORCE 项目 |
| 第 8 周 | Actor-Critic、GAE | A2C 项目 |
| 第 9 周 | PPO | Pendulum 或 MuJoCo |
| 第 10 周 | SAC/TD3 | 连续控制对比 |
| 第 11 周 | 模型式或离线 RL | 选定一个专题 |
| 第 12 周 | 综合复盘 | 报告、代码、图表 |
每周至少做三件事:
1. 写代码;
2. 画曲线;
3. 用自己的话解释一个算法。
11.8 如何评估强化学习算法
不要只看一次训练的最终回报。
推荐评估协议:
• 固定评测环境;
• 使用固定的随机种子集合;
• 评测时策略不探索,或者固定探索率;
• 报告均值、标准差和置信区间;
• 同时报告样本效率和最终性能;
• 保存代码版本和超参数;
• 对关键结论做消融实验。
训练回报和评测回报
训练回报可能受到探索、训练环境随机性和数据分布的影响。
评测时通常使用:
• 确定性贪心策略;
• 或者固定随机种子下的随机策略。
两者不能混为一谈。
11.9 常见训练问题
奖励不上升
可能原因:
• 奖励设计不合理;
• 探索不足;
• 学习率过大或过小;
• 网络太小或太大;
• 终止状态处理错误;
• advantage 没有归一化;
• 数据集或环境有 bug。
奖励上升后崩溃
可能原因:
• 学习率太大;
• PPO 做太多 update epochs;
• Q 值高估;
• replay buffer 分布变化;
• 目标网络同步太频繁;
• 奖励尺度突然变化。
方差极大
可能原因:
• 随机种子太少;
• 轨迹长度差异大;
• 奖励稀疏;
• advantage 估计不稳定;
• 只报告单次运行。
11.10 调试顺序
1. 先用随机策略确认环境能运行。
2. 用极小环境验证 Bellman 更新。
3. 打印状态、动作、奖励、done。
4. 检查张量形状和 batch 维度。
5. 检查是否需要 detach()。
6. 检查 optimizer 是否真的更新参数。
7. 关闭探索测试确定性策略。
8. 缩小网络和学习率。
9. 从单环境开始,再增加并行环境。
10. 与一个小型开源实现逐行对照。
如果算法看起来“完全没学会”,优先怀疑环境、终止条件和数据,而不是立刻更换算法。
第十二篇 附录
12.1 概率与期望速查
随机变量
随机变量表示随机结果,例如掷骰子的点数。
期望
离散随机变量 X 的期望:
E[X] = Σ_x P(X=x) x
期望可以理解为长期平均值。
条件期望
E[X|Y=y]
表示已知 Y=y 时 X 的平均值。
强化学习中的价值函数本质上就是条件期望:
V(s) = E[G_t | S_t=s]
方差
Var(X) = E[(X-E[X])²]
方差越大,训练信号波动越大。
常见概率分布
• Bernoulli:成功或失败;
• Categorical:多个离散动作;
• Gaussian:连续动作和连续状态;
• Uniform:均匀探索。
12.2 Python 与 PyTorch 必要基础
强化学习项目通常需要掌握:
• NumPy 数组和广播;
• Python 类和函数;
• PyTorch 张量;
• 自动求导;
• optimizer.zero_grad();
• loss.backward();
• optimizer.step();
• detach() 和 no_grad();
• 随机种子。
一个最小策略网络
import torch
import torch.nn as nn
class PolicyNet(nn.Module):
def __init__(self, obs_dim, n_actions):
super().__init__()
self.net = nn.Sequential(
nn.Linear(obs_dim, 64),
nn.Tanh(),
nn.Linear(64, 64),
nn.Tanh(),
nn.Linear(64, n_actions),
)
def forward(self, x):
logits = self.net(x)
return torch.distributions.Categorical(logits=logits)
使用概率分布选择动作,并在训练时保存 log_prob。
12.3 核心公式备忘
回报
G_t = Σ_k γ^k r_(t+k+1)
状态价值
V^π(s) = E_π[G_t | S_t=s]
动作价值
Q^π(s,a) = E_π[G_t | S_t=s, A_t=a]
Bellman 期望方程
V^π(s) = E[ r + γ V^π(s′) ]
最优 Bellman 方程
Q*(s,a) = E[ r + γ max_a′ Q*(s′,a′) ]
TD 误差
δ_t = r_(t+1) + γV(s_(t+1)) - V(s_t)
优势函数
A^π(s,a) = Q^π(s,a) - V^π(s)
策略梯度
∇_θ J = E[ ∇_θ log π_θ(a|s) A(s,a) ]
PPO Clip
L_clip = E[ min( r_t A_t, clip(r_t,1−ε,1+ε) A_t ) ]
SAC 目标
J(π) = E[ r(s,a) + α H(π(·|s)) ]
RLHF 目标
max_π E[R_φ(x,y)] − β KL(π(y|x) || π_ref(y|x))
12.4 术语表
| 术语 | 解释 |
| Agent | 做决策的智能体 |
| Environment | 响应动作并返回状态奖励的外部系统 |
| State | 当前环境信息 |
| Action | 智能体执行的动作 |
| Reward | 环境给出的即时反馈 |
| Return | 从当前时刻开始的累计折扣奖励 |
| Policy | 状态到动作的规则 |
| Value | 某状态或状态动作的长期期望回报 |
| Trajectory | 状态动作奖励序列 |
| Episode | 从开始到终止的一段交互 |
| Bootstrap | 用估计值更新估计值 |
| On-policy | 学习当前策略产生的数据 |
| Off-policy | 学习其他策略产生的数据 |
| Replay Buffer | 存储历史经验并随机采样的缓冲区 |
| Target Network | 计算稳定目标的延迟网络 |
| Advantage | 动作相对平均表现的优势 |
| GAE | 兼顾偏差和方差的优势估计方法 |
| Model-based | 学习或使用环境模型 |
| Offline RL | 只使用固定离线数据 |
| RLHF | 基于人类反馈的强化学习 |
| Reward Hacking | 利用奖励设计漏洞获取高分 |
12.5 常见问题
学强化学习需要先学深度学习吗
不需要。先学 MDP、动态规划、Monte Carlo 和 TD。等进入 DQN、PPO 时,再学习神经网络和自动求导即可。
为什么我的 Q-learning 不收敛
检查:
• 是否访问了所有状态动作对;
• 学习率是否逐渐减小;
• 是否错误地在终止状态 bootstrap;
• 奖励是否过大;
• 探索是否不足;
• 状态表示是否满足 Markov 性。
DQN 为什么会有两个网络
当前网络负责预测 Q,目标网络负责提供相对稳定的训练目标。否则目标值随着参数一起变化,训练会非常不稳定。
PPO 为什么需要旧策略
因为 PPO 使用概率比衡量新旧策略变化。如果旧策略的概率被覆盖,就无法正确计算 ratio。
PPO 的 clip 是不是越大越好
不是。clip 太大,限制变弱,策略可能更新过度;clip 太小,学习变慢。通常从 0.2 开始。
On-policy 一定比 Off-policy 差吗
不一定。On-policy 数据效率可能低,但稳定性往往更好;Off-policy 可以重复使用数据,但要处理分布偏移和稳定性问题。
为什么奖励设计这么难
因为奖励是目标的代理。代理奖励和真实目标不一致时,智能体就会优化代理,而不是你真正想要的行为。
为什么一定要多个随机种子
强化学习训练受到环境随机性、网络初始化和探索行为影响。单次结果很容易偶然很好或很差。
12.6 推荐资料
理论入门
• Sutton & Barto,《Reinforcement Learning: An Introduction》第二版;
• David Silver 的强化学习公开课;
• Berkeley CS285 Deep Reinforcement Learning。
工程实现
• OpenAI Spinning Up;
• CleanRL;
• Stable-Baselines3;
• Gymnasium 文档;
• PettingZoo 多智能体环境。
进阶论文关键词
• DQN;
• Double DQN;
• Dueling DQN;
• Prioritized Experience Replay;
• Soft Actor-Critic;
• Trust Region Policy Optimization;
• Proximal Policy Optimization;
• Deterministic Policy Gradient;
• Twin Delayed DDPG;
• Conservative Q-Learning;
• Decision Transformer;
• Dreamer;
• MuZero;
• RLHF、DPO、GRPO。
12.7 练习答案的检查标准
本文档不提供死记硬背的“唯一标准答案”,而是给出检查标准。
关于 MDP
你的答案应该明确:
• 状态是否足以决定未来;
• 动作是否由智能体控制;
• 奖励是否由环境给出;
• 是否存在终止条件;
• 折扣因子是否合理。
关于价值
你的答案应该能区分:
• V 是某个状态的平均长期回报;
• Q 是先执行某个动作后的平均长期回报;
• 价值和奖励不是同一个东西;
• 价值依赖策略。
关于 Q-learning
你的答案应该能解释:
• target 为什么使用 max;
• 为什么它是 off-policy;
• 终止状态为什么不再 bootstrap;
• 为什么需要探索。
关于 PPO
你的答案应该能解释:
• ratio 衡量新旧策略差异;
• advantage 表示动作好坏;
• clip 限制更新幅度;
• GAE 平衡偏差和方差;
• entropy 鼓励探索。
12.8 最后的学习建议
第一,不要追求一次理解所有算法。
强化学习有大量相互依赖的概念。你可以在第一遍只理解:
• 状态、动作、奖励;
• 回报;
• V 和 Q;
• Bellman 方程;
• 策略改进。
第二遍再理解:
• Monte Carlo 和 TD;
• On-policy 和 Off-policy;
• 函数近似;
• 策略梯度。
第三遍再进入:
• DQN;
• PPO;
• SAC;
• Offline RL;
• RLHF。
第二,必须自己写一次算法。
调库能让你完成任务,但只有自己写出 Q-learning、DQN 和 PPO,才会真正知道数据从哪里来、损失怎样计算、终止状态如何处理。
第三,记录实验。
每次训练至少记录:
• 环境名称;
• 算法;
• 超参数;
• 随机种子;
• 平均回报;
• 评测回报;
• 训练步数;
• 代码版本;
• 结论和失败原因。
第四,学会判断问题属于哪一类。
• 离散状态、离散动作:表格 Q-learning;
• 高维离散动作:DQN;
• 连续动作:PPO、TD3、SAC;
• 样本昂贵:模型式、离线 RL、模仿学习;
• 多智能体:QMIX、MAPPO;
• 语言模型偏好优化:PPO、DPO、GRPO。
12.9 一页总结
如果只记住五句话:
1. 强化学习是在交互中学习长期决策。
2. 价值是从当前状态开始的期望累计回报。
3. Bellman 方程把长期回报拆成当前奖励加下一步价值。
4. 强化学习的基本循环是“评估策略、改进策略、产生新数据”。
5. 高级算法都在处理探索、信用分配、函数近似和分布偏移。
如果用一条路线概括:
MDP → Bellman → DP → Monte Carlo → TD → Q-learning → DQN → Policy Gradient → Actor-Critic → PPO/SAC → Model-based/Offline/RLHF
现在开始你的第一个小项目:画一个 4×4 网格,用价值迭代算出每个格子的价值。把整个文档的理论落到第一段代码上,你就真正进入强化学习了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)