强化学习之Sarsa (时间差分学习)
上篇文章讲到Q-learning, Sarsa与Q-learning的在决策上是完全相同的,不同之处在于学习的方式上
这次我们用openai gym的Taxi来做演示
Taxi是一个出租车的游戏,把顾客送到目的地+20分,每走一步-1分,如果在路上把乘客赶下车的话扣10分
简要
Sarsa是一种在线学习算法,也就是on-polic,Sarsa在每次更新算法时都是基于确定的action,而Q-learning还没有确定
Sarsa相对比较保守,他的每一步行动都是基于下一个Q(s',a')来完成的
我们来看Sarsa的算法部分

是不是看起来很眼熟,没错和Q-learning的区别很小
Q-learning每次都时action'都选择最大化,而Sarsa每次更新都会选择下一个action,在我们对代码中对应的代码也就是
obervation_, reward, done, info=env.step(action)
action_=choise(obervation_)
游戏开始
首先我们初始化游戏环境
import gym
import numpy as np env=gym.make('Taxi-v2')
env.seed(1995) MAX_STEP=env.spec.timestep_limit
ALPHA=0.01
EPS=1
GAMMA=0.8
TRACE_DACAY=0.9
q_table=np.zeros([env.observation_space.n,env.action_space.n],dtype=np.float32)
eligibility_trace=np.zeros([env.observation_space.n,env.action_space.n],dtype=np.float32)
对没错,Sarsa还是需要Q表来保存经验的,细心的小伙伴们一定发现我们多了一个eligibility_trace的变量,这个是做什么用的呢,这个是用来保存每个回合的每一步的,在新的回合开始后就会清零
Sarsa的决策上还是和Q-learning相同的
def choise(obervation):
if np.random.uniform()<EPS:
action=env.action_space.sample()
else:
action=np.argmax(q_table[obervation])
return action
下面是我们的核心部分,就是学习啦^_^
#这里是Q-learning的学习更新部分
def learn(state,action,reward,obervation_):
q_table[state][action]+=ALPHA*(reward+GAMMA*(max(q_table[obervation_])-q_table[state,action]))
#这里是Sarsa的学习更新部分
def learn(state,action,reward,obervation_,action_):
global q_table,eligibility_trace
error=reward + GAMMA * q_table[obervation_,action_] - q_table[state, action]
eligibility_trace[state]*=0
eligibility_trace[state][action]=1 q_table+=ALPHA*error*eligibility_trace
eligibility_trace*=GAMMA*TRACE_DACAY
哒当,我用红线标示出来了,聪明的你一定发现了不同对吧
青色标示出来的代表的意思是没经历一轮,我们让他+1证明这是获得reward中不可获取的一步
最后一行
eligibility_trace*=GAMMA*TRACE_DACAY
随着时间来衰减eligibility_trace的值,离获取reward越远的步,他的必要性也就越小
GAME OVER
让我们大干一场吧
下面是所有的代码,小伙伴们快来运行把
import gym
import numpy as np env=gym.make('Taxi-v2')
env.seed(1995) MAX_STEP=env.spec.timestep_limit
ALPHA=0.01
EPS=1
GAMMA=0.8
TRACE_DACAY=0.9
q_table=np.zeros([env.observation_space.n,env.action_space.n],dtype=np.float32)
eligibility_trace=np.zeros([env.observation_space.n,env.action_space.n],dtype=np.float32) def choise(obervation):
if np.random.uniform()<EPS:
action=env.action_space.sample()
else:
action=np.argmax(q_table[obervation])
return action def learn(state,action,reward,obervation_,action_):
global q_table,eligibility_trace
error=reward + GAMMA * q_table[obervation_,action_] - q_table[state, action]
eligibility_trace[state]*=0
eligibility_trace[state][action]=1 q_table+=ALPHA*error*eligibility_trace
eligibility_trace*=GAMMA*TRACE_DACAY SCORE=0
for exp in xrange(50000):
obervation=env.reset()
EPS-= 0.001 action=choise(obervation)
eligibility_trace*=0 for i in xrange(MAX_STEP):
# env.render()
obervation_, reward, done, info=env.step(action)
action_=choise(obervation_) learn(obervation,action,reward,obervation_,action_) obervation=obervation_
action=action_ SCORE+=reward
if done:
break if exp % 1000 == 0:
print 'esp,score (%d,%d)' % (exp, SCORE)
SCORE = 0 print 'fenshu is %d'%SCORE
欢迎大家一起来学习^_^
最后附上一幅结果图

效率明显提高了^_^
强化学习之Sarsa (时间差分学习)的更多相关文章
- 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)
接下来我们回顾一下动态规划算法(DP)和蒙特卡罗方法(MC)的特点,对于动态规划算法有如下特性: 需要环境模型,即状态转移概率\(P_{sa}\) 状态值函数的估计是自举的(bootstrapping ...
- 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...
- 【Todo】【转载】深度学习&神经网络 科普及八卦 学习笔记 & GPU & SIMD
上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...
- 蓝牙芯片NRF51822入门学习1:时间管理
前言 之前辞职找工作的时候发现,很多公司希望招聘蓝牙技术方面的人才,所以干脆丢开LWIP静下心来学习蓝牙技术.原本以为一两星期能基本学会的,谁知道所选的蓝牙芯片nrf51822是个坑货,坑了我一个月. ...
- "做中学"之“极客时间”课程学习指导
目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时 ...
- JDK1.8日期时间库学习
这周在阅读<阿里巴巴Java开发手册>时,在并发处理一节的日期处理中,其强调SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果 定义为 stati ...
- Python - 记录我开始学习Python的时间节点
记录我开始学习Python的时间节点 2019-09-22 从明天开始我要开始学习Python了,坚持学习.坚持写博客,慢慢积累. 结合实例项目,最好能把目前在做的项目用Python实现. 加油!
- SIGAI深度学习第四集 深度学习简介
讲授机器学习面临的挑战.人工特征的局限性.为什么选择神经网络.深度学习的诞生和发展.典型的网络结构.深度学习在机器视觉.语音识别.自然语言处理.推荐系统中的应用 大纲: 机器学习面临的挑战 特征工程的 ...
- ElasticSearch 5学习(7)——分布式集群学习分享2
前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...
随机推荐
- spring boot系列03--spring security (基于数据库)登录和权限控制(上)
这篇打算写一下登陆权限验证相关 说起来也都是泪,之前涉及权限的比较少所以这次准备起来就比较困难. 踩了好几个大坑,还好最终都一一消化掉(这是废话你没解决你写个什么劲
- BST性能分析&改进思路——平衡与等价
极端退化 前面所提到的二叉搜索树,已经为我们对数据集进行高效的静态和动态操作打开了一扇新的大门.正如我们所看到的,BST从策略上可以看作是将之前的向量(动态数组)和链表结构的优势结合起来,不过多少令我 ...
- java.lang.IllegalStateException: attempt to re-open an already-closed object
attempt to re-open an already-closed object 字面理解,试图再次打开已经关闭的对象.这是我在操作sqlited的时候出现的错误, 我在一个activity里面 ...
- Eclipse的Servers视图中无法加入Tomcat6/Tomcat7
引言: 在基于Eclipse的开发过程中,出现了无法在Eclipse中加入Tomcat的问题,经过从网上搜索之后.找到了答案. 问题的提出: 无法从下面方式,加入Tomcatserver. 当中Se ...
- MobileNets总结
Google在2017年上半年发表了一篇关于可以运行在手机等移动设备上的神经网络结构--MobileNets.MobileNets是基于深度可分离卷积(depthwise separable conv ...
- Mac OS 终端利器 iTerm2
之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...
- GitLab配置ssh key
一.背景 当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选择ssh协议来拉取代码.但是网上很 ...
- 手动安装cloudera manager 5.x(tar包方式)详解
官方共给出了3中安装方式:第一种方法必须要求所有机器都能连网,由于最近各种国外的网站被墙的厉害,我尝试了几次各种超时错误,巨耽误时间不说,一旦失败,重装非常痛苦.第二种方法下载很多包.第三种方法对系统 ...
- Foreign websites
[社交] 1.Twitter. It's what's happening. 2.Telegram Messenger 3.Facebook - Log In or Sign Up 4.Instagr ...
- 关于vue 框架与后台框架的混合使用的尝试------转载
这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...