其他分享
首页 > 其他分享> > ADPRL - 近似动态规划和强化学习 - Note 11 - 时序差分学习(Theory of TD learning)

ADPRL - 近似动态规划和强化学习 - Note 11 - 时序差分学习(Theory of TD learning)

作者:互联网

Note 11 - 时序差分学习(Theory of TD learning)

时序差分学习


在上个Note中,我们重温了RL的基础概念,即TD学习和它的扩展与资格迹。由于TD算法的简单性和突出的性能,用线性函数近似法(LFA)对TD机制的扩展肯定对解决维度诅咒有很大优点。

让我们回顾一个典型的线性方程近似(LFA): J = Φ ⊤ h ∈ R K J=\Phi^{\top} h \in \mathbb{R}^{K} J=Φ⊤h∈RK,并有 Φ : = [ ϕ 1 , … , ϕ K ] ∈ R m × K \Phi:=\left[\phi_{1}, \ldots, \phi_{K}\right] \in \mathbb{R}^{m \times K} Φ:=[ϕ1​,…,ϕK​]∈Rm×K。如果把TD误差 δ ( x , u , x ′ ) \delta\left(x, u, x^{\prime}\right) δ(x,u,x′)看作是描述转换 ( x , u , x ′ ) \left(x, u, x^{\prime}\right) (x,u,x′)的信息,经典的TD更新与LFA可以构造为

h k + 1 = h k + α k ( g ( x k , u k , x k ′ ) + γ h k ⊤ ϕ ( x k ′ ) − h k ⊤ ϕ ( x k ) ) ϕ ( x k ) (11.1) h_{k+1}=h_{k}+\alpha_{k}\left(g\left(x_{k}, u_{k}, x_{k}^{\prime}\right)+\gamma h_{k}^{\top} \phi\left(x_{k}^{\prime}\right)-h_{k}^{\top} \phi\left(x_{k}\right)\right) \phi\left(x_{k}\right) \tag{11.1} hk+1​=hk​+αk​(g(xk​,uk​,xk′​)+γhk⊤​ϕ(xk′​)−hk⊤​ϕ(xk​))ϕ(xk​)(11.1)

这个更新是在每个转换 ( x , u , x ′ ) \left(x, u, x^{\prime}\right) (x,u,x′)之后触发的。注意,经典的TD更新修订了每个单独状态下的总成本的近似值,而带LFA的TD更新了权重向量,即隐含了每个时间的整个总成本近似。有一个明显的惊喜,与更新规则(11.1)相关的算法可以被证明是渐进地收敛于投影贝尔曼算子的固定点,如Proposition 8.6所示。

第一个关于LFA的TD学习理论是作为梯度下降算法的一些变体而提出的。然而,这些TD学习算法被认为不是真正的梯度下降算法作为后续,关于传统TD学习算法的收敛性和鲁棒性的尝试理论被削弱和限制。虽然最近尝试用半梯度的概念来重新解释TD的概念,但对TD学习的简明解释仍然有些欠缺。在这一章中,我们旨在揭示TD学习算法的数学基础,以及对收敛特性的简明解读,与自举(bootstrapping )的概念形成对比,自举是一种用来近似总成本的挥手技巧(hand-waving trick)。

11.1 随机近似算法简述(Stochastic Approximation Algorithm in Nutshell)

在本小节中,我们回顾了随机逼近(Stochastic Approximation, SA)理论中的一些基本结果,以便我们能够更好地理解带有LFA的经典TD学习算法。具体来说,SA算法的目的是找到一些非线性自映射 z : R m → R m z: \mathbb{R}^{m} \rightarrow \mathbb{R}^{m} z:Rm→Rm的根,即,对 h ∈ R m h\in \mathbb{R}^{m} h∈Rm解决以下方程

z ( h ) = 0. (11.2) z(h)=0 . \tag{11.2} z(h)=0.(11.2)

这里,自映射 z z z通常被假定为在其参数 h h h中是连续的。SA算法处理的是一种非常有趣和具有挑战性的情况,即函数 z z z是未知的,只有 z z z的一些 "噪声测量 "可以获得。特别是,噪声测量被建模为

y = z ( h ) + w (11.3) y=z(h)+w \tag{11.3} y=z(h)+w(11.3)

其中 w w w是一个零平均的随机变量,代表噪音,其概率密度函数为 p ( w ) p(w) p(w)。显然,对于一个固定的 h h h, y y y是一个随机变量,其期望值等于 z ( h ) z(h) z(h),即:

E p ( y ) [ y ] = E p ( w ) [ z ( h ) + w ] = z ( h ) , (11.4) \mathbb{E}_{p(y)}[y]=\mathbb{E}_{p(w)}[z(h)+w]=z(h), \tag{11.4} Ep(y)​[y]=Ep(w)​[z(h)+w]=z(h),(11.4)

其中 p ( y ) p(y) p(y)表示噪声测量的概率密度函数。经典的SA算法迭代了以下更新规则

h k + 1 = h k + α k y k , (11.5) h_{k+1}=h_{k}+\alpha_{k} y_{k}, \tag{11.5} hk+1​=hk​+αk​yk​,(11.5)
其中 y k y_{k} yk​ 是函数 z z z的噪声度量。在一些适当的条件下,SA算法会收敛到 z ( h ) z(h) z(h)的根。

SA的一个特别有趣的变化涉及到固定点算法。让 T : R K → R K \mathbf{T}: \mathbb{R}^{K} \rightarrow \mathbb{R}^{K} T:RK→RK 是 R K \mathbb{R}^{K} RK上的一个收缩,有一个唯一的固定点,即 T ( h ) = h \mathrm{T}(h)=h T(h)=h。 T \mathrm{T} T的唯一固定点可以被描述为以下自映射的根

z T ( h ) : = T ( h ) − h . (11.6) z_{\mathrm{T}}(h):=\mathrm{T}(h)-h . \tag{11.6} zT​(h):=T(h)−h.(11.6)

同样地,当收缩 T \mathbf{T} T被假定为不可获得时,有一些 “噪音测量”
y T = z T ( h ) + w , (11.7) y_{\mathrm{T}}=z_{\mathrm{T}}(h)+w, \tag{11.7} yT​=zT​(h)+w,(11.7)

我们最终得到以下SA算法
h k + 1 = h k + α k y T ( k ) (11.8) h_{k+1}=h_{k}+\alpha_{k} y_{\mathrm{T}}^{(k)} \tag{11.8} hk+1​=hk​+αk​yT(k)​(11.8)

其中 y T ( k ) y_{\mathrm{T}}^{(k)} yT(k)​是函数 z T z_{\mathrm{T}} zT​的噪声测量。

11.1.1 用线性方程近似来理解TD

让我们回顾一下,对于一个给定的策略 π \pi π,投影贝尔曼算子的固定点属性为
Φ ⊤ h = Π π T π Φ ⊤ h . (11.9) \Phi^{\top} h=\Pi_{\pi} \mathrm{T}_{\pi} \Phi^{\top} h . \tag{11.9} Φ⊤h=Ππ​Tπ​Φ⊤h.(11.9)

由于特征矩阵 Φ ∈ R m × K \Phi \in \mathbb{R}^{m \times K} Φ∈Rm×K被假定为具有完整的行秩,很明显,在上述方程的两边从左边乘以 Φ Ξ π \Phi \Xi_{\pi} ΦΞπ​并不改变其解,即
Φ Ξ π Φ ⊤ h = Φ Ξ π Π π T π Φ ⊤ h . (11.10) \Phi \Xi_{\pi} \Phi^{\top} h=\Phi \Xi_{\pi} \Pi_{\pi} \mathrm{T}_{\pi} \Phi^{\top} h . \tag{11.10} ΦΞπ​Φ⊤h=ΦΞπ​Ππ​Tπ​Φ⊤h.(11.10)

让我们回顾一下投影的定义
Π π ( J ) : = Φ ⊤ ( Φ Ξ π Φ ⊤ ) − 1 Φ Ξ π J , (11.11) \Pi_{\pi}(J):=\Phi^{\top}\left(\Phi \Xi_{\pi} \Phi^{\top}\right)^{-1} \Phi \Xi_{\pi} J, \tag{11.11} Ππ​(J):=Φ⊤(ΦΞπ​Φ⊤)−1ΦΞπ​J,(11.11)

然后我们得到
Φ Ξ π Φ ⊤ h = Φ Ξ π T π Φ ⊤ h , (11.12) \Phi \Xi_{\pi} \Phi^{\top} h=\Phi \Xi_{\pi} \mathrm{T}_{\pi} \Phi^{\top} h, \tag{11.12} ΦΞπ​Φ⊤h=ΦΞπ​Tπ​Φ⊤h,(11.12)

并定义以下自映射的寻根问题
z 0 ( h ) : R m → R m z 0 ( h ) : = Φ Ξ π T π Φ ⊤ h − Φ Ξ π Φ ⊤ h . (11.13) \begin{aligned} z_{0}(h): \mathbb{R}^{m} & \rightarrow \mathbb{R}^{m} \\ z_{0}(h) &:=\Phi \Xi_{\pi} \mathrm{T}_{\pi} \Phi^{\top} h-\Phi \Xi_{\pi} \Phi^{\top} h . \end{aligned} \tag{11.13} z0​(h):Rmz0​(h)​→Rm:=ΦΞπ​Tπ​Φ⊤h−ΦΞπ​Φ⊤h.​(11.13)

更具体地说,自映射 z T π z_{\mathrm{T}_{\pi}} zTπ​​的计算方法是
z 0 ( h ) : = E p π ( x ′ ∣ x ) [ ( g ( x , u , x ′ ) + γ h ⊤ ϕ ( x ′ ) − h ⊤ ϕ ( x ) ) ϕ ( x ) ] . (11.14) z_{0}(h):=\mathbb{E}_{p_{\pi}\left(x^{\prime} \mid x\right)}\left[\left(g\left(x, u, x^{\prime}\right)+\gamma h^{\top} \phi\left(x^{\prime}\right)-h^{\top} \phi(x)\right) \phi(x)\right] . \tag{11.14} z0​(h):=Epπ​(x′∣x)​[(g(x,u,x′)+γh⊤ϕ(x′)−h⊤ϕ(x))ϕ(x)].(11.14)

一个解决寻根问题的SA算法 z T π ( h ) z_{\mathrm{T}_{\pi}}(h) zTπ​​(h)给出如下
h k + 1 = h k + α k ( g ( x k , u k , x k ′ ) + γ h k ⊤ ϕ ( x k ′ ) − h k ⊤ ϕ ( x k ) ) ϕ ( x k ) , (11.15) h_{k+1}=h_{k}+\alpha_{k}\left(g\left(x_{k}, u_{k}, x_{k}^{\prime}\right)+\gamma h_{k}^{\top} \phi\left(x_{k}^{\prime}\right)-h_{k}^{\top} \phi\left(x_{k}\right)\right) \phi\left(x_{k}\right), \tag{11.15} hk+1​=hk​+αk​(g(xk​,uk​,xk′​)+γhk⊤​ϕ(xk′​)−hk⊤​ϕ(xk​))ϕ(xk​),(11.15)

这是带LFA的TD学习算法的原始形式,见算法14。

在这里插入图片描述
注意,如果 Φ = I K \Phi=I_{K} Φ=IK​,即特征矩阵是 K K K维的单位矩阵,那么公式(11.1)中的更新规则就可以简单地归结为经典的TD ( 0 ) (0) (0)算法。最后,带LFA的 T D ( 0 ) \mathrm{TD}(0) TD(0)学习算法的收敛特性直接来自SA的收敛理论。更多的细节和讨论将在第11.2节给出。

Theorem 11.1 TD ⁡ ( 0 ) \operatorname{TD}(0) TD(0)与LFA的收敛性 (Convergence of TD ⁡ ( 0 ) \operatorname{TD}(0) TD(0) with LFA)

给出一个无限范围的MDP { X , U , p , g , γ } \{\mathcal{X}, \mathcal{U}, p, g, \gamma\} {X,U,p,g,γ},并让步长 α k \alpha_{k} αk​满足Robbins-Monro条件。那么,由带LFA的TD ( 0 ) (0) (0)学习算法产生的向量 h k h_{k} hk​以1的概率收敛于投影贝尔曼算子的固定点。

11.1.2 带有线性方程近似的资格迹

作为LFA的一个有趣的副作用,TD ( 0 ) (0) (0)学习算法有更好的机会来避免更新的局部性,因为权重向量 h h h对所有状态都是普遍更新的。在本小节中,我们旨在将资格迹的概念扩展到LFA。让我们回顾一下公式(5.10)中定义的 λ \lambda λ-几何平均贝尔曼算子,我们给出以下结果,无需证明。

Proposition 11.1

给出一个无限范围的 M D P { X , U , p , g , γ } M D P\{\mathcal{X}, \mathcal{U}, p, g, \gamma\} MDP{X,U,p,g,γ},以及一个固定的策略 π \pi π。投射的 λ \lambda λ几何平均贝尔曼算子 Π π ∘ T π , λ ∞ \Pi_{\pi} \circ \mathrm{T}_{\pi, \lambda}^{\infty} Ππ​∘Tπ,λ∞​是模块 γ ( 1 − λ ) 1 − λ γ \frac{\gamma(1-\lambda)}{1-\lambda \gamma} 1−λγγ(1−λ)​相对于 ξ \xi ξ加权范数的收缩。

我们应用与第11.1节相同的技巧来构造以下的寻根问题
z λ ( h ) : = Φ Ξ T π , λ ∞ Φ ⊤ h − Φ Ξ Φ ⊤ h = 0 (11.16) z_{\lambda}(h):=\Phi \Xi T_{\pi, \lambda}^{\infty} \Phi^{\top} h-\Phi \Xi \Phi^{\top} h=0 \tag{11.16} zλ​(h):=ΦΞTπ,λ∞​Φ⊤h−ΦΞΦ⊤h=0(11.16)

经验平均数的计算导致了
Φ Ξ T π , λ ∞ Φ ⊤ h − Φ Ξ Φ ⊤ h ≈ 1 k + 1 ∑ t = 0 k ϕ ( x t ) ∑ m = t k γ m − t λ m − t δ ( x m , u m , x m + 1 ) = 1 k + 1 ∑ t = 0 k ∑ m = t k γ m − t λ m − t ϕ ( x t ) δ ( x m , u m , x m + 1 ) = 1 k + 1 ∑ m = 0 k ∑ t = 0 m γ m − t λ m − t ϕ ( x t ) δ ( x m , u m , x m + 1 ) = 1 k + 1 ∑ m = 0 k δ ( x m , u m , x m + 1 ) ∑ t = 0 m γ m − t λ m − t ϕ ( x t ) . (11.17) \begin{aligned} \Phi \Xi T_{\pi, \lambda}^{\infty} \Phi^{\top} h-\Phi \Xi \Phi^{\top} h & \approx \frac{1}{k+1} \sum_{t=0}^{k} \phi\left(x_{t}\right) \sum_{m=t}^{k} \gamma^{m-t} \lambda^{m-t} \delta\left(x_{m}, u_{m}, x_{m+1}\right) \\ &=\frac{1}{k+1} \sum_{t=0}^{k} \sum_{m=t}^{k} \gamma^{m-t} \lambda^{m-t} \phi\left(x_{t}\right) \delta\left(x_{m}, u_{m}, x_{m+1}\right) \\ &=\frac{1}{k+1} \sum_{m=0}^{k} \sum_{t=0}^{m} \gamma^{m-t} \lambda^{m-t} \phi\left(x_{t}\right) \delta\left(x_{m}, u_{m}, x_{m+1}\right) \\ &=\frac{1}{k+1} \sum_{m=0}^{k} \delta\left(x_{m}, u_{m}, x_{m+1}\right) \sum_{t=0}^{m} \gamma^{m-t} \lambda^{m-t} \phi\left(x_{t}\right) . \end{aligned} \tag{11.17} ΦΞTπ,λ∞​Φ⊤h−ΦΞΦ⊤h​≈k+11​t=0∑k​ϕ(xt​)m=t∑k​γm−tλm−tδ(xm​,um​,xm+1​)=k+11​t=0∑k​m=t∑k​γm−tλm−tϕ(xt​)δ(xm​,um​,xm+1​)=k+11​m=0∑k​t=0∑m​γm−tλm−tϕ(xt​)δ(xm​,um​,xm+1​)=k+11​m=0∑k​δ(xm​,um​,xm+1​)t=0∑m​γm−tλm−tϕ(xt​).​(11.17)

这里的诀窍是,计算总和时要用 0 ≤ t ≤ m ≤ k . 0\leq t\leq m\leq k. 0≤t≤m≤k.,显然,第三个总和与第二个总和是完全相同的数量,但样本的枚举不同。让指数 k k k变成无穷大。那么很明显,对于每个采样段,向量
ε = lim ⁡ m → ∞ ∑ t = 0 m γ m − t λ m − t ϕ ( x t ) (11.18) \varepsilon=\lim _{m \rightarrow \infty} \sum_{t=0}^{m} \gamma^{m-t} \lambda^{m-t} \phi\left(x_{t}\right) \tag{11.18} ε=m→∞lim​t=0∑m​γm−tλm−tϕ(xt​)(11.18)

与所访问的状态无关,但只与时间有关。很容易看出,特征的总和可以用样本,即资格迹向量有效地计算出来。显然,在互动进行时,资格迹是打折的特征向量之和。因此,我们定义

ϵ k + 1 : = ϕ ( x k ) + λ γ ϵ k . (11.19) \epsilon_{k+1}:=\phi\left(x_{k}\right)+\lambda \gamma \epsilon_{k} . \tag{11.19} ϵk+1​:=ϕ(xk​)+λγϵk​.(11.19)
因此,使用LFA的 TD ⁡ ( λ ) \operatorname{TD}(\lambda) TD(λ)学习更新被给出为

h k + 1 = h k + α k ( g ( x k , u k , x k ′ ) + γ h k ⊤ ϕ ( x k ′ ) − h k ⊤ ϕ ( x k ) ) ϵ k + 1 . (11.20) h_{k+1}=h_{k}+\alpha_{k}\left(g\left(x_{k}, u_{k}, x_{k}^{\prime}\right)+\gamma h_{k}^{\top} \phi\left(x_{k}^{\prime}\right)-h_{k}^{\top} \phi\left(x_{k}\right)\right) \epsilon_{k+1} . \tag{11.20} hk+1​=hk​+αk​(g(xk​,uk​,xk′​)+γhk⊤​ϕ(xk′​)−hk⊤​ϕ(xk​))ϵk+1​.(11.20)

关于算法的更多细节在算法15中给出。
在这里插入图片描述

如果 λ = 0 \lambda=0 λ=0,用LFA的 TD ⁡ ( λ ) \operatorname{TD}(\lambda) TD(λ)学习更新就简单地退化为经典的 T D ( 0 ) \mathrm{TD}(0) TD(0)更新,如公式(11.1)。最后,我们在下面的proposition中提出了经典收敛特性。

Theorem 11.2 T D ( λ ) \mathrm{TD}(\lambda) TD(λ)的收敛性与LFA (Convergence of T D ( λ ) \mathrm{TD}(\lambda) TD(λ) with LFA)

给出一个无限范围的 M D P { X , U , p , g , γ } M D P\{\mathcal{X}, \mathcal{U}, p, g, \gamma\} MDP{X,U,p,g,γ},以及一个固定的策略 π \pi π。让步长 α k \alpha_{k} αk​满足Robbins-Monro条件。然后,由 T D ( λ ) T D(\lambda) TD(λ)精益算法产生的矢量 h k h_{k} hk​在 L F A L F A LFA的情况下收敛于投影 λ \lambda λ-几何平均Bellman算子的固定点 Π π ∘ T π , λ ∞ \Pi_{\pi} \circ \mathrm{T}_{\pi, \lambda}^{\infty} Ππ​∘Tπ,λ∞​ 的概率为1。

11.2 TD学习的收敛性 (Convergence of TD Learning)

在上一章中,我们介绍了TD学习的概念及其对资格迹的扩展,即多步TD学习。尽管这种发展的背后是启发式的,但所有这些算法最终都被证明是渐进地收敛于它们的期望解。在分析TD算法的收敛特性方面的主要发展是基于随机近似理论,这最初是由Robbins和Monro提出的。在这一节中,我们提出了一个通用框架,该框架已经开发出来,可以用来研究TD学习算法系列的收敛特性。

我们采用一种随机过程的形式,以及它的收敛特性。具体来说,我们关注有限集 X \mathcal{X} X上的随机迭代过程,构造如下
Δ k + 1 ( x ) = ( 1 − α k ( x ) ) Δ k ( x ) + α k ( x ) R k ( x ) (11.21) \Delta_{k+1}(x)=\left(1-\alpha_{k}(x)\right) \Delta_{k}(x)+\alpha_{k}(x) R_{k}(x) \tag{11.21} Δk+1​(x)=(1−αk​(x))Δk​(x)+αk​(x)Rk​(x)(11.21)

其中, x ∈ X x\in \mathcal{X} x∈X中, Δ k + 1 ( x ) ∈ R m \Delta_{k+1}(x)\in \mathbb{R}^{m} Δk+1​(x)∈Rm。让我们定义

R k = { x 1 , α 1 ( x 1 ) , R 1 ( x 1 ) , … , x k , α 1 ( x k ) } (11.22) \mathcal{R}_{k}=\left\{x_{1}, \alpha_{1}\left(x_{1}\right), R_{1}\left(x_{1}\right), \ldots, x_{k}, \alpha_{1}\left(x_{k}\right)\right\} \tag{11.22} Rk​={x1​,α1​(x1​),R1​(x1​),…,xk​,α1​(xk​)}(11.22)

作为截至步骤 k k k的随机迭代过程的历史。该随机迭代过程的收敛特性在以下定理中给出。

Theorem 11.3

在以下假设下,公式(11.21)中定义的随机迭代过程以概率1收敛到零。
(1) ∑ k = 1 ∞ α k ( x ) = ∞ \sum_{k=1}^{\infty} \alpha_{k}(x)=\infty ∑k=1∞​αk​(x)=∞, and ∑ k = 1 ∞ ( α k ( x ) ) 2 < ∞ \sum_{k=1}^{\infty}\left(\alpha_{k}(x)\right)^{2}<\infty ∑k=1∞​(αk​(x))2<∞

(2) ∥ E [ R k ( x ) ∣ R k ] ∥ W ≤ γ ∥ Δ k ∥ W \left\|\mathbb{E}\left[R_{k}(x) \mid \mathcal{R}_{k}\right]\right\|_{W} \leq \gamma\left\|\Delta_{k}\right\|_{W} ∥E[Rk​(x)∣Rk​]∥W​≤γ∥Δk​∥W​ with γ < 1 \gamma<1 γ<1

(3) var ⁡ [ R k ( x ) ∣ R k ] ≤ C ( 1 + ∥ Δ k ∥ W 2 ) \operatorname{var}\left[R_{k}(x) \mid \mathcal{R}_{k}\right] \leq C\left(1+\left\|\Delta_{k}\right\|_{W}^{2}\right) var[Rk​(x)∣Rk​]≤C(1+∥Δk​∥W2​) with C > 0 C>0 C>0

这里, ∥ Δ k ∥ W \left\|\Delta_{k}\right\|_{W} ∥Δk​∥W​表示一些适当的范数。

Remark 11.1. 这个结果可以应用于大多数同时具有表格特征或LFA的TD学习算法。在本节的其余部分,我们将证明该定理以显示 Q Q Q学习算法的渐进收敛特性。

简而言之,算法12中所示的 Q Q Q学习算法的渐进收敛特性在以下命题中给出。

Proposition 11.2

给定一个无限范围的MDP { X , U , p , g , γ } \{\mathcal{X}, \mathcal{U}, p, g, \gamma\} {X,U,p,g,γ},只要学习率满足Robbins-Monro条件, Q Q Q学习算法就会收敛到最优状态-行动价值函数 Q ∗ Q^{*} Q∗。

Proof.
让我们把 Q Q Q学习算法的更新规则改写为

Q k + 1 ( x k , u k ) = ( 1 − α k ( x k , u k ) ) Q k ( x k , u k ) + α k ( x k , u k ) ( g ( x k , u k , x k ′ ) + γ min ⁡ u k ′ Q k ( x k ′ , u k ′ ) ) (11.23) \begin{aligned} Q_{k+1}\left(x_{k}, u_{k}\right)=(1-&\left.\alpha_{k}\left(x_{k}, u_{k}\right)\right) Q_{k}\left(x_{k}, u_{k}\right)+\\ & \alpha_{k}\left(x_{k}, u_{k}\right)\left(g\left(x_{k}, u_{k}, x_{k}^{\prime}\right)+\gamma \min _{u_{k}^{\prime}} Q_{k}\left(x_{k}^{\prime}, u_{k}^{\prime}\right)\right) \end{aligned} \tag{11.23} Qk+1​(xk​,uk​)=(1−​αk​(xk​,uk​))Qk​(xk​,uk​)+αk​(xk​,uk​)(g(xk​,uk​,xk′​)+γuk′​min​Qk​(xk′​,uk′​))​(11.23)

我们从方程两边减去项 Q ∗ ( x t , u t ) Q^{*}\left(x_{t}, u_{t}\right) Q∗(xt​,ut​),然后定义
Δ k ( x , u ) : = Q k ( x , u ) − Q ∗ ( x , u ) (11.24) \Delta_{k}(x, u):=Q_{k}(x, u)-Q^{*}(x, u) \tag{11.24} Δk​(x,u):=Qk​(x,u)−Q∗(x,u)(11.24)

R k ( x , u ) : = g ( x , u , x ′ ) + γ min ⁡ u ′ Q k ( x ′ , u ′ ) − Q ∗ ( x , u ) (11.25) R_{k}(x, u):=g\left(x, u, x^{\prime}\right)+\gamma \min _{u^{\prime}} Q_{k}\left(x^{\prime}, u^{\prime}\right)-Q^{*}(x, u) \tag{11.25} Rk​(x,u):=g(x,u,x′)+γu′min​Qk​(x′,u′)−Q∗(x,u)(11.25)

显然,我们有

Δ k + 1 ( x k , u k ) = ( 1 − α k ( x k , u k ) ) Δ k ( x k , u k ) + α k ( x k , u k ) R k ( x k , u k ) (11.26) \Delta_{k+1}\left(x_{k}, u_{k}\right)=\left(1-\alpha_{k}\left(x_{k}, u_{k}\right)\right) \Delta_{k}\left(x_{k}, u_{k}\right)+\alpha_{k}\left(x_{k}, u_{k}\right) R_{k}\left(x_{k}, u_{k}\right) \tag{11.26} Δk+1​(xk​,uk​)=(1−αk​(xk​,uk​))Δk​(xk​,uk​)+αk​(xk​,uk​)Rk​(xk​,uk​)(11.26)

这正是我们感兴趣的随机迭代过程。

现在,让 x ′ ∈ X x^{\prime}\in \mathcal{X} x′∈X是一个从MDP模型中得到的随机抽样状态。然后,我们计算

E [ R k ( x , u ) ∣ R k ] = E p ( x ′ ) [ g ( x , u , x ′ ) + γ min ⁡ u ′ Q k ( x ′ , u ′ ) − Q ∗ ( x , u ) ] = H g Q k ( x , u ) − Q ∗ ( x , u ) (11.27) \begin{aligned} \mathbb{E}\left[R_{k}(x, u) \mid \mathcal{R}_{k}\right] &=\mathbb{E}_{p\left(x^{\prime}\right)}\left[g\left(x, u, x^{\prime}\right)+\gamma \min _{u^{\prime}} Q_{k}\left(x^{\prime}, u^{\prime}\right)-Q^{*}(x, u)\right] \\ &=\mathrm{H}_{\mathfrak{g}} Q_{k}(x, u)-Q^{*}(x, u) \end{aligned} \tag{11.27} E[Rk​(x,u)∣Rk​]​=Ep(x′)​[g(x,u,x′)+γu′min​Qk​(x′,u′)−Q∗(x,u)]=Hg​Qk​(x,u)−Q∗(x,u)​(11.27)

根据最优状态行动贝尔曼算子的固定点属性,即 H g Q ∗ = Q ∗ \mathrm{H}_{\mathfrak{g}} Q^{*}=Q^{*} Hg​Q∗=Q∗的固定点属性,我们有

∥ E [ R k ( x , u ) ∣ R k ] ∥ ∞ = ∥ H g Q k ( x , u ) − H g Q ∗ ( x , u ) ∥ ∞ ≤ ∥ H g Q k − H g Q ∗ ∥ ∞ ≤ γ ∥ Q k − Q ∗ ∥ ∞ = γ ∥ Δ k ∥ ∞ (11.28) \begin{aligned} \left\|\mathbb{E}\left[R_{k}(x, u) \mid \mathcal{R}_{k}\right]\right\|_{\infty} &=\left\|\mathrm{H}_{\mathfrak{g}} Q_{k}(x, u)-\mathrm{H}_{\mathfrak{g}} Q^{*}(x, u)\right\|_{\infty} \\ & \leq\left\|\mathrm{H}_{\mathfrak{g}} Q_{k}-\mathrm{H}_{\mathfrak{g}} Q^{*}\right\|_{\infty} \\ & \leq \gamma\left\|Q_{k}-Q^{*}\right\|_{\infty} \\ &=\gamma\left\|\Delta_{k}\right\|_{\infty} \end{aligned} \tag{11.28} ∥E[Rk​(x,u)∣Rk​]∥∞​​=∥Hg​Qk​(x,u)−Hg​Q∗(x,u)∥∞​≤∥Hg​Qk​−Hg​Q∗∥∞​≤γ∥Qk​−Q∗∥∞​=γ∥Δk​∥∞​​(11.28)

其中满足Theorem 11.3中的条件(2)。

最后,我们得到

var ⁡ [ R k ( x , u ) ∣ R k ] = E p ( x ′ ) [ ( R k ( x , u ) − H g Q k ( x , u ) + Q ∗ ( x , u ) ) 2 ] = E p ( x ′ ) [ ( g ( x , u , x ′ ) + γ min ⁡ u ′ Q k ( x ′ , u ′ ) − H g Q k ( x , u ) ) 2 ] = var ⁡ [ g ( x , u , x ′ ) + γ min ⁡ u ′ Q k ( x ′ , u ′ ) ∣ R k ] (11.29) \begin{aligned} \operatorname{var}\left[R_{k}(x, u) \mid \mathcal{R}_{k}\right] &=\mathbb{E}_{p\left(x^{\prime}\right)}\left[\left(R_{k}(x, u)-\mathrm{H}_{\mathfrak{g}} Q_{k}(x, u)+Q^{*}(x, u)\right)^{2}\right] \\ &=\mathbb{E}_{p\left(x^{\prime}\right)}\left[\left(g\left(x, u, x^{\prime}\right)+\gamma \min _{u^{\prime}} Q_{k}\left(x^{\prime}, u^{\prime}\right)-\mathrm{H}_{\mathfrak{g}} Q_{k}(x, u)\right)^{2}\right] \\ &=\operatorname{var}\left[g\left(x, u, x^{\prime}\right)+\gamma \min _{u^{\prime}} Q_{k}\left(x^{\prime}, u^{\prime}\right) \mid \mathcal{R}_{k}\right] \end{aligned} \tag{11.29} var[Rk​(x,u)∣Rk​]​=Ep(x′)​[(Rk​(x,u)−Hg​Qk​(x,u)+Q∗(x,u))2]=Ep(x′)​[(g(x,u,x′)+γu′min​Qk​(x′,u′)−Hg​Qk​(x,u))2]=var[g(x,u,x′)+γu′min​Qk​(x′,u′)∣Rk​]​(11.29)

由于成本 g g g和 Q Q Q函数都是有界的,定理 11.3 11.3 11.3中的条件(3)也得到满足。因此,应用定理 11.3 11.3 11.3就完成了证明。

11.3 实例: 带有资格迹的 TD ( λ ) \text{TD}(\lambda) TD(λ)

如下图所示,一个基准环境是一个有11个状态和一个障碍物的网格。智能体从左下角的 "开始 "状态出发,停在两个终端状态。
在这里插入图片描述

有四个可用的动作:上、下、左、右。每个动作都是随机的,一步的概率为0.8,两步的概率为0.2,都是期望的方向。所有转换的局部成本为0.04,终端状态的局部成本为 ± 1 ±1 ±1。

Task 1: 给定一个确定的策略,对于所有状态应用 TD ( λ ) \text{TD}(\lambda) TD(λ)。
Task 2: 给定一个随机生成的特征 Φ \Phi Φ, 对于所有状态应用带有线性方程近似的 TD ( λ ) \text{TD}(\lambda) TD(λ)。

11.3.1 TD ( λ ) \text{TD}(\lambda) TD(λ)

from operator import xor
import random
import numpy as np

class GridWorld:
    def __init__(self, width=4, height=3, obstacle=[(1,1)]):
        self.width = width
        self.height = height

        self.obstacle = obstacle
        self.terminal = [(0, width-1), (1, width-1)]  # the terminal states are always at right top

        self.row = height - 1  # the start point is always at left bottom
        self.col = 0

        # define the MDP
        self.actions = self.act_space()
        self.states = set(self.actions.keys()) | set(self.terminal)
        self.J = self.init_J()
        self.local_cost = 0.04


    def act_space(self):
        act_space = {}

        for row in range(self.height):
            for col in range(self.width):
                possible_acts = []
                if (row, col) not in self.obstacle + self.terminal:
                    if row - 1 >= 0 and (row-1, col) not in self.obstacle:
                        possible_acts.append('U')
                    if row + 1 < self.height and (row+1, col) not in self.obstacle:
                        possible_acts.append('D')
                    if col - 1 >=0 and (row, col-1) not in self.obstacle:
                        possible_acts.append('L')
                    if col + 1 < self.width and (row, col+1) not in self.obstacle:
                        possible_acts.append('R')
                    act_space[(row, col)] = possible_acts
        return act_space

    def init_J(self, init_J_value=0):
        J = {}
        for row in range(self.height):
            for col in range(self.width):
                if (row, col) not in self.obstacle + self.terminal:
                    J[(row, col)] = init_J_value
        J[self.terminal[0]] = -1  # J(x_N) = g(x_N)
        J[self.terminal[1]] = +1
        return J

    def move(self, action, deterministic=False):
        # check if legal move first
        if action in self.actions[(self.row, self.col)]:
            if action == 'U':
                # probablistic transition
                if deterministic or random.uniform(0,1) > 0.8 or (self.row-2, self.col) not in self.states:
                    self.row -= 1
                else:
                    self.row -= 2
            elif action == 'D':
                if deterministic or random.uniform(0,1) > 0.8 or (self.row+2, self.col) not in self.states:
                    self.row += 1
                else:
                    self.row += 2
            elif action == 'R':
                if deterministic or random.uniform(0,1) > 0.8 or (self.row, self.col+2) not in self.states:
                    self.col += 1
                else:
                    self.col += 2
            elif action == 'L':
                if deterministic or random.uniform(0,1) > 0.8 or (self.row, self.col-2) not in self.states:
                    self.col -= 1
                else:
                    self.col -= 2

        if (self.row, self.col) == self.terminal[0]:
            return -1
        elif (self.row, self.col) == self.terminal[1]:
            return +1
        else:
            return self.local_cost

    def set_state(self, s):
        self.row = s[0]
        self.col = s[1]

    def current_state(self):
        return (self.row, self.col)

    def game_over(self):
        return (self.row, self.col) not in self.actions

    def print_J(self):
        for row in range(self.height):
            print("---------------------------")
            for col in range(self.width):
                J = env.J.get((row, col), 0)
                if J >= 0:
                    print(" %.2f|" % J, end="")
                else:
                    print("%.2f|" % J, end="")
            print("")
        print("---------------------------")


## Task 1: TD(lambda)
# %% TD

def play_game(grid, policy):
    start_states = list(grid.actions.keys())
    start_idx = np.random.choice(len(start_states))
    grid.set_state(start_states[start_idx])

    # generate traj
    x = grid.current_state()
    traj = [(x,0)]
    while not grid.game_over():
        u = policy[x]
        g = grid.move(u)
        x = grid.current_state()
        traj.append((x, g))  # save the trajectory
    return traj

# define the constants
gamma = 0.9
alpha = 0.1
lmbda = 0.5

env = GridWorld()

policy = {
    (2, 0): 'U',
    (1, 0): 'U',
    (0, 0): 'R',
    (0, 1): 'R',
    (0, 2): 'R',
    (1, 2): 'R',
    (2, 1): 'R',
    (2, 2): 'R',
    (2, 3): 'U',
}

for _ in range(200):
    # get the random trajectory from the policy
    traj_all = play_game(env, policy)

    # updates the total cost for each state included by the trajectory
    for idx in range(len(traj_all) - 1):
        # get current state and the successive state as well as the state cost
        x, _ = traj_all[idx]
        x_, g = traj_all[idx+1]

        # Compute the TD error of the current state
        TD_err = g + gamma * env.J[x_] - env.J[x]

        # get the eligibility trace, i.e. trajectory until state x
        e_trace = traj_all[:idx+1]

        # update the total cost for each former state
        for e_idx in range(len(e_trace)):
            x_e_trace, _ = e_trace[e_idx]
            e_x = (gamma * lmbda) ** (idx - e_idx)
            env.J[x_e_trace] = env.J[x_e_trace] + alpha * e_x * TD_err

print("\nTotal cost by TD(lambda)")
env.print_J()

输出为


Total cost by TD(lambda)
---------------------------
-1.63|-1.72|-1.90|-1.00|
---------------------------
-1.29| 0.00| 1.71| 1.00|
---------------------------
-1.13|-0.51|-0.48|-0.63|
---------------------------

11.3.2 TD ( λ ) \text{TD}(\lambda) TD(λ) with LFA


## Task 2: TD(lambda) with LFA
m = 7
K = len(env.states)

Phi = np.random.rand(m, K)  # Feature matrix
h = np.random.rand(m, 1)  # weight vector

# build the state index to retrieve the corresponding feature matrix
state_idx = {}
i = 0
for key in env.states:
    state_idx[key] = i
    i += 1

# initial the world
env = GridWorld()

# TD-lambda
for _ in range(200):
    traj_all = play_game(env, policy)
    for idx in range(len(traj_all)-1):
        # get current state and the successive state as well as the state cost
        x, _ = traj_all[idx]
        x_, g = traj_all[idx+1]

        # compute TD error delta
        delta = g + gamma * h.T @ Phi[:, state_idx[x_]] - h.T @ Phi[:, state_idx[x]]

        # get the eligibility trace, i.e. trajectory until state x
        e_trace_traj = traj_all[:idx+1]
        e_vector = 0
        for e_idx in range(idx+1):
            x_idx, _ = e_trace_traj[e_idx]

            # update the eligibility vector
            e_vector = Phi[:, state_idx[x]] + lmbda * gamma * e_vector

            # update the weight
            h = h + alpha * delta[0] * e_vector.reshape(m,1)

J_pi = Phi.T @ h

for key in state_idx:
    env.J[key] = J_pi[state_idx[key]]

# reset the terminal state
env.J[(0,3)] = -1
env.J[(1,3)] = 1

print("\nTotal cost by TD lambda with LFA")
env.print_J()

输出为


Total cost by TD lambda with LFA
---------------------------
-1.79|-2.31|-2.19|-1.00|
---------------------------
-0.94| 0.00| 0.70| 1.00|
---------------------------
-0.92| 0.06|-1.36|-1.13|
---------------------------

Process finished with exit code 0

标签:11,Phi,right,Theory,self,Note,TD,lambda,left
来源: https://blog.csdn.net/qq_37266917/article/details/122660270