RL——TRPO


TRPO

TRPO 目标

  • 目标定义:
    $$
    \begin{aligned}
    \max_{\theta_\text{new}} \quad &\mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}, a \sim \pi_{\theta_\text{old}}}\left[\frac{\pi_{\theta_\text{new}}(a|s)}{\pi_{\theta_\text{old}}(a|s)} A_{\pi_{\theta_\text{old}}}(s,a)\right] \\
    &\text{s.t. } \quad \quad \mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}} \left[D_{\text{KL}}(\pi_{\theta_\text{old}}, \pi_{\theta_\text{new}})\right] \le \delta
    \end{aligned}
    $$
  • TRPO 的目标详细推导见RL——TRPO-PPO-目标函数基础推导

TRPO 推导

  • TRPO 的目标仍然很难直接求解,所以TRPO考虑对目标做进一步的近似(近似形式的具体证明见附录)
    $$
    \begin{aligned}
    \mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}, a \sim \pi_{\theta_\text{old}}}\left[\frac{\pi_{\theta}(a|s)}{\pi_{\theta_\text{old}}(a|s)} A_{\pi_{\theta_\text{old}}}(s,a)\right] &\approx g^T(\theta-\theta_{old}) \\
    \mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}} \left[D_{\text{KL}}(\pi_{\theta_\text{old}}, \pi_{\theta})\right] &\approx \frac{1}{2}(\theta-\theta_{old})^TH(\theta-\theta_{old})
    \end{aligned}
    $$
    • \(g\) 为一阶梯度:
      $$ g = \nabla_{\theta}\mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}, a \sim \pi_{\theta_\text{old}}}\left[\frac{\pi_{\theta}(a|s)}{\pi_{\theta_\text{old}}(a|s)} A_{\pi_{\theta_\text{old}}}(s,a)\right] \vert_{\theta = \theta_{\text{old}}}$$
    • \(H\) 为原始KL散度在 \(\theta = \theta_{\text{old}} \) 处的海森矩阵(Hessian Matrix,又译作黑塞矩阵),(PS:KL散度的海森矩阵就是Fisher矩阵,一般是正定的):
      $$ H = H[\mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}} \left[D_{\text{KL}}(\pi_{\theta_\text{old}}, \pi_{\theta})\right]] $$
      • 其中
        $$ H[f(x,y)] = \begin{bmatrix}
        \frac{\partial^2f}{\partial x^2} & \frac{\partial^2f}{\partial x\partial y} \\
        \frac{\partial^2f}{\partial x \partial y} & \frac{\partial^2f}{\partial y^2}
        \end{bmatrix}
        $$
      • 在当前场景中 \(H_{ij}\) 为
        $$ H_{ij} = \frac{\partial}{\partial \theta_i}\frac{\partial}{\partial \theta_j} \mathbb{E}_{s \sim \rho_{\pi_{\theta_{\text{old}}}}} \left[D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_{\theta})\right] \vert_{\theta = \theta_{\text{old}}} $$
  • 于是得到进一步优化的目标
    $$
    \begin{aligned}
    \theta_{k+1} = \mathop{\arg\max}_\theta &g^T(\theta-\theta_k)\\
    \text{s.t. } \quad \frac{1}{2}(\theta-\theta_k)^T&H(\theta-\theta_k)≤\delta
    \end{aligned}
    $$
  • 可根据拉格朗日乘子法求解以上问题得到如下解(详细推导见附录):
    $$ \theta_{k+1}=\theta_k+\sqrt{\frac{2\delta}{g^TH^{-1}g}}H^{-1}g $$
  • 现实场景中,计算和存储Hessian矩阵的逆矩阵 \(H^{-1}\) 会耗费大量时间,所以TRPO通过共轭梯度法来避免直接求解 \(H^{-1}\),核心思想就是直接计算 \(x = H^{-1}g\) 作为参数的更新方向
  • 设定 \(x = H^{-1}g\),则原始参数更新公式可变为:
    $$ \theta_{k+1}=\theta_k+\sqrt{\frac{2\delta}{x^{T}Hx}}x $$
  • 求解 \(x = H^{-1}g\) 则可转换为求方程 \(Hx = g\) 的解,方程 \(Hx = g\) 的解可通过共轭梯度法(Conjugate Gradient Method,)来求解,方法参见ML——共轭梯度法和最速下降法
    • 其中,共轭梯度法伪代码如下

TRPO更新步长

  • 当前TRPO求解方案采用了泰勒展开的1阶近似和2阶近似,不是精准求解,新参数不一定能满足KL散度约束限制,所以在更新时,我们可以再进行一次步长搜索,使得更新后的新参数满足KL散度限制,且能够提升目标函数
  • 线性搜索的具体规则,在 \((0,1)\) 区间内抽取K个点 \(\{\alpha^i\}_{i=1}^K\)

TRPO训练伪代码

  • TRPO伪代码:

附录:约束问题的泰勒展开近似推导证明

  • 近似结果
    $$
    \begin{aligned}
    \mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}, a \sim \pi_{\theta_\text{old}}}\left[\frac{\pi_{\theta}(a|s)}{\pi_{\theta_\text{old}}(a|s)} A_{\pi_{\theta_\text{old}}}(s,a)\right] &\approx g^T(\theta-\theta_{old}) \\
    \mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}} \left[D_{\text{KL}}(\pi_{\theta_\text{old}}, \pi_{\theta})\right] &\approx \frac{1}{2}(\theta-\theta_{old})^TH(\theta-\theta_{old})
    \end{aligned}
    $$
  • \(g\) 为一阶梯度:
    $$ g = \nabla_{\theta}\mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}, a \sim \pi_{\theta_\text{old}}}\left[\frac{\pi_{\theta}(a|s)}{\pi_{\theta_\text{old}}(a|s)} A_{\pi_{\theta_\text{old}}}(s,a)\right] \vert_{\theta = \theta_{\text{old}}}$$
  • \(H\) 为原始KL散度在 \(\theta = \theta_{\text{old}} \) 处的海森矩阵:
    $$
    H_{ij} = \frac{\partial}{\partial \theta_i}\frac{\partial}{\partial \theta_j} \mathbb{E}_{s \sim \rho_{\pi_{\theta_{\text{old}}}}} \left[D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_{\theta})\right] \vert_{\theta = \theta_{\text{old}}}
    $$

泰勒展开回顾

  • 泰勒展开是一种在数学分析中用于近似函数的方法,特别是当直接计算函数值较为困难时,基本思想是将一个函数在一个点附近用一个多项式来近似表示
  • 对于一个在点 \(a\) 处具有 \(n+1\) 阶导数的函数 \(f(x)\),其在 \(a\) 点的泰勒展开可以表示为:
    $$ f(x) = f(a) + \frac{f’(a)}{1!}(x-a) + \frac{f’’(a)}{2!}(x-a)^2 + \cdots + \frac{f^{(n)}(a)}{n!}(x-a)^n + R_n(x) $$
    • 其中, \(R_n(x)\) 是余项,表示的是泰勒多项式与实际函数之间的误差,常表示为:
      $$ R_n(x) = o((x-a)^n) $$
      • 这里的 \(o\) 表示当 \(x\) 趋向于 \(a\) 时, \(R_n(x)\) 相对于 \((x-a)^n\) 是高阶无穷小

泰勒展开在很多领域都有广泛的应用,例如物理学中的近似计算、工程学中的信号处理等。通过选择合适的 (a) 值和 (n) 阶次,可以得到不同精度的近似结果。特别地,当 (a=0) 时,这种特殊的泰勒展开被称为麦克劳林展开

目标的泰勒一阶近似推导

  • 令 \(f(\theta)\) 为最优化目标,则:
    $$ f(\theta) = \mathbb{E}_{s \sim \rho_{\pi_{\theta_\text{old}}}, a \sim \pi_{\theta_\text{old}}}\left[\frac{\pi_{\theta}(a|s)}{\pi_{\theta_\text{old}}(a|s)} A_{\pi_{\theta_\text{old}}}(s,a)\right] $$
  • 此时对 \(f(\theta)\) 在 \(\theta = \theta_{\text{old}}\) 做泰勒展开有
    $$ f(\theta) = f(\theta_{\text{old}}) + \nabla_\theta f(\theta)\vert_{\theta=\theta_{\text{old}}}(\theta - \theta_{\text{old}}) + o(\theta^2)$$
  • 由于 \(f(\theta_{\text{old}})\) 与 \(\theta\) 无关,所以最大化 \(f(\theta)\) 等价于最大化 \(\nabla_\theta f(\theta)\vert_{\theta=\theta_{\text{old}}}(\theta - \theta_{\text{old}}) = g^T(\theta-\theta_{old})\)

约束的泰勒二阶近似推导

  • 将KL散度在 \(\theta = \theta_{\text{old}}\) 处二阶展开有
    $$
    \begin{align}
    f(\theta) &= D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_\theta) \\
    &= D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_{\theta_{\text{old}}}) + \nabla_\theta D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_\theta) \vert_{\theta=\theta_{\text{old}}} (\theta - \theta_{\text{old}}) + \frac{1}{2}(\theta - \theta_{\text{old}})^TH(\theta - \theta_{\text{old}}) + o(\theta^3)
    \end{align}
    $$
    • 显然,第一项 \( D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_{\theta_{\text{old}}})=0 \)
    • 可以证明,第二项为0,证明如下:
      $$
      \begin{align}
      \nabla_\theta D_{\text{KL}}(\pi_{\theta_{\text{old}}}, \pi_\theta) \vert_{\theta=\theta_{\text{old}}} &= \nabla_\theta \int_a \pi_{\theta_{\text{old}}}(a|s) \log \frac{\pi_{\theta_{\text{old}}}(a|s)}{\pi_{\theta(a|s)}} da\vert_{\theta = \theta_{\text{old}}} \\
      &= \nabla_\theta \int \pi_{\theta_{\text{old}}}(a|s) \Big(\log \pi_{\theta_{\text{old}}}(a|s) - \log\pi_{\theta}(a|s)\Big) da\vert_{\theta = \theta_{\text{old}}} \\
      &= - \int \pi_{\theta_{\text{old}}}(a|s) \nabla_\theta \log \pi_{\theta(a|s)} \vert_{\theta = \theta_{\text{old}}} da \quad \text{积分求导互换} \\
      &= - \int \pi_{\theta_{\text{old}}}(a|s) \frac{\nabla_\theta \pi_{\theta}(a|s)}{\pi_{\theta}(a|s)}\vert_{\theta = \theta_{\text{old}}} da \quad \text{对数概率技巧} \\
      &= - \int \pi_{\theta_{\text{old}}}(a|s) \frac{\nabla_\theta \pi_{\theta}(a|s)\vert_{\theta = \theta_{\text{old}}}}{\pi_{\theta_\text{old}}(a|s)} da \\
      &= - \nabla_\theta \int \pi_{\theta}(a|s) da\vert_{\theta = \theta_{\text{old}}} \quad \text{积分求导再次互换} \\
      &= - \nabla_\theta 1 \\
      &= 0
      \end{align}
      $$
    • 证毕

附录:最优化问题求解的详细推导证明

  • 给定最优化问题
    $$
    \begin{aligned}
    \theta_{k+1} = \mathop{\arg\max}_\theta &g^T(\theta-\theta_k)\\
    \text{s.t. } \quad \frac{1}{2}(\theta-\theta_k)^T&H(\theta-\theta_k)≤\delta
    \end{aligned}
    $$

  • 对于上述问题,Karush-Kuhn-Tucker (KKT) 条件可以表述为以下几点:

    • 原始可行性 :解必须满足原始约束
      $$
      \frac{1}{2}(\theta-\theta_k)^TH(\theta-\theta_k) \leq \delta.
      $$
    • 对偶可行性 :拉格朗日乘子(或对偶变量)必须非负
      $$
      \lambda \geq 0.
      $$
    • 互补松弛性 :拉格朗日乘子与对应的不等式约束之间的乘积必须为零
      $$
      \lambda \left( \frac{1}{2}(\theta-\theta_k)^TH(\theta-\theta_k) - \delta \right) = 0.
      $$
    • 拉格朗日函数的梯度为零 :考虑拉格朗日函数 \(L(\theta, \lambda) = - g^T(\theta-\theta_k) + \lambda \left( \frac{1}{2}(\theta-\theta_k)^TH(\theta-\theta_k) - \delta \right)\),其对 \(\theta\) 的偏导数应等于零
      $$
      \nabla_\theta L = - g + \lambda H (\theta - \theta_k) = 0.
      $$
      • 注意:这里是因为目标是max,需要改成min后才能用 \(+\lambda (\cdot)\) 的操作
  • 这里, \(H\) 是一个对称矩阵(Hessian矩阵是对称的,因为 \(\frac{\partial^2 f}{\partial x \partial y} = \frac{\partial^2 f}{\partial y \partial x}\) ), \(\lambda\) 是与约束相关的拉格朗日乘子, \(\delta\) 是给定的常数

  • 根据KKT条件中的互补松弛性条件,当 \(\lambda > 0\) 时,这意味着约束 \(\frac{1}{2}(\theta-\theta_k)^TH(\theta-\theta_k) \leq \delta\) 是紧的,即:
    $$
    \frac{1}{2}(\theta-\theta_k)^TH(\theta-\theta_k) = \delta.
    $$

    • 注意,这里无法直接求解这个问题,因为这个解问题的解不是唯一的,比如一维情况就是二次方程,解就有正负两个值,实际上,这里的解是一个以 \(\theta_k\) 为球心的球体(椭球体)构成的集合(一共有 \(2^n\) 个解?其中n是变量的维度)
  • 因此,当 \(\lambda > 0\) 时, \(\theta\) 必须位于约束的边界上。为了确定 \(\theta\) 的具体值,我们需要同时考虑其他KKT条件,尤其是拉格朗日函数的梯度为零的条件:
    $$
    - g + \lambda H (\theta - \theta_k) = 0
    $$

  • 从这个方程中,我们可以解出 \(\theta\):
    $$
    \theta - \theta_k = \frac{1}{\lambda} H^{-1} g
    $$

  • 将 \(\theta\) 代入互补松弛条件中可得:
    $$
    \frac{1}{2} \left( \frac{1}{\lambda} H^{-1} g \right)^T H \left( \frac{1}{\lambda} H^{-1} g \right) = \delta
    $$

  • 简化后得到:
    $$
    \begin{align}
    \frac{1}{2} \left( \frac{1}{\lambda^2} g^T H^{-1} H H^{-1} g \right) &= \delta \\
    \frac{1}{2} \left( \frac{1}{\lambda^2} g^T H^{-1} g \right) &= \delta \\
    \frac{1}{2} \frac{g^T H^{-1} g}{\lambda^2} &= \delta \\
    \frac{g^T H^{-1} g}{2\delta} &= \lambda^2 \\
    \end{align}
    $$

  • 最终可求得:
    $$
    \lambda = \sqrt{\frac{g^T H^{-1} g}{2\delta}}.
    $$

  • 现在我们已经得到了 \(\lambda\) 的表达式,可以将其代回 \(\theta\) 的表达式中:
    $$
    \begin{align}
    \theta - \theta_k &= \frac{1}{\sqrt{\frac{g^T H^{-1} g}{2\delta}}} H^{-1} g = \sqrt{\frac{2\delta}{g^T H^{-1} g}} H^{-1} g
    \end{align}
    $$

  • 最终, \(\theta\) 的值为:
    $$
    \theta_{k+1} = \theta_k + \sqrt{\frac{2\delta}{g^T H^{-1} g}} H^{-1} g.
    $$