DeepRL: From On-Policy to Off-Policy

1 Why Off-Policy ?

1.1 Definition

On-policy存在的问题:第一种在策略梯度方法时候,需要每个训练周期分为两个阶段:

  1. collect data

  2. update model

1.2 策略梯度回顾

对于一个参数为θ 的执行者,策略梯度优化的目标是:

maxRθ=τR(τ)pθ(τ)

即最大化执行者在所有可能轨迹上的总回报的期望。

我们要计算目标函数对参数θ的梯度,暂时只考虑pθ(τ)这一项和θ有关,那么只需要考虑这一项的梯度。不难求出这一项的梯度展开如下

pθ(τ)=p(s1)p(a1|s1)p(s2|s1,a1)p(sT)pθ(τ)=pθ(τ)logpθ(τ)

通过梯度公式,将函数连乘的梯度转换为函数和的梯度。这里我们进一步合理假设环境变化的概率和执行者的参数无关,那么θp(si|)=0。于是我们计算出这一项梯度为:

pθ(τ)=pθ(τ)t=1Tθlogp(at|st)

所以目标函数的梯度可以写为:

Rθ=τpθ(τ)R(τ)t=1Tθlogp(at|st)=Eτpθ(τ)[t=1TR(τ)θlogp(at|st)]=E(st,at)πθ[A(st,at)θlogp(at|st)]1Ni=1Nt=1Ti1A(st,at)θlogp(at|st)

注意最后参数要向着目标函数值增大的方向更新,所以时加上梯度乘以学习率。最后使用了优势函数来替换每一个episode的总体回报。常见的优势函数设计如下:

A(st,at)=t=tγttrt,γ<1

1.2 策略梯度的问题

策略梯度作为一种on-policy方法,阶段一中需要收集大量的轨迹数据,也就是多组学习者和环境交互的轨迹。这是一个非常耗时的过程,但在训练周期中收集的数据只能被用来更新一次参数,下一个周期就要重新收集(因为轨迹和学习参数相关!),这会导致训练的效率极低。

于是会自然的提出一个问题:我们是否可以从执行者参数无关的分布中采集数据?

重要性采样就是为了从一个新的分布中采样来替换旧的分布

2 Importance Sampling

对于一个分布P(X),它的期望值可以这样计算:

Exp(x)[f(x)]=p(x)f(x)dx=q(x)p(x)q(x)f(x)dx=Exq(x)[p(x)q(x)f(x)]

不难发现,当从分布q(X)中采样,只要额外计算一个分式修正量(也称为重要性权重)即可。但是这里的分布q(X)并不是随便选择的,它需要至少符合下面的条件,才能保证期望的相等(无偏性)。

  1. 支撑集覆盖(support coverage):对于所有p(x)>0的地方,都有q(x)>0。否则某些区域将无法采样到,也就没法准确计算期望 ps: 积分区域的完整性

  2. 权重可计算且有限(Weight Computability and Finite Expectation)。

什么样的q(x)才算一个好的分布? 在无偏的背景下考虑方差,方差应该也要尽可能一致。

Varxp(x)(f(x))=Ep[f2(x)]Ep2[f(x)]Varxq(x)(p(x)q(x)f(x))=Ep[p(x)q(x)f2(x)]Ep2[f(x)]

所以,只有当p(x)q(x)尽可能一致的时候(分布相似,有点像废话)方差的差距才会比较小。

3 Off-policy

既然可以用一个新的分布采样原来的分布,那么我们就可以收集一次数据,更新多次模型参数。新的梯度如下:

E(st,at)πθ[pθ(st,at)pθ(st,at)Aθ(st,at)θlogp(at|st)]=E(st,at)πθ[pθ(at|st)pθ(st)pθ(at|st)pθ(st)Aθ(st,at)θlogp(at|st)]=E(st,at)πθ[pθ(at|st)pθ(at|st)Aθ(st,at)θlogp(at|st)]

此时的目标函数变为:

Jθ(θ)=E(st,at)πθ[pθ(at|st)pθ(at|st)Aθ(st,at)]

这时候我们需要约束学习的模型参数和采样的模型参数差距不能特别大,为此一个直觉的想法时,在目标函数上增加一项KL散度,使得两个参数下的策略空间的分布相似。这就是近端策略梯度优化

JPPOθ(θ)=E(st,at)πθ[pθ(at|st)pθ(at|st)Aθ(st,at)]βKL(θ,θ)

自适应调整β

事实上这个KL也不是很好算,如何避免计算?

JPPO2θ(θ)E(st,at)πθ[min(pθ(at|st)pθ(at|st)Aθ(st,at),clip(pθ(at|st)pθ(at|st),1ϵ,1+ϵ)Aθ(st,at))]

image-20250224205241119