news 2026/9/6 3:28:54

一行代码看穿灵魂:SARSA 与 Q-learning 的反直觉洞察与实战真相

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一行代码看穿灵魂:SARSA 与 Q-learning 的反直觉洞察与实战真相

一行代码看穿灵魂:SARSA 与 Q-learning 的反直觉洞察与实战真相

导读:大部分教科书在讲 SARSA 和 Q-learning 时,无非是抄两个贝尔曼更新公式,背诵一遍 “On-policy vs Off-policy”。但当你真正把策略矩阵打出来、看到上面匪夷所思的“死循环箭头”时,你才会发现所有教科书都漏掉了最精彩的东西。

本文拒绝复读机式理论,只聚焦两件事:最核心的代码差异,以及只有跑过实机、踩过坑才会有的深层认知


一、代码解剖:价值更新只有一行之差

在基于表格型(Tabular)的时序差分学习中,SARSA 和 Q-learning 的训练主干几乎 99% 一模一样,唯一的质变发生在计算目标价值(target)的那一行:

# 1. SARSA 的更新逻辑 (On-Policy)defget_update_sarsa(row,col,action,reward,next_row,next_col,next_action):# 用肉身下一步真正要走的动作 (next_action) 来评估价值target=0.9*Q[next_row,next_col,next_action]+reward value=Q[row,col,action]return(target-value)*0.1# 2. Q-learning 的更新逻辑 (Off-Policy)defget_update_qlearning(row,col,action,reward,next_row,next_col):# 完全不管下一步肉身要走啥,直接假定下一步会取到理论最大值 (.max())target=0.9*Q[next_row,next_col].max()+reward value=Q[row,col,action]return(target-value)*0.1

而在动作选择(行为策略)上,它们通常都使用带有ε\varepsilonε-greedy 的探索函数:

defget_action(row,col):# 10% 的概率会“手抖”随机乱走 (探索)ifrandom.random()<0.1:returnrandom.choice(range(4))# 90% 的概率选择当前已知的最大分数动作 (利用)returnQ[row,col].argmax()


计算最终update 值的时候,qlearning 忽略了 随机失误带来的损失。


但是在实际走动的时候,qlearning 还是会探索的。
也就是Qlearning 出现了 手脑不一致的情况,短期看不严谨。但是放在一个更大的视野里面,经过足够的淬炼,最终却探索出来了更好的道路。

二、两种做人哲学:稳健做题家 vs 上限孤勇者

把 SARSA 和 Q-learning 的行为拟人化,是理解这两种算法最直观、最深刻的方式:

维度SARSA(同策略 On-Policy)Q-learning(异策略 Off-Policy)
代码本质评估真实动作:Q(s′,a′)Q(s', a')Q(s,a)评估理论极限:max⁡a′Q(s′,a′)\max_{a'} Q(s', a')maxaQ(s,a)
对待“失误手抖”防天灾,更防自己手抖:把 10% 随机跳崖的惩罚结结实实算进路线价值里认天灾,无视自己手抖:坚信复盘时只要自己不失误,这条近道就是理论最优
人物画风谨小慎微的稳健做题家(缺乏野心,小富即安)好了伤疤忘了疼的孤勇者(千锤百炼,上限拉满)
路线抉择宁可翻山越岭多绕 30 步走天花板,绝不靠近悬崖半步紧贴着悬崖边缘一路向右,以最短直线距离直达终点
训练期表现非常稳健,累计收益高:摔死少,平平安安活到终点惨不忍睹,累计收益极低:执着于走悬崖近道,动不动就手抖摔死
测试期表现(ε=0)略显平庸:虽然稳,但浪费了大量冗余步数绝世高手,登峰造极:一旦肉身不再手抖,以最短极限步数直接通关

三、普遍规律还是个例?工业落地的终极权衡

这个现象不是 Cliff Walking 的个例,而是强化学习领域的普遍铁律

1. 为什么深度强化学习的开山祖师是 DQN,而不是 “Deep SARSA”?

在虚拟游戏(Atari、星际争霸、DOTA2)中,死一万次肉身也不需要花一分钱。算法研发者追求的就是通关最高分、最短耗时等理论极限。Q-learning 这种“哪怕训练期摔得鼻青脸肿,只要最后把理论上限拉满”的特质,天生契合模拟器。

2. 为什么现实工业界又把 SARSA 的思想请回来了?

如果你在做自动驾驶实体机械臂

  • Q-learning 就像一个压着悬崖白线超车的赛车手,它要求控制系统 100% 精确,在真实物理世界的一阵阵风或机械抖动下,瞬间就会车毁人亡;
  • SARSA 则像一个老司机:就算旁边能抄近道,它也会主动为自己留出半个车道的安全缓冲带(Safe RL)。

四、金句复盘

  1. Q-learning 算账时的“贪心”,贪在它把“未来的自己”想象得绝对完美;
  2. SARSA 算账时的“保守”,谨慎在它把“自己犯蠢时的惨剧”提前算做了成本;
  3. 一个算法是成佛还是翻车,不取决于它有多聪明,而取决于你允许它在现实中摔多少次跤。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 3:26:30

如何编写一个数据采集 Skill:稳定、合规、可持续地拿到数据

数据类 Skill 系列走到第六篇。前几篇从清洗写到分析再写到挖掘&#xff0c;但所有人都默认了一件事&#xff1a;数据已经在了。 现实中根本不是——数据采集才是这条流水线的源头&#xff0c;也是失败率最高、最需要工程化的一环。网站改版、接口限流、反爬升级、字段变更&…

作者头像 李华
网站建设 2026/9/6 3:24:55

Python 装饰器完全指南

一、核心概念 1. 什么是装饰器 装饰器&#xff08;Decorator&#xff09;本质上是一个高阶函数——它接收一个函数作为参数&#xff0c;并返回一个新的函数。它允许你在不修改原函数代码和调用方式的前提下&#xff0c;为函数动态添加额外功能。 2. 设计原则 装饰器遵循开放…

作者头像 李华
网站建设 2026/9/6 3:23:07

嵌入式Linux下Modbus RTU主站开发与RS485串口配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 3:21:52

Obsidian 2026 插件推荐:同步、AI 与版本控制一体化工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 3:21:48

车载CAN通信与UDS诊断协议开发:从底层硬件到上层应用全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华