本文将主要介绍基于策略梯度的强化学习算法。这里我们假设读者对强化学习的基本原理有一定了解。
使用梯度进行估计或优化的方法可见于诸多领域,如凸优化和机器学习领域。在强化学习中,我们可以使用梯度来估计某个策略的价值函数或者直接估计策略。本文中我们仅讨论后一种情况。
策略梯度法
强化学习的目标是最大化长期回报的期望,于是目标可以写作:
到这里,虽然看起来可以对梯度进行估计,但还是有不易计算的部分,我们对其进行进一步拆解:假设 τ={s0,a0,s1,a1,…,sT,aT} τ = { s 0 , a 0 , s 1 , a 1 , … , s T , a T } :
将结果代入对目标函数梯度的估计:
我们可以假设
实际上,从函数估计的角度看,这种方法和最大似然法类似:我们希望策略模型得到行动概率分布能够尽可能地与采样数据的行为概率分布一致。 按照这个思路我们给出这个模型的求解方法,假设
τ
τ
是我们的数据集合,采用最大似然法进行建模,目标函数可以设立为:
- 从策略梯度法的角度看,最大似然法没有考虑长期回报,或者说长期回报为固定值 1。即每个样本 τi τ i 对训练的影响相同。
- 从最大似然法的角度看,最大似然对每个样本使用了相同的权重,对策略梯度法来说,它使用序列的回报作为样本的加权权重。也就是说,对于回报为正的样本,我们最大化它的似然;对于回报为负的样本,我们最小化它的似然。
策略梯度法的推导还有一种形式,在 Richard S. Sutton 的 Reinforcement Learning: An Introduction 中被称作策略梯度定理(policy gradient theorem):
∇θJ(θ)=∑sdπ(s)∑aqπ(s,a)∇θπ(a|s,θ) ∇ θ J ( θ ) = ∑ s d π ( s ) ∑ a q π ( s , a ) ∇ θ π ( a | s , θ )where the gradients in all cases are the column vectors of partial derivatives with respect to the components of θ θ , π π denotes the policy corresponding to weights vector θ θ and the distribution dπ d π here is the expected number of time steps t t on which in a randomly generated episode starting in s0 s 0 and following π π and the dynamics of the MDP.
此处以及下一小节我们采用 Richard S. Sutton 的表示法,注意其中的:
REINFORCE
基于策略梯度定理,我们得到了一种参数增量的表达式,但是并不是其中每一项的解析表达式我们都已知。因此,我们现在需要的是一种采样估计方法来估计该增量表达式。注意到策略梯度定理表达式的右边对状态的加权求和,其权重是在策略
π
π
下该状态出现的频率,以及
γ
γ
的
k
k
次方, 是到达此状态所经历的步数。那么我们可以利用策略
π
π
进行采样,再乘以衰减常数
γ
γ
,这样的期望值就可以用来估计该梯度:
然后我们对动作的求和进行估计,我们要得到的是每一项乘以在策略 π π 下该动作出现的概率:
现在我们得到了可以估计的表达式,那么
可见 REINFORCE 是一种 Monte Carlo Policy Gradient 方法。而且这种方法是针对离散动作的。(当然也可以将策略表示为动作的概率分布,来生成连续的动作,此时参数 θ θ 便是这个概率分布的参数。如正态分布的均值与方差。)这个更新策略的更新量与总体回报成正比,与动作选择的概率成反比。前者的意义在于它在向总体回报最高的方向更新;后者的意义在于防止策略总是给出产生的回报不是最高但是出现频率最高的动作。
更新方法也可以写成:
该方法的更新步骤如下:
- Initialize: π(a|s,θ) π ( a | s , θ ) , ∀a∈A,s∈S,θ∈Rn ∀ a ∈ A , s ∈ S , θ ∈ R n
- Initialize policy weights θ θ
- Repeat forever:
- Generate an episdoe S0,A0,R1,…,ST−1,AT−1,RT S 0 , A 0 , R 1 , … , S T − 1 , A T − 1 , R T following π(⋅|⋅,θ) π ( ⋅ | ⋅ , θ ) .
- For each step of the episode
t=0,1,…,T−1
t
=
0
,
1
,
…
,
T
−
1
:
- Gt← G t ← return from step t t .
其中
∇θπ(At|St,θ)π(At|St,θ)
∇
θ
π
(
A
t
|
S
t
,
θ
)
π
(
A
t
|
S
t
,
θ
)
或者
∇θlogπ(At|St,θ)
∇
θ
log
π
(
A
t
|
S
t
,
θ
)
是策略参数存在的项。这一项被称作 eligibility vector。如果采用 softmax + linear action preferences 策略, 那么 eligibility vector 可以写成
Baseline
我们的策略梯度公式有个问题:不管哪个时间段,我们都要用策略的梯度乘以所有时刻回报值得总和,这样的设计显然不合理。理论上
t
t
时刻的决策最多只能影响 时刻之后的所有回报,与之前的回报无关,所以我们的公式应该改写成:
另一方面,我们知道总体回报可以理解为最大似然法中的权重,这个权重会带来两个问题:
- 如果序列得到的回报数值较大,那么对应的参数更新也较大,这样我们的优化可能会出现一定波动,这些波动很可能影响优化效果。
- 一些强化学习问题中,环境给予的回报始终为正,那么无论决策怎么样,累计的长期回报始终为正数。也就是说会增强所有策略,这与我们的初衷不符。
为了解决上述问题,我们可以调整权重的数值和范围,一个简单的方法是让所给出的长期累计汇报减去一个偏移量,这个偏移量被称为 Baseline,我们用变量
b
b
表示:
基于策略梯度定理的带 Baseline 的梯度可写成:
Actor-Critic
在上一小节中,我们使用偏移量来改进策略梯度算法,但是改进后的梯度计算公式仍然有问题。真实训练的过程中,我们往往需要控制交互的时间。有限次的交互有时并不能代表轨迹的真实期望。每一个交互序列都会有一定的差异,对应的回报也会有一定的差异,因此不充足的交互会给轨迹回报带来较大的方差。为了模型稳定,我们可以牺牲一定的偏差来换取方差变小。这其中一种方法就是 Actor-Critic算法。
关于Actor-Critic方法,Richard S. Sutton 在书中写道:
Methods that learn approximations to both policy and value functions are called actor-critic methods. REINFORCE with baseline methods use value functions only as a baseline, not a critic, i.e. not for bootstrapping. This is a useful distinction, for only through bootstrapping do we introduce bias and an asymptotic dependence on the quality of the function approximation.
首先我们看单步 action-critic 算法。 这里首先以 Richard S. Sutton 的方法为准。单步方法主要的有点是可以在线执行,如同 TD(0), SARSA(0) 和 Q-Learning。单步 actor-critic 算法参数更新策略如下:
详细步骤如下:
- Initialize a differentiable policy parameterization π(a|s,θ),∀a∈A,s∈S,θ∈Rn π ( a | s , θ ) , ∀ a ∈ A , s ∈ S , θ ∈ R n .
- Initialize a differentiable state-value parameterization v^(s,w),∀s∈S,w∈Rm v ^ ( s , w ) , ∀ s ∈ S , w ∈ R m .
- Set step sizes α>0,β>0 α > 0 , β > 0 .
- Repeat forever:
- Initialize the first state of episode S S
- While
S
S
is not terminal:
- Take action , observe S′,R S ′ , R
- δ←R+γv^(S′,w)−v^(S,w) δ ← R + γ v ^ ( S ′ , w ) − v ^ ( S , w ) , (if S′ S ′ is terminal, v^(S′,w)=0 v ^ ( S ′ , w ) = 0 )
- w←w+βδ∇wv^(S,w) w ← w + β δ ∇ w v ^ ( S , w )
- θ←θ+αIδ∇θlogπ(A|S,θ) θ ← θ + α I δ ∇ θ log π ( A | S , θ )
- I←γI I ← γ I
- S←S′ S ← S ′
带有Eligibility Traces的Actor-Critic算法步骤如下 :
- Initialize π(a|s,θ),∀a∈A,s∈S,θ∈Rn π ( a | s , θ ) , ∀ a ∈ A , s ∈ S , θ ∈ R n
- Initialize v^(s,w),∀s∈S,w∈Rm v ^ ( s , w ) , ∀ s ∈ S , w ∈ R m
- Repeat forever:
- Initialize the first state of episode S S
- , ew=0 e w = 0 .
- I←1 I ← 1
- While
S
S
is not terminal:
- Take action , observe S′,R S ′ , R
- δ←R+γv^(S′,w)−v^(S,w) δ ← R + γ v ^ ( S ′ , w ) − v ^ ( S , w ) , (if S′ S ′ is terminal, v^(S′,w)=0 v ^ ( S ′ , w ) = 0 )
- ew←λwew+I∇wv^(S,w) e w ← λ w e w + I ∇ w v ^ ( S , w )
- eθ←λθeθ+I∇θlogπ(A|S,θ) e θ ← λ θ e θ + I ∇ θ log π ( A | S , θ )
- w←w+βδ∇wv^(S,w) w ← w + β δ ∇ w v ^ ( S , w )
- θ←θ+αIδ∇θlogπ(A|S,θ) θ ← θ + α I δ ∇ θ log π ( A | S , θ )
- I←γI I ← γ I
- S←S′ S ← S ′
Asynchronous Advantage Actor-Critic (A3C)
A3C是一种异步优化方法。其主要特点是异步,即并行的交互采样和训练。策略梯度法和Actor-Critic法都通过目标函数的梯度进行策略更新,而计算梯度需要基于当前的策略模型,所以每一次计算梯度时,我们需要使用当前最新的策略模型重新进行交互采样,得到序列样本,然后使用这些样本完成梯度计算;完成梯度计算后,我们丢弃使用过的样本,重新采样。这种训练方法被称为On-Policy Learning。在深度强化学习中,我们使用Replay Buffer存储了一段时间的交互样本,模型学习时使用的样本不一定是由当前模型交互得到,这样的学习方法被称为Off-Policy Learning。
对于On-Policy来说,每一次模型更新都需要一定量的新样本,为了更快地手机样本,我们需要用并行的方法收集。我们同事启动N个线程进行交互,只要保证每一个线程中的环境设定不同,线程间交互得到的序列就不完全一样,这样得到的样本更有意义。收集完成样本后,每一个线程独立完成训练得到参数更新量,并异步更新到全局模型参数中。A3C方法使用多步回报估计法,对应的公式变为:
∑i=1nγi−1rt+1+v(st+n)−v(st) ∑ i = 1 n γ i − 1 r t + 1 + v ( s t + n ) − v ( s t )为了增加模型的探索性,模型的目标函数中加入了策略的熵:
∇θJ(θ)=1T∑t=0T∇θlogπθ(at|st)(∑i=1nγi−1rt+1+v(st+n)−v(st))+β∇θH(πθ(st)) ∇ θ J ( θ ) = 1 T ∑ t = 0 T ∇ θ log π θ ( a t | s t ) ( ∑ i = 1 n γ i − 1 r t + 1 + v ( s t + n ) − v ( s t ) ) + β ∇ θ H ( π θ ( s t ) )A3C单一线程的执行过程如下:
- T←0 T ← 0
- Initialize policy paramter θ θ
- Initialize value parameter ω ω
- Repeat until
T>Tmax
T
>
T
m
a
x
- dθ←0,dω←0 d θ ← 0 , d ω ← 0 .
- Synchronize model parameter θ′←θ,ω′←ω θ ′ ← θ , ω ′ ← ω .
- Sample with policy πθ′(at|st) π θ ′ ( a t | s t ) to collect {s0,a0,r0,…} { s 0 , a 0 , r 0 , … }
- T←T+n T ← T + n
- R=vθ′(st) R = v θ ′ ( s t ) for non-terminal state, R=0 R = 0 for terminal state.
- for
i∈{n−1,0}
i
∈
{
n
−
1
,
0
}
do
- R←ri+γR R ← r i + γ R
- dθ←dθ+∇θ′logπθ′(ai|si)(R−Vω′(si)) d θ ← d θ + ∇ θ ′ log π θ ′ ( a i | s i ) ( R − V ω ′ ( s i ) )
- dω←dω+∇ω′(R−Vω′(si))2 d ω ← d ω + ∇ ω ′ ( R − V ω ′ ( s i ) ) 2
- end for
- θ←dθ,ω←dω θ ← d θ , ω ← d ω
Advantage Actor-Critic (A2C)
A3C算法表现十分优异,但是其中的异步更新是否是必要的?凭直觉,异步或者同步更新并不是决定算法优劣的主要因素。那么为什么不尝试使用同步更新方法呢?这就是A2C方法的来源。我们可以在Baseline项目中a2c文件夹下看到A2C的实现。可以直接运行其中的run_atari.py文件执行算法。OpenAI的官方博客中也提到A2C的效果优于A3C。