Skip to content

TRPO 和 PPO

复制本地路径 | 在线编辑

重要性采样回顾和问题

经过重要性采样,我们可以用旧的数据 \(\pi_{\theta'}\) 来训练新策略 \(\pi_\theta\),公式如下:

\[ J^{\theta^{\prime}}(\theta)=\mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right] \]
\[ \nabla J = \mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] \]

但是有一个注意点和关键点:\(p_{\theta}\left(a_{t} | s_{t}\right)\) 不能与 \(p_{\theta'}\left(a_{t} | s_{t}\right)\) 相差太多。否则重要性采样的结果就会不好(在上一章节中的公式推导中,如果差距过大那么方差会过大)。所以在训练的时候,应多加一个约束(constrain)。

这就是这一章要做的内容。

TRPO

信任区域策略优化(TRPO)认为约束应该是 \(\theta\)\(\theta'\) 输出的动作的 KL 散度(KL divergence),这一项用于衡量 \(\theta\)\(\theta'\) 的相似程度。

\[ \begin{aligned} J_{\mathrm{TRPO}}^{\theta^{\prime}}(\theta)=\mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right],\mathrm{KL}\left(\theta, \theta^{\prime}\right)<\delta \end{aligned} \]

其实就是加了一个 KL 散度限制,其中 \(\delta\) 是一个超参数,用于控制 \(\theta\)\(\theta'\) 的相似程度。

在实际的工程中,无论是目标函数还是KL散度约束条件,计算都很复杂,我们通常会采用一些近似手段,以下内容直接来自,个人感觉没必要细看,太细节了

PPO

从上面图片也能看出,即使有很多优化 TRPO 也确实不好算,所以有了 PPO 这个近端策略优化方法。PPO 直接把约束放到要优化的式子里面:

\[ \begin{aligned} &J_{\mathrm{PPO}}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta \mathrm{KL}\left(\theta, \theta^{\prime}\right) \\ &J^{\theta^{\prime}}(\theta)=\mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right] \end{aligned} \tag{5.6} \]

当然,这样做是有代价的,PPO牺牲了TRPO「策略单调提升」的保证。但是实操上更简单,也容易获得更好的效果。机器学习是一门实践的艺术——效果好,才是真的好。就是这么一个简单的改变,PPO 却成了一个相当有名和重要的方法,它是现在 OpenAI 默认的强化学习算法(不知道现在是不是,三年前的参考文章这样写的)。

Q: 为什么不直接计算 \(\theta\)\(\theta'\) 之间的距离?计算这个距离甚至不用计算 KL 散度,L1 与 L2 的范数(norm)也可以保证 \(\theta\)\(\theta'\) 很相似。

A:在做强化学习的时候,之所以我们考虑的不是参数上的距离,而是动作上的距离,是因为很有可能对于演员,参数的变化与动作的变化不一定是完全一致的。有时候参数稍微变了,它可能输出动作的就差很多。或者是参数变很多,但输出的动作可能没有什么改变。所以我们真正在意的是演员的动作上的差距,而不是它们参数上的差距。因此在做 PPO 的时候,所谓的 KL 散度并不是参数的距离,而是动作的距离。

PPO-Clip

如果我们觉得计算 KL 散度很复杂,那么还有一个 PPO2算法,PPO2 即近端策略优化裁剪。近端策略优化裁剪的目标函数里面没有 KL 散度,其要最大化的目标函数为

\[ \begin{aligned} J_{\mathrm{PPO2}}^{\theta^{k}}(\theta) \approx \sum_{\left(s_{t}, a_{t}\right)} \min &\left(\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{k}}\left(a_{t} | s_{t}\right)} A^{\theta^{k}}\left(s_{t}, a_{t}\right),\right.\\ &\left.\operatorname{clip}\left(\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{k}}\left(a_{t} | s_{t}\right)}, 1-\varepsilon, 1+\varepsilon\right) A^{\theta^{k}}\left(s_{t}, a_{t}\right)\right) \end{aligned} \]

看起来很复杂,其实拆解就好了:

  • min 这个不用多说,在第一项与第二项里面选择比较小的项。
  • clip 也不用多说,就是小于 \(1-\varepsilon\) 就输出 \(1-\varepsilon\),大于 \(1+\varepsilon\) 就输出 \(1+\varepsilon\),否则输出原值。
  • \(\varepsilon\) 是一个超参数,是我们要调整的,可以设置成 0.1 或 0.2 。

通过裁剪函数,最后能让 \(p_{\theta}(a_{t} | s_{t})\)\(p_{\theta^k}(a_{t} | s_{t})\) 更加比较接近:

PPO-Penalty

类似于上面的 Clip,但是不是暴力裁剪。这个就不纠结了,总之还是 PPO-Clip 是最广泛和标准的形式。

Comments