强化学习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] 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的 ...
随机推荐
- patch-test-and-proc
实验环境 Ubuntu 14.04.5 LTS Linux - 4.15.6 为单个文件进程补丁操作 在桌面 Desktop 建立文件夹 patch ,作为实验用,然后进入patch 文件夹.建立测试 ...
- 20171104xlVBA进退比较
Sub 比对两次成绩() CreateAdvance "进退比较", "月考2", "期中考", "月考2", &quo ...
- H5微信页面开发 IOS系统 input输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置,导致弹框里的按钮响应区域错位
H5微信页面开发,软键盘弹起后,若原输入框被遮挡,页面整体将会上移,然而当输入框失焦,软键盘收起后,页面未恢复,导致弹框里的按钮响应区域错位. 解决方案:给输入框(或select选择框)添加失去焦点的 ...
- python and or的理解规则
>>> 'a' and 'b' 'b' >>> '' and 'b' '' >>> 'a' and 'b' and 'c' 'c’ 解释:在布尔上 ...
- 移动端rem适配 flex.js
(function() { document.addEventListener('DOMContentLoaded', function () { var html = document.docume ...
- python-day91--JS实现的ajax
一.AJAX核心(XMLHttpRequest) 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象.所有的异步交互都是使用XMLHttpServlet对象完成 ...
- 从使用角度看 ReentrantLock 和 Condition
java 语言中谈到锁,少不了比较一番 synchronized 和 ReentrantLock 的原理,本文不作分析,只是简单介绍一下 ReentrantLock 的用法,从使用中推测其内部的一些原 ...
- 解决linux环境下qt groupbox 边框不显示问题
ps:实践是检验真理的唯一标准真的是没错,以为很简单一件事情,往往被自己搞的很复杂,这里记录下 在windows环境中Qt创建一个groupbox自动显示边框, 效果如下 然而在linux环境中Qt创 ...
- nginx源码安装教程(CentOS)
1.说明 官方源码安装说明:http://nginx.org/en/docs/configure.html 源码包下载地址:http://nginx.org/en/download.html 版本说明 ...
- nop 4.1 Widget 探究- 视图组件
1. 系统默认自带了一个NivoSlider 的Wdget. 在Nop.Web项目首页的HomePageTop里 这个写法是 ASP.NET Core MVC 中的新特性 视图组件,与局部视图相似,但 ...