强化学习6-MC与TD的比较-实战
# encoding:utf-8
import numpy as np
import matplotlib.pylab as plt '''
随机行走问题
0 - 1 - 2 - 3 - 4 - 5 - 6
e s e
0终点r为0. 6终点r为1
中间每个选择r为0 策略 [-1, 1] 每种选择0.5, -1向左,1向右
这个策略下,理论上数字越大回报越高
''' stats = range(7)
start = 3
end = [0, 6]
actions = [-1, 1] r = 1 # 衰减因子
alpha = 0.5 # 学习率
echos = [5, 10, 50, 100, 500, 1000, 10000] def choose_act(stat):
# 策略
if np.random.rand() > 0.5:
return 1
else:
return -1 v = np.zeros([len(stats)]) for i in echos:
for j in range(i):
act = choose_act(start)
stat_ = start + act if stat_ in end:
if stat_ == 6:
v[start] += alpha * (1 + v[stat_] - v[start])
else:
v[start] += alpha * (v[stat_] - v[start])
start = np.random.randint(1,6)
else:
v[start] += alpha * (v[stat_] - v[start])
start = np.random.randint(1,6) plt.plot(v[1:-1])
plt.text(stats[-4], v[-3], j+1) plt.xlabel('state')
plt.ylabel('v')
plt.text(1, 0.8, 'alpha = %s'%alpha)
plt.show()




可以看到 随着学习率的增大,效果越来越好,当学习率为0.5时,已经明显过拟合了
这个是单步的,书上是单回合的,所以不同,后续有空会更新代码
# encoding:utf-8
from __future__ import division
import numpy as np
import matplotlib.pylab as plt stats = range(7)
end = [0, 6]
actions = [-1, 1]
r = 1 # 衰减因子 def choose_act(stat):
# 策略
if np.random.rand() > 0.5:
return 1
else:
return -1 v_t = [0, 1/6, 1/3, 1/2, 2/3, 5/6, 0]
alpha_td = [0.1, 0.15, 0.2] # 学习率
alpha_mc = [0.01, 0.02, 0.04]
for c in range(3):
# TD
alpha = alpha_td[c]
# v = np.random.rand(len(stats))
# v = np.zeros(len(stats))
v = [0.2] * len(stats)
errors = []
start = 3 for j in range(100):
act = choose_act(start)
stat_ = start + act if stat_ in end:
if stat_ == 6:
v[start] += alpha * (1 + v[stat_] - v[start])
else:
v[start] += alpha * (v[stat_] - v[start])
start = np.random.randint(1,6)
else:
v[start] += alpha * (v[stat_] - v[start])
start = stat_ # np.random.randint(1,6) error = np.sqrt(sum([pow(value - v_t[index], 2) for index, value in enumerate(v)]))
errors.append(error) plt.plot(range(100), errors)
index = np.random.randint(40,100)
plt.text(index-3, errors[index], 'alpha_td = %s'%alpha) # MC
alpha = alpha_mc[c]
# v_mc = np.random.rand(len(stats))
# v_mc = np.zeros(len(stats))
v_mc = [0.2] * len(stats)
count_mc = np.zeros(len(stats))
errors = []
for j in range(100):
process = []
start = 3 # np.random.randint(1, 6)
while True:
if start in end:
process.append([start])
break
act = choose_act(start)
if start == 5 and act == 1:
r = 1
else:
r = 0
process.append([start, act, r])
start = start + act T = len(process[:-1])
s_all = [i[0] for i in process[:-1]]
s_dealed = []
for k in range(T):
sar = process[k]
s = sar[0]
if s in s_dealed:continue # first visit
t = s_all.index(s) # 该s 首次出现的位置
num = s_all.count(s) # 该s 总共出现的次数
r_all = sum([i[2] for i in process[t:-1]]) / num
v_mc[s] += alpha * (r_all - v_mc[s])
# v_mc[s] = (v_mc[s] * count_mc[s] + r_all) / (count_mc[s] + 1)
# count_mc[s] += 1 s_dealed.append(s)
error = np.sqrt(sum([pow(value - v_t[index], 2) for index, value in enumerate(v_mc)]))
errors.append(error)
plt.plot(range(100), errors, '.')
index = np.random.randint(40,100)
plt.text(index-3, errors[index], 'alpha_mc = %s'%alpha) plt.xlabel('echo')
plt.ylabel('mse')
plt.show()

随机行走有个特殊性:两个终点,有一个终点奖励为0,也就是说在前几个回合中,单步更新的TD如果一开始向左走,需要好多步才能到达右边终点,而MC由于是整个回合,要么左,要么右,先到右边终点的概率要大得多,所以,前几步MC收敛明显比TD快
但是从总体来看,TD收敛比MC要快,而且收敛值要小,故TD效率更高
上述代码的问题
1.TD 是单步计算MSE,而MC是单回合计算MSE,比较的前提不同
2.在计算MSE时,只是计算了一次评估的误差,并不是平均误差
更新代码
强化学习6-MC与TD的比较-实战的更多相关文章
- 强化学习4-时序差分TD
之前讲到强化学习在不基于模型时可以用蒙特卡罗方法求解,但是蒙特卡罗方法需要在每次采样时生产完整序列,而在现实中,我们很可能无法生成完整序列,那么又该如何解决这类强化学习问题呢? 由贝尔曼方程 vπ(s ...
- 【强化学习RL】model-free的prediction和control —— MC,TD(λ),SARSA,Q-learning等
本系列强化学习内容来源自对David Silver课程的学习 课程链接http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html 本文介绍了在m ...
- 强化学习(五)用时序差分法(TD)求解
在强化学习(四)用蒙特卡罗法(MC)求解中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它需要所有的采样序列都是经历完整的状态序列.如果我 ...
- 【转载】 强化学习(五)用时序差分法(TD)求解
原文地址: https://www.cnblogs.com/pinard/p/9529828.html ------------------------------------------------ ...
- 强化学习 3—— 使用蒙特卡洛采样法(MC)解决无模型预测与控制问题
一.问题引入 回顾上篇强化学习 2 -- 用动态规划求解 MDP我们使用策略迭代和价值迭代来求解MDP问题 1.策略迭代过程: 1.评估价值 (Evaluate) \[v_{i}(s) = \sum_ ...
- 强化学习(四)用蒙特卡罗法(MC)求解
在强化学习(三)用动态规划(DP)求解中,我们讨论了用动态规划来求解强化学习预测问题和控制问题的方法.但是由于动态规划法需要在每一次回溯更新某一个状态的价值时,回溯到该状态的所有可能的后续状态.导致对 ...
- 强化学习-时序差分算法(TD)和SARAS法
1. 前言 我们前面介绍了第一个Model Free的模型蒙特卡洛算法.蒙特卡罗法在估计价值时使用了完整序列的长期回报.而且蒙特卡洛法有较大的方差,模型不是很稳定.本节我们介绍时序差分法,时序差分法不 ...
- 【转载】 强化学习(四)用蒙特卡罗法(MC)求解
原文地址: https://www.cnblogs.com/pinard/p/9492980.html ------------------------------------------------ ...
- 强化学习3-蒙特卡罗MC
之前讲到强化学习可以用马尔科夫决策过程来描述,通常情况下,马尔科夫需要知道 {S A P R γ},γ是衰减因子,那为什么还需要蒙特卡罗呢? 首先什么是蒙特卡罗? 蒙特卡罗实际上是一座赌城的名字,蒙 ...
- 【整理】强化学习与MDP
[入门,来自wiki] 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的 ...
随机推荐
- 【WPF】Silverlight中的Action与Trigger
最近做的Silverlight项目上用到了大量的拖拽,自动跟随等功能,由于赶时间,加上对Silverlight半生不熟,用的是最简单也是最不好维护的方法.项目忙完了闲下来,想重构一下代码,想起了Tri ...
- 利用adb截图然后传到电脑
首先配置好adb环境变量 然后adb devices查看是否连接手机,记得把手机调成开发者模式. 截屏 adb shell /system/bin/screencap -p 路径/文件名.后缀名 ad ...
- DRF之视图和router
1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...
- suse11安装mysql5.7
下载地址http://mirrors.sohu.com/mysql/MySQL-5.7/ 1. wget -c http://mirrors.sohu.com/mysql/MySQL-5.7/ ...
- 关于js原型链
关于原型链,我们先贴上一张图(来自某知乎大佬专栏),然后听我娓娓道来. 先来说说什么是原型? JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引 ...
- CSS Hack 技巧
IE Hack IE系列浏览器的hack大略如下: _nowamagic:1px;———–ie6 *nowamagic:1px;———–ie7 nowamagic:1px\0;———-ie89 now ...
- HDU-2874-森林求LCA/tarjan
http://acm.hdu.edu.cn/showproblem.php?pid=2874 给出一个森林,询问任意两点最短距离. tarjan跑一遍即可,就是这个题卡内存,vector会MLE,换前 ...
- 用swoole简单实现MySQL连接池
MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...
- Segment set(线段并查集)
Segment set Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total S ...
- 【转】MVC5学习笔记 BindAttribute
// POST: Movies/Create // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 // 详细信息,请参阅 http://go.microsoft.com/fwlink/?L ...