前言: 学习了 Sutton 的《强化学习(第二版)》中时序差分学习的“预测”部分内容。前两章中,书介绍了 动态规划蒙特卡洛方法 ,我们从二者与 时序差分学习 的对比开始讲起。

笔者阅读的是中文书籍,所提到的公式,笔者将给出其在英文书籍上的页码。英文书籍见 Sutton 个人主页:
http://incompleteideas.net/book/the-book.html

本次笔记内容:

  • 6.1 时序差分预测
  • 6.2 时序差分预测的优势
  • 6.3 TD(0) 的最优性

DP、MC、TD对比

中文名 英文名 简称
动态规划 Dynamic Programming DP
蒙特卡洛方法 Monte Carlo Method MC
时序差分学习 Temporal-Difference Learning TD

笔者将根据书中内容,对三者特性进行总结:

特性 DP MC TD
是否需要完备的环境模型(需要知道 p(s′,r∣(s,a))p(s',r \vert (s,a))p(s′,r∣(s,a)) ) Yes No No
期望更新(计算基于采样的所有可能后继节点的完整分布) Yes No No
采样更新(计算基于采样得到的单个后继节点的样本数据) No Yes Yes
无需等待交互的最终结果 Yes No Yes
根据幕来更新(MC到幕尾知道GtG_tGt​,才能开始对V(s)V(s)V(s)更新) No Yes No
基于已存在的VVV对VπV_\piVπ​估计 Yes No Yes

TD(0)

TD(0) 的价值更新公式为:

V(s)←V(S)+α[R+γV(S′)−V(S)]V(s) \leftarrow V(S) + \alpha [R + \gamma V(S') - V(S)]V(s)←V(S)+α[R+γV(S′)−V(S)]

其中,中括号内为 TD 误差:

δt=Rt+1+γV(St+1)−V(St)\delta_t = R_{t+1} + \gamma V(S_{t+1}) - V(S_t)δt​=Rt+1​+γV(St+1​)−V(St​)

注意,如果价值函数数组在这一幕中没有改变(蒙特卡洛方法中就是),那么蒙特卡洛误差可以写为 TD 误差之和

Gt−V(St)=Rt+1+γGt+1−V(St)+γV(St+1)−γV(St+1)=δt+γ(Gt+1−V(St+1))=δt+γδt+1+γ2(Gt+2−V(St+2))=δt+γδt+1+γ2δt+2+⋯+γT−t−1δT−1+γT−t(GT−V(ST))=δt+γδt+1+γ2δt+2+⋯+γT−t−1δT−1+γT−t(0−0)=∑k=tT−1γk−tδk\begin{aligned} G_{t}-V\left(S_{t}\right) &=R_{t+1}+\gamma G_{t+1}-V\left(S_{t}\right)+\gamma V\left(S_{t+1}\right)-\gamma V\left(S_{t+1}\right) \\ &=\delta_{t}+\gamma\left(G_{t+1}-V\left(S_{t+1}\right)\right) \\ &=\delta_{t}+\gamma \delta_{t+1}+\gamma^{2}\left(G_{t+2}-V\left(S_{t+2}\right)\right) \\ &=\delta_{t}+\gamma \delta_{t+1}+\gamma^{2} \delta_{t+2}+\cdots+\gamma^{T-t-1} \delta_{T-1}+\gamma^{T-t}\left(G_{T}-V\left(S_{T}\right)\right) \\ &=\delta_{t}+\gamma \delta_{t+1}+\gamma^{2} \delta_{t+2}+\cdots+\gamma^{T-t-1} \delta_{T-1}+\gamma^{T-t}(0-0) \\ &=\sum_{k=t}^{T-1} \gamma^{k-t} \delta_{k} \end{aligned}Gt​−V(St​)​=Rt+1​+γGt+1​−V(St​)+γV(St+1​)−γV(St+1​)=δt​+γ(Gt+1​−V(St+1​))=δt​+γδt+1​+γ2(Gt+2​−V(St+2​))=δt​+γδt+1​+γ2δt+2​+⋯+γT−t−1δT−1​+γT−t(GT​−V(ST​))=δt​+γδt+1​+γ2δt+2​+⋯+γT−t−1δT−1​+γT−t(0−0)=k=t∑T−1​γk−tδk​​

如果V在该幕中变化了,那么该公式就不准确。但是,如果时刻步长较小,那么该等式仍能近似成立。

时序差分预测方法的优势

首先。 TD 方法在数学上可以保证收敛到正确的值。

有随机游走的例子,可见 Sutton 书第125页:

代码可见:
github.com/ShangtongZhang/reinforcement-learning-an-introduction/blob/master/chapter06/random_walk.py

在这个例子中, TD 总是比 MC 收敛得快。

批量更新与TD(0)的最优性

批量更新可以用下列代码说明,可以看注释来理解。

#######################################################################
# Copyright (C)                                                       #
# 2016-2018 Shangtong Zhang(zhangshangtong.cpp@gmail.com)             #
# 2016 Kenta Shimada(hyperkentakun@gmail.com)                         #
# Permission given to modify the code as long as you keep this        #
# declaration at the top                                              #
#######################################################################import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from tqdm import tqdm# 0 is the left terminal state
# 6 is the right terminal state
# 1 ... 5 represents A ... E
VALUES = np.zeros(7)
VALUES[1:6] = 0.5
# For convenience, we assume all rewards are 0
# and the left terminal state has value 0, the right terminal state has value 1
# This trick has been used in Gambler's Problem
VALUES[6] = 1# set up true state values
TRUE_VALUE = np.zeros(7)
TRUE_VALUE[1:6] = np.arange(1, 6) / 6.0
TRUE_VALUE[6] = 1ACTION_LEFT = 0
ACTION_RIGHT = 1# @values: current states value, will be updated if @batch is False
# @alpha: step size
# @batch: whether to update @values
def temporal_difference(values, alpha=0.1, batch=False):'''在 python 中, values 不是局部变量这里为传址调用,这就是为什么不用 return values'''state = 3trajectory = [state]rewards = [0]while True:old_state = stateif np.random.binomial(1, 0.5) == ACTION_LEFT:state -= 1else:state += 1# Assume all rewards are 0reward = 0trajectory.append(state)# TD updateif not batch:values[old_state] += alpha * (reward + values[state] - values[old_state])if state == 6 or state == 0:breakrewards.append(reward)return trajectory, rewards# @values: current states value, will be updated if @batch is False
# @alpha: step size
# @batch: whether to update @values
def monte_carlo(values, alpha=0.1, batch=False):state = 3trajectory = [3]# if end up with left terminal state, all returns are 0# if end up with right terminal state, all returns are 1'''MC 产生随机序列,并且未必更新 valuesbatch = False 才 update valuesbatch = True 时表示“批量训练”:即产生一幕序列,然后疯狂由这幕序列反复更新 V(S)直到 V(S) 更新不动了(前后两次差值小于一定值)再生成新一幕序列,继续反复更新 V(S)'''while True:if np.random.binomial(1, 0.5) == ACTION_LEFT:state -= 1else:state += 1trajectory.append(state)if state == 6:returns = 1.0breakelif state == 0:returns = 0.0breakif not batch:for state_ in trajectory[:-1]:# MC updatevalues[state_] += alpha * (returns - values[state_])'''没有折扣,因此所有动作对应的 G_t 都为 G_T (1 or 0)即 [returns] * (len(trajectory) - 1)'''return trajectory, [returns] * (len(trajectory) - 1)# Figure 6.2
# @method: 'TD' or 'MC'
def batch_updating(method, episodes, alpha=0.001):# perform 100 independent runsruns = 100total_errors = np.zeros(episodes)for r in tqdm(range(0, runs)):current_values = np.copy(VALUES)errors = []# track shown trajectories and reward/return sequencestrajectories = []rewards = []for ep in range(episodes):if method == 'TD':trajectory_, rewards_ = temporal_difference(current_values, batch=True)else:trajectory_, rewards_ = monte_carlo(current_values, batch=True)trajectories.append(trajectory_)rewards.append(rewards_)while True:# keep feeding our algorithm with trajectories seen so far until state value function convergesupdates = np.zeros(7)for trajectory_, rewards_ in zip(trajectories, rewards):'''原来 批量TP 与 批量MC 的差别只在于两点:- 产生序列的方式:- - 在这个例子中,在 TD 看来,每步的收益与本身的动作有关,即前面动作收益皆为 0 ,与最后一次触发终止的动作无关 0 或 1- - 在 MC 看来,(因为没有折扣),每步的收益与最后一次触发终止的动作有关 0 或 1- 更新公式,如下'''for i in range(0, len(trajectory_) - 1):if method == 'TD':updates[trajectory_[i]] += rewards_[i] + current_values[trajectory_[i + 1]] - current_values[trajectory_[i]]else:updates[trajectory_[i]] += rewards_[i] - current_values[trajectory_[i]]updates *= alphaif np.sum(np.abs(updates)) < 1e-3:break# perform batch updatingcurrent_values += updates# calculate rms errorerrors.append(np.sqrt(np.sum(np.power(current_values - TRUE_VALUE, 2)) / 5.0))total_errors += np.asarray(errors)total_errors /= runsreturn total_errorsdef figure_6_2():episodes = 100 + 1td_erros = batch_updating('TD', episodes)mc_erros = batch_updating('MC', episodes)plt.plot(td_erros, label='TD')plt.plot(mc_erros, label='MC')plt.xlabel('episodes')plt.ylabel('RMS error')plt.legend()plt.savefig('images/figure_6_2.png')plt.close()

原来 批量TP 与 批量MC 的差别只在于两点:

  • 产生序列的方式:
    • 在这个例子中,在 TD 看来,每步的收益与本身的动作有关,即前面动作收益皆为 0 ,与最后一次触发终止的动作无关 0 或 1
    • 在 MC 看来,(因为没有折扣),每步的收益与最后一次触发终止的动作有关 0 或 1
  • 更新公式

输出为:

可见,在这个例子中 TD 比 MC 更好一些。

批量 MC 总是找出最小化训练集上均方误差的估计;而批量 TD(0) 总是找出完全符合马尔科夫过程模型的最大似然估计参数。批量 T(0) 通常收敛到的就是确定性等价估计。

TD 方法可以使用不超过 |状态数| 的内存,比直接使用最大似然估计性能优良。


知道了如何使用 TD 预测价值,接下来,我们将考虑如何在试探和开发之间做出权衡,即下次笔记讨论:

  • 同轨策略(Sarsa);
  • 离轨策略(Q-learning)。

《强化学习》中的 时序差分学习 Temporal-Difference Learning (基于与动态规划 DP 、蒙特卡洛方法 MC 的对比)相关推荐

  1. ADPRL - 近似动态规划和强化学习 - Note 10 - 蒙特卡洛法和时序差分学习及其实例 (Monte Carlo and Temporal Difference)

    Note 10 蒙特卡洛法和时序差分学习 Monte Carlo and Temporal Difference 蒙特卡洛法和时序差分学习 Note 10 蒙特卡洛法和时序差分学习 Monte Car ...

  2. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

  3. 《强化学习》中的时序差分控制:Sarsa、Q-learning、期望Sarsa、双Q学习 etc.

    前言: 学习了 Sutton 的<强化学习(第二版)>第6章时序差分学习的控制部分,将笔记提炼如下. 笔者阅读的是中文书籍,所提到的公式,笔者将给出其在英文书籍上的页码.英文书籍见 Sut ...

  4. 强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例----Sarsa算法, Q学习, 期望Sarsa算法

    强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例 5.1 TD预测 例5.1 回家时间的估计 5.2 TD预测方法的优势 例5.2 随机移动 5.3 ...

  5. 《强化学习》第6章 时序差分学习

    第6章 时序差分学习 文章目录 第6章 时序差分学习 6.1 时序差分预测 练习 6.1 例6.1 开车回家 练习6.2 6.2 时序差分预测方法的优势 例6.2 随机游走 练习6.3 练习6.4 练 ...

  6. 【论文笔记】Mutual Information-Based Temporal Difference Learning for Human Pose Estimation in Video

    Mutual Information-Based Temporal Difference Learning for Human Pose Estimation in Video 前言 1. Backg ...

  7. 每日一佳——Least-Squares Temporal Difference Learning(Justin A. Boyan,ICML,1999)

    PDF 这篇Paper获得ICML1999年的Best Paper Award.好吧,看到题目我就傻眼了,讲的是啥?没办法,只能Duang一下了.(^_^) Least-Squares:最小二乘 Te ...

  8. 强化学习笔记(3)-时序差分更新算法

    时序差分更新算法和回合更新算法一样都是利用经验数据进行学习,其区别在于时序差分更新不必等到回合结束,可以用现有的价值估计值来更新.因此时序差分更新既可用于回合制任务,也可用于连续性任务. 同策时序差分 ...

  9. 《强化学习周刊》第26期:UCL UC Berkeley发表深度强化学习中的泛化研究综述、JHU推出基于强化学习的人工决策模型...

    No.26 智源社区 强化学习组 强 化 学  习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领域的相关进展和 ...

最新文章

  1. .ipynb文件怎么打开
  2. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.23
  3. 1、SpringBoot整合JPA
  4. Chapter 1 First Sight——17
  5. openkm zip 导入乱码问题解决
  6. C#函数(构造函数)的重载
  7. Hibernate之DetachedCriteria类详解
  8. 深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍【转】
  9. C#调用WPS转换WORD,EXCEL,PPT文件为PDF
  10. uniapp 修改tabBar图标大小和navigationBar字体大小
  11. 【Codeforces】A1组刷题记录(50/ 50)完结
  12. 梦开始的地方——VS2019调试技巧
  13. android八股文
  14. 动态规划——多重背包问题
  15. MySQL之window安装包安装
  16. 云米与友阿股份达成战略合作,家庭物联网落地湖南
  17. 一个简单且处理速度很快的Python csv转excel方法
  18. show sga 的描述
  19. 技嘉主BIOS检测错误
  20. 骑行健身,是普通人走出信息泛滥时代的捷径

热门文章

  1. wifi信号桥怎么设置_扩展WiFi信号有什么好方法?路由器无线万能中继设置方法来了!...
  2. 【SQL】利用HAVING取众数和中位数
  3. Web服务的性能,和BCrypt性能问题的解决方法
  4. 前端后端分离,怎么解决SEO优化的问题呢?
  5. latex : 系统找不到指定文件问题解决方案
  6. React Hooks 实现和由来以及解决的问题
  7. win11怎样在多屏中设置主显示器 Windows11主显示器的设置方法
  8. TCP方式的网络通信【聊天器示例】
  9. 前端命名规范_值得收藏的前端命名规范
  10. vue 初始化请求例子_Vue实例初始化