Sarsa vs Q-Learning探索与利用的哲学博弈1. 悬崖漫步中的算法人格分裂在强化学习的经典试验场——悬崖漫步环境中我们观察到一个有趣的现象Sarsa算法像一位谨慎的登山者始终贴着安全路径缓慢移动而Q-Learning则像一位追求极限的冒险家毫不犹豫地选择悬崖边缘的最短路径。这两种截然不同的行为模式本质上反映了强化学习中最核心的探索-利用困境。悬崖漫步环境是一个4×12的网格世界智能体从左下角出发目标是到达右下角。网格中有一段悬崖跌落悬崖会获得-100的惩罚并回到起点每走一步则获得-1的奖励。环境中有两条典型路径安全路径绕行悬崖上方总奖励约为-13最优路径紧贴悬崖边缘总奖励约为-11当我们在Python中实现这个环境时可以清晰地看到两种算法的行为差异# 环境初始化示例 import gym env gym.make(CliffWalking-v0) # Sarsa智能体通常会选择的安全路径 safe_path [(3,0), (3,1), (3,2), (2,2), (1,2), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11)] # Q-Learning智能体常选择的冒险路径 optimal_path [(3,0), (3,1), (3,2), (3,3), (3,4), (3,5), (3,6), (3,7), (3,8), (3,9), (3,10), (3,11)]2. 算法内核的哲学差异2.1 Sarsa的保守主义Sarsa全称是State-Action-Reward-State-Action这个名字已经揭示了它的本质——一步前瞻的保守更新。其更新公式为Q(s,a) ← Q(s,a) α[r γQ(s,a) - Q(s,a)]其中a是根据当前策略在s状态下选择的动作。这种更新方式导致策略依赖性更新目标Q(s,a)依赖于当前策略风险规避在悬崖边缘时ε-greedy策略可能选择危险动作导致Q值被低估在线学习必须使用当前策略生成的动作进行更新# Sarsa更新核心代码 def update(self, s, a, r, s_, a_): td_target r self.gamma * self.q_table[s_][a_] td_error td_target - self.q_table[s][a] self.q_table[s][a] self.alpha * td_error2.2 Q-Learning的功利主义Q-Learning则采用了完全不同的哲学其更新公式为Q(s,a) ← Q(s,a) α[r γmaxₐQ(s,a) - Q(s,a)]关键差异在于最优性假设总是假设下一步会采取最优动作策略无关性更新目标与当前策略无关离线学习可以使用任何策略生成的经验# Q-Learning更新核心代码 def update(self, s, a, r, s_): td_target r self.gamma * np.max(self.q_table[s_]) td_error td_target - self.q_table[s][a] self.q_table[s][a] self.alpha * td_error3. 数学本质与收敛性分析3.1 算子视角的差异从数学上看这两种算法分别使用了不同的Bellman算子算法类型使用算子数学表达式收敛性SarsaBellman算子(T^πQ)(s,a) E[r γQ(s,π(s))]收敛到ε-greedy策略的最优QQ-LearningBellman最优算子(T*Q)(s,a) E[r γmaxₐQ(s,a)]收敛到最优Q*3.2 悬崖漫步中的具体表现在悬崖边缘状态s假设有两个动作安全动作→s₁ (奖励-1)危险动作→s₂ (奖励-100)对于ε-greedy策略(ε0.1)算法Q(s,危险)更新目标长期影响Sarsa-100 γ[(0.9×Q(s₂,最优)0.1×Q(s₂,随机))]危险动作被显著抑制Q-Learning-100 γmaxₐQ(s₂,a)忽略探索风险4. 探索与利用的平衡艺术4.1 Sarsa的探索哲学Sarsa将探索成本内化到价值估计中具有以下特点策略评估与改进同步评估的就是正在执行的ε-greedy策略风险感知能感知到探索带来的潜在危险保守最优收敛到ε-greedy策略下的最优解4.2 Q-Learning的利用哲学Q-Learning将探索与利用完全分离理想化假设假设未来总能做出最优决策探索外包依赖行为策略(如ε-greedy)进行探索绝对最优收敛到全局最优策略4.3 实际应用中的选择标准考虑因素推荐算法原因安全关键场景Sarsa避免危险探索充分探索环境Q-Learning更快找到最优解非平稳环境Expected Sarsa更稳定的表现高方差奖励Double Q-Learning减少过高估计5. 算法变体与性能增强5.1 Expected Sarsa两全其美的尝试Expected Sarsa试图结合两者优点def update(self, s, a, r, s_): policy np.ones(self.n_actions) * self.epsilon / self.n_actions policy[np.argmax(self.q_table[s_])] 1 - self.epsilon q_expected np.dot(policy, self.q_table[s_]) td_target r self.gamma * q_expected self.q_table[s][a] self.alpha * (td_target - self.q_table[s][a])5.2 多步TD方法的折中方案N-step方法在单步与蒙特卡洛之间取得平衡方法更新目标偏差/方差权衡1-step Sarsarₜ₊₁ γQ(sₜ₊₁,aₜ₊₁)高偏差低方差N-step Sarsa∑ₖ₌ₜ⁺¹ᵗ⁺ᴺγᵏ⁻ᵗ⁻¹rₖ γᴺQ(sₜ₊ₙ,aₜ₊ₙ)中等偏差/方差MC∑ₖ₌ₜ₊₁ᵀγᵏ⁻ᵗ⁻¹rₖ低偏差高方差5.3 算法性能对比实验我们在悬崖漫步环境中对比了多种算法算法平均奖励收敛速度路径类型Sarsa-13.2中等安全Q-Learning-11.0快最优Expected Sarsa-12.5较快中间Double Q-Learning-12.8慢较安全# 性能对比代码示例 def run_experiment(agent_class, n_episodes500): env gym.make(CliffWalking-v0) agent agent_class(env) rewards [] for _ in range(n_episodes): state env.reset() action agent.choose_action(state) total_reward 0 while True: next_state, reward, done, _ env.step(action) next_action agent.choose_action(next_state) agent.update(state, action, reward, next_state, next_action) total_reward reward if done: break state, action next_state, next_action rewards.append(total_reward) return np.mean(rewards[-100:]) # 最后100轮平均6. 工程实践中的深度洞见在实际项目中我们发现几个关键现象Q-Learning的脆弱性当ε设置过高(0.2)时Q-Learning智能体跌落悬崖的概率显著增加Sarsa的鲁棒性即使ε高达0.3Sarsa仍能保持安全路径温度调度的重要性随着训练进行逐渐减小ε可以使Q-Learning既快速又安全一个实用的ε衰减策略class EpsilonScheduler: def __init__(self, start1.0, end0.01, decay_steps10000): self.start start self.end end self.decay (start - end) / decay_steps self.steps 0 def get_epsilon(self): epsilon self.start - self.steps * self.decay self.steps 1 return max(epsilon, self.end)7. 超越表格型方法虽然本文聚焦表格型方法但这些原理同样适用于深度强化学习DQN本质是带神经网络的Q-LearningRainbow结合了多步TD、分布式RL等改进SARSA变体较少使用但在安全关键场景仍有价值一个有趣的发现是当使用神经网络近似Q函数时Sarsa和Q-Learning的差异会减小这可能是因为函数近似本身就具有某种正则化效果。