从强化学习到PPO的理论部分(学习笔记)

从强化学习到PPO的理论部分(学习笔记)1.强化学习的基本概念2.理论推导部分3.针对R(τ)n的优化3.1对R(τ)n引入时间步的考量3.2状态价值函数,动作价值函数,优势函数3.3时序差分和GAE4.Proximal Policy Optimization(PPO)邻近策略优化4.1On-policy和Off-Policy4.2重要性采样4.3最终的形式

最近从头开始学习强化学习以及PPO,花了两天的时间才搞懂了一些基本的概念和流程。主要参考了B站UP主RethinkFun的《零基础学习强化学习算法:ppo》,在这里记录一下自己的学习笔记。

1.强化学习的基本概念

State(状态),

Action(动作),

Environment(系统设定等环境),

Agent(智能体或模型)

Reward:奖励,指Agent在某个State下执行了某个Action与Environment交互之后得到的奖励,记为r

Policy:策略,主要指Agent在某个State下执行各个Action的概率分布,记为$\pi_{\theta}(a|s)$

Trajectory:轨迹,指在策略$\theta$下的某次具体的路径,也即Policy的一次采样值,记为$\tau$,由一连串的${{s_{1},a_1,s_2,a_2,\ldots}}$构成

Return:回报,指某次Trajectory结束后得到的累积Reward

所以强化学习的目标是训练一个Policy神经网络$\pi$,在所有状态State下,做出相应的Action,得到相应的Reward,使得Return的期望最大

或者表述为:训练一个Policy神经网络$\pi$,在所有的Trajectory下,Return的期望最大

2.理论推导部分

前面提到,强化学习的目标是最大化Return的期望,Return的期望可以表示为

$$ E(R(\tau))_{\tau\in P_\theta(\tau)} = \sum_\tau R(\tau)*P_\theta (\tau) $$

而对于公式中的 $P_{\theta}(\tau)$ ,表示的是该策略下选到该轨迹的概率,根据Trajectory的定义,其可以表示为:

$$ P_\theta (\tau) = \prod_{t=1}^T \pi_\theta(a_t|s_t)*p(s_{t+1}|s_t,a_t) $$

这里要怎么理解呢?根据Trajectory的定义,轨迹是由一连串的$s_1,a_1,s_2,a_2,\ldots,s_t,a_t$构成,因此可由某状态下执行某动作的概率*某个动作导致下一状态的概率连乘表示,其中$\pi_\theta(a_t|s_t)$由Policy决定(由下标也可以看出来),而$p(s_{t+1}|s_t,a_t)$由Environment决定。

接着,我们知道在深度学习中,不管是求损失函数的最小值还是目标函数的最大值,都需要用到梯度下降法或者梯度上升法,所以这里我们来求$E(R(\tau))_{\tau\in P_\theta(\tau)}$的梯度

$$ \begin{align*} \nabla_\theta E(R(\tau))_{\tau\in P_\theta(\tau)}&= \nabla_\theta \sum_\tau R(\tau)*P_\theta (\tau) \\ &=\sum_\tau R(\tau)*\nabla_\theta P_\theta(\tau)\\ \end{align*} $$

这里涉及到一个技巧:$\nabla ln(f(x)) = \frac{\nabla f(x)}{f(x)}$,因此我们可以用$P_\theta(\tau) \nabla_\theta ln(P_\theta (\tau))$替换掉公式中的$\nabla_\theta P_\theta (\tau)$,得到

$$ \begin{align*} &=\sum_\tau R(\tau)*P_\theta(\tau)\nabla_\theta ln(P_\theta(\tau))\\ &=\sum_\tau R(\tau)*P_\theta(\tau)\sum_{t=1}^T\nabla_\theta ln\pi_\theta(a_t|s_t)\\ &=E_{\tau\in P_\theta(\tau)}(R(\tau)\sum_{t=1}^T\nabla_\theta ln\pi_\theta(a_t|s_t)) \end{align*} $$

这里不难理解,用到了期望的基本定义;之后我们再次用到期望的一个性质:

$$ E(X)_{x\in p(X)} = \sum_x x*p(x)\approx \frac{1}{n}\sum_{i=1}^nx _{x\in p(x)} $$

因此可得

$$ \begin{align*} &=\frac{1}{N}\sum_{n=1}^NR(\tau^n)\sum_{t=1}^T\nabla_\theta ln\pi_\theta(a_t|s_t)\\ &=\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^TR(\tau^n)\nabla_\theta ln\pi_\theta(a_t|s_t) \end{align*} $$

到这里,我们已经得到了训练的目标函数,目标函数的梯度,为了与深度学习统一,我们这里给目标函数加上负号作为损失函数进行统一处理

$$ Loss =-\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^TR(\tau^n)ln\pi_\theta(a_t|s_t) $$

式中的$R(\tau^n)$由n次采样实际得到

$\pi_\theta(a_t|s_t)$由策略神经网络得到

3.针对$R(\tau)^n$的优化

3.1对$R(\tau)^n$引入时间步的考量

在上面的公式中,奖励函数$R(\tau^n)$被定义为一次轨迹后得到的总的累积回报,与时间步t无关,用这个累积回报来对此次策略中的所有action进行调整,这么做其实并不太客观,因为某个action发生后,他只会对当前及以后的reward产生影响,且随着时间步的推移,这个影响应当越来越小。

举个例子:如果在第一步,agent就选择了一个十分糟糕的action导致扣分100分,即使后面的action都在补救,也导致最后的return很低,这种情况下如果对所有的action都进行低概率方向的调整显然是不合理的

因此我们引入单步的奖励函数来评估每一步具体动作的奖励,并引入衰减因子$\gamma$来表示其对后续时间步影响的衰减,具体公式如下:

$$ R(\tau^n)\to\sum_{t^{\prime}=t}^{T_n}\gamma^{t^{\prime}-t}r_{t^{\prime}}^n=R_t^n $$

因此我们原本的公式变为

$$ \frac{1}{N}\sum_{n=1}^N\sum_{t=1}^TR_t^n\nabla_\theta ln\pi_\theta(a_t|s_t) $$

此外还有一种情况:当某个state下所有action都能得到正的reward或者都得到负的reward(但具体数值不同)时,目前的公式可能无法体现各个action的相对优势,因此我们可以在R_t^n基础上减去一个baseline,得到如下公式

$$ \frac{1}{N}\sum_{n=1}^N\sum_{t=1}^T(R_t^n-B(s_n^t))\nabla_\theta ln\pi_\theta(a_t|s_t) $$

到这里公式其实已经很完备了,但是问题来了,R_t^n是怎么得到的呢?是通过完成某个Trajectory后得到的实际各步的奖励计算得来的,也就是对奖励分布的一次随机采样,方差很大。 这里可能不好理解,我解释一下,由于Environment是具有随机性的,因此即使在相同的State下采取了相同的Action,得到的Reward也并不一定,而是服从一定的概率分布,所以如果对其进行随机采样,就会导致方差较大的问题。

这里用AI举的一个例子辅助说明:

想象你正在工地搬砖计算日工资:

  • $R_t^n$就像你某一天实际干完所有活拿到的具体工资(比如今天搬了100块,工头给了250块)。天气、工头心情、意外因素都会影响它,每天波动很大。
3.2状态价值函数,动作价值函数,优势函数

因此我们接着引入了以下概念:

Action-Value Function :

动作价值函数$Q_\theta(s,a)$,在State s下做出Action a得到的期望回报

State-Value Function

状态价值函数$V_\theta(s)$,在State s下的期望回报

Advantage Function

优势价值函数$A_\theta(s,a) = Q_\theta(s,a)-V_\theta(s)$,在状态s下,做出动作a,能带来多少的优势

重要:这里得到的几个值,都是估计值,或者叫预测值,通常是通过训练一个状态价值模型/动作价值模型来进行预测

这么做的好处是,不仅避免了单次采样方差大的问题,还能在本次轨迹没有结束时给出某一动作带来的优势或好处

(当然可能有人会问,这么做是减小了方差,那难道不会导致偏差变大吗?这个问题我会在之后解释)

在这里我们可以很直观的看出,$A_\theta(s,a) = Q_\theta(s,a)-V_\theta(s)$ 是用来替换原公式中的$R_t^n-B(s_n^t)$

所以这时候我们的公式变成了

$$ \frac{1}{N}\sum_{n=1}^N\sum_{t=1}^TA_\theta(s,a) \nabla_\theta ln\pi_\theta(a_t|s_t) $$

现在我们来考虑一下$Q_\theta(s,a)$**和$V_\theta(s)$的关系:

这里直接给出公式:

$\begin{aligned}&Q_{\theta}(s_{t},a)=r_{t}+\gamma*V_{\theta}(s_{t+1})\\&A_{\theta}(s_{t},a)=r_{t}+\gamma*V_{\theta}(s_{t+1})-V_{\theta}(s_{t})\end{aligned}$

这两个公式也很直观:某个动作的价值=执行该动作后立刻获得的短期价值+其导致的下一状态的状态价值(是一种长期价值)

这样要求优势价值函数,只需要训练一个状态价值函数模型,而不需要同时训练状态价值模型和动作价值模型来进行预测

3.3时序差分和GAE

回收之前的问题,既然$V_\theta(s_{t+1})$是预测值/估计值,怎么保证$V_\theta(s_{t+1})$的估计不会有过大的方差和偏差呢?

我们从状态价值的定义出发,可以想到,一个状态价值的期望,是对该状态下选择的动作的价值以及各个动作导致的新状态的价值期望,用公式可以表示为

$$ V_\theta(s_{t+1}) = E_{a_{t+1}\in\pi_\theta(\cdot|s_{t+1})}[E_{s_{t+2}\in p(\cdot|s_{t+1},a_{t+1})}[r_{t+1}+\gamma V_\theta(s_{t+2})]] $$

其中:

  • 内层期望:对 状态转移概率$p(s_{t+2}|s_{t+1},a_{t+1})$积分(环境随机性)

  • 外层期望:对策略概率$\pi_\theta(a_{t+1}|s_{t+1})$积分(动作随机性)

但是,在算法的实际训练过程中是无法直接计算双期望的(需遍历所有可能的$a_{t+1}$和$s_{t+2})$,因此我们采用采样的方法来近似期望值:

$$ V_\theta(s_{t+1}) \approx r_{t+1} + \gamma V_\theta(s_{t+2}) $$

这里其实仍然存在$R^n_t$那里的问题,随机采样一定会引入方差,且即使经过迭代,公式里仍然有$V_\theta(s_{t+2})$,仍然是一个估计值,一定有偏差。

针对这两个问题,我们继续往下看。不难发现,公式中的$V_\theta(s_{t+2})$仍然可以用相同的方式进行采样近似,得到两步乃至多步采样的估计值。

那随着采样步数的增加,对于$V_\theta(s_{t+1})$的估计的方差和偏差分别是怎么变化呢?

这里先说结论:方差增大,偏差减小

方差增大很好理解,因为每多一步采样都是对r_t的采样,都会引入短期奖励的方差

那怎么理解偏差减小呢?

这里举一个例子:

当你在从某地驱车赶往另一地,一开始导航软件提示预估到达时间为30分钟,当你驾驶10分钟之后再看导航,预估到达时间是18分钟,那么很显然,对于更短路程的估计(18分钟)+已经确定的10分钟是比一开始估计的30分钟更准确的,也就是说,对于这段路程,28分钟是比30分钟偏差更小的估计。

这里的10分钟其实就代表了公式中采样确定的r_{t},对r_t进行越多时间步的采样,也即已知条件越多,未知时间步越少,对V_\theta(s_{t})的估计越准确,偏差也就越小。

这种方法叫做TD(时序差分方法)

这里我们定义一个中间变量$\delta$以简化书写:

$$ \begin{aligned}&\delta_{t}^{V}=r_{t}+\gamma*V_{\theta}(s_{t+1})-V_{\theta}(s_{t})\\&\delta_{t+1}^{V}=r_{t+1}+\gamma*V_{\theta}(s_{t+2})-V_{\theta}(s_{t+1})\end{aligned} $$

这样上面的优势函数的分步采样可以写为:

$$ \begin{aligned}&A_\theta^1(s_t,a)=\delta_{t}^{V}\\&A_\theta^2(s_t,a)=\delta_{t}^{V}+\gamma\delta_{t+1}^{V}\\&A_\theta^3(s_t,a)=\delta_{t}^{V}+\gamma\delta_{t+1}^{V}+\gamma^{2}\delta_{t+2}^{V}\\&:\end{aligned} $$

接下来我们就要考虑一个问题:那我们要采样多少步来平衡偏差和方差呢?

GAE给出的思路是:我全都要

公式如下:

$$ A_\theta^{GAE}(s_{t},a) =(1-\lambda)(A_\theta^1+\lambda A_\theta^2+\lambda ^2A_\theta^3+\cdots) $$

GAE的思路是对不同步的采样值进行加权平均,这里的\lambda是一个超参数。

将\delta代入可以得到

$$ \begin{align*} A_\theta^{GAE}(s_{t},a) &=(1-\lambda)(A_\theta^1+\lambda A_\theta^2+\lambda ^2A_\theta^3+\cdots)\\ &\begin{aligned}&=(1-\lambda)(\delta_{t}^{\nu}+\lambda*(\delta_{t}^{\nu}+\gamma\delta_{t+1}^{\nu})+\lambda^{2}(\delta_{t}^{\nu}+\gamma\delta_{t+1}^{\nu}+\gamma^{2}\delta_{t+2}^{\nu})+\cdots)\\&=(1-\lambda)(\delta_{t}^{\nu}(1+\lambda+\lambda^{2}+\cdots)+\gamma\delta_{t+1}^{\nu}*(\lambda+\lambda^{2}+\cdots)+\cdots)\\&=(1-\lambda)(\delta_{t}^{\nu}\frac{1}{1-\lambda}+\gamma\delta_{t+1}^{\nu}\frac{\lambda}{1-\lambda}+\cdots)\\&=\sum_{b=0}^{\infty}(\gamma\lambda)^{b}\delta_{t+b}^{\nu}\end{aligned} \end{align*} $$

至此我们得到了如下公式:

$$ \begin{aligned} &\delta_{t}^{V}=r_{t}+\gamma*V_{\theta}(s_{t+1})-V_{\theta}(s_{t})\\ &A_{\theta}^{GAE}(s_{t},a)=\sum_{b=0}^{\infty}(\gamma\lambda)^{b}\delta_{t+b}^{V}\\ &\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta}^{GAE}(s_{n}^{t},a_{n}^{t})\nabla_\theta\mathrm{ln}\pi_{\theta}(a_{n}^{t}|s_{n}^{t})\\ &Loss =-\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta}^{GAE}(s_{n}^{t},a_{n}^{t})\mathrm{ln}\pi_{\theta}(a_{n}^{t}|s_{n}^{t}) \end{aligned} $$

这里的$V_\theta(s_t)$​由训练好的状态价值网络进行估计。很显然的是,状态价值网络并不是训练好后就不再变化的,其参数应该与策略网络一起迭代。实际上,由于状态价值网络和策略网络输入均为状态,二者共用输入层和特征提取层,这部分称为共享层;但有各自的输出层,策略网络的输出层是softmax层对各个动作的概率做决策,而价值网络输出的价值的数值。

策略网络和价值网络的这种模式被称为**Actor-Critic(演员-评论家)**架构

损失函数:最小化时序差分误差 (TD Error) 的均方:

$$ L_v = \frac{1}{N}\sum||V_\theta(s_t)-(r_t+\gamma V_{\theta}(s_{t+1}))||^2 $$

我们已经得到了策略网络和价值网络训练的损失函数,在实际训练过程中,二者的共享层参数更新要综合考虑两个损失函数,共享层参数兼具“做决策”和“打分”的功能,而输出层参数更新则使用各自的损失函数进行更新。

4.Proximal Policy Optimization(PPO)邻近策略优化

4.1On-policy和Off-Policy

我们先讲一个例子:

课堂上,老师针对小明的表现进行表扬或批评,如果老师表扬小明,小明就加强老师表扬的行为,如果老师批评小明,小明就减少老师批评的行为,这种模式叫做On-Policy,也就是我们前面推导的方式。这种方式中,获得数据进行训练的模型是同一个,也就是说,模型需要先进行交互得到数据,再用数据训练模型,再用新模型获取新数据,再进行训练,这样循环往复。这样做存在的一个问题是:

每次得到的数据用完即丢,模型将耗费大量的时间在获取数据上,大大限制了训练速度和效率。

那有什么办法来提高效率呢?

回到刚刚的例子中,如果你是小明的同学,你是不是可以根据老师对小明的批评和表扬来调整自己的行为呢?老师表扬小明的行为,你也去加强,老师批评小明的行为,你也去减少,这种模式就叫做Off-Policy

当然,你毕竟不是小明,所以你的调整应该根据你的行为与小明行为的相对比较来调整,比如说小明上课玩手机的概率是0.2,而你上课玩手机的概率是0.4,那么小明被批评后你降低玩手机概率的强度就应该是小明的二倍。这就叫重要性采样

4.2重要性采样
$$ \begin{aligned}\operatorname{E}(f(x))_{x\sim p(x)}&=\sum_{x}f(x)*p(x)\\&=\sum_{x}f(x)*p(x)\frac{q(x)}{q(x)}\\&=\sum_{x}f(x)\frac{p(x)}{q(x)}*q(x)\\&=\mathrm{E}(f(x)\frac{p(x)}{q(x)})_{x\sim q(x)}\\&\approx\frac{1}{N}\sum_{n=1}^{N}f(x)\frac{p(x)}{q(x)}_{x\sim q(x)}\end{aligned} $$

利用重要性采样,我们就可以将原本的On-Policy替换为Off-Policy

$$ \begin{aligned}&\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n}A_\theta^{GAE}(s_n^t,a_n^t)\nabla\mathrm{log}P_\theta(a_n^t|s_n^t)----On-Policy\\ &\to \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})}\nabla\mathrm{ln}P_{\theta}(a_{n}^{t}|s_{n}^{t})----Off-Policy\\ &\begin{aligned}&=\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta^{\prime}}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta^{\prime}}(a_{n}^{t}|s_{n}^{t})}\frac{\nabla P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta}(a_{n}^{t}|s_{n}^{t})}\\&=\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta^{\prime}}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{\nabla P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta^{\prime}}(a_{n}^{t}|s_{n}^{t})}\end{aligned} \end{aligned} $$

因此可得损失函数:

$$ \mathrm{Loss}=-\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})} $$

但是这里还有一个限制,就是参考策略\theta’和要训练的策略\theta不能相差太多,

还是以刚才的例子来说,老师批评的学生的情况和你的情况最相似时,对你的帮助越大。假如你是一个好学生,小明是一个坏学生,老师批评小明考试不能交白卷,对你来说便没有意义,因为你不可能考试交白卷;同样的,老师表扬小明这节课虽然没听课,但是也没有骂老师,这个表扬对你也没有意义,因为你不可能上课骂老师。

所以很自然的我们想到,我们应该对两个策略之间的相似度做一定的约束,怎么衡量两个概率分布的相似度呢?当然是KL散度。

4.3最终的形式

由此我们得到下面两种损失函数的形式:

$$ \begin{align*} &Loss_{ppo}=-\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})}+\beta KL(P_{\theta'},P_{\theta})\\ &Loss_{ppo2}=-\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}min(A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})},clip(\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})},1-\varepsilon,1+\varepsilon)A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})) \end{align*} $$

在第一个公式中,我们将KL散度在目标函数中减掉,意味着我们要最大化目标函数,则KL散度不能过大;但KL散度的计算并不容易,因此有第二个公式,通过截断函数替代KL散度,防止训练策略和参考策略相差过大。

对于第二个公式我进一步解释一下:截断函数表示当\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta’}(a_{n}^{t}|s_{n}^{t})}在1-\epsilon到1+\epsilon之间时,取对应的值,超出范围时取边界值。

这里的min是因为Loss函数中带有负号,如果从目标函数角度来看,这里应该是max(当然负号也要去掉),

$$ J(\theta)_{ppo2}=\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}max(A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})},clip(\frac{P_{\theta}(a_{n}^{t}|s_{n}^{t})}{P_{\theta'}(a_{n}^{t}|s_{n}^{t})},1-\varepsilon,1+\varepsilon)A_{\theta'}^{GAE}(s_{n}^{t},a_{n}^{t})) $$

max保证了,当某一动作在参考策略带来的优势函数为正值时,在目标策略里应该提高该动作的概率,但也不能超过边界导致两个策略相差太大,而某动作带来负面影响,应该减小该动作在目标策略中的概率,但同样不能小于边界值。

还有一个问题是关于参考策略\theta’的更新,一般采取的办法是每K步将当前策略参数 θ 复制给 θ

至此完成了从强化学习基础到PPO的理论推导