SARSA 与 Cliff Walking
使用实际下一动作 A′ 的 on-policy TD 控制。
学习目标
- 让价值更新包含实际探索行为的后果,理解 on-policy 控制。
- 独立复核“探索抽到低价值动作时的 SARSA 目标”的输入、计算和解释。
- SARSA 目标使用实际下一动作,不用 max。
为什么重要
让价值更新包含实际探索行为的后果,理解 on-policy 控制。
学习前需要掌握
背景与问题
悬崖边的最短路线在完全贪心执行时很快,但带随机探索的智能体可能踩空。SARSA 评价的后续行为包含探索,因此会考虑当前行为策略在危险区域的代价;这与只评价理想贪心未来的目标不同。
概念定义
SARSA 使用当前状态、动作、奖励、下一状态和下一动作五项更新动作价值。下一动作由当前行为策略采样,并且非终止时应成为真正执行的下一动作。因此标准 SARSA 是 on-policy 控制。
直观理解
不是问“接下来如果永远不犯探索错误会怎样”,而是问“照我当前会探索的行动方式继续会怎样”。这种区别只有在后续策略包含随机性时才特别明显。
核心原理
先在状态 s 执行动作 a,再在 s′ 按同一行为策略选 a′,用 Q(s′,a′) 构造目标。若更新时采样一个 a′,执行时却重新抽另一个动作,代码已经偏离标准五元组更新语义。
ε-greedy 中 ε 改变了未来动作分布,也就改变 SARSA 评价的策略。维持固定 ε 时学习的是带探索策略;满足其他条件并逐渐变得贪心的方案才可讨论相应的最优控制收敛结论。
SARSA 的下一动作采样增加目标方差。Expected SARSA 对这些动作求策略期望,Q-learning 则换成最大值;三者只差一个目标项,但评价对象和学习行为可能不同。
数学表达
SARSA 更新
目标包含实际下一动作。
变量含义
G_t从时刻 t 开始的折扣累计回报。R_{t+1}执行动作后收到的下一步奖励。γ折扣因子,通常位于 [0,1)。
计算步骤
- 1SARSA 使用实际抽到动作的 Q=−2,目标为 −1.8。
- 2更新为 1+0.5×(−1.8−1)=−0.4。
- 3若改用最大值,目标是 3.6,那是 Q-learning 式备份。
代码对应位置
示例 1SARSA:同一行为策略生成动作并参与目标:展示 S,A,R,S′,A′ 五元组与 on-policy 更新。
变量解释
| 变量 | 含义 |
|---|---|
G_t | 从时刻 t 开始的折扣累计回报。 |
R_{t+1} | 执行动作后收到的下一步奖励。 |
γ | 折扣因子,通常位于 [0,1)。 |
完整数值示例
探索抽到低价值动作时的 SARSA 目标
已知条件
- 当前 Q=1,奖励 0,后继动作 Q 为 4 和 −2。
- 行为策略本次抽到第二动作;折扣 0.9,学习率 0.5。
计算步骤
- SARSA 使用实际抽到动作的 Q=−2,目标为 −1.8。
- 更新为 1+0.5×(−1.8−1)=−0.4。
- 若改用最大值,目标是 3.6,那是 Q-learning 式备份。
计算结果
本次 SARSA 更新为 −0.400,反映实际探索选择的后果。
处理前后对比
- SARSA 目标使用实际下一动作,不用 max。
- 下方小链环境训练代码的最后终止状态 Q 行未用于选动作。
计算与实现步骤
- 选 A
- 执行得 R,S′
- 按同策略选 A′
- 用 Q(S′,A′) 更新
- 令 S,A=S′,A′
代码实现
示例 1
SARSA:同一行为策略生成动作并参与目标
example_01.py用途:展示 S,A,R,S′,A′ 五元组与 on-policy 更新。
import numpy as np
rng = np.random.default_rng(7)
Q = np.zeros((6, 2))
alpha, gamma, epsilon = 0.2, 0.95, 0.2
def choose(state):
return rng.integers(2) if rng.random() < epsilon else int(np.argmax(Q[state]))
def step(state, action):
next_state = np.clip(state + (-1 if action == 0 else 1), 0, 5)
return next_state, (1.0 if next_state == 5 else -0.01), next_state == 5
for episode in range(300):
state, action = 0, choose(0)
for _ in range(30):
next_state, reward, done = step(state, action)
next_action = choose(next_state)
bootstrap = 0.0 if done else Q[next_state, next_action]
Q[state, action] += alpha * (reward + gamma * bootstrap - Q[state, action])
state, action = next_state, next_action
if done:
break
print(np.argmax(Q, axis=1))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
展示 S,A,R,S′,A′ 五元组与 on-policy 更新。
alpha- 当前学习率,控制每次参数更新的步长。
Step 1 · 1–1 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as npStep 2 · 3–5 行
目标使用 Q(S′,A′),而非 max Q。
rng = np.random.default_rng(7)
Q = np.zeros((6, 2))
alpha, gamma, epsilon = 0.2, 0.95, 0.2Step 3 · 7–8 行
探索动作的风险会进入价值估计,因此 Cliff Walking 中往往更保守。
def choose(state):
return rng.integers(2) if rng.random() < epsilon else int(np.argmax(Q[state]))Step 4 · 10–12 行
执行当前代码段,并把得到的状态传给下一步。
def step(state, action):
next_state = np.clip(state + (-1 if action == 0 else 1), 0, 5)
return next_state, (1.0 if next_state == 5 else -0.01), next_state == 5Step 5 · 14–23 行
按学习率和梯度更新参数。步长过小会缓慢,过大会越过最低点并震荡或发散。
for episode in range(300):
state, action = 0, choose(0)
for _ in range(30):
next_state, reward, done = step(state, action)
next_action = choose(next_state)
bootstrap = 0.0 if done else Q[next_state, next_action]
Q[state, action] += alpha * (reward + gamma * bootstrap - Q[state, action])
state, action = next_state, next_action
if done:
breakStep 6 · 25–25 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
print(np.argmax(Q, axis=1))预期输出或运行结果
[1 1 1 1 1 0]
常见错误 · 3 条
- 目标里用最大 Q,却仍称为 SARSA。
- 更新使用的下一动作与随后实际执行动作不一致。
- 把悬崖示例的保守行为推广为任何环境都更安全。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 目标里用最大 Q,却仍称为 SARSA。
- 更新使用的下一动作与随后实际执行动作不一致。
- 把悬崖示例的保守行为推广为任何环境都更安全。
扩展内容说明
本页数值均为解释机制的构造案例,不能解读为真实训练或基准性能。定义和适用条件参见 Sutton 与 Barto《Reinforcement Learning: An Introduction》(第 6 章)。
算法属性与数据边界
失败模式、风险与性能
失败模式
- 目标里用最大 Q,却仍称为 SARSA。
- 更新使用的下一动作与随后实际执行动作不一致。
- 把悬崖示例的保守行为推广为任何环境都更安全。
风险
- 奖励函数与真实目标不一致会诱发奖励黑客。
- 部署策略的行动权限必须由环境和应用层约束。
性能考虑
- 样本效率、墙钟时间和显存占用需要分别报告。
- 应使用多个随机种子、置信区间和固定评测策略。
常见问题
SARSA 总是比 Q-learning 安全吗?
不是。它考虑当前行为策略的探索后果,但没有硬安全保证;是否避开风险还取决于奖励、探索方式、状态表示和训练证据。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。