该书由清华大学李升波教授撰写的,主要面向工业控制领域的研究者和工程师,曾获得2024年度Springer中国新发展奖(China New Development Awards)。全书按照原理剖析、主流算法、典型示例的架构,系统地介绍了用于动态系统决策与控制的强化学习方法。全书共分为11章,内容涵盖了强化学习的基本概念、蒙特卡洛法、时序差分法、动态规划法、函数近似法、策略梯度法、近似动态规划、状态约束的处理和深度强化学习等知识点。书籍及源代码下载网站:书籍及代码链接点这里。
另外,由于本部分篇幅较长,因此分成两篇博客发表。另一篇博客的地址参考我的系列博客的地址汇总。
书籍链接:Reinforcement Learning for Sequential Decision and Optimal Control
本篇博客讲述ADP(Approximate Dynamic Programming)。ADP是最优控制与RL的集合。它适用于处理这样的问题:问题本身被建模为最优控制问题,系统的环境模型已知,但是如果直接使用最优控制的receding horizon control方法,需要在线计算,计算量大。因此,ADP尝试使用offline learning的方法来学习一个近似的最优控制器。ADP主要有两种主要类型,值迭代的ADP和策略迭代的ADP。
ADP的概念最早由Bellman等人提出,用于解决exact DP遭遇的维度灾难问题。二十世纪七十年代后期,Werbos提出将连续状态空间参数化,在参数空间中重新构建ADP问题。在二十世纪八十年代早期,Barto等人开始使用神经网络来近似ADP的actor和critic。在九十年代早期,基于模型的ADP与model-free的RL之间的联系逐渐变得明朗起来,ADP也因此取得了很大的发展,逐渐成为沟通最优控制与RL的桥梁。现在,ADP特指一种在确定性环境下工作,基于模型的RL方法,可以用来求解在非线性和有约束的环境中复杂的最优控制问题;可以实现较好的实时控制。
8.4 应用于追踪(Tracking)任务的ADP算法和它的策略结构
ADP和MPC都可以被视为一种求解通常的最优控制问题(OCP(的数值求解器。它们之间一个重要的区别在于怎么找到和应用最优策略。大多数的ADP算法是offline的,也就是说先在整个状态空间中进行离线的训练,之后就可以把训练好的策略视为一个最优控制器,来在online的快速给出最优动作。这样的offline的特点也使得ADP算算法具有很好的实时性。但是ADP算法常常会有一些performance loss,这是因为其策略通常是使用函数来近似的,那么如果函数本身的结构无法很好的近似我们的策略的话,就会出现上述情况。因此针对具体问题选择一个合适的策略结构是很重要的。
而MPC则是online的,它实时的计算一系列未来的最优策略,然后只执行第一个动作。这样很耗时间,但是好处是采取这样的控制策略得到的闭环策略与实际的开环的OCP的解是(几乎)一致的(除了一些可能的优化误差)。
8.4.1 Receding Horizon Control(RHC)中的两种时间域
最优追踪器包含了一系列控制任务,它的设计需要仔细地匹配问题定义和策略结构。为了不失一般性,我们定义一个标准的无限视野的(infinite-horizon)的追踪问题来比较不同的策略结构。我们下面引入Reciding Horizon Control(RHC)来更好地解释怎么为最优追踪器选择一个合适的策略结构。
尽管没有明确说明,但是实际上在RHC的视角下有两种时间域:real-time domain和virtual-time domain。如下图所示:
把这两种时间域区分开也可以为我们分析ADP提供一个新的视角,而这在之前的工作中几乎从未被提及。在ADP的框架下,我们可以把最优策略的训练视为在virtual-time domain中进行,而最优策略的应用视为在real-time domain中进行。
这样的视角可以帮助我们设计一个更高效的采样方式和更好的策略结构。
8.4.2 在Real-time Domain中定义的Tracking ADP
首先,我们来定义一个infinite-horizon的,在real-time domain中定义的cost function(也就是值函数,只不过这里我们要最小化):
V
(
x
t
,
X
R
)
=
∑
i
=
0
∞
l
(
x
t
+
i
R
−
x
t
+
i
,
u
t
+
i
)
,
V(x_{t},X^{R})=\sum_{i=0}^{\infty}l(x_{t+i}^{R}-x_{t+i},u_{t+i}),
V(xt,XR)=i=0∑∞l(xt+iR−xt+i,ut+i), 这里的t是real-time domain中的时间步,
X
R
=
{
x
t
R
,
x
t
+
1
R
,
⋯
,
x
∞
R
}
X^{R}=\{x_{t}^{R},x_{t+1}^{R},\cdots,x_{\infty}^{R}\}
XR={xtR,xt+1R,⋯,x∞R}的概念。这里的轨迹不仅包含位置信息,还包含时间信息。而我们通常所说的那种只包含位置信息的其实是路径(path)。因此才会在我们的参考轨迹
X
R
X^{R}
XR中看到带有时间下标的状态,可以简单理解为在参考轨迹上的每个点代表在每个时间点应该到达什么状态。这里我们的值函数的输入不再只有当前状态,还包含了参考轨迹。而且这里的utility function里通常应该是状态的的位置现在被替换为了当前状态与参考轨迹上的状态的差值
x
t
+
i
R
−
x
t
+
i
x_{t+i}^{R}-x_{t+i}
xt+iR−xt+i。
我们将开环的最优动作序列记为
{
u
t
∗
,
u
t
+
1
∗
,
⋯
,
u
∞
∗
}
\{u_t^*,u_{t+1}^*,\cdots,u_\infty^*\}
{ut∗,ut+1∗,⋯,u∞∗},那么根据这个最优的开环最优动作序列,可以得到cost function的最优值。那么开环的Bellman方程可以写成:
V
O
p
e
n
∗
(
x
t
,
X
R
)
=
min
u
{
l
(
x
t
R
−
x
t
,
u
)
+
V
O
p
e
n
∗
(
x
t
+
1
,
X
R
)
}
.
V_{\mathrm{Open}}^*(x_t,X^R)=\min_u\{l(x_t^R-x_t,u)+V_{\mathrm{Open}}^*(x_{t+1},X^R)\}.
VOpen∗(xt,XR)=umin{l(xtR−xt,u)+VOpen∗(xt+1,XR)}. 下面我们来考察一下策略的结构。实际上,有下面两种常见的策略结构:
u
t
=
π
(
x
t
,
x
t
R
)
,
u
t
=
φ
(
x
t
,
x
t
R
,
x
t
+
1
R
,
x
t
+
2
R
,
⋯
,
x
∞
R
)
.
u_{t}=\pi(x_{t},x_{t}^{R}),\\u_{t}=\varphi(x_{t},x_{t}^{R},x_{t+1}^{R},x_{t+2}^{R},\cdots,x_{\infty}^{R}).
ut=π(xt,xtR),ut=φ(xt,xtR,xt+1R,xt+2R,⋯,x∞R). 第一种策略的输入只有当前状态和参考轨迹上的当前参考点,而第二种策略的输入还包含了参考轨迹上的未来的所有参考点。那么,通过ADP的框架来最小化cost function,我们可以得到两种策略下的最优值函数
V
π
∗
(
x
)
V_{\pi}^{*}(x)\:
Vπ∗(x)和
V
φ
∗
(
x
)
\:V_{\varphi}^{*}(x)
Vφ∗(x)。实际上,第一种策略结构使用的最多。但是,这能否就能代表这第一种策略结构就是最优的呢?实际上并不是。因为
π
(
⋅
)
\pi(\cdot)
π(⋅)的结构十分受限,只有当前时间步的参考信息,不能很好的处理后续参考轨迹点。而
φ
(
⋅
)
\varphi(\cdot)
φ(⋅)才是理论上更好的选择,但是其受限于输入的高维度和训练的复杂度,因此难以广泛应用。
8.4.3 在Virtual-time Domain中重新定义的Tracking ADP
为了更好的理解之前我们说过的两种策略结构,我们需要把tracking这个在real-time中的OCP转换为一个在virtual-time中类似MPC的问题。注意,下面我们要从infinite-horizon的MPC角度来切入,虽然infinite-horizon的MPC在实际中不是很常用,但是他却与我们的ADP问题有着很大的联系。我们下面要把ADP写成一种infinite-horizon的MPC形式。根据我们下面的virtual-time的下标的不同,我们可以把重新构建的这个infinite-horizon的MPC问题分为两种情况:full-horizon追踪器和first-point追踪器。
在时间t(真实时间)时,full-horizon追踪器的目标函数可以写成:
J
M
P
C
φ
=
∑
i
=
0
∞
l
(
x
i
∣
t
R
−
x
i
∣
t
,
u
i
∣
t
)
,
J_{\mathrm{MPC}}^\varphi=\sum_{i=0}^\infty l(x_{i|t}^R-x_{i|t},u_{i|t}),
JMPCφ=i=0∑∞l(xi∣tR−xi∣t,ui∣t), 这里因为我们引入了virtual-time的概念,为了避免混淆,需要对于下面要用到的符号系统解释一下。我们用
(
i
∣
t
)
(i|t)
(i∣t)中的t表示实际的时间(real-time),而i表示虚拟的时间(virtual-time)。而上述求和式中涉及到的
χ
0
∣
t
R
,
χ
1
∣
t
R
,
⋯
,
χ
∞
∣
t
R
\chi_{0|t}^R,\chi_{1|t}^R,\cdots,\chi_{\infty|t}^R
χ0∣tR,χ1∣tR,⋯,χ∞∣tR是在当前真实时间t固定的条件下在virtual-time domain中的predicting horizon。这样子把真实时间和虚拟时间区分开来的做法为我们构建ADP追踪器提供了很大的灵活度。下面的问题就是
x
i
∣
t
R
x_{i|t}^R
xi∣tR到底等于什么。其实这里的定义方法不止一种,下面就将一种最常用的定义方法:
x
i
∣
t
R
=
x
t
+
i
R
,
i
∈
N
.
x_{i|t}^{R}=x_{t+i}^{R},i\in\mathbb{N}.
xi∣tR=xt+iR,i∈N. 这种定义方法实际上就是把从真实时间t开始的虚拟时间i等价为从t开始的真实时间。那么在最小化
J
M
P
C
φ
J_{\mathrm{MPC}}^\varphi
JMPCφ之后我们就可以得到一个full-horizon追踪器的最优策略:
u
(
t
)
=
φ
(
x
0
∣
t
,
x
0
∣
t
R
,
x
1
∣
t
R
,
⋯
,
x
∞
∣
t
R
)
,
u(t)=\varphi\big(x_{0|t},x_{0|t}^{R},x_{1|t}^{R},\cdots,x_{\infty|t}^{R}\big),
u(t)=φ(x0∣t,x0∣tR,x1∣tR,⋯,x∞∣tR), 当环境模型准确时,上述最优策略的开环控制最优性就等于原问题的闭环最优性。
下面我们来看看first-point追踪器。在时间t(真实时间)时,first-point追踪器的目标函数可以写成:
J
M
P
C
π
=
∑
i
=
0
∞
l
(
x
0
∣
t
R
−
x
i
∣
t
,
u
i
∣
t
)
J_{\mathrm{MPC}}^\pi=\sum_{i=0}^\infty l(x_{0|t}^R-x_{i|t},u_{i|t})
JMPCπ=i=0∑∞l(x0∣tR−xi∣t,ui∣t) 注意这里的
J
M
P
C
π
J_{\mathrm{MPC}}^\pi
JMPCπ和
J
M
P
C
φ
J_{\mathrm{MPC}}^\varphi
JMPCφ的区别在于,这里与
x
i
∣
t
x_{i|t}
xi∣t做差的不再是
x
i
∣
t
R
x_{i|t}^R
xi∣tR而是一个固定值
x
0
∣
t
R
x_{0|t}^R
x0∣tR。在我们上面
x
i
∣
t
R
=
x
t
+
i
R
,
i
∈
N
x_{i|t}^{R}=x_{t+i}^{R},i\in\mathbb{N}
xi∣tR=xt+iR,i∈N的设定下,这实际上就相当于拿t时刻的真实的轨迹上的值
x
t
R
x_t^R
xtR与
x
i
∣
t
x_{i|t}
xi∣t做差。这样其实就蕴含了一个重要的假设,即:
x
i
∣
t
R
=
x
0
∣
t
R
=
x
t
R
,
i
∈
N
.
x_{i|t}^R=x_{0|t}^R=x_t^R,i\in\mathbb{N}.
xi∣tR=x0∣tR=xtR,i∈N. 其实这里的
x
0
∣
t
R
x_{0|t}^R
x0∣tR的选择也不是唯一的,比如还可以令其等于
x
t
R
x_{t}^R
xtR的一个函数,只要令
x
0
∣
t
R
x_{0|t}^R
x0∣tR由
x
t
R
x_{t}^R
xtR唯一决定即可。通过最小化first-point追踪器的目标函数,我们可以得到一个first-point追踪器的最优策略:
u
(
t
)
=
π
(
x
0
∣
t
,
x
0
∣
t
R
)
.
u(t)=\pi\big(x_{0|t},x_{0|t}^{R}\big).
u(t)=π(x0∣t,x0∣tR).
容易想到,
π
\pi
π策略的最优性比
φ
\varphi
φ策略的最优性要差,因此也达不到开环控制下的最优值,即:
V
π
∗
(
x
)
≥
V
φ
∗
(
x
)
=
V
O
p
e
n
∗
(
x
)
,
∀
x
∈
X
V_{\pi}^{*}(x)\geq V_{\varphi}^{*}(x)=V_{\mathrm{Open}}^{*}(x),\forall x\in X
Vπ∗(x)≥Vφ∗(x)=VOpen∗(x),∀x∈X 这种最优性的丧失可以被理解为
π
\pi
π策略的结构受限(只有当前时间步的参考信息)。二者的比较可以由下图形象的表示:
或者我们再举一个更形象的例子。下面是一个自动驾驶汽车在拐弯处跟踪参考轨迹的例子。下图展示了某个真实时刻t时,汽车在virtual-time domain中的跟踪情况。其中蓝色的线代表参考轨迹,红色的线代表汽车的轨迹(在virtual-time domain中的轨迹)。
可以看出,左图(first-point追踪器)与右图(full-horizon追踪器)相比,跟踪效果有一定的损失。不过这在实际应用中是可以接受的,因为full-horizon追踪器的计算量太大。因此在实际应用中,我们通常会选择first-point追踪器,也可以使用下面的折中的改进办法。即我们不使用 ∞ \infty ∞-horizon,而改成有限的horizon,并在其中令 x i ∣ t R = x t + i R x_{i|t}^{R}=x_{t+i}^{R} xi∣tR=xt+iR。
8.4.4 以OCP的一个经典例子LQC为例来进行定量分析
Linear Quadratic Control(LQC)是一个经典的OCP问题。其实,LQC问题主要洋浦两类:LQ追踪器和LQ调节器(LQR)。它们的求解都是通过求解Riccati方程来得到最优的控制策略。对于LQ调节器来说,状态总是被要求保持在平衡态附近(通常是0);而对于LQ追踪器来说,状态则是被要求跟踪一个参考轨迹。实际上,在应用LQC时,上述两种不同的任务经常被搞混。大部分使用者也不会去区分最优的regulator和tracker之间的区别。一个常见的错误做法是把追踪误差当作一个新的“状态”来使用LQR来解决追踪问题。令人惊奇的是,这样一个“Fake Tracker”在实际应用竟然也能取得不错的效果。但是,就它优化的目标函数来看,得到的策略显然不是最优的。这也是工程中常见的理论上错误但是实际上却能取得不错效果的例子。但是,既然我们这节就是讲这个的,我们就来好好看一下LQ追踪器和LQ调节器到底有什么区别。
先来看看LQ追踪问题的cost function:
V
(
x
t
,
X
R
)
=
∑
i
=
t
T
(
(
x
i
R
−
x
i
)
T
Q
(
x
i
R
−
x
i
)
+
u
i
T
R
u
i
)
,
s.t.
χ
t
+
1
=
A
x
t
+
B
u
t
V(x_t,X^R)=\sum_{i=t}^T\bigl((x_i^R-x_i)^\mathrm{T}Q(x_i^R-x_i)+u_i^\mathrm{T}Ru_i\bigr),\\\text{s.t.}\\\chi_{t+1}=Ax_t+Bu_t
V(xt,XR)=i=t∑T((xiR−xi)TQ(xiR−xi)+uiTRui),s.t.χt+1=Axt+But 注意,这里有我们刚才在第8.4.2节中定义的目标函数的形式相比,区别在于这列我们既然已经明确了是线性结构,那么我们把
l
(
x
t
R
−
x
t
,
u
t
)
l(x_t^R-x_t,u_t)
l(xtR−xt,ut)具体化为了上述形式。并且我们把horizon从无穷改为了(T-t)。这里我们假设矩阵组合(A,B)是可控的,且系数矩阵
Q
≥
0
,
R
>
0
Q\ge 0,R>0
Q≥0,R>0。那么,我们可以得到LQ Tracking问题的的Bellman方程:
V
∗
(
x
t
,
X
R
)
=
min
u
{
(
x
t
R
−
x
t
)
T
Q
(
x
t
R
−
x
t
)
+
u
t
T
R
u
t
+
V
∗
(
x
t
+
1
,
X
R
)
}
V^{*}(x_{t},X^{R})=\min_{u}\{(x_{t}^{R}-x_{t})^{\mathrm{T}}Q(x_{t}^{R}-x_{t})+u_{t}^{\mathrm{T}}Ru_{t}+V^{*}(x_{t+1},X^{R})\}
V∗(xt,XR)=umin{(xtR−xt)TQ(xtR−xt)+utTRut+V∗(xt+1,XR)} 由LQC的相关知识可知,最优值函数
V
∗
(
x
t
,
X
R
)
V^{*}(x_{t},X^{R})
V∗(xt,XR)是一个二次型函数,可以写成如下形式:
V
∗
(
x
t
,
X
R
)
=
x
t
T
P
t
x
t
+
2
x
t
T
β
t
+
α
t
V^*(x_t,X^R)=x_t^\mathrm{T}P_tx_t+2x_t^\mathrm{T}\beta_t+\alpha_t
V∗(xt,XR)=xtTPtxt+2xtTβt+αt 这里的最优值函数里面包含三个系数:
P
t
,
β
t
,
α
t
P_t,\beta_t,\alpha_t
Pt,βt,αt。这三个系数里面嵌入了包含时间信息的参考轨迹信息。最优的策略也可用上述三个系数中的两个
P
t
,
β
t
P_t,\beta_t
Pt,βt来表示:
u
t
∗
=
−
R
−
1
B
T
(
P
t
+
1
x
t
+
1
+
β
t
+
1
)
u_t^*=-R^{-1}B^\mathrm{T}(P_{t+1}x_{t+1}+\beta_{t+1})
ut∗=−R−1BT(Pt+1xt+1+βt+1) 回顾之前在某篇博客的某处讲过的LQR的最优策略的形式,我们会发现区别就是多了一个前馈项
β
t
+
1
\beta_{t+1}
βt+1,它里面就包含了参考轨迹的信息。这也是LQ追踪器和LQ调节器的一个重要区别。站在更高的角度来看,LQR可以被视为LQ Tracking的一个特例,即参考轨迹是一个常数(通常为0)。下面我们需要关心的就是怎么在每一时刻求解该时刻对应的三个系数。可以通过被称为Differential Riccati Equation的方程来求解这三个系数:
P
t
=
Q
+
A
T
P
t
+
1
A
−
A
T
P
t
+
1
B
(
R
+
B
T
P
t
+
1
B
)
−
1
B
T
P
t
+
1
A
,
β
t
=
(
A
T
−
A
T
P
t
+
1
B
(
R
+
B
T
P
t
+
1
B
)
−
1
B
T
)
β
t
+
1
−
Q
x
t
R
,
α
t
=
α
t
+
1
+
x
t
R
T
Q
x
t
R
−
β
t
+
1
T
B
(
R
+
B
T
P
t
+
1
B
)
−
1
B
T
β
t
+
1
P_{t}=Q+A^\mathrm{T}P_{t+1}A-A^\mathrm{T}P_{t+1}B(R+B^\mathrm{T}P_{t+1}B)^{-1}B^\mathrm{T}P_{t+1}A,\\\beta_{t}=(A^\mathrm{T}-A^\mathrm{T}P_{t+1}B(R+B^\mathrm{T}P_{t+1}B)^{-1}B^\mathrm{T})\beta_{t+1}-Qx_{t}^{R},\\\alpha_t=\alpha_{t+1}+{x_t^R}^\mathrm{T}Qx_t^R-\beta_{t+1}^\mathrm{T}B(R+B^\mathrm{T}P_{t+1}B)^{-1}B^\mathrm{T}\beta_{t+1}
Pt=Q+ATPt+1A−ATPt+1B(R+BTPt+1B)−1BTPt+1A,βt=(AT−ATPt+1B(R+BTPt+1B)−1BT)βt+1−QxtR,αt=αt+1+xtRTQxtR−βt+1TB(R+BTPt+1B)−1BTβt+1 可以看出,
P
t
+
1
P_{t+1}
Pt+1的求解根据第一式可以完全的由
P
t
P_t
Pt确定,这与LQR的求解方式是一样的。但是,求解
β
t
+
1
\beta_{t+1}
βt+1时,就不仅需要
β
t
\beta_t
βt的值,还需要
P
t
+
1
P_{t+1}
Pt+1和参考轨迹
x
t
R
x_t^R
xtR的信息。而求解
α
t
+
1
\alpha_{t+1}
αt+1时,需要的就更多了,同时需要
α
t
\alpha_t
αt、
x
t
R
x_t^R
xtR、
P
t
+
1
P_{t+1}
Pt+1和
β
t
+
1
\beta_{t+1}
βt+1的信息才行。怎么求解上述方程对于定量分析不同的策略结构对于LQ Tracking问题的影响是很重要的。下面我们就来看看。
8.4.4.1 递归的求解Finite-horizon LQ Tracking问题
让我们考虑具有终止条件的finite-horizon LQ Tracking问题。我们把终止时间记为T,我们假设在T时刻,最优值函数
V
∗
(
x
T
,
X
R
)
=
0
V^*(x_T,X^R)=0
V∗(xT,XR)=0。而最优值函数根据我们上面的讨论具有二次型的形式
V
∗
(
x
t
,
X
R
)
=
x
t
T
P
t
x
t
+
2
x
t
T
β
t
+
α
t
V^*(x_t,X^R)=x_t^\mathrm{T}P_tx_t+2x_t^\mathrm{T}\beta_t+\alpha_t
V∗(xt,XR)=xtTPtxt+2xtTβt+αt。那么再考虑到终止状态的任意性,为了使得最优值函数恒为0,易知三个系数都应该为0,即:
P
T
=
0
,
β
T
=
0
,
α
T
=
0
P_T=0,\beta_T=0,\alpha_T=0
PT=0,βT=0,αT=0 那么,我们就可以根据diffential Riccati方程递归的从后向前求解出每一个时刻的三个系数。
另外,注意到最优策略 u t ∗ u_t^* ut∗中包含系数 β t + 1 \beta_{t+1} βt+1,这暗示了最优策略其实是受到时间t之后的参考轨迹信息的影响的。因此,我们的策略结构 u t = π ( x t , x t R ) u_t=\pi(x_t,x_t^R) ut=π(xt,xtR)不是最优的,因为它只包含了当前时刻的参考轨迹信息,而忽视了之后的轨迹信息。真正的最优策略应该是 u t = φ ( x t , x t R , x t + 1 R , ⋯ , x T R ) u_t=\varphi(x_t,x_t^R,x_{t+1}^R,\cdots,x_T^R) ut=φ(xt,xtR,xt+1R,⋯,xTR)
8.4.4.2 Infinite-horizon LQ Tracking问题的稳定状态解
Infinite-horizon LQ追踪器与它对应的finite版本非常不同。对于infinte-horizon LQ tracking问题,我们可以将differential Riccati方程视为一个离散的动态系统,将他的三个系数视为三个状态
(
P
t
,
β
t
,
α
t
)
(P_t,\beta_t,\alpha_t)
(Pt,βt,αt)。为了保证稳定状态的解的存在,我们需要保证这个离散的动态系统是稳定的。那么既然这个系统是稳定的,自然就意味着上述三个状态变量可以收敛到它们的稳态,挡在时刻t达到稳态之后,我们有:
P
=
P
t
=
P
t
+
1
=
⋯
=
P
∞
,
β
=
β
t
=
β
t
+
1
=
⋯
=
β
∞
,
α
=
α
t
=
α
t
+
1
=
⋯
=
α
∞
,
P=P_t=P_{t+1}=\cdots=P_\infty ,\\\beta=\beta_{t}=\beta_{t+1}=\cdots=\beta_{\infty} ,\\\alpha=\alpha_{t}=\alpha_{t+1}=\cdots=\alpha_{\infty} ,
P=Pt=Pt+1=⋯=P∞,β=βt=βt+1=⋯=β∞,α=αt=αt+1=⋯=α∞, 这里我们使用
P
,
β
,
α
P,\beta,\alpha
P,β,α来表示稳态的解。那么我们把稳态的这三个值代入到differtial Riccati方程中,并记
D
=
d
e
f
A
T
−
A
T
P
B
(
R
+
B
T
P
B
)
−
1
B
T
−
I
D\overset{\mathrm{def}}{\operatorname*{=}}A^\mathrm{T}-A^\mathrm{T}PB(R+B^\mathrm{T}PB)^{-1}B^\mathrm{T}-I
D=defAT−ATPB(R+BTPB)−1BT−I,则我们可以得到:
β
T
B
(
R
+
B
T
P
B
)
−
1
B
T
β
=
β
T
D
T
Q
−
1
D
β
,
\beta^\mathrm{T}B(R+B^\mathrm{T}PB)^{-1}B^\mathrm{T}\beta=\beta^\mathrm{T}D^\mathrm{T}Q^{-1}D\beta,
βTB(R+BTPB)−1BTβ=βTDTQ−1Dβ, 那么上述等式在下面两个条件下成立:
{
β
=
0
o
r
B
(
R
+
B
T
P
B
)
−
1
B
T
=
D
T
Q
−
1
D
\begin{cases} \beta=0\\ \quad \quad \quad \quad \quad \quad or \\ B(R+B^\mathrm{T}PB)^{-1}B^\mathrm{T}=D^\mathrm{T}Q^{-1}D \end{cases}
⎩
⎨
⎧β=0orB(R+BTPB)−1BT=DTQ−1D 而后一个条件的等号成立可以进一步的等价于下面的式子:
Q
=
P
Q=P
Q=P 那么我们再把
Q
=
P
Q=P
Q=P代入到differtial Riccati方程中,我们可以得到下述等式:
B
(
R
+
B
T
Q
B
)
−
1
B
T
=
Q
−
1
.
B(R+B^\mathrm{T}QB)^{-1}B^\mathrm{T}=Q^{-1}.
B(R+BTQB)−1BT=Q−1. 那么是否对于我们这里的infinite-horizon LQ Tracking问题来说,两种情况(
β
=
0
\beta=0
β=0和
B
(
R
+
B
T
Q
B
)
−
1
B
T
=
Q
−
1
B(R+B^\mathrm{T}QB)^{-1}B^\mathrm{T}=Q^{-1}
B(R+BTQB)−1BT=Q−1)是否都是合理的呢?其实根据秩的相关推导,可以证明后一种情况存在矛盾(详见原书第8.4.4.2节),因此只有
β
=
0
\beta=0
β=0是合理的。这个时候我们把稳态时
β
=
0
\beta=0
β=0代入到differtial Riccati方程的第二式,我们可以得到在稳态时下述很强的结论:
x
t
R
=
x
t
+
1
R
=
⋯
=
x
∞
R
=
0.
x_t^R=x_{t+1}^R=\cdots=x_\infty^R=0.
xtR=xt+1R=⋯=x∞R=0. 那么对于infinite-horizon LQ Tracking问题来说,最优解存在的当且仅当参考轨迹恒等于0。这里的0-稳态也被称为self-harmonized reference。那么我们同样可以得知,如果我们的参考轨迹不是恒等于0的,那么具有infinite-horizon的LQ Tracker实际上不存在最优解。原因也很好理解,因为如果参考轨迹不是恒等于0的话,稳态的状态的误差就是一个非零值,这样得到的值函数就不是有界的。因此,实际上我么不可能设计出一个infinite-horizon的LQ Tracker,除非我们让它跟踪一个恒等于0的参考轨迹,但是这样的轨迹在实际中基本上是没有什么意义的,而且此时LQ Tracker就退化为了LQR了。
这样其实也解释了为什么在实际应用中,一些finite-horizon的LQ Tracker比它们对应的infinite版本更好。人们普遍认为,finite-horizon的LQ Tracker总是比infinite-horizon的LQ Tracker更差。这种想法是因为前者是一个local optimizer而后者是一个global optimizer。但是,正如我们上面所分析的,由于self-harmonized reference的限制,infinite的版本不可能跟踪任意的参考轨迹(特别是对于快速变化的参考轨迹)。因此,正因为infinite-horizon的LQ Tracker在理论上的不完备,其自然也就不具备最优性。
8.4.5 考虑到Reference Dynamics的Sampling机制
根据我们上面的讨论,Infinite-horizon Tracker的一个关键问题是如果参考轨迹不是self-harmonized的话,那么最优策略就不存在。尽管我们上面得出这个结论靠的是针对LQ问题的分析,但是得出的结论不变,只不过对于更一般的问题其轨迹为self-harmonized的条件不一定是恒等于0了。不是self-harmonized的轨迹在工程实践中很常见,但是却很少被讨论。因此本小节就来讨论一下。首先,我们先通过一个例子来直观的认识一下什么是非self-harmonized的参考轨迹(这里的轨迹只是一个形象的说法,实际上是状态随着时间变化的一个函数)。考虑到汽车的纵向控制,这里的状态向量由两个分量构成,分别是车的纵向位置和纵向速度。那么,一个非self-harmonized的参考轨迹可以这样设置:从某个时刻t开始,车的位置恒定不变,但是车的速度为一个非零值。这样的轨迹显然在物理上是不成立的,表现在utility function上就是utility function一直为非零值(即实际的轨迹始终无法跟上参考轨迹,因为参考轨迹在物理上就不可行),这样对于utility function求和的值函数就会发散到无穷大。
那么,如果轨迹本身就不是self-harmonized的,而我们又想跟踪这个轨迹并得到实用的结果,应该怎么做呢?答案就是去训练一个使用有限horizon的参考轨迹点作为输入的准最优策略。这里的核心思想是建立一个splitting cost function来代替原来的infinite-horizon的版本。为了理解这个splitting cost function工作的原理,我们需要在virtual-time domain中来定义和分析。在virtual-time domain中,我们把实际时间t对应的虚拟时间轴分成两段,分别是
[
0
∣
t
,
(
N
−
1
)
∣
t
]
\Big[0|t,\ (N-1)|t\Big]
[0∣t, (N−1)∣t]和
[
N
∣
t
,
∞
∣
t
]
\Big[N|t,\ \infty|t\Big]
[N∣t, ∞∣t]。第一段的virtual-time reference使用实际的参考轨迹来保证期望的追踪能力,同时也作为准最优策略的输入的一部分。即:
x
i
∣
t
R
=
x
t
+
i
R
,
i
∈
N
.
x_{i|t}^{R}=x_{t+i}^{R},i\in\mathbb{N}.
xi∣tR=xt+iR,i∈N. 怎么选择定义第二段的方式才是重新通过splitting cost function来重新得到self-harmonized的参考轨迹的关键。这里有两种可能的选择:
- 选择第一段结尾的那个点作为第二段的值:这样相当于任选一个常数作为第二段的参考轨迹的做法显然不合理,因为此时稳态误差仍然存在,因此刚才说的值函数无界的问题仍然存在。
- 选择最终的稳态值作为第二段的值:这样的选择是合理的,因为这样的选择可以保证最终的稳态误差为0。
到这里为止,我们已经构建了一个splitting cost function。但是现在阻碍我们构建一个理论完备的ADP算法的鸿沟是什么?在于我们的cost function定义在virtual-time domain中,但是我们收集数据是在real-time domain中。因此我么必须先详细的分析reference dynamics和sampling机制之间的关系。
实际上,任何对于reference的修改都可以被视为项原始的环境中引入了一个特殊的reference dynamics。而新的reference dynamics可以被视为一个新的reference预测模型:
x
i
+
N
∣
t
R
=
g
(
x
i
∣
t
R
,
x
i
+
1
∣
t
R
,
⋯
,
x
i
+
N
−
1
∣
t
R
)
x_{i+N|t}^R=g\big(x_{i|t}^R,x_{i+1|t}^R,\cdots,x_{i+N-1|t}^R\big)
xi+N∣tR=g(xi∣tR,xi+1∣tR,⋯,xi+N−1∣tR) 这里
g
(
⋅
)
g(\cdot)
g(⋅)可以根据过去的N步的参考信号来预测下一步的参考信号。这也解释了我们把虚拟时间分成两段的合理性,因为这个滑动窗口的大小为N,因此一开始必须有N个已知值才能向后滑动。怎么定义这个函数也是一个学问,需要根据实际需要来确定。如果按照我们之前说过的把最终的稳态值作为第二段的参考轨迹的话,那么这个函数就可以简单的定义为:
g
t
+
N
=
d
e
f
g
(
x
i
∣
t
R
,
x
i
+
1
:
i
+
N
−
1
∣
t
R
)
=
x
e
q
u
g_{t+N}\stackrel{\mathrm{def}}{=}g\big(x_{i|t}^{R},x_{i+1:i+N-1|t}^{R}\big)=x_{\mathrm{equ}}
gt+N=defg(xi∣tR,xi+1:i+N−1∣tR)=xequ
为了配合上述重构的追踪问题,我们需要给出追踪版本的Bellman方程:
V
∗
(
x
0
∣
t
,
x
0
:
N
−
1
∣
t
R
)
=
min
u
0
:
∞
∣
t
{
l
(
x
0
∣
t
R
−
x
0
∣
t
,
u
0
∣
t
)
+
∑
i
=
1
∞
l
(
x
i
∣
t
R
−
x
i
∣
t
,
u
i
∣
t
)
}
=
min
u
0
∣
t
{
l
(
x
0
∣
t
R
−
x
0
∣
t
,
u
0
∣
t
)
+
min
u
1
:
∞
∣
t
{
∑
i
=
1
∞
l
(
x
i
∣
t
R
−
x
i
∣
t
,
u
i
∣
t
)
}
}
=
min
u
0
∣
t
{
l
(
x
0
∣
t
R
−
x
0
∣
t
,
u
0
∣
t
)
+
V
∗
(
x
1
∣
t
,
x
1
:
N
∣
t
R
)
}
\begin{aligned} &V^*\big(x_{0|t},x_{0:N-1|t}^R\big) \\ &=\min_{u_{0:\infty|t}}\left\{l\big(x_{0|t}^R-x_{0|t},u_{0|t}\big)+\sum_{i=1}^\infty l\big(x_{i|t}^R-x_{i|t},u_{i|t}\big)\right\} \\ &=\min_{u_{0|t}}\left\{l\big(x_{0|t}^R-x_{0|t},u_{0|t}\big)+\min_{u_{1:\infty|t}}\big\{\sum_{i=1}^\infty l\big(x_{i|t}^R-x_{i|t},u_{i|t}\big)\big\}\right\} \\ &=\min_{u_{0|t}}\{l\big(x_{0|t}^{R}-x_{0|t},u_{0|t}\big)+V^{*}\big(x_{1|t},x_{1:N|t}^{R}\big)\big\} \end{aligned}
V∗(x0∣t,x0:N−1∣tR)=u0:∞∣tmin{l(x0∣tR−x0∣t,u0∣t)+i=1∑∞l(xi∣tR−xi∣t,ui∣t)}=u0∣tmin{l(x0∣tR−x0∣t,u0∣t)+u1:∞∣tmin{i=1∑∞l(xi∣tR−xi∣t,ui∣t)}}=u0∣tmin{l(x0∣tR−x0∣t,u0∣t)+V∗(x1∣t,x1:N∣tR)} 最小化这个Bellman方程的过程就能得到一个准最优的策略:
u
t
∗
=
π
(
x
0
∣
t
,
x
0
:
N
−
1
∣
t
R
)
⏟
virtual time
=
π
(
x
t
,
x
t
:
t
+
N
−
1
R
)
⏟
real time
.
u_t^*=\pi\underbrace{\left(x_{0|t},x_{0:N-1|t}^R\right)}_{\text{virtual time}}=\pi\underbrace{(x_t,x_{t:t+N-1}^R)}_{\text{real time}}.
ut∗=πvirtual time
(x0∣t,x0:N−1∣tR)=πreal time
(xt,xt:t+N−1R). 上式中从virtual time到real time之间的转换是因为我们的splitting的virtual时间轴的第一段采用的是和real-time同步的形式。可以看出,上述策略共有N+1个输入:当前的实际状态以及在virtual-time domain中的N个参考轨迹点。
需要考虑的另一个问题是,在引入了reference dynamics之后,我们的环境不在保持Markov性质。为了保持Markov性质,我们需要构建如下的augmented state:
x
ˉ
i
∣
t
=
[
x
i
∣
t
,
x
i
∣
t
R
,
x
i
+
1
∣
t
R
,
⋯
,
x
i
+
N
−
1
∣
t
R
⏟
Reference
]
T
,
i
∈
N
\bar{x}_{i|t}=\left[x_{i|t},\underbrace{x_{i|t}^R,x_{i+1|t}^R,\cdots,x_{i+N-1|t}^R}_{\text{Reference}}\right]^\mathrm{T},i\in\mathbb{N}
xˉi∣t=
xi∣t,Reference
xi∣tR,xi+1∣tR,⋯,xi+N−1∣tR
T,i∈N 那么augmented的环境模型可以写成:
x
ˉ
i
+
1
∣
t
=
[
x
i
+
1
∣
t
x
i
+
1
∣
t
R
.
.
.
x
i
+
N
−
1
∣
t
R
x
i
+
N
∣
t
R
]
=
[
f
(
x
i
∣
t
,
u
i
∣
t
)
x
i
+
1
∣
t
R
.
.
.
x
i
+
N
−
1
∣
t
R
g
(
x
i
∣
t
R
,
x
i
+
1
∣
t
R
,
.
.
.
,
x
i
+
N
−
1
∣
t
R
)
]
=
f
aug
(
x
ˉ
i
∣
t
,
u
i
∣
t
)
\bar{x}_{i+1|t}=\begin{bmatrix}x_{i+1|t}\\x_{i+1|t}^R\\...\\x_{i+N-1|t}^R\\x_{i+N|t}^R\end{bmatrix}=\begin{bmatrix}f(x_{i|t},u_{i|t})\\x_{i+1|t}^R\\...\\x_{i+N-1|t}^R\\g\big(x_{i|t}^R,x_{i+1|t}^R,...,x_{i+N-1|t}^R\big)\end{bmatrix}=f_{\text{aug}}\big(\bar{x}_{i|t},u_{i|t}\big)
xˉi+1∣t=
xi+1∣txi+1∣tR...xi+N−1∣tRxi+N∣tR
=
f(xi∣t,ui∣t)xi+1∣tR...xi+N−1∣tRg(xi∣tR,xi+1∣tR,...,xi+N−1∣tR)
=faug(xˉi∣t,ui∣t) 其中,对于
x
ˉ
i
+
1
∣
t
\bar{x}_{i+1|t}
xˉi+1∣t的最后一个元素是由我们刚才定义的reference dynamics模型
g
(
⋅
)
g(\cdot)
g(⋅)给出的,reference dynamics信息也就这样被嵌入了原始的环境模型中去。那么我们就可以这样收集samples:先收集N步的真实reference信号,再使用reference dynamics模型来预测最后一个参考信号。这样不断使用新的环境模型
f
aug
f_{\text{aug}}
faug(已嵌入了reference dynamics信息)rollout就可以获得我们需要的samples,每个sample包含了两个实际的状态和N个实际的参考信号以及1个预测的参考信号,如下图所示:
那么,如果我们坚持使用real-time reference来采集samples会怎么样呢?这个时候,我们来分成有一个or多个reference轨迹来讨论(当然这时只有当这些轨迹都self-harmonized的时候才有意义)。当只有一个self-harmonized的参考轨迹时,最终的得到的是一个time-dependent的策略,其输出只由当前状态和当前实践决定。而当有多个self-harmonized的参考轨迹时,我们学得的策略里面隐含了某种在参考轨迹之间转移的分布,这样学得的策略就具有更好的探索和泛化能力。
到此为止,我们就已经介绍完了使用考虑到reference dynamics的sampling机制来解决infinite-horizon追踪器来追踪非self-harmonized参考轨迹的方法。可以看出,splitting cost function和reference dynamics的引入使得我们有能力跟踪一个非self-harmonized的参考轨迹,而不至于陷入值函数(cost function)无界的困境。
8.5 设计Finite-horizon ADP的方法
之前我们讨论的ADP都是基于infinite-horizon的,我们需要很仔细地保证值函数是有界的。而对于finite-horizon的最优控制问题,我们就可以轻松一点了。因为这里我们很容易把值函数做到有界,而它的policy gradient的推导也是一种基于cascading的方式。
但是,现在大多数实用的finite-horizon的最优控制问题都是基于MPC来做的。MPC确实具有很多优点,例如可以处理非线性系统而不用可以对于系统进行线性化、显式的考虑了系统的物理上或者操作上的限制以及对于多种控制问题(比如set-point调调节、追踪等)都适用。但是,它的online优化的特性也使得它的计算负担很重,因此只能处理那些动态很缓慢、采样周期很长、纬度低的系统。因此我们下面有必要来讨论一下如何设计一个finite-horizon的ADP算法来为finite-horizon的最优控制问题提供一个替代的方法。
8.5.1 Finite-horizon ADP的基础
我们首先要明确我们究竟要讨论的是什么问题。在infinite-horizon的情况下,我们既讨论了离散时间的版本也讨论了连续时间的版本。但是在finite-horizon的版本的讨论中,情况就完全不同了。不同于连续时间版本中的HJB方程,finite-horizon的问题中的值函数具有time-dependent的结构,因此此时的HJB方程常常在计算上是不可行的(尤其在系统具有很强的非线性和高维度的情况下)。因此,我们下面都只讨论定义在离散时间上的finite-horizon的ADP算法。这类算法也具有一些额外的特点,比如说值函数是time-dependent的,对于reward采不采取折扣因子没有那么敏感以及内在的multistage的策略结构。
首先,为了下面构建算法的需要,我们仍然需压迫保持在infinite那里做的两个假设,即化境具有Markov性质以及cost function的可分离性。这里易知我们的finite-horizon的最优控制问题自然满足这两个假设。那么我们可以把finite-horizon的最优控制问题写成如下形式:
min
u
t
,
.
.
.
,
u
t
+
N
−
1
V
(
x
,
X
R
)
=
∑
i
=
0
N
−
1
l
(
x
t
+
i
,
x
t
+
i
R
,
u
t
+
i
)
s.t.
x
t
+
1
=
f
(
x
t
,
u
t
)
\min_{u_{t},...,u_{t+N-1}}V(x,X^{R}\:)=\sum_{i=0}^{N-1}l(x_{t+i},x_{t+i}^{R},u_{t+i})\\\text{s.t.}\\x_{t+1}=f(x_{t},u_{t})
ut,...,ut+N−1minV(x,XR)=i=0∑N−1l(xt+i,xt+iR,ut+i)s.t.xt+1=f(xt,ut) 注意,这里的utility function不一定是正定的了,因为这里的值函数的有界性很好保证。这里可能有读者会疑惑,为什么这里的utility function中包含了参考信息
x
t
+
i
R
x_{t+i}^{R}
xt+iR,这里又没有说一定是tracking问题。实际上,这只是一种统一建模的方法,在下面会讲。
实际上,我们可以将finite-horizon的OCP分为以下两类:
- Regulator:这里的参考轨迹恒为一个常数,即稳态值 x e q u x_equ xequ。对于大多数问题来说,这个稳态值就是0。
- Tracker:这里的参考轨迹是一个随时间变化的函数。我们可以进一步将tracker分为下面两类:
- First-point tracker:这里当每步在virtual-time域中求解时只用到第一个此时轨迹上的参考点(即位于时间t的参考点)。
- Full-horizon tracker:这里在每一步求解时用到了整个horizon上的参考点。
对于finite-horizon的问题,标准的Bellman方程不在存在,我们需要引入multistage的Bellman方程。stage的数量取决于horizon的长度。在Exact DP中,这个multistage的Bellman方程是使用stage-by-stage的backward的方式计算的。而在ADP中,我们需要给出新的算法来求解这个multistage的Bellman方程。
我们再来考察一下对于一个finite-horizon的ADP算法很重要的一点:怎么使用函数对策略进行近似。因为每步的最有动作不仅取决于现在的状态,还取决于参考序列(含时间信息),因此我们的策略也应该是采取time-dependent的形式(在我们上面统一纳入了参考信息的OCP建模下)。下面来看看对于tracker和regulator的情况下,策略的形式:
- 对于最优regulator来说的策略结构:
u t + i = π ( x t , N − i ; θ ) , i = 0 , 1 , … , N − 1 u_{t+i}=\pi(x_t,N-i;\theta),i=0,1,\ldots,N-1 ut+i=π(xt,N−i;θ),i=0,1,…,N−1 注意,与infinite-horizon的情况不同,这里的策略必须包含时间信息。 - 对于最优tracker来说的策略结构:
u t + i = π ( x t , x t + i : t + N − 1 ; θ i ) , i = 0 , 1 , … , N − 1 u_{t+i}=\pi(x_{t},x_{t+i:t+N-1};\theta_{i}),i=0,1,\ldots,N-1 ut+i=π(xt,xt+i:t+N−1;θi),i=0,1,…,N−1 注意,这里对于一个horizon长度为N的问题,我们需要N套不同的参数 θ 0 ∈ R l 0 , θ 1 ∈ R l 1 , . . . , θ N − 1 ∈ R l N − 1 \theta_{0}\in\mathbb{R}^{l_{0}},\theta_{1}\in\mathbb{R}^{l_{1}},...,\theta_{N-1}\in\mathbb{R}^{l_{N-1}} θ0∈Rl0,θ1∈Rl1,...,θN−1∈RlN−1。这是因为参考轨迹是不断变化的,没法使用一套固定的参数来跟踪(上面的regulator的情况是因为参考轨迹是恒定的,因此只需要一套参数)。
最后,求解finite-horizon的ADP问题有两种主流的算法:value-based ADP和policy-based ADP。前者先计算出最优的值函数再通过最优值函数来计算最优策略,而后者直接通过梯度下降来求解最优策略。
8.5.2 最优Regulator的Finite-horizon ADP算法
首先,我们为了下面能够得出multi-stage的Bellman方程,需要对上面提到过的值函数形式做一点变形:
V
∗
(
x
,
t
)
=
min
u
t
,
u
t
+
1
,
.
.
.
,
u
T
∑
i
=
t
T
l
(
x
i
,
u
i
)
.
V^*(x,t)=\min_{u_t,u_{t+1},...,u_T}\sum_{i=t}^Tl(x_i,u_i).
V∗(x,t)=ut,ut+1,...,uTmini=t∑Tl(xi,ui). 可以看到,与之前在8.5.1节的Problem Formulation那里定义的值函数的形式略有不同。那里的值函数形式及是固定horizon长度(horizon长为N),而这里的值函数是固定终止时间为T,初始时间t可变。为什么在之前已经定义了一种值函数的形式的情况下要再顶i一种值函数形式呢?是多此一举吗?当然不是!这两种形式必然是在我们后面的推导中各有用处。本处引入的这种终止时间固定为T的值函数的好处在于可以推导出下面的multi-stage的Bellman方程,而之前的那种固定horizon长度的值函数因为其horizon长度固定且输入参数不显含时间t(其形式为
V
(
x
,
X
R
)
V(x,X^R)
V(x,XR)),因此无法得出multi-stage的Bellman方程。那么,我们就来看看这个multi-stage的Bellman方程是怎么样的:
V
(
x
,
t
)
=
min
u
{
l
(
x
,
u
)
+
V
(
x
′
,
t
+
1
)
}
,
V
(
x
,
t
+
1
)
=
min
u
{
l
(
x
,
u
)
+
V
(
x
′
,
t
+
2
)
}
,
V
(
x
,
T
−
1
)
=
min
u
{
l
(
x
,
u
)
+
V
(
x
′
,
T
)
}
,
V
(
x
,
T
)
=
min
u
{
l
(
x
,
u
)
}
.
\begin{gathered} V(x,t)=\min_{u}\{l(x,u)+V(x^{\prime},t+1)\}, \\ V(x,t+1)=\operatorname*{min}_{u}\{l(x,u)+V(x^{\prime},t+2)\}, \\ V(x,T-1)=\operatorname*{min}_{u}\{l(x,u)+V(x^{\prime},T)\}, \\ V(x,T)=\min_{u}\{l(x,u)\}. \end{gathered}
V(x,t)=umin{l(x,u)+V(x′,t+1)},V(x,t+1)=umin{l(x,u)+V(x′,t+2)},V(x,T−1)=umin{l(x,u)+V(x′,T)},V(x,T)=umin{l(x,u)}. 这里的方程个数等于horizon的长度(由初始时间t和终止时间T决定)。
那么我们应该怎样由这个Bellman方程得到最优策略呢?一种直接的想法是我们为每个时间步都使用一个函数来拟合该时间步的值函数(即 V ( x , t ; w t ) , V ( x , t + 1 ; w t + 1 ) , V ( x , t + 2 ; w t + 2 ) , . . . , a n d V ( x , T ; w T ) V(x,t;w_{t}),V(x,t+1;w_{t+1}),\:V(x,t+2;w_{t+2}),\:...,\:\mathrm{and}V(x,T;w_{T}) V(x,t;wt),V(x,t+1;wt+1),V(x,t+2;wt+2),...,andV(x,T;wT)),然后使用值迭代的技术来求解这些值函数的最优值。在得到最优值之后就可以得到最优策略。但是这样进行参数化的方式会带来超高维的问题,并导致计算效率极其低下(我的理解是因为这里的初始时间t不确定,我们要想覆盖所有的t,那么我们的参数空间就会变得非常大)。因此,我们需要另辟蹊径。我们可以利用这里值函数对于utility function的求和是有限步来作为突破口。下面的方法中就不需要显式的对于值函数进行建模了,只需要递归的计算policy gradient就可以了。下面我们就来看看这个方法。
首先,我们可以这样更新策略参数
θ
\theta
θ:
θ
←
θ
−
α
d
V
(
x
)
d
θ
\theta\leftarrow\theta-\alpha\frac{\mathrm{d}V(x)}{\mathrm{d}\theta}
θ←θ−αdθdV(x) 与之前得到multi-stage的Bellman方程时必须使用固定终止时间T的值函数不同,这里我们必须用回固定horizon长度N的值函数。另外,考虑到这两种值函数实际上在t=0且T=N-1时是等价的,因此我们可以使用由固定终止时间T的值函数得到的multi-stage的Bellman方程来计算要求值函数是固定horizon长度N的值函数的梯度。另外为了递归计算的方便,我们需要改写8.5.1节中的optimal regulator的策略结构:
u
t
+
i
=
π
(
x
t
,
N
−
i
;
θ
)
,
i
=
0
,
1
,
…
,
N
−
1
↓
u
t
+
i
=
π
(
x
t
+
i
,
N
−
i
;
θ
)
,
i
=
0
,
1
,
.
.
.
,
N
−
1
\begin{gathered} u_{t+i}=\pi(x_t,N-i;\theta),i=0,1,\ldots,N-1 \\ \downarrow\\ u_{t+i}=\pi(x_{t+i},N-i;\theta),i=0,1,...,N-1 \end{gathered}
ut+i=π(xt,N−i;θ),i=0,1,…,N−1↓ut+i=π(xt+i,N−i;θ),i=0,1,...,N−1 这里最大的变化就是我们上面那个策略结构是根据当前状态
x
t
x_t
xt来决定未来预测horizon(长度为N)的各个最优动作值的,而我们修改后的策略结构是根据每个时刻的状态
x
t
+
i
x_{t+i}
xt+i来决定对应时间步的最优动作。那么,我们的policy就可以写成如下形式:
d
V
(
x
)
d
θ
=
∑
i
=
0
N
−
1
d
l
(
x
t
+
i
,
u
t
+
i
)
d
θ
\frac{\mathrm{d}V(x)}{\mathrm{d}\theta}=\sum_{i=0}^{N-1}\frac{\mathrm{d}l(x_{t+i},u_{t+i})}{\mathrm{d}\theta}
dθdV(x)=i=0∑N−1dθdl(xt+i,ut+i) 现在的问题归结为怎么计算每个
d
l
(
x
t
+
i
,
u
t
+
i
)
d
θ
\frac{\mathrm{d}l(x_{t+i},u_{t+i})}{\mathrm{d}\theta}
dθdl(xt+i,ut+i)。其实答案就是很简单,就是使用链式法则,只不过这里的依赖关系之间比较复杂,可以被建模为一个有向无环图,这样一张图的起点是
l
(
x
t
+
i
,
u
t
+
i
)
l(x_{t+i},u_{t+i})
l(xt+i,ut+i),终点是
θ
\theta
θ:
为了简单起见,我们引入下面的记号:
l
t
+
i
=
d
e
f
l
(
x
t
+
i
,
u
t
+
i
)
,
f
t
+
i
=
d
e
f
f
(
x
t
+
i
,
u
t
+
i
)
,
π
t
+
i
=
d
e
f
π
(
x
t
+
i
,
N
−
i
;
θ
)
.
\begin{aligned} l_{t+i}&\stackrel{\mathrm{def}}{=}l(x_{t+i},u_{t+i}),\\f_{t+i}&\stackrel{\mathrm{def}}{=}f(x_{t+i},u_{t+i}),\\\pi_{t+i}&\stackrel{\mathrm{def}}{=}\pi(x_{t+i},N-i;\theta). \end{aligned}
lt+ift+iπt+i=defl(xt+i,ut+i),=deff(xt+i,ut+i),=defπ(xt+i,N−i;θ). 引入上述记号后,我们有:
d
l
t
+
i
d
θ
=
d
x
t
+
i
T
d
θ
∂
l
t
+
i
∂
x
t
+
i
+
d
u
t
+
i
T
d
θ
∂
l
t
+
i
∂
u
t
+
i
\frac{\mathrm{d}l_{t+i}}{\mathrm{d}\theta}=\frac{\mathrm{d}x_{t+i}^\mathrm{T}}{\mathrm{d}\theta}\frac{\partial l_{t+i}}{\partial x_{t+i}}+\frac{\mathrm{d}u_{t+i}^\mathrm{T}}{\mathrm{d}\theta}\frac{\partial l_{t+i}}{\partial u_{t+i}}
dθdlt+i=dθdxt+iT∂xt+i∂lt+i+dθdut+iT∂ut+i∂lt+i 这个式子就是上图里面从
d
l
t
+
i
/
d
θ
dl_{t+i}/d\theta
dlt+i/dθ指向下面的红色和紫色的线。接下来,继续引入记号来化简:
ϕ
t
+
i
=
d
e
f
d
x
t
+
i
T
d
θ
,
ψ
t
+
i
=
d
e
f
d
u
t
+
i
T
d
θ
=
d
π
t
+
i
T
d
θ
\phi_{t+i}\stackrel{\mathrm{def}}{=}\frac{\mathrm{d}x_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta},\psi_{t+i}\stackrel{\mathrm{def}}{=}\frac{\mathrm{d}u_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta}=\frac{\mathrm{d}\pi_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta}
ϕt+i=defdθdxt+iT,ψt+i=defdθdut+iT=dθdπt+iT 然后通过观察上图,我们可以得到如下
ϕ
\phi
ϕ和
ψ
\psi
ψ在相邻两个时间不得递归关系:
ϕ
t
+
i
=
ϕ
t
+
i
−
1
∂
f
t
+
i
−
1
T
∂
x
t
+
i
−
1
+
ψ
t
+
i
−
1
∂
f
t
+
i
−
1
T
∂
u
t
+
i
−
1
,
ψ
t
+
i
=
ϕ
t
+
i
∂
π
t
+
i
T
∂
x
t
+
i
+
∂
π
t
+
i
T
∂
θ
,
\begin{aligned} \phi_{t+i}&=\phi_{t+i-1}\frac{\partial f_{t+i-1}^{\mathrm{T}}}{\partial x_{t+i-1}}+\psi_{t+i-1}\frac{\partial f_{t+i-1}^{\mathrm{T}}}{\partial u_{t+i-1}}\:,\\\psi_{t+i}&=\phi_{t+i}\frac{\partial\pi_{t+i}^{\mathrm{T}}}{\partial x_{t+i}}+\frac{\partial\pi_{t+i}^{\mathrm{T}}}{\partial\theta}\:, \end{aligned}
ϕt+iψt+i=ϕt+i−1∂xt+i−1∂ft+i−1T+ψt+i−1∂ut+i−1∂ft+i−1T,=ϕt+i∂xt+i∂πt+iT+∂θ∂πt+iT, 注意,这里的推导中利用了两个关系式:
x
t
+
i
=
f
t
+
i
−
1
x_{t+i}=f_{t+i-1}
xt+i=ft+i−1(环境模型)和
u
t
+
i
=
π
t
+
i
u_{t+i}=\pi_{t+i}
ut+i=πt+i(因为策略是确定性的)。并且在
ψ
t
+
i
\psi_{t+i}
ψt+i的递归关系中,左边有一个
ϕ
t
+
i
\phi_{t+i}
ϕt+i(即
d
π
t
+
i
T
/
d
θ
d\pi_{t+i}^{\mathrm{T}}/d\theta
dπt+iT/dθ)而右边又有一个
∂
π
t
+
i
T
/
∂
θ
\partial\pi_{t+i}^{\mathrm{T}}/\partial\theta
∂πt+iT/∂θ,可能有读者会疑惑,这两者难道不相等吗?确实不相等!结合高数知识,就可以知道二者根本不是一个东西。
d
π
t
+
i
T
/
d
θ
d\pi_{t+i}^{\mathrm{T}}/d\theta
dπt+iT/dθ的含义是我这个
π
t
+
i
\pi_{t+i}
πt+i就是一个关于
θ
\theta
θ的函数,我这里的对于
θ
\theta
θ求导数(这里不是偏导!!!)就是要遍历上述DAG中从
π
t
+
i
\pi_{t+i}
πt+i开始到
θ
\theta
θ的所有路径,求导求到底;而
∂
π
t
+
i
T
/
∂
θ
\partial\pi_{t+i}^{\mathrm{T}}/\partial\theta
∂πt+iT/∂θ这里我们不用求导求到底,只需要求最浅层的那个导数就可以了(及上述DAG中从
π
t
+
i
\pi_{t+i}
πt+i到
θ
\theta
θ的黄色那条边)。那么我们就可以把policy gradient改写为下述形式:
d
V
(
x
)
d
θ
=
∑
i
=
0
N
−
1
d
l
(
x
t
+
i
,
u
t
+
i
)
d
θ
=
∑
i
=
0
N
−
1
(
ϕ
t
+
i
∂
l
t
+
i
∂
x
t
+
i
+
ψ
t
+
i
∂
l
t
+
i
∂
u
t
+
i
)
\frac{\mathrm{d}V(x)}{\mathrm{d}\theta}=\sum_{i=0}^{N-1}\frac{\mathrm{d}l(x_{t+i},u_{t+i})}{\mathrm{d}\theta}=\sum_{i=0}^{N-1}\left(\phi_{t+i}\frac{\partial l_{t+i}}{\partial x_{t+i}}+\psi_{t+i}\frac{\partial l_{t+i}}{\partial u_{t+i}}\right)
dθdV(x)=i=0∑N−1dθdl(xt+i,ut+i)=i=0∑N−1(ϕt+i∂xt+i∂lt+i+ψt+i∂ut+i∂lt+i) 上式中的
ϕ
t
+
i
\phi_{t+i}
ϕt+i和
ψ
t
+
i
\psi_{t+i}
ψt+i可以通过递归的方式计算得到。给定初始条件
ϕ
t
+
N
−
1
=
0
\phi_{t+N-1}=0
ϕt+N−1=0(因为初始状态是已经给定的,与策略无关,自然也就与策略参数无关)和$\psi_{t+N-1}=\partial\pi^{\mathrm{T}}(x_{0},N;\theta)/\partial\theta $。推到到这里,我们就可以看出我们上面这样重构问题的好处了,这里我们不再需要计算值函数相关的项了,只需要计算一些偏导数即可。这也是在离散时间域上的finite-horizon的ADP算法的一个好处,我们不需要花费计算资源去计算一个time-dependent的值函数。反观在连续时间域上的finite-horizon的ADP算法,它的HJB方程因为含有time-dependent的值函数因此是一个非线性的PDE,这样的PDE的求解是非常困难的。
最后来看看整个算法的伪代码:
从上面的算法框架中也可以看出,因为这里我们不用显示的对于值函数进行建模,因此也不存在通常意义上的“Critic”,所以上述框架中只有对于actor的梯度更新。
8.5.3 使用Multi-stage策略的最优Tracker的Finite-horizon ADP算法
不同于刚才讲过的regulator的情况,tracker的情况下我们需要使用不同的参数来表示不同时间步的策略,即multi-stage的策略。那么到底需要几套策略参数呢?其实这个数就等于我们的horizon的长度N。我们将在8.5.1里面讲过的策略结构重新再拿出来:
u
t
=
π
(
x
t
,
x
t
:
t
+
N
−
1
R
;
θ
0
)
,
u
t
+
1
=
π
(
x
t
+
1
,
x
t
+
1
:
t
+
N
−
1
R
;
θ
1
)
,
u
t
+
N
−
1
=
π
(
x
t
+
T
−
1
,
x
t
+
N
−
1
R
;
θ
N
−
1
)
u_{t}=\pi(x_{t},x_{t:t+N-1}^{R};\theta_{0}),\\u_{t+1}=\pi(x_{t+1},x_{t+1:t+N-1}^{R};\theta_{1}),\\u_{t+N-1}=\pi(x_{t+T-1},x_{t+N-1}^{R};\theta_{N-1})
ut=π(xt,xt:t+N−1R;θ0),ut+1=π(xt+1,xt+1:t+N−1R;θ1),ut+N−1=π(xt+T−1,xt+N−1R;θN−1) 这里,
θ
0
,
θ
1
,
.
.
.
,
θ
N
−
1
\theta_{0},\theta_{1},...,\theta_{N-1}
θ0,θ1,...,θN−1就是我们的N套策略参数。值得注意的是,这些策略参数以及策略函数本身通常都具有不同的维度,这是因为对于预测问题来说,在时间t的时候,我们不仅需要使用当前的状态
x
t
x_{t}
xt作为输入,还需要使用未来的N个参考点
x
t
:
t
+
N
−
1
R
x_{t:t+N-1}^{R}
xt:t+N−1R。因此,也易知,输入的维度随着时间步越向后越少(因为此时剩下的参考信号数量也越少)。这种multi-stage的策略可以使用下图形象的描述:
那么,仿造regulator的情况,我们可以得到N个policy gradient:
d
V
(
x
,
X
R
)
d
θ
j
=
∑
i
=
0
N
−
1
d
l
(
x
t
+
i
,
x
t
+
i
R
,
u
t
+
i
)
d
θ
j
,
j
∈
{
0
,
1
,
⋯
,
N
−
1
}
\frac{\mathrm{d}V(x,X^R)}{\mathrm{d}\theta_j}=\sum_{i=0}^{N-1}\frac{\mathrm{d}l(x_{t+i},x_{t+i}^R,u_{t+i})}{\mathrm{d}\theta_j} ,j\in\{0,1,\cdots,N-1\}
dθjdV(x,XR)=i=0∑N−1dθjdl(xt+i,xt+iR,ut+i),j∈{0,1,⋯,N−1} 与8.5.2节一样,上述这N个梯度的计算也同样依赖于一个DAG:
于那里的DAG的区别在于,终点不再是一个单独的参数
θ
\theta
θ,而是N个不同的参数
θ
0
,
θ
1
,
.
.
.
,
θ
N
−
1
\theta_{0},\theta_{1},...,\theta_{N-1}
θ0,θ1,...,θN−1。同样的我们引入下述记号来简化式子:
l
t
+
i
(
x
t
+
i
R
)
≡
d
e
f
l
(
x
t
+
i
,
x
t
+
i
R
,
u
t
+
i
)
,
f
t
+
i
≡
d
e
f
f
(
x
t
+
i
,
u
t
+
i
)
,
π
t
+
i
(
θ
i
)
=
d
e
f
π
(
x
t
+
i
,
x
t
+
i
:
t
+
N
−
1
R
;
θ
i
)
.
\begin{gathered} l_{t+i}(x_{t+i}^{R})\stackrel{\mathrm{def}}{\equiv}l(x_{t+i},x_{t+i}^{R},u_{t+i}), \\ f_{t+i}\stackrel{\mathrm{def}}{\equiv}f(x_{t+i},u_{t+i}), \\ \pi_{t+i}(\theta_{i})\stackrel{\mathrm{def}}{=}\pi(x_{t+i},x_{t+i:t+N-1}^{R};\theta_{i}). \end{gathered}
lt+i(xt+iR)≡defl(xt+i,xt+iR,ut+i),ft+i≡deff(xt+i,ut+i),πt+i(θi)=defπ(xt+i,xt+i:t+N−1R;θi). 引入了上述记号后,可以把每个梯度写成如下形式:
d
l
(
x
t
+
i
,
x
t
+
i
R
,
u
t
+
i
)
d
θ
j
=
d
x
t
+
i
T
d
θ
j
∂
l
t
+
i
(
x
t
+
i
R
)
∂
x
t
+
i
+
d
u
t
+
i
T
d
θ
j
∂
l
t
+
i
(
x
t
+
i
R
)
∂
u
t
+
i
.
\frac{\mathrm{d}l(x_{t+i},x_{t+i}^{R},u_{t+i})}{\mathrm{d}\theta_{j}}=\frac{\mathrm{d}x_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta_{j}}\frac{\partial l_{t+i}(x_{t+i}^{R})}{\partial x_{t+i}}+\frac{\mathrm{d}u_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta_{j}}\frac{\partial l_{t+i}(x_{t+i}^{R})}{\partial u_{t+i}} .
dθjdl(xt+i,xt+iR,ut+i)=dθjdxt+iT∂xt+i∂lt+i(xt+iR)+dθjdut+iT∂ut+i∂lt+i(xt+iR). 再像8.5.2节一样,引入下述两个额外的记号(只不过这里的
ϕ
\phi
ϕ和
ψ
\psi
ψ右上角都有一个
j
j
j,来表示其是对于不同的策略参数来求导的):
ϕ
t
+
i
j
=
d
x
t
+
i
T
d
θ
j
=
d
f
t
+
i
−
1
T
d
θ
j
,
ψ
t
+
i
j
=
d
u
t
+
i
T
d
θ
j
=
d
π
t
+
i
T
(
θ
i
)
d
θ
j
.
\phi_{t+i}^{j}=\frac{\mathrm{d}x_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta_{j}}=\frac{\mathrm{d}f_{t+i-1}^{\mathrm{T}}}{\mathrm{d}\theta_{j}},\psi_{t+i}^{j}=\frac{\mathrm{d}u_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta_{j}}=\frac{\mathrm{d}\pi_{t+i}^{\mathrm{T}}(\theta_{i})}{\mathrm{d}\theta_{j}} .
ϕt+ij=dθjdxt+iT=dθjdft+i−1T,ψt+ij=dθjdut+iT=dθjdπt+iT(θi). 然后我们可以得到如下的递归关系:
ϕ
t
+
i
j
=
ϕ
t
+
i
−
1
j
∂
f
t
+
i
−
1
T
∂
x
t
+
i
−
1
+
ψ
t
+
i
−
1
j
∂
f
t
+
i
−
1
T
∂
u
t
+
i
−
1
,
ψ
t
+
i
j
=
ϕ
t
+
i
j
∂
π
t
+
i
T
(
θ
i
)
∂
x
t
+
i
+
∂
π
t
+
i
T
(
θ
i
)
∂
θ
j
,
\phi_{t+i}^{j}=\phi_{t+i-1}^{j}\frac{\partial f_{t+i-1}^{\mathrm{T}}}{\partial x_{t+i-1}}+\psi_{t+i-1}^{j}\frac{\partial f_{t+i-1}^{\mathrm{T}}}{\partial u_{t+i-1}} ,\\\psi_{t+i}^{j}=\phi_{t+i}^{j}\frac{\partial\pi_{t+i}^{\mathrm{T}}(\theta_{i})}{\partial x_{t+i}}+\frac{\partial\pi_{t+i}^{\mathrm{T}}(\theta_{i})}{\partial\theta_{j}} ,
ϕt+ij=ϕt+i−1j∂xt+i−1∂ft+i−1T+ψt+i−1j∂ut+i−1∂ft+i−1T,ψt+ij=ϕt+ij∂xt+i∂πt+iT(θi)+∂θj∂πt+iT(θi), 值得注意的是,这里DAG的终点不是一个而是多个带来了下面的两个性质:
∂
π
T
(
x
t
+
i
,
x
t
+
i
:
t
+
N
−
1
R
;
θ
i
)
∂
θ
j
=
0
,
i
f
i
≠
j
,
ϕ
t
+
i
j
=
d
x
t
+
i
T
d
θ
j
=
0
,
i
f
i
≤
j
.
\frac{\partial\pi^{\mathrm{T}}(x_{t+i},x_{t+i:t+N-1}^{R};\theta_{i})}{\partial\theta_{j}}=0,\mathrm{if} i\neq j,\\\phi_{t+i}^{j}=\frac{\mathrm{d}x_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta_{j}}=0,\mathrm{if} i\leq j.
∂θj∂πT(xt+i,xt+i:t+N−1R;θi)=0,ifi=j,ϕt+ij=dθjdxt+iT=0,ifi≤j. 第一个性质是因为从上述DAG可以看出每个
π
t
+
i
(
θ
i
)
\pi_{t+i}(\theta_{i})
πt+i(θi)只有唯一的一条黄色的边指向
θ
j
\theta_{j}
θj;而第二个性质是因为是由时间因果性决定的,先发生的状态显然与后续的策略参数无关。因此,最后的policy gradient归结为下面的N个形式相同的式子:
d
V
(
x
,
X
R
)
d
θ
j
=
∑
i
=
0
N
−
1
(
ϕ
t
+
i
j
∂
l
t
+
i
(
x
t
+
i
R
)
∂
x
t
+
i
+
ψ
t
+
i
j
∂
l
t
+
i
(
x
t
+
i
R
)
∂
u
t
+
i
)
\frac{\mathrm{d}V(x,X^R)}{\mathrm{d}\theta_j}=\sum_{i=0}^{N-1}\left(\phi_{t+i}^j\frac{\partial l_{t+i}(x_{t+i}^R)}{\partial x_{t+i}}+\psi_{t+i}^j\frac{\partial l_{t+i}(x_{t+i}^R)}{\partial u_{t+i}}\right)
dθjdV(x,XR)=i=0∑N−1(ϕt+ij∂xt+i∂lt+i(xt+iR)+ψt+ij∂ut+i∂lt+i(xt+iR)) 上面的式子中的基本元素都可以通过递归的方式计算得到。最后们需要指出的是,因为各个stage之间紧密相连,因此更新参数时一次就要更新所有的参数,而不能只更新其中的几个:
θ
0
←
θ
0
−
α
0
d
V
(
x
,
X
R
)
d
θ
0
,
θ
1
←
θ
1
−
α
1
d
V
(
x
,
X
R
)
d
θ
1
,
θ
N
−
1
←
θ
N
−
1
−
α
N
−
1
d
V
(
x
,
X
R
)
d
θ
N
−
1
.
\theta_{0}\leftarrow\theta_{0}-\alpha_{0}\frac{\mathrm{d}V(x,X^{R})}{\mathrm{d}\theta_{0}}\quad,\\\theta_{1}\leftarrow\theta_{1}-\alpha_{1}\frac{\mathrm{d}V(x,X^{R})}{\mathrm{d}\theta_{1}}\quad,\\\theta_{N-1}\leftarrow\theta_{N-1}-\alpha_{N-1}\frac{\mathrm{d}V(x,X^{R})}{\mathrm{d}\theta_{N-1}} .
θ0←θ0−α0dθ0dV(x,XR),θ1←θ1−α1dθ1dV(x,XR),θN−1←θN−1−αN−1dθN−1dV(x,XR).
最后,我们给出整个算法的伪代码:
8.5.4 使用循环/递归(Recurrent)策略的最优Tracker的Finite-horizon ADP算法
一个有意思的事实是我们可以将上面的multi-stage的策略简化为一个使用recurrent函数的策略。与multi-stage的策略不同,recurrent策略只需要一套参数(那么自然其输入维度也是恒定的,而不是像之前讲过的multi-stage的策略那样输入维度随时间步变化)。那么我们应该怎样建模这样一种具有recurrent特性的函数呢?其实,可以使用RNN(Recurrent Neural Network)来实现这样的函数。
下面来简单介绍一下RNN的基本知识。一个RNN的架构可以这样表示:
注意,上图中因为我们将其展平了,看起来似乎有很多个用于处理隐状态的模块(图中的矩形框),实际上那些模块都是同一个,只不过其上一个时间步的隐状态在下一个时间步输入到这个模块中。像下图所示:
RNN的训练需要使用BP的变种——BPTT(Back Propagation Through Time)。
那么,我们应该怎样用一套参数来对于multi-stage的策略进行建模呢?答案是对于我们的horizon中的不同时间步,采用不同的RNN循环次数,越靠前的时间步因为需要输入的参考信息好数目越多,因此循环次数也越多。如下图所示:
有了RNN作为策略函数,我们就可以将策略结构表述为如下形式:
u
t
+
i
=
π
N
−
i
(
x
t
+
i
,
x
t
+
i
:
t
+
N
−
1
R
;
θ
)
,
i
=
0
,
1
,
.
.
.
,
N
−
1.
u_{t+i}=\pi^{N-i}(x_{t+i},x_{t+i:t+N-1}^{R};\theta),\ i=0,1,...,N-1.
ut+i=πN−i(xt+i,xt+i:t+N−1R;θ), i=0,1,...,N−1. 更具体地来说,在每个时间步i,针对于其中的每个循环c,都可以表述如下:
h
c
=
σ
h
(
x
t
+
i
,
x
t
+
i
+
c
−
1
R
,
h
c
−
1
;
θ
h
)
,
π
c
(
x
t
+
i
,
x
t
+
i
:
t
+
N
−
1
R
;
θ
)
=
σ
u
(
h
c
;
θ
u
)
c
=
0
,
1
,
.
.
.
,
N
−
i
,
h_{c}=\sigma_{h}(x_{t+i},x_{t+i+c-1}^{R},h_{c-1};\theta_{h}),\\\pi^{c}(x_{t+i},x_{t+i:t+N-1}^{R};\theta)=\sigma_{u}(h_{c};\theta_{u})\\c=0,1,...,N-i,
hc=σh(xt+i,xt+i+c−1R,hc−1;θh),πc(xt+i,xt+i:t+N−1R;θ)=σu(hc;θu)c=0,1,...,N−i, 上式中的
σ
h
\sigma_{h}
σh和
σ
u
\sigma_{u}
σu分别表示隐藏层和输出层的函数变换。而
π
c
\pi^{c}
πc表示在时间步i中第c个循环的策略(这只是一个中间策略,不作为时间步i的最终策略)。
最后,我们来看看使用recurrent策略的policy gradient是怎么样的。与之前类似,我们有如下形式的policy gradient:
d
V
(
x
,
X
R
)
d
θ
=
∑
i
=
0
N
−
1
d
l
t
+
i
(
x
t
+
i
R
)
d
θ
=
∑
i
=
0
N
−
1
(
d
x
t
+
i
T
d
θ
∂
l
t
+
i
(
x
t
+
i
R
)
∂
x
t
+
i
+
d
u
t
+
i
T
d
θ
∂
l
t
+
i
(
x
t
+
i
R
)
∂
u
t
+
i
)
\begin{aligned} \frac{\mathrm{d}V(x,X^R)}{\mathrm{d}\theta}&=\sum_{i=0}^{N-1}\frac{\mathrm{d}l_{t+i}(x_{t+i}^R)}{\mathrm{d}\theta}\\ &=\sum_{i=0}^{N-1}\left(\frac{\mathrm{d}x_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta}\frac{\partial l_{t+i}(x_{t+i}^{R})}{\partial x_{t+i}}+\frac{\mathrm{d}u_{t+i}^{\mathrm{T}}}{\mathrm{d}\theta}\frac{\partial l_{t+i}(x_{t+i}^{R})}{\partial u_{t+i}}\right) \end{aligned}
dθdV(x,XR)=i=0∑N−1dθdlt+i(xt+iR)=i=0∑N−1(dθdxt+iT∂xt+i∂lt+i(xt+iR)+dθdut+iT∂ut+i∂lt+i(xt+iR)) 上式中的
l
t
+
i
(
x
t
+
i
R
)
=
l
(
x
t
+
i
,
x
t
+
i
R
,
u
t
+
i
)
l_{t+i}(x_{t+i}^{R})=l(x_{t+i},x_{t+i}^{R},u_{t+i})
lt+i(xt+iR)=l(xt+i,xt+iR,ut+i)、
f
t
+
i
=
f
(
x
t
+
i
,
u
t
+
i
)
f_{t+i}=f(x_{t+i},u_{t+i})
ft+i=f(xt+i,ut+i)、
π
N
−
i
(
θ
)
=
π
N
−
i
(
x
t
+
i
,
x
t
+
i
:
t
+
N
−
1
R
;
θ
)
\pi^{N-i}(\theta)=\pi^{N-i}(x_{t+i},x_{t+i:t+N-1}^{R};\theta)
πN−i(θ)=πN−i(xt+i,xt+i:t+N−1R;θ)。仿照之前我们再引入一些记号:
ϕ
t
+
i
=
d
x
t
+
i
T
d
θ
=
d
f
T
(
x
t
+
i
−
1
,
u
t
+
i
−
1
)
d
θ
,
ψ
t
+
i
=
d
u
t
+
i
T
d
θ
=
d
[
π
N
−
i
(
x
t
+
i
,
x
t
+
i
:
t
+
N
−
1
R
;
θ
)
]
T
d
θ
.
\phi_{t+i}=\frac{dx_{t+i}^{\mathrm{T}}}{d\theta}=\frac{df^{\mathrm{T}}(x_{t+i-1},u_{t+i-1})}{d\theta},\\\psi_{t+i}=\frac{du_{t+i}^{\mathrm{T}}}{d\theta}=\frac{d[\pi^{N-i}(x_{t+i},x_{t+i:t+N-1}^{R};\theta)]^{\mathrm{T}}}{d\theta}.
ϕt+i=dθdxt+iT=dθdfT(xt+i−1,ut+i−1),ψt+i=dθdut+iT=dθd[πN−i(xt+i,xt+i:t+N−1R;θ)]T. 那么,结合下图,就可以得到递归的计算各个
ϕ
\phi
ϕ和
ψ
\psi
ψ的方法:
ϕ
t
+
i
=
ϕ
t
+
i
−
1
∂
f
t
+
i
−
1
T
∂
x
t
+
i
−
1
+
ψ
t
+
i
−
1
∂
f
t
+
i
−
1
T
∂
u
t
+
i
−
1
,
ψ
t
+
i
=
ϕ
t
+
i
∂
[
π
N
−
i
(
θ
)
]
T
∂
x
t
+
i
+
∂
[
π
N
−
i
(
θ
)
]
T
∂
θ
,
∂
[
π
N
−
i
(
θ
)
]
T
∂
θ
=
∂
[
π
1
(
θ
)
]
T
∂
θ
∏
k
=
N
−
i
2
∂
[
π
k
(
θ
)
]
T
∂
π
k
−
1
(
θ
)
,
\begin{gathered} \phi_{t+i}=\phi_{t+i-1}\frac{\partial f_{t+i-1}^{\mathrm{T}}}{\partial x_{t+i-1}}+\psi_{t+i-1}\frac{\partial f_{t+i-1}^{\mathrm{T}}}{\partial u_{t+i-1}}, \\ \psi_{t+i}=\phi_{t+i}\frac{\partial[\pi^{N-i}(\theta)]^{\mathrm{T}}}{\partial x_{t+i}}+\frac{\partial[\pi^{N-i}(\theta)]^{\mathrm{T}}}{\partial\theta}, \\ \frac{\partial[\pi^{N-i}(\theta)]^{\mathrm{T}}}{\partial\theta}=\frac{\partial[\pi^{1}(\theta)]^{\mathrm{T}}}{\partial\theta}\prod_{k=N-i}^{2}\frac{\partial[\pi^{k}(\theta)]^{\mathrm{T}}}{\partial\pi^{k-1}(\theta)}, \end{gathered}
ϕt+i=ϕt+i−1∂xt+i−1∂ft+i−1T+ψt+i−1∂ut+i−1∂ft+i−1T,ψt+i=ϕt+i∂xt+i∂[πN−i(θ)]T+∂θ∂[πN−i(θ)]T,∂θ∂[πN−i(θ)]T=∂θ∂[π1(θ)]Tk=N−i∏2∂πk−1(θ)∂[πk(θ)]T, 尤其注意,这里比起8.5.2和8.5.3节,多出了一个
∂
[
π
N
−
i
(
θ
)
]
T
/
∂
θ
\partial[\pi^{N-i}(\theta)]^{\mathrm{T}}/\partial\theta
∂[πN−i(θ)]T/∂θ的计算,这是因为我们的策略是recurrent的,所有策略都依赖于同一套参数
θ
\theta
θ,而且我们前面的决策会影响后面的状态进而影响到后面的决策(详见上图最下方
∂
π
/
∂
π
\partial\pi/\partial\pi
∂π/∂π的那些线)。最后,我们的policy gradient就可以写成如下形式:
∂
V
(
x
,
x
R
)
∂
θ
=
∑
i
=
0
N
−
1
(
ϕ
t
+
i
∂
l
t
+
i
(
x
t
+
i
R
)
∂
x
t
+
i
+
ψ
t
+
i
∂
l
t
+
i
(
x
t
+
i
R
)
∂
u
t
+
i
)
\frac{\partial V(x,x^R)}{\partial\theta}=\sum_{i=0}^{N-1}\left(\phi_{t+i}\frac{\partial l_{t+i}(x_{t+i}^R)}{\partial x_{t+i}}+\psi_{t+i}\frac{\partial l_{t+i}(x_{t+i}^R)}{\partial u_{t+i}}\right)
∂θ∂V(x,xR)=i=0∑N−1(ϕt+i∂xt+i∂lt+i(xt+iR)+ψt+i∂ut+i∂lt+i(xt+iR)) 初始条件为
ϕ
t
=
0
\phi_t=0
ϕt=0。
最后,使用RNN作为策略函数还有一个有意思的地方,即一个perfectly-trained的RNN策略,在推理时,它的RNN循环次数可以再任意步停止,却仍能保存一些最优性。例如,如果RNN循环了两次就停止,那么它的输出对于horizon长为2的问题来说是最优的。