最近陶瓷到了港科的一个 RA,组里在做 Agent 强化学习相关内容,听从学长的指导来学习 PPO 算法相关知识。
在强化学习中,at 一般表示 t 时刻 Agent 采取的动作(action);st 表示 t 时刻 Agent 所处的状态(state);π 表示 Agent的策略函数(policy),输入状态,输入采取每个动作的概率分布 π(at∣st);rt 一边表示 t 时刻 Agent 采取行动获得的奖励(Reward);τ 表示轨迹(Trajectory),Episode 指一次完整的交互过程:从环境开始,到终止结束。Rollout 指按某个策略实际“跑出来”的一段轨迹数据。它不一定非得是完整的一局,也可以只是中间截取的一段。
(s0,a0,s1,a1…sT)
st+1=f(st,at) 或者 st+1=P(⋅∣st,at)。
Return 一般表示回报,指从当前时间点到游戏结束时奖励的累积和或者加权累积和。
训练一个 Policy 神经网络 π,在所有状态 S 下,给出相应的 Action,得到的 Return 的期望最大。
E(R(τ))τ∼Pθ(τ)=τ∑R(τ)Pθ(τ)
∇E(R(τ))τ∼Pθ(τ)=∇τ∑R(τ)Pθ(τ)=τ∑R(τ)∇Pθ(τ)=τ∑R(τ)∇Pθ(τ)⋅Pθ(τ)Pθ(τ)=τ∑Pθ(τ)R(τ)Pθ(τ)∇Pθ(τ)≈N1n=1∑NR(τn)Pθ(τn)∇pθ(τn)=N1n=1∑NR(τn)∇logPθ(τn)=N1n=1∑NR(τn)∇logt=1∏TnPθ(ant∣snt)=N1n=1∑NR(τn)t=1∑Tn∇logPθ(ant∣snt)=N1n=1∑Nt=1∑TnR(τn)∇logPθ(ant∣snt)Loss=−N1n=1∑Nt=1∑TnR(τn)logPθ(ant∣snt)
R(τn)=t=t′∑Tnγt−t′rt′n=Rtn
为了衡量每个动作的相对好坏的情况,我们令奖励 Rt 减去一个基准值。
N1n=1∑Nt=1∑Tn(Rtn−B(stn))∇logPθ(atn∣stn)
但是,Rtn 都是一次随机采样,方差很大,训练不稳定。我们引入 Qθ(s,a),表示在状态 s,下,做出动作 a 后期望的回报,即动作价值函数。
令 Vθ(s) 在状态 s 下期望的回报,即状态价值函数
Aθ(s,a)=Qθ(s,a)−Vθ(s) 表示优势函数(Advantage Function),衡量在状态 s 下,动作 a 相对于平均水平的优势。
讲上述的公式改写为
N1n=1∑Nt=1∑TnAθ(stn,atn)∇logPθ(atn∣stn)
Qθ(st,a)=rt+γVθ(st+1)Aθ(st,a)=rt+γVθ(st+1)−Vθ(st)Vθ(st+1)≈rt+1+γVθ(st+2)通过上述公式变化,关于 Aθ(s,a) 的推到公式仅剩一个相关变量,可以降低公式的复杂性。
之后再根据采样步数进行估算。采样越多,情况越多,整体估计的偏差就会偏小,同样的,碰到极值的概率越大,方差就越大。
Aθ1(st,a)=rt+γVθ(st+1)−Vθ(st)Aθ2(st,a)=rt+γrt+1+γ2Vθ(st+2)−Vθ(st)Aθ3(st,a)=rt+γ∗rt+1+γ2∗rt+2+γ3Vθ(st+3)−Vθ(st)⋮AθT(st,a)=rt+γ∗rt+1+γ2∗rt+2+γ3∗rt+3+⋯+γT∗rT−Vθ(st)为了让式子表示整洁,我们定义一个中间变量,令 δt 表示在第 t 步采取特定动作带来的优势。
δtV=rt+γ∗Vθ(st+1)−Vθ(st)δt+1V=rt+1+γ∗Vθ(st+2)−Vθ(st+1)Aθ1(st,a)=δtVAθ2(st,a)=δtV+γδt+1VAθ3(st,a)=δtV+γδt+1V+γ2δt+2V⋮这时我们考虑,在运行时我们应该向后采样几步呢?GAE 的答案是,小孩子才做选择,我全都要!
GAE考虑全部的采样结果,并引入一个衰减因子 λ 。
AθGAE(st,a)=(1−λ)(Aθ1+λ∗Aθ2+λ2Aθ3+⋯)λ=0.9:AθGAE=0.1Aθ1+0.09Aθ2+0.081Aθ3+⋯=(1−λ)(δtV+λ∗(δtV+γδt+1V)+λ2(δtV+γδt+1V+γ2δt+2V)+⋯)=(1−λ)(δtV(1+λ+λ2+⋯)+γδt+1V∗(λ+λ2+⋯)+⋯)=(1−λ)(δtV1−λ1+γδt+1V1−λλ+⋯)=b=0∑∞(γλ)bδt+bV整理后发现其中有等比数列,利用等比数列求和得到最终的 GAE 优势函数的表达式。
GAE 优势函数平衡了采样不同步带来的方差和偏差的问题。
现在我们来看上面得之不易的三个表达式:
δtV=rt+γVθ(st+1)−Vθ(st)AθGAE(st,a)=b=0∑∞(γλ)bδt+bVN1n=1∑Nt=1∑TnAθGAE(snt,ant)∇logPθ(ant∣snt)这里的价值状态函数我们一般用一个神经网路进行拟合,一般可以和策略网络公用参数,只是最后一层不同。
在经典的强化学习环境中,我们一般是一边采集数据,一边进行训练模型,采集完的数据用完就会丢掉。这导致我们采集的数据发生了一定的浪费,且模型训练的成本也会增高。但如果我们有一种方法,能让模型在其他模型的表现中学习自己的表现,参考其他数据就能实现自身的更新,这样我们的训练成本就会大大减少。
将 f(x) 在分布 p 下的期望改写为在另一分布 q(proposal)下的期望,从而可用从 q 采样的数据估计:
E(f(x))x∼p(x)=x∑f(x)⋅p(x)=x∑f(x)⋅p(x)q(x)q(x)=x∑f(x)q(x)p(x)⋅q(x)=E(f(x)q(x)p(x))x∼q(x)≈N1n=1∑Nf(xn)q(xn)p(xn),xn∼q(x)这样我们可以用重要性采样更新我们的目标函数的梯度公式,这样我们可以把 on-policy 的训练改为 off-policy 的训练。
记 θ′ 为采集数据时的旧策略,θ 为当前要优化的策略;优势 Aθ′GAE 由旧策略下的价值网络估计。利用恒等式 ∇logf(x)=f(x)∇f(x),可将策略梯度写成重要性采样比 Pθ′Pθ 的形式:
∇logf(x)=f(x)∇f(x)N1n=1∑Nt=1∑TnAθGAE(snt,ant)∇logPθ(ant∣snt)=N1n=1∑Nt=1∑TnAθ′GAE(snt,ant)Pθ′(ant∣snt)Pθ(ant∣snt)∇logPθ(ant∣snt)=N1n=1∑Nt=1∑TnAθ′GAE(snt,ant)Pθ′(ant∣snt)Pθ(ant∣snt)Pθ(ant∣snt)∇Pθ(ant∣snt)=N1n=1∑Nt=1∑TnAθ′GAE(snt,ant)Pθ′(ant∣snt)∇Pθ(ant∣snt)对应地,极大化目标时可用如下损失(最小化时取负号):
Loss=−N1n=1∑Nt=1∑TnAθ′GAE(snt,ant)Pθ′(ant∣snt)Pθ(ant∣snt)同时,你学习的目标模型不能和我们的差距过大,否则很难学到有用的经验和教训。
如何给我们训练的策略和参考的策略增加相差不能过大这个约束呢?那就是加上 KL 散度的约束。KL 散度就是衡量两个分布差异大小的指标。两个分布差异越小,KL散度越小,分布差异越大,KL散度越大。通过因子 β 来调整 KL 散度影响的大小。
Lossppo=−N1n=1∑Nt=1∑TnAθ′GAE(snt,ant)Pθ′(ant∣snt)Pθ(ant∣snt)+βKL(Pθ,Pθ′)PPO 还有一种实现,是通过截断函数来替代 KL 散度,防止训练的策略和参考的策略偏差过大,可以看出它是由红色和蓝色两个部分构成,取两个部分的最小值。
其中红色部分是原始公式,蓝色部分是一个截断函数,截断函数内由三个部分组成。如果 Pθ′(ant∣snt)Pθ(ant∣snt) 的值介于 1−ϵ 到 1+ϵ 之间,就返回原值,否则返回其中更接近的一个。这就限制的参考模型和训练模型差异的值不能太大。
Lossppo2=−N1n=1∑Nt=1∑Tnmin(Aθ′GAE(snt,ant)Pθ′(ant∣snt)Pθ(ant∣snt),clip(Pθ′(ant∣snt)Pθ(ant∣snt),1−ϵ,1+ϵ)Aθ′GAE(snt,ant))零基础学习强化学习算法:ppo