1. 资料
- Udemy PG 课程:https://www.udemy.com/course/advanced-rl-pg/?couponCode=KEEPLEARNING
- ChatGPT 对 PPO 的介绍:https://chatgpt.com/share/67308475-85b0-8007-81e5-8c399bac72f4
- AC 方法论文:https://proceedings.neurips.cc/paper_files/paper/1999/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf
2. 策略梯度PG思路说明
PG 即策略梯度方法(Policy Gradient Methods)是一类直接优化策略的强化学习方法。与基于价值的方法(如Q学习)不同,策略梯度方法直接通过优化策略函数来找到最优策略,而不是通过计算状态或状态-动作的价值。
在强化学习中,策略可以理解为一种概率分布,它定义了在每个状态下采取各个动作的概率。策略梯度方法的核心思想是通过计算策略的梯度来优化策略,使得策略能够在每个状态下选择更好的动作,从而增加累积奖励。
2.1 PG 和 QL 对比
基本的把场景抽象成马尔科夫链过程等思路和 Q Learning 是一致的。QL 思路和实现见:https://pangruitao.com/post/5028
建模思路差异
- PG 是直接针对策略本身进行建模和优化。
- 而 QL 是对 Q 值的建模和优化,策略是基于 Q 的(如取 s 下最大的 Q 对应的 a)
策略实现的差异
- 由于 PG 是对策略进行建模,得到的通常直接是各个行为的概率
- 而 QL 得到的是各个行为的 Q 值,概率选择是基于 Q 的自定算法(max, softmax 或者 epsilon-greedy 等)
PG 方法的优势
- 直接优化策略:策略梯度方法直接优化策略,而非间接地计算状态价值或动作价值,因此它能很好地应对高维连续动作空间的问题。
- 稳定的学习过程:在某些情况下,相比基于价值的方法,策略梯度方法的学习过程更加稳定。
- 直接适合概率策略:策略梯度方法的输出是一个概率分布,适合于需要概率性决策的任务。
PG 方法的劣势
- 高方差问题:策略梯度方法在更新时会遇到较高的方差,导致更新不稳定。常用的解决方案是使用优势估计方法或基线函数(如状态值函数)来降低方差。
- 样本效率低:相较于价值基的方法,策略梯度方法的样本效率相对较低,因为每次策略更新只能使用当前策略的采样数据。
2.2 PG 的核心思路
2.2.1 定义策略
首先,定义策略:\(\pi_{\theta}(a|s)\)
- \(\pi\) 是由 \(\theta\) 参数化的策略。决定了在情景 s (state) 下,选择行为 a (action) 的概率。
2.2.2 定义目标函数
策略梯度方法的目标是最大化累计奖励的期望,记作 \(J(\theta)\) 这个目标函数可以表示为:
\(J(\theta) = \mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \gamma^t r(s_t, a_t) \right]\)
- \(\gamma\) 是折扣因子,越眼前的奖励越重要(类似经济学折现率)
2.2.3 计算策略梯度
目标是通过调整 \(\theta\) 提升 \(J(\theta)\)。
如果是凸问题,则又可以用梯度上升的方法。需要求 \(J(\theta)\) 关于各 \(\theta\) 的梯度,即 \(\nabla_{\theta} J(\theta)\)
根据刚才目标函数的定义,有
\(\nabla_{\theta} J(\theta) = \nabla_{\theta} \mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \gamma^t r(s_t, a_t) \right]\)
期望即各个事件值和概率乘积求和,展开即
\(\nabla_{\theta} J(\theta) = \nabla_{\theta} \left[ \sum_{t=0}^{T} \sum_{a} \pi_{\theta}(a|s_t) \gamma^t r(s_t, a_t) \right]\)
由于求期望和求梯度的顺序是可以交换的。所以有
\(\nabla_{\theta} J(\theta) = \left[ \sum_{t=0}^{T} \sum_{a} \nabla_{\theta} \pi_{\theta}(a|s_t) \gamma^t r(s_t, a_t) \right]\)
根据微积分
\(\nabla_{\theta} f(\theta) = \nabla_{\theta} (e^{\log f(\theta)}) = f(\theta) * \nabla_{\theta} \log f(\theta)\)
所以有
\(\nabla_{\theta} \pi_{\theta}(a|s) = \pi_{\theta}(a|s) \nabla_{\theta} \log \pi_{\theta}(a|s)\)
把等式替换进去,得到
\(\nabla_{\theta} J(\theta) = \left[ \sum_{t=0}^{T} \sum_{a} \pi_{\theta}(a|s_t) \nabla_{\theta} \log \pi_{\theta}(a|s_t) \gamma^t r(s_t, a_t) \right]\)
简化回期望的形式:
\(\nabla_{\theta} J(\theta) = \mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a|s_t) \gamma^t r(s_t, a_t) \right]\)
实际操作中 通常会用一个 “优势函数” \(\hat{A}(s, a)\) 来代替 \(\sum_{t=0}^{T} \gamma^t r(s_t, a_t)\),以衡量各个行为相对其他行为的优势,得到
\(\nabla_{\theta} J(\theta) = \mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a|s_t) \hat{A}(s, a) \right]\)
2.2.4 策略参数学习
计算得到梯度以后,就不断梯度上升更新参数即可:
\(\theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta)\)
即
\(\theta \leftarrow \theta + \alpha \mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a|s_t) \hat{A}(s, a) \right]\)
2.3 蒙特卡洛采样
在实际场景中为了参数的梯度学习,需要获得 \(\mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a|s_t) \hat{A}(s, a) \right]\) 的值,但实际非常难,因为通常有近乎无穷的分支路径可能性。
但我们可以采用一些方法对其进行估计。
最常用的即蒙特卡洛采样:尝试根据策略 \(\pi_{\theta}(a|s)\) 完成1次游戏,并记录此次游戏过程中得到的各 \(s, a, \hat{A}(s, a)\)
- 其中 \(\hat{A}(s, a)\) 通常和后续步骤的奖励反馈也相关,所以需要完成1次游戏后回溯计算得到
得到的每组 \(s, a, \hat{A}(s, a)\) 样本,都可以计算出 \(\nabla_{\theta} \log \pi_{\theta}(a|s) \hat{A}(s, a) \)
并以此直接作为 \(\mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a|s_t) \hat{A}(s, a) \right]\) 的估计。
进而实际的参数学习方式是:\(\theta \leftarrow \theta + \alpha \nabla_{\theta} \log \pi_{\theta}(a|s) \hat{A}(s, a) \)
蒙特卡洛之所以有效,主要由于:
- 容易实现:实现非常简单,只需要不停重复实践和记录采样即可。无需过多数学上的处理。
- 是无偏估计:虽然简单,但根据大数定律,当样本数量趋于无穷时,随机的单样本的期望值确实等于目标的期望值。
事实上,我们还可以更进一步,连1次游戏也不完全完成。即采用“截断蒙特卡洛回报”(Truncated Monte Carlo Return)。
- 如果我们在蒙特卡洛采样中,到达某状态 s ,如果我们相信 s 自己对其未来的价值估计,则我们可以直接用 s 的那个价值估计给这次采样,直接返回。
- 甚至可以再极端一点,每次仅看下一个状态的值就直接返回用于估计。这样实现起来非常方便灵活。且有一个专门的名字:时序差分TD(Temporal Difference)
- 事实上之前 DQL 中更新 Q 值就是这样做的,非常极端,只仅关系下一步的 Q 值(更新方法:\(Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left( r_t + \gamma \max_{a’} Q(s_{t+1}, a’) – Q(s_t, a_t) \right)\))
- 不过 截断蒙特卡洛回报 是有代价的,即估计的偏差,由于没有完整的游戏,所以估计的回报会在一定时间内都着重前期而非完整路径。而完整路径采样则是无偏估计。
- 但由于其带来的灵活和及时性,这个代价通常愿意被接受。
3. REINFORCE 方法
REINFORCE 是基于上面的策略梯度的最基本的实现。
详细思路、实现和优化见:https://pangruitao.com/post/5258
4. AC 方法
AC 是基于 REINFOECE 的优化,尝试提升稳定性。
详细思路、实现和优化见:https://pangruitao.com/post/5262
5. PPO 方法
PPO 是基于 AC 的进一步优化,进一步提升了稳定性。
详细思路、实现和优化见:https://pangruitao.com/post/5295