强化学习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] 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的 ...
随机推荐
- C# winform 窗体怎么隐藏标题栏,不显示标题栏
//没有标题 this.FormBorderStyle = FormBorderStyle.None; //任务栏不显示 this.S ...
- Forbidden Subwords
pro: sol: 建出ac自动机. 一个合法的答案对应一条路径满足从一个scc走到另一个scc的路径. 发现这个题的方案数有可能是无限的. 会在以下两种情况无限: 因此,去掉无限情况后,环只有简单环 ...
- 46. 47. Permutations and Permutations II 都适用(Java,字典序 + 非字典序排列)
解析: 一:非字典序(回溯法) 1)将第一个元素依次与所有元素进行交换: 2)交换后,可看作两部分:第一个元素及其后面的元素: 3)后面的元素又可以看作一个待排列的数组,递归,当剩余的部分只剩一个元素 ...
- 【转】预装Win8/8.1 中文版系统升级为专业版或专业版含媒体中心版的简单方法
[转]预装Win8/8.1 中文版系统升级为专业版或专业版含媒体中心版的简单方法 原文地址:http://www.iruanmi.com/upgrade-win8-china-to-a-higher- ...
- 【PowerDesigner】【10】绘制类图
前言:我感觉我也是一知半解,参考博客的内容会比我的文章更有帮助 用途:描述项目中类与类的关系(即描述java文件) 正文: 1,新建oomFile→New Model→Model types→Obje ...
- dingyou-dingtalk-mobile在安卓系统上无法显示问题
dingyou-dingtalk-mobile项目在NowaUI上下载下来直接编译部署后在安卓版钉钉上会出现无法正常显示的问题,安卓真机调试在谷歌上显示错误如下:1.undefined is not ...
- 函数使用十二:BAPI_MATERIAL_BOM_GROUP_CREATE(CS61)
REPORT ZSM_CREATE_SIMPLEBOM.* This code will create a material BoM for the material* MAINMATERIAL wi ...
- Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
原文地址:Golang 在 Mac.Linux.Windows 下如何交叉编译 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下 ...
- Intersecting Lines
Intersecting Lines We all know that a pair of distinct points on a plane defines a line and that a p ...
- Angular4.x 引入第三方 JS
引入 Jquery 使用 angular-cli 新建 angular项目 1.安装 jquery npm install jquery --save 2..angular-cli.json 中引入 ...