策略梯度
本章主要整理一下早期策略梯度、actor-critic框架、策略梯度定理等。
基本原理
基于策略的思想
我们先来了解一下策略梯度的基本思想。在基于价值的方法中,我们已经非常熟悉,通过维护一张Q表,对于任何状态-动作对,我们都能找到一个对应的Q值。在这种思路下,我们训练完一个agent以后,这个agent每遇到一个状态,就要查找该状态下所有可能的Q值,然后选出Q值最大的动作执行,这便是价值路线的策略。
我们用MC方法来重新梳理一下整个过程,假设现在我们还是在做grid-world这个游戏,MC方法是进行若干episodes,然后对每一个状态-动作进行整理,求出该状态-动作下在所有episodes下的平均Q值来作为该状态-动作的Q值,即:
我们需要用一张Q表来存储这些状态-动作的Q值,如:
- Q(s, 上) = 10.5
- Q(s, 下) = -2.1
现在,我们要转换思路,这是从价值法转换到策略梯度的关键思维转变:我们把Q表扔掉,然后换成一张策略梯度表(PG表),存储以下内容:
- H(s, 上) = 0.5
- H(s, 下) = -0.1
这里的\(H\)是偏好值,也叫参数\(\theta\)。这些数字 没有任何物理含义 。它们不代表分数,只代表agent对这个动作的“喜爱程度”。
假设agent玩完了一个episode,用MC采样得到总回报\(G = 100\),在状态s时,刚才刚好选择了动作“上”。这个时候,如果是Q表的思路,agent会看一眼Q值,发现存储的Q值才是10.5,离100还差得远,所以就把Q值往上调一下。最终,\(Q(s, a)\) 会变成所有 \(G\) 的 平均值 。
但是在策略梯度的思维方式中,agent并不会在乎H(s, 上) = 0.5这个数值到底大了还是小了,agent只看两件事:
- 一个episode下来的实际总回报G=100,正奖励,还不错
- 刚才选择的动作是“上”
然后策略梯度就会认为:既然结果这么好,那么就把“上”的偏好值H调大一点,让他下次出现的概率更高。概率来自于哪里?H表中的元素会通过Softmax函数压成概率:
先计算指数:
- \(e^{H(s, \text{上})} = e^{0.5} \approx 1.65\)
- \(e^{H(s, \text{下})} = e^{-0.1} \approx 0.90\)
两者的总和是\(1.65 + 0.90 = 2.55\),然后计算概率:
- \(\pi(s, \text{上}) = 1.65 / 2.55 \approx \mathbf{0.65}\)
- \(\pi(s, \text{下}) = 0.90 / 2.55 \approx \mathbf{0.35}\)
对于你 选中的动作 (上),最基础的偏好更新公式是:
代入数字:(假设学习率是0.1)
最后更新偏好表H:
在早期的朴素思想中,只要奖励是正的,我们就往上调。我们可以看到,基于价值的方法和策略梯度方法的本质区别在于:
- 基于价值的方法的本质是回归,它的目标是让表中的数字等于真实的分数
- 策略梯度方法的本质是优化,它的目标是让表里的数字尽可能大,只要对应的动作能够带来高分。
我们对比一下两者的公式:
可以看到:
- 价值路线的驱动力是误差,当Q=G时,更新就停止了
- 策略梯度中没有减法,G只是一个权重,只要G是正的(朴素算法中),它就会一直推着偏好值H往上涨
这种差异在grid-world这种小空间、少动作的任务中可能没什么区别,但是在复杂任务重,策略梯度思想有下列显著优势:
- Q表没办法存储连续动作的Q值,比如赛车转向角度,而且即便能存储,如果动作特别多,选出Q最大的动作又要算半天;而策略梯度只需要输出一个正态分布(均值\(\mu\)和方差\(\sigma\)),通过梯度调整\(\mu\)和\(\sigma\)就能直接回答概率最大的角度方向(比如往左打30%)
- Q表的最优动作选择变化可能会很频繁,因为Q值更新很频繁;而策略梯度的概率调整是慢慢进行的,较为平滑,这在训练中是一个优势,可以让训练更稳定
- 在石头剪子布这种任务中,Q-learning总是想找一个Q值最高的动作,结果就是会被对手看穿;而策略梯度如果发现维持33%的分布可以让期望总分G最大,那么它就会停在那里。
对于最朴素的策略梯度,我们可以初始化一个H表,然后存储偏好值(Preferences)。\(H\) 可以是任何实数,从 \(-\infty\) 到 \(+\infty\)。\(H\)没有任何直接的物理意义。 它既不是奖励,也不是步数。
比如说,H 表里的 \(10.5\) 只代表“我非常倾向于选这个动作”。至于为什么倾向?因为以前选它的时候,\(G\) 很大,把它推到了这个高度。
而概率则通常是即时计算的。比方说,agent处于状态s时,会进行如下操作:
- Lookup:从H表中提取出该状态对应的整行数据,比如
[H(上)=2.0, H(下)=1.0, H(左)=0.0, H(右)=0.0]。 - Softmax转化:对这一行跑一遍,转化为总和为1的概率分布:
[P(上)=0.64, P(下)=0.24, P(左)=0.06, P(右)=0.06]。 - Sampling采样:根据这个概率分布掷骰子,选出一个动作。
在策略梯度中,我们不采用\(\epsilon\)-greedy。在Q-learning中,策略是“硬”的(非黑即白)。如果不加 \(\epsilon\),它就会死板地只选当前最高分的,导致它可能一辈子也找不到更好的路。在策略梯度中,策略是“毛”的(带有概率)。概率分布本身就承担了 \(\epsilon\) 的职责。
这里Sampling稍微有点反直觉:Sampling按照“按比例抽样”(Proportional Sampling)的方法进行,即随机选取,有点像幸运大转盘——把转盘按照每个动作的概率去分配。一开始的时候如果我们初始化H表为0,那么所有动作被选中的概率都是一致的。在这种情况下,我们会发现策略梯度总是更倾向于选择那个概率最大的,但是并非绝对选择,而是尊重当前的概率分布。
这种抽奖方式是为了数学上的连续性,因为argmax是不可导的,所以我们不能用\(\epsilon\)-greedy这种方式去采样。
REINFORCE
REINFORCE是策略梯度家族中最古老、最纯粹的成员,其本质就是蒙特卡洛+策略梯度。
其主要步骤如下:
1、生成轨迹,使用当前的策略 \(\pi_\theta\)(你的大转盘),从头到尾玩完一局(一个episode)游戏。你会得到一串记录:
2、计算回报(Return): 对于这一局里的每一个步 \(t\),算出从那一步开始到结束一共拿了多少分:
3、梯度更新(Update): 针对这一局里发生的 每一个动作 ,根据它带来的 \(G_t\) 来拨动参数 \(\theta\):
这里要注意,公式中不是 \(\nabla \pi\)(概率的梯度),而是 \(\nabla \log \pi\)(对数概率的梯度),这是因为:
直观理解就是,如果一个动作原本的概率就很 大 (比如 0.9),它在采样中被选中的次数自然就多。如果不除以 \(0.9\),它的偏好值就会因为“出场次数多”而刷屏式地增长,哪怕它表现平平。除以 \(\pi\) 之后,算法就抵消了“出场率”的影响,真正关注于这个动作是否带来了超出预期的高分。
虽然 REINFORCE 很纯粹,但它有一个致命弱点: 特别不稳定 。REINFORCE依赖MC采样,每一局的情况可能天差地别:运气好,乱撞撞到了宝藏,所有动作都被奖励;运气差,死在了终点前,哪怕前面走得很对,所有动作也都被惩罚。其后果就是参数\(\theta\)的更新方向会像没头苍蝇一样乱撞,需要成千上万次的训练才能收敛。
策略梯度定理 (Policy Gradient Theorem)
在前面的REINFORCE介绍中,我们直观地给出了策略梯度的更新公式,但没有严格推导它为什么成立。策略梯度定理给出了这个严格的数学基础。
形式化陈述
我们定义性能指标\(J(\boldsymbol{\theta})\)为策略\(\pi_\theta\)的期望回报。策略梯度定理告诉我们:
这个定理的深刻之处在于:性能指标\(J\)对参数\(\boldsymbol{\theta}\)的梯度,可以被写成策略梯度\(\nabla \log \pi\)与动作价值函数\(Q^\pi\)的乘积的期望形式,而不需要对状态分布求导。这一点至关重要,因为状态分布\(d^\pi(s)\)本身也依赖于\(\boldsymbol{\theta}\)(改变策略会改变你访问各个状态的频率),但策略梯度定理巧妙地回避了对\(d^\pi(s)\)求导的需要。
证明思路 (Likelihood Ratio Trick)
证明的核心技巧是似然比技巧(也叫log-derivative trick):
对于任何可微函数\(f(\theta)\),都有:
这是因为:
两边同乘\(\pi_\theta(a|s)\)就得到上式。这个恒等式的妙处在于:它把对概率的求导转化为对对数概率的求导乘以概率本身,而后者恰好可以用采样来估计。
利用这个技巧,我们可以推导策略梯度。考虑单步情况下的性能指标:
对\(\boldsymbol{\theta}\)求梯度(先只考虑\(\pi_\theta\)的依赖,状态分布的依赖可以通过更精细的分析处理):
利用似然比技巧:
这就是策略梯度定理的核心。最后一步把求和转化为期望,意味着我们可以通过采样来估计这个梯度。
REINFORCE的再理解
有了策略梯度定理,REINFORCE的更新公式就有了严格的理论支撑。REINFORCE用MC采样的回报\(G_t\)来近似\(Q^\pi(S_t, A_t)\):
由于\(\mathbb{E}[G_t | S_t, A_t] = Q^\pi(S_t, A_t)\),所以\(G_t\)是\(Q^\pi\)的无偏估计。这意味着REINFORCE的更新方向在期望上就是\(\nabla J(\boldsymbol{\theta})\)的方向——它是一个无偏但高方差的梯度估计。
Baseline (基线减法)
REINFORCE的高方差问题可以通过引入基线(Baseline)来缓解。策略梯度定理允许我们在\(Q^\pi\)中减去任何只依赖于状态\(s\)的函数\(b(s)\),而不改变梯度的期望值:
为什么减去\(b(s)\)不会引入偏差?因为:
概率之和永远是1,其梯度永远是0。所以\(b(s)\)这一项在期望下被消掉了。
最自然的基线选择是状态价值函数\(V^\pi(s)\),此时\(Q^\pi(s, a) - V^\pi(s) = A^\pi(s, a)\)正好是优势函数(Advantage Function)。优势函数衡量的是"在状态\(s\)下,选择动作\(a\)比平均水平好多少"。
使用基线后的REINFORCE更新:
直觉上理解:如果没有基线,所有正回报的动作都会被加强,即使有些动作的回报远低于平均水平。引入基线后,只有回报高于平均水平的动作才会被加强,低于平均水平的动作会被抑制。这大幅减少了梯度估计的方差。
Actor-Critic框架
从REINFORCE到Actor-Critic的动机
REINFORCE with Baseline虽然减少了方差,但仍然使用MC采样来估计\(G_t\),必须等到episode结束才能更新。更重要的是,MC估计的方差依然很大——仅仅一局游戏的采样,受到随机性的影响太严重。
Actor-Critic框架的核心思想是:用一个学习到的价值函数(Critic)来替代MC采样,从而进一步降低方差,同时支持在线更新(不需要等episode结束)。
双组件架构
Actor-Critic由两个组件组成:
Actor(演员):策略网络\(\pi_\theta(a|s)\),负责"做决定"。它根据当前状态输出动作的概率分布。参数为\(\boldsymbol{\theta}\)。
Critic(评论家):价值网络\(\hat{v}(s, \mathbf{w})\)(或\(\hat{q}(s, a, \mathbf{w})\)),负责"打分"。它评估Actor当前策略的好坏。参数为\(\mathbf{w}\)。
两者的互动可以类比为:演员上台表演(Actor选择动作),评论家在台下打分(Critic评估价值),演员根据评论家的反馈调整表演(Actor根据Critic的评价更新策略)。
更新规则
Critic的更新:使用TD Error来更新价值函数(与TD Learning一章中完全一致):
Actor的更新:使用Critic给出的TD Error作为策略梯度的信号:
这里的关键在于:我们用\(\delta_t\)替代了REINFORCE中的\(G_t\)。TD Error \(\delta_t = R_{t+1} + \gamma \hat{v}(S_{t+1}) - \hat{v}(S_t)\)实际上是优势函数\(A^\pi(S_t, A_t)\)的一个估计。因此,Actor-Critic本质上是在用估计的优势函数来做策略梯度更新。
Actor-Critic相比REINFORCE的优势:
- 在线更新:每走一步就可以更新,不需要等episode结束
- 低方差:Critic的估计比MC采样稳定得多
- 代价:引入了偏差(因为Critic的估计不完美),但在实践中这个偏差-方差的权衡通常是值得的
Advantage Actor-Critic (A2C)
A2C是Actor-Critic框架的一个重要变体,它明确使用优势函数来更新Actor:
在实现中,我们不需要同时维护\(Q\)和\(V\)两个网络。利用TD Error作为优势函数的估计:
A2C的完整算法流程:
初始化Actor参数 theta, Critic参数 w
对每个episode:
初始化状态 S
对每一步:
根据 pi_theta(.|S) 采样动作 A
执行 A, 观察 R, S'
计算TD Error (Advantage估计):
delta = R + gamma * v_hat(S', w) - v_hat(S, w)
(若S'是终止状态, 则 delta = R - v_hat(S, w))
更新Critic:
w = w + alpha_w * delta * grad_w v_hat(S, w)
更新Actor:
theta = theta + alpha_theta * delta * grad_theta log pi_theta(A|S)
S <- S'
与深度强化学习的联系
Actor-Critic框架是现代深度强化学习的基石。几乎所有先进的深度RL算法都可以被看作Actor-Critic的变体:
- A3C / A2C:异步/同步并行训练的Actor-Critic,使用多个环境实例同时采集数据
- PPO (Proximal Policy Optimization):在Actor-Critic基础上引入clipped objective,限制每次策略更新的幅度,防止策略"跑偏"太远
- SAC (Soft Actor-Critic):在目标函数中加入entropy正则项,鼓励策略保持探索性;同时使用两个Critic网络来缓解overestimation问题
- DDPG / TD3:适用于连续动作空间的Actor-Critic方法,Actor直接输出确定性动作而非概率分布
这些方法的共同点是:都维护一个Actor(策略网络)和一个Critic(价值网络),通过Critic的反馈来指导Actor的学习。
策略梯度方法总结
| 方法 | 梯度信号 | 是否需要Critic | 偏差 | 方差 | 是否在线更新 |
|---|---|---|---|---|---|
| REINFORCE | \(G_t\)(MC回报) | 否 | 无偏 | 高 | 否(需等episode结束) |
| REINFORCE with Baseline | \(G_t - b(S_t)\) | 需要基线\(b\) | 无偏 | 中 | 否(需等episode结束) |
| Actor-Critic | \(\delta_t\)(TD Error) | 是 | 有偏 | 低 | 是(每步更新) |
| A2C | \(\delta_t\)(Advantage估计) | 是 | 有偏 | 低 | 是(每步更新) |
从这张表可以看出策略梯度方法的演化路线:
- REINFORCE:最纯粹,直接用MC回报做梯度估计。无偏但方差极高,训练不稳定。
- REINFORCE with Baseline:引入基线减少方差,但仍依赖MC采样。
- Actor-Critic:用Critic替代MC采样,牺牲一点偏差换来大幅方差降低,同时支持在线更新。
- A2C及后续:在Actor-Critic基础上引入各种技巧(并行采集、信任域约束、entropy正则化等),成为现代深度RL的标准范式。
这条演化路线的核心矛盾始终是偏差-方差的权衡:MC采样无偏但方差大,Bootstrapping方差小但有偏。策略梯度方法的发展史,就是在这个权衡中不断寻找更好的平衡点的过程。