强化学习中的根本选择:On‑Policy 与 Off‑Policy

TL;DR · AI 摘要
在强化学习中,核心区别在于是否让代理仅从自身行为中学习(on‑policy)或从其他行为产生的数据中学习(off‑policy),这决定了探索方式、样本效率、训练稳定性和安全性。
核心要点
- On‑policy 方法(如 SARSA)直接改进当前策略,训练更稳定但样本利用率低。
- Off‑policy 方法(如 Q‑learning)可利用历史或外部数据,样本效率高,但训练更不稳定。
- Expected SARSA 通过对下一动作取期望,兼具两者优点,降低方差并可在两种模式下使用。
结构提纲
按章节快速跳转。
- §引言
阐述强化学习中 on‑policy 与 off‑policy 的核心区别及其对算法属性的影响。
解释代理学习的目标是估计动作价值函数 Q(s,a),并说明这为区分两种学习方式奠定基础。
描述 on‑policy 方法如何从当前策略产生的数据中更新 Q 值,强调其稳定性与低样本效率。
说明 off‑policy 方法如何利用不同策略产生的数据进行学习,突出{样本效率高}与{训练不稳定}的权衡。
介绍 Expected SARSA 如何通过对下一动作取期望来兼顾两者优点,并可在两种模式下使用。
讨论这一区分如何影响探索、样本效率、稳定性与安全性,并在深度 RL 中的应用。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- On‑Policy vs Off‑Policy
- On‑Policy
- SARSA
- Stable Training
- Low Sample Efficiency
- Off‑Policy
- Q‑learning
- Replay Buffer
- High Sample Efficiency
- Less Stable
- Expected SARSA
- Expectation over next action
- Reduces Variance
- Hybrid Use
金句 / Highlights
值得收藏与分享的关键句。
On‑policy 方法从代理当前使用的策略中学习,使训练更稳定但样本效率低。
Off‑policy 方法将行为与学习分离,允许代理从重放缓冲或日志数据中学习,提升样本效率但可能降低稳定性。
Expected SARSA 通过对下一动作取期望来兼顾两者优点,常降低方差并可在两种模式下使用。
标题:强化学习中的根本选择:策略内学习 vs. 策略外学习
来源网址:<https://towardsdatascience.com/the-fundamental-choice-in-reinforcement-learning-on-policy-vs-off-policy/>
发布时间:2026-06-05T15:00:00+00:00
在强化学习中,往往先列出一长串算法:SARSA、Q‑learning、PPO、DQN、SAC 等等。每个名字似乎都指向一种不同的方法、不同的技巧,或者不同的数学表述。但这些算法背后其实都围绕着一个更简单的问题:
“代理只应从它当前使用的行为中学习,还是也可以从其他方式生成的行为中学习?”
这就是策略内(on‑policy)与策略外(off‑policy)学习的核心区别。
为了让这一区别更直观,我们先给出一个基本定义。在强化学习中,策略(policy)是代理用来决定在每种情境下采取何种动作的规则或策略。一旦这个概念清晰,区别也就容易看出来。策略内方法从代理当前遵循的同一策略中学习;策略外方法则将两者分离。代理可以根据一种策略行动,同时学习关于另一种策略的信息。
这不仅仅是术语问题。它影响着学习算法最重要的属性:探索方式、所需数据量、是否能利用旧经验,以及训练的稳定性。在数据获取成本低的场景下,这可能看起来只是技术选择;在数据昂贵、收集缓慢或风险较高的场景中,它就成为一种实际需求。
想象一个机器人在繁忙的仓库中学习移动。由于安全原因,其训练期间的行为可能需要保持保守。策略内方法直接改进这种保守行为;策略外方法则允许更灵活的做法,例如机器人可以在保持谨慎的同时,利用收集到的经验学习另一种可能最终表现更好的策略。代理行为与其学习内容的分离正是策略外学习的核心思想。
这一单一区别帮助我们组织了大量强化学习内容。它解释了 SARSA 与 Q‑learning 的经典对比,并继续影响许多现代深度强化学习方法。在本文中,我们将从表格(tabular)设置开始,逐步拆解这一概念,随后利用这一基础为更广阔的 RL 领域建立直觉。
你将获得的收获
- 策略内方法:从代理当前用于与环境交互的同一策略中学习。它们往往更稳定、易于推理,但通常无法充分利用旧数据。SARSA 是策略内学习的标准表格示例。
- 策略外方法:使用从不同行为策略收集的数据来学习目标策略。这样它们更具数据效率,能够利用回放缓冲区、日志数据或其他代理的经验,但训练可能不够稳定。Q‑learning 是策略外学习的标准表格示例。
- 期望 SARSA:通过对下一步动作取期望来平衡两者,常常降低方差,并可在策略内或策略外环境中使用。
- 这一区别影响 RL 系统最重要的属性,包括探索、样本效率、稳定性 和学习过程中的安全性。
- 表格方法不仅是历史垫脚石——它们提供了最清晰的方式来直观理解在现代深度 RL 中再次出现的相同思想。
要精确区分这两种学习方式,我们需要先回到一个更基本的问题:RL 代理究竟在尝试学习什么? 在比较 SARSA 与 Q‑learning 等算法之前,先了解它们正在更新的对象会更有帮助。在大多数表格 RL 方法中,代理并不是直接学习动作,而是学习在不同情境下不同动作的价值估计。一旦这个概念清晰,策略内与策略外学习的区别就会变得更易理解。
1. 代理究竟在尝试学习什么?
想象一个代理在世界中漫游。每一步,它处于某个状态 s,选择一个动作 a,获得奖励 r,并落入新状态 s′。它的目标是最大化随时间累积的总奖励。
但要做到这一点,代理需要一种评估其选择的方法。它必须回答以下问题:
- 在状态 s 下采取动作 a 是个好主意吗?
- 这个选择会导致更好的后续奖励吗?
- 答案在多大程度上取决于代理接下来做什么?
强化学习中的一个核心概念是动作价值函数,通常记作 Q(s, a)。用通俗的话说,这个函数衡量在状态 s 下采取动作 a 的好坏,既考虑即时奖励,也考虑可能随后的未来奖励。
更精确地说,在策略 π 下,动作价值函数定义为从状态 s 开始,采取动作 a,随后永远遵循策略 π 的期望回报:

其中 G_t 是从时间步 t 开始的总折扣回报:

将它们结合起来,我们可以显式写出动作价值函数:

一开始符号可能显得繁重,但直觉很简单:
“如果我现在在状态 s 下采取动作 a,然后继续遵循策略 π,我期望获得多少总奖励?”
动作的价值不仅取决于执行后立即发生的事情,还取决于代理随后做出的决策。相同的动作在不同的未来策略下可能具有不同的价值。这正是 on‑policy / off‑policy 区分的起点。
我们需要记住两个重要概念:
- 目标策略(π):代理正在评估或改进的策略。
- 行为策略(b):实际产生经验的策略。
有了这些定义,区别可以清晰表述:
- 在 on‑policy 学习 中,代理学习的是它用来行动的同一策略。也就是说,目标策略和行为策略相同:(π = b)。
- 在 off‑policy 学习 中,代理在遵循一种策略的同时学习另一种策略。此时,目标策略和行为策略不同:(π ≠ b)。
这看似只是措辞上的细微差别,却会产生深远影响。
在 on‑policy 方法中,代理改进的是它在环境中实际使用的策略;在 off‑policy 方法中,代理可能以一种方式行动(例如谨慎或随机探索),而在后台学习另一种策略。正是这种分离使得 off‑policy 方法能够重用旧数据、从探索性动作中学习,甚至受益于其他代理收集的经验。
一个简单的类比可以帮助理解。想象你正在学习下棋。on‑policy 方法就像通过分析你在比赛中实际下的每一步来提升自己;off‑policy 方法则像在练习时采用一种风格,同时研究棋谱或专家示例中的更强动作的后果。两种方式都在学习,但你如何行动与你学到什么之间的关系不同。正是这种关系是本文的核心思想。
在下一节中,我们将通过实际更新价值估计的方式来具体说明这一区别。那时 SARSA 与 Q‑learning 的对比会变得尤为清晰。
2. 时序差分学习:故事真正开始的地方
在比较 SARSA 与 Q‑learning 之前,我们需要先了解它们共同构建的核心思想——时序差分(TD)学习。
如果 on‑policy 与 off‑policy 告诉我们算法使用的是哪种策略关系,那么 TD 学习告诉我们代理如何从经验中更新自己的知识。从这个意义上说,TD 学习是许多重要强化学习方法的共同基础。
从历史上看,TD 学习位于两种更早思想之间:
- 蒙特卡罗方法:从完整的回合中学习。它们使用实际经验得到的回报,但只能在回合结束后更新。
- 动态规划:通过自举(bootstrapping)从其他估计中更新估计。它可以非常高效,但假设能获得完整的环境模型。
TD 学习结合了两者的优点。像蒙特卡罗方法一样,它直接从经验中学习且不需要环境模型;像动态规划一样,它使用其他估计来更新估计,而不是等到回合结束。
正是这种组合使得 TD 学习如此强大。
假设代理想要估计一个状态的价值 V(s)。在从状态 S_t 移动到 S_{t+1} 并收到奖励 R_{t+1} 后,一步 TD 更新如下:
V(S_t) ← V(S_t) + α [R_{t+1} + γ V(S_{t+1}) − V(S_t)]乍一看这只是另一个公式,但其逻辑很简单。代理先取当前估计 V(S_t),然后把它朝更好的目标靠拢:
目标 = R_{t+1} + γ V(S_{t+1})这个目标表示:先取你刚观察到的即时奖励,然后加上对未来的折扣估计。括号内的量
δ_t = R_{t+1} + γ V(S_{t+1}) − V(S_t)称为 TD误差。你可以把 TD 误差视为一种“惊讶”度量:
- 若接近零,代理的预测大致正确。
- 若为正,结果比预期好。
- 若为负,结果比预期差。
因此,TD 更新实际上是一个非常自然的过程:预测 → 观察 → 比较 → 修正。
这也是 自举(bootstrapping) 概念出现的地方。在 TD 学习中,代理使用另一个估计来更新估计。它不等待完整的未来回报,而是将对下一个状态的当前猜测作为目标的一部分。这使学习更快、更渐进,也是 TD 方法在强化学习中如此核心的原因之一。
但自举带来了一个重要后果:我们自举自哪一个估计很重要。
这正是 on‑policy / off‑policy 区分在算法层面显现的起点。
SARSA 与 Q‑learning 都是 TD 控制方法。它们使用 TD 风格的更新来学习动作价值并随时间改进行为。它们之间的关键区别在于自举的目标:
- SARSA 使用代理实际下一步采取的动作来更新。
- Q‑learning 使用当前估计中看起来最优的动作来更新。
这一个小改动就足以让一种方法成为 on‑policy,另一种成为 off‑policy。
在下一节中,我们将看到具体实现。
3. SARSA:学习我们自身选择的后果
SARSA 是经典的 on‑policy TD 控制算法。它的名字来自它使用的元组:
(S 状态, A 动作, R 奖励, next S 状态, next A 动作)。
其更新规则如下:
Q(S_t, A_t) ← Q(S_t, A_t) + α [R_{t+1} + γ Q(S_{t+1}, A_{t+1}) − Q(S_t, A_t)]3. SARSA:学习自己的行为
SARSA(State‑Action‑Reward‑State‑Action)学习的是Agent 在下一步真正会执行的动作的价值。 Q(S_t, A_t) 代表 Agent 实际在当前状态下所做动作的价值,而不是最优动作或平均值,仅仅是它真正要执行的动作。
这听起来可能不重要,但它彻底改变了学习过程。 如果 Agent 使用 ε‑greedy 策略(大部分时间贪婪,偶尔随机),SARSA 就会学习到该 ε‑greedy 策略的价值,连带其缺陷也一并学习。Agent 会把自己的不完美行为纳入考量。
代码示例(概念性)
# SARSA 更新
next_action = policy(Q, next_state)
td_target = reward + gamma * Q[next_state, next_action]
td_error = td_target - Q[state, action]
Q[state, action] += alpha * td_error更新完 Q 后,Agent 只需根据新的 Q 值重新推导其 ε‑greedy 策略。 只要策略最终访问到所有状态‑动作对,且 ε 随时间衰减至 0,SARSA 就会收敛到最优策略。 但在学习过程中,它是在学习自己的(不完美)行为。
坠崖实验(Cliff Walking)
最直观的演示是 Cliff Walking。想象一个网格:

- 起点 S,终点 G。
- 每一步代价为 -1。
- 若踩到悬崖,得到 -100 并重置到 S。
显而易见的两条策略:
- 安全路径 – 上升并绕行,远离悬崖。
- 悬崖边路径 – 直接沿底行走到目标。
SARSA 学习的是安全路径。
原因在于它知道自己有时会随机行动。若 Agent 走到悬崖旁边,偶尔会跌落。SARSA 的价值估计会反映这种风险,因此它更倾向于内陆路线。
如果 Agent 确实偶尔犯错,走安全路线才是明智之举。 在经典的 Cliff Walking 实验中,ε 固定为 0.1,SARSA 永远不会完全贪婪;这就是它的学习策略保持安全的原因。 如果让 ε 随时间衰减,SARSA 最终会收敛到最优路径,但在此过程中会跌落更多次。
4. Q‑Learning:设想完美未来
Q‑Learning 颠倒了思路。它的更新如下:

与 SARSA 不同,它使用 所有可能下一动作的最大值,而不是实际执行的动作。这是离策略(off‑policy)的方法。 Agent 可能仍在 ε‑greedy 下探索,但其更新假设从下一步开始就会最优行动。
代码示例(概念性)
# Q‑learning 更新
td_target = reward + gamma * np.max(Q[next_state, :])
td_error = td_target - Q[state, action]
Q[state, action] += alpha * td_errorQ‑Learning 在 Cliff Walking 上
回到悬崖实验,Q‑Learning 学习的是悬崖边路径。
它设想一个完美的未来——没有随机失误。在这个理想世界里,走在悬崖旁边是安全的,因为完美 Agent 永不跌落。 最大化操作假设每一步都以最优方式行动,因此探索带来的风险在其估计中消失。
这在实践中意味着什么?
- 在训练期间,Q‑Learning 往往比 SARSA 表现更差,因为它会危险地靠近悬崖并偶尔跌落,导致大额惩罚。
- SARSA 由于更安全,学习过程中的累计奖励更高。
但训练结束后,关闭探索,Q‑Learning 会沿最短路径行走;SARSA 则仍停留在更长但安全的路线。
这就是经典的权衡:更好的最终性能 vs. 更好的学习过程性能。
5. Expected SARSA:两者兼顾?
第三种算法正好位于 SARSA 与 Q‑Learning 之间:Expected SARSA。 它使用所有下一动作的期望值,而不是单个样本或最大值:

该和式是对所有可能下一动作的加权平均,权重来自当前策略的概率。
为什么这很酷?
- 消除动作采样的方差。SARSA 的更新会因随机动作而波动;Expected SARSA 对所有可能性取平均,更新更平滑。
- 可为 on‑policy 或 off‑policy。若目标策略 π 与行为策略相同,则为 on‑policy;若 π 贪婪而行为策略探索,则为 off‑policy。
- 包含 Q‑Learning 作为特例。当 π 贪婪时,求和退化为 max。
在 Cliff Walking 实验中,Expected SARSA 通常在多种步长下优于 SARSA 和 Q‑Learning。 缺点是需要遍历所有动作来计算该和式——在小网格上没问题,但在大规模或连续动作空间中成本很高。因此 Q‑Learning(以及其深度版本 DQN)在实践中更受欢迎。
6. 隐藏陷阱:Q‑Learning 的最大化偏差
Q‑Learning 存在一个隐蔽缺陷:最大化偏差。 由于它使用 max_a Q(S_{t+1}, a),而这些 Q 值只是噪声估计,最大值往往被高估。
想象所有真实动作值均为 0,但我们的估计带有随机噪声。噪声估计的最大值通常为正值。Q‑Learning 从这个正的过估计开始自举,使其进一步放大。随着时间推移,Agent 会过度自信。
教材给出的修正方法是 Double Q‑Learning。使用两个独立的 Q 函数,Q1 与 Q2。让一个挑选最佳动作,另一个评估它:

为了保持对称,Q2 的更新如下:

将选择与评估解耦可以抵消正向偏差。这个想法后来促成了Double DQN,它是原始 Deep Q‑Network 的关键改进。
7. n 步视角:光谱,而非二元
教材中最令人开阔思维的观点之一是,一步 TD 与 Monte Carlo 只是光谱的两端,由n 步回报连接起来。
n 步 TD 目标如下所示:

- n=1 给出标准的一步 TD 目标(SARSA 与 Q‑learning 使用的)。
- n=∞ 给出完整的 Monte Carlo 回报,完全不做自举。
更大的 n 代表更依赖实际奖励(偏差更低),但方差更大。更小的 n 代表更依赖当前估计(偏差更高),但方差更低且传播更快。
在这里,on‑policy 与 off‑policy 的区分更为丰富。对于 n 步 SARSA,轨迹中的动作必须来自我们正在学习的策略。对于 off‑policy n 步方法,我们需要重要性采样来校正分布不匹配的问题。这是一个深奥的话题,但它表明 on‑policy 与 off‑policy 的选择不是一个简单的开关,而是在所有时间尺度上展开的。
8. 那么,何时使用哪种方法?
让我们切入实际。构建真实系统时,如何做出选择?
样本效率与经验回放
off‑policy 的强项是重用旧数据。因为它的更新不假设数据来自当前策略,我们可以把每一次转移存入回放缓冲区,并多次采样。正是因为如此,DQN 能够如此出色——它从数百万条过去经验中学习。像 PPO 这样的 on‑policy 方法在每次更新后都必须收集新数据,样本效率更低。
学习过程中的在线性能
如果我们要部署一个从第一天起就能表现良好的代理,通常会选择 on‑policy 方法。SARSA(或 PPO)在学习时更为谨慎和稳定。off‑policy 方法可能过度探索,导致真实世界中的代价。
安全与风险敏感性
这点尤为重要。SARSA 自然构建风险意识,因为它从自身不完美的执行中学习。如果我们知道代理偶尔会犯错,SARSA 会避免那些错误可能致命的状态。Q‑learning 假设未来执行完美,因此可能过度自信,导致危险。
致命三元组(为什么深度 RL 有时会失败)
当我们将函数逼近(如神经网络)+自举+off‑policy 学习组合在一起时,就会出现所谓的致命三元组。如果不仔细管理,这种组合可能导致发散或不稳定。
9. 快速参考:SARSA vs. Q‑Learning vs. Expected SARSA
| 属性 | SARSA | Q‑Learning | 取决于变体 | |------|-------|-----------|-----------| | 策略范式 | On‑policy | Off‑policy | 任意 | | 自举目标 | 采样下一个动作 | 最大下一个动作 | 期望下一个动作 | | 在线性能 | 更好 | 更差 | 更好 | | 渐近策略质量 | 次优(固定 ε) | 最优 | 最优 | | 更新方差 | 较高 | 中等 | 最低 | | 计算成本 | 低 | 低 | 中等 | | 经验重用 | 否 | 是 | 是(off‑policy 变体) | | 最大化偏差 | 否 | 是 | 否 | | 致命三元组风险 | 低 | 较高 | 取决于变体 |
10. 深度学习的联系
这一切并非仅仅是理论。每个现代深度 RL 算法都继承了这些表格方法的精髓:
- DQN:使用神经网络、回放缓冲区和目标网络的 Q‑learning,完全 off‑policy。
- Double DQN:在 Q‑learning 上加入 Double Q‑learning 修正。
- PPO:on‑policy、稳定、每次都使用新数据。
- SAC:off‑policy actor‑critic,带熵奖励,使用回放缓冲区提升样本效率。
- 经验回放:只有 off‑policy 学习才可能实现。
这些算法只是同一基本问题的不同答案。
11. 那么,你会选择哪种哲学?
没有统一的“正确”答案,取决于你正在构建的东西。
选择 on‑policy 的情况:
- 安全至关重要(学习过程中不想出现风险行为)。
- 需要从一开始就有良好表现。
- 能够在每次更新后收集新数据。
- 担心稳定性(致命三元组)。
选择 off‑policy 的情况:
- 样本效率至关重要(如机器人、昂贵的仿真)。
- 有回放缓冲区或预收集数据。
- 关注最终性能,能容忍学习过程中的波动。
- 在仿真环境中,步数成本低。
考虑 Expected SARSA 的情况:
- 想要更低方差的更新。
- 可能需要在 on‑policy 与 off‑policy 模式之间切换。
- 动作空间足够小,可以计算期望。
在实践中,许多现代系统会混合使用:off‑policy 评估器用于高效学习,on‑policy 行为者用于稳定改进。但在表格层面理解权衡,能让你有意识地做出选择。
Gridworld 示例并非训练轮胎——它们是基础。掌握后,你可以立即识别任何 RL 算法在 on‑/off‑policy 光谱上的位置,以及它为何如此工作。
参考文献
- Sutton, R. S., & Barto, A. G. (2018). *Reinforcement Learning: An Introduction* (2nd ed.). MIT Press. 可在 incompleteideas.net 获取。
_如果你读到这里,可能会喜欢系列中的下一篇,关于 n 步方法和资格迹,其中 on‑/off‑policy 区分更为丰富,且与现代算法的联系更为深入。_