之前的动态规划算法,解决的是一个已知过程的MDP,已知个状态的转移概率。
而这次我们要解决的问题是未知的MDP过程。
用途:估计价值函数和探索最优策略
Monte-Carlo特点:
只需要经验,直接从经历的状态序列中来学习。 一系列标注的状态、动作、奖励 不需要知道完整的环境知识 model-free, 不需要知道MDP的状态转移概率 从完整的状态序列学习: 完整状态序列:从每一个状态开始,个体与环境交互直到终止状态,环境给出终止状态的奖励为止。不要求起始状态,但是要求最终进入环境规定的一个终止状态。 认为某状态的价值=多个状态序列中,以改状态算得的所有收获(return)的平均。 1.1.2. 目标在策略π\piπ下,从经历的状态序列中学到一个该策略下的状态价值函数vπv_\pivπ。
回顾:
return(收获):是各个状态的折扣奖励
Gt=Rt+1+γRt+2+...γT−1RT
G_t = R_{t+1} + \gamma R_{t+2} +... \gamma^{T-1}R_T
Gt=Rt+1+γRt+2+...γT−1RT
value function (价值函数):是以状态s为起点,所有return的数学期望
vπ(s)=Eπ[Gt∣St=s] v_\pi(s) = E_\pi[G_t | S_t = s] vπ(s)=Eπ[Gt∣St=s]
Monte-Carlo 策略评估使用经验平均收获(empirical mean return)代替期望收获(expect return)
1.2. 两种Monte-Carlo 估计价值函数Monte-Carlo评估策略算法如果某一个需要计算的状态,出现在完整序列的多个位置,这种情况下,根据收获(return)的定义,不同时刻同一状态计算得到的收获值应该是不一样的。我们有两种方法处理
1.2.1. First Visit仅把序列状态中第一次出现该状态的收获值纳入到收获平均值的计算中。
对于每次出现的该状态,都计算对应的收获值并且纳入到平均值计算中。
增长平均: 在累加再求平均,不必每次都计算一下和.
μk=1k∑j=1kxj=μk−1+1k(xk−μk−1)
\mu_k = \frac{1}{k}\sum_{j=1}^k x_j
=\mu_{k-1} + \frac{1}{k}(x_k-\mu_{k-1})
μk=k1j=1∑kxj=μk−1+k1(xk−μk−1)
推导过程很简单:
所以在上述两个算法更新时,可以改成应用Incremental Mean的方法:
在非静态问题,可以使用α\alphaα来代替1/N(St)1/N(S_t)1/N(St)
V(St)←V(St)+α(Gt−V(St))V(S_t) \leftarrow V(S_t)+\alpha (G_t - V(S_t))V(St)←V(St)+α(Gt−V(St))
和DP(动态规划)类似的广义策略迭代。同时保持近似的策略和近似的价值函数,相互提升精度。
通过初始策略获得最佳的行为价值函数,然后可以使用贪婪策略,再更新策略。
从采样得到的不完整的状态序列去学习,通过合理的引导(bootstrapping)
TD是Monte Carlo思想和Dynamic Programming思想的结合。
TD算法
直接从经验序列中学习 model free: 不需要知道MDP转换的概率、奖励 能够通过bootstrapping,从不完整序列中学习 updates a guess towards a guess 2.2. MC和TDTD在估计某个状态的收获,使用的是离开状态太即刻奖励 $ R_{t+1} $ 与下一时刻状态St+1S_{t+1}St+1的预估状态价值乘以衰减系数γ\gammaγ组成
Incremental every-visit Monte-Carlo算法的价值是
- 通过实际的收获==GtG_tGt== 更新来计算的。
V(St)←V(St)+α(Gt−V(St)) V(S_t) \leftarrow V(S_t) + \alpha(G_t - V(S_t)) V(St)←V(St)+α(Gt−V(St))
一个简单地TD算法:TD(0):
V(st)V(s_t)V(st)的更新时通过返回的 $R_{t+1}+\gamma V(S_{t+1}) $Rt+1+γV(St+1)R_{t+1}+ \gamma V(S_t+1)Rt+1+γV(St+1) 叫做TD目标。 TD target
δ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误差。TD error
bootstrapping:就是指用TD target 代替GtG_tGt 的过程
特性:
TD能够在最终结果出来之前学习 TD可以每一步都进行学习 MC必须等到整个序列的结果都已知 TD可以不用最终结果 TD可以从不完整的序列中学习 MC只能从完整的序列中学习。 TD在连续环境中工作,无需终止状态 MC只能从含有终止状态的环境中学习Bias/Variance 权衡
偏差bias MC的ReturnGt=Rt+1+γRt+2...G_t=R_{t+1}+ \gamma R_{t+2} ...Gt=Rt+1+γRt+2...是vπ(St)v_\pi(S_t)vπ(St)的无偏估计。 TD target Rt+1+γV(St+1)R_{t+1}+\gamma V(S_{t+1})Rt+1+γV(St+1) 是vπ(St)v_\pi(S_t)vπ(St)的有偏估计。 如果TD target的下一状态的价值函数是真实的,不是估计出来的。TD target就是无偏估计。 Variance 方差TD target的方差要比收获Return更低。
Return 依赖很多随机的动作,奖励,转换概率等。TD target值依赖于一个随机的动作,转换率,奖励。
3.1. 回溯比较 Monte-Carlo Backup深度采样学习,使用实际收获来更新状态预估价值
浅层采样学习。以及经历不完整,使用后续状态的预估状态价值估计收获再更新当前状态。
Dynamic Programming Backup浅层全宽度采样学习。使用后续所有状态预估价值来更新当前的状态价值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDOjaLtx-1582003167919)(_v_images/image-20200204184451590.png)]
Bootstrapping 和 Sampling(采样) bootstraping : 更新时包含一个估计值 MC没有bootstraping DP和TD都有bootstraping Sampling: 用期望来更新样本 MC 有采样 DP没有 TD有采样 4.1.n-step PredictionTD(0)是往后多看一步。空心是状态,实心是动作。
TD(n)的尽头就是MC算法。
TD是TD(0)的缩写,是基于1步测试的。
n-Step Return 收获n-Step TD的学习算法更新:
V(St)←V(St)+α(Gtn−V(St))
V(S_t) \leftarrow V(S_t) + \alpha(G_t^{n} - V(S_t))
V(St)←V(St)+α(Gtn−V(St))
n = 1 时相当于TD(0)学习。
n = ∞\infin∞ 时,相当于MC
这里的n取何值才能兼顾TD和MC的优点,对于不同的问题是不一样的。所以这里的n是一个超参数。
λ\lambdaλ-Return可以通过取两个不同的n-step收获
的平均值来结合不同n值的信息。例如:
12G(2)+12G(4)
\frac{1}{2}G^{(2)} + \frac{1}{2}G^{(4)}
21G(2)+21G(4)
如果使用这个G,就同时结合了2-step和4-step的信息。
那么能否有效的结合所有n-step的信息呢?
当然有,使用λ−return\lambda -returnλ−return
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fCodv0y-1582003167923)(_v_images/image-20200204193850244.png)]
λ−return\lambda-returnλ−return结合了n取任何值的n-step收获Gt(n)G_t ^{(n)}Gt(n)的信息。
在每一项前面加上权重(1−λ)λn(1-\lambda)\lambda^{n}(1−λ)λn,注意,每一项上面的权重加和为1,即:
(1−λ)+(1−λ)λ+(1−λ)λ2+...=1,λ∈[0,1]
(1-\lambda) + (1-\lambda)\lambda + (1-\lambda)\lambda^2 + ... = 1, \lambda\in [0,1]
(1−λ)+(1−λ)λ+(1−λ)λ2+...=1,λ∈[0,1]
所以,λ−return\lambda-returnλ−return 为每一步的收获乘以权重,整理可得
Gtλ=(1−λ)∑n=1∞λn−1Gt(n) G_t ^\lambda = (1-\lambda)\sum_{n=1}^{\infin} \lambda^{n-1} G_t^{(n)} Gtλ=(1−λ)n=1∑∞λn−1Gt(n)
前向认识TD(λ)TD(\lambda)TD(λ) (向之后的状态看)V(St)←V(St)+α(Gtλ−V(St)) V(S_t) \leftarrow V(S_t) + \alpha (G_t^{\lambda} - V(S_t)) V(St)←V(St)+α(Gtλ−V(St))
和MC一样的劣势,必须经历完整的状态序列,才能够更新当前的状态值。当λ=1\lambda=1λ=1时,就是MC算法。
反向认识TD(λ)TD(\lambda)TD(λ)(从当前状态往回看。)提供了机理,可以在线实时单步更新。
概念:Eligibility Traces(效用迹)Eligibility(效用) :用一个数值来表示某个状态对后续状态的影响。
例子: 老鼠在笼子里,接受到了三次响铃、一次亮灯信号之后,发生电击。
Frequency heuristic(频率启发式):某个事件发生归功于之前某个时间发生的频率。认为电击原因是太多次响铃
Recency heuristic(就近启发): 认为发生的原因是因为上一次亮灯。
Eligibility Traces(效用迹)结合梁上述两种heuristic(两种启发)。
每个状态都有自己的效用迹。状态s效用迹为E(s)E(s)E(s)
E0(s)=0,所有状态初始的效用迹都是0Et(s)=γλEt−1(s)+1(St=s),γ,λ∈[0,1]
E_0(s) = 0 , 所有状态初始的效用迹都是0 \\
E_t(s) = \gamma \lambda E_{t-1}(s) +1(S_t = s), \quad \gamma,\lambda \in [0,1]
E0(s)=0,所有状态初始的效用迹都是0Et(s)=γλEt−1(s)+1(St=s),γ,λ∈[0,1]
1(St=s)1(S_t =s)1(St=s) 表示如果St=sS_t = sSt=s时,取1,否则取0;
t时刻的状态s的Eligibility Traces等于t-1适合的效用迹乘以衰减系数
+ 当前状态的效用
,如果当前状态是所求s,就加1,否则加0。
为什么加1? 保证再次出现该状态上升就行。前边有系数λ\lambdaλ,所以调节λ\lambdaλ就相当于调整1。
可能出现这样的图像:横坐标时间t,纵坐标Eligibility Traces。 竖线代表某个相同的状态发生。
可见每次出现该状态,都会让效用迹增加。如果不出现,就会衰减。
注意:对于每个状态的Eligibility Trace, 不需要等到状态序列到达终点再计算。是根据一直状态来计算出来的。
每一个时刻都进行一次更新。
存在瞬时最高上限:
Esat=11−γλ E_{sat} = \frac{1}{1-\gamma \lambda} Esat=1−γλ1
Eligibility Trace 的设计和神经元十分相似。连续刺激,会产生一个值很强的反馈。同时存在最值。如果一段时间不刺激,则会静息。 整合BackwardTD算法的更新时
V(s)←V(s)+αδt,δt是TD−error,见上文。
V(s) \leftarrow V(s) + \alpha \delta_t , \quad \delta_t是TD-error,见上文。
V(s)←V(s)+αδt,δt是TD−error,见上文。
结合Eligibility Trace Et(s)E_t(s)Et(s):
$$
\delta_t = R_{t+1} + \gamma V(S_t+1) - V(S_t) \
V(s) \leftarrow V(s) + \alpha \delta_tE_t(s)
$$
当λ=1\lambda = 1λ=1,未加入Eligibility Trace 时,等同于MC。
加入Eligibility Trace,没次经历一个状态,就可以更新一次状态价值。实时更新,不等同于MC
Offline updates 更新是在一次迭代(episode)结束整个过程的积累值 但是必须在结束之后才能应用 Online updatesTD(λ)TD(\lambda)TD(λ) 在每一步进行更新
前向和后向视角的TD是不同的。
参考
[1] David Silver深度强化算法学习教学视频
[2] Reinforcement Learning. Richard S. Sutton and Andrew G. Barto
[3] 强化学习入门——从原理到实践. 叶强