该书由清华大学李升波教授撰写的,主要面向工业控制领域的研究者和工程师,曾获得2024年度Springer中国新发展奖(China New Development Awards)。全书按照原理剖析、主流算法、典型示例的架构,系统地介绍了用于动态系统决策与控制的强化学习方法。全书共分为11章,内容涵盖了强化学习的基本概念、蒙特卡洛法、时序差分法、动态规划法、函数近似法、策略梯度法、近似动态规划、状态约束的处理和深度强化学习等知识点。书籍及源代码下载网站:书籍及代码链接点这里。
另外,由于本部分篇幅较长,因此分成两篇博客发表。另一篇博客的地址参考我的系列博客的地址汇总。
文章目录
书籍链接:Reinforcement Learning for Sequential Decision and Optimal Control
本篇博客主要介绍使用函数近似的(Function Approximation)Indirect RL算法。读者可能会注意到我们之前讲过的方法的状态空间和动作空间都是有限的,也就是说,它们均是使用表格的方式来存储的(Tabular Representation)。那么为什么我们这里要使用函数来近似呢?首先,求解具有很大的状态空间的序列决策问题很困难。比如,双陆棋的状态空间是 1 0 20 10^{20} 1020,而围棋的状态空间是 1 0 170 10^{170} 10170。其次,很多问题的状态空间本身就是连续的,其状态个数有无穷多个,自然不能使用表格来存储。
根据对哪个部分使用函数近似,这类方法可进一步细分为以下三种:
- Value Approximation Only:这类方法使用固定点迭代技术来更新参数化的值函数,并在得到最优的值函数(收敛)之后,每次通过最优的值函数来选择动作,而并不显式地给出策略。这类算法的代表有DQN。
- Policy Approximation Only:这类方法通常指一些naive的策略梯度方法,比如REINFORCE以及一些finite-horizon的neuro-DP方法。
- Actor-Critic Approximation:这类架构是目前RL里面最常用的架构,它同时使用了值函数近似和策略近似。在该架构里,critic通过不断更新对于值函数的估计来为当前策略的好坏提供一个更准确的评价;而actor则指导策略参数向更好表现的防线更新。这类方法因为其建立在基于梯度的优化上,因此通常具有很好的收敛性,而一些降低方差的技术,如baseline,有助于达到更好的收敛。Actor-Critic方法既可以从Indirect RL的角度来看,也可以从Direct RL的角度来看。从Indirect RL的角度来看,PEV和PIM都被基于梯度的优化方法所替代,分别对应了critic update和actor update。从Direct RL的角度来看,actor-critic方法是一种对于Policy Gradient方法的自然扩展。它的值函数被递归地计算以降低方差。虽然有种种优点,这类方法也还是有不少缺点的,比如缺少通用的收敛性保证、不可预测的deadly triad以及容易困在局部最优等等。Actor-Critic方法的代表有A3C(Asynchronous Advantage Actor-Critic)、TD3(Twin Delayed Deep Deterministic Policy Gradient)、SAC(Soft Actor-Critic)、DSAC(Distributional Soft Actor-Critic)等。
6.4 策略的近似化(Policy Approximation)
在之前的学习中,我们已经知道了从是否使用了Bellman最优性条件可以将强化学习算法分为两类:Indirect RL和Direct RL。其中,Indirect RL是基于值函数的,而Direct RL是基于策略的。Indirect RL分为两步:PEV(求得对于值函数更好的近似)和PIM(根据值函数求得更好的策略),注意这里说的两步走的方法既包含了policy iteration也包含了value iteration,因为value iteration可以看成进行了一轮PEV和PIM。对于Indirect RL来说,在寻找更好的策略时,值函数是固定的,不随着策略参数的变化而变化。而Direct RL则是把值函数当成当前策略参数的一个函数,也就是说值函数在更新策略时会跟着改变。我们在这章仅仅讨论Indirect RL中的Policy Approximation。
回顾我们在使用表格表示(Tabular Representation)时,在PIM步是怎么得到一个更好的策略的:
π
g
(
s
)
=
arg
max
a
{
Q
(
s
,
a
)
}
,
∀
s
∈
S
.
\pi^g(s)=\arg\max_a\{Q(s,a)\},\forall s\in\mathcal{S}.
πg(s)=argamax{Q(s,a)},∀s∈S. 也就是说,在获得了对于值函数的最新估计后,我们会采用一种贪心搜索的策略来获得一个更好的策略。但是,这种方法在我们使用函数来近似策略之后就会不可行的。因为上述搜索策略本质上是一种枚举的方法,但是在函数近似的情况下,我们无法枚举所有的动作。因此,我们需要将此处的PIM过程建模为一种随机优化过程:
θ
=
arg
max
θ
{
J
(
θ
)
}
s.t.
J
(
θ
)
=
E
s
∼
d
(
s
)
{
Q
(
s
,
a
)
}
,
\theta=\arg\max_\theta\{J(\theta)\}\\\text{s.t.}\\J(\theta)=\mathbb{E}_{s\sim d(s)}\{Q(s,a)\},
θ=argθmax{J(θ)}s.t.J(θ)=Es∼d(s){Q(s,a)}, 此处,
J
(
θ
)
J(\theta)
J(θ)是我们的目标函数,可以堪称是一种衡量策略好坏的指标。为了简化起见,我们先假设此处的策略是一种确定性策略,即
a
=
π
(
s
;
θ
)
a=\pi(s;\theta)
a=π(s;θ)(其实这里仅仅是一种为了简化说明的权宜之计,后面我们在实际推导时会使用非确定性策略)。那么,我们的目标函数可以写成如下形式:
θ
=
arg
max
θ
{
J
(
θ
)
}
s.t.
J
(
θ
)
=
E
s
∼
d
(
s
)
{
Q
(
s
,
π
θ
(
s
)
)
}
,
\theta=\arg\max_\theta\{J(\theta)\}\\\text{s.t.}\\J(\theta)=\mathbb{E}_{s\sim d(s)}\{Q(s,\pi_\theta(s))\},
θ=argθmax{J(θ)}s.t.J(θ)=Es∼d(s){Q(s,πθ(s))}, 这里的
π
θ
(
s
)
\pi_\theta(s)
πθ(s)是我们的参数化的策略函数,而
d
(
s
)
d(s)
d(s)是某种用于加权的分布,显然这个分布的最终得到的策略的好坏是至关重要的,因此不能随便选取,通常取为收集到的数据的分布。那么我们就可以使用若干数值优化方法来求解这个问题。一种常见的做法是使用SGD:
θ
←
θ
+
β
∇
θ
J
(
θ
)
,
\theta\leftarrow\theta+\beta\nabla_\theta J(\theta),
θ←θ+β∇θJ(θ), 这里的
∇
θ
J
(
θ
)
=
∂
J
(
θ
)
/
∂
θ
\nabla_\theta J(\theta)=\partial J(\theta)/\partial\theta
∇θJ(θ)=∂J(θ)/∂θ被称为indirect policy gradient,这是为了与Direct RL中的policy gradient做区分。Indirect policy gradient的好处如下:
- 结构上的简洁性
- 值函数的更新和策略的更新是分开的,值函数Q(s, a)不随着策略参数 θ \theta θ的变化而变化。换句话说,这里的值函数是policy-independent的,这样可以使得算法更加稳定。与之形成对比的是,Direct RL中的值函数是policy-dependent的,需要使用一系列级联的递归以及对于初始分布的假设才能进行。
6.4.1 Indirect On-Policy Gradient
这里,我们使用随机策略来改写上述有关PIM的优化问题:
θ
=
arg
max
θ
{
J
(
θ
)
}
s.t.
J
(
θ
)
=
E
s
∼
d
(
s
)
{
∑
a
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
}
.
\theta=\arg\max_\theta\{J(\theta)\}\\\text{s.t.}\\J(\theta)=\mathbb{E}_{s\sim d(s)}\left\{\sum_a\pi_\theta(a|s)Q(s,a)\right\}.
θ=argθmax{J(θ)}s.t.J(θ)=Es∼d(s){a∑πθ(a∣s)Q(s,a)}. 这里,如果使用目标策略下的分布
d
π
(
s
)
d_\pi(s)
dπ(s)来代替之前的分布
d
(
s
)
d(s)
d(s)。但是,与之前的值函数近似不同,这里对于策略的近似需要处理一个顺序的问题:先求导还是先加权?因为这里的目标分布
d
π
(
s
)
d_\pi(s)
dπ(s)也是策略参数的函数,因此先加权再求导的话会使得求梯度变得极为复杂。因此,我们先求导再加权,即我们认为求导的时候目标分布是固定的一组参数,与策略参数无关。这样做的好处是可以得到更为简便的梯度形式。
6.4.1.1 使用动作值函数的Indirect Policy Gradient
注意到,根据我们之前的讨论,在进行PIM步骤时,
Q
(
s
,
a
)
Q(s,a)
Q(s,a)和分布
d
(
s
)
d(s)
d(s)是固定的,与策略参数
θ
\theta
θ无关。因此,
J
(
θ
)
J(\theta)
J(θ)关于
θ
\theta
θ的梯度可以写成如下形式:
∇
θ
J
(
θ
)
=
∑
s
d
(
s
)
∑
a
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
.
\nabla_\theta J(\theta)=\sum_sd(s)\sum_a\nabla_\theta\pi_\theta(a|s)Q(s,a).
∇θJ(θ)=s∑d(s)a∑∇θπθ(a∣s)Q(s,a). 这里我们先求了导。接着我们再使用当前的策略下的分布来进行加权:
∇
θ
J
(
θ
)
=
∑
s
d
π
(
s
)
∑
a
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
\nabla_\theta J(\theta)\quad=\sum_sd_\pi(s)\sum_a\nabla_\theta\pi_\theta(a|s)Q(s,a)
∇θJ(θ)=s∑dπ(s)a∑∇θπθ(a∣s)Q(s,a) 紧接着,我们要使用一种被称为log-derivative trick的技巧来进一步简化这个梯度的形式。这个技巧如下:
∇
θ
log
p
(
x
;
θ
)
=
∇
θ
p
(
x
;
θ
)
p
(
x
;
θ
)
\nabla_\theta\log p(x;\theta)=\frac{\nabla_\theta p(x;\theta)}{p(x;\theta)}
∇θlogp(x;θ)=p(x;θ)∇θp(x;θ) 那么,具体代入到
∇
θ
π
θ
(
a
∣
s
)
\nabla_\theta\pi_\theta(a|s)
∇θπθ(a∣s)可得:
∇
θ
π
θ
(
a
∣
s
)
=
π
θ
(
a
∣
s
)
∇
θ
π
θ
(
a
∣
s
)
π
θ
(
a
∣
s
)
=
π
θ
(
a
∣
s
)
∇
θ
log
π
θ
(
a
∣
s
)
.
\begin{aligned} \nabla_\theta\pi_\theta(a|s)&=\pi_\theta(a|s)\frac{\nabla_\theta\pi_\theta(a|s)}{\pi_\theta(a|s)} \\ &=\pi_\theta(a|s)\nabla_\theta\log\pi_\theta(a|s). \end{aligned}
∇θπθ(a∣s)=πθ(a∣s)πθ(a∣s)∇θπθ(a∣s)=πθ(a∣s)∇θlogπθ(a∣s). 这样,我们就可以把梯度写成如下形式:
∇
θ
J
(
θ
)
=
∑
s
d
π
(
s
)
∑
a
π
θ
(
a
∣
s
)
∇
θ
log
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
=
E
s
∼
d
π
,
a
∼
π
{
∇
θ
log
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
}
,
\begin{aligned}\nabla_\theta J(\theta)&=\sum_sd_\pi(s)\sum_a\pi_\theta(a|s)\nabla_\theta\log\pi_\theta(a|s) Q(s,a)\\&=\mathbb{E}_{s\sim d_\pi,a\sim\pi}\{\nabla_\theta\log\pi_\theta(a|s) Q(s,a)\},\end{aligned}
∇θJ(θ)=s∑dπ(s)a∑πθ(a∣s)∇θlogπθ(a∣s)Q(s,a)=Es∼dπ,a∼π{∇θlogπθ(a∣s)Q(s,a)}, 注意到,最后的indirect policy gradient的形式就是一个期望的形式了。写成这种形式有助于采用sample-based的方法来进行估计。
6.4.1.2 使用状态值函数的Indirect Policy Gradient
我们能不能采用状态值函数来进行策略的近似呢?当然可以!回顾我们在第二单元博客里讲过的两种值函数之间的关系:
Q
(
s
,
a
)
≅
E
s
′
∼
P
{
r
+
γ
V
(
s
′
)
}
.
Q(s,a)\cong\mathbb{E}_{s'\sim\mathcal{P}}\{r+\gamma V(s')\}.
Q(s,a)≅Es′∼P{r+γV(s′)}.
把该式代入上面的indirect policy gradient中,我们可以得到如下形式:
∇
θ
J
(
θ
)
=
E
π
{
∇
θ
log
π
θ
(
a
∣
s
)
(
r
+
γ
V
(
s
′
)
)
}
.
\nabla_\theta J(\theta)=\mathbb{E}_\pi\{\nabla_\theta\log\pi_\theta(a|s)\big(r+\gamma V(s')\big)\}.
∇θJ(θ)=Eπ{∇θlogπθ(a∣s)(r+γV(s′))}. 采用这个式子的好处是它比采用动作值函数时的计算复杂度要低,因为式子中只有一个随机变量。随机变量个数的减少还有助于减小对于policy gradient的估计的方差,因为可以再使用同样规模的样本数时取得更高的估计精度。
6.4.2 Indirect Off-Policy Gradient
6.4.2.1 使用动作值函数的Indirect Off-Policy Gradient
推导的起点还是下面这个式子:
∇
θ
J
(
θ
)
=
∑
s
d
(
s
)
∑
a
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
.
\nabla_\theta J(\theta)=\sum_sd(s)\sum_a\nabla_\theta\pi_\theta(a|s)Q(s,a).
∇θJ(θ)=s∑d(s)a∑∇θπθ(a∣s)Q(s,a). 在off-policy的情况下,我们需要选取behavior策略下的分布作为加权的分布,即
d
(
s
)
=
d
b
(
s
)
d(s)=d_b(s)
d(s)=db(s)。那么,我们可以得到如下形式的梯度:
∇
θ
J
(
θ
)
=
∑
s
d
b
(
s
)
∑
a
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
\nabla_\theta J(\theta)=\sum_sd_b(s)\sum_a\nabla_\theta\pi_\theta(a|s)Q(s,a)
∇θJ(θ)=s∑db(s)a∑∇θπθ(a∣s)Q(s,a) 那么,我们按照之前学过的知识回想,这里需不需要引入IS Ratio呢?答案是不需要。为什么呢?先来回顾一下之前引入IS Ratio的理由。之前引入IS Ratio是因为需要使用从一个分布下得到的样本来估计另一个分布下的期望。那么,两个分布之间最大的不同是什么?就是他们的状态分布,即求期望时加的权不一样。但是回顾我们上面在推导indirect off-policy gradient时的式子,可以发现,第一个加权因子是
d
(
s
)
d(s)
d(s)本来就是可以在一定情况下随便选取的,而第二个加权因子是一个条件概率
π
θ
(
a
∣
s
)
\pi_\theta(a|s)
πθ(a∣s),这个概率是可以通过当前概率计算得到的。因此,对于从behavior policy下采样得到的样本
(
s
b
,
a
b
,
s
b
′
)
(s_b,a_b,s_b')
(sb,ab,sb′),我们只使用
s
b
s_b
sb,而
a
b
a_b
ab可以使用当前策略产生的
a
π
a_\pi
aπ来代替,同时
s
b
′
s_b'
sb′因为我们使用了动作值函数而显得没有必要了。所以,对于off-policy的情况,我们不需要引入IS Ratio。因此,我们可以得到如下形式的梯度:
∇
θ
J
(
θ
)
=
∑
s
d
b
(
s
)
∑
a
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
=
E
s
∼
d
b
,
a
∼
π
{
∇
θ
log
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
}
.
\begin{aligned} \nabla_\theta J(\theta)&=\sum_sd_b(s)\sum_a\nabla_\theta\pi_\theta(a|s)Q(s,a)\\ &=\mathbb{E}_{s\sim d_b,a\sim\pi}\{\nabla_\theta\log\pi_\theta(a|s)Q(s,a)\}. \end{aligned}
∇θJ(θ)=s∑db(s)a∑∇θπθ(a∣s)Q(s,a)=Es∼db,a∼π{∇θlogπθ(a∣s)Q(s,a)}.
6.4.2.2 使用状态值函数的Indirect Off-Policy Gradient
与动作值函数的情况不同,当我们想要使用状态值函数来进行策略的近似时,我们需要引入IS Ratio。这是因为在使用状态值函数计算indirect off-policy gradient时,还需要根据当前状态s和动作a来得到下一个状态s’,但是,因为当前状态s是从behavior policy下采样得到的(即
s
b
s_b
sb),而下一个状态s’是从目标策略下采样得到的(即
s
π
s_\pi
sπ),因此存在一个policy mismatch问题。为了解决这个问题,我们需要引入IS Ratio。那么,我们可以得到如下形式的梯度:
∇
θ
J
(
θ
)
=
∑
s
d
b
(
s
)
∑
a
b
(
a
∣
s
)
π
θ
(
a
∣
s
)
b
(
a
∣
s
)
∇
θ
log
π
θ
(
a
∣
s
)
∑
s
′
p
(
s
′
∣
s
,
a
)
(
r
+
γ
V
(
s
′
)
)
=
E
s
∼
d
b
,
a
∼
b
,
s
′
∼
p
{
π
θ
(
a
∣
s
)
b
(
a
∣
s
)
∇
θ
log
π
θ
(
a
∣
s
)
(
r
+
γ
V
(
s
′
)
)
}
.
\begin{aligned} \nabla_\theta J(\theta)&=\sum_sd_b(s)\sum_ab(a|s)\frac{\pi_\theta(a|s)}{b(a|s)}\nabla_\theta\log\pi_\theta(a|s)\sum_{s'}p(s'|s,a)\big(r+\gamma V(s')\big)\\ &=\mathbb{E}_{s\sim d_b,a\sim b,s'\sim p}\left\{\frac{\pi_\theta(a|s)}{b(a|s)}\nabla_\theta\log\pi_\theta(a|s)\big(r+\gamma V(s')\big)\right\}. \end{aligned}
∇θJ(θ)=s∑db(s)a∑b(a∣s)b(a∣s)πθ(a∣s)∇θlogπθ(a∣s)s′∑p(s′∣s,a)(r+γV(s′))=Es∼db,a∼b,s′∼p{b(a∣s)πθ(a∣s)∇θlogπθ(a∣s)(r+γV(s′))}. 与上面动作值函数的indirect off-policy gradient相比,这里的版本容易在计算时引入高方差,因为近似误差、IS Ratio的不连续性、bootstrapping、很少被behavior policy采样到的却可能对于target policy很重要的状态等因素。因此,在off-policy的情况下,我们通常会使用动作值函数来进行策略的近似。
6.4.3 使用策略近似前提下的PIM优化过程的其它构建方式
在前文中我们仿照表格表示时的贪婪搜索,构建了一个使用策略近似时的PIM随机优化问题:
θ
=
arg
max
θ
{
J
(
θ
)
}
s.t.
J
(
θ
)
=
E
s
∼
d
(
s
)
{
Q
(
s
,
a
)
}
,
\theta=\arg\max_\theta\{J(\theta)\}\\\text{s.t.}\\J(\theta)=\mathbb{E}_{s\sim d(s)}\{Q(s,a)\},
θ=argθmax{J(θ)}s.t.J(θ)=Es∼d(s){Q(s,a)}, 那么,这种构建方式是唯一的吗?回想我们在第五单元第5.5节讲过的“什么是一个更好的策略”,这里的答案当然是不唯一的。我们可以使用其它方式来构建PIM阶段的优化问题。
第一种方法是在哟i话目标中加上一个policy entropy项,即使用Entropy Regularization。这样可以更好地平衡exploration和exploitation,让模型拥有更多的探索能力。第二种方法是使用基于期望的“更好的策略”的定义。这样可以保证PIM过程的单调性以及防止快速的策略改变。
6.4.3.1 使用Entropy Regularization的PIM
与第五单元第5.5节讲的一样,这里我们引入Entropy Regularization项后可以构建出一个等价于
ϵ
\epsilon
ϵ-greedy的策略。将第五单元那里的讨论扩展到连续状态空间(注意,这里并没有说动作空间也是连续的。实际上动作空间可以是连续的或离散的,下面会说明)中可得下面的式子:
θ
=
arg
max
θ
{
J
(
θ
)
}
s.t.
J
(
θ
)
=
E
s
∼
d
π
{
π
θ
(
a
∗
∣
s
)
+
λ
⋅
H
(
π
θ
(
⋅
∣
s
)
)
}
a
∗
=
arg
max
a
Q
(
s
,
a
)
,
H
(
π
θ
(
⋅
∣
s
)
)
=
−
∫
a
π
θ
(
a
∣
s
)
log
π
θ
(
a
∣
s
)
d
a
,
\theta=\arg\max_\theta\{J(\theta)\}\\\text{s.t.}\\ J(\theta)=\mathbb{E}_{s\sim d_{\pi}}\{\pi_{\theta}(a^{*}|s)+\lambda\cdot\mathcal{H}\big(\pi_{\theta}(\cdot|s)\big)\} \\ a^{*}=\arg\max_{a}Q(s,a), \\ \mathcal{H}\big(\pi_{\theta}(\cdot|s)\big)=-\int_{a}\pi_{\theta}(a|s)\log\pi_{\theta}(a|s) \mathrm{d}a,
θ=argθmax{J(θ)}s.t.J(θ)=Es∼dπ{πθ(a∗∣s)+λ⋅H(πθ(⋅∣s))}a∗=argamaxQ(s,a),H(πθ(⋅∣s))=−∫aπθ(a∣s)logπθ(a∣s)da, 这里的
λ
\lambda
λ是一个超参数,用于平衡解的最优性和探索能力。这里我们在每次求解关于
θ
\theta
θ的最优化问题时,都要重新计算
a
∗
a^{*}
a∗。注意,这里如果动作空间是离散的,那么可以使用枚举的方法来获得
a
∗
a^{*}
a∗;如果动作空间是连续的,则要在PEV步更新获得最新的动作值函数估计值之后,使用数值优化方法来求解
a
∗
a^{*}
a∗。可以看出,构建的
J
(
θ
)
J(\theta)
J(θ)包含两项,第一项用于最大化选择greedy action的概率,第二项用于保证学得的策略有一定程度的随机性。
为了得到indirect policy gradient的解析形式,我们需要实例化一种参数化的策略形式。不失普遍性地,我们可以选择一个高斯分布来表示策略:
π
θ
∼
N
(
μ
(
θ
)
,
K
(
θ
)
)
\pi_{\theta}{\sim}\mathcal{N}(\mu(\theta),\mathcal{K}(\theta))
πθ∼N(μ(θ),K(θ)) 这样,我们可以得到如下形式的indirect policy gradient:
∇
θ
J
(
θ
)
=
E
s
∼
d
π
{
∇
θ
π
θ
(
a
∗
∣
s
)
+
λ
⋅
∇
θ
log
det
(
K
(
θ
)
)
}
.
\nabla_\theta J(\theta)=\mathbb{E}_{s\sim d_\pi}\big\{\nabla_\theta\pi_\theta(a^*|s)+\lambda\cdot\nabla_\theta\log\det\big(\mathcal{K}(\theta)\big)\big\}.
∇θJ(θ)=Es∼dπ{∇θπθ(a∗∣s)+λ⋅∇θlogdet(K(θ))}.
使用Entropy Regularization的好处是可以鼓励RL Agent去探索更多的状态空间,从而可以更好地平衡exploration和exploitation,实现更好的sample efficiency。但是这样也会牺牲一部分的策略的最优性。一种可能的解决办法是使用可变的 λ \lambda λ,即在训练的前期使用较大的 λ \lambda λ,在训练的后期逐渐减小 λ \lambda λ,这样可以在训练的前期更多地探索状态空间,而在训练的后期更多地利用已有的经验。
6.4.3.2 使用基于期望的“更好的策略”的定义的PIM
这里我们要用到第五单元博客第5.5.2节讲过的“更好的策略”的第二种定义。先来回顾一下那里是怎样定义PIM优化问题的:
π
k
+
1
=
a
r
g
max
π
{
δ
−
ρ
(
π
,
π
k
)
}
,
s.t.
E
s
∼
d
(
s
)
{
∑
π
(
a
∣
s
)
q
π
k
(
s
,
a
)
}
=
δ
+
E
s
∼
d
(
s
)
{
v
π
k
(
s
)
}
δ
≥
0.
\begin{aligned} \pi_{k+1}=\mathrm{arg}& \max_{\pi}\{\delta-\rho(\pi,\pi_{k})\}, \\ &\text{s.t.} \\ \mathbb{E}_{s\sim d(s)} \left\{\sum\pi(a|s)q^{\pi_{k}}\left(s,a\right)\right\}& =\delta+\mathbb{E}_{s\sim d(s)}\left\{v^{\pi_k}\left(s\right)\right\} \\ &\delta\geq0. \end{aligned}
πk+1=argEs∼d(s){∑π(a∣s)qπk(s,a)}πmax{δ−ρ(π,πk)},s.t.=δ+Es∼d(s){vπk(s)}δ≥0. 注意到,这里的
ρ
(
π
,
π
k
)
\rho(\pi,\pi_{k})
ρ(π,πk)是用来衡量两个策略之间的相似性的。针对我们这里的情况,我们将
ρ
(
π
,
π
k
)
\rho(\pi,\pi_{k})
ρ(π,πk)选取为KL散度:
D
K
L
(
π
θ
,
π
o
l
d
)
=
d
e
f
∫
π
θ
(
a
∣
s
)
log
π
θ
(
a
∣
s
)
π
o
l
d
(
a
∣
s
)
d
a
,
D_{\mathrm{KL}}(\pi_\theta,\pi_{\mathrm{old}})\stackrel{\mathrm{def}}{=}\int\pi_\theta(a|s)\log\frac{\pi_\theta(a|s)}{\pi_{\mathrm{old}}(a|s)}\mathrm{d}a,
DKL(πθ,πold)=def∫πθ(a∣s)logπold(a∣s)πθ(a∣s)da, 那么,我们的优化问题就可以构造如下:
θ
=
arg
max
θ
{
δ
−
ρ
⋅
E
s
∼
d
(
s
)
D
K
L
(
π
θ
,
π
o
l
d
)
}
s.t.
E
s
∼
d
(
s
)
,
a
∼
π
θ
{
Q
π
o
l
d
(
s
,
a
)
}
=
δ
+
E
s
∼
d
(
s
)
,
a
∼
π
o
l
d
{
Q
π
o
l
d
(
s
,
a
)
}
,
\theta=\arg\max_{\theta}\{\delta-\rho\cdot\mathbb{E}_{s\sim d(s)}D_{\mathrm{KL}}(\pi_{\theta},\pi_{\mathrm{old}})\}\\\text{s.t.}\\\mathbb{E}_{s\sim d(s),a\sim\pi_{\theta}}\{Q^{\pi_{\mathrm{old}}}(s,a)\}=\delta+\mathbb{E}_{s\sim d(s),a\sim\pi_{\mathrm{old}}}\{Q^{\pi_{\mathrm{old}}}(s,a)\},
θ=argθmax{δ−ρ⋅Es∼d(s)DKL(πθ,πold)}s.t.Es∼d(s),a∼πθ{Qπold(s,a)}=δ+Es∼d(s),a∼πold{Qπold(s,a)}, 注意,上式没有写错,左右两边的动作值函数的上标都是
π
o
l
d
\pi_{\mathrm{old}}
πold,原因参见第五单元5.5节以及之前的博客。接下来,我们将
δ
\delta
δ改写为两个期望相减:
J
(
θ
)
=
E
s
∼
d
(
s
)
,
a
∼
π
θ
{
Q
π
o
l
d
(
s
,
a
)
}
−
E
s
∼
d
(
s
)
,
a
∼
π
o
l
d
{
Q
π
o
l
d
(
s
,
a
)
}
−
ρ
⋅
E
s
∼
d
(
s
)
D
K
L
(
π
θ
,
π
o
l
d
)
\begin{aligned} J(\theta)=\mathbb{E}_{s\sim d(s),a\sim\pi_{\theta}}\{Q^{\pi_{\mathrm{old}}}(s,a)\}&-\mathbb{E}_{s\sim d(s),a\sim\pi_{\mathrm{old}}}\{Q^{\pi_{\mathrm{old}}}(s,a)\}\\&-\rho\cdot\mathbb{E}_{s\sim d(s)}D_{\mathrm{KL}}(\pi_{\theta},\pi_{\mathrm{old}}) \end{aligned}
J(θ)=Es∼d(s),a∼πθ{Qπold(s,a)}−Es∼d(s),a∼πold{Qπold(s,a)}−ρ⋅Es∼d(s)DKL(πθ,πold) 接下来,我们对于这个式子求导。注意到第二项与策略参数
θ
\theta
θ无关,因此求完导之后的形式如下:
∇
θ
J
=
E
s
∼
d
(
s
)
{
∑
a
∇
θ
π
θ
(
α
∣
s
)
Q
π
o
l
d
(
s
,
α
)
}
−
ρ
E
s
∼
d
(
s
)
{
∇
θ
D
K
L
(
π
θ
,
π
o
l
d
)
}
.
\nabla_\theta J =\mathbb{E}_{s\sim d(s)}\left\{\sum_a\nabla_\theta\pi_\theta(\alpha|s)Q^{\pi_{\mathrm{old}}}(s,\alpha)\right\}-\rho\mathbb{E}_{s\sim d(s)}\{\nabla_\theta D_{\mathrm{KL}}(\pi_\theta,\pi_{\mathrm{old}})\}.
∇θJ=Es∼d(s){a∑∇θπθ(α∣s)Qπold(s,α)}−ρEs∼d(s){∇θDKL(πθ,πold)}. 但是,注意到我们此时手中的数据都是来源于上一轮的老策略
π
o
l
d
\pi_{\mathrm{old}}
πold,直接使用上面的梯度来更新存在一个分布mismatch的问题,因此需要做一步转换:
∇
θ
J
≈
E
s
∼
d
π
o
l
d
{
∑
a
π
o
l
d
(
a
∣
s
)
∇
θ
π
θ
(
a
∣
s
)
π
o
l
d
(
a
∣
s
)
Q
π
o
l
d
(
s
,
a
)
}
−
ρ
E
s
∼
d
π
o
l
d
{
∇
θ
D
K
L
(
π
θ
,
π
o
l
d
)
}
=
E
s
∼
d
π
o
l
d
,
a
∼
π
o
l
d
{
∇
θ
π
θ
(
a
∣
s
)
π
o
l
d
(
a
∣
s
)
Q
π
o
l
d
(
s
,
a
)
}
−
ρ
E
s
∼
d
π
o
l
d
{
∇
θ
D
K
L
(
π
θ
,
π
o
l
d
)
}
\begin{aligned} \nabla_\theta J&\approx\mathbb{E}_{s\sim d_{\pi_{\mathrm{old}}}}\left\{\sum_a\pi_{\mathrm{old}}(a|s)\frac{\nabla_\theta\pi_\theta(a|s)}{\pi_{\mathrm{old}}(a|s)}Q^{\pi_{\mathrm{old}}}(s,a)\right\} -\rho\mathbb{E}_{s\sim d_{\pi_{\mathrm{old}}}}\{\nabla_{\theta}D_{\mathrm{KL}}(\pi_{\theta},\pi_{\mathrm{old}})\} \\ &=\mathbb{E}_{s\sim d_{\pi_{\mathrm{old}}},a\sim\pi_{\mathrm{old}}}\left\{\frac{\nabla_{\theta}\pi_{\theta}(a|s)}{\pi_{\mathrm{old}}(a|s)}Q^{\pi_{\mathrm{old}}}(s,a)\right\} -\rho\mathbb{E}_{s\sim d_{\pi_{\mathrm{old}}}}\{\nabla_{\theta}D_{\mathrm{KL}}(\pi_{\theta},\pi_{\mathrm{old}})\} \end{aligned}
∇θJ≈Es∼dπold{a∑πold(a∣s)πold(a∣s)∇θπθ(a∣s)Qπold(s,a)}−ρEs∼dπold{∇θDKL(πθ,πold)}=Es∼dπold,a∼πold{πold(a∣s)∇θπθ(a∣s)Qπold(s,a)}−ρEs∼dπold{∇θDKL(πθ,πold)} 为了化简上述式子,我们将策略实例化为一个高斯分布。那么,上面梯度的解析解形式可以写成:
∇
θ
J
=
E
π
o
l
d
{
∇
θ
π
θ
(
a
∣
s
)
π
o
l
d
(
a
∣
s
)
Q
π
o
l
d
(
s
,
a
)
+
ρ
∇
θ
[
log
det
(
K
(
θ
)
)
−
tr
(
K
o
l
d
−
1
K
(
θ
)
)
−
(
μ
(
θ
)
−
μ
o
l
d
)
T
K
o
l
d
−
1
(
μ
(
θ
)
−
μ
o
l
d
)
]
}
,
\begin{aligned}\nabla_{\theta}J=\mathbb{E}_{\pi_{\mathrm{old}}}\left\{\frac{\nabla_{\theta}\pi_{\theta}(a|s)}{\pi_{\mathrm{old}}(a|s)}Q^{\pi_{\mathrm{old}}}(s,a)\right.&+\rho\nabla_{\theta}\left[\log\det(\mathcal{K}(\theta))-\operatorname{tr}\left(\mathcal{K}_{\mathrm{old}}^{-1}\mathcal{K}(\theta)\right)\right.\\&-\left(\mu(\theta)-\mu_{\mathrm{old}})^T\mathcal{K}_{\mathrm{old}}^{-1}(\mu(\theta)-\mu_{\mathrm{old}})\right]\biggr\},\end{aligned}
∇θJ=Eπold{πold(a∣s)∇θπθ(a∣s)Qπold(s,a)+ρ∇θ[logdet(K(θ))−tr(Kold−1K(θ))−(μ(θ)−μold)TKold−1(μ(θ)−μold)]}, 这里的
μ
o
l
d
\mu_{\mathrm{old}}
μold和
K
o
l
d
\mathcal{K}_{\mathrm{old}}
Kold是上一轮策略的均值和协方差矩阵。
使用KL散度的好处在于可以避免相邻两次更新时的参数剧烈改变,从而有助于稳定训练过程。
注意到,最终我们得出的梯度式子的形式与TRPO算法的梯度形式十分相似,甚至与TRPO的扩展算法PPO的一种变体的梯度式子一模一样。但是二者的出发点是大相径庭的。此处的式子的推导在于定义了什么是一个更好的策略之后,使用KL散度作为惩罚项来求解一个无约束优化问题;而TRPO的梯度公式则来自minorize-
maximization optimization问题。
6.5 Actor-Critic算法
标准的Indirect RL包含以下两步(不管是策略迭代还是值迭代):Policy Evaluation(PEV)和Policy Improvement(PIM)。在标准的Indirect RL中,这两步都是“完整的”,即PEV会经过无穷步的迭代以及PIM会采用greedy来获取最优策略。当我们把表格表示的Indirect RL使用函数近似之后,就得到了著名的Actor-Critic算法。Actor-Critic算法通常包含了函数近似以及基于梯度的更新算法。
Actor-Critic算法包含两个部分,一个是Actor,它负责控制agent怎么和环境交互,相当于之前Indirect RL中的PIM;另一个是Critic,它负责评估Actor的策略,相当于之前Indirect RL中的PEV。类似于之前使用表格表示时的情况,用上函数近似后,actor和critic两部分也需要进行无穷此梯度更新才能被称之为“完整的”。但是,这样做会带来很大的计算开销,因此实际的Actor-Critic算法通常只会进行有限步骤的更新。但是,这个有限的迭代次数一定要仔细选取,因为如果迭代次数太少,由于Policy Evaluation的不准确性以及Policy Improvement实际并没有达到最优而致使算法出现不稳定以至于发散。
Actor-Critic算法的框架如下所示:
从上图也可看出在本单元中我们讨论的Actor-Critic算法都是off-policy的。上图共有三个重要组件:Sampler负责根据target策略与环境交互得到sample;Critic负责更新用于近似值函数的函数的参数来对于值函数进行更好的估计;Actor负责更新用于近似策略的函数的参数来对于策略进行更好的近似。
6.5.1 Actor-Critic算法的分类与概述
根据我们为Critc选择的值函数是动作值函数还是状态值函数以及我们为Actor选择的策略是确定性策略还是随机策略,我们可以将Actor-Critic算法分为四类:
观看上表我们会发现其中采用确定性策略且采用状态值函数的那一类被用斜线划掉了。这是因为这类方法在model-free(即不知道环境模型或者说状态转移概率 P ( s ′ ∣ s , a ) \mathcal{P}(s'|s,a) P(s′∣s,a))的情况下是不存在的。这是因为当使用状态值函数的时候,需要用到状态转移概率(环境模型),但此时的环境模型是未知的。
6.5.2 On-Policy Actor-Critic with Action-Value Function
6.5.2.1 Deterministic Policy版本
回顾我们在第6.4.1.1节讲过的indirect on-policy gradient的形式:
∇
θ
J
(
θ
)
=
∑
s
d
(
s
)
∑
a
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
.
\nabla_\theta J(\theta)=\sum_sd(s)\sum_a\nabla_\theta\pi_\theta(a|s)Q(s,a).
∇θJ(θ)=s∑d(s)a∑∇θπθ(a∣s)Q(s,a). 因为这里的策略是确定性的,因此第二重对于动作的求和就直接去掉了:
∇
θ
J
(
θ
)
=
∑
s
d
(
s
)
∇
θ
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
.
\nabla_\theta J(\theta)=\sum_sd(s)\nabla_\theta\pi_\theta(a|s)Q(s,a).
∇θJ(θ)=s∑d(s)∇θπθ(a∣s)Q(s,a). 因此,可进一步的写成下面的期望形式:
∇
θ
J
A
c
t
o
r
=
E
s
∼
d
π
{
∇
θ
π
θ
(
s
)
∇
a
Q
(
s
,
a
;
w
)
}
,
\nabla_\theta J_{\mathrm{Actor}}=\mathbb{E}_{s\sim d_\pi}\{\nabla_\theta\pi_\theta(s)\nabla_aQ(s,a;w)\},
∇θJActor=Es∼dπ{∇θπθ(s)∇aQ(s,a;w)}, 这个公式也被称为deterministic policy gradient(DPG)。简要介绍一下里面各个量的维度。这里,动作s是一个m维的列向量,策略参数
θ
\theta
θ是一个n维的列向量,动作值函数Q是一个标量,
∇
θ
π
θ
(
s
)
=
d
e
f
∂
π
T
/
∂
θ
∈
R
l
θ
×
m
\nabla_\theta\pi_\theta(s)\overset{\mathrm{def}}{\operatorname*{=}}\partial\pi^\mathrm{T}/\partial\theta\in\mathbb{R}^{l_\theta\times m}
∇θπθ(s)=def∂πT/∂θ∈Rlθ×m是一个
l
θ
×
m
l_\theta\times m
lθ×m的矩阵,
∇
a
Q
(
s
,
a
;
w
)
=
d
e
f
∂
Q
/
∂
a
∈
R
m
′
\nabla_aQ(s,a;w)\overset{\mathrm{def}}{\operatorname*{=}}\partial Q/\partial a\in\mathbb{R}^{m^{\prime}}
∇aQ(s,a;w)=def∂Q/∂a∈Rm′是一个
m
′
m^{\prime}
m′维的列向量。那么最后的梯度就是一个
l
θ
×
1
l_\theta\times 1
lθ×1的列向量。
算法的整体框架如下:
下面来解释一下算法的关键部分:
-
参数
- α \alpha α:critic的学习率
- β \beta β:actor的学习率
- γ \gamma γ:discount factor
- n c n_c nc:critic每轮大循环里面的迭代次数。前面说过,这个值按理论上来说应该达到无穷次,但是实际上我们只会进行有限次的迭代。
- n a n_a na:actor每轮大循环里面的迭代次数。
- M M M:在每轮大循环里面采样时将环境重置回初始状态的次数,与下面的episode长度共同决定了每轮数据集大小(Batch Size)。
- B B B:每轮大循环里面的episode长度。在M轮中的每轮探索环境收集数据时达到该长度或者达到终止条件后就会结束。
这里超参数的选取是AC算法里面十分重要的一点,需要根据实际情况和经验进行调整。比如 n c = 5 ∼ 20 , n a = 1 n_c{=}5{\sim}20,n_a{=}1 nc=5∼20,na=1或者 n c = n a = 1 n_c{=}n_a{=}1 nc=na=1是两种常见的选择critic和actor的迭代次数的方法。
-
Data Collection:这里之所以在探索环境时引入了一个随机噪声 ϵ \epsilon ϵ是因为我们这里本来就是一个确定性的策略,如果在探索环境时还不加上噪声的话,那么对于训练出来的模型就缺乏对于环境的全局认识,自然远远达不到最优的。这里的 ϵ \epsilon ϵ是一个服从高斯分布 N ( 0 , σ ϵ 2 ) \mathcal{N}(0,\sigma^2_{\epsilon}) N(0,σϵ2)的随机噪声。
-
Critic Update:这里用的就是前面值函数近似那里(第5.3.1节)的公式,只不过把状态值函数换成了动作值函数且把取期望换成了使用大小为 D \mathcal{D} D的数据集来估计。
-
Actor Update:这里的更新公式就是DPG的梯度公式。也是吧取期望换成了使用大小为 D \mathcal{D} D的数据集来估计。
6.5.2.2 Stochastic Policy版本
回顾我们在第6.4.1.1节讲过的采用动作值函数的indirect on-policy gradient的形式:
∇
θ
J
(
θ
)
=
∑
s
d
π
(
s
)
∑
a
π
θ
(
a
∣
s
)
∇
θ
log
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
=
E
s
∼
d
π
,
a
∼
π
{
∇
θ
log
π
θ
(
a
∣
s
)
Q
(
s
,
a
)
}
,
\begin{aligned}\nabla_\theta J(\theta)&=\sum_sd_\pi(s)\sum_a\pi_\theta(a|s)\nabla_\theta\log\pi_\theta(a|s) Q(s,a)\\&=\mathbb{E}_{s\sim d_\pi,a\sim\pi}\{\nabla_\theta\log\pi_\theta(a|s) Q(s,a)\},\end{aligned}
∇θJ(θ)=s∑dπ(s)a∑πθ(a∣s)∇θlogπθ(a∣s)Q(s,a)=Es∼dπ,a∼π{∇θlogπθ(a∣s)Q(s,a)}, 这里面使用了log-derivative trick。但是,做了这种变换后仍然不能直接使用,因为这样的做法会使得在sample-based的估计中带来高方差。为了获得一个低方差的stochastic gradient版本,我们需要使用重参数技巧(Reparameterization Trick)。为此,我们不使用上述引入log-derivative trick的
J
(
θ
)
J(\theta)
J(θ)版本,而是先回到原始版本:
∇
θ
J
Actor
=
∇
θ
E
s
∼
d
π
,
a
∼
π
θ
{
Q
(
s
,
a
;
w
)
}
.
\nabla_\theta J_\text{Actor}{=\nabla_\theta\mathbb{E}_{s\sim d_\pi,a\sim\pi_\theta}}\{Q(s,a;w)\}.
∇θJActor=∇θEs∼dπ,a∼πθ{Q(s,a;w)}. 紧接着,我们对动作a进行重参数化:
a
=
g
θ
(
s
,
ϵ
)
a=g_\theta(s,\epsilon)
a=gθ(s,ϵ) 这里的
g
θ
(
s
,
ϵ
)
g_\theta(s,\epsilon)
gθ(s,ϵ)是一个确定性的函数,而
ϵ
\epsilon
ϵ是一个服从某种分布
p
(
ϵ
)
p(\epsilon)
p(ϵ)的随机变量。那么,上式就可以进一步化简:
∇
θ
E
s
,
a
∼
π
θ
{
Q
(
s
,
a
;
w
)
}
=
∇
θ
E
s
,
ϵ
∼
p
(
ϵ
)
{
Q
(
s
,
g
θ
(
s
,
ϵ
)
;
w
)
}
=
E
s
,
ϵ
∼
p
(
ϵ
)
{
∇
θ
Q
(
s
,
g
θ
(
s
,
ϵ
)
;
w
)
}
=
E
s
,
ϵ
∼
p
(
ϵ
)
{
∇
θ
g
θ
(
s
,
ϵ
)
∇
a
Q
(
s
,
a
;
w
)
}
,
\begin{aligned} \nabla_\theta\mathbb{E}_{s,a\sim\pi_\theta}\{Q(s,a;w)\}& =\nabla_{\theta}\mathbb{E}_{s,\epsilon\sim p(\epsilon)}\{Q(s,g_{\theta}(s,\epsilon);w)\} \\ &=\mathbb{E}_{s,\epsilon\sim p(\epsilon)}\{\nabla_{\theta}Q(s,g_{\theta}(s,\epsilon);w)\} \\ &=\mathbb{E}_{s,\epsilon\sim p(\epsilon)}\{\nabla_{\theta}g_{\theta}(s,\epsilon)\nabla_{a}Q(s,a;w)\}, \end{aligned}
∇θEs,a∼πθ{Q(s,a;w)}=∇θEs,ϵ∼p(ϵ){Q(s,gθ(s,ϵ);w)}=Es,ϵ∼p(ϵ){∇θQ(s,gθ(s,ϵ);w)}=Es,ϵ∼p(ϵ){∇θgθ(s,ϵ)∇aQ(s,a;w)}, 注意这里之所以右边第一式到第二式可以把梯度符号移到期望里面是因为这里期望的两个下标s和
ϵ
\epsilon
ϵ均与策略参数
θ
\theta
θ无关。再来说说右边第三式的含义,化简到这里就可以看出,这里求梯度可以看成是对于一个有关策略参数的确定性函数和动作值函数分别对于策略参数
θ
\theta
θ和动作a求梯度。
接下来的问题就变成了如何构建这个重参数化函数
g
θ
(
s
,
ϵ
)
g_\theta(s,\epsilon)
gθ(s,ϵ)。这里举两个例子。假如我们的原始策略是一个高斯分布,即
π
θ
(
a
∣
s
)
∼
N
(
μ
θ
(
s
)
,
σ
θ
2
(
s
)
)
\pi_\theta(a|s){\sim}\mathcal{N}(\mu_\theta(s),\sigma_\theta^2(s))
πθ(a∣s)∼N(μθ(s),σθ2(s)) 那么,我们可以使用下面的重参数化函数:
g
θ
(
s
,
ϵ
)
=
μ
θ
(
s
)
+
ϵ
⋅
σ
θ
(
s
)
,
g_\theta(s,\epsilon)=\mu_\theta(s)+\epsilon\cdot\sigma_\theta(s),
gθ(s,ϵ)=μθ(s)+ϵ⋅σθ(s), 这里的
ϵ
\epsilon
ϵ是一个服从
N
(
0
,
1
)
\mathcal{N}(0,1)
N(0,1)的随机变量。另一个例子是,如果我们的原始策略服从均匀分布,即
π
θ
(
a
∣
s
)
∼
U
(
a
min
,
a
max
)
\pi_\theta(a|s){\sim}\mathcal{U}(a_{\min},a_{\max})
πθ(a∣s)∼U(amin,amax),那么我们可以使用下面的重参数化函数:
g
θ
(
s
,
ϵ
)
=
θ
max
+
θ
min
2
+
ϵ
⋅
θ
max
−
θ
min
2
,
g_\theta(s,\epsilon)=\frac{\theta_{\max}+\theta_{\min}}2+\epsilon\cdot\frac{\theta_{\max}-\theta_{\min}}2,
gθ(s,ϵ)=2θmax+θmin+ϵ⋅2θmax−θmin, 这里的
ϵ
\epsilon
ϵ是一个服从
U
(
−
1
,
1
)
\mathcal{U}(-1,1)
U(−1,1)的随机变量。
使用了重参数技巧的stochastic policy gradient的好处在于求期望的时候期望下标里面不包含动作分布,这样可以减小估计的方差。这种好处的取得是因为我们在构建重参数化函数的时候引入了一个分布已知的随机变量。这样就提供了一定量的确定性信息。但是,这种方法因为其认为假定了一个分布,自然也不是没有代价的。只有当我们假设的分布与真实分布贴近时,才可能降低方差。
算法的整体框架如下:
这里要说明的事项基本上在上面的Deterministic Policy版本中都有提到,这里就不再赘述。唯一需要注意的是Actor Update部分里的梯度公式是使用了重参数技巧的stochastic policy gradient的梯度公式。
6.5.3 On-policy AC with State-Value Function
很遗憾,我们在使用状态值函数时灵活性较小。首先,使用状态值函数的时候策略只能选择随机策略,这在第6.5.1节中提到过。在使用了随机策略的前提下,也不能像动作值函数那里使用reparameterization trick来减小方差,只能使用log-derivative trick。不过,这里也有好处,就是使用随机策略和状态值函数的AC算法需要更少的样本来达到精确的估计。
首先,再次回顾一下6.4.1.2节里那里得出的indirect policy gradient的形式:
∇
θ
J
A
c
t
o
r
(
θ
)
=
E
π
θ
{
∇
θ
log
π
θ
(
a
∣
s
)
(
r
+
γ
V
(
s
′
;
w
)
)
}
.
\begin{aligned} \nabla_\theta J_{\mathrm{Actor}}(\theta) &=\mathbb{E}_{\pi_\theta}\{\nabla_\theta\log\pi_\theta(a|s)\left(r+\gamma V(s^{\prime};w)\right)\}. \end{aligned}
∇θJActor(θ)=Eπθ{∇θlogπθ(a∣s)(r+γV(s′;w))}. 算法的整体框架如下:
与刚才讲的两个算法基本一致,这里就不再赘述。
6.6 一个例子:环形路上的自动驾驶
这里以一个实例来结束本单元。我们考虑一个环形路上的自动驾驶问题。控制的目标是使得横向位置、Yaw角和纵向速度的误差以及车辆控制所需的转向以及加速所付出的代价最小。注意,这里我们重点关注是怎么把这个问题建模成一个RL问题的,至于具体的车辆动力学建模以及超参数选取等请参考原书第6.6节。
首先,定义状态空间和动作空间如下:
s
=
[
ρ
,
ψ
,
u
,
v
,
ω
]
T
∈
R
5
a
=
[
δ
,
a
x
]
T
∈
R
2
.
s=[\rho,\psi,u,v,\omega]^{\mathrm{T}}\in\mathbb{R}^{5}\\a=[\delta,a_{x}]^{\mathrm{T}}\in\mathbb{R}^{2}.
s=[ρ,ψ,u,v,ω]T∈R5a=[δ,ax]T∈R2. 含义分别如下:
- 状态空间
- ρ \rho ρ:横向位置误差
- ψ \psi ψ:车辆车头与此时道路切线位置夹角
- u u u:纵向速度
- v v v:横向速度
- ω \omega ω:Yaw角速度
- 动作空间
- δ \delta δ:前轮转向角
- a x a_{x} ax:纵向加速度
关于车辆动力学以及环境的随机扰动的建模、重要的车辆以及环境参数参考原书178到179页。接下来,我们要定义奖励函数。这里我们定义的奖励函数如下:
r
(
s
)
=
c
0
−
c
ρ
∣
ρ
∣
−
c
ψ
ψ
2
−
c
u
∣
u
−
u
exp
∣
−
c
δ
δ
2
−
c
a
a
x
2
−
I
f
a
i
l
w
h
e
r
e
I
f
a
i
l
=
{
100
,
if out of lane
0
,
otherwise
.
r(s)=c_0-c_\rho|\rho|-c_\psi\psi^2-c_u|u-u_{\exp}|-c_\delta\delta^2-c_aa_x^2-I_{\mathrm{fail}}\\\mathrm{where~}I_{\mathrm{fail}}=\begin{cases}100,&\text{ if out of lane}\\0,&\text{ otherwise}\end{cases}.
r(s)=c0−cρ∣ρ∣−cψψ2−cu∣u−uexp∣−cδδ2−caax2−Ifailwhere Ifail={100,0, if out of lane otherwise. 这个奖励函数对上面提到优化目标里面各个环节都进行了考虑。并且注意到,最前面添加了一个常数项
c
0
c_0
c0,这是因为在添加这个常数项之前所有的奖励项都是负的,这样直接训练会导致车辆倾向于采取直接撞击来停止车辆,这样早点结束反而能取得更高的return。因此,我们添加了这个常数项来保证车辆不会在开始的时候就直接撞击。
接下来看看如何对于策略进行建模。对于随机策略,我们可以使用高斯分布来建模:
a
∼
π
(
a
∣
s
)
=
N
(
μ
,
σ
2
)
,
μ
=
N
N
(
s
;
θ
N
N
)
∈
R
2
,
σ
=
exp
(
θ
exp
)
∈
R
2
,
a\sim\pi(a|s)=\mathcal{N}(\mu,\sigma^{2}),\\\mu=\mathrm{NN}(s; \theta_{\mathrm{NN}})\in\mathbb{R}^{2},\\\sigma=\exp(\theta_{\exp})\in\mathbb{R}^{2},
a∼π(a∣s)=N(μ,σ2),μ=NN(s;θNN)∈R2,σ=exp(θexp)∈R2, 这里的NN表示一个神经网络。我们的策略是在最外层的高斯分布里面套上了可训练的参数(NN和指数函数)。因此,最终的策略参数为
θ
=
[
θ
N
N
,
θ
exp
]
\theta{=}[\theta_{\mathrm{NN}},\theta_{\exp}]
θ=[θNN,θexp]。对于确定性的动作,直接使用神经网络来建模:
a
=
π
(
s
)
=
N
N
(
s
;
θ
)
∈
R
2
.
a=\pi(s)=\mathrm{NN}(s;\theta)\in\mathbb{R}^2.
a=π(s)=NN(s;θ)∈R2.
接着,我们使用NN来拟合值函数:
V
(
s
)
=
N
N
(
s
;
θ
)
o
r
Q
(
s
,
a
)
=
N
N
(
s
,
a
;
θ
)
.
\begin{aligned}V(s)&=\mathrm{NN}(s;\theta)\\&or\\Q(s,a)&=\mathrm{NN}(s,a;\theta).\end{aligned}
V(s)Q(s,a)=NN(s;θ)or=NN(s,a;θ). 下面使用了三种不同的AC算法来解决这个问题:stochastic policy with action-value function(Sto-Q),deterministic policy with action-value function(Det-Q)和stochastic policy with state-value function(Sto-V)。
有关具体的实验结果请参考原书第6.6.3节。