PPO算法详解
看了两天总算弄明白了PPO算法的来龙去脉
1. PG策略
PG策略是最大化下面这个目标函数
Rˉθ=Eτ∼Pθ(τ)[R(τ)P(τ∣θ)]
对目标函数求导可得到
∇Rˉθ=Eτ∼Pθ(τ)[t=1∑TR(τ)∇logP(at∣st,θ)]
通过大量采样,可以近似得到上述期望
∇Rˉθ=N1n=1∑Nt=1∑TnR(τn)∇logP(atn∣stn,θ)
具体推导过程可以参考:深度强化学习(DRL)-李宏毅
2. 优势函数
对于每个时间点的动作概率都将R(τ)显示是不够合理的,如果R(τ)是一个整数,最大化目标函数就会增大该局游戏中做出的所有动作出现的概率,但是不是所有动作都是“好”的,我们希望“好”的动作出现概率增加,“坏”的动作出现概率减小。那么如何评判一个动作的“好坏”?
通过计算做出该动作后,得到的折扣累积奖励和。
return=t=t0∑Tγt−t0rt(γ<1)
我们称其为该动作的回报。
显然,对于一局游戏中的每个时间点的return可能都大于0,这依旧会导致我们无脑的增大每个动作出现的概率,那我们就优中选优。
对于状态 st 选择不同的动作 a0,a1,a2,…,an 得到的回报是不一样的,假设我们可以知道采取不同动作的期望回报 b,我们就可以只增大那些大于 b 的动作概率。现在我们用 return−b 替换之前的 R(τ):
∇Rˉθ=N1n=1∑Nt=1∑Tn(return(tn)−b)∇logP(atn∣stn,θ)
现在就可以实现更好的动作概率提高,不那么好的动作概率减低。
但是现在有一个问题是,我怎么知道 b 取多少合适?
其实它也是训练出来的,通过神将网络,输入状态,输出该状态的期望回报,我们称之为状态价值函数 $ V(s_t) $ 。
我们将下面这个式子称为优势函数,用于度量某个状态下的动作相对于该状态下其他动作的“好坏”:
A(st,at)=return(st,at)−V(st)
现在,可以得到更加优雅的导函数:
∇Rˉθ=N1n=1∑Nt=1∑TnAθ(stn,atn)∇logP(atn∣stn,θ)
目标函数为:
J(θ)=N1n=1∑Nt=1∑TnAθ(stn,atn)
3. PPO
上述过程有什么缺点?
基于PG的强化学习过程大概是采样一次,优化参数一次,采样一次,优化参数一次…如此反复。要知道RL中的采样是很慢的,如果每次优化参数之前都要进行采样,那么训练的效率就太慢了。那能不能不采样呢?答案是可以的,我们可以反复用同一批样本多次优化策略参数。
直觉来说,当我们第一次用样本更新策略参数之后,得到新策略,新策略下采样得到的样本和原来的样本压根不是同一个概率分布,也就是说,我们不能用旧样本直接优化新策略的参数了,但是如果我们进行适当修正,就可以继续使用旧样本
具体怎么做呢,先看看不同分布下的期望是如何互相转换的:
Ex∼p[f(x)]=Ex∼q[f(x)q(x)p(x)]
运用到目标函数的导函数就是如下形式:
∇Rˉθ=N1n=1∑Nt=1∑TnAθ(stn,atn)Pθ′(atn∣stn)Pθ(atn∣stn)∇logPθ(atn∣stn)
这就是PPO的核心内容:通过修正,多次使用旧样本来优化当前策略
但是这两个不同的概率分布依旧不能相差的太过于离谱,可以将二者的KL散度作为惩罚项加到式子中
Jppo(θ)=J(θ)−βKL(θ,θ′)
其中 β 用于动态调节惩罚力度
另一种惩罚方式是对相似度进行裁剪, 将相似度的上下限框定:
Jppo(θ)=N1n=1∑Nt=1∑Tnmin(Pθ′(atn∣stn)Pθ(atn∣stn)Aθ(stn,atn),clip(Pθ′(atn∣stn)Pθ(atn∣stn),1−ε,1+ε)Aθ(stn,atn))
PPO伪代码如下

完