Axi's Blog

Back

RL 学习笔记(10):策略梯度方法Blur image

本博客基于西安交通大学强化学习课程 PPT 改编,历经 Gemini 以及本人总结以及整理形成。

引言#

之前我们主要学习了基于价值 (Value-Based) 的强化学习方法(如 Q-learning, DQN)。这些方法的核心是学习价值函数(V(s)V(s)Q(s,a)Q(s, a)),然后根据价值函数间接地导出策略(例如,使用 ϵ\epsilon-greedy 选择 Q 值最高的动作)。

然而,基于价值的方法在某些情况下存在局限性:

  • 难以处理高维或连续动作空间(Q-learning 需要对所有动作计算 max\max)。
  • 无法自然地学习随机性策略,而随机策略在某些场景(如部分可观测环境、需要探索或最优策略本身就是随机的)下是必要的或更优的。
  • 价值函数本身可能非常复杂,导致学习困难。

基于策略 (Policy-Based) 的方法提供了一种替代方案:直接参数化并优化策略本身

  • 核心思想:将策略表示为一个以参数 θ\theta 控制的函数 πθ(as)=P[A=aS=s,θ]\pi_\theta(a|s) = \mathbb{P}[A=a | S=s, \theta]。我们的目标是找到最优的参数 θ\theta^*,使得该策略 πθ\pi_{\theta^*} 的性能(例如,累积回报)最大化。
  • 策略函数近似:为了使用梯度优化,策略函数 πθ(as)\pi_\theta(a|s) 需要对参数 θ\theta 可微。常用的有 Softmax 策略(离散动作)或高斯策略(连续动作)等。

基于策略方法的优劣势

  • 优势:收敛性较好(不易发散);天然适用于连续动作空间;可以学习随机策略;策略本身可能更简单。
  • 劣势:通常收敛到局部最优;策略评估(计算梯度)的样本效率可能较低,且方差较高。

策略梯度定理 (Policy Gradient Theorem)#

为了通过梯度上升法 θθ+αθJ(θ)\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta) 来优化策略参数 θ\theta,我们需要计算目标函数 J(θ)J(\theta) (衡量策略性能,如初始状态价值 Vπθ(s0)V^{\pi_\theta}(s_0) 或平均奖励)的梯度 θJ(θ)\nabla_\theta J(\theta),即策略梯度

策略梯度定理提供了一个计算策略梯度的基础表达式,它将目标函数的梯度与策略 πθ\pi_\theta动作价值函数 qπθ(s,a)q_{\pi_\theta}(s, a) 联系起来,并且(方便地)不依赖于状态分布 dπθ(s)d^{\pi_\theta}(s) 对参数 θ\theta 的导数。

定理:对于常用的性能目标 J(θ)J(\theta),策略梯度可以表示为:

θJ(θ)sSdπθ(s)aAqπθ(s,a)θπθ(as,θ)\nabla_{\theta} J(\theta) \propto \sum_{s \in \mathcal{S}} d^{\pi_{\theta}}(s) \sum_{a \in \mathcal{A}} q_{\pi_{\theta}}(s, a) \nabla_{\theta} \pi_{\theta}(a|s, \theta)

或者,更常用的期望形式为:

θJ(θ)=Eπθ[qπθ(St,At)θlogπθ(AtSt,θ)]\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}} [ q_{\pi_{\theta}}(S_t, A_t) \nabla_{\theta} \log \pi_{\theta}(A_t|S_t, \theta) ]

其中,期望 Eπθ[]\mathbb{E}_{\pi_{\theta}}[\cdot] 是在策略 πθ\pi_\theta 下对轨迹 (St,At)(S_t, A_t) 进行的。θlogπθ(AtSt,θ)\nabla_{\theta} \log \pi_{\theta}(A_t|S_t, \theta) 被称为得分函数 (score function)

推导概要 (利用对数导数技巧)θJ(θ)sdaqπ=sdaπqππ=sdaπqlogπ=E[qlogπ]\nabla_{\theta} J(\theta) \propto \sum_s d \sum_a q \nabla \pi = \sum_s d \sum_a \pi q \frac{\nabla \pi}{\pi} = \sum_s d \sum_a \pi q \nabla \log \pi = \mathbb{E}[q \nabla \log \pi]

这个定理告诉我们,策略梯度的方向是:增加那些具有较高动作价值 qπθ(St,At)q_{\pi_\theta}(S_t, A_t) 的动作 AtA_t 的对数概率 logπθ(AtSt,θ)\log \pi_\theta(A_t|S_t, \theta)

估算策略梯度:REINFORCE 算法#

策略梯度定理给出了梯度的期望形式,我们可以使用蒙特卡洛采样来估计这个期望。

基本思想

  1. 根据当前策略 πθ\pi_\theta 运行一个完整的 episode,获得一条轨迹 S0,A0,R1,S1,A1,R2,,ST1,AT1,RTS_0, A_0, R_1, S_1, A_1, R_2, \dots, S_{T-1}, A_{T-1}, R_T
  2. 对于轨迹中的每一步 (St,At)(S_t, A_t)
    • 使用从 tt 时刻开始的完整样本回报 GtG_t 作为动作价值 qπθ(St,At)q_{\pi_\theta}(S_t, A_t)无偏估计Gtk=tT1γktRk+1G_t \doteq \sum_{k=t}^{T-1} \gamma^{k-t} R_{k+1}
    • 计算得分函数 θlogπθ(AtSt,θ)\nabla_{\theta} \log \pi_{\theta}(A_t|S_t, \theta)
    • 构造策略梯度的单样本无偏估计g(t)=Gtθlogπθ(AtSt,θ)g(t) = G_t \nabla_{\theta} \log \pi_{\theta}(A_t|S_t, \theta)
  3. 使用这个随机梯度来更新策略参数: θθ+αg(t)\theta \leftarrow \theta + \alpha g(t) (通常在一个 episode 结束后,累积所有时间步的梯度进行一次更新,或者每一步都更新)。

这就是 REINFORCE 算法 (也称 Monte Carlo Policy Gradient)。

算法:REINFORCE (基本形式)

算法参数: 学习率 α > 0
初始化: 策略参数 θ 任意

循环 对每个 episode:
  根据当前策略 π_θ 生成一个 episode: S₀, A₀, R₁, ..., S_{T-1}, A_{T-1}, R_T
  初始化 G = 0
  对于 t = T-1, T-2, ..., 0:
    // 计算从时间 t 开始的回报 G_t (这里使用迭代计算)
    G ← R_{t+1} + γ * G
    // 计算梯度项 g(t) = G_t * ∇logπ
    ∇logπ ← ∇_θ log π_θ(A_t | S_t, θ)
    // 更新策略参数 (可以在循环内每步更新,或累积梯度在 episode 结束后更新)
    θ ← θ + α * G * ∇logπ
plaintext

REINFORCE 的主要问题:使用 GtG_t 作为 qπθq_{\pi_\theta} 的估计虽然无偏,但其方差非常高,导致学习过程缓慢且不稳定。

降低方差:引入基线 (Baseline)#

为了解决 REINFORCE 的高方差问题,可以在策略梯度估计中引入一个基线 (Baseline) b(s)b(s),它只依赖于状态 ss,不依赖于动作 aa

策略梯度(带基线)

θJ(θ)=Eπθ[(qπθ(St,At)b(St))θlogπθ(AtSt,θ)]\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}} [ (q_{\pi_{\theta}}(S_t, A_t) - b(S_t)) \nabla_{\theta} \log \pi_{\theta}(A_t|S_t, \theta) ]

为何可行:减去基线 b(St)b(S_t) 不会改变梯度的期望值(即梯度估计仍然无偏),因为 EAπθ(St)[b(St)θlogπθ(ASt,θ)]=0\mathbb{E}_{A \sim \pi_\theta(\cdot|S_t)} [ b(S_t) \nabla_{\theta} \log \pi_{\theta}(A|S_t, \theta) ] = 0

基线的作用:选择合适的基线 b(s)b(s) 可以显著降低梯度估计的方差

常用基线:状态价值函数 Vπθ(s)V_{\pi_\theta}(s) 一个非常自然且常用的选择是使用当前策略下的状态价值函数 Vπθ(s)V_{\pi_\theta}(s) 作为基线。此时,(qπθ(St,At)Vπθ(St))(q_{\pi_\theta}(S_t, A_t) - V_{\pi_\theta}(S_t)) 正是优势函数 (Advantage Function) Aπθ(St,At)A_{\pi_\theta}(S_t, A_t)

策略梯度变为:

θJ(θ)=Eπθ[Aπθ(St,At)θlogπθ(AtSt,θ)]\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}} [ A_{\pi_{\theta}}(S_t, A_t) \nabla_{\theta} \log \pi_{\theta}(A_t|S_t, \theta) ]

这使得策略更新更直观:增加具有正优势(比平均好)的动作的概率,减少具有负优势(比平均差)的动作的概率。理论上,选择 Vπθ(s)V_{\pi_\theta}(s) 作为基线可以(近似地)最小化梯度方差。

带基线的 REINFORCE 算法 (一种简单的 Actor-Critic)#

为了在 REINFORCE 中使用 Vπθ(St)V_{\pi_\theta}(S_t) 作为基线,我们需要一个对 Vπθ(St)V_{\pi_\theta}(S_t) 的估计。这通常通过引入第二个函数近似器(神经网络)来实现,称为评论家 (Critic),用于学习状态价值函数 v^(s;w)Vπθ(s)\hat{v}(s; w) \approx V_{\pi_\theta}(s)。原来的策略网络 π(as;θ)\pi(a|s; \theta) 则被称为演员 (Actor)

算法思想

  1. Actor (策略网络 πθ\pi_\theta):根据当前策略生成动作,并根据 Critic 提供的优势信号更新参数 θ\theta
  2. Critic (价值网络 v^w\hat{v}_w):评估 Actor 在某个状态下的表现(估计 Vπθ(s)V_{\pi_\theta}(s)),并为 Actor 提供基线。Critic 自身也需要学习和更新。

训练过程

  • 对于轨迹中的每一步 (St,At)(S_t, A_t)
    • 计算蒙特卡洛回报 Gt=k=tT1γktRk+1G_t = \sum_{k=t}^{T-1} \gamma^{k-t} R_{k+1}
    • Critic 更新:使用 GtG_t 作为 Vπθ(St)V_{\pi_\theta}(S_t) 的(有噪声的)目标。计算价值估计误差(或称为 TD 误差,尽管这里目标是 MC 回报) δt=Gtv^(St;w)\delta_t = G_t - \hat{v}(S_t; w)。通过梯度下降最小化误差(例如均方误差 (Gtv^(St;w))2(G_t - \hat{v}(S_t; w))^2): ww+αwδtwv^(St;w)w \leftarrow w + \alpha_w \delta_t \nabla_w \hat{v}(S_t; w)
    • Actor 更新:使用 Critic 计算出的误差 δt\delta_t(它近似于优势 Aπθ(St,At)A_{\pi_\theta}(S_t, A_t))来更新策略参数: θθ+αθδtθlogπθ(AtSt;θ)\theta \leftarrow \theta + \alpha_\theta \delta_t \nabla_\theta \log \pi_\theta(A_t|S_t; \theta)

算法:带基线的 REINFORCE

算法参数: 策略学习率 α_θ > 0, 价值学习率 α_w > 0
初始化: 策略网络参数 θ, 价值网络参数 w 任意

循环 对每个 episode:
  根据当前策略 π_θ 生成一个 episode: S₀, A₀, R₁, ..., S_{T-1}, A_{T-1}, R_T
  初始化 G = 0
  对于 t = T-1, T-2, ..., 0:
    // 计算从时间 t 开始的回报 G_t
    G ← R_{t+1} + γ * G
    // 计算优势函数 (TD 误差形式,使用 MC 回报 G 作为目标)
    δ ← G - v̂(S_t; w)  // v̂ 是价值网络的输出
    // 更新价值网络参数 w (Critic Update)
    w ← w + α_w * δ * ∇_w v̂(S_t; w)
    // 更新策略网络参数 θ (Actor Update)
    ∇logπ ← ∇_θ log π_θ(A_t | S_t; θ)
    θ ← θ + α_θ * δ * ∇logπ
plaintext

特点

  • 同时学习策略和状态价值函数。
  • 价值函数主要用作基线来降低策略梯度的方差。
  • 这仍然是一种蒙特卡洛方法,因为它依赖于完整的 episode 回报 GtG_t。因此,更新需要在 episode 结束后进行,并且可能学习较慢。

总结#

  • 策略梯度方法直接优化参数化的策略 πθ\pi_\theta,适用于各种(包括连续)动作空间和随机策略。
  • 策略梯度定理 J=E[qπlogπ]\nabla J = \mathbb{E}[q_\pi \nabla \log \pi] 是理论基础。
  • 直接使用蒙特卡洛估计策略梯度(如 REINFORCE 算法)虽然无偏,但方差很高。
  • 引入基线(特别是状态价值函数 Vπ(s)V_\pi(s),导致使用优势函数 AπA_\pi)是降低方差的关键技术,且不引入偏差。
  • 带基线的 REINFORCE 算法通过学习一个价值函数 v^(s;w)\hat{v}(s; w) (Critic) 来提供基线,形成了简单的 Actor-Critic 结构。
  • 虽然 REINFORCE with Baseline 降低了方差,但它仍然基于 MC 回报,效率可能不如使用 TD 误差的 Actor-Critic 方法(将在后续讨论)。
RL 学习笔记(10):策略梯度方法
https://axi404.top/blog/rl-note-10
Author 阿汐
Published at April 17, 2025
Comment seems to stuck. Try to refresh?✨