

RL 学习笔记(11):Actor-Critic 方法
Actor-Critic 方法
本博客基于西安交通大学强化学习课程 PPT 改编,历经 Gemini 以及本人总结以及整理形成。
引言#
我们已经学习了策略梯度 (Policy Gradient) 方法(如 REINFORCE),它直接优化参数化的策略 。这类方法虽然强大,特别是能处理连续动作空间和学习随机策略,但其主要的缺点是基于蒙特卡洛回报 的梯度估计通常具有很高的方差,导致学习过程不稳定且效率低下。
Actor-Critic (AC) 方法 旨在解决这个问题。它引入了一个额外的学习组件——评论家 (Critic),来学习一个价值函数,用于更有效地指导策略(演员 Actor)的学习。
- 核心思想:AC 方法包含两个相互作用的组件:
- 演员 (Actor):即策略 ,负责根据当前状态 选择动作 。参数为 。
- 评论家 (Critic):即价值函数估计器(通常是 或 ),负责评估 Actor 在某个状态或采取某个动作的好坏。参数为 。
- 交互流程:
- Actor 根据状态 选择动作 。
- 执行动作 ,环境给出奖励 和下一状态 。
- Critic 利用 来评估刚刚发生的转移(例如,计算 TD 误差 )。
- Critic 根据评估结果更新自身参数 ,力求更准确地估计价值。
- Actor 根据 Critic 的评估信号(例如,TD 误差 )更新策略参数 ,鼓励那些带来更好结果(正 TD 误差)的动作,抑制导致较差结果(负 TD 误差)的动作。
通过引入 Critic 进行自举 (Bootstrapping),AC 方法可以用(通常方差较低的)TD 误差来替代(高方差的)MC 回报 来指导策略学习,从而实现更稳定、高效的在线学习。
Actor-Critic 基础#
回顾策略梯度定理:。 AC 方法的目标就是用 Critic 学习到的价值函数 或相关量来近似理论上的 。
基于 Q 值的 Actor-Critic (QAC)#
- Critic:学习动作价值函数 。
- 更新 (TD Learning, 类似 Sarsa):对于转移 (其中 ):
- TD 目标:
- TD 误差:
- 更新 Critic 参数 (例如,对于线性 Critic ):
- 更新 (TD Learning, 类似 Sarsa):对于转移 (其中 ):
- Actor:使用 Critic 估计的 来更新策略。
- 更新:
算法: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 更新直接使用 ,虽然理论上可行,但 的绝对值可能很大且波动剧烈,导致 Actor 更新的方差仍然较大。引入基线是更常用的做法。
引入基线:优势函数 (Advantage Function)#
为了降低 Actor 更新的方差,我们可以引入基线 ,使用优势函数 (Advantage Function) 来指导策略更新。策略梯度变为:
基于 V 值的 Actor-Critic 与优势估计#
- Critic:学习状态价值函数 。
- 更新 (TD(0)):对于转移 :
- TD 目标:
- TD 误差:
- 更新 Critic 参数 :
- 更新 (TD(0)):对于转移 :
- Actor:需要优势 的估计。
- 关键洞察:TD 误差 正好是优势函数 的一个(有偏但通常方差较低的)单步估计!
- 因为
- 所以 (如果 )
- Actor 更新:使用 TD 误差 作为优势估计:
- 关键洞察:TD 误差 正好是优势函数 的一个(有偏但通常方差较低的)单步估计!
这种使用 V-Critic 并利用 TD 误差 同时更新 Actor 和 Critic 的方法,就是优势 Actor-Critic (Advantage Actor-Critic, A2C) 的基础。
优势 Actor-Critic (A2C)#
A2C 是目前非常流行和有效的 Actor-Critic 框架。
-
网络结构:通常使用神经网络实现 Actor 和 Critic。
- Actor 网络 :输入状态 ,输出动作概率。
- Critic 网络 :输入状态 ,输出状态价值 。
- 参数共享:Actor 和 Critic 网络通常可以共享底层的特征提取层(例如处理图像输入的 CNN),只在最后分别接上策略头和价值头。这有助于提高学习效率。
-
A2C 更新规则 (单步):对于转移 :
- 计算 Critic 的 TD 误差 (优势估计):
- TD 目标: (如果 是终止状态,则 )
- TD 误差:
- 更新 Critic 参数 (最小化 TD 误差):
- 更新 Actor 参数 (使用 作为优势信号):
- 计算 Critic 的 TD 误差 (优势估计):
-
算法:优势 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):
(如果 () 到达终止状态 ,则 )
-
n 步 TD 误差 (优势估计):
-
n 步 A2C 更新规则:
- Critic 更新:
- Actor 更新:
- 注意:这里的更新针对的是时间步 的状态 和动作 ,但更新计算需要等到时间 之后才能完成(因为需要 和 )。实际实现通常涉及缓存数据。
-
与 REINFORCE (带基线) 的关系:
- 当 时,n 步 TD 目标 趋向于蒙特卡洛回报 。
- 此时,n 步 A2C 的更新规则与带基线的 REINFORCE 非常相似。n 步 A2C 提供了一个从 TD 学习 (n=1) 到蒙特卡洛学习 () 的平滑过渡。
- 实践中,使用一个有限的、适中的 (例如 或 )通常能获得比 (纯 TD 误差,偏差大)或 (纯 MC 回报,方差大)更好的性能。
总结#
- Actor-Critic (AC) 方法通过结合策略学习(Actor)和价值学习(Critic)来克服纯策略梯度方法(如 REINFORCE)的高方差问题。
- Critic 学习价值函数 ( 或 ) 来评估状态或动作。
- Actor 根据 Critic 提供的反馈信号(通常是优势函数的估计)来更新策略 。
- 优势 Actor-Critic (A2C) 是标准范式,通常使用 V-Critic,并利用 TD 误差 作为优势函数的(单步或 n 步)估计来同时更新 Actor 和 Critic。
- AC 方法(特别是 A2C)能够进行在线、单步更新,通常比基于 MC 的 REINFORCE 更稳定、高效。
- 使用 n 步回报可以进一步调整偏差与方差的平衡。
- AC 框架是许多现代深度强化学习算法(如 A3C, DDPG, PPO 等)的基础。