一行代码看穿灵魂: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′) | 评估理论极限:maxa′Q(s′,a′)\max_{a'} Q(s', a')maxa′Q(s′,a′) |
| 对待“失误手抖” | 防天灾,更防自己手抖:把 10% 随机跳崖的惩罚结结实实算进路线价值里 | 认天灾,无视自己手抖:坚信复盘时只要自己不失误,这条近道就是理论最优 |
| 人物画风 | 谨小慎微的稳健做题家(缺乏野心,小富即安) | 好了伤疤忘了疼的孤勇者(千锤百炼,上限拉满) |
| 路线抉择 | 宁可翻山越岭多绕 30 步走天花板,绝不靠近悬崖半步 | 紧贴着悬崖边缘一路向右,以最短直线距离直达终点 |
| 训练期表现 | 非常稳健,累计收益高:摔死少,平平安安活到终点 | 惨不忍睹,累计收益极低:执着于走悬崖近道,动不动就手抖摔死 |
| 测试期表现(ε=0) | 略显平庸:虽然稳,但浪费了大量冗余步数 | 绝世高手,登峰造极:一旦肉身不再手抖,以最短极限步数直接通关 |
三、普遍规律还是个例?工业落地的终极权衡
这个现象不是 Cliff Walking 的个例,而是强化学习领域的普遍铁律:
1. 为什么深度强化学习的开山祖师是 DQN,而不是 “Deep SARSA”?
在虚拟游戏(Atari、星际争霸、DOTA2)中,死一万次肉身也不需要花一分钱。算法研发者追求的就是通关最高分、最短耗时等理论极限。Q-learning 这种“哪怕训练期摔得鼻青脸肿,只要最后把理论上限拉满”的特质,天生契合模拟器。
2. 为什么现实工业界又把 SARSA 的思想请回来了?
如果你在做自动驾驶或实体机械臂:
- Q-learning 就像一个压着悬崖白线超车的赛车手,它要求控制系统 100% 精确,在真实物理世界的一阵阵风或机械抖动下,瞬间就会车毁人亡;
- SARSA 则像一个老司机:就算旁边能抄近道,它也会主动为自己留出半个车道的安全缓冲带(Safe RL)。
四、金句复盘
- Q-learning 算账时的“贪心”,贪在它把“未来的自己”想象得绝对完美;
- SARSA 算账时的“保守”,谨慎在它把“自己犯蠢时的惨剧”提前算做了成本;
- 一个算法是成佛还是翻车,不取决于它有多聪明,而取决于你允许它在现实中摔多少次跤。