Proximal Policy Optimization (PPO) 算法理解

本文在理解该高质量文章:https://zhuanlan.zhihu.com/p/614115887时提出些自己的白话版理解。


强化学习分两大类:

  1. 基于值函数的强化学习(先算好坏再选动作;训练收敛后 Q 值固定,每次遇到同一个状态,必然选同一个动作 ,即确定性策略;典型算法有Q-Learning、SARSA、DQN)
  2. 基于策略的强化学习(直接学怎么选动作)
基于策略的强化学习的核心逻辑:
  1. 不再计算 Q 值打分,直接拟合选动作的策略本身
  2. 用参数\theta定义策略:\pi_\theta(a|s)=P(a|s;\theta),处于状态s时,在参数\theta下,选择动作a的概率
  3. 训练目标:用梯度上升/下降优化参数\theta,调整各个动作的选择概率,让总奖励变高
  4. 选动作规则:输出每个动作的概率按概率随机抽样选动作,不是固定选某一个,即随机性策略
目标函数公式:

\max_\theta J(\theta) =\max_\theta \mathbb{E}_{\tau\sim\pi_\theta}\big[R(\tau)\big] =\max_\theta \sum_{\tau} P(\tau;\theta)\,R(\tau)

  • J(\theta)= 所有可能轨迹的总奖励的数学期望(平均值)
  • \sum_\tau:遍历智能体和环境交互能走出来的全部可能轨迹
  • P(\tau;\theta):这条轨迹\tau被当前策略走出来的概率
  • R(\tau):这条轨迹的总奖励
  • 所有轨迹的概率 × 奖励累加,就是平均总奖励

调整参数,总奖励很高的好轨迹,提高它出现的概率;总奖励很低的坏轨迹,压低它出现的概率。最终整体平均收益越来越高。

轨迹概率公式:

P(\tau;\theta) = \prod_{t=0}^T \Big[P(s_{t+1}\mid s_t,a_t)\cdot \pi_\theta(a_t\mid s_t)\Big]

每一步由两部分概率相乘:

  1. \boldsymbol{\pi_\theta(a_t|s_t)}:策略自己选动作的概率。输入状态s_t ,会在参数为\theta的策略网络中输出所有可选动作的概率分布。选出动作a_t的概率即为该值。【智能体自己内部选这个动作的概率
  2. \boldsymbol{P(s_{t+1}|s_t,a_t)}:环境状态转移概率。执行动作a_t 后,环境从s_t跳到下一个状态s_{t+1}的概率(由环境规则固定)【动作执行完毕后,环境跳转结果的随机性,就是说,动作做完之后去往哪个下一个状态有概率

整条轨迹是一步一步串联出来的,所以总概率 = 每一步的概率依次相乘。

传统策略梯度推导:

先定总目标: 我们要最大化平均奖励J(\theta)=\mathbb{E}[R(\tau)],必须求梯度\nabla_\theta J(\theta) ,然后用梯度上升更新参数\theta

第一步:初始变形

\nabla_\theta J(\theta) = \nabla_\theta \sum_\tau P(\tau;\theta)R(\tau)=\sum_\tau \nabla_\theta P(\tau;\theta)\cdot R(\tau)求和的导数 = 导数的求和

第二步:对数导数恒等式

根据链式法则:设f>0\frac{d}{dx}\log f(x)=\frac{f'(x)}{f(x)} \implies f'(x)=f(x)\cdot \nabla\log f(x)

就会有:\nabla_\theta P(\tau;\theta) = P(\tau;\theta)\cdot \frac{\nabla_\theta P(\tau;\theta)}{P(\tau;\theta)} = P(\tau;\theta)\cdot \nabla_\theta \log P(\tau;\theta)

代入原式梯度:

\nabla_\theta J(\theta) =\sum_\tau P(\tau;\theta)\cdot \nabla_\theta\log P(\tau;\theta)\cdot R(\tau)\\ =\mathbb{E}_{\tau\sim\pi_\theta}\Big[\nabla_\theta\log P(\tau;\theta)\cdot R(\tau)\Big]

变成了期望形式:求和\sum P(\tau)\cdot(\dots)本身就是数学期望定义,写成期望形式更简洁。

好处就是,取对数后连乘变累加,求导更加简单。

第三步:拆解求导部分

之前轨迹概率:P(\tau;\theta)=\prod_{t=0}^T \Big[P(s_{t+1}|s_t,a_t)\cdot \pi_\theta(a_t|s_t)\Big]

两边取对数,\log(\prod x_t)=\sum\log x_t

\log P(\tau;\theta) =\sum_{t=0}^T \log P(s_{t+1}|s_t,a_t) +\sum_{t=0}^T \log \pi_\theta(a_t|s_t)

求梯度时,第一项是环境自带转移概率,完全不受网络参数\theta控制,对\theta求导结果 = 0,直接整项消失;只剩下第二项求导了。

此时完整策略梯度公式:\nabla_\theta J(\theta) =\mathbb{E}_{\tau}\left[ \left(\sum_{t=0}^T \nabla_\theta \log\pi_\theta(a_t|s_t)\right)\cdot R(\tau) \right]

第四步:采样近似处理

要遍历全部无穷多条轨迹求和,现实不可能算,所以用蒙特卡洛采样近似期望: 期望 ≈ 多条采样轨迹的平均值

采集 m 条完整交互轨迹\tau^{(1)},\tau^{(2)}...\tau^{(m)}

\nabla_\theta J(\theta) \approx \frac{1}{m}\sum_{i=1}^m \left[ \left(\sum_{t=0}^{T^{(i)}} \nabla_\theta\log\pi_\theta(a_t^{(i)}|s_t^{(i)})\right) \cdot R(\tau^{(i)}) \right]

如果按照逐样本梯度汇总,把所有轨迹所有时间步拆开,总共有 n 个(s_t,a_t) =样本,直接平均:

\nabla_\theta J(\theta) \approx \frac{1}{n}\sum_{i=1}^n \nabla_\theta\log\pi_\theta(a_{t^{(i)}}|s_{t^{(i)}})\cdot R(t^{(i)})

第五步:梯度更新规则

策略梯度是梯度上升(要最大化J(\theta) ,和神经网络梯度下降相反)

\theta \leftarrow \theta + \alpha\cdot \nabla_\theta J(\theta),其中\alpha是学习率,控制每次参数更新步长

强化学习独有致命问题: 监督学习数据集固定,跳歪了下个 epoch 还能拉回来; 但强化学习策略一变,收集到的交互样本立刻跟着变。一旦跳到差策略,后续采集的全是低分轨迹,用坏样本继续更新策略,形成恶性循环,彻底困在局部差区域,很难再走回最优。

而调小学习率会导致收敛极慢,这也是 PPO 等算法要做裁剪约束更新幅度的原始动机。

\theta \leftarrow \theta + \alpha\cdot \nabla_\theta J(\theta)只关心斜率,忽略了曲面曲率。直观理解不知道自己脚下是不是有急转弯。眼前一小段路看着坡度很缓(梯度小),但往前一点点路就会急拐弯陡变(曲率大),传统梯度看不见这个拐弯,很容易一步踩崩。

曲率大,极小参数改动就会让收益剧烈波动、策略剧变。曲率小,曲线拐弯非常平缓,做相同的改动,策略几乎没变。

自然策略梯度的推导:

为什么要计算策略分布差异,而不是衡量参数差值||\Delta\theta||

  • 过冲(Overshooting):更新错过了奖励峰值并落入了次优策略区域
  • 下冲(Undershooting):在梯度方向上采取过小的更新步长会导致收敛缓慢

如果用约束\boldsymbol{||\Delta\theta||\le\varepsilon} (限制参数改动距离)防止过冲,会有以下问题:

  • 在分布陡峭、曲率大的区域:很小的参数改动会使得策略剧烈大变,极易过冲翻车
  • 在分布平缓、曲率小的区域:很大的参数改动会使得策略几乎没变化,更新浪费效率

如果直接控制策略分布差异呢?直接管策略本身改动幅度?引入KL 散度。

KL 散度公式【量化更新前后两个策略(动作概率分布)到底相差多大

\mathcal{D}_{\text{KL}}\big(\pi_\theta \parallel \pi_{\theta+\Delta\theta}\big) =\sum_{x\in\mathcal{X}} \pi_\theta(x)\log\left( \frac{\pi_\theta(x)}{\pi_{\theta+\Delta\theta}(x)} \right)

  • \mathcal{X}:所有可选动作的全集;遍历每一个动作 x 计算差值再求和
  • \pi_\theta(x):旧策略选动作 x 的概率
  • \pi_{\theta+\Delta\theta}(x):新策略选动作 x 的概率

使用log的好处就是,如果新旧策略几乎一模一样,那么log里面会趋近于 1,log(1)=0,整体 KL≈0,如果新旧策略差别巨大,大量动作的选择概率发生剧变,KL 数值会明显变大。

优化式:

\Delta\theta^* = \mathop{\rm argmax}_{\boldsymbol{D_{\text{KL}}(\pi_\theta\parallel\pi_{\theta+\Delta\theta})\le\varepsilon}} J(\theta+\Delta\theta)

硬性规定:不管参数改多改少,新旧策略的差距不能超过阈值

  • 策略敏感区(曲率大、σ 小):为了不超 KL 上限,参数只能微调极小幅度,自动防止过冲
  • 策略迟钝区(曲率小、σ 大):允许参数大步改动,只要分布变化没超限就行,收敛更快

注意:KL 不是对称距离:\mathcal{D}_{\text{KL}}(P\parallel Q)\neq\mathcal{D}_{\text{KL}}(Q\parallel P),这里固定是旧策略在前、新策略在后。

下面求解权重更新方案:

对以上优化式拉格朗日松弛,约束变惩罚项:

\Delta\theta^* = \mathop{\arg\max}_{\Delta\theta}\; \boldsymbol{J(\theta+\Delta\theta) - \lambda\big(\mathcal{D}_{\text{KL}}(\pi_\theta \parallel \pi_{\theta+\Delta\theta}) - \varepsilon\big)}

因为J(\theta+\Delta\theta)\text{KL}(\theta+\Delta\theta)都是复杂非线性函数,没法直接求极值,在旧参数\theta_{\text{old}}附近做局部泰勒展开:

奖励函数J:一阶泰勒展开

一元函数一阶泰勒展开整理,已知函数f(x)x_0处可导,自变量增量h = x-x_0,即x = x_0+h,一阶泰勒展开近似公式为:

\boldsymbol{f(x_0+h)\approx f(x_0)+f'(x_0)\cdot h}

对应下面式子:

J(\theta_{\text{old}}+\Delta\theta) \approx J(\theta_{\text{old}}) + \nabla_\theta J|_{\theta_{\text{old}}}\cdot \Delta\theta,只保留一阶梯度项,二阶及以上太小可以忽略。

KL 散度:二阶泰勒展开

补充说明:KL 在\Delta\theta=0处,零阶、一阶导数都等于 0,最低非零项是二阶项:

\mathcal{D}_{\text{KL}}(\pi_{\text{old}}\parallel\pi_{\text{old}+\Delta\theta}) \approx \frac12 \Delta\theta^\top \cdot \nabla_\theta^2 \mathcal{D}_{\text{KL}} \big|_{\theta_{\text{old}}} \cdot \Delta\theta

把两个展开式代入拉格朗日式子:

\Delta\theta^* \approx \mathop{\arg\max}_{\Delta\theta} \; J_{\text{old}} + \nabla J\cdot\Delta\theta - \frac12 \lambda \cdot \Delta\theta^\top \cdot \nabla^2 \mathcal{D}_{\text{KL}} \cdot \Delta\theta + \lambda\varepsilon00

继续化简 ——用 Fisher 信息矩阵F替换KL的Hessian二阶矩阵:

J_{\text{old}}\lambda\varepsilon不随\Delta\theta变化,求\arg\max时可以直接删掉,式子简化为:

\Delta\theta^* \approx \mathop{\arg\max}_{\Delta\theta}\; \nabla_\theta J \cdot \Delta\theta -\frac12 \lambda \cdot \Delta\theta^\top \cdot \nabla^2 \mathcal{D}_{\text{KL}} \cdot \Delta\theta

\nabla^2 \mathcal{D}_{\text{KL}}替换为Fisher信息矩阵F。因为在当前策略点处,KL 散度的二阶 Hessian 矩阵 = Fisher 信息矩阵F(\theta)于是替换后得到最终简洁形式:

\Delta\theta^* \approx \mathop{\arg\max}_{\Delta\theta}\; \nabla J \cdot \Delta\theta -\frac12 \lambda \cdot \Delta\theta^\top F(\theta_{\text{old}}) \Delta\theta

Fisher 有期望形式计算公式,采样即可估算:

F(\theta) = \mathbb{E}_\theta\Big[\nabla_\theta \log\pi_\theta(x)\cdot \big(\nabla_\theta \log\pi_\theta(x)\big)^\top\Big]

求导数并令其等于0,解出来得到极值:\frac{\partial L}{\partial \Delta\theta} = \boldsymbol 0

补充矩阵求导公式:\dfrac{\partial (\boldsymbol a^\top \boldsymbol x)}{\partial \boldsymbol x}=\boldsymbol a,\quad \dfrac{\partial (\boldsymbol x^\top M \boldsymbol x)}{\partial \boldsymbol x}=2M\boldsymbol x

单独看第二项导数:\displaystyle \frac{\partial}{\partial\Delta\theta}\left(-\frac12\lambda \Delta\theta^\top F\Delta\theta\right) = -\frac12\lambda \cdot 2F\Delta\theta = -\lambda F\Delta\theta

所以整体求导式子为:

0 = \frac{\partial}{\partial \Delta\theta}\left( \nabla_\theta J(\theta)\Delta\theta - \frac{1}{2}\lambda \Delta\theta^\top F(\theta)\Delta\theta \right) \\ = \nabla_\theta J(\theta) -\lambda F(\theta)\Delta\theta

移项整理:\lambda F(\theta)\Delta\theta = \nabla_\theta J(\theta)

\Delta\theta = \frac{1}{\lambda}F(\theta)^{-1}\nabla_\theta J(\theta)

注:这里原博主的极值求解答案应该写错了,没有那个-1/2

该问题属于不等式约束优化问题,拉格朗日函数求导、令梯度 = 0,是满足了KKT 平稳性条件,是最优解的必要条件。还需要满足互补松弛条件,也就是\lambda\cdot \big(\mathcal{D}_{\text{KL}}-\varepsilon\big)=0。如果\lambda>0,就必须\mathcal{D}_{\text{KL}}=\varepsilon,最优解卡在约束边界,取等。

根据上文可知,KL被泰勒展开二阶近似了,并且其值有一个约束:

\mathcal{D}_\text{KL}(\pi_\text{old}\parallel\pi_\text{new}) \approx \frac12 \Delta\theta^\top F\Delta\theta = \varepsilon

将刚刚求得的\Delta\theta代进去(\tilde\nabla J = F^{-1}\nabla J\Delta\theta = \frac{1}{\lambda}\tilde\nabla J,这里是简化了一下写法)

代入 KL 等式:

\frac12 \cdot \left(\frac{\tilde\nabla J}{\lambda}\right)^\top F \left(\frac{\tilde\nabla J}{\lambda}\right) =\varepsilon

展开:

\frac{1}{2\lambda^2}\cdot \tilde\nabla J^\top F\tilde\nabla J =\varepsilon

\tilde\nabla J=F^{-1}\nabla J 代回:

\tilde\nabla J^\top F\tilde\nabla J =\big(F^{-1}\nabla J\big)^\top F \big(F^{-1}\nabla J\big) =\nabla J^\top F^{-1}\nabla J

于是:\frac{\nabla J^\top F^{-1}\nabla J}{2\lambda^2}=\varepsilon

解出\lambda

\lambda^2 = \frac{\nabla J^\top F^{-1}\nabla J}{2\varepsilon},\quad \lambda = \sqrt{\frac{\nabla J^\top F^{-1}\nabla J}{2\varepsilon}}


这里进行传统策略和自然策略更新式子的对比:

传统策略梯度更新格式:

\Delta\theta = \alpha \cdot \nabla J(\theta)

\alpha:学习率;\nabla J:普通梯度,这是深度学习/强化学习最通用的参数更新形式。

上文得到的自然梯度形式的更新:

\Delta\theta = \frac{1}{\lambda} \cdot \boldsymbol{F^{-1}\nabla J}

定义了自然策略梯度\tilde\nabla J(\theta) = F(\theta)^{-1}\nabla J(\theta)

再令\boldsymbol{\alpha=\dfrac{1}{\lambda}},就写成统一格式:\boldsymbol{\Delta\theta = \alpha \cdot \tilde\nabla J}

\alpha =\frac{1}{\lambda} =\boldsymbol{\sqrt{\frac{2\varepsilon}{\nabla J(\theta)^\top F(\theta)^{-1}\nabla J(\theta)}}}


最终的权重更新方案为:

\Delta\theta = \sqrt{\frac{2\varepsilon}{\nabla J(\theta)^\top F(\theta)^{-1}\nabla J(\theta)}}\;\tilde\nabla J(\theta)

该方案的强大之处在于,无论分布的表示如何,它总是以相同的幅度改变策略。

信赖域策略优化算法(TRPO)的理解:

如何理解自然策略梯度算法的缺陷?

①推导时我们只用二阶泰勒展开近似 KL 散度,这个近似只在\Delta\theta极小的局部才精准。因此,如果更新步长偏大,近似公式算出来的 KL 值 ≠ 真实 KL,算法按照 “近似 KL=ε” 算出步长去更新参数,更新完成后真实 KL 散度很容易超过预设上限 ε,还是不能解决过冲这个问题;

②求逆F^{-1}计算复杂度极高,Fisher矩阵F尺寸是N\times N,方阵求逆的时间复杂度是立方级O(N^3)

③整个推导链条层层近似:KL 泰勒近似、期望用样本均值近似、共轭梯度近似求逆,累积误差很大。【因此可以计算两种策略之间预期回报的差异

两种策略之间预期回报的差异可以表示为下面这个式子:

J(\pi_{\theta+\Delta\theta}) = J(\pi_\theta) + \mathbb{E}_{\tau\sim \pi_{\theta+\Delta\theta}} \sum_{t=0}^{\infty}\gamma^t A^{\pi_\theta}(s_t,a_t)

  1. J(\pi_\theta):旧策略\pi_\theta的总期望回报
  2. J(\pi_{\theta+\Delta\theta}):更新后新策略\pi_{\theta+\Delta\theta}的总期望回报
  3. 第二项 = 新策略相对旧策略的收益增量
  • 如果第二项 > 0就说明更新有效、策略变好
  • 如果第二项 < 0就说明更新变差,需要拒绝本次更新

再来看看第二项(优势函数)的理解:

A^{\pi_\theta}(s,a) = \mathbb{E}\big(Q^{\pi_\theta}(s,a)-V^{\pi_\theta}(s)\big)

  1. V^{\pi_\theta}(s):状态 s 在旧策略下的平均长期回报(该状态 “baseline 基础收益”)
  2. Q^{\pi_\theta}(s,a):在状态 s 选动作 a,后续长期总回报
  3. 优势函数 A = 动作 a 超出该状态平均水平的超额收益
    • A>0:这个动作比当前状态平均选择更好,值得多提高选择概率
    • A<0:这个动作不如平均水平,应该压低选择概率

该表达式在原策略下计算优势函数,完全基于旧策略采样收集的轨迹数据计算;就算评估新策略J(\pi_{\theta+\Delta\theta})的收益变化,也不用重新和环境交互、采集新样本。大幅节省交互成本。


此处开始推导化简套路

针对无限时域强化学习任务,环境不存在终止状态,智能体可以一轮又一轮无限交互下去,轨迹长度没有天然上限。

单条轨迹:\tau=(s_0,a_0,r_0,s_1,a_1,r_1,\dots)

单条轨迹的原始总回报:G=r_0+r_1+r_2+r_3+\dots

如果每一步奖励r\ge0 ,无穷累加结果会趋向正无穷。两个策略回报都是无穷大,无法比较好坏、无法最大化J(\pi)。引入折扣因子0<\gamma<1之后,单条轨迹的折扣回报定义为:

G=\sum_{t=0}^{\infty}\boldsymbol{\gamma^t} r_t=r_0+\gamma r_1+\gamma^2 r_2+\gamma^3 r_3+\dots

这是等比无穷级数,必然收敛到有限值:

\sum_{t=0}^\infty\gamma^t=\frac{1}{1-\gamma}

总回报有上界,策略之间才能对比优劣,优化\max J(\pi)才有数学意义。

\boldsymbol{\gamma^t}随步数 t 增大不断变小,当下即时奖励权重最高,越遥远未来的奖励权重越低。

注:期望J(\pi)依然有上限。

策略期望回报:J(\pi)=\mathbb{E}_{\tau\sim\pi}\big[G(\tau)\big]=\sum_{\tau}P(\tau|\pi)\cdot G(\tau)

遍历所有可能轨迹,按轨迹出现概率加权

  1. 单条轨迹无穷求和,但因为\gamma\in(0,1)G(\tau)本身是有限收敛值;
  2. 所有轨迹的概率P(\tau|\pi)总和为 1,做概率加权平均之后,最终J(\pi)一定是一个有限数值,不会发散到无穷。

根据上文的策略期望回报继续推导:

J(\pi)=\mathbb{E}_{\tau\sim\pi}\big[G(\tau)\big] =\sum_{\tau} P(\tau\mid\pi)\cdot \sum_{t=0}^{\infty}\gamma^t r_t(\tau)

交换两个求和顺序(收敛级数可交换):

J(\pi)=\sum_{t=0}^{\infty}\gamma^t \cdot \sum_{\tau} P(\tau\mid\pi)\cdot r_t(\tau)

内层\sum_\tau P(\tau)r_t(\tau) 就是第 t 时刻即时奖励的期望

\sum_{\tau} P(\tau\mid\pi) r_t(\tau)=\mathbb{E}_{(s_t,a_t)\sim\pi}[r(s_t,a_t)]

于是:J(\pi)=\sum_{t=0}^{\infty}\gamma^t \cdot \mathbb{E}_{(s_t,a_t)\sim\pi}\big[r(s_t,a_t)\big]

这个可以理解为:对每一个时间步 t,先求该步所有(s_t,a_t)的即时奖励期望,再乘折扣\boldsymbol{\gamma^t},把无穷所有时刻全部累加,就是总期望回报。

将期望展开:

期望的定义是对所有状态、动作,用出现概率加权求和

J(\pi)=\sum_{t=0}^{\infty}\gamma^t \cdot \left[ \sum_{s\in\mathcal{S}}\sum_{a\in\mathcal{A}} P(s_t=s\mid \pi)\cdot \pi(a\mid s)\cdot r(s,a) \right]

  1. P(s_t=s\mid \pi):全程按策略\pi交互,第 t 步刚好落在状态 s 的概率;
  2. \pi(a\mid s):已经处于状态 s 时,策略选出动作 a 的条件概率;
  3. r(s,a):该状态动作对应的即时奖励。

级数收敛前提下,可以调换对 t 无穷求和和对s,a有限求和的先后顺序:

J(\pi)= \sum_{s\in\mathcal{S}}\sum_{a\in\mathcal{A}} \pi(a\mid s)\cdot r(s,a)\cdot \boldsymbol{\sum_{t=0}^{\infty}\gamma^t \,P(s_t=s\mid \pi)}

可以直观理解为原本是先按时间 t 循环,再遍历状态动作; 现在改成先固定一组 (s,a),把这个状态 s 在所有时刻 t 的加权概率先算完,最后整体累加所有(s,a)

引入定义——折扣状态分布 \boldsymbol{\rho_\pi(s)}

\rho_\pi(s) = \sum_{t=0}^{\infty}\gamma^t \cdot P(s_t=s\mid\pi)

含义就是,无限时域下,把每个时刻 t 落在状态 s 的概率,乘上\gamma^t之后全部累加,是状态长期加权访问密度。其中,P(s_t=s\mid \pi)表示遵循策略\pi交互,第 t 步恰好处于状态 s 的概率

代入J(\pi)

J(\pi) =\sum_{t=0}^\infty\gamma^t \sum_{s}\sum_{a} P(s_t=s)\cdot \pi(a\mid s)\cdot r(s,a)\\ =\sum_{s}\sum_{a} r(s,a)\cdot \pi(a\mid s)\cdot \underbrace{\sum_{t=0}^\infty \gamma^t P(s_t=s)}_{\rho_\pi(s)}

最终得到不含时间、只对状态 + 动作有限求和形式:

\boldsymbol{J(\pi)=\sum_{s\in\mathcal{S}} \rho_\pi(s)\sum_{a\in\mathcal{A}} \pi(a\mid s)\,r(s,a)}

所以以上证明了单策略的收益化简套路:


原来式子:J(\pi_{\theta+\Delta\theta}) = J(\pi_\theta) + \mathbb{E}_{\tau\sim \pi_{\theta+\Delta\theta}} \sum_{t=0}^{\infty}\gamma^t A^{\pi_\theta}(s_t,a_t)

现在式子:J(\pi_{\theta+\Delta\theta}) = J(\pi_\theta) +\sum_{s\in\mathcal{S}} \rho_{\pi_{\theta+\Delta\theta}}(s) \sum_{a\in\mathcal{A}} \pi_{\theta+\Delta\theta}(a\mid s)\,A^{\pi_\theta}(s,a)

  1. J(\pi_{\theta+\Delta\theta}):新策略总回报;J(\pi_\theta):旧策略总回报
  2. \rho_{\pi_{\theta+\Delta\theta}}(s)新策略对应的折扣状态分布
  3. \pi_{\theta+\Delta\theta}(a|s):新策略在状态 s 选动作 a 的概率
  4. A^{\pi_\theta}(s,a):基于旧策略算出的优势函数

注:由于增量是新策略跑出来的轨迹收益变化,轨迹采样服从新策略。所以使用的是\rho_{\pi_{\theta+\Delta\theta}}(s)

但是这里做近似处理\rho_{\pi_{\text{new}}}\approx\rho_{\pi_{\text{old}}}

理由一:想精确算出\rho_{\pi_{\text{new}}},必须拿更新后的新策略重新和环境交互、采集海量轨迹统计状态访问频率;每次迭代都重新采样,样本开销极大、训练很慢。

理由二:由硬性约束\mathcal{D}_{\text{KL}}\big(\pi_{\text{old}}\parallel\pi_{\text{new}}\big)\le\varepsilon可知,限制新旧策略不能相差过大;策略改动幅度很小,两者和环境交互产生的轨迹走向、状态访问规律高度接近,因此状态分布差异很小,近似误差可控。

于是替换得到近似式:

J(\pi_{\theta+\Delta\theta}) \approx J(\pi_\theta) +\sum_s \rho_{\pi_\theta}(s)\sum_a \pi_{\theta+\Delta\theta}(a|s)\,A^{\pi_\theta}(s,a)

对于该式子,\pi_{\theta+\Delta\theta}(a|s)时新策略的概率,没法用旧样本直接算,于是做变形:

\pi_{\theta+\Delta\theta}(a|s) =\frac{\pi_{\theta+\Delta\theta}(a|s)}{\pi_\theta(a|s)} \cdot \pi_\theta(a|s)

把它代入求和式:

\sum_s\rho_{\pi_\theta}(s)\sum_a \pi_{\theta+\Delta\theta}(a|s)A \\=\sum_s\rho_{\pi_\theta}(s)\sum_a \boldsymbol{\frac{\pi_{\theta+\Delta\theta}(a|s)}{\pi_\theta(a|s)}}\,\pi_\theta(a|s)\,A\\ =\mathbb{E}_{s\sim\rho_{\pi_\theta},\;a\sim\pi_\theta(\cdot|s)}\left[ \frac{\pi_{\theta+\Delta\theta}(a|s)}{\pi_\theta(a|s)} A^{\pi_\theta}(s,a) \right]

【离散形式数学期望的展开写法就是求和形式的,这里是把双重求和写回了期望形式,更加简洁】

把整体结构重新排版对齐:

重要性权重:w(a,s)=\frac{\pi_{\text{new}}(a|s)}{\pi_{\text{old}}(a|s)}

于是原式改写为:\boldsymbol{J(\pi_{\theta+\Delta\theta}) \approx J(\pi_\theta) +\mathbb{E}_{s\sim\rho_{\pi_\theta}} \left[ \frac{\pi_{\theta+\Delta\theta}(a \mid s)}{\pi_\theta(a \mid s)} A^{\pi_\theta}(s,a) \right]}

把新旧策略收益差值近似部分单独拎出来,定义替代优势\mathcal{L}_{\pi_\theta}

\mathcal{L}_{\pi_\theta}(\pi_{\theta+\Delta\theta}) =\mathbb{E}_{s\sim\rho_{\pi_\theta}} \left[\frac{\pi_{\theta+\Delta\theta}(a \mid s)}{\pi_\theta(a \mid s)} A^{\pi_\theta}(s,a)\right]\)\\ \(J(\pi_{\text{new}})-J(\pi_{\text{old}}) \approx \mathcal{L}_{\pi_\theta}(\pi_{\text{new}})

优化这个替代目标,间接逼近优化真实回报。


TRPO 论文推导出严格下界不等式来量化这个误差:

\boldsymbol{J(\pi_{\theta+\Delta\theta}) - J(\pi_\theta) \;\ge\; \mathcal{L}_{\pi_\theta}(\pi_{\theta+\Delta\theta}) \;-\; C\cdot \mathcal{D}_{KL}^{\max}(\pi_\theta\,\|\,\pi_{\theta+\Delta\theta})}

右边第二项指的是近似带来的最坏误差上限,策略改得越猛,近似偏差就越大,要从替代优势里扣除这个偏差。

  • \mathcal{D}_{KL}^{\max}所有状态下新旧策略 KL 散度的最大值,用来衡量新旧两个策略整体差距有多大;策略改动越大,这个值越大
  • C:论文严格推导出的固定常数

论文中提到的单调改进定理

在约束新旧策略 KL 散度不超限的前提下,只要我们优化不等式右侧这个下界表达式,每一轮迭代真实总回报一定单调不降,不会出现更新后策略退化、奖励下跌的情况。 是 TRPO 算法稳定性最核心的理论根基。

MM 算法(Minorize-Maximize,下界最大化/极小极大算法):

MM 思想是不去直接优化原目标,转而最大化原目标的下界

  • 只要下界变大,原目标(真实收益增量)必然跟着至少同步变大
  • 最大化这个下界,等价于稳步抬升真实收益的下限,实现单调改进

结合定理,TRPO 把优化问题写成带约束形式:

\max_{\Delta\theta}\quad \mathcal{L}_{\pi_\theta}(\pi_{\theta+\Delta\theta}) \quad \text{s.t.}\quad \mathcal{D}_{KL}^{\max}(\pi_\theta\|\pi_{\theta+\Delta\theta})\le\varepsilon

  1. 最大化替代优势,试图拉高收益;
  2. KL 约束卡死策略改动幅度,控制近似误差不会过大;
  3. 依靠单调改进定理,保证每一步更新一定不会变差。
近端策略优化算法(PPO)的理解:

TRPO算法的缺陷是什么?

共轭梯度法(CG, Conjugate Gradient)是求解线性方程组 Ax=b的迭代数值算法。

缺陷一:即使使用共轭梯度法迭代近似求解,但是运算量还是很高,Fisher相关运算天生对大参数量网络不友好。

缺陷二:依旧是使用的自然策略梯度,Fisher 信息矩阵,本质是 KL 散度的 Hessian,属于二阶优化,更新速度慢。而且还不能用Adam等主流一阶优化器。

缺陷三:TRPO 很复杂。TRPO很难解释、实现和调试。当训练没有产生预期的结果时,确定如何提高性能可能会很麻烦(共轭梯度迭代、Fisher向量乘积、KL约束估计、步长线性回溯裁剪,模块特别多,代码冗长;训练震荡、收益不涨时,很难定位是KL阈值设置问题、共轭梯度迭代次数问题、采样方差问题还是数值稳定性问题)

原作者 Schulman 提出 PPO(近端策略优化),做轻量化替代:

  1. PPO-Penalty:把 TRPO 硬性 KL 约束改成目标函数内KL惩罚项,变成无约束一阶优化,不用 Fisher 矩阵、不用共轭梯度,能直接用 Adam;
  2. PPO-Clip(最常用):更进一步,直接用比例裁剪Clip机制隐性限制新旧策略差距,彻底避开 KL 计算、二阶求解整套复杂逻辑。
PPO Penalty:

目标函数:\Delta\theta^* = \mathop{\arg\max}_{\Delta\theta}\; \mathcal{L}_{\theta+\Delta\theta}(\theta+\Delta\theta) - \boldsymbol{\beta}\cdot\mathcal{D}_{KL}\big(\pi_\theta \parallel \pi_{\theta+\Delta\theta}\big)

TRPO在理论分析上推导出与KL散度相乘的惩罚项,但在实践中,这种惩罚往往过于严格,只产生非常小的更新。因此,问题是如何可靠地确定缩放参数β ,同时避免过冲。

  • \boldsymbol{\beta}设置太大 惩罚力度极强,KL 稍微变大就会大幅扣分,策略不敢大幅度更新,每次参数改动极小、学习速度极慢,和 TRPO 保守更新的毛病一样。

  • \boldsymbol{\beta}设置太小 惩罚太弱,约束形同虚设,新旧策略差距失控,出现overshooting(步长过冲):策略一次性改动过猛,打破单调改进前提,回报震荡、甚至越训越差。

  • 更深一层麻烦 不存在一个万能\boldsymbol{\beta}适配所有任务;哪怕同一个任务,训练中后期策略分布、状态特征会持续变化,前期合适的\boldsymbol{\beta}后期不再适用,手动全程调参工作量极大。

设定一个目标 KL 散度\boldsymbol{\delta},希望每轮更新后的 KL 散度尽量贴近\boldsymbol{\delta},不大不小;每一轮参数更新完,实时计算本轮真实 KL,按规则自动调整\boldsymbol{\beta}

  1. 如果本轮\mathcal{D}_{KL} > 1.5\delta(改动太大,超上限) 下一轮\boldsymbol{\beta \leftarrow 2\beta},惩罚翻倍,收紧约束,遏制策略剧烈改动;
  2. 如果本轮\mathcal{D}_{KL} \ll \delta(改动太小,更新不足) 下一轮\boldsymbol{\beta \leftarrow \beta/2},惩罚减半,放宽约束,允许策略更大幅度优化。

TRPO中只单向缩小步长,发现 KL 超标就不断缩回\Delta\theta,只能往保守方向修正;PPO是双向调节,改太大就收紧惩罚、改太小就放松惩罚,灵活自适应调整。

阈值1.5 倍目标\Delta\theta不是严格数学推导出来的,是工程启发式经验规则。运行过程中,允许短暂违反 KL 约束,依靠下一轮\boldsymbol{\beta}快速修正兜底,无法像 TRPO 一样每一步严格满足 KL 约束、严格数学单调改进。代价是丢掉了 TRPO 完美的理论单调性保证。但是对超参数鲁棒性很强,\boldsymbol{\beta}自适应后很好调参;摆脱二阶约束优化框架,用普通 Adam 一阶优化器即可训练。

PPO Clip:

PPO-Clip 思路是彻底抛弃 KL 散度、抛弃惩罚项、不用调\boldsymbol{\beta},直接对新旧策略比值做硬性区间截断,简单粗暴限制策略改动幅度。

PPO-Clip 目标函数:

\mathcal{L}_{\pi_{\theta_k}}^{\text{CLIP}}(\pi_\theta) =\mathbb{E}_{\tau\sim\pi_{\theta_k}} \left[ \sum_{t=0}^T \min\Big( \rho_t \cdot A_t,\quad \operatorname{clip}(\rho_t,1-\epsilon,1+\epsilon)\cdot A_t \Big) \right]

里面是两条候选项取最小值

  1. 第一项:原始未裁剪替代目标\boldsymbol{\rho_t \cdot A_t}
  2. 第二项:比例被裁剪之后的目标\boldsymbol{\operatorname{clip}(\rho_t)\cdot A_t}

\rho_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_k}(a_t|s_t)}

  • \pi_{\theta_k}旧策略
  • \pi_\theta正在优化更新的新策略
  • \rho含义是同一个(s,a),新策略概率 ÷ 旧策略概率
    • \rho>1:新策略更倾向选这个动作
    • \rho<1:新策略在压低这个动作的概率

截断函数\operatorname{clip}(\rho,\ 1-\epsilon,\ 1+\epsilon)强行限制新旧策略概率比值不能太离谱,防止单次更新策略跳变过大。

和PPO Penalty一样,可以使用像ADAM等优化器来执行更新。


本文旨在于一步一步理解传统策略梯度算法、自然策略梯度算法、信赖域策略优化算法(TRPO)、PPO算法。对于PPO算法的具体描述较为简略,重点放在了前面三种算法的推导上面。对于文章https://zhuanlan.zhihu.com/p/614115887简写的部分,做了详细的推导补充,尽可能没有推导思路上的断裂。并对其中可能出现的问题做了纠正。谨以此供继续学习交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值