浅析强化学习Proximal Policy Optimization Algorithms(PPO)

Actor-Critic网络

PPO是基于AC网络架构实现的。

Actor网络

PPO有一个Actor网络,Actor输入的维度为state_dim,即状态维数,输出维度为action_dim,意义是每个action的高斯策略的均值,另外,Actor网络还有action_dim个标准差参数,这样在输入一个state后,每个动作都对应一个一维的高斯分布。
浅析强化学习Proximal Policy Optimization Algorithms(PPO)_第1张图片

Critic网络

PPO有一个Critic,Critic网络是用来拟合状态值函数 v π ( s ) = E π [ ∑ k = 0 ∞ γ k R t + k + 1 ∣ S t = s ] v_{\pi}(s)=\mathrm{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} \mid S_{t}=s\right] vπ(s)=Eπ[k=0γkRt+k+1St=s]的,其输出维度为1。
浅析强化学习Proximal Policy Optimization Algorithms(PPO)_第2张图片

PPO更新关键思想

PPO是一种策略梯度改善算法,因为策略梯度对学习率敏感,易出现训练崩溃现象,由此衍生了TRPO等改善更新步幅的算法,策略梯度的优化损失函数可以表示为: L P G ( θ ) = E ^ t [ log ⁡ π θ ( a t ∣ s t ) A ^ t ] L^{P G}(\theta)=\hat{\mathbb{E}}_{t}\left[\log \pi_{\theta}\left(a_{t} \mid s_{t}\right) \hat{A}_{t}\right] LPG(θ)=E^t[logπθ(atst)A^t],而PPO的损失函数可以表为: L C P I ( θ ) = E ^ t [ π θ ( a t ∣ s t ) π θ old  ( a t ∣ s t ) A ^ t ] = E ^ t [ r t ( θ ) A ^ t ] L^{C P I}(\theta)=\hat{\mathbb{E}}_{t}\left[\frac{\pi_{\theta}\left(a_{t} \mid s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} \mid s_{t}\right)} \hat{A}_{t}\right]=\hat{\mathbb{E}}_{t}\left[r_{t}(\theta) \hat{A}_{t}\right] LCPI(θ)=E^t[πθold (atst)πθ(atst)A^t]=E^t[rt(θ)A^t],其考虑了old网络与新更新参数之间的差异性,为了避免差异过大,引入clip来限制:
L C L I P ( θ ) = E ^ t [ min ⁡ ( r t ( θ ) A ^ t , clip ⁡ ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L^{C L I P}(\theta)=\hat{\mathbb{E}}_{t}\left[\min \left(r_{t}(\theta) \hat{A}_{t}, \operatorname{clip}\left(r_{t}(\theta), 1-\epsilon, 1+\epsilon\right) \hat{A}_{t}\right)\right] LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]
其中: r t ( θ ) = π θ ( a t ∣ s t ) π θ old  ( a t ∣ s t ) r_{t}(\theta)=\frac{\pi_{\theta}\left(a_{t} \mid s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} \mid s_{t}\right)} rt(θ)=πθold (atst)πθ(atst)。其作用效果如论文中的下图:
浅析强化学习Proximal Policy Optimization Algorithms(PPO)_第3张图片
这就是PPO2算法的核心思想。如何计算 r t ( θ ) = π θ ( a t ∣ s t ) π θ old  ( a t ∣ s t ) r_{t}(\theta)=\frac{\pi_{\theta}\left(a_{t} \mid s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} \mid s_{t}\right)} rt(θ)=πθold (atst)πθ(atst)中的分子分母是之后要讲的。

Actor网络求 r t ( θ ) r_t(\theta) rt(θ)

r t ( θ ) r_t(\theta) rt(θ)中有 π o l d \pi_{old} πold π \pi π,其中前者在更新buffer时agent利用旧策略接受状态输出动作时可以计算的:

  1. 输入state至Actor;
  2. 得到每个动作维度的均值;
  3. 和每个动作的标准差构成每个维度的高斯分布;
  4. 对高斯分布采样得到动作a_noise;
  5. 将a_noise代入高斯分布的式子 1 2 π σ exp ⁡ ( − ( a n o i s e − μ ) 2 2 σ 2 ) \frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{(a_{noise}-\mu)^{2}}{2 \sigma^{2}}\right) 2π σ1exp(2σ2(anoiseμ)2)
  6. 为了方便后续计算可以对其取ln,并对其求和,拿到一个标量。

对于 r t ( θ ) r_t(\theta) rt(θ)中的 π \pi π,它是在更新网络时的新策略,其接受的是旧策略探索得到的buffer中存储的state和action:

  1. 输入state至Actor;
  2. 得到每个动作维度的均值;
  3. 和每个动作的标准差构成每个维度的高斯分布;
  4. 将action代入高斯分布的式子 1 2 π σ exp ⁡ ( − ( a c t i o n − μ ) 2 2 σ 2 ) \frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{(action-\mu)^{2}}{2 \sigma^{2}}\right) 2π σ1exp(2σ2(actionμ)2)
  5. 方便计算取ln,并对其求和,拿到一个标量。

PPO整体工作流程

PPO是on-policy算法(少数人认为它off-policy,不过我不赞同)。

  1. PPO在每一个episode先清空buffer,再利用旧策略(相对于马上得到的新策略而言)探索环境update buffer,这个buffer装入(r,mask,state,action, l n π o l d ( a t ∣ s t ) ln\pi_{old}(a_t|s_t) lnπold(atst)
  2. 当buffer中有一定样本后开始更新策略。返回第一步。

注意,每次更新完都会清空buffer,这可和off-policy算法不同。

更新策略

  1. 从buffer中带顺序取出所有样本(r,mask,state,action, l n π o l d ( a t ∣ s t ) ln\pi_{old}(a_t|s_t) lnπold(atst)
  2. 利用critic net将state的V值预测出来。
  3. 利用GAE计算Advantage( A ^ t \hat{A}_{t} A^t
  4. for i in sample_times:
    1. 随机从buffer中抽取batchsize个样本以及对应的 A ^ t \hat{A}_{t} A^t和V值的无偏估计 ∑ k = 0 ∞ γ k R t + k + 1 \sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} k=0γkRt+k+1
    2. 利用critic net计算这些样本下state的V的估计值。
    3. critic net的loss由其估计值和V值的无偏估计 ∑ k = 0 ∞ γ k R t + k + 1 \sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} k=0γkRt+k+1构成,具体损失函数自定义。
    4. 利用actor net计算在该state,action下新策略的 l n π n e w ( a t ∣ s t ) ln\pi_{new}(a_t|s_t) lnπnew(atst)
    5. 计算 r t ( θ ) = e l n π n e w ( a t ∣ s t ) − l n π o l d ( a t ∣ s t ) = π n e w ( a t ∣ s t ) π o l d ( a t ∣ s t ) r_t(\theta)=e^{ln\pi_{new}(a_t|s_t)-ln\pi_{old}(a_t|s_t)}=\frac{\pi_{new}(a_t|s_t)}{\pi_{old}(a_t|s_t)} rt(θ)=elnπnew(atst)lnπold(atst)=πold(atst)πnew(atst)
    6. r t ( θ ) r_t(\theta) rt(θ) clip并乘上 A ^ t \hat{A}_{t} A^t作为loss的第一部分。
    7. 将新策略的熵作为loss的第二部分。(可以不要)
    8. 完成actor和critic的更新(i>1时就有了新策略 π n e w ( a t ∣ s t ) , r t ( θ ) \pi_{new}(a_t|s_t),r_t(\theta) πnew(atst),rt(θ)不为1了。)

关于GAE

策略梯度类算法对于Advantage的算法各种各样,GAE方法给出了一种优异的计算方法:
A ^ t G A E ( γ , λ ) = ∑ l = 0 ∞ ( γ λ ) l δ t + l V = ∑ l = 0 ∞ ( γ λ ) l ( r t + γ V ( s t + l + 1 ) − V ( s t + l ) ) \widehat{A}_{t}^{G A E(\gamma, \lambda)}=\sum_{l=0}^{\infty}(\gamma \lambda)^{l} \delta_{t+l}^{V}=\sum_{l=0}^{\infty}(\gamma \lambda)^{l}\left(r_{t}+\gamma V\left(s_{t+l+1}\right)-V\left(s_{t+l}\right)\right) A tGAE(γ,λ)=l=0(γλ)lδt+lV=l=0(γλ)l(rt+γV(st+l+1)V(st+l))

另外像之前所说的 ∑ k = 0 ∞ γ k R t + k + 1 \sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} k=0γkRt+k+1也是一种计算方法。
关于GAE可以参考:GAE

你可能感兴趣的:(强化学习)