1 前置知识点
基本概念
https://www.yuque.com/docs/share/04b60c4c-90ec-49c7-8a47-0dae7d3c78c7?#
(部分符合的定义在这里)
要理解PPO,就必须先理解Actor-Critic.
Actor负责输出policy,也就是在某个状态下执行各种action的概率分布
Critic负责输出Vaue of state。
Actor和Critic的默契:Actor相信Critic给的状态的value就是真的; Critic也相信Actor选送过来的(s,a)中的a就是最优的action。通过不断的迭代,强化这个信任关系的正确性。
(这体现了我们的价值观 [因为信任,所以简单],哈哈哈~)
所以这样就不难理解Critic的Loss是怎么来的了,Critic的输出就是state的Value,那就让Critic模型的输出使得以下公式成立:
Vs=rs,a+γVs′
其中,rs,a,s,a,s′是训练Critic需要的数据,s′是在状态s下执行动作a得到新状态, rs,a是reward, γ 是discount factor。
跟基础概念的区别是,这里的系统假定是执行动作a只能到s′, 没有体现执行a可以得到不同的状态; (但是其实这种概率可以体现在训练数据中,因为(s,a,rs,a)和s′ 不一定是一一对应,其概率可以通过sampling得到的数据分布体现)
所以Critic的Loss就是|rs,a+γVs′−Vs|,也就是所谓的TD(Time Difference)-Error的L1,或者L2也可以.
那么Actor的Loss怎么计算呢?
这里就先来明白Advantage的概念,其实也就是TD-Error
Adv=rs,a+γVs′−Vs
之所以称之为Advantage,是因为假如Advantage>0, 就是说实际执行a之后,发现当前的状态Value实际上比当前Critic估计出来的要大,所以这是个好的Action,它能够让Vs 变大,Actor应该增大这个action的概率;反之,Advantage<0,这个action就是不好的,应该减小执行它概率。
所以Actor的Loss就是−log(π(a|s))∗Adv
2 Proximal Policy Optimization(PPO)
2.1 PPO主要是来解决什么问题?
它是为了让我们在训练Agent的时候能够take the biggest possible improvement step on a policy using the data we currently have, without stepping so far that we accidentally cause performance collapse。就是更新policy的时候尽可能步子迈大点,但也要防止扯着蛋,即模型参数崩了。
2.2 PPO怎么解决这个问题的?
简单来说,相同的网络结构,维护两组模型参数Old和New,在每次迭代的时候去更新New的参数,但是要控制New的模型输出Policy和Old的Policy不要差距太大,本轮迭代结束后,把New的参数覆盖掉Old的参数。
怎么去控制差距不要太大呢?作者给了两种方式: PPO-Penalty, PPO-Clip
2.2.1 PPO-Clip
先说PPO-Clip, 它通过下面的公式来更新策略:
θk+1=argmaxθEs,a∼πθk[L(s,a,θk,θ)]
就是最大化L(s,a,θk,θ),
L(s,a,θk,θ)=min(πθ(a|s)πθk(a|s)Aπθk(s,a),clip(πθ(a|s)πθk(a|s),1−ϵ,1+ϵ)Aπθk(s,a))
这个形式主要是为了让我们理解为啥叫PPO-Clip(我感觉直接用后面那个Clip项其实就够了,这个表达有点冗余),θk 就是当前Old的参数,θ 是New的参数。πθ(a|s) 是New Actor输出的Policy上状态s时执行a的概率,πθk(a|s) 表示的Old Actor输出的Policy上状态s时执行a的概率。Aπθk(s,a)是基于Old Critic得到的Advantage.
对这个公式进行改写,更容易看出它的真实目的,
L(s,a,θk,θ)=min(πθ(a|s)πθk(a|s)Aπθk(s,a),g(ϵ,Aπθk(s,a) ))
其中,
g(ϵ,A)={(1+ϵ)AA≥0(1−ϵ)AA<0