之前介绍的是基于最优价值的强化学习算法——值函数估计,通过最优值函数得到策略。
也就是说
a ∗ = a r g m a x a Q ( s , a ) , a ∗ = π ∗ ( s ) a^*=argmax_a Q(s,a),a^*=\pi^*(s) a∗=argmaxaQ(s,a),a∗=π∗(s)
存在模型训练稳定性问题等。
基于策略梯度直接计算策略可能更新的方向:将值函数表示成策略参数的某个函数,可以求出值函数关于策略参数的梯度,沿着梯度上升的方向更新。
- 算法:策略梯度法->Actor Critic->A3C、A2C
策略梯度法基本原理
目标函数(值函数)
J
(
θ
)
=
E
τ
∼
π
(
θ
)
[
r
(
τ
)
]
=
∫
τ
∼
π
(
θ
)
π
θ
(
τ
)
r
(
τ
)
d
τ
J(\theta)=E_{\tau \sim \pi(\theta)} [r(\tau)] = \int _{\tau \sim \pi(\theta)}\pi_\theta(\tau)r(\tau)d\tau
J(θ)=Eτ∼π(θ)[r(τ)]=∫τ∼π(θ)πθ(τ)r(τ)dτ
可以表示成这样与
θ
\theta
θ相关的函数,因为积分和求导运算可以互换
∇
θ
J
(
θ
)
=
∇
θ
∫
τ
∼
π
(
θ
)
π
θ
(
τ
)
r
(
τ
)
d
τ
=
∫
τ
∼
π
(
θ
)
∇
θ
π
θ
(
τ
)
r
(
τ
)
d
τ
\nabla_\theta J(\theta) = \nabla_\theta \int _{\tau \sim \pi(\theta)}\pi_\theta(\tau)r(\tau)d\tau= \int _{\tau \sim \pi(\theta)}\nabla_\theta\pi_\theta(\tau)r(\tau)d\tau
∇θJ(θ)=∇θ∫τ∼π(θ)πθ(τ)r(τ)dτ=∫τ∼π(θ)∇θπθ(τ)r(τ)dτ
又因为
∇
x
l
o
g
y
=
1
y
∇
x
y
y
∇
x
l
o
g
y
=
∇
x
y
∇
θ
π
θ
(
τ
)
=
π
θ
(
τ
)
∇
θ
l
o
g
π
θ
(
τ
)
\nabla_xlogy=\frac 1 y \nabla_xy\\y\nabla_xlogy=\nabla_xy\\\nabla_\theta\pi_\theta(\tau)=\pi_\theta(\tau)\nabla_\theta log\pi_\theta(\tau)
∇xlogy=y1∇xyy∇xlogy=∇xy∇θπθ(τ)=πθ(τ)∇θlogπθ(τ)
所以
∇
θ
J
(
θ
)
=
∫
τ
∼
π
(
θ
)
∇
θ
π
θ
(
τ
)
r
(
τ
)
d
τ
=
∫
τ
∼
π
(
θ
)
π
θ
(
τ
)
∇
θ
l
o
g
π
θ
(
τ
)
r
(
τ
)
d
τ
\nabla_\theta J(\theta) = \int _{\tau \sim \pi(\theta)}\nabla_\theta\pi_\theta(\tau)r(\tau)d\tau\\ = \int _{\tau \sim \pi(\theta)}\pi_\theta(\tau)\nabla_\theta log\pi_\theta(\tau)r(\tau)d\tau
∇θJ(θ)=∫τ∼π(θ)∇θπθ(τ)r(τ)dτ=∫τ∼π(θ)πθ(τ)∇θlogπθ(τ)r(τ)dτ
因为
π
θ
(
τ
)
=
π
(
s
0
,
a
0
,
.
.
.
,
s
T
,
a
T
)
=
p
(
s
0
)
∏
t
=
0
T
π
θ
(
a
t
∣
s
t
)
p
(
s
t
+
1
∣
s
t
,
a
t
)
所以
∇
θ
l
o
g
[
π
(
τ
)
]
=
∇
θ
l
o
g
[
p
(
s
0
)
∏
t
=
0
T
π
θ
(
a
t
∣
s
t
)
p
(
s
t
+
1
∣
s
t
,
a
t
)
]
=
∇
θ
[
l
o
g
p
(
s
0
)
+
∑
t
=
0
T
l
o
g
π
θ
(
a
t
∣
s
t
)
+
∑
t
=
0
T
l
o
g
p
(
s
t
+
1
∣
s
t
,
a
t
)
]
因为前后两项与
θ
无
关
=
∇
θ
[
∑
t
=
0
T
l
o
g
π
θ
(
a
t
∣
s
t
)
]
=
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
\pi_\theta(\tau)=\pi(s_0,a_0,...,s_T,a_T)\\=p(s_0)\prod^T_{t=0}\pi_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)\\ \text{所以}\\ \nabla_\theta log[\pi(\tau)]=\nabla_\theta log[p(s_0)\prod^T_{t=0}\pi_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)]\\ =\nabla_\theta[logp(s_0)+\sum^T_{t=0}log\pi_\theta(a_t|s_t)+\sum^T_{t=0}logp(s_{t+1}|s_t,a_t)]\\ \text{因为前后两项与}\theta无关\\ =\nabla_\theta[\sum^T_{t=0}log\pi_\theta(a_t|s_t)]\\ =\sum^T_{t=0}\nabla_\theta log\pi_\theta(a_t|s_t)
πθ(τ)=π(s0,a0,...,sT,aT)=p(s0)t=0∏Tπθ(at∣st)p(st+1∣st,at)所以∇θlog[π(τ)]=∇θlog[p(s0)t=0∏Tπθ(at∣st)p(st+1∣st,at)]=∇θ[logp(s0)+t=0∑Tlogπθ(at∣st)+t=0∑Tlogp(st+1∣st,at)]因为前后两项与θ无关=∇θ[t=0∑Tlogπθ(at∣st)]=t=0∑T∇θlogπθ(at∣st)
最后将上面
∇
θ
J
(
θ
)
=
∫
τ
∼
π
(
θ
)
∇
θ
π
θ
(
τ
)
r
(
τ
)
d
τ
=
∫
τ
∼
π
(
θ
)
π
θ
(
τ
)
∇
θ
l
o
g
π
θ
(
τ
)
r
(
τ
)
d
τ
\nabla_\theta J(\theta) = \int _{\tau \sim \pi(\theta)}\nabla_\theta\pi_\theta(\tau)r(\tau)d\tau\\ = \int _{\tau \sim \pi(\theta)}\pi_\theta(\tau)\nabla_\theta log\pi_\theta(\tau)r(\tau)d\tau
∇θJ(θ)=∫τ∼π(θ)∇θπθ(τ)r(τ)dτ=∫τ∼π(θ)πθ(τ)∇θlogπθ(τ)r(τ)dτ和
∇
θ
l
o
g
[
π
(
τ
)
]
=
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
\nabla_\theta log[\pi(\tau)]=\sum^T_{t=0}\nabla_\theta log\pi_\theta(a_t|s_t)
∇θlog[π(τ)]=t=0∑T∇θlogπθ(at∣st)结合,并且将积分使用蒙特卡罗替换
∇
θ
J
(
θ
)
=
∫
τ
∼
π
(
θ
)
π
θ
(
τ
)
∇
θ
l
o
g
π
θ
(
τ
)
r
(
τ
)
d
τ
=
E
τ
∼
π
θ
(
τ
)
[
(
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
i
,
t
∣
s
i
,
t
)
(
∑
t
=
0
T
r
(
s
i
,
t
,
a
i
,
t
)
]
=
1
N
∑
i
=
1
N
[
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
i
,
t
∣
s
i
,
t
)
(
∑
t
=
0
T
r
(
s
i
,
t
,
a
i
,
t
)
]
\nabla_\theta J(\theta) = \int _{\tau \sim \pi(\theta)}\pi_\theta(\tau)\nabla_\theta log\pi_\theta(\tau)r(\tau)d\tau\\ \Large =E_{\tau\sim\pi_\theta(\tau)} [(\sum_{t=0}^T\nabla_\theta log\pi_\theta(a_{i,t}|s_{i,t}) (\sum^T_{t=0}r(s_{i,t},a_{i,t})]\\ =\frac 1 N \sum^N_{i=1} [\sum^T_{t=0} \nabla_\theta log \pi_\theta (a_{i,t}|s_{i,t}) (\sum^T_{t=0}r(s_{i,t},a_{i,t})]
∇θJ(θ)=∫τ∼π(θ)πθ(τ)∇θlogπθ(τ)r(τ)dτ=Eτ∼πθ(τ)[(t=0∑T∇θlogπθ(ai,t∣si,t)(t=0∑Tr(si,t,ai,t)]=N1i=1∑N[t=0∑T∇θlogπθ(ai,t∣si,t)(t=0∑Tr(si,t,ai,t)]
最后我们就通过这个公式计算梯度然后使用
θ
~
=
θ
+
α
∇
θ
J
(
θ
)
\tilde \theta=\theta +\alpha\nabla_\theta J(\theta)
θ~=θ+α∇θJ(θ)
书中还给出了一种推导方法,比较麻烦,但是推导后面没问题
得到策略梯度
是这种亚子,竟然说相同,原谅我的弱智。
并且书中将policy gradient和最大似然求策略进行比较,发现最大似然得到的梯度和policy gradient得到的梯度只有最后面
∑
t
=
0
T
r
(
s
i
,
t
,
a
i
,
t
)
\sum^T_{t=0}r(s_{i,t},a_{i,t})
∑t=0Tr(si,t,ai,t)的差别,这一项表示了序列的整体回报。
所以可以得到
1.policy gradient考虑到长期回报,而最大四让将长期回报值设定为固定值1,即每一个样本对训练的影响相同
2.最大似然对每一个样本权重相同,而策略梯度对每一个样本使用序列回报作为加权权重,所以,policy gradient 对于回报越大的样本,最大化其似然;对于回报越小(为负)的样本,最小化它的似然。
事实上,由于这个最后一项的加权项的存在,会使得策略梯度的方差特别大(在斯坦福CS294中也有讨论到)
不论哪个时间段,我们都要用策略的梯度乘以后面这个所有时刻的回报值总和,这样做显然不合理,所以我们利用到 当前的决策不能影响之前的回报的原理:t时刻我们完成决策之后,它最多只能影响t时刻之后的回报,不会影响之前的回报,所以我们不应该将之前的回报和计算在梯度中
公式改写为:
∇
θ
J
(
θ
)
=
1
N
∑
i
=
1
N
[
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
i
,
t
∣
s
i
,
t
)
(
∑
t
′
=
t
T
r
(
s
i
,
t
′
,
a
i
,
t
′
)
)
]
\Large \nabla_\theta J(\theta) =\frac 1 N \sum^N_{i=1} [\sum^T_{t=0} \nabla_\theta log \pi_\theta (a_{i,t}|s_{i,t}) (\sum^T_{t'=t}r(s_{i,t'},a_{i,t'}))]
∇θJ(θ)=N1i=1∑N[t=0∑T∇θlogπθ(ai,t∣si,t)(t′=t∑Tr(si,t′,ai,t′))]
但是还可能出现一个现象,就是序列的长期回报可能都为正,那么我们会提升所有策略,只是回报低的可能提升的幅度有所降低,但是这是不太好的,我们希望的是能够降低不好行为的概率。
所以我们在长期回报那再减去一个偏移量Baseline,用b表示
∇
θ
J
(
θ
)
=
1
N
∑
i
=
1
N
[
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
i
,
t
∣
s
i
,
t
)
(
∑
t
′
=
t
T
r
(
s
i
,
t
′
,
a
i
,
t
′
)
−
b
i
,
t
′
)
]
\Large \nabla_\theta J(\theta) =\frac 1 N \sum^N_{i=1} [\sum^T_{t=0} \nabla_\theta log \pi_\theta (a_{i,t}|s_{i,t}) (\sum^T_{t'=t}r(s_{i,t'},a_{i,t'})-b_{i,t'})]
∇θJ(θ)=N1i=1∑N[t=0∑T∇θlogπθ(ai,t∣si,t)(t′=t∑Tr(si,t′,ai,t′)−bi,t′)]
b
i
,
t
′
=
1
N
∑
i
=
1
N
∑
t
′
=
t
T
r
(
s
i
,
t
′
,
a
i
,
t
′
)
\Large b_{i,t'}=\frac 1 N \sum^N_{i=1}\sum^T_{t'=t}r(s_{i,t'},a_{i,t'})
bi,t′=N1i=1∑Nt′=t∑Tr(si,t′,ai,t′)
相当于对长期回报值期望规零化,这对稳定性有一定的帮助,并且可以证明(书中有证明)加入这个偏移量不会使得原来的计算值变得有偏。
但是呢
我们其实有了更好的替代方法 AC
策略梯度法改进:Actor Critic
为什么说更好,因为即使上面两个处理之后,由于交互次数的限制,序列不能很好代表轨迹的真实期望,不充分的交互会给轨迹回报带来较大方差,和蒙特卡罗的问题相似。
Actor Critic希望牺牲policy gradient的偏差来换取方差的减少。
主要的特点就是,AC通过一个独立的模型估计轨迹的长期回报,不直接使用轨迹的真实回报。
这和基于模型的Q-learning类似,估计的时候使用模型估计轨迹价值,更新的时候利用轨迹的回报得到目标价值,然后比较再改进模型(q_估计-q_现实)
公式中可以被替代的是权重那一部分,这里提出四种方案:
1.如上 因果律+ 长期回报期望归零:
∑
t
′
=
t
T
r
(
s
i
,
t
′
,
a
i
,
t
′
)
−
b
i
,
t
′
\sum^T_{t'=t}r(s_{i,t'},a_{i,t'})-b_{i,t'}
∑t′=tTr(si,t′,ai,t′)−bi,t′
2.使用状态值函数估计回报:q(s,a)
3.使用优势函数估计轨迹回报:A(s,a)=q(s,a)-V(s)
4.使用TD-Error估计轨迹回报:R(s,a)+V(s’)-V(s)
AC就是使用第四种,算法使用两个模型,一个是策略模型,一个是价值模型,所以这个算法被称为Actor-Critic,Actor表示策略模型,Critic表示价值模型
下面我们介绍真正被应用到实际中并且得到优异效果的A3C(Asynchronous Advantage Actor-Critic和A2C(Advantage Actor-Critic),顾名思义,前者突出了异步和优势;后者采用同步方式优化。
A3C
- 策略梯度需要使用当前最新策略模型采样的序列完成梯度计算,计算完成之后样本丢弃——On-Policy Learning
- DQN、Q-learning ,使用的序列都不一定是使用当前模型交互得到的(DQN可能是之前的模型,Q-learning是采用当前最优决策行动)——Off-Policy Learning
基于策略梯度的算法是On-Policy算法,为了更快手机样本,我们同时启动N个线程,Agent在N个线程中和设定不同的环境进行交互,得到不完全一样的样本。收集完毕后线程独立完成训练,并且得到参数更新量,异步地更新到全局的模型参数中,下一次训练开始再将线程的模型参数和全局参数完成同步,线程使用新的参数进行训练。
Advatage表示算法关于权重的计算,之前AC使用TD-Error:
r
s
t
,
a
t
+
v
(
s
t
+
1
)
−
v
(
s
t
)
r_{s_t,a_t}+v(s_{t+1})-v(s_t)
rst,at+v(st+1)−v(st),这个方法虽然增加了模型的稳定性但是使得模型的偏差也加大,为了平衡偏差和方差,A3C使用多步回报估计,使得在训练早期更快提升价值模型:
∑
i
=
1
n
r
i
−
1
+
v
(
s
t
+
n
)
−
v
(
s
t
)
\sum ^ n _{i=1} r ^ {i-1} + v (s _ {t+n}) - v (s_t)
i=1∑nri−1+v(st+n)−v(st)
为了增加模型探索性,最大化目标函数中加入了策略的熵(由于熵可以衡量概率分布的不确定性,熵越大概率分布越不确定,这样模型就会有更好的多样性),最后,完整的策略梯度计算公式为:
∇
θ
J
(
θ
)
=
1
T
∑
t
=
0
T
∇
θ
l
o
g
π
θ
(
a
t
∣
s
t
;
θ
)
(
∑
i
=
1
n
r
i
−
1
+
v
(
s
t
+
n
)
−
v
(
s
t
)
)
+
β
∇
θ
H
(
π
(
s
t
;
θ
)
)
\Large \nabla_\theta J(\theta) =\frac1T \sum^T_{t=0} \nabla_\theta log \pi_\theta (a_{t}|s_{t};\theta) (\sum ^ n _{i=1} r ^ {i-1} + v (s _ {t+n}) - v (s_t)) + \beta \nabla_\theta H(\pi(s_t;\theta))
∇θJ(θ)=T1t=0∑T∇θlogπθ(at∣st;θ)(i=1∑nri−1+v(st+n)−v(st))+β∇θH(π(st;θ))
完整算法如下:
A2C
代码可在Baselines的baselines/a2c中找到,书上说可以直接run_atari.py执行算法,但是并没有看到这个文件,github上看了原本就是没有的。
A2C使用Master-Slave结构,Master用于执行Agent的模型(baseline给出三种模型),在Env给出状态观测值后给出Action,Slave用于模型Env,接受到Agent行为之后,将自己环境交互之后得到的后续观测值、回报等信息返回给Master,Master手机所有Slave的数据进行训练。
上面说到的策略模型baseline中有三种
- CnnPolicy:采用DQN在Nature上的游戏画面特征提取模型 NatureCNN +fc(全链接)
2. LstmPolicy:将T个timestep的NatureCNN的特征序列通过LSTM,然后fc到行动概率pi和价值vf
3. LnLstmPolicy:Layer Normalization LSTM,和LstmPolicy类似
A2C算法实现
伪代码如下:
def learn() :
for i in batches:
#run
obs = env. reset()
for j in range (steps):
act, value = step_model(obs)
obs, reward, done = env . step(act)
data.append( obs, reward, done, value)
for n in envs:
data[reward] =discount_target_reward(data[reward],value)#
#train
adv = data[reward] - data[value]
pg_loss = adv * cross_entropy(train_model.pi, data[act])
vf_loss = mse(train_ model.vf,data[reward])
entropy = entropy(train_model.pi)
loss = pg_loss + vf_loss -entropy
opt = train(loss)
流程分为两个部分:与环境交互run部分和基于样本训练模型train部分
交互的时候使用step_model交互,这个模型接受N个Slave发来的观测值,并且给出单步的行动决策,为了方便计算,每一个轨迹只选取前step进行交互,然后保存,收集数据完毕之后,再对每一个轨迹计算目标价值估计值,更新到data[reward]
训练的时候分别计算三部分的目标函数:
·策略 Loss:
∑
A
d
v
×
l
o
g
π
(
a
∣
s
)
\sum Adv \times log \pi (a|s)
∑Adv×logπ(a∣s)
·价值模型 Loss:
1
2
∑
i
(
V
(
s
i
)
−
R
(
s
i
)
)
2
\frac 1 2 \sum_ i(V(s_i)-R(s_i))^2
21∑i(V(si)−R(si))2
·策略的熵 Loss :
−
∑
a
π
(
a
∣
s
)
l
o
g
π
(
a
∣
s
)
-\sum_a \pi (a|s) log \pi(a|s)
−∑aπ(a∣s)logπ(a∣s)
策略单调提升算法
以自然梯度法为基础的策略提升算法 : 置信区域策略优化( Trust Region Policy Optimization, TRPO ) 和近端策略优化 ( Proximal Policy Optimization , PPO )方法,它们的 总体优化目标比较相近, 主要区别在于具体的计算方法 。
TRPO 置信区域策略优化
策略的期望差距公式:
η
(
π
~
)
=
η
(
π
)
+
E
s
0
,
a
0
,
.
.
.
∼
π
~
[
∑
t
=
0
∞
γ
t
A
π
(
s
t
,
a
t
)
]
\Large \eta (\tilde \pi ) = \eta ( \pi ) + E _ { s_0,a_0,...\sim \tilde \pi } [ \sum ^ \infty _ { t=0 } \gamma^t A_ \pi (s_t ,a_t)]
η(π~)=η(π)+Es0,a0,...∼π~[t=0∑∞γtAπ(st,at)]
令
ρ
π
(
s
)
\rho_\pi(s)
ρπ(s)表示任意时刻状态 s 的访问概率和,它的形式为
ρ
π
(
s
)
=
P
(
s
0
=
s
)
+
γ
P
(
s
1
=
s
)
+
γ
2
P
(
s
2
=
s
)
+
.
.
.
=
∑
t
=
0
∞
γ
t
P
(
s
t
=
s
)
\rho _ \pi (s) = P(s_0=s) + \gamma P(s1=s) + \gamma ^ 2 P ( s _2 = s) + ... \\ = \sum ^ \infty _ { t=0 } \gamma ^ t P ( s _ t = s )
ρπ(s)=P(s0=s)+γP(s1=s)+γ2P(s2=s)+...=t=0∑∞γtP(st=s)
则策略期望差距可化为
η
(
π
~
)
=
η
(
π
)
+
∑
t
=
0
∞
∑
s
P
(
s
t
=
s
∣
π
~
)
∑
a
π
~
(
a
∣
s
)
γ
t
A
π
(
s
,
a
)
=
η
(
π
)
+
∑
s
∑
t
=
0
∞
P
(
s
t
=
s
∣
π
~
)
∑
a
π
~
(
a
∣
s
)
γ
t
A
π
(
s
,
a
)
=
η
(
π
)
+
∑
s
∑
t
=
0
∞
γ
t
P
(
s
t
=
s
∣
π
~
)
∑
a
π
~
(
a
∣
s
)
A
π
(
s
,
a
)
=
η
(
π
)
+
∑
s
ρ
π
~
(
s
)
∑
a
π
~
(
a
∣
s
)
A
π
(
s
,
a
)
\Large \eta (\tilde \pi ) = \eta ( \pi ) + \sum ^ \infty _ { t = 0 } \sum _ {s } P ( s_t = s | \tilde{ \pi })\sum _ a \tilde \pi ( a | s) \gamma ^ t A _ \pi ( s ,a)\\ = \eta ( \pi ) + \sum _ {s } \sum ^ \infty _ { t = 0 } P ( s_t = s | \tilde{ \pi })\sum _ a \tilde \pi ( a | s) \gamma ^ t A _ \pi ( s ,a)\\ = \eta ( \pi ) + \sum _ {s } \sum ^ \infty _ { t = 0 } \gamma ^ t P ( s_t = s | \tilde{ \pi })\sum _ a \tilde \pi ( a | s) A _ \pi ( s ,a)\\ = \eta ( \pi ) + \sum _ {s } \rho _ {\tilde \pi (s) } \sum _ a \tilde \pi ( a | s) A _ \pi ( s ,a)
η(π~)=η(π)+t=0∑∞s∑P(st=s∣π~)a∑π~(a∣s)γtAπ(s,a)=η(π)+s∑t=0∑∞P(st=s∣π~)a∑π~(a∣s)γtAπ(s,a)=η(π)+s∑t=0∑∞γtP(st=s∣π~)a∑π~(a∣s)Aπ(s,a)=η(π)+s∑ρπ~(s)a∑π~(a∣s)Aπ(s,a)
我们从某个策略出发,通过计算找到一个策略使得
∑
s
ρ
π
~
(
s
)
∑
a
π
~
(
a
∣
s
)
A
π
(
s
,
a
)
>
=
0
\sum _ {s } \rho _ {\tilde \pi (s) } \sum _ a \tilde \pi ( a | s) A _ \pi ( s ,a) >=0
s∑ρπ~(s)a∑π~(a∣s)Aπ(s,a)>=0
就可以确定后面的策略总体上优于之前的策略。