策略梯度(Policy Gradient)

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(后面拿到的总收益):

  1. 如果这条轨迹收益 GtG_tGt 很大(好) :梯度会推动 πθ\pi_\thetaπθ,提高这个状态下选这个动作的概率
  2. 如果这条轨迹收益 GtG_tGt 很小甚至负(差) :梯度会推动 πθ\pi_\thetaπθ,降低这个动作的概率

一句话大白话:

拿策略去跟环境互动采样多条轨迹;每条轨迹算回报;回报好的动作,鼓励多选;回报差的动作,减少选择。

3. REINFORCE 算法(最朴素的Policy Gradient实现)

REINFORCE 就是策略梯度定理最直接的蒙特卡洛版本:

  1. 用 πθ\pi_\thetaπθ 和环境交互,采集一条完整轨迹 τ\tauτ
  2. 从后往前,逐时刻计算 GtG_tGt
  3. 构造损失(注意:梯度上升,训练时一般写成负的目标做梯度下降 )
    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)
  4. θ←θ+α⋅∇θ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⋅∇log⁡p\nabla p = p \cdot \nabla \log p∇p=p⋅∇logp

这个恒等式是核心!

推导:

ddθlog⁡p=1pdpdθ  ⟹  dpdθ=p⋅dlog⁡pdθ\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(τ)⋅∇log⁡p(τ)\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(τ)⋅∇log⁡p(τ)\nabla J = \mathbb{E}_{\tau \sim p(\tau)}R(\\tau) \\cdot \\nabla \\log p(\\tau)∇J=Eτ∼p(τ)R(τ)⋅∇logp(τ)

👉 也就是说:我们不需要求原始概率的梯度 ∇p\nabla p∇p,只需要求 ∇log⁡p\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)

问题:

  1. 轨迹概率相乘,数值爆炸变小,训练不稳定
  2. 高概率动作天然梯度更大,容易卡死,探索差
  3. 推导不出简洁的策略梯度公式,数学上很麻烦

换成 log 版本:

∇J∝Gt⋅∇log⁡π(at∣st) \nabla J \propto G_t \cdot \nabla \log \pi(a_t | s_t) ∇J∝Gt⋅∇logπ(at∣st)

全部解决上面三个问题。


✅ 极简一句话总结三层原因

  1. 数值原因:把一串概率相乘变成相加,防止小数相乘下溢;
  2. 数学原因:用似然比 trick,把梯度公式简化成我们现在这个简洁版本(没有这个 trick,policy gradient 根本推不出来);
  3. 优化偏好: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(τ∣θ)

似然比恒等式:

∇log⁡p=1p∇p⇒∇p=p⋅∇log⁡p \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(τ)⋅∇log⁡p(τ) \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(τ)∇log⁡p(τ)f(\tau)=G(\tau)\nabla\log p(\tau)f(τ)=G(τ)∇logp(τ):

∇θJ=Eτ∼πθG(τ)⋅∇log⁡p(τ) \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)

取对数,乘积转加法:

log⁡p(τ)=∑tlog⁡πθ(at∣st) \log p(\tau)=\sum_t \log\pi_\theta(a_t|s_t) logp(τ)=t∑logπθ(at∣st)

梯度线性性质:和的梯度等于梯度之和

∇log⁡p(τ)=∑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)


相关推荐
疯华整猫25 分钟前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
慢慢来不要急38 分钟前
Anthropic 弃用 Git 自建源码控制系统 · 11-11
人工智能·开发工具
用户别睡觉1 小时前
有时候放弃也是一种收获
人工智能·github
shengjk11 小时前
从一条 Bash 命令看懂 LLM Agent:为什么大模型会执行命令?
人工智能
Yuzhiyuxia2 小时前
【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点
人工智能·安全·面试
dozenyaoyida2 小时前
AI与大模型新闻日报 | 2026-11-11
人工智能·chatgpt·大模型·新闻
xsd202411182 小时前
把品牌官网做成一个 3D 世界:scroll-world
人工智能
孟健3 小时前
我用Claude Skills把出海视频月账单从$86打到了$16
人工智能·ai编程·claude
泯泷3 小时前
同样是多 Agent,为什么有的稳,有的却天天翻车?
人工智能·llm·agent