目录
深度强化学习目录
简介
策略梯度(Policy Gradient)的缺点在于采样量大,且每一次更新参数都需要采样n轮,更新完又要去采样……换言之,对游戏数据的利用率很低,太慢了。
这种采样-学习-采样的过程,是一种on-policy策略,接下来我们要将的PPO则不同,是一种off-policy的策略。
符号
本篇中运用到的符号和上一篇中的基本一致。
On/Off Policy
- On Policy:训练同一个agent,同时还要求他去对环境进行交互。
- Off Policy:训练的是一个agent,实际和环境交互的是另一个agent。
举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的
Off-poicy的好处是什么?他能重复利用别人的数据来进行训练。我update了1次参数,可以用他的数据来训练;我update了100次参数,还是可以用他的数据来训练。
这听起来似乎是反直觉的:我参数都变了100次了,为什么还能用别人之前得到的数据来训练?这就涉及到一个重要性采样(importance sampling)的问题了。
重要性采样(importance sampling)
重要性采样,即使用q分布来逼近p分布的方法。公式如下:Ex∼p[f(x)]=∫f(x)p(x)dx=∫f(x)q(x)p(x)q(x)dx=Ex∼q[f(x)q(x)p(x)]
其中,q(x)p(x)叫作重要性权重(importance weight)。
这样,我们就完成用q分布逼近p分布,也即用训练的actor来逼近与环境交互的actor。
实际运用中,p和q的分布不能相差过大,否则需要多次采样才能得到较为近似的结果。

如上图,当x∼p(x)时,我们采样的p(x)大部分在右半侧,这是由p的分布决定的。这样的采样会导致我们得到f(x)结果为正的错误结论。只有当采样数量非常多时,我们才能采样到左半侧的点,这里的点q很小p很大,所以重要性权重q(x)p(x)也很大,这样就会一下把f(x)的期望值往负数上拉,从而得到正确结果。而这一切的前提在于,足够多的的采样量,如果采样次数不够,可能一直采的都是右半侧的点。
好在实际训练的时候我们可以延迟更新参数θ′(即不断更新分布q(x)),大概50轮更新一次的样子,这样既能保证pq之间的距离不要太大,训练又不会太慢。
修改∇Rˉθ
在policy gradient(即on-policy)中,有:∇Rˉθ=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]
公式作出如下变换:
∇Rˉθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)R(τ)∇logpθ(τ)]
在原来的方法里,我们用πθ采样更新参数,更新完参数后又用模型πθ重新采样,很慢。现在我们换一种方式,用πθ′采样,再用采样来的数据训练πθ。由于固定θ′不变,这样我们就能重复利用不变的q分布(即θ′)来逼近变化的p分布(即θ),而且大大减少了采样花费的时间。
不是R(τ)而是Aθ(st,at)
上一篇中我们讨论过了,直接计算整个游戏过程的reward再反馈到所有行为上是不合理的,所以我们用优势函数A来代替R。同样地,接下来我们讨论更改为A后的公式应该怎么修改。
∇Rˉθ=E(st,at)∼πθ[Aθ(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[Pθ′(st,at)Pθ(st,at)Aθ′(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)pθ′(st)pθ(st)Aθ′(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)∇logpθ(atn∣stn)Aθ′(st,at)]=E(st,at)∼πθ′[pθ′(at∣st)∇pθ(at∣st)Aθ′(st,at)]
推导过程中有三个问题需要注意。
- 第一点,在第二步中我们将分布从πθ转换为πθ′,实际采样用的是θ′,因此优势函数给出的值不再是依靠参数θ,而是参数θ′,我们是直接假设两者近似的。
- 第二点,在第四步中我们要假设pθ′(st)pθ(st)为1,即两个参数下st出现的概率接近。这个假设是直觉性的,也是为了便于计算,没什么好说的。
- 第三点,∇f(x)=f(x)∇logf(x),简单地高数知识。
于是我们得到了∇Rˉθ。等式右侧只有一项与θ相关,而且这一项同样也是∇p,是梯度。等式两边同时去掉梯度算子符号,于是可以获得以下目标函数:Jθ′(θ)=Rˉθ=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
目标函数的上标θ′是说明它是用参数θ′采样的数据来估计θ的。
添加约束
有了目标函数,一切看起来都很不错。但是实际上有一个问题:pθ和pθ′不能差太多。这是我们之前的一个假设。现在,我们需要添加约束来证实这一点成立,而这也是PPO实际在做的。
怎么做呢?很简单,PPO的目标函数如下:
JPPOθ′(θ)=Jθ′(θ)−βKL(θ,θ′)
其中,KL是KL散度,详情百度,可以理解为一种距离公式。不同的是,他计算的不是θ和θ′参数上的距离,而是行为上的距离。
什么叫参数上的距离,什么叫行为上的距离?
参数上的距离很好理解,就是两个向量之间的距离,重点在于行为上的距离。
我们知道,两个Actor(即策略)分别用参数θ和θ′,他们接收状态s,输出行为的概率分布πθ(s)和πθ′(s)。而我们的KL散度指的就是这两个行为概率分布之间的距离,这就叫行为的距离。
参数上的距离意义不大,而行为上的距离能保证面对相同的state时,两个Actor能输出近似的行为概率分布。
上面这些就是基本的内容了,除此之外,我们还额外添加了一个约束。当KL(θ,θ′)>KLmax时,增加β;当KL(θ,θ′)<KLmin时,减小β。KLmax和KLmin都是自己设置的,这么做的目的是为了动态调整参数β,防止太过追求θ和θ′距离远近,导致Jθ′(θ)没有起到想要的效果。
PPO2
PPO算法太复杂了,有一个PPO2,实现起来简单多了,我就不解释了,想了解的可以去B站直接搜李宏毅的视频。
