现在我们可以回顾一下原来的知识,我们之前讲了那么多的算法,但是我们是不是都有一个假设,就是我们的状态空间都是有限的。然后我们使用内存存储每个状态的值函数,不断的进行更新这个值函数。如果是一个无限空间的场景我们将如何处理呢?这个时候已经没有足够的内存啦,我们往往需要使用近似的函数V(s,θ),利用函数逼近的方法对值函数表示。
V(s)=V(s,θ)
其中θ表示引入的参数,实际上是一个向量,通过函数近似,可以少量的参数θ来拟合实际的各种值函数。
线性逼近
所谓的线性逼近指的是值函数表示为状态或者状态函数的线性组合。
V(s,θ)=θTx(s)=i=1∑dθixi(s)(7.1)
其中x(s)表示状态s的特征分量。 例如我们如果想把飞机飞行状态表示成状态空间,需要描述角速度、飞行速度等等。
假设每个状态s对应k个数,s=(s1.s2,...sk)则对于这个k维状态空间,函数xi(s)可以写成。
xi(s)=sj(7.2)
上面的表达十分简单,但是忽略了不同维度特征之间的相互作用,因此需要对函数x(s)进行扩展,使其不仅能表示状态特征分量,还能表示更加复杂的函数,如多项式函数等。这里就类似于SVM的核函数的意义,这里就不再赘述啦。大家只要理解除了原始的特征以外还可以经过加工变成维度更加丰富的特征就可以啦。
增量法
进行值函数逼近的时候,我们希望学到值函数尽可能近似真实的值函数,近似程度常用最小二乘法来度量。
Eθ=Eπ[(Vπ(s)−θTx(s))2](7.3)
为了使得误差最小化,尝尝采用梯度下降方法,对误差求负倒数。
∂θ∂Eθ=Eπ[2(Vπ(s)−θTx(s))x(s)]
∇θ=α(Vπ(s)−θTx(s))x(s)
但是进行逼近的时候,我们并不知道逼近的目标,是不是谈到重点啦,就是真实的Vπ(s)取值,这个时候我们可以考虑使用任意一个无模型方法对Vπ(s)进行评估。
这样就可以将值函数过程看成一个监督学习的过程,标签就是蒙特卡洛方法中Gt,时序差分中就是Rt+1+γV(St+1),在多步差分中就是Gtλ
基于蒙特卡洛方法的参数逼近
给定策略π产生一个完整的轨迹
(s0,a0,r0,s1,a1,r1,...)
值函数更新的过程实际上是一个监督的过程,其实监督数据集中的累计回报Gt从蒙特卡洛的轨迹中就能得到,回报Gt可以通过ri求得,所以轨迹也可以表示为如下的数据集合
(s0,G0),...(sn,Gn)
更新的公式就是
∇θ=α(Gt−θTx(st))x(st)(7.4)
基于时序差分的参数逼近
如果考虑使用一步时序差分的方法,从不完整的轨迹中学习参数值,就需要用到自举的方法,用下一步状态的值函数更新当前的值函数。TD(0)方法中目标函数为:Rt+1+γV(St+1).其中V(St+1)可以用V(St+1,θ)近似。
同样将值函数更新看成监督学习过程。
(s0,R1+γV(S1,θ))...(st,RT+1+γV(ST+1,θ))
此时主要要更新的参数θ,不仅出现在要估计的当前状态值函数中V(S,θ)也出现在目标值函数中V(St+1,θ)。对θ求导时,只考虑对估计值函数V(S,θ)的影响而忽略对目标值函数的影响,就是仅仅保留V(S,θ)对θ的导数,而忽略目标函数对theta的导数,这种方法并不是完全的梯度法,而是部分梯度法。
其更新公式为
∇θ=α(Rt+1+γθTx(st+1)−θTx(st))x(xt)(7.5)
基于前向TD(λ)的参数逼近
考虑多步时序差分前向算法进行参数逼近,λ-回报 Gtλ是值函数的无偏估计对应监督学习数据集为
<s0,G0λ>,<s1,G1λ>,<s2,G2λ>,<s3,G3λ>
参数更新公式为
∇θ=α(Gtλ−θTx(st))x(st)
基于后向TD(λ)的参数逼近
对于后向算法有
δt=Rt+1+γθTx(st+1)−θTx(st)Et=λγEt−1+∇θV(St,θ)=λγEt−1+x(st)
不知道大家发现没有,这个和我们之前的定义已经发生了变化,运来我们的定义是
Et=λγEt−1+1,这个是表格型强化学习,但是非表格强化学习中,资格迹变成了∇θV(St,θ)
∇θ=αδtEt
在实际场景中,大多数情况下我们需要逼近行为值函数以便获取策略。
Q(s,a,θ)≈Q(s,a)
将θ作用于状态和动作的联合向量上,即给状态向量增加一维用于存放动作向量,即将函数x(s)替换为x(s,a),这样就有了行为值函数
Q(s,a,θ)=θTx(s,a)=∑θixi(s,a)
对于近似值和实际值采用最小二乘误差来度量,为了使误差最小,对其误差采用梯度下降算法。
Eθ=Eπ[(Qπ(s,a)−θTx(s,a))2]−∂θ∂Eθ=Eπ[2(Qπ(s,a)−θTx(s,a))x(s,a)]
对于单个样本更新规则为
∇θ=α(Qπ(s,a)−θTx(s,a))x(s,a)
对应的Q(s,a)是未知的,可以使用蒙特卡洛、时序差分等进行评估。
基于蒙特卡洛参数逼近的公式为
∇θ=α(Gt−θTx(st,at))x(st,at)
基于sarsa参数逼近为
∇θ=α(Rt+1+γθTx(st+1,at+1−θTx(st,at)))x(st,at)
基于Q学习的参数逼近
∇θ=α(Rt+1+γθTx(st+1,π(st+1)−θTx(st,at)))x(st,at)
基于前向算法的参数逼近
∇θ=α(qtλ−θTx(st,at))x(st,at)
基于后向算法的参数逼近
δt=Rt+1+γθTx(st+1,at+1)−θTx(st,at)Et=λγEt+1+∇thetaQ(st,at,θ)=λγEt−1+x(st,at)∇θ=δtαEt
以上讲的就是增量法更新。以下是sarsa的增量更新伪代码。
批量法
我们之前讨论的增量法在更新过程中随机性非常大,尽管计算简单,单样本数据利用效率不高。而批量法尽管计算复杂但是利用率较高。
批量法是把一段时间的数据集中起来,给定一段经验数据D={(s1,V1π),(s2,V2π),(s2,V3π)}
满足损失最小
L(θ)=∑(Vtπ−θTx(st))2∂θ∂L(θ)=2∑(Vtπ−θTx(st))x(st)=0
同样的我们总结一下各种方法对Vtπ的进行近似。
蒙特卡洛方法
αt=1∑T(Gt−θTx(st))x(st)=0θ=(t=1∑Tx(st)x(st)T)−1t=1∑Tx(st)Gt
时序差分
αt=1∑T(Rt+1+γθTx(st+1)−θTx(st))x(st)=0θ=(t=1∑Tx(st)(x(st)−γx(st+1))T)−1t=1∑Tx(st)Rt+1
前向TD(λ)
αt=1∑T(Gtλ−θTx(st))x(st)=0θ=(t=1∑Tx(st)x(st)T)−1t=1∑Tx(st)Gtλ
后向TD(λ)
αδtEt=0θ=(t=1∑TEt(x(st)−γx(st+1))T)−1t=1∑TEtRt+1
如果对行为值函数进行拟合,就是$Q(s,a,\theta) \approx Q(s,a) 并对数据集D={<s_1,a_1>, Q_{1}^{π},…,<s_T,a_T>, Q_{T}^{π}}$应用批量法
蒙特卡洛方法
αt=1∑T(Gt−θTx(st))x(st)=0θ=(t=1∑Tx(st,at)x(st,at)T)−1t=1∑Tx(st,at)Gt
sarsa方法
αt=1∑T(Rt+1+γθTx(st+1,at+1)−θTx(st,at))x(st,at)=0θ=(t=1∑Tx(st,at)(x(st,at)−γx(st+1,at+1))T)−1t=1∑Tx(st,at)Rt+1
Qlearning方法
αt=1∑T(Rt+1+γθTx(st+1,π(st=1))−θTx(st,at))x(st,at)=0θ=(t=1∑Tx(st,at)(t=1∑Tx(st,at)−γx(st+1,π(st+1)))T)−1t=1∑Tx(st,at)Rt+1
前向TD(λ)
αt=1∑T(Gtλ−θTx(st,at))x(st,at)=0θ=(t=1∑Tx(st,at)x(st,at)T)−1t=1∑Tx(st,at)Gtλ
后向TD(λ)
αδtEt=0θ=(t=1∑TEt(x(st,at)−γx(st+1,at+1))T)−1t=1∑TEtRt+1