Jiahong 的个人博客

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

RL——贝尔曼方程的各种形式


贝尔曼方程(Bellman Equation)

  • 贝尔曼方程描述了当前状态的值函数与后续状态值函数之间的关系
  • 有状态值函数 \(V^\pi(s)\) 和动作值函数 \(Q^\pi(s,a)\)

状态值函数 \(V^\pi(s)\) 的贝尔曼方程

  • 标准形式(常见) :
    $$
    V^\pi(s) = \sum_{a} \pi(a|s) \sum_{s’, r} p(s’, r | s, a) \left[ r + \gamma V^\pi(s’) \right]
    $$
    • \(\pi(a|s)\):策略 \(\pi\) 下在状态 \(s\) 选择动作 \(a\) 的概率
    • \(\gamma\):折扣因子
    • \(p(s’, r | s, a)\):环境动态,表示在状态 \(s\) 执行动作 \(a\) 后转移到状态 \(s’\) 并获得奖励 \(r\) 的概率
    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上贝尔曼方程也常常写作(最常见):
      $$
      V^\pi(s) = \sum_{a} \pi(a|s) \left(r(s,a) + \gamma \sum_{s’} p(s’| s, a) V^\pi(s’) \right)
      $$
  • 期望形式(少见) :
    $$
    \begin{align}
    V^\pi(s) &= \mathbb{E}_\pi \left[ R_t + \gamma V^\pi(S_{t+1}) \mid S_t = s \right] \\
    \end{align}
    $$
    • \(\mathbb{E}_\pi\):基于策略 \(\pi\) 和环境动态的期望
    • \(\mathbb{E}[\cdot \mid S_t = s]\) 表示条件概率
  • 矩阵形式(极少遇到)(适用于有限状态空间):
    $$
    \mathbf{v}_\pi = \mathbf{r}_\pi + \gamma \mathbf{P}_\pi \mathbf{v}_\pi
    $$
    • \(\mathbf{v}_\pi\):状态值函数的向量
    • \(\mathbf{r}_\pi\):即时奖励的向量
    • \(\mathbf{P}_\pi\):状态转移矩阵

动作值函数 \(Q^\pi(s,a)\) 的贝尔曼方程

  • 标准形式 :
    $$
    Q^\pi(s,a) = \sum_{s’, r} p(s’, r | s, a) \left[ r + \gamma \sum_{a’} \pi(a’|s’) Q^\pi(s’, a’) \right]
    $$
    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上贝尔曼方程也常常写作(最常见):
      $$
      Q^\pi(s,a) = r(s,a) + \gamma \sum_{s’} p(s’| s, a) \sum_{a’} \pi(a’|s’) Q^\pi(s’, a’) \\
      $$
  • 期望形式 :
    $$
    Q^\pi(s,a) = \mathbb{E}_\pi \left[ R_t + \gamma Q^\pi(S_{t+1}, A_{t+1}) \mid S_t = s, A_t = a \right]
    $$
    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上贝尔曼方程也常常写作(最常见):
      $$
      \begin{align}
      Q^\pi(s,a) &= r(s,a) + \gamma \mathbb{E}_{s^\prime \sim P(\cdot|s,a)}\mathbb{E}_{a^\prime \sim \pi(\cdot|s^\prime)}[Q^\pi(s^\prime,a^\prime)] \\
      Q^\pi(s,a) &= r(s,a) + \gamma \mathbb{E}_{s^\prime \sim P(\cdot|s,a)}[V^\pi(s^\prime)] \\
      \end{align}
      $$

最优贝尔曼方程(Bellman Optimality Equation)

  • 最优贝尔曼方程描述了最优值函数 \(V^*(s)\) 或 \(Q^*(s,a)\) 的递归关系
  • 相对期望贝尔曼方程,其核心是将策略的期望替换为对动作的最优选择(最大化)

最优状态值函数 \(V^*(s)\) 的方程

  • 标准形式 :
    $$
    V^*(s) = \max_a \sum_{s’, r} p(s’, r | s, a) \left[ r + \gamma V^*(s’) \right]
    $$

    • \(\max_a\):选择使后续值最大的动作
    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上贝尔曼方程也常常写作(最常见):
      $$
      V^*(s) = \max_a \{ r(s,a) + \gamma \sum_{s’} p(s’| s, a)V^*(s’)\}
      $$
  • 期望形式 :
    $$
    V^*(s) = \max_a \mathbb{E} \left[ R_t + \gamma V^*(S_{t+1}) \mid S_t = s, A_t = a \right]
    $$

  • 与动作值函数的关系 :
    $$
    V^*(s) = \max_a Q^*(s, a)
    $$

最优动作值函数 \(Q^*(s,a)\) 的方程

  • 标准形式 :
    $$
    Q^*(s,a) = \sum_{s’, r} p(s’, r | s, a) \left[ r + \gamma \max_{a’} Q^*(s’, a’) \right]
    $$

    • \(\max_{a’}\):在下一状态 \(s’\) 选择最优动作
    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上贝尔曼方程也常常写作(最常见):
      $$
      Q^*(s,a) = r(s,a) + \gamma \sum_{s’} p(s’| s, a) \max_{a’} Q^*(s’, a’)
      $$
  • 期望形式 :
    $$
    Q^*(s,a) = \mathbb{E} \left[ R_t + \gamma \max_{a’} Q^*(S_{t+1}, a’) \mid S_t = s, A_t = a \right]
    $$

    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上贝尔曼方程也常常写作(最常见):
      $$
      \begin{align}
      Q^*(s,a) &= r(s,a) + \gamma \mathbb{E}_{s^\prime \sim P(\cdot|s,a)}[\max_{a^\prime\in \mathcal{A}}Q^*(s^\prime,a^\prime)] \\
      Q^*(s,a) &= r(s,a) + \gamma \mathbb{E}_{s^\prime \sim P(\cdot|s,a)}[V^*(s^\prime)] \\
      \end{align}
      $$
  • 与状态值函数的关系 :
    $$
    Q^*(s,a) = \sum_{s’, r} p(s’, r | s, a) \left[ r + \gamma V^*(s’) \right]
    $$

    • 假设状态 \(s\) 执行动作 \(a\) 对应的奖励 \(r=r(s,a)\) 是确定值,此时以上式子可写作:
      $$
      Q^*(s,a) = r(s,a) + \gamma \sum_{s’} p(s’| s, a) V^*(s’)
      $$

一些变体

  • 确定性策略 :
    • 若策略是确定性的(如 \(\pi(s) = a\)),贝尔曼方程中的 \(\pi(a|s)\) 退化为指示函数
  • 无折扣形式(\(\gamma = 1\)) :
    • 适用于分幕任务(episodic tasks),但需确保收敛性
  • 确定性奖励 :
    • 见前文描述,对应奖励 \(r=r(s,a)\) 是确定值

RL——CMDP拉格朗日乘子更新思考

注:这是一个简单的思考随记,不严谨,以后有时间还需完善


整体背景说明

  • 对下面约束优化问题:
    $$
    \begin{align}
    \max_{a_t}\sum_{i=1}^M \sum_{a_t=1}^{N_t} x_{i,a_t} {Value}_{i,a_t} \\
    s.t. \sum_{i=1}^M \sum_{a_t=1}^{N_t} x_{i,a_t} {Cost}_{i,a_t} \leq C_t \\
    \sum_{a_t=1}^{N_t}x_{i,a_t} \leq 1, \ \ \forall i \\
    x_{i,a_t} \in {0, 1}, \ \ \forall i,a_t
    \end{align}
    $$
  • 可以求得其最优动作为(真实场景不一定是下面的形式,可以是任意形式的最优解,不影响 \(\lambda\) 的更新):
    $$x^* = \mathop{\arg\max}_x f(x) - \lambda x$$
    • 注:为了简化,这里将价值改为与算力有关的函数,其中 \(f(\cdot)\) 是非减函数(单调不减函数),对应原始式子中的价值 \(Value\)
    • 这里的 \(x\) 是一个示意,可看做是算力
  • 证明:仅需满足 \(f(\cdot)\) 是非减函数(即价值随算力是单调不减的,不需要满足 RL-MPCA 论文中所说的价值边际收益递减假设),则拉格朗日乘子 \(\lambda\) 的更新公式就可以定义为:
    $$\lambda^{k+1} = \lambda^{k} + \eta(\hat{C} - C)$$
  • 为简化,本文不再赘述论文内容描述,更多相关概念和原始问题定义需要结合论文查看

关于 adaptive-\(\lambda\) 更新方式的另一种证明

  • 说明:自适应 \(\lambda\), 即 adaptive-\(\lambda\),是 RL-MPCA 论文提出的方法,和 RCPO 方法的更新方式本质相同,证明形式不完全一致
  • 论文证明目标 :当 \(f(\cdot)\) 是非减函数时,可使用 \(\lambda^{k+1} = \lambda^{k} + \eta(\hat{C} - C)\) 来更新 \(\lambda\)
  • 最优动作解读:\(x^* = \mathop{\arg\max}_x f(x) - \lambda x\)(其中 \(x\) 是算力, \(f(x)\) 是价值)的场景
  • 仅需证明 :当 \(\lambda\) 提升时,最优解对应的价值和成本都会降低即可
  • 形式化证明目标 :\(\forall \ \lambda_2 \gt \lambda_1\),有 \(x^*(\lambda_2) \le x^*(\lambda_1)\) 且 \(f(x^*(\lambda_2)) \le f(x^*(\lambda_1))\)(其中 \(x^*(\lambda_0)\) 和 \(f(x^*(\lambda_0))\) 分别表示 \(\lambda = \lambda_0\) 时的最优算力 \(x^*\) 和价值 \(f(x^*)\))
    • 证明步骤1 :\(\lambda_2 \gt \lambda_1\) 时, \(x^*(\lambda_2) \le x^*(\lambda_1)\) 成立
      • 设 \(x^*(\lambda_1) = x_1\),则,按照最优性,有任取 \(x_2 \ge x_1\),都满足 \(f(x_1) - \lambda_1 x_1 \ge f(x_2) - \lambda_1 x_2\) 成立
      • 在 \(x_2 \ge x_1\) 下,继续取 \(\lambda_2 \gt \lambda_1\) 时,有 \(f(x_1) - \lambda_2 x_1 \ge f(x_2) - \lambda_2 x_2\) 也成立,证明如下:
        • 由 \(x_2 \ge x_1\) 且 \(\lambda_2 \gt \lambda_1\) 可得 \(- (\lambda_2 - \lambda_1)x_1 \ge - (\lambda_2 - \lambda_1) x_2\),所以所有 \(f(x_1) - (\lambda_2 - \lambda_1) x_1 - \lambda_1 x_1 \ge f(x_2) - (\lambda_2 - \lambda_1) x_2 - \lambda_1 x_2\)
      • \(f(x_1) - \lambda_2 x_1 \ge f(x_2) - \lambda_2 x_2\) 等价于说: \(\lambda_2\) 对应的最优算力不可能比 \(x_1\) 更大 ,于是推出:
        • \(\forall \ \lambda_2 \gt \lambda_1\), \(\lambda_2\) 下的最优解 \(x^*(\lambda_2)\) 不可能大于 \(x^*(\lambda_1)\)
    • 证明步骤2 :由于 \(\lambda_2 \gt \lambda_1\) 时, \(x^*(\lambda_2) \le x^*(\lambda_1)\) 成立,所以,当 \(\lambda\) 减少时(从 \(\lambda_2\) 变成 \(\lambda_1\) )时,有:
      • \(x^*(\lambda_1) \ge x^*(\lambda_2)\),即成本 \(x\) 增加了
      • 此时除非收益也增加,即 \(f(x^*(\lambda_1)) \gt f(x^*(\lambda_2))\),否则最优点不会动(不动时有 \(f(x^*(\lambda_2)) = f(x^*(\lambda_1))\) ),也就是说, \(f(x^*(\lambda_2)) \le f(x^*(\lambda_1))\) 一定成立
  • 根据证明有如下推论:
    • 由于最优算力 \(x^*(\lambda)\) 和和最优收益 \(f(x^*(\lambda))\) 和 \(\lambda\) 均呈现负相关关系(不是严格单调)
      • 当 \(\hat{C} > C\) 时,约束被违反了,需要增大 \(\lambda\) 以增强算力约束,减少算力消耗
      • 当 \(\hat{C} < C\) 时,约束指标还有一定提升空间,需要缩小 \(\lambda\) 以提升收益,直到 \(\lambda=0\) 为止,此时无法继续缩小 \(\lambda\),最优解对应的算力可能仍然是 \(\hat{C} < C\) 的( \(\lambda=0\) 时,原始约束是松约束,相当于没有这个约束)
  • 故而可得 :仅需满足 \(f(\cdot)\) 是非减函数(即价值随算力是单调不减的,不需要满足 RL-MPCA 论文中所说的价值边际收益递减假设)即可使用 \(\lambda^{k+1} = \lambda^{k} + \eta(\hat{C} - C)\) 来更新 \(\lambda\) 以获取最优解
    • 当 算力未用完时 ,减少 \(\lambda\) ,可保证 最优收益增加(单调不减) ,是更优的;
    • 当 算力用超时 ,增加 \(\lambda\) ,可保证 最优点对应的成本降低 ,逐渐降低到满足成本约束,收益会降低,但这是满足算力约束而必要的
    • 注:算力约束是松约束时,\(\lambda = 0\),需要添加 clip 操作防止降低到负数

RL-MPCA 中的一些讨论

  • 论文中对智能算力场景给定两个假设(价值随算力单调递增;边际收益递减)是参考了 DCAF 论文的假设,简化了证明过程。在这两个条件满足时,可以证明最优解一定且仅在 \(\hat{C} = C\) 处,此时可以使用二分查找求解 \(\lambda\) 或Batch Loss来找到最优模型参数(只有这种情况下可以使用这两种方法)
  • 实际上,论文中可以不给定假设,也可以推导得到 \(\lambda^{k+1} = \lambda^{k} + \eta(\hat{C} - C)\) 这样的更新公式,这样定义是方便在 4.1.2 𝜆 Correction in Offline Model Evaluation 中证明可以使用二分查找,有这个假设的情况下,正好使得 \(\lambda^{k+1} = \lambda^{k} + \eta(\hat{C} - C)\) 更容易推导了(论文中使用的是容易推导的形式)
    • 待讨论问题:按照上文的证明,证明二分查找似乎也不需要边际收益递减的假设了吧?

RL——值分布强化学习

本文主要介绍值分布强化学习(Distributional RL)的相关内容

  • 相关论文(这个系列一共三篇主要文章,均来自Google DeepMind,作者是同一拨人):
    • A Distributional Perspective on Reinforcement Learning (C51,2017年6月):C51论文
    • Distributional Reinforcement Learning with Quantile Regression (QR-DQN,2017年10月):QR-DQN论文
    • Implicit Quantile Networks for Distributional Reinforcement Learning (IQN,2018年1月):IQN论文
    • 吐槽:三篇文章用的数据符号比较乱,跟常规强化学习不一样,有些伪代码甚至看不出哪些变量是模型输出的
  • 其他参考链接:
    • 强化学习新思潮1:值分布强化学习(02):C51的详细说明
    • 【方法总结】值分布强化学习(Distributional RL)
    • 【DRL-7】Distributional DQN: Quantile Regression-DQN:QR-DQN论文阅读笔记
    • 值分布强化学习 Distributional Reinforcement Learning

值分布强化学习介绍

  • 值分布强化学习(Distributional RL)算法是指不仅仅估计Q值的均值,还对Q值的分布进行估计的算法
  • 常见算法:包括C51,QR-DQN,IQN等,各种不同值分布强化学习算法的网络结构对比见下图:

从Distributional RL的视角看DQN

  • 从Distributional RL的视角来看,在状态 \(s\) 下执行动作 \(a\) 后,按照策略 \(\pi\) 继续执行的得到的价值为一个随机变量 \(Z^\pi(s,a) = \sum_{t=0}^\infty\gamma^t R(s_t, a_t)\vert_{\forall\ (s_{t},a_t) \ s_{t} \sim P(\cdot|s_{t-1},a_t), a_t \sim \pi(\cdot|s_t),}\),这个随机变量的随机包含以下:
    • 整个决策过程中所有动作决策的随机: \(a \sim \pi(\cdot|s)\)
    • 整个交互过程中状态转移的随机: \(s’ \sim P(\cdot|s,a)\)
    • 注:实际上, \(R(s,a)\) 也可能是随机变量
    • 这些随机导致了真实的状态 \(s\) 下执行动作 \(a\) 后得到的价值是一个随机变量,假设该随机变量服从一个特定的分布 \(P(Z^\pi(s,a)|s,a,\pi)\),即:
      $$ Z^\pi(s,a) \sim P(\cdot|s,a,\pi) $$
  • 而DQN是在拟合随机变量的期望 \(Q^\pi(s,a) = \mathbb{E}_{Z^\pi(s,a) \sim P(\cdot|s,a,\pi)}[Z^\pi(s,a)]\)

C51(Categorical DQN)

  • 这篇文章是值分布强化学习的第一篇,论文中作者不再直接学习Q值期望 \(Q^\pi(s,a)\),而是学习Q价值的分布

  • 论文对分布贝尔曼算子(Distributional Bellman Operator)进行了一些证明:

    • 可以证明,在Wasserstein metric下证明了 Distributional Bellman Operator 是一个 \(\gamma\) -压缩( \(\gamma\) -contraction)算子,从而确保该算子存在不动点
    • 算子的描述可以简单表述为下图:
  • 文章中提出了一种名为Categorical DQN的方法,先确定 \(Q(s,a)\) 的最大最小值,然后将其建模为一个等分为 \(N\) 份的价值区间(PS:在后续实验中,由于分了51份,所以也叫做C51),下面是Categorical DQN的伪代码:

  • 算法解读

    • 说明: \(x_t\) 表示状态,后续我们也用 \(s_t\) 表示
    • 上面的伪代码表示了收集到 \(s_t,a,r,s’\) 后的一次更新过程
    • 基本思路是直接将Q值等分为N份,表示在每个区间下Q值出现的概率
    • 计算下个状态的目标Q值:使用Q值分布计算期望得到Q值 \(Q(s_{t+1}, a):= \sum_i z_i p_i(x_t, a)\),然后决策下个状态下Q值最大的动作 \(a^* = \arg\max_a Q(s_{t+1}, a)\)
    • 更新时,每个区间都需要更新一次:
      • 贝尔曼算子计算目标值: \(\hat{\mathcal{T}}z_j \leftarrow [r_t + y_t z_j]_{V_{MIN}}^{V\ _{MAX}}\)
      • 计算目标值所在区间的下标序号: \(b_j \leftarrow (\hat{\mathcal{T}}z_j - V_{MIN})/\delta z \)
      • 按照序号计算相邻的下标 \(l \leftarrow \lfloor b_j \rfloor, \ u \leftarrow \lceil b_j \rceil\)
      • 将概率分配到Q值相邻的下标上(按照接近程度来分配):
        $$
        \begin{align}
        m_l &\leftarrow m_l + p^{\theta_k}_j(s_{t+1}, a^*)(u-b_j)\\
        m_u &\leftarrow m_u + p^{\theta_k}_j(s_{t+1}, a^*)(b_j-l)
        \end{align}
        $$
    • 损失函数上,使用交叉熵损失函数 \(-\sum_i m_i \log p^\theta_i(s_t, a_t)\) (注:为了方便看懂,我在概率的表达上增加了参数的标识,说明概率来源于参数表达)
    • 补充说明(网络实现中,一个网络输出N个头,然后做softmax得到每个头的概率值):
      $$
      \begin{align}
      Z_\theta(s,a) = z_i \quad \text{w.p.} \ p^\theta_i(x,a) = \frac{e^{\theta_i(s,a)}}{\sum_j e^{\theta_j(s,a)}}
      \end{align}
      $$
      • “w.p.” 是 “with probability” 的缩写
      • 上面的损失函数是一个多分类的交叉熵损失函数,和普通多分类的唯一区别是Ground Truth不是one-hot的,这里的Ground Truth是 \(\{m_i\}_{i=0}^{N-1}\)

QR-DQN

  • Quantile Regression DQN(QR-DQN),建模方式是学习Q值的分位数,提前确定要学习哪些分位点,然后通过分位数回归去学习每个分位点的Q值

    • \(q_j\) 表示:第 \(j\) 个分位点的间隔,可以是固定值,也可以不固定,但是累加和为1

    • \(\theta_j(s,a)\) 表示:分位点 \(\tau_j\) 对应的Q值,下图是一个分位点和累计分布函数的理解图:

    • \(Q(s,a) = \sum_jq_j\theta_j(s,a)\) 是Q值:通过分位数的Q值和对应的分位点区域权重,可以近似计算期望值(理解:不一定是精确的期望,因为通过分位点无法准确计算期望,只是一种近似)

    • 其中损失函数是quantile Huber loss:

    • 损失函数中 \(\mathcal{T}\theta_j\) 就是目标Q值,即损失函数中Ground Truth


IQN

  • 将分位点 \(\tau\) 也作为网络的输入,不再提前假定分位点的值,从而让神经可以拟合整个分布,从而提高对不同分布的表达能力
  • 分位数是均匀分布中随机采样的 \(\tau = U[0,1]\)
  • 价值函数变为 \(Q_\beta(s,a) = \mathbb{E}_{\tau\sim U[0,1]}[Z_{\beta{\tau}}(s,a)]\)
  • 其中 \(\beta(\cdot):[0,1] \rightarrow [0,1]\) 是一个映射函数,可以用于表示不同的风险偏好,借助这个偏好,可以用于实现一些保守策略
    • 如果该函数为凸函数(或者在图像上都在单位映射下方),那么就等于往较差情况加了较大的权重,这就产生了风险规避(risk-averse)型的风险偏好;
    • 如果该函数为凹函数(或者在图像上都在单位映射上方),那么就等于往较好情况加了较大的权重,这就产生了风险偏好(risk-seeking 或 risk-loving)型的风险偏好;
    • 如果该函数就是单位映射,则相当于风险中性(risk-neutral)型的风险偏好

总结

  • 相对普通强化学习拟合一个值期望不同,值分布强化学习拟合一个值分布,所以建模难度会更高些
  • 值分布有很多用途,比如在风险敏感(Risk-Sensitive)的应用场景中,可以使用分布来帮助决策选择风险低的动作(比如Optimized Cost per Mille in Feeds Advertising中使用借助IQN来选择低风险的出价动作)

RL——强化学习中的方差与偏差


本文主要介绍强化学习中的方差和偏差,以及相关的解法如lambda-return、TD(lambda)、GAE等

  • 本文关键词:
    • Multi-step TD,n-step TD,多步TD,n步TD
    • lambda-return, \(\lambda\)-return
    • TD(lambda),TD-lambda,TD(\(\lambda\))
    • GAE

MC 和 TD 的方差分析

  • MC(Monte-Carlo):方差大,偏差小
  • TD(Temporal-Difference):偏差大,方差小
  • 理解:
    • 与模型训练类似,方差与偏差是指同一个模型(bagging中所有模型共同组成一个模型)的输出是随着数据集/时间变化的
    • 方差大表达的是多次评估结果之间差别大
    • 偏差大则表示多次评估结果的均值与真实值差别大
    • MC采样每次都需要重新采样不同路径集合,在不同路径集合下,相同状态价值的评估结果差别大,但是结果的期望是符合真实情况的(甚至是无偏的)
    • TD方案则每次都使用下一个状态的相关估值,方差不会太大(依赖的随机变量更少),但是下个状态的估值不一定符合真实值,所以偏差较大
  • 参考链接:
    • 强化学习,方差比较大是说什么的方差大,为啥方差比较大? - Discover的回答 - 知乎
    • 强化学习,方差比较大是说什么的方差大,为啥方差比较大? - 无非尔耳的回答 - 知乎
    • 强化学习入门 第四讲 时间差分法(TD方法)-知乎-天津包子馅儿
  • 如何权衡方差和偏差?
    • Multi-step TD、 \(\lambda\)-return、TD(\(\lambda\))和GAE均可用于权衡方差和偏差问题

强化学习中 Reward 的方差为什么不为0

  • 策略随机性会导致出现方差: \(a \sim \pi(\cdot|s)\)
  • 执行策略后状态转移随机性会导致出现方差: \(s’ \sim P(\cdot|s,a)\)

Multi-step TD

  • Multi-step TD,也称为n-step TD,中文名多步TD或n步TD
  • 将TD中的即时奖励替换成采用未来多个时间片的奖励和,同时 \(\gamma V_\theta(s_{t+1})\) 值替换成 \(\gamma^n V_\theta(s_{t+n})\)
  • 形式化定义:自 \(t\) 时间步开始, \(n\) -step TD的 \(G_t^{(n)}\) 的值定义如下:
    $$
    \begin{align}
    G_t^{(n)} &= \sum_{l=0}^{n-1} \gamma^l R_{t+l} + \gamma^n V_\theta(S_{t+n}) \\
    G_t^{(n)} &= R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\cdots+\gamma^n V_{\theta}(S_{t+n})
    \end{align}
    $$
  • 展开来看,不同的步长下对应的n-step TD形式化定义如下
    $$
    \begin{align}
    G_t^{(1)}&=R_t+\gamma V_{\theta}(S_{t+1})\\
    G_t^{(2)}&=R_t+\gamma R_{t+1}+\gamma^2 V_{\theta}(S_{t+2})\\
    &\vdots\\
    G_t^{(n)}&=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\cdots+\gamma^n V_{\theta}(S_{t+n})\\
    &\cdots\\
    G_t^{(N)}&=\sum_{l=0}^N \gamma^{l} R_{t+l}\\
    \end{align}
    $$
    • \(G_t^{(N)}\) 表示包含终止状态(即包含最后一个时间步)的情况

\(\lambda\)-return

  • 回顾 Multi-step TD,自 \(t\) 时间步开始, \(n\)-step TD 的 \(G_t^{(n)}\) 的各种值如下
    $$
    \begin{align}
    G_t^{(1)}&=R_t+\gamma V_{\theta}(S_{t+1})\\
    G_t^{(2)}&=R_t+\gamma R_{t+1}+\gamma^2 V_{\theta}(S_{t+2})\\
    &\vdots\\
    G_t^{(n)}&=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\cdots+\gamma^n V_{\theta}(S_{t+n})\\
    &\cdots\\
    G_t^{(N)}&=\sum_{l=0}^N \gamma^{l} R_{t+l}\\
    \end{align}
    $$
  • \(\lambda\)-return 是 Multi-step TD 的加权平均(加权平均意味着权重和为1)
    $$
    \begin{align}
    G^{\lambda}_t&=(1-\lambda)[G_t^{(1)}+\lambda G_t^{(2)}+\cdots+\lambda^{N-2} G_t^{(N-1)}] + \lambda^{N-1} G_t^{(N)}\\
    G^{\lambda}_t&=(1-\lambda)\sum_{n=1}^{N-1}\lambda^{n-1}G_{t}^{(n)} + \lambda^{N-1} G_t^{(N)} \\
    \end{align}
    $$
    • 其中 \((1-\lambda)\) 是一个配平因子
      • 因为等比数列的和为 \(S_n = a+ar+ar^2+\cdots+ar^{n-1} = \frac{a(1-r^n)}{1-r}\)
      • 在我们场景中,系数部分有: \(S_n = 1+\lambda+\lambda^2+\cdots+\lambda^{n-1} = \frac{1-\lambda^n}{1-\lambda}\)
      • 所以最后一项不需要乘以 \((1-r)\),即:
        $$ 1 = (1-\lambda)(\frac{1-\lambda^N}{1-\lambda}) + \lambda^N = (1-\lambda)(1+\lambda+\lambda^2+\cdots+\lambda^{N-1}) + \lambda^N $$
      • 当 \(n\rightarrow \infty\) 时,有 \(1+\lambda+\lambda^2+\cdots+\lambda^{\infty} = \frac{1}{1-\lambda}\),此时不需要再配平,所以此时有:
        $$G^{\lambda}_t=(1-\lambda)\sum_{n=1}^{\infty}\lambda^{n-1}G_{t}^{(n)} \quad \quad \quad \quad \quad \quad$$
  • \(\lambda\)-return方法可用于平衡偏差与方差
  • \(\lambda\)-return方法是off-line的值更新方法,因为它必须用到当前时刻之后直到到达终止状态的所有数据(forward view),也就是说只有在一条episode结束后才能计算出对应的状态估计量
    • GAE也是这样吧,很多更新算法都是完成一整局游戏再更新一次模型,比如PPO,似乎也没有什么问题
  • 实践中,常常用TD(\(\lambda\))来近似拟合 \(\lambda\)-return

TD(\(\lambda\))

  • TD(\(\lambda\))方法是在Backward视角下,对n-step TD的各个值进行加权求和
    • TD(\(\lambda\))在每个时间步骤后,马上就可以调整预测
    • TD(\(\lambda\))是on-line的值更新方法,可以解决 \(\lambda\)-return需要等到 episode 结束才能获得状态估计量的缺点
  • TD(\(\lambda\))算法是强化学习中的一种重要方法,它结合了蒙特卡罗(MC)方法和时间差分(TD)方法的优点,同时引入了一个新的参数 \(\lambda\),用于平衡一步预测和多步预测之间的关系。TD(\(\lambda\))的计算公式涉及到如何更新状态或动作-状态的价值函数,并且利用了所谓的“资格迹”(eligibility trace)来追踪哪些权重对当前的 TD 误差负有责任

表格型学习下的 TD(\(\lambda\))

  • 对于表格型强化学习(Tabular RL)下的 TD(\(\lambda\)),其价值函数更新公式可以表示为:
    $$ V(S_t) \leftarrow V(S_t) + \alpha \delta_t E_t $$
  • 其中:
    • \(V(S_t)\) 是状态 \(S_t\) 的价值估计
    • \(\alpha\) 是学习率,决定了每次更新的步伐大小
    • \(\delta_t = R_{t} + \gamma V(S_{t+1}) - V(S_t)\) 是TD误差,衡量了实际观察到的结果与预测结果之间的差异,这里将这个差异用于更新当前episode上遇到的所有的相关状态的价值
    • \(E_t\) 是资格迹向量,在每个时间点 \(t\) 上根据之前的状态访问情况累积而成
      • 每次访问任意状态 \(\hat{s}\),都会更新所有状态的资格迹,假设在第 \(t\) 轮次,访问到状态 \(s_t\) 后,任意状态 \(s\) 对应的资格迹的更新规则是:
        $$ E_t(s) = \gamma \lambda E_{t-1}(s) + \mathbf{1}(s_t = s) $$
      • 当前轮次更新所有状态时,首先所有状态都会在上一轮的资格迹基础上乘以 \(\gamma \lambda \),然后,对于这轮遇到的状态 \(s = s_t\) 上资格迹加1,否则不加( \(\mathbf{1}(s_t = s)\) ),如果展开资格迹,则有如下表示:
        $$ E_t(s) = \begin{cases}
        \gamma \lambda E_{t-1}(s), & \text{if } s \neq S_t \\
        \gamma \lambda E_{t-1}(s) + 1, & \text{if } s = S_t
        \end{cases} $$
      • 注意:这里的 \(t\) 不是episode里面的时间片, \(t\) 是表示当前更新轮次 \(t\),这个更新轮次遇到的状态则表示为 \(s_t\), \(E_{t-1}(s)\) 则表示上一轮次访问到状态 \(\hat{s}\) (这里的状态 \(\hat{s}\) 可以是任意状态)以后,状态 \(s\) 更新得到的结果
      • 这意味着每当访问到某个状态 \(s\) 时,它的资格迹会被重置为1加上前一时刻该状态的资格迹乘以 \(\gamma\lambda\) 。如果当前不是访问这个状态,则仅按比例衰减
    • TD(\(\lambda\))是在访问完一个时间片以后,立刻用当前时间片访问得到的信息更新之前遇到过的其他状态,且离当前时间片越近、历史访问次数越多的状态被更新的幅度越大(实现时,资格迹默认置0,未被访问过的状态是不会被更新的)
  • 说明:虽然上述操作使得TD- \(\lambda\) 在计算上显得更优雅,但显然它的合理性弱于 \(\lambda\)-return,实际效果也可能会弱于 \(\lambda\)-return
  • TD \(\lambda\) 的代码实现:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class TDLambda:
    def __init__(self, alpha, gamma, lambda_, num_states):
    self.alpha = alpha
    self.gamma = gamma
    self.lambda_ = lambda_
    self.V = np.zeros(num_states) # 存储所有状态价值函数V值
    self.E = np.zeros(num_states) # 存储所有状态的资格迹
    def update(self, state, next_state, reward, done):
    delta = reward + (0 if done else self.gamma * self.V[next_state]) - self.V[state]
    self.E *= self.gamma * self.lambda_ # 更新所有状态的资格迹
    self.E[state] += 1 # 对当前状态增加踪迹
    self.V += self.alpha * delta * self.E # 更新所有状态的价值函数,资格迹为0的(不在当前episode的状态资格迹都为0)
    if done:
    self.E[:] = 0 # 如果episode结束,重置资格迹,保证新的回合开始时所有状态资格迹为0

    td_lambda = TDLambda(alpha=0.1, gamma=0.9, lambda_=0.8, num_states=env.observation_space.n)
    state = env.reset()
    for t in range(max_steps):
    action = policy(state) # 根据某种策略选择行动
    next_state, reward, done, _ = env.step(action) # 执行动作
    td_lambda.update(state, next_state, reward, done) # 更新用TD(\lambda)更新所有状态的价值函数和资格迹
    state = next_state
    if done:
    break

函数近似型学习下的资格迹

  • 在函数近似强化学习(Function Approximation RL)情况下,由于状态往往无法通过表格完全枚举,所以资格迹是针对记录参数的,而不是记录状态的,但本质都是对状态价值函数的估计
  • 这种资格迹出现在 Sutton 的《Reinforcement Learning: An Introduction》中,此时的资格迹(Eligibility Traces)定义与上述表格型资格迹有所不同,其更侧重于从权重更新的角度进行定义
    • 注:详情见第二版书籍《Reinforcement Learning: An Introduction Second Edition》的 第 12.2 章节
  • 对于状态价值函数的估计,资格迹向量 \(z_t\) 的更新公式为:
    $$
    \begin{align}
    z_{-1} &\doteq 0 \\
    z_t &\doteq \gamma\lambda z_{t - 1}+\nabla\hat{v}(S_t,w_t)
    \end{align}
    $$
    • 其中 \(\gamma\) 是折扣因子,
    • \(\lambda\) 是资格迹衰减参数,
    • \(\nabla\hat{v}(S_t,w_t)\) 是状态价值函数 \(\hat{v}(S_t,w_t)\) 关于权重 \(w_t\) 的梯度
  • 权重 \(w_t\) 的更新公式为:
    $$w_{t + 1} \doteq w_t+\alpha\delta_t z_t$$
    • 其中 \(\alpha\) 是学习率
    • \(\delta_t\) 是时序差分误差,定义为
      $$ \delta_t \doteq R_{t + 1}+\gamma\hat{v}(S_{t + 1},w_t)-\hat{v}(S_t,w_t) $$
  • 这种定义方式强调了资格迹与价值函数梯度的关系,通过资格迹来记录权重向量的各个维度对最近的状态值函数估计的贡献程度,从而在权重更新时能够更有效地利用多步的时序差分信息
  • 在强化学习中,上述提到的两种“资格迹”定义并非本质冲突,而是同一核心思想在不同价值函数表示框架下的具体实现 ,其差异源于对“状态价值函数 \( V(s) \)”的建模方式不同(表格型 vs 函数近似型),这也正是 Sutton《Reinforcement Learning: An Introduction》中从基础到进阶的核心逻辑脉络

核心区别:表格型方法 vs 函数近似方法

  • 两种资格迹的本质差异,根植于“是否用参数化模型拟合价值函数”,具体可从适用场景、表示形式、更新逻辑三个维度对比:
    对比维度 第一种定义(表格型资格迹) 第二种定义(Sutton 书的函数近似型资格迹)
    适用场景 表格型强化学习:状态空间 有限且离散(如网格世界、 Blackjack),每个状态 \( s \) 有独立的价值 \( V(s) \),无需参数拟合 函数近似强化学习:状态空间 无限或高维(如连续动作机器人、图像输入游戏),需用参数化模型 \( \hat{v}(s, \boldsymbol{w}) \) 拟合 \( V(s) \)(\( \boldsymbol{w} \) 为模型参数)
    资格迹的表示形式 针对“单个状态”的迹值:\( e_t(s) \) 是标量,每个状态 \( s \) 对应一个独立的资格迹(可理解为“状态级迹”) 针对“模型参数”的迹向量:\( \boldsymbol{z}_t \) 是与参数 \( \boldsymbol{w} \) 同维度的向量(如神经网络的权重向量),每个参数维度对应一个迹值(可理解为“参数级迹”)
    核心更新逻辑 直接更新“状态价值”:通过 \( e_t(s) \) 记录“状态 \( s \) 近期被访问的程度”,更新时直接调整 \( V(s) \) 间接更新“参数权重”:通过 \( \boldsymbol{z}_t \) 记录“每个参数对近期状态价值估计的贡献程度”,更新时先调整参数 \( \boldsymbol{w} \),再通过 \( \hat{v}(s, \boldsymbol{w}) \) 间接体现状态价值的变化
    梯度项的角色 无梯度项:因每个状态价值独立,无需对参数求导,用“指示函数 \( \mathbb{I}(s=s_t) \)”标记当前访问的状态 核心依赖梯度:\( \nabla_{\boldsymbol{w} } \hat{v}(S_t, \boldsymbol{w}) \)(价值函数对参数的梯度)决定“哪些参数对当前状态 \( S_t \) 的价值估计有贡献”,是资格迹更新的核心输入
  • 两种资格迹具体公式对比:从“状态迹”到“参数迹”的映射
    • 为更直观理解,将两种定义的核心公式并列,可清晰看到“函数近似型”是“表格型”的泛化与扩展 :
      公式类型 表格型资格迹(第一种定义) 函数近似型资格迹(Sutton 书定义)
      资格迹初始化 \( e_0(s) = 0 \)(所有状态的迹值初始为 0) \( \boldsymbol{z}_{-1} = \boldsymbol{0} \)(参数向量维度的迹向量初始为 0 向量)
      资格迹更新 \( e_t(s) = \gamma\lambda \cdot e_{t-1}(s) + \mathbb{I}(s = S_t) \)
      (当前状态迹值+1,其余衰减,所有状态都更新)
      \( \boldsymbol{z}_t = \gamma\lambda \cdot \boldsymbol{z}_{t-1} + \nabla_{\boldsymbol{w} } \hat{v}(S_t, \boldsymbol{w}) \)
      (参数迹向量衰减后,叠加当前状态的价值梯度)
      TD 误差 \( \delta_t = R_{t+1} + \gamma V(S_{t+1}) - V(S_t) \)
      (基于真实状态价值 \( V(s) \))
      \( \delta_t = R_{t+1} + \gamma \hat{v}(S_{t+1}, \boldsymbol{w}) - \hat{v}(S_t, \boldsymbol{w}) \)
      (基于参数化估计 \( \hat{v}(s, \boldsymbol{w}) \))
      价值/参数更新 \( V(s) \leftarrow V(s) + \alpha \cdot \delta_t \cdot e_t(s) \)
      (直接更新每个状态的价值)
      \( \boldsymbol{w}_{t+1} \leftarrow \boldsymbol{w}_t + \alpha \cdot \delta_t \cdot \boldsymbol{z}_t \)
      (更新参数向量,间接优化价值估计)
  • 核心思考:两种资格迹本质是统一的,资格迹的核心思想从未改变,尽管形式差异明显,但两种定义都遵循资格迹的核心逻辑 都是
    • 用“衰减的痕迹”记录“近期相关性” ,让后续的 TD 误差能高效回溯并更新“对当前奖励有贡献的状态/参数”
      • \(\mathbb{I}(s = S_t)\) 和 \(\nabla_{\boldsymbol{w} } \hat{v}(S_t, \boldsymbol{w})\) 表示的都是针对状态 \(S_t\) 更新的,记录的是当前状态 \(S_t\) 的相关度
      • 等价性:在表格型方法下,可以将表格位置看做参数,则参数维度为表格位置数量(与状态数量一致),此时状态价值与其他位置参数无关,仅仅与指定当前状态 \(S_t\) 对应的位置(唯一位置,假定对应参数为 \(w_i\))有关,此时的梯度:
        • 对 \(S_t\) 对应的位置参数 \(w_i\) 有: \(\nabla_{\boldsymbol{w_i} } \hat{v}(S_t, \boldsymbol{w_i}) = 1\)
        • 对其他所有 \(S_t\) 无关的位置参数 \(w_{\neg i}\)有:\(\nabla_{\boldsymbol{w_{\neg i}} } \hat{v}(S_t, \boldsymbol{w_{\neg i}}) = 0\)
    • 简言之,两种定义是“同一思想在不同问题复杂度下的适配”,函数近似型是表格型的自然延伸,而非替代
    • 对 \(\boldsymbol{w}_{t+1} = \boldsymbol{w}_t + \alpha \cdot \delta_t \cdot \boldsymbol{z}_t\) 的更新,相当于是对价值函数 \(\hat{v}(s,\boldsymbol{w}_{t+1})\) 的更新
  • 总结:一致性体现在(可能还有其他):
    • 1)衰减机制一致 :均通过 \( \gamma\lambda \) 实现“远期痕迹的指数衰减”(\( \gamma \) 折扣未来奖励,\( \lambda \) 控制多步信息的范围);
    • 2)更新触发一致 :均以 TD 误差 \( \delta_t \) 为“更新信号”,痕迹值越高的状态/参数,获得的更新幅度越大;
    • 3)目标一致 :都是为了平衡 TD(0)(单步、低方差高偏差)和 MC(全步、低偏差高方差),高效利用多步信息
    • 4)资格迹都是用于更新权重,且最终都是用于对价值函数的估计,对参数的更新会自动更新到状态价值网络
  • 何时用哪种定义?
    • 在处理简单离散状态问题(如 10x10 网格世界)时,表格型资格迹(第一种定义)更直观,无需考虑参数拟合,直接操作状态价值即可;
    • 在处理复杂高维/连续状态问题(如自动驾驶、Atari 游戏)时,必须采用 Sutton 书的函数近似型资格迹,通过参数向量 \( \boldsymbol{w} \) 和梯度 \( \nabla_{\boldsymbol{w} } \hat{v} \),才能用有限参数拟合无限状态的价值函数

GAE

  • 原始论文:(GAE)High-Dimensional Continuous Control Using Generalized Advantage Estimation, ICLR 2016, UC Berkeley

  • GAE,Generalized advantage estimation,平衡了强化学习中的方差与偏差,常用于 TRPO 和 PPO 中,用于评估优势函数

  • 推导过程(基于多步时序差分的思想)

    • \(\lambda\) 是一个介于 0 和 1 之间的参数,用于控制偏差-方差的权衡
      • 当 \(\lambda = 0\) 时,GAE 退化为单步 TD 误差
      • 当 \(\lambda = 1\) 时,GAE 等价于无限步回报(详情见下文的推导)
    • \(\gamma\) 是折扣因子
    • 注:\(\gamma\) 和 \(\lambda\) 不等价,不可互换(虽然推导结果中两者看似一致),因为 \(\delta_t\) 中也包含了 \(\gamma\)
  • GAE 本质上是对不同步数的优势函数进行加权求和,最终得到一个的优势函数估计值

  • GAE 可通过参数调整控制方差和偏差的关系

GAE 中 \(\lambda=1\) 时的结论和证明

  • 当 GAE 中的 \(\lambda=1\) 时,优势估计退化为纯粹的蒙特卡洛形式 :
    • 不再使用任何 TD 自举(bootstrap),完全依赖实际采样的回报
    • 估计无偏,但方差最大
    • 对应 GAE 偏差-方差权衡谱的“高方差、零偏差”极端
  • 注意:不能直接从定义上证明,因为定义中包含 \(1-\lambda\),会导致结果看起来是 0,忽略前面又无法得到精确解,所以要从上面的结论形式出发推导
  • 回顾:写出 GAE(\(\lambda\)) 的一般定义:即 GAE(\(\lambda\)) 对优势函数的估计为:
    $$
    \hat{A}^{(\lambda)}_t = \sum_{l=0}^{\infty}(\lambda\gamma)^l\delta_{t+l},
    \qquad
    \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t).
    $$
    • 其中
      • \(\delta_t\) 是 \(t\) 时刻的 TD 误差;
      • \(\gamma\) 是折扣因子;
      • \(\lambda\) 是 GAE 平滑参数,\(0\le\lambda\le1\)
  • 令 \(\lambda=1\),得到
    $$
    \hat{A}^{(1)}_t = \sum_{l=0}^{\infty}\gamma^l\delta_{t+l}.
    $$
  • 把 \(\delta\) 的定义代入并做级数求和:即将 \(\delta_{t+l}=r_{t+l}+\gamma V(s_{t+l+1})-V(s_{t+l})\)代入,展开:
    $$
    \begin{aligned}
    \hat{A}^{(1)}_t
    &= \sum_{l=0}^{\infty}\gamma^l\bigl[r_{t+l}+\gamma V(s_{t+l+1})-V(s_{t+l})\bigr] \\
    &= \sum_{l=0}^{\infty}\gamma^l r_{t+l}
    + \sum_{l=0}^{\infty}\gamma^{l+1}V(s_{t+l+1})
    - \sum_{l=0}^{\infty}\gamma^l V(s_{t+l}).
    \end{aligned}
    $$
  • 把第二项的指标平移\(l\to l-1\),得到
    $$
    \sum_{l=0}^{\infty}\gamma^{l+1}V(s_{t+l+1})
    = \sum_{l=1}^{\infty}\gamma^{l}V(s_{t+l}).
    $$
  • 于是
    $$
    \hat{A}^{(1)}_t
    = \sum_{l=0}^{\infty}\gamma^l r_{t+l}
    + \sum_{l=1}^{\infty}\gamma^{l}V(s_{t+l})
    - \sum_{l=0}^{\infty}\gamma^l V(s_{t+l}).
    $$
  • 后两项相减,仅留下\(-V(s_t)\):
    $$
    \hat{A}^{(1)}_t = \sum_{l=0}^{\infty}\gamma^l r_{t+l} - V(s_t).
    $$
  • 右侧\(\sum_{l=0}^{\infty}\gamma^l r_{t+l}\)正是从 \(t\) 时刻开始的折扣回报\(R_t\),因此
    $$
    \hat{A}^{(1)}_t = R_t - V(s_t).
    $$
  • 这就是蒙特卡洛优势估计(Monte-Carlo advantage estimate)

GAE 实现

  • GAE 递归形式推导
    $$
    \begin{align}
    A^{\text{GAE}}_t &= \sum_{l=0}^\infty (\gamma\lambda)^l \delta_{t+l} \\
    A^{\text{GAE}}_t &= \delta_t + \sum_{l=1}^\infty (\gamma\lambda)^l \delta_{t+l} \\
    A^{\text{GAE}}_t &= \delta_t + (\gamma\lambda)\sum_{l=1}^\infty (\gamma\lambda)^{l-1} \delta_{(t+1)+(l-1)} \\
    A^{\text{GAE}}_t &= \delta_t + (\gamma\lambda)\sum_{k=0}^\infty (\gamma\lambda)^{k} \delta_{(t+1)+k} \\
    A^{\text{GAE}}_t &= \delta_t + (\gamma\lambda)A^{\text{GAE}}_{t+1} \\
    \end{align}
    $$
    • 实现代码(来自《动手学强化学习》):
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      # 从td_deltas计算各个状态的GAE
      def compute_advantage(gamma, lmbda, td_deltas):
      td_deltas = td_deltas.detach().numpy()
      advantage_list = []
      advantage = 0.0
      for delta in td_deltas[::-1]:
      advantage = gamma * lmbda * advantage + delta # 对应推导的递归形式
      advantage_list.append(advantage)
      advantage_list.reverse()
      return torch.tensor(advantage_list, dtype=torch.float)
      # compute_advantage函数的使用
      td_target = rewards + self.gamma * self.critic(next_states) * (1 - dones)
      td_deltas = td_target - self.critic(states)
      advantage = rl_utils.compute_advantage(self.gamma, self.lmbda, td_deltas.cpu()).to(self.device)

      # 利用advantage更新PPO Agent
      mu, std = self.actor(states)
      action_dists = torch.distributions.Normal(mu.detach(), std.detach())
      # 动作是正态分布
      old_log_probs = action_dists.log_prob(actions)
      for _ in range(self.epochs):
      mu, std = self.actor(states)
      action_dists = torch.distributions.Normal(mu, std)
      log_probs = action_dists.log_prob(actions)
      ratio = torch.exp(log_probs - old_log_probs)
      surr1 = ratio * advantage
      surr2 = torch.clamp(ratio, 1 - self.eps, 1 + self.eps) * advantage
      actor_loss = torch.mean(-torch.min(surr1, surr2))
      critic_loss = torch.mean(F.mse_loss(self.critic(states), td_target.detach()))
      self.actor_optimizer.zero_grad()
      self.critic_optimizer.zero_grad()
      actor_loss.backward()
      critic_loss.backward()
      self.actor_optimizer.step()
      self.critic_optimizer.step()

讨论:直观理解 GAE 中 \(\lambda\) 的作用(平滑作用)

  • GAE 的优势优势函数计算如下:
    $$ \hat{A}_t = \delta_t + (\gamma\lambda)\delta_{t+1} + (\gamma\lambda)^2\delta_{t+2} + \dots $$
  • 当 \(\lambda = 1\) 时(Monte Carlo) :
    • 中间的 \(V\) 项会相互抵消(Telescoping Sum),最后 \(\hat{A}_t = R_{final} - V(s_t)\)
    • 此时中间的 \(\delta_t\) 确实在数学形式上被“合并”了,退化为单纯的蒙特卡洛回报减去基线
    • 这会导致方差极大,因为 Critic 在中间步骤的判断被忽略了
  • 当 \(\lambda < 1\) 时(GAE 的标准用法) :
    • \(\hat{A}_t\) 变成了 \(\delta_t\) 的加权和,意味着当前的优势函数高度依赖于当前的 \(\delta_t\)
    • 如果模型在第 \(t\) 步犯错,导致 \(V(s_{t+1})\) 下降,\(\delta_t\) 会是巨大的负数
    • 由于 \(\lambda\) 的衰减,这个巨大的负数主要惩罚的是当前动作 \(a_t\),而对 \(a_{t-1}\) 的惩罚会衰减
    • 这正是我们想要的:谁犯错,谁负责
      • 如果没有中间的 \(\delta_t\),模型就不知道到底是哪一步导致了最后的失败

讨论:GAE 中 \(\lambda\) 和 \(\gamma\) 的关系和作用

  • 数学上 :\(\gamma\) 参与了 \(\delta_t\) 的构建,而 \(\lambda\) 仅参与 \(\delta_t\) 的加权
    • 它们在求和项中呈乘积形式 \((\gamma\lambda)^l\),是因为它们共同决定了信息的有效传播距离
  • 收敛影响 :在稀疏奖励下,较大的 \(\lambda\) 是至关重要的
    • 它允许奖励信号跨越漫长的“零奖励”步骤,直接反馈给早期的状态,从而极大地加速 Critic 的收敛
  • 实践建议 :对于稀疏奖励任务,通常建议将 \(\lambda\) 设置在 \(0.95\) 到 \(1.0\) 之间,并配合足够长的采样步数(Rollout Length),以确保奖励信号能有效回传
\(\gamma\) 与 \(\lambda\) 的数学关系:看似等价但有差异
  • 在全局逻辑中, \(\gamma\) 与 \(\lambda\) 并不是完全等价可互换的
    • \(\gamma\) 与 \(\lambda\) 在某些项中看起来“对称”,是因为它们共同决定了“远期误差对当前估计的影响权重”
\(\gamma\) 与 \(\lambda\) 数学定义上非对称
  • 作者先看 GAE 的核心基础
  • 定义 \(t\) 时刻的 TD 误差(Temporal Difference Error)为:
    $$ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) $$
  • GAE 的优势估计公式为:
    $$ \hat{A}_t^{GAE} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} = \delta_t + (\gamma \lambda) \delta_{t+1} + (\gamma \lambda)^2 \delta_{t+2} + \dots $$
  • 为什么 \(\gamma\) 与 \(\lambda\) 不可互换?
    • 观察 \(\delta_t\) 的定义:
      • \(\gamma\) 出现在每一个 \(\delta\) 内部(作为未来状态价值的折扣),而 \(\lambda\) 只出现在 \(\delta\) 外部作为衰减权重
    • 如果交换 \(\gamma\) 和 \(\lambda\),\(\delta_t\) 内部的系数会变,这会直接改变单步 TD 误差的计算逻辑
    • 注:只有在 \(\delta_t\) 序列已经确定的情况下,在求和项 \((\gamma \lambda)^l\) 中它们才是地位平等的
\(\gamma\) 与 \(\lambda\) 物理含义不同
  • \(\gamma\) (Discount Factor) :本质上是问题的属性
    • 它定义了“未来奖励在今天值多少钱”,决定了智能体的眼光有多长远
  • \(\lambda\) (GAE Parameter) :本质上是估计器的属性
    • 它用于在 偏差(Bias) 和 方差(Variance) 之间做权衡
  • 在 GAE 的推导中,实际上是对不同步数的优势估计做指数加权平均
  • 在这个过程中,\(\lambda\) 的作用是进一步缩短“有效回溯步数”
    • 既然 \(\gamma\) 已经在缩短这个步数了,\(\lambda\) 只是在 \(\gamma\) 的基础上再打一个折
    • 数学上,两个指数衰减连乘,自然就合并成了 \((\gamma \lambda)^l\)
    • 所有,这两个值都有衰减效果

讨论:稀疏奖励下 \(\lambda\) 是否会影响 Critic 收敛?

  • 答案是肯定的:在稀疏奖励(Sparse Reward)环境下,\(\lambda\) 会显著影响 Critic 的收敛速度和稳定性
  • 以下讨论中假设只有最后一步有奖励(即 \(r_1, r_2, \dots, r_{T-1} = 0, r_T = R\))
\(\lambda\) 影响奖励信号的反向传播速度
  • 在稀疏奖励下,Critic 需要学习每个状态的长期价值
  • 当 \(\lambda = 0\) 时(1-step TD):
    • Critic 的更新目标是
      $$V_{target}(s_t) = r_t + \gamma V(s_{t+1})$$
    • 由于中间奖励为 0,更新变为
      $$ V(s_t) \leftarrow \gamma V(s_{t+1})$$
      • 这意味着奖励信号 \(r_T\) 每一轮更新只能向后传递一步
      • 如果一个序列有 100 步,Critic 至少需要 100 个完整的 Episode 才能让第一步的状态 \(s_1\) 感知到最后一步有奖励
  • 当 \(\lambda = 1\) 时(类似于 Monte Carlo):
    • 优势估计变为 \(\hat{A}_t = \sum_{l=t}^T \gamma^{l-t} r_l - V(s_t)\)
    • 在这种情况下,最后一步的奖励 \(r_T\) 会立即出现在所有前期状态的更新目标中
    • Critic 在第一个成功的 Episode 结束后就能知道“这一条路径上的所有状态都是有价值的”,收敛速度大幅提升
\(\lambda\) 影响偏差与方差的权衡
  • 虽然增大 \(\lambda\) 能加速信息传递,但会带来稳定性挑战:
    • 低 \(\lambda\) :更新目标主要基于当前的 \(V\) 网络预测
      • 虽然方差小,但在收敛初期,\(V\) 的预测是随机且错误的,这会导致 Critic 在错误的信号上浪费大量时间(高偏差)
    • 高 \(\lambda\) :更新目标更接近实际观察到的累积回报
      • 虽然偏差小,但由于稀疏奖励往往伴随随机探索,单次偶然获得奖励的巨大梯度会冲击网络,导致更新不稳定(高方差)
从 \(\lambda\) 对 Critic 目标值进一步理解
  • Critic 的损失函数通常是:
    $$ Loss = \mathbb{E} \left[ (V_\theta(s_t) - V_{target})^2 \right] $$
    • 其中 \(V_{target}\) 是真实回报 \(R\) 的一个估计,一些实现中也会使用 \(R\) 来表示这个值
      $$ V_{target} = \hat{A}_t^{GAE} + V_{old}(s_t) $$
  • 在稀疏奖励下,中间步数的 \(\delta_t\) 几乎完全取决于 \(V\) 之间的差值
    • \(\lambda\) 实际上控制了 Critic 在更新时,多大程度上相信“当前的 V 网络预测”(TD 侧),多大程度上相信“实际观察到的轨迹结果”(MC 侧)

讨论:系数奖励情况下,GAE 的作用

  • 设定稀疏状态为只有终止状态有非 0 奖励的情况下
  • 疑问:在只有最后一个 Token 有奖励时,GAE 中前面的 \(\delta_t\) 实际上都是 \(r_t = 0\),请问这种情况下,我们的 前面的 \(\delta_t\) 是不是没有什么意义?
    • 回答:前面的 \(\delta_t\) 绝对是有意义的,而且很有意义,在稀疏奖励场景下起到了至关重要的“信用分配”(Credit Assignment)作用
  • \(\delta_t\) 的定义是:
    $$ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) $$
    • 在 \(r_t=0\) 且 \(\gamma=1\) 的情况下,它简化为:
      $$ \delta_t = V(s_{t+1}) - V(s_t) $$
    • 这意味着 \(\delta_t\) 代表了价值函数(Critic)对当前这一步动作带来的“预期改变”
  • Critic 充当了“密集奖励”的代理人:在只有最终奖励(Sparse Reward)的任务中,环境不说话(\(r_t=0\)),但 Critic(价值网络)一直在说话
    • \(V(s_t)\) :代表在 \(t\) 时刻,Critic 认为最终能拿多少分
    • \(V(s_{t+1})\) :代表在执行了动作 \(a_t\) 后,Critic 认为最终能拿多少分
  • \(\delta_t\) 实际上衡量了动作 \(a_t\) 是“好”还是“坏”
    • 如果 \(a_t\) 是一个关键的好步骤(比如在推理题中迈出了正确的一步),Critic 会觉得“稳了”,\(V(s_{t+1})\) 会比 \(V(s_t)\) 高,此时 \(\delta_t > 0\)
    • 如果 \(a_t\) 是一个致命错误(比如开始胡言乱语),Critic 会觉得“完了”,\(V(s_{t+1})\) 会暴跌,此时 \(\delta_t < 0\)
    • 如果 \(a_t\) 是废话(不影响结果),\(V(s_{t+1}) \approx V(s_t)\),此时 \(\delta_t \approx 0\)
    • \(\delta_t\) 将稀疏的最终奖励,通过 Critic 的预测能力,回传到了每一个具体的 Token 上
一个直观的例子
  • 假设题目是:“1+1 等于几?”
    • Step 1 : 生成 “The”
      • \(V(s_1) \approx 0.9\) (Critic 觉得大概率能答对)
      • \(V(s_2) \approx 0.9\) (生成 “The” 很正常)
      • \(\delta_1 \approx 0\) (无功无过)
    • Step 2 : 生成 “answer”
      • \(V(s_3) \approx 0.95\)
      • \(\delta_2 \approx 0.05\) (稍微有点进展)
    • Step 3 : 生成 “is”
      • \(V(s_4) \approx 0.95\)
      • \(\delta_3 \approx 0\)
    • Step 4 (关键步) : 生成 “three” (错误答案)
      • \(V(s_5) \approx 0.0\) (Critic 意识到这局要输了,因为答案错了)
      • \(\delta_4 = 0 + 1 \cdot 0.0 - 0.95 = -0.95\)
      • 注意:这里出现了巨大的负信号!
    • Step 5 : 生成 <EOS>
      • 最终奖励 \(r=0\) (因为答错了)
      • \(\delta_5 \approx 0\)
  • 注意:正是 Step 4 的 \(\delta_4\) 提供了极强的负反馈,告诉 Policy 网络:“是你把事情搞砸的”
    • 如果没有 \(\delta_t\),模型就只能收到最后那个 0 分,却不知道是哪个词出了问题
  • 在 \(r_t=0\) 的阶段,\(\delta_t\) 的意义在于 “信息增益” 或 “预期的修正”,\(\delta_t\) 是 Critic 告诉 Actor 的一句话:“这一步走完,我对结局的看法改变了多少”:
    • \(\delta_t \approx 0\) : 符合预期,按部就班
    • \(\delta_t \neq 0\) : 出现了转折点(惊喜或惊吓)
  • 理解:正是这些非零的 \(\delta_t\),让 PPO 能够在数千个 Token 的长序列中,精准地找到那些决定成败的关键 Token 进行强化或惩罚!

几种方法辨析

\(\lambda\)-return和TD(\(\lambda\))对比

  • 相同点:
    • \(\lambda\)-return和TD(\(\lambda\))的目标都是在单步TD和完整的蒙特卡罗回报之间找到一个折衷方案。通过调整 \(\lambda\) 值,可以在不同的时间尺度上分配信用,从而实现更有效的学习
    • 当 \(\lambda=0\) 时, \(\lambda\)-return和TD(\(\lambda\))都退化为TD(0),即只考虑一步奖励;而当 \(\lambda=1\) 时,则等价于使用整个episode的回报进行更新
  • 不同点:
    • \(\lambda\)-return是forward的,而TD(\(\lambda\))是backward的,两种视角的对比如下:
    • \(\lambda\)-return是off-line的值更新方法,而TD(\(\lambda\))是on-line的值更新方法
      • 估计值函数时,需要等到episode结束才能开始计算的算法为off-line方法(如 \(\lambda\)-return)
      • 估计值函数时,不需要等到episode结束就可以开始计算的算法称为on-line方法(如TD(\(\lambda\)))
  • 一些总结:
    • TD(\(\lambda\))是 \(\lambda\)-return的一种近似实现( \(\lambda\)-return需要采样到整个episode才可以更新一版)
    • 实际上几乎所有的on-policy方法训练时(比如许多开源实现都是这样)都需要完整完成一次episode再更新,此时直接使用( \(\lambda\)-return更好
    • TD \(\lambda\) 更多地应用于实际问题解决当中,尤其是在那些需要快速响应和持续学习的任务上。由于它可以实时更新模型参数,因此非常适合处理非终止型任务或者非常长的 episodes,在这些情况下等待整个 episode 完成后再做更新可能是不切实际的
      • 问题:这些任务上 GAE 是否也不适用?
  • 其他参考: \(\lambda\)-return和TD(\(\lambda\))的关系

GAE 和 \(\lambda\)-return

  • GAE 和 \(\lambda\)-return的思路基本一致,区别在于 GAE 关注的是优势函数, \(\lambda\)-return关注的是累计回报

附录:对 TD(\(\lambda\))和资格迹的深入理解

  • 整体描述 :
    • TD(\(\lambda\)) 使用当前时间片的 TD error 更新其他状态的能力源于其引入的资格迹(eligibility traces)机制。资格迹本质上是一个短期记忆向量,它记录了每个权重对于预测当前状态价值的贡献程度。当一个新的 TD error 被计算出来时,这个误差不仅用于直接更新当前状态的价值估计,还会根据资格迹的影响范围去调整之前的状态或动作的价值估计。这种机制允许 TD(\(\lambda\)) 在每一步都进行在线更新,而不需要等待整个 episode 结束
  • 对于资格迹的理解 :
    • 资格迹的关键在于它可以跟踪哪些状态或状态-动作对在最近被访问过,并且根据这些迹来决定如何分配新的信息。具体来说,每当智能体从一个状态转移到另一个状态并获得奖励时,资格迹会为该状态增加一定的值,同时以 \(\gamma\lambda\) 的速率衰减其他所有状态的资格迹。这里的 \(\gamma\) 是折扣因子, \(\lambda\) 是控制资格迹衰减速率的参数。因此,资格迹提供了一种方式来衡量不同状态之间的关联性,使得较早出现的状态也能受益于后来发生的事件
  • 为何可以用当前时间片的 TD error 更新其他状态?
    • 考虑一个简单的情况:假设我们有一个序列 \(S_0, A_0, R_1, S_1, A_1, R_2, …\),其中 \(S_t\) 表示第 t 步的状态, \(A_t\) 表示采取的动作,而 \(R_{t+1}\) 则是紧接着收到的即时奖励。现在假设我们在时间步 t 处得到了一个新的 TD error:
      $$ \delta_t = R_{t+1} + \gamma V(S_{t+1}) - V(S_t) $$
    • 这里 \(\delta_t\) 反映了当前状态下实际观察到的结果与之前的预期之间的差异。接下来,我们将使用这个误差来更新所有之前状态的价值估计。具体地,如果某个状态 \(S_i\) ( \(i < t\) )曾经出现在这一序列中,并且它的资格迹不为零,那么我们可以按照以下规则更新它的价值:
      $$ V(S_i) \leftarrow V(S_i) + \alpha \delta_t E_i $$
    • 其中 \(\alpha\) 是学习率, \(E_i\) 是状态 \(S_i\) 的资格迹。这样做的效果是,那些更接近当前时间点并且资格迹较高的状态将会受到更大的影响,因为它们被认为对当前的结果负有更多的责任。相反,距离较远或者资格迹较低的状态则只会得到较小幅度的调整
  • 为什么需要TD(\(\lambda\))?
    • TD(\(\lambda\)) 通常会在每次转移后立即更新所有相关状态的价值估计。这意味着算法可以在每一步都利用最新的反馈来改进自己的预测,而不是等到整个 episode 完成后再做一次性的修正。此外,由于资格迹的存在,即使某些状态可能不会再次出现在同一 episode 中,它们仍然有机会基于后续的发展情况进行适当的调整
    • 通过引入资格迹,TD(\(\lambda\)) 不仅能够有效地利用当前时间片的 TD error 来更新其他状态,而且还能够在不显著增加计算复杂度的情况下综合考虑所有步数的预测
    • 这种方法既保持了 TD(0) 的快速响应特性,又继承了 MC 方法在长序列上的准确性优势

RL——强化学习开源项目记录


本文主要介绍强化学习中的优质开源项目,包括OpenAI的baselines和SpinningUp,以及Google的Dopamine等

  • 参考链接:
    • 机器学习:Github上排名前19个强化学习 (RL)项目【附带源代码网址】
    • 强化学习(reinforcement learning)有什么好的开源项目、网站、文章推荐一下? - 互联网科技小于哥的回答 - 知乎

整体说明

  • 比较重点的项目是 OpenAI Spinning Up、OpenAI Baselines、Stable-Baselines3 和 AI4Finance-Foundation/ElegantRL 等
  • 初学者或研究者:
    • OpenAI Spinning Up(专为初学者打造, 同时支持 TensorFlow 1.x 和 PyTorch)
    • Baselines(Tensorflow 1.x)
    • Stable-Baselines3(SB3)(PyTorch【特别推荐这个,代码简单易懂】)
  • 金融领域:ElegantRL (也支持分布式训练)
  • 大规模工业化:Ray RLlib 和 Stable-Baselines3(SB3)

OpenAI Spinning Up

  • Spinning Up 是 OpenAI 推出的一个 RL 入门项目,为初学者打造;提供从基础到高级的 RL 教程,包含多个基线算法的实现,如 PPO、TRPO、DDPG 等,支持 OpenAI Gym 环境
  • Spinning Up 强调教育性,文档详细且易于理解,适用于学术研究中的基线算法对比

OpenAI Baselines

  • OpenAI Baselines 是 OpenAI 推出的 RL 库,提供多种经典 RL 算法的实现,包括 DQN、A2C、PPO、TRPO 等,支持 OpenAI Gym 环境
  • Baselines 适用于研究中的算法复现和性能对比(以 PPO 方法为例,Baselines给出了 atari,mujoco 环境的差异化示例,还提供 CNN 或 MLP的策略实现),是开发自定义 RL 算法的基线参考,但仅仅支持 Tensorflow 1.x,且不再有人维护
  • GitHub 仓库 : https://github.com/openai/baselines

Stable Baselines3(SB3)

  • Stable Baselines3(SB3)是一个基于 PyTroch 的开源 RL 库,是 Stable Baselines 的下一代版本,继承了前者的优势并进行了多项优化,目前广泛应用于学术研究、游戏 AI、机器人控制等领域
  • 社区相对前两个来说更加活跃,有人维护,偶尔会有更新
项目名称 核心功能 核心框架 特点 主要场景 维护状态 GitHub 仓库 官方文档
OpenAI Spinning Up RL 算法教学实现(PPO、TRPO、DDPG 等) TensorFlow 1.x/PyTorch 教育性强,文档详细 学术研究、RL 入门学习 维护中(20年后几乎不再更新) https://github.com/openai/spinningup https://spinningup.openai.com/
Stable-Baselines3 主流 RL 算法(PPO、A2C、DQN 等) PyTorch 稳定高效,文档完善 工程落地、需要稳定性的项目 活跃维护 https://github.com/DLR-RM/stable-baselines3 https://stable-baselines3.readthedocs.io/
OpenAI Baselines 经典 RL 算法(DQN、A2C、PPO 等) TensorFlow 1.x 代码清晰,支持 MPI 并行 算法复现、自定义算法开发 停止维护 https://github.com/openai/baselines -
Google Dopamine 深度强化学习算法(DQN、C51、Rainbow) TensorFlow 简洁快速,适合小规模实验 算法原型验证、教学 维护中 https://github.com/google/dopamine -
ElegantRL 连续控制算法(DDPG、TD3、SAC) PyTorch 金融场景优化,支持分布式训练 金融量化交易、大规模实验 维护中 https://github.com/AI4Finance-Foundation/ElegantRL https://elegantrl.readthedocs.io/
Ray RLlib 分布式与多智能体算法(PPO、IMPALA) PyTorch/TensorFlow 高性能,支持大规模并行(Ray框架)与 MARL 工业级应用、自动驾驶、机器人 活跃维护 https://github.com/ray-project/ray https://docs.ray.io/en/latest/rllib/index.html

RL——约束强化学习之PDO

本文主要介绍使用约束强化学习(Constraint RL)中的PDO(Primal-Dual Optimization)方法相关内容

  • 参考链接:
    • 【深度强化学习】Constraint RL for safe exploration:primal-dual optimization 算法 - XuanAxuan的文章 - 知乎

PDO 方法流程

  • PDO 方法主要用于解决解决CMDP问题
  • PDO 方法基本思路是构造拉格朗日函数后,使用梯度下降/上升方法依次迭代更新原始变量和对偶变量(更新原始变量时,对偶变量固定不变,反之依然)
  • 原始问题定义:建模为带约束最优化问题
  • 拉格朗日函数构造:引入拉格朗日变量
  • 按照如下流程迭代求解:
    • 固定对偶变量\(\lambda\)(可能有多个对偶变量,此时分别更新即可),使用梯度下降/上升法更新原始变量(参数)
      • 注:拉格朗日变量时可以分别独立更新的,拉格朗日函数关于他们各自的梯度均不会包含其他对偶变量
    • 固定原始变量(参数),使用梯度上升/下降法更新对偶变量

另一类镜像方法:CPO

  • CPO(Constraint Policy Optimization)是一类在每一步迭代中都求解一个精心设计的优化问题的方法,可以确保满足约束
  • TRPO在每一步中都在解一个约束优化问题,CPO则可以和TRPO求解融合,每一步迭代参数都确保满足指定约束
  • CPO vs PDO:CPO一般不如PDO效果好,且仅适配TRPO方法,PDO则可适配任意强化学习方法

其他说明

  • RCPO也属于一种PDO方法

RL——自然策略梯度法


整体描述

  • 自然策略梯度法(Natural Policy Gradient,NPG)本质是一种策略优化算法 ,主要应用于强化学习领域中
  • 自然梯度法的优点:
    • 迭代次数少
    • 稳定性强 (KL 散度限制范围)
    • 有严格理论支撑
  • 自然梯度法的缺点:
    • 计算复杂度高 (Fisher 信息矩阵的求解和存储)
    • 样本需求大 (准确估计 Fisher 矩阵需要大量样本)
    • 工程实现困难 (共轭梯度法等近似技巧需要精细调参,对算法实现要求较高)
  • 注:自然策略梯度法 的核心思路(信任区域约束)在 PPO,TRPO 等主流算法中被广泛应用

传统梯度的局限性与改进方向

传统策略梯度的问题

  • 传统策略梯度算法(如REINFORCE)直接沿梯度方向更新策略参数,公式为:
    $$\theta_{t+1} = \theta_t + \alpha \nabla_\theta J(\theta)$$
  • 但该方法更新时可能不稳定(步长敏感):不同参数的尺度差异可能导致更新步长不合理(如某些参数微小变化就会显著影响策略,而另一些则不然)

自然梯度的核心改进

  • 自然策略梯度通过引入Fisher 信息矩阵(Fisher Information Matrix, FIM) 对梯度进行“几何修正”
  • 自然策略梯度的优点:
    • 稳定性 :保证每次更新的策略变化幅度可控(如约束在固定步长内),提升优化稳定性;
    • 加速收敛 :加速收敛速度,尤其在复杂任务中效果更显著

从梯度到自然梯度

策略梯度与KL散度的几何关系

  • 设策略分布为 \(\pi_\theta(a|s)\) ,目标函数 \(J(\theta)\) 的梯度可表示为:
    $$\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a|s) Q^\pi(s,a) \right]$$
    • 其中 \(Q^\pi(s,a)\) 为状态-动作价值函数
  • 自然梯度的关键在于考虑参数更新 \(\delta\theta\) 引起的KL散度变化:
    $$KL(\pi_\theta || \pi_{\theta+\delta\theta}) \approx \frac{1}{2} (\delta\theta)^T F(\theta) \delta\theta$$
    • 其中 \(F(\theta)\) 为Fisher信息矩阵 ,定义为:
      $$F_{ij}(\theta) = \mathbb{E}_{\pi_\theta} \left[ \nabla_{\theta_i} \log \pi_\theta(a|s) \nabla_{\theta_j} \log \pi_\theta(a|s) \right]$$

自然梯度的定义与求解

  • 自然梯度 \(\nabla^{nat}_\theta J(\theta)\) 是在约束 \(KL(\pi_\theta || \pi_{\theta+\delta\theta}) \leq \epsilon\) 下,使目标函数增长最快的方向,数学上等价于:
    $$\nabla^{nat}_\theta J(\theta) = F(\theta)^{-1} \nabla_\theta J(\theta)$$
  • 该式通过求解线性方程组 \(F(\theta) \delta\theta = \nabla_\theta J(\theta)\) 得到更新方向

算法流程与实现要点

标准自然策略梯度算法步骤

  • 第一步-数据收集 :用当前策略 \(\pi_\theta\) 与环境交互,采集轨迹数据 \(\{(s_t, a_t, r_t)\}\)
  • 第二步-计算策略梯度 :根据数据估计 \(\nabla_\theta J(\theta)\)
  • 第三步-构建 Fisher 信息矩阵 :通过采样或近似方法计算 \(F(\theta)\)
  • 第四步-求解自然梯度 :解线性方程组 \(F(\theta) \delta\theta = \nabla_\theta J(\theta)\) ,得到更新方向
    • 理解:对线性方程组的理解
      • 这里的 \(\nabla_\theta J(\theta)\) 是第二步中估计出来的,是已知的,所以这里是在求解线性方程组
      • 这里线性方程组的解就是 \(\delta \theta\),也就是下面第五步中参数更新的方向
  • 第五步-参数更新 :按约束步长(如 \(\delta\theta^T F(\theta) \delta\theta \leq \epsilon\) )更新参数 \(\theta\)
  • 第六步-迭代优化 :重复上述过程直至收敛

关键实现技巧

  • Fisher信息矩阵的近似 :直接计算 \(F(\theta)^{-1}\) 在高维场景中计算量极大,常用方法包括:
    • 共轭梯度法(TRPO的做法):迭代求解线性方程组,避免显式求逆;
    • KL散度约束 :用线搜索(Line Search)或信任区域(Trust Region)方法限制更新步长,保证稳定性(如TRPO算法即基于此思想)
  • 价值函数估计 :通常结合优势函数(Advantage Function) \(A^\pi(s,a)\) 优化,减少方差(如 \(Q^\pi(s,a) \approx V^\pi(s) + A^\pi(s,a)\) )

一些相关 RL 方法的对比

  • NPG 与 TRPO 等常见 RL 方法的对比
    算法 关键点 复杂度 稳定性
    REINFORCE 直接使用梯度更新,步长依赖学习率 低 差
    NPG(自然策略梯度) 引入 Fisher 信息矩阵修正梯度方向 高 高
    TRPO(信任区域策略优化) 是自然梯度的工程化实现,用共轭梯度法近似求解 Fisher 信息矩阵的逆 中高 极高
    PPO(近端策略优化) 自然梯度思想的简化实用版本,是 TRPO 的简化版本,计算更高效 中 高

RL——强化学习相关笔记


为什么 off-policy 的方法在于不与环境交互时效果不好?

  • 注:理论上,off-policy 的方法对收集样本的行为策略没有要求,但实际上,行为策略与目标策略不同可能导致外推误差问题,具体包含下面三个部分
  • Absent Data: 数据集中可能存在某些状态是从来没有出现过的
    • 某些 state-action 对的缺失会导致在该状态和动作上的错误估计
  • Training Mismatch: 离线训练数据的分布和强化模型线上serving时的分布不一致
    • 用于更新网络的状态分布需要满足当前策略对应的分布(即使所有状态动作都见过,没有Absent Data问题,也可能因为分布不同而导致问题),否则会导致线上线下状态分布不一致。可能导致训练效率低下,甚至模型关注一些不重要的状态动作(可类比CTR模型样本分布最好是线上线下一致的)
  • Model Bias: 数据集本身可能分布与MDP分布不一致
    • 这里主要指在随机MDP中,数据集本身与MDP分布不一致(这里主要指与策略无关的部分,比如数据集中 \(P(s’|s,a)\) 无法准确表达真实环境)

强化学习中外推误差和OOD问题的区别【TODO:待补充】

  • 外推误差(Extrapolation Error)问题在强化学习场景中的定义:off-policy值学习中,当前策略真实状态动作访问分布和数据集中的状态动作分布不匹配导致的一种误差,具体来说,包括Absent Data(状态动作对缺失),Training Mismatch(训练预测分布不一致),Model Bias(随机MDP的状态转移概率有偏差)等问题
  • OOD(Out of Distribution)问题在强化学习场景中,更倾向于数据缺失(Absent Data)问题
  • 总结:外推误差可以是Absent Data,Training Mismatch,Model Bias等原因共同导致的,而OOD倾向于特指其中最常见的一种问题(Absent Data问题)

为什么Online RL中不能使用BN?

  • 参考链接:
    • 强化学习需要批归一化(Batch Norm) 或归一化吗?
    • [5分钟深度学习] #06 批量归一化 Batch Normalization
  • BN能work的主要原因是,每个Batch的数据是从整体数据中随机采样得到的,每个Batch的均值和方差不会差别太大
  • 在Online RL中,随着Agent的探索,数据分布一直在变化,进入模型的不同Batch无法保证能代表整体样本,随着Agent的迭代数据分布逐步变化,模型来不及学到固定的均值和方差,导致无法收敛
  • Offline RL中,数据是提前固定的,则没有这个问题,所以Offline RL中,可以使用BN
  • 实际上,可以分场景尝试,在一些状态变化不剧烈的场景中,BN也是可以使用的,大部分场景中则建议使用LN

为什么DQN/Q-learning不需要重要性采样?

  • 事实 :DQN有Reply Buffer,使用了其他策略收集到的样本,但是不需要重要性采样
  • 解释1 :DQN是是Q-learning的神经网络实现,Q-learning方法是基于贝尔曼最优方程的,最优价值函数是关于状态转移分布的期望值,而不是关于策略分布的期望值(默认是按照当前最优策略进行决策),所以不需要重要性采样
  • 解释2 :因为DQN是贝尔曼最优公式推导得到的,在推导和收敛性证明过程中,不涉及任何的策略数据采样分布要求,只要求计算下个状态Q值用的Q网络是上次迭代的值即可
  • 其他说明 :对于状态-动作分布的问题,实际上DQN也最好是使用当前策略采样的数据,原因是更能保证线上线下一致性;此外,在Offline RL场景中直接使用DQN可能因为没有探索而出现OOD等问题
  • 注 :如果使用n-step奖励进行学习,实际上不能满足中间步骤都是当前最优策略(可能有随机探索概率存在),但一般也忽略这个问题

D-Learning中,Q值高估现象及其导致的问题

  • Q-learning(以及 DQN 等基于 Q-learning 的算法)中的最大化操作(maximization operator),简单可以理解为以下:
    • 最大化操作本身的偏置(Maximization Bias)导致高估
    • 函数逼近误差(Function Approximation Error)进一步加剧高估
  • 这种高估往往服从不均匀的误差分布(Non-uniform Error Distribution),即部分动作高估,部分动作低估
    • 离线强化学习中,越没有见过的动作越容易被高估,因为其他动作会被数据集中的数据更新
    • 理解:如果是所有动作都相同程度的高估,实际上问题不大,依然能选到最优动作
    • 在线强化学习中,不均匀的高估可能降低收敛速度,导致策略往次优动作上尝试
  • 实践中常用 Double DQN 或 Twin Q 的思想来减少高估问题;离线强化学习中则常常会特别关注Q值高估问题(比如CQL)

Policy Gradient 方法为什么不需要访问状态转移方程?

  • 为什么传统方法需要状态转移方程?
    • 以策略迭代(Policy Iteration)或价值迭代为例:
      • 它们的核心是求解 Bellman 期望方程:这里必须用到 \(P(s′∣s,a)\)(状态转移概率),因为要计算下一个状态的期望价值
  • 为什么策略梯度法不需要状态转移方程?
    • 实际上,策略梯度法时通过直接求解 RL 目标对当前策略的 梯度 来逐步逼近最优解的,所以不需要状态转移方程
    • 也可以理解为,策略梯度法本身需要采样轨迹,采样轨迹时,本质已经隐含估计了环境的状态转移过程了

Policy Gradient 方法为什么不需要访问所有 Action 求积分?

  • 传统的 RL 方法,包括策略迭代和值迭代方法,都需要借助对 Action 积分而实现对当前策略下价值的估计(贝尔曼期望方程)
  • 策略梯度法本身通过采样来实现对梯度的估计,不需要访问所有的动作了求价值期望了(Actor Critic 方法中的 Critic 也是通过普通的价值网络直接估计的,不需要访问所有动作)
  • 补充:其实 Q-Learning 方法,比如 DQN 中,实际上也需要在所有动作空间上计算 argmax,本质也是包含了所有动作的访问(而不是像策略梯度法一样的采样)

Q网络的更新应该是软更新还是硬更新?

  • DDPG,BCQ连续版本等连续动作模型的Q值:软更新
    • DDPG论文中提到,使用这种软更新的方式,模型参数和对应的Target值都会缓慢的被更新,有利于保持学习的稳定性
  • DQN,BCQ离散版本等离散动作模型的Q值:硬更新
  • 问题:是因为BCQ本身就是基于以上两个模型实现的吗?(TODO)
  • 在DQN中目标网络两种常见更新方法对比有针对硬更新和软更新在DQN上分别尝试效果:

    实验结果表明,当目标网络更新间隔 \(C\) 和软间隔更新系数 \(\tau\) 满足 \(\tau C = 1\) 时,DQN算法使用这两种目标网路更新方式的性能是相当的


on-policy和off-policy方法简单对比?

  • 下面是网上经常有人引用的一句话:

    on-policy优点是直接了当,速度快,劣势是不一定找到最优策略。off-policy劣势是曲折,收敛慢,但优势是更为强大和通用

  • 个人理解,这句话前半段关于on-policy本身需要在某些特定场景下才准确,分析如下:
  • “on-policy优点是直接了当,速度快,劣势是不一定找到最优策略。”
    • 为什么说速度快?对训练数据利用不足本身就会导致收敛慢吧?:这里说的速度快是训练时能够直接训练当前策略收集到的状态动作下的值(Q值或策略),直接更新当前策略收集到的状态动作对,可能导致策略快速收敛到局部最优,特别是当探索不充分时,off-policy则不然
    • 不一定找到最优策略的理解:1)由于 on-policy 要求收集数据的行为策略(需要权衡探索和利用)和待优化策略是同一个策略,所以不能过于探索,否则最终学习到的策略不好,从而需要降低探索,减少探索以后导致容易陷入局部最优;2)仅更新当前策略收集到的状态动作对,导致模型快速收敛到某一个局部环境中,再也出不来
    • 理解:on-policy采用初期增加探索,后期减少探索的方式会更好,比如SARSA的更新过程中 \(\epsilon\) 越来越小
  • 实际上,从探索和利用的视角看,无论是off-policy和on-policy方法,在训练足够的时间以后,策略都会逐步利用收集到的知识收敛到一个特定的策略,而不再重视探索:
    • 也就是说在训练过程中 ,策略会越来越倾向于利用而不是探索 ,所以容易陷入局部最优解
    • 一种思路是将策略的熵添加到目标中或损失函数中,从而尽可能的保证策略始终在探索(比如SAC)

为什么DDPG/SAC是off-policy的?

  • DDPG/SAC是off-policy的,原因如下:
    • Q函数的学习 :DQN、DDPG和SAC三者本质都是基于贝尔曼最优公式迭代Q值的,其中DDPG的策略迭代是最大化Q值,SAC的策略迭代则是最大化Q值和策略对应的熵;他们是off-policy的原因一样的,是因为Q函数都是在学习某个策略 \(\pi_0\) 下对应的Q值,只要TD-Error中的Q值目标 \(r(s,a)+\gamma Q(s’,a’) - Q(s, a)\) 中的 \(a’\) 是策略 \(\pi_0\) 采样的 ,即目标值动作服从策略 \(a\sim\pi_0(\cdot|s’)\)的 即可保证学到的Q值是 \(Q^{\pi_0}(s,a)\),与 \((s,a,s’)\) 本身的采样策略无关(但是最好与当前策略的状态分布差距不要太大,否则容易出现线上线下分布不一致等问题)。随着策略逐步提升到最优策略,Q函数也会收敛到最优策略对应的Q值
      • 注:SAC的Q函数是包含了熵信息的,但这不影响Q值本身的学习策略
    • 策略的学习 :在保证Q函数预估的是当前策略(即截止到目前的最优策略)对应的Q值以后,我们只需要求解一个策略,保证当前策略对应的动作分布下的Q值最大即可,此时有:
      • DDPG :目标是找到一个确定性策略 \(\pi_\theta(s)\),最大化 \(Q(s,\pi_\theta(s))\) (本质可以理解为Q值在策略下的期望 \(\pi_\theta(s)\),确定性策略的期望就是这个策略对应的Q值),可采用梯度直接回传的方式链式求导;
      • SAC-连续动作 :通过随机采样生成动作 \(\tilde{a}\) (重参数法),然后将基于状态动作生成 \(Q(s,\tilde{a})\),从最大化Q值实现梯度传到到策略参数上(本质上是最大化Q值在策略分布上的期望)
      • SAC-离散动作 :则通过玻尔兹曼分布直接得到一个Q值下最优的随机策略(离线动作),具体实现时先生成不同动作下的Q值 \(Q(s,a)\),求Q值在策略 \(\pi(a|s)\) (本质是一个分布)上的期望 \(\sum_a \pi(a|s)Q(s,a) \) (与连续版本本质一致),然后最大化这个期望以实现梯度传导到策略参数上
      • 注意:DDPG/SAC等方法中 ,策略学习的目标是找到使得当前 \(Q(s,a)|a\sim\pi_\theta(s)\) 值最大的策略 \(\pi_\theta\),学习时状态 \(s\) 是从什么策略采样来的无关,即任意给我一个状态 \(s\),目标策略都能使得该状态下的 \(Q\) 值最大化(这里的Q值在学习中拟合目标是在当前策略下的Q值);但普通的AC方法中 ,Actor是直接对Reward的期望求梯度来更新的,这个期望是需要在当前策略下的期望,故而状态和动作都需要是当前状态下采样得到的,否则梯度有偏,而DDPG/SAC中则因为直接最大化Q值(该Q值是当前策略下的Q值)来实现了,绕过了必须保证状态 \(s\) 是当前策略采样得到的这一步了
  • PPO/TRPO是on-policy的,原因则是因为他们每一步的迭代目标是直接找到一个能提升RL代理函数 \(J\) 的更优策略 ,每次迭代都保证策略优于当前策略,在推导过程中,使用MM方法构造代理函数时,要求状态分布于新策略的状态分布差异不能太大 ,最好是当前策略采样的数据更新,生成新策略;(注意,动作分布部分有重要性采样保证,只要能保证准确记录每个动作采样的分布即可通过重要性采样方式恢复)

为什么SARSA和DQN都可以收敛到最优解?

  • 两者的Q值目标都可以表述为: \(r(s,a)+\gamma Q(s’,a’) - Q(s, a)\),两者的 \(Q(s’,a’)\) 都是上一轮的 \(Q\) 值(一般也会使用Q的目标网络 \(Q_{\bar{\theta}}(s’,a’)\),但含义就是上一轮的Q的含义),但两者的 \(a’\) 值对应的策略不同
  • SARSA:
    • 更新目标 : \(a’\) 是按照当前Q值对应的 \(\epsilon\) -Greedy策略采样的(该动作大多以大概率取 \(a’\sim \mathop{\arg\max}_{a’} Q(s’,a’)\),并以一定的小概率随机采样)
    • 样本状态动作分布 :当前策略采样到的状态分布 \(s,a,s’\)
    • 在随机采样概率越来越小的情况下,SARSA最终可以收敛到最优策略
  • DQN:
    • 更新目标 : \(a’\sim \mathop{\arg\max}_{a’} Q(s’,a’)\),相当于没有 \(\epsilon\) -Greedy策略
    • 样本状态动作分布 :历史行为策略采样到的状态分布 \(s,a,s’\)
  • 注意: \(Q(s’,a’)\) 需要是上一轮的Q,才能收敛,不动点定理证明时, \(Q(s’,a’)\) 是上一轮的Q的情况下,可得到最终 \(Q(s’,a’)\) 的Q和 \(Q(s,a)\) 的Q收敛到同一个Q

V值更新如何保证学习到指定策略?

  • V值更新的目标都可以归纳为: \(r+\gamma V(s’) - V(s)\),其中 \(V(s’)\) 是上一轮的V网络,一般使用目标网络 \(V_{\bar{\theta}}(s’)\)
  • \(r\) 来源于什么策略 \(r(s,a)\vert_{a\sim \pi(\cdot|s)}\),V值学习的就是什么策略

对奖励函数进行仿射变换会影响强化学习最优策略吗?

  • 对奖励函数进行放射变化,不影响最优策略(最优价值函数会跟着发生相应的仿射变换),即最优策略不变(Optimal Policy Invariance)
  • 证明:若奖励仿射变换为\(r_t = k \cdot r_t+b\),则最优价值函数仿射变换为
    $$ Q^* = k\cdot Q^* + \frac{b}{1-\gamma} $$
    • 显然Q值对应的最优策略不会发生改变

离散动作、连续动作的使用场景辨析

  • 一般来说,Q-Learning相关方法(DQN等为代表)仅支持离散动作,策略梯度相关大部分方法(SAC、PPO为代表)支持连续动作和离散动作,有部分(DDPG等为代表)仅支持连续动作
  • DDPG本质是不支持离散动作的,但是如果基于DDPG学到的Q网络做离散化动作搜索,也可以作为一种策略(次优策略)
  • PPO和SAC中均需要使用某个动作下对应的概率,连续动作下实际上概率值是0,连续动作的概率值使用的是概率密度值
    • 注:概率密度值(Probability Density Value)是连续概率分布中的一个核心概念,用于描述随机变量在某个特定点附近的相对可能性
  • Google 2018年提出的QT-Opt方法,在连续动作场景中学习Q值,然后使用CEM(Cross Entropy Method)从Q值中提取连续动作

随机策略、确定性策略的使用场景辨析

  • 随机性动作 :策略效果会有波动、能防止某些特定场景(状态观测不全面时)陷入死循环的问题、可解释性和安全性会偏低
  • 确定性动作 :策略效果更稳定、在状态观测不全面时可能陷入死循环、可解释性和安全性也更高些、更利于探索(确定性策略在训练时往往也需要加入随机探索)
    • 状态观测不全面导致陷入死循环的示例:
      • 环境状态情况:
        • o o o o o
        • x x ✓ x x
      • 对应的最优策略应该如下(第二和第四个点观察到的周围状态环境相同,但是最优策略不同):
        • → → ↓ ← ←
        • x x ✓ x x
      • 以上状态中,假设每个点只能观察到上下左右随机相邻点和自己的情况,那么第一行的第二和第四个点状态相同,此时按照确定性策略决策一定陷入循环(因为第一行的第二和第四个点策略必须相同,如论向左还是向右都会出现循环)
      • 这个例子可以用来帮助解释LLM中使用确定性策略(取概率最大的动作)容易陷入循环,产生大量重复的token,LLM中原始token被压缩后不算是状态观测完全的了,此时按照决策确定性容易陷入循环(此时会在相似的压缩空间下输出完全相同的token),加入随机反而使得生成的文本更正常
      • 其他理解:Diffusion中生成是需要采样是不是也是类似LLM的原理?
  • 二者的转换(所有转换方法均会不同程度的影响最优策略,不再是最优决策):
    • 随机策略转确定性策略:1)不直接采用Actor,通过搜索期望奖励最大的动作(连续动作可按照一定的间隔来搜索);2)直接使用Actor,找概率最大的动作(连续动作也有概率最大的动作,高斯分布对应取均值)
    • 确定性策略转随机策略: \(\epsilon\) -Greedy(离散动作)或者加一个方差扰动(连续动作)即可
  • 强化学习的最优解应该是随机策略还是确定性策略?
    • 清华李升波书籍Reinforcement Learning for Sequential Decision and Optimal Control中第六章确定性策略最优的证明和策略建模选型表述(见清华大学李升波教授强化学习书籍《Reinforcement Learning for Sequential Decision and Optimal Control》读书笔记——U6函数近似间接RL)

      在训练阶段,应该使用随机策略,因为这样可以更好地探索环境;而在评估阶段,应该使用确定性策略,因为最优策略总是一个确定的策略

      • 最优策略是确定性策略 ,证明:对于任意给定的状态 \(s\),有 \(\int_a \pi(a|s) q^*(s,a) d a \le q^*(s,a^*) \),其中 \(a^* = \mathop{\arg\max}_a q^*(s,a)\)
    • 个人理解:以上描述基本没有问题,但是加一些限定说明会更准确:
      • 状态观测完全的情况下,才可以说最优策略是确定性策略 :假设状态不是完全观测的,可能出现观测值相同,但实际上状态不同的情况,此时同一个部分观测状态对应的最优动作不再是唯一的)
      • 最优动作不唯一时,最优策略也可以是随机策略 :可能存在两个同时最优的确定性策略(决策的不同动作拿到相同的Q值),此时最优策略也可以是随机策略(即最优策略的混合策略)
      • 对于约束优化问题,可能最优策略是随机策略 :如果需要保证动作决策符合某个约束,该约束不在Reward中体现(即Q值无法体现约束),此时可能需要使用随机策略才能保证约束被满足(比如要求决策动作的期望满足一定均值约束,则不能总是执行Q值最大的策略;这里类似于状态不完全观测的情况,假如约束以及约束满足情况可以建模在Reward或者状态中,则可以看成是状态完全观测的情况,此时最优策略也是确定性策略)
      • 理论上,随机策略的搜索空间大于等于确定性策略 :理论上,随机策略可以学出来以概率1执行某个动作,按照随机策略建模也可以学到确定性策略;实际上,随机策略很难真正学到以概率1执行某个动作
      • 对于on-policy场景,需要保证行为策略和学习策略相同,故而无法实现学习策略是确定性策略,行为策略是随机性策略,实际操作中,可以开始引入随机策略,后续逐步变成确定性策略,比如SARSA策略
      • 对于Reward中包含策略熵的方法,无法使用确定性策略(加入熵是避免过拟合,增加探索,确定性策略容易过拟合,其探索性不足)
      • 为何许多优秀的模型都是随机策略模型?因为:1)建模时难以保证观测完全;2)随机性策略能探索到更多状态;3)随机策略不容易过拟合(在对Q估值无法很准确的时候,确定性策略容易过拟合)
  • 补充:关于书籍《Reinforcement Learning for Sequential Decision and Optimal Control》的博客
    • CSDN-StarMelt-清华大学李升波教授强化学习书籍《Reinforcement Learning for Sequential Decision and Optimal Control》系列读书笔记
    • 知乎-StarMelt-清华大学李升波教授强化学习书籍《Reinforcement Learning for Sequential Decision and Optimal Control》读书笔记
  • 在SARSA和Q-learning中,为了确保智能体能够在学习过程中充分地探索环境,并且最终收敛到最优策略,策略更新方法需要满足GLIE(Greedy in the Limit with Infinite Exploration,在无限探索极限下的贪心)策略,该策略包括两个特性:
    • 无限探索 :这意味着对于任何状态-动作对(s, a),智能体都有机会以非零的概率去尝试它(不会错过最优策略)
    • 渐进贪心 :随着学习过程的推进,智能体逐渐减少对非最优动作的选择
    • GLIE的一个实现是 \(\epsilon\) 逐渐减小的 \(\epsilon\)-Greedy ,比如可以设定 \(\epsilon = \frac{1}{t}\)

off-policy AC目标和on-policy AC目标等价吗?

  • off-policy AC方法的目标都是类似形式: \(\max_\pi \quad \mathbb{E}_{s\sim \rho^{\beta}(s)}[V^{\pi}(s)]\)
    • 基本含义就是,找一个最优的策略 \(\pi\),使得 \(V^{\pi}(s)\) 在行为策略的状态访问分布下期望最大
  • 实际上,on-policy AC方法的目标是类似形式: \(\max_\pi \quad \mathbb{E}_{s\sim \rho^{\pi}(s)}[V^{\pi}(s)]\)
    • 基本含义就是,找一个最优的策略 \(\pi\),使得 \(V^{\pi}(s)\) 在 策略 \(\pi\) 的状态访问分布下期望最大
  • 答案是如果策略空间包含所有策略,则两者等价,否则不等价 :
    • 如果策略模型空间是无限大的,一定存在最优的策略 \(\pi^*\) ,使得任何一个状态 \(s\) 下都有 \(V^{\pi^*}(s) \ge V^{\pi}(s), \forall{\pi}\) 成立,证明是:对于任意给定的状态 \(s\),有 \(\int_a \pi(a|s) q^*(s,a) d a \le q^*(s,a^*) \),其中 \(a^* = \mathop{\arg\max}_a q^*(s,a)\),此时,我们定义一个策略为:对任意状态 \(s\),都取该状态下的 \(a^*\) 即可
    • 如果能找到一个最优的策略 \(\pi^*\),使得在任何一个状态 \(s\) 下都有 \(V^{\pi^*}(s) \ge V^{\pi}(s)\) 成立,那么,我们找到策略 \(\pi^*\) 就同时是off-policy和on-policy的最优解
      • 这种情况下,如果能找到 \(\pi^*\),则两者等价(注意:即使存在 \(\pi^*\),模型也不一定能学到,如果在off-policy和on-policy设定下学到的难度不同,甚至策略模型空间受限,拟合不了最优的策略 \(\pi^*\),也不能说两者目标等价)
    • 如果模型空间限制导致模型空间中找不到一个最优的策略 \(\pi^*\),使得在任何一个状态 \(s\) 下都有 \(V^{\pi^*}(s) \ge V^{\pi}(s)\) 成立,那么,策略的选择就会根据状态访问分布有所取舍,更倾向于状态分布概率高的那部分状态,off-policy AC方法的目标与on-policy AC目标一定不等价,在状态分布不同的情况下,找不到一个共同的最优解 \(\pi^*\)
      • 此时,两者不等价,行为策略中出现越多的状态,越收到重视
    • 现实生活中,SAC和DDPG为什么可以正常运行且拿到不错的收益呢?
      • off-policy方法本身样本利用率更高些
      • SAC和DDPG都是在off-policy中使用,如果即时丢弃过早的数据,那行为策略分布和最优策略差异不会太大,且online的训练确保了模型见过几乎所有状态
      • 大部分场景中,只要策略模型空间够大,应当都可以认为存在最优的策略 \(\pi^*\),使得在任何一个状态 \(s\) 下都有 \(V^{\pi^*}(s) \ge V^{\pi}(s)\) 成立,或近似成立
  • 如果这里模型找不到最优的策略 \(\pi^*\),则这个问题和DQN的问题还不等价,DQN主要问题是训练模型时存在off-policy导致的线上线下分布不一致的问题,off-policy AC从目标上就存在线上线下不一致的问题,同时训练模型时也有线上线下不一致的问题(都是线上线下不一致,但是off-policy AC还多了目标上的不一致,是从根本上定义导致的偏差,理论上更严重些)

TRPO可以用确定性策略建模吗?

  • 不可以,理由是无法进行重要性采样了,无法推导出TRPO的更新公式,从这个视角看,PPO和TRPO都不可以

为什么A2C算法不需要目标网络(Target网络)?

Target Critic网络的作用和成本

  • Target Q 或 Target V 网络的引入主要优点是:防止网络波动
    • DQN初始的Target Q网络 :用于固定网络参数,防止Q网络更新的时候目标也一直发生改变,训练不收敛
    • 注:Double DQN(DDQN)中还有其他作用 :具体做法是从当前策略选动作,从Target网络取Q-value,缓解DQN的Q值高估问题(注意:DDQN相对普通DQN不需要增加网络)
  • Target Q 或 Target V 网络的引入主要有两个成本 :模型结构复杂,存储和计算成本增加、收敛速度慢
    • 模型结构复杂,存储和计算成本增加 :需要多维护一个网络,存储和计算成本都会增加
    • 收敛速度慢 :Target网络意味着延迟更新,让模型更稳定的同时,也会导致模型收敛速度变慢
  • 一般来说,需要Target Q/V 网络的地方都是为了防止网络波动 ,这种网络波动一般来自于自举(bootstrap)(比如来自贝尔曼方程更新中存在自举现象)
    • SAC(2V+2Q+1策略)的版本中,V网络更新依赖Q网络,Q网络更新依赖V网络,所以增加一个Target V网络,防止学习目标频繁波动导致Q网络波动
      • 注:Q网络是Twin Q网络,不是Target Q网络
    • SAC(4Q+1策略)的版本中,Q网络更新依赖Q网络自身,所以增加一个Target Q网络,防止学习目标频繁波动导致Q网络波动
      • 注:4个Q网络是2个Twin Q网络及他们两各自对应的Target Q网络
    • DDPG中,Q网络的更新依赖Q网络自身

为什么A2C/PPO算法存在自举也不需要Target Critic网络?

  • PPO的Critic网络更新分为几种
    • 仅使用累计收益的场景:V网络的更新不依赖V网络,V网络的学习是个普通的、基于收集到的Reward标签的监督学习,不存在自举现象,所以不需要使用Target V网络。如果使用Target V网络反而会增加存储和计算成本并降低收敛速度
    • 使用TD-Error的场景:将TD-Error \(r_t + \gamma V(s_{t+1}).detach() - V(s_t)\) 作为V网络的损失函数,此时则会出现自举现象,此时可以考虑使用Target V网络,但收敛速度会变慢
      • 注:经测试,此时使用Target V网络会导致训练速度变慢。说明在PPO中,即使存在自举现象,V网络也不会频繁波动(这不仅仅是因为on-policy,还跟PPO算法有关,因为SAC和DDPG在on-policy场景下也需要Target Q网络)
  • TODO:为什么A2C/PPO即使使用了TD-Error作为损失函数(存在自举现象),也不需要Target Critic网络?
    • 猜想1:因为V网络更新不敏感?Q网络更敏感?(注:SVC的V网络版本,本质也是为了防止Q值目标波动太快?)
    • 猜想2:因为DQN、DDPG和SAC都包含贝尔曼最优算子/公式的思想,而PPO/A2C不包含?

需要/不需要Target网络的本质原因

  • 结论:因为DQN、DDPG和SAC都包含贝尔曼最优算子/公式的思想,而PPO/A2C则不包含贝尔曼最优算子/公式的思想
  • 贝尔曼最优算子/方程下,自举更容易导致波动,目前需要使用Target网络的模型有,DQN,DDPG,SAC
    • DQN :相当于每一轮训练完Q网络以后,自动存在一个最大化当前Q值的最优策略,即使得当前策略下,Q值最大化;
    • DDPG :本质与DQN类似,也是学习一个Q网络以后,用策略网络学习一个确定性策略使得当前策略对应的Q值最大化,没有直接使用,但隐含了贝尔曼最优算子/方程的思想;
    • SAC :可以看做是DDPG的随机策略版本,本质也是一样的,学习到一个Q以后,使用策略网络去学习一个随机性策略使得当前随机策略下,Q值最大化;
    • 以上三者的Target目标 \(Q(s’,a’)\) 都隐含了最优策略对应的动作 \(a’ \approx \arg\max_{a’} Q(s’,a’)\)
  • 而PPO和A2C方法都没有贝尔曼最优策略的思想,他们的更新都是通过策略梯度法推导的梯度公式得到的,策略更新的目标也不是直接最大化当前Q值,而是借助Q值计算梯度,从而提升策略自己
    • 注:其实PPO和A2C策略的更新都会跟Q值或者A值(与Q值相关)有关,但PPO和A2C方法更新策略时不是直接最大化Q值的,而是借用Q值作为一个梯度权重,所以不能算是隐含了贝尔曼最优算子/公式的思想

其他说明

  • 一些文章也会提到PPO中也可以使用Target V网络来实现慢更新,或者使用Clip操作,以帮助稳定训练

一些相关的实验测试现象及结论

  • 现象1 :on-policy场景+PPO/A2C,使用 Target V 网络后,最终结果也可以收敛(且足够长的步骤后能收敛到最优策略),但是收敛速度变慢了(\(\tau\)值越小,收敛越慢)
    • 注意 :PPO不能直接改成 off-policy 训练 ,计算GAE需要每次得到的都是有序的一个episode才可以!off-policy 的样本状态之间不是同一个episode的有序结果(off-policy算法一般仅需要考虑一步 return 即可)
  • 现象2 :off-policy场景+SAC/DDPG,如果不使用 Target Q 网络(或 Target Q 网络更新速度(\(\tau\))值过大),都会导致DDPG效果非常差(其中SAC稍好一些)
  • 现象3 :on-policy场景+SAC/DDPG,如果包含 Target Q 网络 ,使用 on-policy 方法训练能收敛到好的模型(10-100倍episode内,不如off-policy的效果,但有收敛趋势),但需要的 episode 数量远远大于 off-policy 的训练方式;
  • 现象4 :on-policy场景+SAC/DDPG,如果去掉Target Q网络(或者调大Target Q网络更新速度) ,使用 on-policy 方法训练都无法收敛到好的模型(比随机效果好一些,然后一直在一个比较差的为止波动,学不到更多东西)
    • 注:此时还能观察到SAC和DDPG的target_value值是收敛到一个较差的值,持续在较差的位置波动,不收敛,方差较大(注:理解是因为Q网络波动,导致策略一直没学好,进而导致收集不到好的样本,Q网络也就学不好了);相比之下,正常的强化学习模型训练下,target_value值的值都应该是缓慢上升并最终收敛的过程(注:中间可能会先掉下来,但是最终肯定是缓慢收敛的,且收敛后方差较小)

Actor Critic框架中,网络参数应该共享吗?

  • 本质上可以将Actor和Critic两个任务类比为监督学习中多任务学习的模型,共享层能互相利用对方的信息,也容易被两个任务的梯度互相干扰,下面是一些通用的经验:
    • 应该共享的:稀疏高维的参数层,比如 Embedding 层可以共享,此时两者可以互相弥补在高维上的稀疏
    • 不应该共享的:稠密的参数层
  • 实际使用中还是以实验结果为准,不同场景效果不同

为什么强化学习训练总是不稳定?

  • 强化学习中的一个不稳定来源是:因为强化学习训练过程中策略一直在变化,状态分布也会随着策略不断变化
  • 特别地,强化学习中同时出现下面三个因素(也称为强化学习稳定性死亡三角(Deadly Triad Issue))时,更容易导致强化学习训练不稳定
    • 函数近似(Function Approximation) :函数近似能够处理大规模或连续状态空间的问题,但它会引入估计误差,导致值函数偏离真实值
    • 自举(Bootstrapping) :自举提高了计算和样本效率,但会导致估计值依赖于其他估计值,从而可能产生不一致性和震荡
    • 异策略训练(Off-policy Learning) :离策略学习可以利用历史数据(如经验回放),提高样本利用率,但可能导致目标策略与行为策略的分布不匹配,从而引入方差增大和收敛性问题
    • 总结:函数近似引入误差,自举放大误差,异策略训练使误差在策略不匹配的情况下进一步恶化,当三者同时出现时,误差会不断累积,导致值函数估计偏离真实值,最终使训练过程崩溃
  • 如何缓解“死亡三角”问题?
    • 目标网络(Target Networks) :在DQN中引入目标网络,稳定Q值的更新
    • 经验回放(Experience Replay) :减少样本间的相关性,使训练更稳定
    • 同策略学习(On-policy Methods) :如PPO、A2C,避免离策略带来的分布偏移问题
    • 正则化方法 :如保守Q学习(CQL),约束Q值估计范围,防止过度外推
    • 多步TD学习(n-step TD) :平衡自举和蒙特卡罗方法的优缺点,提高稳定性

为什么DDPG/TD3有Target Actor网络,而PPO/SAC没有?

副标题:什么场景下需要Target Actor网络?

  • DDPG/TD3需要用到当前策略来取下一个状态的动作来评估Q网络TD目标,此时使用的是Target Actor网络;
    • DDPG原始论文中提到,DDPG中Target Q和Target Actor网络都是必须的,有利于保证训练不发散(即训练稳定,直观理解是,如果策略被更新的同时也用来计算Q网络的TD目标,可能导致目标来回波动,网络不收敛的现象);当然,论文中提到这种设置可能导致训练收敛慢一些,但是稳定性的收益超过了这个地方
  • PPO/SAC也需要用到当前策略来取下一个状态的动作来评估Q网络TD目标,为什么不需要Target Actor网络呢?
    • SAC离散版本下,是通过采样动作来影响目标Q值的,不直接影响目标Q值;
    • SAC连续版本下,Actor网络看似是直接输出动作,且参与目标Q值计算的,但实际上是经过采样的(重参数化采样 ,可以回传梯度的采样方式)
    • PPO离散版本和连续版本下,均只需要学习V值,理论上Actor网络仅参与采样动作与环境交互,不参与生成目标V值
  • 总结:增加Target Actor网络的成本是学习会变慢;优点是学习会更稳定

什么场景下需要Twin Q网络?

  • Q值/V值更新时,如果用到Q网络,则需要使用Twin Q网络,可以降低对Q值的高估
  • Actor更新时也需要吗?什么时候需要呢?为什么SAC原作者开源代码没有使用,而其他实现使用了?
    • SAC(2V+2Q+1策略)版本:更新Q网络时用了Twin Q;更新Actor网络时仅使用其中一个网络(SAC(V)论文作者开源实现)
    • SAC(4Q+1策略)版本:更新Q网络时用了Twin Q;更新Actor网络时使用两个Q的均值(SAC论文作者开源实现)
    • 理解:Actor网络更新时使用均值可能更好些,相当于Bagging的思想,Actor更新的方向同时要让两个Q都更大

如何理解Bellman算子?

  • 函数、泛函、算子对比:
    • 函数:从一个集合的元素映射到另一个集合的元素
    • 泛函:从一个函数空间映射到数值空间(如实数或复数集)
    • 算子:从一个函数空间映射到另一个函数空间
  • Bellman算子:
    • 一般指从Q函数 \(Q(s,a)\) 映射到另一个Q函数 \(Q’(s,a)\)
    • 定义了一种函数映射到函数的映射关系

on-policy算法一般会使用多个epoch吗?

  • 一般的on-policy算法上,比如普通的Policy Gradient(AC或REINFORCE),理论上有问题,迭代一次以后梯度就不同了
  • 对于PPO这种有重要性采样的形式的损失函数,理论上可以更新多个epoch,主要原因有以下两点:
    • 更新一次epoch后,只要距离不是特别大,理论上不违反新旧策略距离
    • 更新一次epoch后,旧策略没有变(样本没有变化,收集样本使用的行为策略还是旧策略);此时新策略变了,但重要性采样的可以保证梯度更新没有问题
  • 对于PPO,使用多次更新可以提升样本利用率,但为避免过拟合陷入局部最优,也不建议更新太多轮次;实践时,不同场景、不同学习率下的最优epoch_num超参可能不同,原始 PPO 论文中提到使用过3,10,15这样的数字

on-policy算法可用Adam优化器?

  • 问题补充:Adam会使用到之前的梯度,但是on-policy要求梯度更新是当前策略采样,且基于当前策略计算出来的,在on-policy更新时可以使用Adam吗?
  • 回顾Adam优化器:
    • \(\theta_{t} = \theta_{t-1} - \frac{\lambda}{\sqrt{\tilde{v}_t+\epsilon}} \tilde{m}_t\)
    • \(\tilde{v}_t=\frac{v_{t}}{1-\beta_{1}^{t}}\)
    • \(\tilde{m}_t=\frac{m_{t}}{1-\beta_{2}^{t}}\)
    • \(\lambda\) 是外层学习率,实际使用中,常常可以通过指数衰减、固定步长衰减、余弦退火衰减等学习率衰减策略更新
    • 梯度的指数衰减: \(m_{t} = \beta_{2}m_{t-1}+(1-\beta_{2})g_{t}\)
    • 梯度平方的指数衰减: \(v_{t} = \beta_{1}v_{t-1}+(1-\beta_{1})g_{t}^{2}\)
  • 答案是可以的,Adam 优化器会在优化过程里利用梯度的一阶矩估计(均值)和二阶矩估计(方差)来动态地调整每个参数的学习率和更新方向 ,但是不会改变梯度计算的原始公式,即每一步计算当前梯度时,原始公式不变
    • Adam 优化器利用之前的梯度信息调整学习率部分 \(\frac{\lambda}{\sqrt{\tilde{v}_t+\epsilon}}\),不会改变当前梯度方向,不用担心
    • Adam 一阶动量部分 \(\tilde{m}\) 会改变梯度的方向 ,但是跟常规的监督学习模型一样 ,这里仅仅是一种加快模型收敛的优化手段,本质上每一步的梯度还是根据原始公式计算出来的(这一点对on-policy的强化学习或监督学习都一样)

策略迭代和值迭代谁更优?

  • 策略迭代(Policy Iteration) :一次策略迭代包含策略评估(Policy Evaluation)和策略提升(Policy Improvement)两个步骤,多次策略迭代至算法收敛找到最优策略
    • 策略评估(Policy Evaluation) :基于贝尔曼期望方程进行迭代至收敛
    • 策略提升(Policy Improvement) :基于策略评估结果优化当前策略
  • 值迭代(Value Iteration) :基于贝尔曼最优方程进行迭代,找到最优值函数,从而找到最优策略
  • 两者最终都会收敛到最优策略,此时都满足贝尔曼最优方程
  • 值迭代更像是一个贪心策略,收敛快,实现成本低,但是容易陷入局部最优;策略迭代收敛慢,但是一步步优化,更扎实,最终效果往往由于值迭代
    • 从经验上看,值迭代可以更快收敛,但效果一般不如策略迭代,比如DQN收敛更快,而A2C前期收敛慢,但后期效果往往高于DQN

策略梯度法中,计算奖励时为什么要丢弃过去时间片的奖励?

  • 理论上过去时间片的奖励加不加都不影响最终效果
  • 过去时间片的奖励期望为0,但方差不为0,加入以后只会影响策略的学习

折扣因子是否在鼓励较短路径?

  • 补充问题:在只有最终步有固定奖励的场景,假设奖励固定(比如二值奖励 0 or 1)且只在最后一步有 Reward,但到达最终状态的路径长度不同,此时使用小于 0 的折扣因子是否是在鼓励较短路径?
  • 结论:
    • 当 \(\gamma < 1\) 时,模型倾向于鼓励大于 0 的短路径和鼓励小于 0 的长路经
      • 当奖励为正值时,策略更倾向于短路径
      • 当奖励为负值时,策略更倾向于长路径(注意部分使用 Reward 归一化的场景也会导致一些奖励从正值或 0 值变成负值)
    • 当 \(\gamma = 1\) 时,模型没有长度倾向
  • 补充说明:
    • 一般来说,为了防止智能体浪费步骤(比如不断绕圈),在 Reward 设计中,我们常常会将中间步骤的每一步作为惩罚加入,这也是在鼓励短路径,但这里我们暂时不考虑这种情况(假设中间步骤没有任何奖励)
  • 注:当前的 LLM 训练中,一般都设置 \(\gamma=1\),即本身不鼓励也不抑制序列长度

Vanilla Policy Gradient 中的一些数值分析

  • 在考虑折扣因子 \(\gamma\) 时,当前状态到结束的累计折扣奖励为:
    $$ G_t = \sum_{t’=t} \gamma^{t’-t}r_{t’} $$
  • 由于奖励只发生在最后一步,则有:
    $$ G_t = \gamma^{T-t}r_{T} $$
    • 其中 \(T\) 是轨迹长度,这里我们假定 \(r_{T}\) 是固定的
    • 显然,如果轨迹长度 \(T\) 是不固定的,则对同样的第 \(t\) 步,轨迹越长,对应的 \(\gamma^{T-t}\) 越小
    • 当 \(\gamma = 1\) 时,累计奖励不变,所以模型本身没有倾向
  • 当奖励为正时(\(r_{T} > 0\)):
    • 此时 \(T\) 越大,累计奖励 \(G_t\) 越小,模型更倾向于 \(T\) 更小的短路径
  • 当奖励为负时(\(r_{T} < 0\)):
    • 此时 \(T\) 越大,累计奖励 \(G_t\) 越大,模型更倾向于 \(T\) 更大的长路径
  • 举例:
    • 奖励为正时的一个简单的例子:
      • 对于相同的状态 \(s_t\),假设有两个动作 \(a_1,a_2\),他们最终都会取得成功(最后一步奖励为 1),但是动作 \(a_1\) 对应的路径比动作 \(a_2\) 对应的路径长 ,则动作 \(a_1\) 对应的累计奖励比动作 \(a_2\) 对应的累计奖励小 ,模型会倾向于选择动作 \(a_2\)
    • 奖励为负时的一个简单的例子:
      • 同上设定,当奖励为负时,对相同的奖励,模型倾向于长路经(此时的累计奖励更大)

PPO(with GAE)

  • 当考虑使用 Advantage 时,或考虑 GAE 下的 PPO 时,问题可能会变得更复杂
    $$ A_t = r_t + V(s_{t+1}) - V(s_t) $$
    • 由于在当前设定下 \(r_t = 0\),所以:
      $$ A_t = V(s_{t+1}) - V(s_t)$$
    • 考虑到
      $$ V(s_t) = \mathbb{E}[G_t] $$
      • 则可以进一步去掉期望进行简单推导得到(不严谨)
        $$ A_t = \gamma^{T-(t+1)}r_{T} - \gamma^{T-t}r_{T} = (\gamma^{T-(t+1)}-\gamma^{T-t}) r_{T}$$
    • 显然,此时 \(t\) 不变的情况下 \(T\) 越大,两者差异 \((\gamma^{T-(t+1)}-\gamma^{T-t})\) 越小
      $$ \gamma^{T-(t+1)}-\gamma^{T-t} = \color{red}{\gamma^{T-t-1}}(1-\gamma) $$
      • \((1-\gamma)\) 为固定值,\(\color{red}{\gamma^{T-t-1}}\) 随 \(T\) 的增大逐渐变小
  • 基本结论
    • 当 \(\gamma < 1\) 时,(与 Policy Gradient 相似)模型倾向于鼓励大于 0 的短路径和鼓励小于 0 的长路经
      • 当奖励为正时(\(r_{T} > 0\)):
        • 此时 \(T\) 越大,\(A_t = (\gamma^{T-(t+1)}-\gamma^{T-t}) r_{T}\) 越小
      • 当奖励为负时(\(r_{T} < 0\)):
        • 此时 \(T\) 越大,\(A_t = (\gamma^{T-(t+1)}-\gamma^{T-t}) r_{T}\) 越大
    • 当 \(\gamma = 1\) 时,模型没有长度偏好

PPO 的连续版本和离散版本策略熵分别如何实现?

PPO 连续版本

  • 连续版本的熵一般用蒙特卡洛近似

    1
    2
    def compute_entropy(log_probs):
    entropy = -log_prob.mean() # 蒙特卡洛估计熵
  • 此时无法枚举所有动作,不使用蒙特卡罗近似难以计算熵

  • 由于数据就是当前策略采样的(PPO一次数据多轮更新下可能存在微小误差),所以对数据上的 -log_prob直接求均值就是熵的近似估计

PPO 离散版本中使用熵的原始定义估计

  • 遵循熵的定义直接定义即可:

    1
    2
    def compute_entropy(probs):
    return -torch.sum(probs * torch.log(probs + 1e-10), dim=-1) # 加1e-10防止log(0)
  • 部分实现时模型可能输出的是 log_probs,此时为:

    1
    2
    def compute_entropy(log_probs):
    return -torch.sum(log_probs.exp() * log_probs, dim=-1) # 加1e-10防止log(0)
  • 注:x.log() == torch.log(x)(以自然数为底的对数);x.exp() == torch.exp(x)

  • 为什么离散版本不继续采样蒙特卡罗估计?

    • 因为对所有动作求和更准确,且离散场景下该动作是可行的

对照 SAC 中熵的计算方式

  • 回顾SAC离散策略的的更新目标 :
    $$
    J_\pi(\phi) = \mathbb{E}_{s_t \sim \mathcal{D}, a_t\sim\pi_\phi} [ \alpha \log \pi_\phi(a_t \vert s_t) - Q_\theta(s_t, a_t) ]
    $$
  • 回顾SAC连续动作的策略更新目标 ,首先需要采用重参数法建模连续动作 \(a_t = f_\phi(\epsilon_t; s_t)\),然后有:
    $$
    J_\pi(\phi) = \mathbb{E}_{s_t \sim \mathcal{D}, \epsilon_t \sim \mathcal{N}}[\alpha \log \pi_\phi(f_\phi(\epsilon_t;s_t)\vert s_t) - Q_\theta(s_t, f_\phi(\epsilon_t; s_t))]
    $$
  • SAC 实现时,与 PPO 中类似,连续版本用蒙特卡罗估计,离散版本积分求出
  • 问题:SAC 方法是 off-policy 的,连续版本中,使用蒙特卡罗估计得到的熵是有偏的?
    • 回答:不是有偏的,SAC 中的数据是从其他策略采样来的,但是计算熵时使用的动作是从当前策略分布采样出来的(重参数法)
    • PS:可以从更新公式中看到,更新 Policy 网络时,仅状态 \(s\) 是从历史数据集中采样的,更新 Critic 网络时,则使用的是从历史数据采样的 \((s,a)\)

RL 中 Reward 的线性变换如何影响梯度?

对于做 Reward 归一化的场景

  • 如果做了 Reward 归一化,理论上减去均值并除以方差,可以将 Reward 的 线性变化消去,此时不会造成任何影响,但要求线性变化的系数要大于 0
  • 补充说明:因为对于 \(Y = kX + b\),有 \(X, Y\) 分别做归一化得到的结果是不一定相等的
    • 当 \(k>0\) 时:归一化后的结果完全一样 (Advantage 完全一样)
    • 如果 \(k < 0\):归一化后的结果互为相反数(符号相反,绝对值相同)
    • 当 \(k=0\) 时:\(Y\) 为常数 0
  • 证明:
    • 假设对 \(X\) 进行归一化(Z-score standardization),结果记为 \(Z_X\):
      $$Z_X = \frac{X - \mu_X}{\sigma_X}$$
    • 对于 \(Y = kX + b\):
      $$
      \mu_Y = E[kX + b] = kE[X] + b = k\mu_X + b \\
      Var(Y) = Var(kX + b) = k^2 Var(X) = k^2 \sigma_X^2 \\
      \sigma_Y = \sqrt{k^2 \sigma_X^2} = |k|\sigma_X
      $$
    • 对 \(Y\) 进行归一化,结果记为 \(Z_Y\):
      $$Z_Y = \frac{Y - \mu_Y}{\sigma_Y}$$
    • 将 \(Y, \mu_Y, \sigma_Y\) 代入公式:
      $$Z_Y = \frac{(kX + b) - (k\mu_X + b)}{|k|\sigma_X}$$
    • 化简分子(\(b\) 被抵消):
      $$Z_Y = \frac{kX - k\mu_X}{|k|\sigma_X} = \frac{k(X - \mu_X)}{|k|\sigma_X}$$
    • 整理公式,提取出 \(Z_X\) 的部分:
      $$Z_Y = \frac{k}{|k|} \cdot \left( \frac{X - \mu_X}{\sigma_X} \right)$$
    • 即:
      $$Z_Y = \text{sign}(k) \cdot Z_X$$

对于未做 Reward 归一化的场景 - Policy Gradient

REINFORCE
  • 对于普通策略梯度法,因为累计收益是梯度系数,故而会放大或缩小梯度系数(Reward 变化时需要调整学习率)
    $$
    \begin{align}
    \nabla_\theta J(\theta) &\approx \frac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n) \nabla_\theta \log \pi_\theta(a_t|s_t) \\
    &\approx \frac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n} G_t^n \nabla_\theta \log \pi_\theta(a_t|s_t)
    \end{align}
    $$
PPO 等使用 Advantage 的策略梯度法
  • 对于 PPO,由于梯度更新系数与 Advantage 有关,而 Advantage 可能受到 Reward 影响,故而需要考虑这个 Reward 本身对 Advantage 的影响
  • 结论先行:Reward 线性变换会对 Advantage(优势函数)的数值产生直接影响,但对最终训练效果的影响还取决于是否使用了 Advantage Normalization(优势归一化)
  • GAE 估计下的 \(A_t\) 是 \(\delta_t\) 的加权和:
    $$ A_t = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} $$
    • \(\delta_t\) 为 TD Error
      $$ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) $$
    • 其中 \(V(s)\) 是状态价值函数,它拟合的是期望回报(Expected Return)
    • 为了简单起见,下面拆成缩放和平移两种情况进行分析
  • 情况 A: 对 Reward 进行缩放 (乘以常数 \(c\))
    • 假设 \(r’_t = c \cdot r_t\)
    • 1)Value Function 变化 :因为 \(V\) 拟合的是累积 Reward,所以理想情况下,新的 Value Function \(V’\) 会收敛到 \(c \cdot V\)
    • 2)TD Error 变化 :
      $$ \delta’_t = c \cdot r_t + \gamma (c \cdot V(s_{t+1})) - (c \cdot V(s_t)) = c \cdot \delta_t $$
    • 3)Advantage 变化 :
      $$ A’_t = c \cdot A_t $$
      • 结论 :Advantage 的数值会严格按照比例 \(c\) 缩放
  • 情况 B: 对 Reward 进行平移 (加减常数 \(b\))
    • 假设 \(r’_t = r_t + b\)
    • 1)Value Function 变化 :
      $$ V’(s) = \mathbb{E}[\sum \gamma^k (r_{t+k} + b)] = V(s) + \sum \gamma^k b = V(s) + \frac{b}{1-\gamma} $$
      • 注:这是在无限视界下的理论值,如果是有限步长,则是一个随步数变化的偏移量
    • 2)TD Error 变化 :
      $$
      \begin{align}
      \delta’_t &= (r_t + b) + \gamma (V(s_{t+1}) + \frac{b}{1-\gamma}) - (V(s_t) + \frac{b}{1-\gamma}) \\
      &= r_t + \gamma V(s_{t+1}) - V(s_t) + \left( b + \frac{\gamma b}{1-\gamma} - \frac{b}{1-\gamma} \right) \\
      &= r_t + \gamma V(s_{t+1}) - V(s_t) + \left( b + \frac{b(\gamma - 1)}{1-\gamma} \right) \\
      &= r_t + \gamma V(s_{t+1}) - V(s_t) + \left( b - b \right) \\
      &= r_t + \gamma V(s_{t+1}) - V(s_t) = \delta_t \\
      \end{align}
      $$
    • 3)Advantage 变化 :
      $$ A’_t = A_t $$
      • 结论 :理论上,对 Reward 进行加减常数操作,Advantage 的值是不变的(因为常数项在差分计算中被抵消了)
附录:对最终训练的影响
  • Advantage Normalization:标准的 PPO 实现(如 OpenAI Baselines, Stable Baselines3, CleanRL 等)在将 Advantage 输入到 Policy Loss 之前,都会进行 归一化处理 :
    $$ A_{norm} = \frac{A - \text{mean}(A)}{\text{std}(A) + \epsilon} $$
    • 注:在标准的 PPO 实现中(如 OpenAI Baselines, Stable Baselines3, CleanRL),Advantage 的归一化通常 不是 使用滑动平均(Running Mean/Std) ,而是基于 当前采集的整个 Batch(Rollout Buffer) 进行统计计算的
  • 如果是缩小(乘以小于 1 大于 0 的值) :
    • 如果开启了归一化:\(\frac{c \cdot A}{c \cdot \text{std}} = \frac{A}{\text{std}}\)。完全没有影响
    • 如果未开启归一化:Advantage 变小,Policy Gradient 的梯度变小,相当于降低了 Policy 的学习率
  • 如果是平移(比如减去 5) :
    • 理论上 Advantage 不变,所以 Policy 的更新方向不变
    • 但是(重要隐患) :Value Network 的拟合难度会剧增
      • 假设 \(\gamma = 0.99\),Reward 减去 5,意味着 Value Function 的目标值整体偏移了 \(\frac{-5}{1-0.99} = -500\)
      • 神经网络通常初始化在 0 附近。如果 Target Value 突然变成了 -500,Value Loss 会变得巨大
      • 这会导致 Value Network 的梯度非常大,如果 Policy 和 Value 共享部分网络层(Shared Backbone),巨大的 Value Loss 梯度会破坏 Policy 的特征提取能力,导致训练崩溃
    • 此时变化很大的原因是每一步都有 Reward,所以整体被放大了,如果中间 Reward 都为 0,只有最终的一个 Reward,则平移 -5 带来的累计 Reward 变化也只有 -5
附录:PPO 最佳实践建议:
  • Reward Scaling(推荐) :将 Reward 乘以一个系数,使其方差维持在较小范围(例如 1 左右),这对神经网络训练非常有利
  • Reward Clipping(推荐) :直接将 Reward 截断在 \([-10, 10]\) 之间,防止异常值破坏训练
  • 避免 Reward Shifting :尽量不要对 Reward 做大的加减平移(除非是为了处理生存奖励等特定逻辑),因为这会通过 \(\frac{1}{1-\gamma}\) 放大 Value 的数值范围
  • 始终使用 Advantage Normalization :这能让 PPO 对 Reward 的缩放不敏感,保证训练的稳定性

对于未做 Reward 归一化的场景 - Q-Learning

  • Q-Learning 学习的是 Reward 的绝对值,最终收敛后使用的策略是 argmax,所以理论上平移不会影响 RL 的最终结论
  • 除了 Reward 太大可能导致初始化值到收敛到最优 Reward 需要一点时间,外,不会有别的影响
  • 注意:Policy Gradient 中的 Value 学习一样,随意调整 Reward 对价值函数是一个挑战

不同算法下 Critic 损失的定义方式

  • Actor Critic 方法的 Critic 损失函数:
    $$
    Loss_{\text{critic}} = \sum (r_t + \gamma Q^{\bar{w}}(s_{t+1}, a_{t+1}) - Q^{w}(s_{t}, a_t)) ^ 2
    $$
  • A2C(Advantage Actor Critic)算法引入了优势函数(Advantage),这也是 A2C 名字的由来,A2C 算法中,Critic 网络的损失函数:
    $$
    Loss_{\text{critic}} = \sum (r_t + \gamma V^{\bar{w}}(s_{t+1}) - V^{w}(s_{t})) ^ 2
    $$
  • PPO(with GAE)中,Critic 也是通过最小化 MSE 来逼近回报估计值 \(V_{target}\)(注:这个目标相对 A2C 中的 \(r_t + V(s_t)\) 方差更小)
    • Critic 的拟合目标 \(V_{target}\) 通常被设定为
      $$ R \approx V_{target} = V_{old}(s_t) + A^{GAE}_t$$
      • 即估计的真实回报 Returns,故实现中常常定义为 \(R\)
    • 于是 Critic 的 Loss 为:
      $$
      Loss_{\text{critic}} = \sum (V_{old}(s_t) + A^{GAE}_t - V^{w}(s_{t})) ^ 2
      $$
      • 注意:从这里可以看出,GAE 的估计本身会影响 Critic 本身的收敛速度(当 \(\lambda\) 或 \(\gamma\) 小于 0 时均会影响 Critic 的收敛速度)
      • 补充:25 年 3 月 Seed 有偏文章 VC-PPO 中的观点是认为这里不使用 GAE ,而是使用蒙特卡洛采样(也可以认为是 \(\lambda=1.0\) 下的 GAE)更合适(可以加速 Critic 的收敛)
    • PPO 中 Critic 的一般更新过程为:
      • step 1: Rollout 并最终得到奖励
      • step 2: 计算每个 token 步骤的 TD-Error(\(\delta_t\))
      • step 3: 利用 \(\delta_t\) 计算 GAE 优势
      • step 4: 最小化 \(Loss_{\text{critic}}\) 更新 Critic 参数

RL——强化学习相关概念汇总


Episodic Task 和 Continuing Task

  • Episodic Task :(分幕任务)环境有明确的终止状态(如游戏通关、任务完成),每个独立的交互片段称为一个 episode
    • 例如:象棋游戏等
  • Continuing Task :(持续任务)环境无终止状态,智能体需无限持续交互。无步长限制(即没有明确终止状态或时间限制)的环境称为 Continuing Task(持续任务)
    • 例如:长期运行的自动化控制系统等
    • 在持续任务中,通常需要引入 折扣因子(γ) 来确保回报的无穷和有界
    • 术语 “Non-episodic“ 或 “Infinite-horizon“ 也偶尔用于描述这类场景,但 Continuing Task 是强化学习领域的标准术语(参考 Sutton & Barto 的《Reinforcement Learning: An Introduction》)

Episode、Rollout 和 Trajectory

  • Episode(回合) :一个完整的交互过程,从初始状态开始,到终止状态结束(适用于Episodic Task)
    • 明确的时间边界(如游戏的一局、机器人完成一次任务),Episodic Task任务才有明确的终止状态
    • 通常用于有终止条件的任务(例如:Atari游戏通关、机器人到达目标)
  • Rollout(展开、推演) :包含从当前状态(或某个特定状态)到终止状态的完整过程,和Episode的区别是可以不从初始状态开始
  • Trajectory(轨迹) :智能体在环境中产生的一系列状态、动作、奖励的序列,形式化为:
    $$
    \tau = (s_0, a_0, r_1, s_1, a_1, r_2, \dots)
    $$
    • 更通用的术语,可指完整或部分序列 ,更侧重强调行为路径和决策序列
    • 既可用于Episodic Task(一个 trajectory 对应一个 episode),也可用于持续任务(Continuing Task ,无终止状态)
    • 在强化学习理论和推导中常用(如策略梯度方法中的轨迹优化)

State 和 Observation

  • State(状态) :对环境的完整描述称为状态
  • Observation(观测) :对环境(或状态)的部分描述称为观测
  • 对比:状态包含了环境的全部信息,能够完全确定环境的当前情况以及未来的演化趋势(在给定策略和环境动态的情况下);观测则往往是不完整的、有噪声的,可能丢失了一些对决策重要的信息
  • 说明:大部分论文中不会严格说明是否获取到了环境的完整描述,会使用 State 来表述观测 Observation

Fully Observable 和 Partially Observable

  • Fully Observable :如果智能体能看到完整的环境描述,则称环境为完全可观测的
    • 在完全可观测的环境中,智能体能够直接获取到环境的完整状态信息,即智能体观测到的内容与环境的真实状态完全一致,不存在任何隐藏信息或不确定性
  • Partially Observable :如果智能体能看到部分的环境描述,则称环境为不完全可观测的
    • 在部分可观测的环境中,智能体只能获得环境状态的部分信息,无法直接观测到环境的真实状态。这种情况下,智能体需要根据有限的观测信息来推断环境的状态,进而做出决策

Reward 和 Return

  • Reward(奖励) :关注的是当前时刻的单一行动所获得的反馈,是一个即时的、局部的概念
  • Return(回报) :从当前状态开始的整个未来序列的累计奖励情况,是一个长期的、全局的概念

State Transition 和 Dynamics

  • State Transition(状态转移) :主要关注智能体的状态如何从一个时刻转变到下一个时刻,是 Dynamics(动力学)的一个部分,一般用状态转移概率矩阵或状态转移函数来表示
    • 离散空间状态转移通常可表示为 \(p\)
  • Dynamics(动力学) :通常指环境的动态变化规律,它描述了环境如何随着时间步的推进以及智能体的行动而演变。动力学不仅包括状态转移(State Transition)关系,还涵盖了环境中各种因素的变化规律,如奖励的生成机制、环境中其他实体的行为模式等
    • Dynamics(动力学)通常用一组复杂的方程或规则来描述,可能涉及多个变量和参数,并且可能需要考虑环境中的各种随机因素和外部干扰

MP、MRP、MDP、POMDP、Contextual MDP

  • 马尔可夫性(Markov property) :马尔可夫性是指在一个随机过程中,系统在未来时刻的状态只取决于当前时刻的状态,而与过去的历史状态无关
  • MP(Markov Process) :即马尔可夫过程 ,也称为马尔可夫链。形式上,一个马尔可夫过程可以用一个二元组 \((S, P)\) 表示
    • 其中 \(S\) 是状态空间, \(P\) 是状态转移概率矩阵, \(P_{ss’}=P(s_{t + 1}=s’|s_t = s)\) 表示在时刻 \(t\) 处于状态 \(s\) ,在下一时刻 \(t + 1\) 转移到状态 \(s’\) 的概率,它是一个无记忆的随机过程,具有马尔可夫性质,即未来的状态只取决于当前状态,与过去的历史无关
  • MRP(Markov Reward Process) :马尔可夫奖励过程 ,是在马尔可夫过程的基础上增加了奖励信号。它是一个四元组 \((S, P, R, \gamma)\)
    • 其中 \(S\) 是状态空间, \(P\) 是状态转移概率矩阵, \(R\) 是奖励函数, \(R(s)=E[r_{t + 1}|s_t = s]\) 表示在状态 \(s\) 下获得的即时奖励, \(\gamma\) 是折扣因子,用于衡量未来奖励的重要性,取值范围通常在 \([0, 1]\) 之间
  • MDP(Markov Decision Process) :马尔可夫决策过程 ,它在马尔可夫奖励过程的基础上增加了决策动作 ,是一个五元组 \((S, A, P, R, \gamma)\)
    • 其中 \(S\) 是状态空间, \(A\) 是动作空间, \(P\) 是状态转移概率矩阵, \(P_{ss’}^a = P(s_{t + 1}=s’|s_t = s, a_t = a)\) 表示在状态 \(s\) 下执行动作 \(a\) 后转移到状态 \(s’\) 的概率, \(R\) 是奖励函数, \(R(s, a)=E[r_{t + 1}|s_t = s, a_t = a]\) 表示在状态 \(s\) 下执行动作 \(a\) 获得的即时奖励, \(\gamma\) 是折扣因子。智能体通过选择不同的动作来最大化长期累积奖励
  • POMDP(Partially Observable Markov Decision Process) :部分可观测马尔可夫决策过程 ,在POMDP中,智能体不能直接观测到环境的真实状态,只能通过观测函数获得部分观测信息。它是一个七元组 \((S, A, O, P, R, \gamma, Z)\)
    • 其中 \(S\) 、 \(A\) 、 \(P\) 、 \(R\) 、 \(\gamma\) 与MDP中的含义相同, \(O\) 是观测空间, \(Z\) 是观测函数, \(Z(o|s, a)=P(o_{t + 1}=o|s_{t + 1}=s, a_t = a)\) 表示在状态 \(s\) 下执行动作 \(a\) 后,观测到 \(o\) 的概率。POMDP比MDP更具挑战性,因为智能体需要根据不完整的观测信息来做出决策
  • Contextual MDP(Contextual Markov Decision Process) :上下文马尔可夫决策过程 ,Contextual MDP可以表示为六元组 \((S, A, C, P, R, \gamma)\)
    • 其中 \(C\) 是上下文空间,状态转移概率 \(P\) 和奖励函数 \(R\) 都与上下文 \(c\) 有关,即 \(P_{ss’}^a(c)=P(s_{t + 1}=s’|s_t = s, a_t = a, c_t = c)\) , \(R(s, a, c)=E[r_{t + 1}|s_t = s, a_t = a, c_t = c]\)。它在MDP的基础上增加了上下文信息,即状态不仅取决于当前的环境状态,还与一些外部的上下文因素有关。例如,在推荐系统中,用户的偏好和行为可能受到当前的时间、地点、用户历史记录等上下文因素的影响。智能体需要根据当前的上下文信息来选择合适的动作,以最大化长期累积奖励

MC、TD、DP

  • 蒙特卡罗方法(Monte-Carlo,MC):通过完整轨迹的采样回报估计值函数,依赖实际经验,无需环境模型
  • 动态规划(Dynamic Programming,DP):基于模型的全宽度(Full-width)回溯更新,利用贝尔曼方程迭代求解值函数,需已知环境动力学
  • 时序差分(Temporal-Difference,TD):结合当前奖励和后续状态的价值估计来更新当前状态
  • 三者比较如下:

Bellman Operator

  • 贝尔曼算子(Bellman Operator),又称为贝尔曼Backup算子(Bellman Backup Operator)
  • 一句话理解:贝尔曼算子是一种函数到函数的映射,Bellman的核心原理是利用当前状态的奖励和后续状态的价值来更新当前状态的价值估计
  • 其本质可以表达为“当前状态的价值 = 即时奖励 + 未来价值的折扣期望”
  • 贝尔曼算子作用到Q函数上:
    $$ \mathcal{T^\color{red}{\pi}}Q^{k+1}(s,a) = \mathbb{E}_{s’\sim P(\cdot|s,a)}[r(s,a) + \gamma\mathbb{E}_{a’\sim \color{red}{\pi}(\cdot|s’)}[Q^k(s’,a’)]] $$
    • 以上迭代公式走下去,Q值会收敛到:\(Q^\pi(s,a)\)
  • 贝尔曼算子作用到V函数上:
    $$ \mathcal{T^\color{red}{\pi}}V^{k+1}(s) = \mathbb{E}_{a \sim \color{red}{\pi}(\cdot|s)}[r(s,a) + \gamma\mathbb{E}_{s’\sim P(\cdot|s,a)}[V^k(s’)]] $$
    • 以上迭代公式走下去,Q值会收敛到:\(V^\pi(s)\)

SMDP

  • 半马尔可夫决策过程(Semi-Markov Decision Process, SMDP)是马尔可夫决策过程(MDP)的扩展,专门用于建模动作持续时间可变的决策问题
  • 在标准 MDP 中,每个动作在一个时间步内完成,而 SMDP 允许动作持续多个时间步,这在现实世界应用中更为常见,引入 SMDP 的核心原因是:
    • 时间抽象:许多真实世界的决策涉及持续时间不同的动作
    • 层次决策:高层决策可能对应一系列底层动作的执行
    • 计算效率:在更高时间尺度上进行规划可减少决策频率
  • 一个 SMDP 可以表示为五元组:\( (S, A, P, R, F) \)
    • \( S \):状态空间(有限或可数)
    • \( A \):动作空间(有限或可数)
    • \( P \):状态转移函数,包含时间维度
    • \( R \):奖励函数,考虑累积折扣奖励
    • \( F \):动作持续时间分布
  • 在 SMDP 中,转移概率包含时间维度 :
    $$
    P(s’, \tau | s, a) = \mathbb{P}(S_{t+\tau} = s’, \tau | S_t = s, A_t = a)
    $$
    • 其中 \( \tau \in \mathbb{Z}^+ \) 是动作执行的时间步数
    • 作为对比:在传统的 MDP 中,转移概率为:
      $$
      P(s’ | s, a) = \mathbb{P}(S_{t+1} = s’ | S_t = s, A_t = a)
      $$
  • SMDP 的状态-动作转移概率:
    • 当在状态 \( s \) 执行动作 \( a \) 时,系统以概率 \( P(s’, \tau | s, a) \) 在 \( \tau \) 步后转移到状态 \( s’ \)
  • SMDP 的累积折扣奖励:不是每个时间步单独获得,而是在动作执行期间累积:
    $$
    r(s, a) = \mathbb{E} \left[ \sum_{k=0}^{\tau-1} \gamma^k R_{t+k} \mid S_t = s, A_t = a \right]
    $$
    • \( \tau \) 是动作 \( a \) 的持续时间
    • \( R_{t+k} \) 是在时间步 \( t+k \) 获得的即时奖励
    • \( \gamma \in [0, 1] \) 是折扣因子
  • SMDP 下的贝尔曼最优方程
    • 状态值函数:
      $$
      V^*(s) = \max_{a \in A} \left[ r(s, a) + \sum_{s’, \tau} \gamma^\tau P(s’, \tau | s, a) V^*(s’) \right]
      $$
    • 动作值函数:
      $$
      Q^*(s, a) = r(s, a) + \sum_{s’, \tau} \gamma^\tau P(s’, \tau | s, a) \max_{a’ \in A} Q^*(s’, a’)
      $$
    • 注意:折扣因子 \( \gamma \) 的指数是 \( \tau \)(动作持续时间),这与 MDP 中每个时间步都打折不同
  • SMDP的求解方法(Q-learning 的 SMDP 扩展),即SMDP Q-learning 更新规则:
    • 当在状态 \( s \) 执行动作 \( a \),经过 \( \tau \) 步后到达状态 \( s’ \) 并获得累积奖励 \( r \) 时:
      $$
      Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma^\tau \max_{a’} Q(s’, a’) - Q(s, a) \right]
      $$

Option 相关概念

Option 的基本定义

  • Option(选项)框架是实现层级强化学习(Hierarchical Reinforcement Learning, HRL) 的核心机制
    • Option 由 Sutton, Precup 和 Singh 在 1999 年正式提出,旨在解决传统 RL 在处理长路径、复杂任务时的“维度灾难”
  • Option 是一种形式化的时间抽象机制,允许智能体在更高的时间尺度上进行规划和决策
    • 一个 Option 可以看作是一个可重用的技能或子策略,它能够在一段时间内自主执行,直到满足特定的终止条件
  • 简单来说,Option 的本质就是一种 “宏动作”(Macro-action)
    • 比如“回家”这个任务,传统的动作是“左转”、“右转”、“迈步”,而 Option 则是“出办公室”、“下楼”、“开车”等一系列子策略
    • 下面的概念理解中,可以将 Option 当做一种 “抽象高阶动作” 来看
  • Option 允许在更长的时间尺度上进行规划;学习到的技能可以在不同任务中重复使用;可通过高层策略加速探索过程;
  • Option 通常对应有意义的子任务或技能
  • Option 常用于层次强化学习中:构建多层次的决策体系

Option 的数学定义

  • 一个 Option \( \omega \in \Omega \) 是一个三元组,由三个部分组成:
    $$
    \omega = \langle I_\omega, \pi_\omega, \beta_\omega \rangle
    $$
    • 起始状态集 \( I_\omega \subseteq S \): Option 可以被调用的状态集合
      • 表示在哪些状态下可以启动这个 Option,启动这个 Option 相当于是做了一个 Action
    • 内部策略 \( \pi_\omega : S \times A \rightarrow [0,1] \):Option 执行期间遵循的策略
      • 即该 Option 运行时,Agent 采取动作的概率分布
      • 注意:每个 Option \(\omega\) 对应的策略 \(\pi_\omega\) 不同,也就是说,对于相同的状态 \(s_t\),若其 Option \(\omega\) 不同,则选择的动作 \(a_\omega \sim \pi_\omega(\cdot|s_t)\) 也不同
    • 终止函数 \( \beta_\omega : S \rightarrow [0,1] \):表示在给定状态下 Option 终止的概率
      • 即在某个状态下,该 Option 终止的概率
      • 理解:在有些状态下,可以认为是这个 Option 的目标(如下楼 )已经达到了,所以可以退出这个 Option 了,有些状态下则还没达到,不能退出

Option 的执行过程

Option 的调用和执行
  • 当智能体在状态 \( s_t \) 且 \( s_t \in I_\omega \) 时,可以选择执行一个 Option \( \omega \)
  • 在选择确定的 Option \( \omega \) 后,后续的动作选择如下:
    • 1)智能体按照 Option \( \omega \) 对应的策略 \( \pi_\omega \) 选择动作 Action 并与环境多次交互,直到 Option 终止
    • 2)在每个时间步 \( t’ \) 时,Option 都以概率 \( \beta_\omega(s_{t’}) \) 终止
      • 注:不同状态的终止概率不同,极端情况下,有的状态表示已经达成 Option 的目标,则结束概率是 1,有的状态表示完全未完成目标,结束概率是 0;
      • 理解:这有点类似于状态转移,但不完全相似

Option 的马尔可夫性

  • 尽管单个 Option 的内部执行(按策略 \( \pi_\omega \) 选择动作 Action 并与环境多次交互)可能依赖于历史,但在半马尔可夫决策过程(Semi-Markov Decision Process, SMDP) 的框架下,Option 的选择可以被视为一个马尔可夫决策过程
  • 注:SMDP 是 MDP 的扩展,专门用于建模动作持续时间可变的决策问题
    • 在标准 MDP 中,每个动作在一个时间步内完成
    • SMDP 允许动作持续多个时间步,这在现实世界应用中更为常见

Option 框架下的值函数

Option 的价值函数
  • 对于一个 Option \( \omega \),其状态 \( s \) 的价值函数定义为从状态 \( s \) 开始执行该 Option 的期望回报:
    $$
    V^\omega(s) = \mathbb{E} \left[ r_{t+1} + \gamma r_{t+2} + \cdots + \gamma^{k-1} r_{t+k} + \gamma^k V(s_{t+k}) \mid \mathcal{E}(\omega, s, t) \right]
    $$
    • 其中 \( \mathcal{E}(\omega, s, t) \) 表示在时间 \( t \) 从状态 \( s \) 开始执行 Option \( \omega \),\( k \) 是 Option 执行的步数

SMDP 贝尔曼方程

  • 在 Option 框架下,SMDP 的贝尔曼方程为(理解:本质就是把 Option 的选择看做是一种动作的选择,从而构成贝尔曼方程):
    $$
    V(s) = \max_{\omega \in \Omega_s} \left[ R(s,\omega) + \sum_{s’} \gamma^\tau P(s’ \mid s,\omega) V(s’) \right]
    $$
    • \( \Omega_s \) 是在状态 \( s \) 下可用的 Option 集合
    • \( R(s,\omega) \) 是从状态 \( s \) 执行 Option \( \omega \) 的期望累积折扣回报
    • \( P(s’ \mid s,\omega) \) 是从状态 \( s \) 执行 Option \( \omega \) 后到达状态 \( s’ \) 的概率
    • \( \tau \) 是 Option 执行的期望步数

分层学习:Intra-Option 学习(Option 内部学习)

  • Intra-Option 学习关注于改进单个 Option 的内部策略 \( \pi_\omega \),而不改变 Option 的选择策略
  • 这可以通过各种策略梯度方法实现:
    $$
    \nabla_\theta J(\pi_\omega) = \mathbb{E}_{s \sim \rho^\omega, a \sim \pi_\omega} \left[ \nabla_\theta \log \pi_\omega(a|s) Q_U(s,\omega) \right]
    $$
    • 其中 \( Q_U(s,\omega) \) 是执行 Option \( \omega \) 的动作值函数
    • 整个优化过程会优化策略 \(\pi_\omega\) 本身,但不会优化选择 \(\omega\) 的概率分布(或高阶策略)

分层学习:Inter-Option 学习(Option 间学习)

  • Inter-Option 学习关注于学习如何在不同 Option 之间进行选择,即学习一个上层策略 \( \mu : S \times \Omega \rightarrow [0,1] \):
    $$
    Q_\Omega(s,\omega) = R(s,\omega) + \sum_{s’} P(s’ \mid s,\omega) \max_{\omega’ \in \Omega_{s’} } Q_\Omega(s’,\omega’)
    $$

Option 发现方法

基于子目标的方法
  • 通过识别状态空间中的关键状态(子目标)来构建 Option:
    $$
    g^* = \arg \max_g \Phi(g)
    $$
    • 其中 \( \Phi(g) \) 是子目标 \( g \) 的某种效用函数,如访问频率或状态覆盖度
基于技能的方法
  • 通过最大化多样性来发现有用的技能:
    $$
    \max_{\pi} \mathbb{E}_{s \sim p(s)} \left[ H(\pi(\cdot|s)) \right] \\
    \text{s.t. } \mathbb{E}_{z \sim p(z), s \sim \pi_z} \left[ | z - f(s) |^2 \right] \leq \epsilon
    $$
    • 其中 \( z \) 是技能隐变量,\( f(\cdot) \) 是状态编码器

SMDP 与 Option 框架的关系

  • Option 作为 SMDP 动作:在 Option 框架中,每个 Option \( \omega \) 可以看作 SMDP 中的一个”动作”:
    • 持续时间:Option 执行的时间步数 \( \tau \)
    • 累积奖励:Option 执行期间获得的折扣奖励之和
    • 转移概率:从起始状态到终止状态的概率
  • Option 的 SMDP 参数概念对齐:对于 Option \( \omega = \langle I_\omega, \pi_\omega, \beta_\omega \rangle \),对应的 SMDP 参数为:
    • 累积奖励函数:
      $$
      r(s, \omega) = \mathbb{E} \left[ \sum_{k=0}^{\tau-1} \gamma^k R_{t+k} \mid S_t = s, \text{执行} \omega \right]
      $$
    • 状态转移概率:
      $$
      P(s’, \tau | s, \omega) = \mathbb{P}(S_{t+\tau} = s’, \tau \mid S_t = s, \text{执行} \omega)
      $$
  • SMDP 中的 Option 策略:在 SMDP 层面,策略 \( \mu : S \rightarrow \Delta(\Omega) \) 选择 Option,满足 SMDP 贝尔曼方程:
    $$
    V_\mu(s) = \sum_{\omega \in \Omega} \mu(\omega | s) \left[ r(s, \omega) + \sum_{s’, \tau} \gamma^\tau P(s’, \tau | s, \omega) V_\mu(s’) \right]
    $$

CPI:保守策略迭代 (Conservative Policy Iteration)

  • CPI 是由 Kakade 和 Langford 在 2002 年提出的一种策略迭代改进方法,是 RL 领域具有里程碑意义的算法
  • CPI 的核心思想是“保守”地更新策略,即不直接将策略完全替换为当前的贪婪策略(Greedy Policy),而是采用一种混合策略(Mixture Strategy)的方式进行更新
  • TLDR:CPI 告诉我们在理论上“怎么走才安全”(步子要小,要混合)
  • CPI 的核心思路 & 贡献:
    • 混合策略更新:
      • 传统的策略迭代通常直接寻找使当前优势函数最大化的动作作为新策略
      • CPI 提出,新策略 \(\pi_{new}\) 应当是旧策略 \(\pi_{old}\) 和贪婪策略 \(\pi’\) 的加权混合:
        $$ \pi_{new} = (1-\alpha)\pi_{old} + \alpha \pi’ $$
        • 其中 \(\alpha\) 是一个很小的正数(步长)
    • 单调性证明:CPI 的最大贡献在于它从理论上证明了,只要 \(\alpha\) 足够小,这种混合更新策略可以保证值函数(Value Function)的单调不减(Monotonic Improvement)
    • 解决的问题: 在近似强化学习中,由于函数逼近误差的存在,直接的贪婪更新往往会导致策略性能突然大幅下降(Policy Degradation)
      • CPI 通过限制策略变化的幅度,给出了策略提升的下界(Lower Bound),从而保证了学习过程的稳定性
  • CPI 的 地位:CPI 是现代“信赖域”类算法(如 TRPO)的理论鼻祖,其关于“策略提升下界”的推导直接启发了后续算法中对 KL 散度约束的使用

NPG:自然策略梯度 (Natural Policy Gradient)

  • NPG 是由 Kakade 提出的一种优化方法,是 RL 领域具有里程碑意义的算法,它试图解决标准梯度下降在强化学习参数空间中效率低下的问题
  • NPG 是 TRPO 算法的前身,其核心在于引入了黎曼几何的概念来优化策略参数
  • TLDR:NPG 告诉我们在数学上“朝哪个方向走最快”(考虑分布的几何形状)
  • NPG 的核心思路 & 贡献
    • 黎曼几何与费雪信息矩阵(Fisher Information Matrix):
      • 标准的策略梯度(Policy Gradient, PG)假设参数空间是欧几里得空间,使用标准的梯度下降方向
        • 然而,策略通常以概率分布的形式存在,参数的一点点变化可能导致概率分布的剧烈变化
      • NPG 认为,更新方向不应基于参数的欧氏距离,而应基于分布之间的距离(通常用 KL 散度衡量)
    • 自然梯度更新:
      • NPG 在更新参数时,使用费雪信息矩阵 \(F\) 的逆矩阵对标准梯度 \(\nabla J(\theta)\) 进行预处理(Preconditioning):
        $$ \theta_{new} = \theta_{old} + \eta F^{-1} \nabla J(\theta) $$
        • 这种更新方向被称为“自然梯度”,它代表了在分布流形上最陡峭的下降方向
    • 协变性(Covariant): NPG 的更新具有参数化无关性,即无论你如何参数化你的策略网络,只要表示的分布相同,更新的轨迹就是一致的
  • 特别说明:
    • NPG 极大地提高了策略梯度的收敛效率,特别是在高维参数空间中
    • NPG 指出了标准 PG 算法在“步长”和“方向”上的缺陷,直接催生了后来的 TRPO(TRPO 可以看作是 NPG 加上了强制的 KL 散度约束步长)
  • CPI 和 NPG 的比较:
    • CPI 和 NPG 这两个方法通常被放在一起讨论,因为它们共同构成了现代深度强化学习中策略优化(Policy Optimization) 流派的基石:
    • 简单来说,CPI 告诉我们在理论上“怎么走才安全”(步子要小,要混合),而 NPG 告诉我们在数学上“朝哪个方向走最快”(考虑分布的几何形状) 这两者的结合最终导致了 TRPO 等算法的诞生,使得强化学习能够更稳定地应用于复杂的连续控制任务中

RL——模仿学习

  • 参考链接:模仿学习(Imitation Learning)概述

模仿学习介绍

  • 定义 :模仿学习(Imitation Learning)是一个广义的概念,模仿学习是一种通过观察专家的行为来学习如何执行任务的机器学习方法
  • 特点 :在模仿学习中,学习算法试图复制专家的行为,而不是直接优化一个明确指定的目标函数
  • 应用场景 :这种方法可以用于解决那些难以定义奖励函数的问题
  • 分类 :一般包含了行为克隆(Behavioral Cloning,BC)、逆向强化学习(Inverse Reinforcement Learning, IRL)和生成对抗模仿学习(Generative Adversarial Imitation Learning,GAIL)等

行为克隆

  • 定义 :从一组专家示范的数据集中,通过监督学习方法来训练策略模型(预测给定状态下的最佳动作)。类似于传统监督学习中的分类或回归问题,其中输入是环境的状态,输出是专家采取的动作
  • 优点 :简单易用,当专家策略特别好,且数据量充足时往往会有不错的效果
  • 缺点 :无法很好地处理训练数据中未见过状态

逆强化学习

  • 定义 :从观察到的专家策略行为中推断出奖励函数,然后根据该奖励函数训练标准强化学习模型
  • 理解 :逆强化学习的目标是从观察到的专家策略行为中推断出奖励函数,这样就可以理解专家是如何评估不同行为的好坏的。一旦获得了这个奖励函数,就可以使用标准的强化学习技术来找到最优策略。与模仿学习和行为克隆相比,IRL试图更深入地理解专家决策背后的逻辑,而不仅仅是复制其行为

生成对抗模仿学习

  • 定义 :基于生成对抗网络的模仿学习,包含两个网络,生成器(Generator)和判别器(Discriminator),生成器就是策略,负责预测特定状态下的动作,判别器用于判断该动作是否由专家策略生成
  • 训练过程(循环以下流程) :
    • 生成器与环境交互生成轨迹
    • 判别器训练:判别目标是判断状态动作对 \((s,a)\) 是否由专家策略产生,损失函数是专家数据分数最大化、生成器数据分数最小化
    • 将判断器作为Reward Model训练生成器
  • 训练到最后,生成器生成的轨迹应该和专家轨迹接近
1…252627…63
Joe Zhou

Joe Zhou

Stay Hungry. Stay Foolish.

630 posts
53 tags
GitHub E-Mail
© 2026 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4