强化学习(三):时序差分学习(Temporal-Difference Learning, TD)

2024-02-01 21:32

本文主要是介绍强化学习(三):时序差分学习(Temporal-Difference Learning, TD),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. TD预测
    • 1.1. TD(0)算法
  • 2. 同轨TD控制:Sarsa
  • 3. 离轨TD控制:Q学习
    • 3.1. 基本思想
    • 3.2. 算法流程
    • 参考资料
  • X. 动态规划法DP、蒙特卡洛法MC 和 时序差分法TD的比较
    • X.1. 核心思想
    • X.2. 算法特点

1. TD预测

TD是另一种对最优策略的学习方法,本节讲述TD预测,即使用TD求解策略 π \pi π的值函数 v π ( s ) v_{\pi}(s) vπ(s)

TD预测被称为 DP 和 MC 的结合体,DP是 期望更新+自举bootstrap,MC是 采样更新 + 样本估计。而TD则是采样更新 + 自举,即值函数 V ( S t ) V(S_t) V(St)更新基于采样得到的 V ( S t + i ) V(S_{t+i}) V(St+i)的结果

如果 i = 1 i=1 i=1,就为TD(0)单步TD算法,否则就为多步TD

当然动态特性 p ( s ′ , a ∣ s , a ) p(s',a|s,a) p(s,as,a)对于TD也是未知的。

1.1. TD(0)算法

根据采样更新与自举的思想,TD(0)的状态值函数预测式为

V ( S t ) = V ( S t ) + α [ R t + 1 + γ V ( S t + 1 ) − V ( S t ) ] (1) V(S_t) = V(S_t) + \alpha[R_{t+1} + \gamma V(S_{t+1}) - V(S_t)] \tag{1} V(St)=V(St)+α[Rt+1+γV(St+1)V(St)](1)

先给出一些定义:
TD目标:指 R t + 1 + γ V ( S t + 1 ) R_{t+1} + \gamma V(S_{t+1}) Rt+1+γV(St+1)
TD误差:指 R t + 1 + γ V ( S t + 1 ) − V ( S t ) R_{t+1} + \gamma V(S_{t+1}) - V(S_t) Rt+1+γV(St+1)V(St)
步长\学习率:指 α \alpha α

如何理解上述定义呢?

结合图一看就明白了。对于状态 s s s,所有包含 s s s的episode均会使值函数的估计值 V ( s ) V(s) V(s)朝着TD目标走长度为 α \alpha α倍TD误差 的一步,而获得新的 V ( s ) V(s) V(s)。就是经过这样不断地走,最终会接近 v π ( s ) v_{\pi}(s) vπ(s)
在这里插入图片描述

有没有想到梯度下降中的步长的概念?意思其实是一样的,同样的可以使用非恒定学习率,例如 1 s 的 更 新 次 数 \frac{1}{s的更新次数} s1,即越接近 v π ( s ) v_{\pi}(s) vπ(s)学习率越小,这样 V ( s ) V(s) V(s)就变成了采样取平均的方法。取平均的确会收敛概率为1,但这样收敛较慢,且对于非平稳问题则不太合适。

由此特征可以看到DP和MC的影子,深刻理解TD算法的思想:

  1. 采样更新:可以看到 ( 1 ) (1) (1)中更新的状态是与 t t t有关的,即 V ( S t ) V(S_t) V(St)的更新是基于样本采样得出的单个后继节点的值函数,即 S t + 1 S_{t+1} St+1
    只不过MC中用的是当前样本算得的 G t G_t Gt,TD中直接用的估计结果V。
  2. 自举:式子中状态的值函数 V ( S t ) V(S_t) V(St)需要用到 已存在的 其他状态的值函数 V ( S t + 1 ) V(S_{t+1}) V(St+1)

所以式子 ( 1 ) (1) (1)中的 R t + 1 + γ V ( S t + 1 ) R_{t+1} + \gamma V(S_{t+1}) Rt+1+γV(St+1)到底叫不叫样本? 叫吧,可这个值涉及到多次迭代的估计值。不叫吧,可这又是采样得来的,而且 V ( S t ) V(S_t) V(St)的更新只看样本给出的下一个状态 V ( S t + 1 ) V(S_{t+1}) V(St+1)
\quad
因此TD的核心思想是对于状态 s s s,步步采样,用估计值函数 V ( s ′ ) V(s') V(s)更新(而非样本回报 G t G_t Gt

上代码

V TDEvaluation(S,A,R,policy,alpha,gamma,maxEpisodeNum)
{V(S) = 0;episode = 1;for episode = 1:maxEpisodeNum{s = random(S);while(s != terminalState){a = policy(s);s' = updateState(s,a);r = reward(s,a,s');V(s) = V(s) + alpha*( r + gamma*V(s') - V(s) );s = s'; }}return V(S);
}	

2. 同轨TD控制:Sarsa

这里讨论经典的同轨的TD控制方法Sarsa。既然是同轨法,即行动策略 和 目标策略 相同,就必须考虑最优策略是确定性策略,即选择行动状态函数最大的动作时,这样的行动策略会带来的样本探索受限的问题(动态规划与蒙特卡洛方法中如是说)

2.1. ϵ \epsilon ϵ-软性策略 ( ϵ \epsilon ϵ-greedy)

思路是将确定性策略改成近似确定性,即以较大概率 1 − ϵ 1-\epsilon 1ϵ选择 max ⁡ a q π ( s , a ) \max_aq_{\pi}(s,a) maxaqπ(s,a),以较小概率 ϵ \epsilon ϵ选择其他行为。因此要满足 1 − ϵ > > ϵ 1-\epsilon >> \epsilon 1ϵ>>ϵ

该策略如下:

Action policy(state,Q,epsilon)
{if( rand(0,1) < epsilon )return randomActions(state);elsereturn argmax(Action,Q(state,:));
}

这样的软性策略,实际上对于新样本的采集(行动策略)会以很小的概率 ϵ \epsilon ϵ进行,因此Sarsa算法的特点就是点的探索会比较保守。

2.2. 算法流程

与公式 ( 1 ) (1) (1)类似,得到 Q ( s , a ) Q(s,a) Q(s,a)的更新公式:

Q ( s , a ) = Q ( s , a ) + α [ R ( s , a ) + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) = Q(s, a) + \alpha [ R(s,a) + \gamma Q(s',a') -Q(s,a)] Q(s,a)=Q(s,a)+α[R(s,a)+γQ(s,a)Q(s,a)]

注意到公式中出现了新状态的新动作 a ′ a' a,该新动作也是通过 ϵ \epsilon ϵ-软性策略得到的。

整体代码如下,由于policy()是选取动作值函数Q(s,:)最大的动作,因此更新Q(s,a)就是控制。

policy Sarsa(S,A,R,epsilon,alpha,gamma,maxEpisodeNum)
{Q(S,A) = 0;episode = 1;for episode = 1:maxEpisodeNum{s = random(S);a = policy(s);while(s != terminalState){s' = updateState(s,a);a' = policy(s',Q,epsilon);r = reward(s,a,s');Q(s,a) = Q(s,a) + alpha*( r + gamma*Q(s',a') - Q(s,a) );s = s'; a = a';}}return policy(S,Q,epsilon);
}	

3. 离轨TD控制:Q学习

3.1. 基本思想

Q-Learning算法是一种强化学习算法,通过智能体在环境中不断地训练进而得出一种模型,在该模型下实现智能体的决策。

Q-Learning 的思想 是将智能体划分为多个可能的状态,每个状态之间通过某种行为相互转换(类似于状态机,也类似于离散系统控制中的系统状态x(k)和控制信号u(k)),在某种状态下采取不同的行为会得到不同的收益reward

智能体的行为选择 是基于获得的期望总体收益q最大进行的,即在状态 s s s下采取策略 a a a是因为这样才能使未来期望的总收益达到最大

因此需要记录 所有状态的所有行为的期望总体收益,即 Q ( s , a ) Q(s,a) Q(s,a)

(注意策略 a a a是基于未来所有收益的期望值,而非眼下的收益reward,一种动态规划思想)

Q-learning算法是一种 针对特定场景下边决策边训练的强化学习算法。主要变量如下
状态 s s s行为 a a a收益 r e w a r d ( s , a ) reward(s,a) reward(s,a)动作值函数Q-table Q ( s , a ) Q(s,a) Q(s,a)

且系统状态 s s s会在 a a a的作用下发生转移,即 s j = a i j ( s i ) s_j = a_{ij}(s_i) sj=aij(si)

(注意reward和Q-table的输入是两个:状态 和 行为,而不只是状态。即使转移到相同的状态s,也可能有不同的收益, r e w a r d ( s i , a i j ) ≠ r e w a r d ( s k , a k j ) reward(s_i ,a_{ij}) ≠ reward(s_k ,a_{kj}) reward(si,aij)=reward(sk,akj)

在这里插入图片描述

Q-learning的训练的过程只是 不断重复两步思维决策、Q-table更新

1.1.节中智能体的行为选择 是基于获得的期望总体收益q最大进行的,这里的期望总体收益指的就是Q-table的值。

因此智能体的选择很简单,取Q最大值对应的 a a a即可,如果当前状态为 s s s则选择的行为 a a a应当满足

a = a m a = a_m a=am,
where a m a_m am s.t. Q ( s , a m ) = m a x { Q ( s , a 1 ) , Q ( s , a 2 ) , . . . , Q ( s , a n ) } Q(s, a_m) = max\{Q(s,a_1),Q(s,a_2),...,Q(s,a_n) \} Q(s,am)=max{Q(s,a1),Q(s,a2),...,Q(s,an)}

在这里插入图片描述

Q-table中 Q ( s , a ) Q(s,a) Q(s,a)表示状态 s s s下采取 a a a的得到的期望总体收益。

总体收益的含义是指,从状态 s s s采取动作 a a a s ′ s' s开始到算法结束的所有收益之和。但是从 s ′ s' s到算法终止策略有很多,因此这样的收益有很多,但有一个期望值。

期望的总体收益则是指从状态为 s s s,采取动作 a a a转移至 s ′ s' s,如果接下来都采取最佳策略的总体收益。

最佳策略则是如1.2.1所讲,期望总体收益q最大的那个选择策略。

因此根据动态规划思想, Q ( s , a ) Q(s,a) Q(s,a)就应该包含:状态 s s s采取动作 a a a的收益 和 s ′ s' s的期望总体收益。

Q ( s , a ) = r e w a r d ( s , a ) + γ E [ Q ( s ′ ) ] Q(s, a) = reward(s,a) + \gamma E[Q(s')] Q(s,a)=reward(s,a)+γE[Q(s)]
= r e w a r d ( s , a ) + γ m a x a { Q ( s ′ , a ) } \quad\quad\quad= reward(s,a) + \gamma max_{a}\{Q(s',a)\} =reward(s,a)+γmaxa{Q(s,a)}

其中 s ′ = a ( s ) s' = a(s) s=a(s) E [ Q ( s ′ ) ] E[Q(s')] E[Q(s)]表示 s ′ s' s状态的总体收益的期望值, γ \gamma γ表示折扣因子,用于确定延迟回报与当前回报的相对比例, 越大表明延迟回报的重要程度越高。

在这里插入图片描述

迭代过程中 Q ( s , a ) Q(s, a) Q(s,a)是不断修正地过程,因此将 Q ( s , a ) Q(s, a) Q(s,a)变为过去的估计值 和 当前的现实值得加权和(Kalman滤波器既视感

Q ( s , a ) = Q ( s , a ) + ϵ ( R ( s , a ) + γ m a x a { Q ( s ′ , a ) } ) Q(s, a) = Q(s, a) + \epsilon ( R(s,a) + \gamma max_{a}\{Q(s',a)\} ) Q(s,a)=Q(s,a)+ϵ(R(s,a)+γmaxa{Q(s,a)})

其中 ϵ \epsilon ϵ表示学习率。

3.2. 算法流程

对Q-learning算法进行一个流程总结,可能直接看伪代码更加清晰。

QLearning(initialState,endState,reward,N)
{episode = 1;s = initialState;while(episode < N){a = chooseAction(s,Qfun);sNew = updateState(s,a);Qfun = updateQ(Qfun,reward,s,a,sNew);s = sNew;if(sNew == endState){s = initialState;episode++;}}
}

动作选择、状态更新 和 Qtable更新细节如下

action chooseAction(currentState,Qfun,prob)
{if(rand(0,1) > prob)return rand(all Actions within currentState);bestAction = first Action;for each Action in currentState:if(Qfun(currentState,Action) > Qfun(currentState,bestAction))bestAction = Action;return bestAction;
}newState updateState(currentState,action)	//与系统动力学有关Qfun updateQ(Qfun,reward,currentState,currentAction,newState,gamma,epsilon)
{s = currentState;a = currentAction;sNew = newState;Qfun(s,a) += epsilon * (reward(s,a) +gamma * max(Qfun(sNew,:)) );return Qfun(s,a);
}

参考资料

  1. https://www.bilibili.com/video/BV13W411Y75P?p=5
  2. https://blog.csdn.net/itplus/article/details/9361915
  3. https://baijiahao.baidu.com/s?id=1597978859962737001&wfr=spider&for=pc
  4. https://blog.csdn.net/wlm_py/article/details/101301986

X. 动态规划法DP、蒙特卡洛法MC 和 时序差分法TD的比较

X.1. 核心思想

X.2. 算法特点

这篇关于强化学习(三):时序差分学习(Temporal-Difference Learning, TD)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668524

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include