Policy Gradient(策略梯度)基础思想
Policy Gradient 属于强化学习 里的策略优化流派,和 Q-Learning 这类"先学价值、再根据价值选动作"的方法不一样:
它直接拟合策略 πθ(a∣s)\pi_\theta(a|s)πθ(a∣s) :输入状态 sss,输出动作 aaa 的概率分布;然后用梯度上升更新参数 θ\thetaθ,让未来期望收益尽可能变大。
1. 核心概念快速回顾
- πθ(a∣s)\pi_\theta(a|s)πθ(a∣s):策略网络,参数 θ\thetaθ。给定状态 sss,输出每个动作的概率(随机策略)
- 轨迹 τ\tauτ:一条完整交互序列
τ=(s0,a0,r0,s1,a1,r1,...,sT,aT,rT)\tau = (s_0,a_0,r_0,s_1,a_1,r_1,...,s_T,a_T,r_T)τ=(s0,a0,r0,s1,a1,r1,...,sT,aT,rT) - 轨迹回报(总奖励):
R(τ)=∑t=0TrtR(\tau)=\sum_{t=0}^T r_tR(τ)=t=0∑Trt - 目标:最大化期望回报
J(θ)=Eτ∼πθR(τ)J(\theta)=\mathbb{E}{\tau\sim\pi\theta}R(\\tau)J(θ)=Eτ∼πθR(τ)
我们的目标就是:maxθJ(θ)\displaystyle \max_\theta J(\theta)θmaxJ(θ)
重点:J(θ)J(\theta)J(θ) 是期望,样本轨迹是从当前策略采样出来的。
2. 策略梯度定理(最核心公式)
直接对 J(θ)J(\theta)J(θ) 求梯度:
∇θJ(θ)=Eτ∼πθR(τ)⋅∑t=0T∇θlogπθ(at∣st) \nabla_\theta J(\theta) =\mathbb{E}{\tau\sim\pi\theta}\left R(\\tau)\\cdot \\sum_{t=0}\^T \\nabla_\\theta \\log\\pi_\\theta(a_t\|s_t) \\right ∇θJ(θ)=Eτ∼πθR(τ)⋅t=0∑T∇θlogπθ(at∣st)
写成按时间步期望形式(更常用):
∇θJ(θ)=Est∼πθat∼πθ(⋅∣st)Gt⋅∇θlogπθ(at∣st) \nabla_\theta J(\theta) =\mathbb{E}{\substack{s_t\sim\pi\theta\\a_t\sim\pi_\theta(\cdot|s_t)}} \left G_t \\cdot \\nabla_\\theta \\log\\pi_\\theta(a_t\|s_t) \\right ∇θJ(θ)=Est∼πθat∼πθ(⋅∣st)Gt⋅∇θlogπθ(at∣st)
GtG_tGt:从t时刻往后的折扣回报 (Return)
Gt=∑k=tTγk−trkG_t=\sum_{k=t}^T \gamma^{k-t}r_kGt=k=t∑Tγk−trk
γ\gammaγ:折扣因子,0≤γ≤10\le\gamma\le10≤γ≤1
直观理解这个式子
∇θlogπθ(at∣st)\nabla_\theta \log\pi_\theta(a_t|s_t)∇θlogπθ(at∣st):
- 叫做得分函数(score function)
- 含义:调整参数,增大当前这个 (st,at)(s_t,a_t)(st,at) 动作的概率
乘上 GtG_tGt(后面拿到的总收益):
- 如果这条轨迹收益 GtG_tGt 很大(好) :梯度会推动 πθ\pi_\thetaπθ,提高这个状态下选这个动作的概率
- 如果这条轨迹收益 GtG_tGt 很小甚至负(差) :梯度会推动 πθ\pi_\thetaπθ,降低这个动作的概率
一句话大白话:
拿策略去跟环境互动采样多条轨迹;每条轨迹算回报;回报好的动作,鼓励多选;回报差的动作,减少选择。
3. REINFORCE 算法(最朴素的Policy Gradient实现)
REINFORCE 就是策略梯度定理最直接的蒙特卡洛版本:
- 用 πθ\pi_\thetaπθ 和环境交互,采集一条完整轨迹 τ\tauτ
- 从后往前,逐时刻计算 GtG_tGt
- 构造损失(注意:梯度上升,训练时一般写成负的目标做梯度下降 )
L(θ)=−∑t=0TGtlogπθ(at∣st) L(\theta)=-\sum_{t=0}^T G_t \log\pi_\theta(a_t|s_t) L(θ)=−t=0∑TGtlogπθ(at∣st) - θ←θ+α⋅∇θJ\theta\leftarrow\theta+\alpha\cdot \nabla_\theta Jθ←θ+α⋅∇θJ(等价于最小化上面的 LLL)
✅ 优点:简单、理论干净;适合连续动作空间(策略输出高斯分布均值方差)
❌ 缺点:
- 方差极大:一条轨迹的总回报 GtG_tGt 噪声非常大
- 必须等轨迹结束才能更新(蒙特卡洛,不能在线一步更新)
- 回报有基准问题:所有奖励都为正的时候,会无脑提高所有动作概率
4. Baseline(基线)------解决高方差
我们不直接用 GtG_tGt,改用优势函数 At=Gt−b(st)A_t = G_t - b(s_t)At=Gt−b(st),b(st)b(s_t)b(st) 就是基线,通常用状态价值 Vϕ(st)V_\phi(s_t)Vϕ(st)
∇θJ(θ)=E(Gt−V(st))⋅∇θlogπθ(at∣st) \nabla_\theta J(\theta)=\mathbb{E}\Big(G_t-V(s_t))\\cdot\\nabla_\\theta\\log\\pi_\\theta(a_t\|s_t)\\Big ∇θJ(θ)=E(Gt−V(st))⋅∇θlogπθ(at∣st)
- 数学上:减去基线不改变梯度的期望(无偏)
- 效果:大幅降低梯度方差,训练稳定很多
这一步就是 Actor-Critic 的雏形:
- Actor:策略网络 πθ\pi_\thetaπθ(负责选动作)
- Critic:价值网络 Vϕ(s)V_\phi(s)Vϕ(s)(负责估计基线/状态价值)
5. 和 Value-Based 方法对比(Q-learning/DQN)
- Value-based:先学价值函数 Q(s,a)Q(s,a)Q(s,a),略是隐式的(ε\varepsilonε-greedy、argmax);偏向离散动作
- Policy Gradient:直接学策略分布 π(a∣s)\pi(a|s)π(a∣s);天然支持连续动作;优化目标更直接,但方差更大
6. 一句话总结Policy Gradient思想
通过采样轨迹评估动作好坏,利用对数似然梯度,提高高回报动作被采样到的概率,压低低回报动作的概率,不断提升策略拿到的平均奖励。
我们分三层讲,先抛开强化学习,再回到 policy gradient,先讲直觉,再讲数学,最后说如果不取 log 会发生什么坏事。
1. 先记住:我们本来想要什么?
一条轨迹 τ=s0,a0,s1,a1...\tau = s_0, a_0, s_1, a_1\dotsτ=s0,a0,s1,a1...
这条轨迹出现的概率是:
p(τ∣θ)=πθ(a0∣s0)⋅πθ(a1∣s1)⋅πθ(a2∣s2)... p(\tau|\theta) = \pi_\theta(a_0|s_0) \cdot \pi_\theta(a_1|s_1) \cdot \pi_\theta(a_2|s_2)\dots p(τ∣θ)=πθ(a0∣s0)⋅πθ(a1∣s1)⋅πθ(a2∣s2)...
这是一串概率相乘。
我们的目标:最大化 p(τ)×回报 R(τ) 的期望p(\tau) \times \text{回报 } R(\tau) \text{ 的期望}p(τ)×回报 R(τ) 的期望。
问题来了:很多个小于 1 的数不断相乘,结果会极小!
比如 0.9×0.9×0.9×...0.9 \times 0.9 \times 0.9 \times \dots0.9×0.9×0.9×... 乘几十次,直接变成 0.00000010.00000010.0000001,计算机浮点数存不下,直接下溢成 000,梯度直接算崩。
✅ log 的第一个作用:把乘法 → 加法
log(π0⋅π1⋅π2)=logπ0+logπ1+logπ2 \log (\pi_0 \cdot \pi_1 \cdot \pi_2) = \log \pi_0 + \log \pi_1 + \log \pi_2 log(π0⋅π1⋅π2)=logπ0+logπ1+logπ2
加法不会越乘越小,数值稳定,不会下溢。
这是工程上最直接的理由。
2. 第二个:数学上的技巧 ------ 对数求导法则(最重要!得分函数 trick)
我们想求 ∇θp(τ)\nabla_\theta p(\tau)∇θp(τ)
∇p=p⋅∇logp\nabla p = p \cdot \nabla \log p∇p=p⋅∇logp
这个恒等式是核心!
推导:
ddθlogp=1pdpdθ ⟹ dpdθ=p⋅dlogpdθ\frac{d}{d\theta} \log p = \frac{1}{p} \frac{dp}{d\theta} \implies \frac{dp}{d\theta} = p \cdot \frac{d \log p}{d\theta}dθdlogp=p1dθdp⟹dθdp=p⋅dθdlogp
代入我们的目标 J=ER(τ)p(τ)J = \mathbb{E}R(\\tau)p(\\tau)J=ER(τ)p(τ)
∇J=ER(τ)⋅∇p(τ)=ER(τ)⋅p(τ)⋅∇logp(τ)\nabla J = \mathbb{E}R(\\tau) \\cdot \\nabla p(\\tau) = \mathbb{E}R(\\tau) \\cdot p(\\tau) \\cdot \\nabla \\log p(\\tau)∇J=ER(τ)⋅∇p(τ)=ER(τ)⋅p(τ)⋅∇logp(τ)
期望本身就是对 p(τ)p(\tau)p(τ) 求平均:Ef(τ)=∑p(τ)f(τ)\mathbb{E}f(\\tau) = \sum p(\tau)f(\tau)Ef(τ)=∑p(τ)f(τ)
所以上面式子里面的 p(τ)p(\tau)p(τ) 直接被吸收进期望采样里!
最后简化成:
∇J=Eτ∼p(τ)R(τ)⋅∇logp(τ)\nabla J = \mathbb{E}_{\tau \sim p(\tau)}R(\\tau) \\cdot \\nabla \\log p(\\tau)∇J=Eτ∼p(τ)R(τ)⋅∇logp(τ)
👉 也就是说:我们不需要求原始概率的梯度 ∇p\nabla p∇p,只需要求 ∇logp\nabla \log p∇logp!
这就是策略梯度定理的来源!
如果不取 log,这个简化根本做不出来,公式会带着 p(τ)p(\tau)p(τ),非常麻烦。
这个技巧名字叫 likelihood ratio trick(似然比技巧),policy gradient 就是靠这个 trick 推出来的。
3. 第三个:∇logπ\nabla \log \pi∇logπ 的含义:相对增长(这个是最难理解的)
我们对比两个梯度:
- ∇π\nabla \pi∇π:概率绝对增加多少
- ∇logπ=∇ππ\nabla \log \pi = \frac{\nabla \pi}{\pi}∇logπ=π∇π:概率相对增长比例
举例子:
- 情况 1:π=0.01\pi = 0.01π=0.01,想翻倍到 0.02→0.02 \rightarrow0.02→ 相对增长 100%100\%100%,绝对只增加 0.010.010.01
- 情况 2:π=0.8\pi = 0.8π=0.8,想翻倍到 1.61.61.6 ❌ (不可能,概率上限是 1)
强化学习里,我们更关心:这个动作能不能变的"更有可能被选"(相对提升),而不是它绝对涨了多少。
比如一个很少选的好动作(概率 0.01),我们很希望它翻倍;
而一个本来就很高概率的动作(0.8),再涨一点点空间很小。
∇logπ\nabla \log \pi∇logπ 天然优先鼓励低概率好动作,正好符合我们的需求。
如果直接用 ∇π\nabla \pi∇π:
概率大的动作天然梯度大,训练会无脑偏爱本来就经常选的动作,很难探索新动作。
4. 举个对比:不取 log 会怎么样?
假设我们傻乎乎直接用 ∇π(a∣s)\nabla \pi(a|s)∇π(a∣s),梯度写成:
∇J∝Gt⋅∇π(at∣st) \nabla J \propto G_t \cdot \nabla \pi(a_t | s_t) ∇J∝Gt⋅∇π(at∣st)
问题:
- 轨迹概率相乘,数值爆炸变小,训练不稳定
- 高概率动作天然梯度更大,容易卡死,探索差
- 推导不出简洁的策略梯度公式,数学上很麻烦
换成 log 版本:
∇J∝Gt⋅∇logπ(at∣st) \nabla J \propto G_t \cdot \nabla \log \pi(a_t | s_t) ∇J∝Gt⋅∇logπ(at∣st)
全部解决上面三个问题。
✅ 极简一句话总结三层原因
- 数值原因:把一串概率相乘变成相加,防止小数相乘下溢;
- 数学原因:用似然比 trick,把梯度公式简化成我们现在这个简洁版本(没有这个 trick,policy gradient 根本推不出来);
- 优化偏好:log 梯度代表相对提升,适合鼓励稀有但是优质的动作。
不是我们"想取 log",而是:为了推出这个简洁、好用的梯度公式,数学上自然就冒出 log 了。
目标:
J(θ)=Eτ∼πθG(τ)=∑τp(τ∣θ)G(τ) J(\theta) = \mathbb{E}{\tau\sim \pi\theta}G(\\tau) = \sum_{\tau} p(\tau|\theta) G(\tau) J(θ)=Eτ∼πθG(τ)=τ∑p(τ∣θ)G(τ)
直接求梯度:
∇θJ=∑τG(τ)⋅∇θp(τ∣θ) \nabla_\theta J = \sum_{\tau} G(\tau) \cdot \nabla_\theta p(\tau|\theta) ∇θJ=τ∑G(τ)⋅∇θp(τ∣θ)
似然比恒等式:
∇logp=1p∇p⇒∇p=p⋅∇logp \nabla \log p = \frac{1}{p}\nabla p \quad \Rightarrow \quad \nabla p = p \cdot \nabla \log p ∇logp=p1∇p⇒∇p=p⋅∇logp
代入梯度:
∇θJ=∑τG(τ)⋅p(τ)⋅∇logp(τ) \nabla_\theta J =\sum_{\tau} G(\tau) \cdot p(\tau) \cdot \nabla\log p(\tau) ∇θJ=τ∑G(τ)⋅p(τ)⋅∇logp(τ)
根据期望定义 Ef(τ)=∑p(τ)f(τ)\mathbb{E}f(\\tau)=\sum p(\tau)f(\tau)Ef(τ)=∑p(τ)f(τ),令 f(τ)=G(τ)∇logp(τ)f(\tau)=G(\tau)\nabla\log p(\tau)f(τ)=G(τ)∇logp(τ):
∇θJ=Eτ∼πθG(τ)⋅∇logp(τ) \nabla_\theta J=\mathbb{E}{\tau\sim\pi\theta}\big G(\\tau)\\cdot \\nabla\\log p(\\tau) \\big ∇θJ=Eτ∼πθG(τ)⋅∇logp(τ)
轨迹概率是乘积:
p(τ)=∏tπθ(at∣st) p(\tau) = \prod_{t}\pi_\theta(a_t|s_t) p(τ)=t∏πθ(at∣st)
取对数,乘积转加法:
logp(τ)=∑tlogπθ(at∣st) \log p(\tau)=\sum_t \log\pi_\theta(a_t|s_t) logp(τ)=t∑logπθ(at∣st)
梯度线性性质:和的梯度等于梯度之和
∇logp(τ)=∑t∇logπθ(at∣st) \nabla\log p(\tau)=\sum_t \nabla\log\pi_\theta(a_t|s_t) ∇logp(τ)=t∑∇logπθ(at∣st)
最后得到策略梯度定理:
∇θJ=E∑tG(τ)⋅∇logπθ(at∣st) \nabla_\theta J=\mathbb{E}\left \\sum_t G(\\tau)\\cdot \\nabla\\log\\pi_\\theta(a_t\|s_t) \\right ∇θJ=Et∑G(τ)⋅∇logπθ(at∣st)