当前位置: 首页 > news >正文

通俗易懂讲透 SARSA:强化学习 On-Policy 经典算法

通俗易懂讲透 SARSA:强化学习 On-Policy 经典算法

SARSA 是基于策略(On-Policy)的时序差分强化学习算法,核心是边执行策略、边学习策略,学得稳、风险低,非常适合动态与安全敏感场景。


一、SARSA 到底是什么?

一句话定位:
SARSA = 跟着自己当前的步子学习,一步一步稳着来的强化学习算法。

名字来源(很好记):

  • S:当前状态sₜ
  • A:当前动作aₜ
  • R:奖励rₜ
  • S:下一状态sₜ₊₁
  • A:下一动作aₜ₊₁

这 5 个量串起来,就是 SARSA 一次更新的全部依据。


二、核心公式(掰开揉碎讲)

更新公式

Q(sₜ,aₜ) ← Q(sₜ,aₜ) + α [ rₜ + γ·Q(sₜ₊₁,aₜ₊₁) − Q(sₜ,aₜ) ]

每个符号是什么意思

  • Q(s,a):在状态 s 做动作 a 的长期收益打分
  • α:学习率(0~1),控制每次改多少
  • rₜ:执行动作后立刻拿到的奖励
  • γ:折扣因子(0~1),越接近 1 越看重未来
  • sₜ,aₜ:现在的状态和动作
  • sₜ₊₁,aₜ₊₁:下一步的状态和真实会执行的动作

一句话理解更新逻辑

用“下一步真实要走的路”来修正“这一步的判断”,不跳步、不空想最优。


三、SARSA 运行流程(超清晰)

  1. 初始化 Q 表
    所有状态-动作对的 Q 值初始化为 0。
  2. 每一轮训练(Episode)
    1. 回到起点,得到初始状态s
    2. 用 ε-贪心选第一个动作 a
    3. 执行动作 → 得到奖励 r、新状态 s’
    4. 在 s’ 再用 ε-贪心选下一个动作 a’
    5. 用 SARSA 公式更新 Q
    6. 把 s→s’、a→a’,继续走
  3. 结束一轮
    到达终点/撞墙就重置,重复训练直到收敛。

四、SARSA vs Q-Learning(最关键区别)

对比项SARSAQ-Learning
策略类型On-Policy(同策略)Off-Policy(异策略)
学习依据自己实际会走的下一步动作直接用最优 Q 值(空想最优)
性格稳妥派、保守、安全激进派、追求全局最优
稳定性高,适合动态环境容易震荡
风险低,避开危险动作可能铤而走险

通俗比喻

  • SARSA:自己开车,边开边学,不冒险,稳稳到达。
  • Q-Learning:看着攻略开车,总想抄近道,偶尔会翻车。

五、探索与利用:ε-贪心策略

SARSA 和 Q-Learning 都用,但目的不一样:

  • 以概率ε随机走(探索)
  • 以概率1−ε选 Q 最大的动作(利用)

训练技巧

  • 刚开始 ε 大(多探索)
  • 后期 ε 慢慢减小(多利用)

六、实战代码:5×5 网格世界(可直接跑)

importnumpyasnpimportmatplotlib.pyplotaspltimporttorchimportrandom# 网格世界参数GRID_SIZE=5ACTIONS=['上','下','左','右']ACTION_MAP={0:(-1,0),1:(1,0),2:(0,-1),3:(0,1)}# 环境类classGridWorld:def__init__(self):self.start=(0,0)self.goal=(4,4)self.obstacles=[(2,2),(3,3)]self.state=self.startdefreset(self):self.state=self.startreturnself.statedefstep(self,action):r,c=self.state dr,dc=ACTION_MAP[action]nr,nc=r+dr,c+dc# 越界/撞墙 不移动ifnr<0ornr>=GRID_SIZEornc<0ornc>=GRID_SIZEor(nr,nc)inself.obstacles:nr,nc=r,c self.state=(nr,nc)reward=1ifself.state==self.goalelse-0.1done=self.state==self.goalreturnself.state,reward,done# SARSA 智能体classSARSA_Agent:def__init__(self,lr=0.1,gamma=0.9,epsilon=0.1):self.lr=lr self.gamma=gamma self.epsilon=epsilon self.q_table=torch.zeros(GRID_SIZE,GRID_SIZE,4)defchoose_action(self,state):ifrandom.random()<self.epsilon:returnrandom.randint(0,3)returntorch.argmax(self.q_table[state[0],state[1]]).item()defupdate(self,s,a,r,s_next,a_next):q_old=self.q_table[s[0],s[1],a]q_target=r+self.gamma*self.q_table[s_next[0],s_next[1],a_next]self.q_table[s[0],s[1],a]+=self.lr*(q_target-q_old)# 训练函数deftrain(episodes=1000):env=GridWorld()agent=SARSA_Agent()reward_list=[]q_mean_list=[]forepiinrange(episodes):s=env.reset()a=agent.choose_action(s)total_r=0qs=[]whileTrue:s_next,r,done=env.step(a)a_next=agent.choose_action(s_next)agent.update(s,a,r,s_next,a_next)total_r+=r qs.append(agent.q_table[s[0],s[1]].mean().item())ifdone:breaks,a=s_next,a_next reward_list.append(total_r)q_mean_list.append(np.mean(qs))returnagent,reward_list,q_mean_list# 开始训练agent,rewards,q_means=train(1000)# 画图:奖励曲线 + 平均Q值 + 策略图 + Q热力图plt.rcParams['font.sans-serif']=['SimHei']fig,axs=plt.subplots(2,2,figsize=(12,10))fig.suptitle('SARSA 训练结果可视化',fontsize=16)axs[0,0].plot(rewards,color='r')axs[0,0].set_title('累计奖励')axs[0,0].grid(True)axs[0,1].plot(q_means,color='b')axs[0,1].set_title('平均Q值')axs[0,1].grid(True)# 策略图policy=np.zeros((GRID_SIZE,GRID_SIZE),dtype=int)foriinrange(GRID_SIZE):forjinrange(GRID_SIZE):if(i,j)in[(4,4),(2,2),(3,3)]:continuepolicy[i,j]=torch.argmax(agent.q_table[i,j]).item()axs[1,0].imshow(policy,cmap='coolwarm')foriinrange(GRID_SIZE):forjinrange(GRID_SIZE):if(i,j)notin[(4,4),(2,2),(3,3)]:axs[1,0].text(j,i,ACTIONS[policy[i,j]],ha='center',va='center')axs[1,0].set_title('最优策略')# Q值热力图heat=np.zeros((GRID_SIZE,GRID_SIZE))foriinrange(GRID_SIZE):forjinrange(GRID_SIZE):heat[i,j]=agent.q_table[i,j].max().item()im=axs[1,1].imshow(heat,cmap='jet')fig.colorbar(im,ax=axs[1,1])axs[1,1].set_title('Q值热力图')plt.tight_layout()plt.show()

代码说明

  • GridWorld:5×5 迷宫,有起点、终点、障碍物
  • SARSA_Agent:实现选动作、Q 更新
  • 输出 4 张图:奖励曲线、Q 值趋势、策略图、Q 热力图

七、SARSA 优点与缺点

优点

  1. 稳定安全:On-Policy 学习,不冒进
  2. 动态环境友好:环境变了也能稳健适应
  3. 风险低:不会像 Q-Learning 强行走最优而踩坑
  4. 实现简单:逻辑清晰,易调试

缺点

  1. 收敛偏慢:稳是稳,但学起来慢
  2. 易陷局部最优:太保守,不敢大胆探索
  3. 依赖 ε:调不好就学习失效
  4. 大状态空间不行:Q 表会爆炸(要用深度 SARSA)

八、适用场景(读研/做项目必看)

SARSA 特别适合:

  • 机器人路径规划、避障
  • 自动驾驶决策
  • 股票/交易策略(风险敏感)
  • 动态网络负载均衡
  • 游戏 AI(需要稳定策略)

不适合:追求极致最优、环境静止、不怕风险的场景(优先 Q-Learning)。


九、总结(3 句背会)

  1. SARSA 是 On-Policy,用真实下一步动作更新
  2. 更新必须凑齐 S-A-R-S-A
  3. 稳、安全、慢,适合动态与风险场景
http://www.jsqmd.com/news/671930/

相关文章:

  • OpenPLC Editor技术解析:开源工业自动化的模块化架构与标准化实践
  • Linux运维必备:手把手教你用OMSA命令行监控Dell PowerEdge服务器硬件状态
  • 如何快速构建繁体中文手写识别系统:5步完整指南
  • Windows 10安卓子系统完整教程:无需升级Win11的终极解决方案
  • 告别RNN!用PyTorch复现轻量级车牌识别LPRNet(附完整训练与避坑指南)
  • 别只盯着S参数!用HFSS快速扫频+场后处理,5分钟查看任意频点的电磁场分布
  • TS3380,TS332,TS3480,G3810,TS3300,ts3440,TS3370,TS8380打印机废墨垫清零软件,错误代码5B00,P07,E08,1700,5b04,亲测有效。
  • PMP题库_10_相关方管理
  • Windows Cleaner终极指南:三步告别C盘爆红的免费系统清理神器
  • 告别C++!我用Rust和Qt 5.14.2重构了一个小工具,聊聊混合编程的真实体验
  • FanControl传感器问题终极指南:如何快速解决风扇控制异常并优化系统散热 [特殊字符]
  • 第4篇:继承基础——单继承、super()与方法重写
  • 开发必看!5款主流Python依赖安全扫描工具深度对比,选型不再难
  • OpCore-Simplify终极指南:三步快速配置黑苹果EFI,零基础也能轻松上手
  • 告别单打独斗:用Nash Q-Learning算法搞定多智能体博弈(附Python代码示例)
  • 手把手教你用STM32F103C8T6和ESP8266搭建智能温室监控(附源码和原子云配置)
  • 3个维度重构数字阅读:从信息消费到知识创造的思维跃迁
  • 如何用浏览器实现专业级音高检测:PitchDetect技术深度解析
  • 保姆级教程:用NovAtel Inertial Explorer 8.7搞定GNSS/INS紧组合后处理(附避坑指南)
  • Word翻译整篇文档的5个高效方法,总有一个适合你
  • 别再只标定外参了!深入理解Kalibr联合标定报告:从IMU噪声参数到时间戳对齐
  • 云原生应用
  • 从入门到精通:AI背景抠除与视频透明化处理完全指南
  • 用cyclictest给你的树莓派实时性“体检”:从安装到结果分析的完整指南
  • 前端构建工具进化史
  • 别再被‘cp: omitting directory’卡住了!Linux新手必知的5个cp命令实用技巧(含-r参数详解)
  • 别只埋头写论文!从审稿人视角看,什么样的博士论文盲审最容易过?
  • OMC - 01 用 19 个 Agent 打造你的 Claude Code“工程团队”:oh-my-claudecode 深度解析与实战指南
  • 2026届必备的六大AI论文工具推荐
  • 避坑指南:在Ubuntu/CentOS上复现《驾驭Makefile》教程,如何解决‘deps’目录导致的无限循环编译?