Axi's Blog

Back

RL 学习笔记(11):Actor-Critic 方法Blur image

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

引言#

我们已经学习了策略梯度 (Policy Gradient) 方法(如 REINFORCE),它直接优化参数化的策略 πθ(as)\pi_\theta(a|s)。这类方法虽然强大,特别是能处理连续动作空间和学习随机策略,但其主要的缺点是基于蒙特卡洛回报 GtG_t 的梯度估计通常具有很高的方差,导致学习过程不稳定且效率低下。

Actor-Critic (AC) 方法 旨在解决这个问题。它引入了一个额外的学习组件——评论家 (Critic),来学习一个价值函数,用于更有效地指导策略(演员 Actor)的学习。

  • 核心思想:AC 方法包含两个相互作用的组件:
    • 演员 (Actor):即策略 π(as;θ)\pi(a|s; \theta),负责根据当前状态 ss 选择动作 aa。参数为 θ\theta
    • 评论家 (Critic):即价值函数估计器(通常是 V(s;w)V(s; w)Q(s,a;w)Q(s, a; w)),负责评估 Actor 在某个状态或采取某个动作的好坏。参数为 ww
  • 交互流程
    1. Actor 根据状态 ss 选择动作 aπθ(s)a \sim \pi_\theta(\cdot|s)
    2. 执行动作 aa,环境给出奖励 Rt+1R_{t+1} 和下一状态 ss'
    3. Critic 利用 (s,a,Rt+1,s)(s, a, R_{t+1}, s') 来评估刚刚发生的转移(例如,计算 TD 误差 δ\delta)。
    4. Critic 根据评估结果更新自身参数 ww,力求更准确地估计价值。
    5. Actor 根据 Critic 的评估信号(例如,TD 误差 δ\delta)更新策略参数 θ\theta,鼓励那些带来更好结果(正 TD 误差)的动作,抑制导致较差结果(负 TD 误差)的动作。

通过引入 Critic 进行自举 (Bootstrapping),AC 方法可以用(通常方差较低的)TD 误差来替代(高方差的)MC 回报 GtG_t 来指导策略学习,从而实现更稳定、高效的在线学习。

Actor-Critic 基础#

回顾策略梯度定理:θJ(θ)=Eπθ[Qπθ(S,A)θlogπθ(AS)]\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} [ Q_{\pi_\theta}(S, A) \nabla_\theta \log \pi_\theta(A|S) ]。 AC 方法的目标就是用 Critic 学习到的价值函数 Qw(S,A)Q_w(S, A) 或相关量来近似理论上的 Qπθ(S,A)Q_{\pi_\theta}(S, A)

基于 Q 值的 Actor-Critic (QAC)#

  • Critic:学习动作价值函数 Qw(s,a)Qπθ(s,a)Q_w(s, a) \approx Q_{\pi_\theta}(s, a)
    • 更新 (TD Learning, 类似 Sarsa):对于转移 (s,a,r,s,a)(s, a, r, s', a') (其中 aπθ(s)a' \sim \pi_\theta(\cdot|s')):
      • TD 目标: y=r+γQw(s,a)y = r + \gamma Q_w(s', a')
      • TD 误差: δ=yQw(s,a)\delta = y - Q_w(s, a)
      • 更新 Critic 参数 ww (例如,对于线性 Critic Qw=ϕTwQ_w = \phi^T w): ww+αwδϕ(s,a)w \leftarrow w + \alpha_w \delta \phi(s, a)
  • Actor:使用 Critic 估计的 Qw(s,a)Q_w(s, a) 来更新策略。
    • 更新θθ+αθQw(s,a)θlogπθ(as)\theta \leftarrow \theta + \alpha_\theta Q_w(s, a) \nabla_\theta \log \pi_\theta(a|s)

算法:Q Actor-Critic (QAC)

算法参数: Actor 学习率 α_θ, Critic 学习率 α_w, 折扣因子 γ
初始化: 状态 s, 策略参数 θ, 价值参数 w

采样动作 a ~ π_θ(·|s)
循环 对每一步:
  // 与环境交互
  执行动作 a, 得到奖励 r 和下一状态 s'
  // Actor 选择下一动作 (仅用于 Critic 更新)
  采样下一动作 a' ~ π_θ(·|s')
  // Critic 更新
  TD_目标 ← r + γ * Q_w(s', a')
  TD_误差 δ ← TD_目标 - Q_w(s, a)
  w ← w + α_w * δ * ∇_w Q_w(s, a) // 梯度取决于 Q_w 的形式

  // Actor 更新
  ∇logπ ← ∇_θ log π_θ(a | s)
  θ ← θ + α_θ * Q_w(s, a) * ∇logπ // 注意:使用 Q_w 而非 δ

  // 更新状态和动作
  s ← s'; a ← a'
plaintext
  • 注意:QAC 的 Actor 更新直接使用 Qw(s,a)Q_w(s, a),虽然理论上可行,但 QwQ_w 的绝对值可能很大且波动剧烈,导致 Actor 更新的方差仍然较大。引入基线是更常用的做法。

引入基线:优势函数 (Advantage Function)#

为了降低 Actor 更新的方差,我们可以引入基线 Vπθ(s)V_{\pi_\theta}(s),使用优势函数 (Advantage Function) Aπθ(s,a)=Qπθ(s,a)Vπθ(s)A_{\pi_\theta}(s, a) = Q_{\pi_\theta}(s, a) - V_{\pi_\theta}(s) 来指导策略更新。策略梯度变为:

θJ(θ)=Eπθ[Aπθ(S,A)θlogπθ(AS)]\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} [ A_{\pi_\theta}(S, A) \nabla_\theta \log \pi_\theta(A|S) ]

基于 V 值的 Actor-Critic 与优势估计#

  • Critic:学习状态价值函数 Vw(s)Vπθ(s)V_w(s) \approx V_{\pi_\theta}(s)
    • 更新 (TD(0)):对于转移 (s,a,r,s)(s, a, r, s')
      • TD 目标: y=r+γVw(s)y = r + \gamma V_w(s')
      • TD 误差: δ=yVw(s)\delta = y - V_w(s)
      • 更新 Critic 参数 ww: ww+αwδwVw(s)w \leftarrow w + \alpha_w \delta \nabla_w V_w(s)
  • Actor:需要优势 Aπθ(s,a)A_{\pi_\theta}(s, a) 的估计。
    • 关键洞察:TD 误差 δt=(Rt+1+γVw(St+1))Vw(St)\delta_t = (R_{t+1} + \gamma V_w(S_{t+1})) - V_w(S_t) 正好是优势函数 Aπθ(St,At)=Qπθ(St,At)Vπθ(St)A_{\pi_\theta}(S_t, A_t) = Q_{\pi_\theta}(S_t, A_t) - V_{\pi_\theta}(S_t) 的一个(有偏但通常方差较低的)单步估计
      • 因为 Qπθ(St,At)E[Rt+1+γVπθ(St+1)]Q_{\pi_\theta}(S_t, A_t) \approx \mathbb{E}[R_{t+1} + \gamma V_{\pi_\theta}(S_{t+1})]
      • 所以 Aπθ(St,At)E[Rt+1+γVπθ(St+1)]Vπθ(St)E[δt]A_{\pi_\theta}(S_t, A_t) \approx \mathbb{E}[R_{t+1} + \gamma V_{\pi_\theta}(S_{t+1})] - V_{\pi_\theta}(S_t) \approx \mathbb{E}[\delta_t] (如果 VwVπθV_w \approx V_{\pi_\theta}
    • Actor 更新:使用 TD 误差 δ\delta 作为优势估计: θθ+αθδθlogπθ(as)\theta \leftarrow \theta + \alpha_\theta \delta \nabla_\theta \log \pi_\theta(a|s)

这种使用 V-Critic 并利用 TD 误差 δ\delta 同时更新 Actor 和 Critic 的方法,就是优势 Actor-Critic (Advantage Actor-Critic, A2C) 的基础。

优势 Actor-Critic (A2C)#

A2C 是目前非常流行和有效的 Actor-Critic 框架。

  • 网络结构:通常使用神经网络实现 Actor 和 Critic。

    • Actor 网络 π(as;θ)\pi(a|s; \theta):输入状态 ss,输出动作概率。
    • Critic 网络 V(s;w)V(s; w):输入状态 ss,输出状态价值 VV
    • 参数共享:Actor 和 Critic 网络通常可以共享底层的特征提取层(例如处理图像输入的 CNN),只在最后分别接上策略头和价值头。这有助于提高学习效率。
  • A2C 更新规则 (单步):对于转移 (s,a,r,s)(s, a, r, s')

    1. 计算 Critic 的 TD 误差 (优势估计)
      • TD 目标: y=r+γVw(s)y = r + \gamma V_w(s') (如果 ss' 是终止状态,则 y=ry=r
      • TD 误差: δ=yVw(s)\delta = y - V_w(s)
    2. 更新 Critic 参数 ww (最小化 TD 误差): ww+αwδwVw(s)w \leftarrow w + \alpha_w \delta \nabla_w V_w(s)
    3. 更新 Actor 参数 θ\theta (使用 δ\delta 作为优势信号): θθ+αθδθlogπθ(as)\theta \leftarrow \theta + \alpha_\theta \delta \nabla_\theta \log \pi_\theta(a|s)
  • 算法:优势 Actor-Critic (A2C - 单步)

算法参数: Actor 学习率 α_θ, Critic 学习率 α_w, 折扣因子 γ
初始化: 策略网络参数 θ, 价值网络参数 w

循环 对每个 episode:
  初始化状态 s
  循环 对 episode 中的每一步:
    // Actor 选择动作
    采样动作 a ~ π_θ(·|s)
    // 与环境交互
    执行动作 a, 得到奖励 r 和下一状态 s'
    // Critic 评估
    V_s ← V_w(s) // 当前状态价值
    如果 s' 是终止状态:
      V_s_prime ← 0
    否则:
      V_s_prime ← V_w(s') // 下一状态价值
    // 计算 TD 目标和 TD 误差 (优势估计)
    TD_目标 y ← r + γ * V_s_prime
    TD_误差 δ ← TD_目标 - V_s
    // 更新 Critic 参数 w
    w ← w + α_w * δ * ∇_w V_w(s)
    // 更新 Actor 参数 θ
    ∇logπ ← ∇_θ log π_θ(a | s)
    θ ← θ + α_θ * δ * ∇logπ
    // 更新状态
    s ← s'
    如果 s 是终止状态, 退出内层循环
plaintext

扩展:n 步 A2C#

类似于 n 步 TD 和 n 步 Sarsa,我们也可以在 A2C 中使用 n 步回报来计算 TD 目标和 TD 误差,以在偏差和方差之间取得更好的平衡。

  • n 步 TD 目标 (用于 Critic)

    yt(n)=Rt+1+γRt+2++γn1Rt+n+γnVw(St+n)y_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \dots + \gamma^{n-1} R_{t+n} + \gamma^n V_w(S_{t+n})

    (如果 t+kt+k (k<nk<n) 到达终止状态 TT,则 yt(n)=Gt:Ty_t^{(n)} = G_{t:T} )

  • n 步 TD 误差 (优势估计)

    δt(n)=yt(n)Vw(St)\delta_t^{(n)} = y_t^{(n)} - V_w(S_t)
  • n 步 A2C 更新规则

    • Critic 更新ww+αwδt(n)wVw(St)w \leftarrow w + \alpha_w \delta_t^{(n)} \nabla_w V_w(S_t)
    • Actor 更新θθ+αθδt(n)θlogπθ(AtSt)\theta \leftarrow \theta + \alpha_\theta \delta_t^{(n)} \nabla_\theta \log \pi_\theta(A_t|S_t)
    • 注意:这里的更新针对的是时间步 tt 的状态 StS_t 和动作 AtA_t,但更新计算需要等到时间 t+nt+n 之后才能完成(因为需要 Rt+nR_{t+n}St+nS_{t+n})。实际实现通常涉及缓存数据。
  • 与 REINFORCE (带基线) 的关系

    • nn \to \infty 时,n 步 TD 目标 yt(n)y_t^{(n)} 趋向于蒙特卡洛回报 GtG_t
    • 此时,n 步 A2C 的更新规则与带基线的 REINFORCE 非常相似。n 步 A2C 提供了一个从 TD 学习 (n=1) 到蒙特卡洛学习 (n=n=\infty) 的平滑过渡。
    • 实践中,使用一个有限的、适中的 nn(例如 n=5n=5n=20n=20)通常能获得比 n=1n=1(纯 TD 误差,偏差大)或 n=n=\infty(纯 MC 回报,方差大)更好的性能。

总结#

  • Actor-Critic (AC) 方法通过结合策略学习(Actor)和价值学习(Critic)来克服纯策略梯度方法(如 REINFORCE)的高方差问题。
  • Critic 学习价值函数 (VwV_wQwQ_w) 来评估状态或动作。
  • Actor 根据 Critic 提供的反馈信号(通常是优势函数的估计)来更新策略 πθ\pi_\theta
  • 优势 Actor-Critic (A2C) 是标准范式,通常使用 V-Critic,并利用 TD 误差 δt\delta_t 作为优势函数的(单步或 n 步)估计来同时更新 Actor 和 Critic。
  • AC 方法(特别是 A2C)能够进行在线、单步更新,通常比基于 MC 的 REINFORCE 更稳定、高效。
  • 使用 n 步回报可以进一步调整偏差与方差的平衡。
  • AC 框架是许多现代深度强化学习算法(如 A3C, DDPG, PPO 等)的基础。
RL 学习笔记(11):Actor-Critic 方法
https://axi404.top/blog/rl-note-11
Author 阿汐
Published at April 18, 2025
Comment seems to stuck. Try to refresh?✨