强化学习精要-第三部分-基于策略梯度的算法(on-policy)


之前介绍的是基于最优价值的强化学习算法——值函数估计,通过最优值函数得到策略。
也就是说
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=y1xyyxlogy=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=0Tπθ(atst)p(st+1st,at)所以θlog[π(τ)]=θlog[p(s0)t=0Tπθ(atst)p(st+1st,at)]=θ[logp(s0)+t=0Tlogπθ(atst)+t=0Tlogp(st+1st,at)]因为前后两项与θ=θ[t=0Tlogπθ(atst)]=t=0Tθlogπθ(atst)
最后将上面 ∇ θ 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=0Tθlogπθ(atst)结合,并且将积分使用蒙特卡罗替换
∇ θ 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=0Tθlogπθ(ai,tsi,t)(t=0Tr(si,t,ai,t)]=N1i=1N[t=0Tθlogπθ(ai,tsi,t)(t=0Tr(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=1N[t=0Tθlogπθ(ai,tsi,t)(t=tTr(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=1N[t=0Tθlogπθ(ai,tsi,t)(t=tTr(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=1Nt=tTr(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=1nri1+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=0Tθlogπθ(atst;θ)(i=1nri1+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中有三种

  1. 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π(as)
·价值模型 Loss: 1 2 ∑ i ( V ( s i ) − R ( s i ) ) 2 \frac 1 2 \sum_ i(V(s_i)-R(s_i))^2 21i(V(si)R(si))2
·策略的熵 Loss : − ∑ a π ( a ∣ s ) l o g π ( a ∣ s ) -\sum_a \pi (a|s) log \pi(a|s) aπ(as)logπ(as)

策略单调提升算法

以自然梯度法为基础的策略提升算法 : 置信区域策略优化( 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=0sP(st=sπ~)aπ~(as)γtAπ(s,a)=η(π)+st=0P(st=sπ~)aπ~(as)γtAπ(s,a)=η(π)+st=0γtP(st=sπ~)aπ~(as)Aπ(s,a)=η(π)+sρπ~(s)aπ~(as)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π~(as)Aπ(s,a)>=0
就可以确定后面的策略总体上优于之前的策略。

GAE

近端策略优化(PPO)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值