外观
Actor-Critic 家族
一句话定位:这一页讲清楚 Actor-Critic 家族——"演员(Actor,策略网络)"与"评委(Critic,价值网络)"如何合流成现代 RL 的主流架构;读完后你能画出 A2C、DDPG、TD3、SAC、PPO 的谱系图,理解 on-policy 与 off-policy 在实现上的分岔点,并给具体任务选出正确的算法。
一、Actor-Critic 总体架构:一个演员,一个评委
1. 为什么需要两个网络
回顾策略梯度方法:REINFORCE 用整局回报 $R(\tau)$ 做加权,方差巨大。解法是用 advantage $A(s,a) = Q(s,a) - V(s,a)$ 替代总回报,而估计 advantage 需要一个价值网络。
于是两个网络分工明确:
text
┌──────────────────────────────────────┐
│ Actor-Critic │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Actor │ │ Critic │ │
│ │ 策略网络 │ │ 价值网络 │ │
│ │ π_θ(a|s) │ │ V_φ(s) │ │
│ └────┬─────┘ └────┬─────┘ │
│ │ 输出动作 │ 评价表现 │
│ ▼ ▼ │
│ 与环境交互 ──→ (s,a,r,s') ──→ 算 TD │
│ 误差 / advantage │
│ │
│ Actor 目标:让高 advantage 动作更可能 │
│ Critic 目标:让 V 更准(TD 回归) │
└──────────────────────────────────────┘- Actor(演员):学策略 $\pi_\theta(a|s)$,目标是最大化 advantage 加权的 log 概率(见策略梯度方法第五、六节);
- Critic(评委):学价值 $V_\phi(s)$,给"这个局面值多少"打分,为 Actor 提供 advantage 信号;同时它自己也在进步(TD 回归)。
为什么 Critic 能降低方差
Critic 扮演"基线"角色:$A = Q - V$ 把"动作本身的好坏"从"局面本身的好坏"中剥离出来,剩下的部分方差小得多。Actor 只关心"相对平均,这个动作好在哪"。
2. Actor 与 Critic 的协作更新(以 A2C 为例)
python
def a2c_update(actor, critic, transitions):
# transitions: 一批 (s, a, r, s', done)
# 1. Critic 提供基线 + 计算 TD 目标
v = critic(s)
v_next = critic(s_next)
td_target = r + gamma * v_next * (1 - done) # done 时不自举
advantage = td_target - v # 用 TD 误差当 advantage
# 2. Critic 更新:让 V 逼近 TD 目标
critic_loss = (td_target - v).square().mean()
# 3. Actor 更新:提高高 advantage 动作的概率
actor_loss = -(log_prob(a) * advantage.detach()).mean()
# (+ 熵正则项,见探索页)注意 advantage 用 detach() 切断梯度——Actor 更新时把 advantage 当常数,不通过它反传。
二、A2C/A3C:并行环境与 advantage
1. 背景:单个环境的样本太慢、太相关
策略梯度是 on-policy 的:数据用完即弃,必须持续采新数据。单环境串行采样效率极低,且前后步样本强相关。A3C(Asynchronous Advantage Actor-Critic, Mnih et al., 2016)用多个并行 worker 各玩各的环境:
- 每个 worker 独立采数据、独立算梯度、异步把梯度推到共享参数;
- A2C(synchronous 版):去掉异步,所有 worker 同步采一批、同步更新一次。
| 维度 | A3C(异步) | A2C(同步) |
|---|---|---|
| 更新方式 | 各 worker 独立异步推梯度 | 收集全部 worker 数据统一更新 |
| 实现复杂度 | 高(锁、通信、参数冲突) | 低(一次 batched 更新) |
| 实际表现 | 历史版本 | 通常持平或更好(现默认用 A2C) |
A2C 的 advantage 估计常用 n 步回报:让 worker 跑 n 步再统一计算
$$ \hat A_t = \sum_{k=0}^{n-1} \gamma^k r_{t+k} + \gamma^n V(s_{t+n}) - V(s_t) $$
这就是 GAE 的一个离散近似(λ=1 时的 n 步截断;注意 λ=0 时 GAE 退化为 1 步 TD 误差,并不是 n 步回报),理论详见策略梯度方法第六节。
2. 一句话定位 A2C
A2C = 策略梯度 + 价值基线 + 多环境并行。它是 Actor-Critic 家族最"教科书"的一员,现在更多被 PPO 取代,但它的并行思想(vectorized environments)是后续所有算法的基建。
三、DDPG:连续动作的确定性策略梯度
1. 问题:连续动作空间里 softmax/gaussian 不好使
前面都是随机策略 $\pi(a|s)$。但在连续控制(机器人关节力矩)里,随机策略采样噪声大,且 off-policy 学习时重要性比值的方差巨大。DDPG(Deep Deterministic Policy Gradient, Lillicrap et al., 2016)走另一条路:确定性策略 $\mu_\theta(s)$(输入状态,直接输出动作),配合 Critic 学 $Q$。
2. DPG 直觉:用 Critic 的梯度"引导"动作
确定性策略梯度的更新方向:让 Actor 输出的动作沿着 Q 值上升的方向微调。
$$ \nabla_\theta J \approx \mathbb{E}\left[ \nabla_a Q(s,a) \big|{a=\mu\theta(s)} \cdot \nabla_\theta \mu_\theta(s) \right] $$
直觉:Critic 说"往这个方向调整动作,Q 会更高",Actor 就照做。Critic 变成了 Actor 的"动作教练"——不像随机策略梯度用 log 概率 + advantage,而是直接对 Q 求动作梯度。
3. 四个组件(off-policy 标配)
DDPG 完整实现需要四样东西(后面 TD3/SAC 都继承这套架构):
| 组件 | 作用 |
|---|---|
| Actor 在线网络 μ_θ | 输出确定性动作 |
| Critic 在线网络 Q_φ | 评估 (s,a) 的价值 |
| 回放缓冲区 | off-policy 复用样本(见价值学习的经验回放) |
| 目标网络(软更新) | 用 $\tau$ 缓慢追踪在线参数:$\phi' \leftarrow \tau\phi + (1-\tau)\phi'$ |
DDPG 的著名不稳定性
DDPG 是出了名的难调:Q 高估(max 算子被确定性策略放大)、对超参极度敏感、探索(Ornstein-Uhlenbeck 噪声)难配。它是 TD3 的"前置原型",工程上一般直接上 TD3 或 SAC。
四、TD3:治 DDPG 的三个病
TD3(Twin Delayed DDPG, Fujimoto et al., 2018)针对 DDPG 的三个问题给出三剂药:
| 病 | 药 |
|---|---|
| Q 值高估(max 噪声累积) | 双 Q 网络:两个 Critic,取较小值 $Q = \min(Q_1, Q_2)$(clipped double Q-learning) |
| Actor 更新过频 | 延迟更新:Critic 每更新 2 次,Actor 才更新 1 次 |
| 确定性策略过拟合 | 目标策略平滑:目标动作加噪声 $\tilde a = \mu(s') + \epsilon$,$\epsilon \sim \text{clip}(\mathcal{N}(0,\sigma^2), -c, c)$ |
直觉:双 Q 取 min 打破"max 把噪声当信号"的路径(类似 Double DQN 的连续版);延迟更新让 Critic 先变准再喂给 Actor;平滑噪声让策略面对相似状态时价值函数更平滑。
五、SAC:最大熵强化学习
1. 核心思想:目标不仅是"回报高",还要"动作熵大"
SAC(Soft Actor-Critic, Haarnoja et al., 2018)把目标函数改成最大熵形式:
$$ J(\pi) = \mathbb{E}\left[ \sum_t \gamma^t \left( r_t + \alpha , \mathcal{H}(\pi(\cdot | s_t)) \right) \right] $$
熵项 $\mathcal{H}(\pi(\cdot|s))$ 是"这个状态下策略有多随机"的度量(见探索与利用)。SAC 明确把"保持探索"写进目标函数——"既要回报高,又要动作多样"。
直觉:在行为上等价于"在回报基本不变的前提下,尽可能随机"。好处:
- 探索与鲁棒性:熵大 → 天然探索、天然抗过拟合、对奖励噪声不敏感;
- 多模态任务:有些问题存在多个同样好的解(比如左边绕和右边绕),SAC 会同时保留而不是锁死一个。
2. 软贝尔曼方程与软 Q
SAC 的 Critic 学"软价值",把熵折算进 Q:
$$ Q(s,a) = r + \gamma , \mathbb{E}\left[ Q(s', a') - \alpha \log \pi(a'|s') \right] $$
注意 target 里不再是 $\max Q$,而是"期望 Q 减去熵惩罚"。SAC 是 off-policy 的随机策略算法(Q 学习风格更新 + 高斯策略),这使它同时拥有 off-policy 的样本效率与随机策略的探索能力——这是它在连续控制上全面胜出的根本原因。
3. 自动温度系数 α
熵系数 α 决定"多重视探索":α 太大 → 策略太随机(不管任务);太小 → 变成普通 RL。SAC 用自动温度调节:设一个目标熵(通常为 $\mathcal{H}_{target} = -\dim(\mathcal{A})$),训练时调整 α 让实际熵逼近目标:
$$ \min_\alpha \mathbb{E}\left[ -\alpha \log \pi(a|s) - \alpha \mathcal{H}_{target} \right] $$
直觉:策略太确定(熵不够)→ 调大 α 逼它随机;太随机 → 调小 α 让它专注任务。这一个机制替工程师省掉了最敏感的探索超参。
4. 为什么连续控制是 SAC 的主场
| 特性 | 对连续控制的必要性 |
|---|---|
| off-policy(回放复用) | 机器人/仿真样本贵,样本效率关键 |
| 随机策略(熵) | 连续动作需要持续探索,确定性策略噪声难调 |
| 双 Q + 目标平滑(继承 TD3) | 治 Q 高估,训练稳 |
| 自动 α | 免去探索超参搜索 |
表格化对比 SAC vs 主要对手:
| 维度 | SAC | TD3 | PPO |
|---|---|---|---|
| on/off-policy | off | off | on |
| 策略类型 | 随机(高斯) | 确定性 | 随机(高斯/分类) |
| 样本效率 | 最高 | 高 | 低(10-100 倍差) |
| 训练稳定性 | 好(双 Q+自动α) | 好 | 很好 |
| 超参敏感度 | 低 | 中 | 中 |
| 并行性 | 一般 | 一般 | 极好(天然并行 rollout) |
| 推荐场景 | 样本贵、连续控制 | 连续控制、确定性够用 | 通用、大规模并行 |
六、PPO 作为 Actor-Critic 的特例
PPO 在策略梯度方法页已详述。在 Actor-Critic 谱系里,它就是一个 on-policy 随机策略 Actor-Critic:
Actor = 策略网络 π_θ(更新用 clip 目标)
Critic = 价值网络 V_φ(提供 GAE advantage)
关系 = 标准 AC 架构,只是 Actor 的更新目标换成了 clip 形式PPO 与 SAC 的选择决策:
- 有大量并行算力 + 要稳定上线 → PPO(on-policy 稳、无 off-policy 分布漂移问题、部署简单);
- 样本预算有限 + 任务样本获取贵 → SAC(off-policy 效率高);
- 从调参与超参数优化的实践经验看,新手做连续控制先跑 SAC,做离散/多智能体/大规模并行先跑 PPO。
七、谱系图与统一视角
text
┌─────────────┐
│ 策略梯度 │
│ REINFORCE │
└──────┬──────┘
│ + 价值基线(Critic)
┌────────────────┼────────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌──────────────┐
│ A2C/A3C │ │ 基础 AC │ │ DPG(确定 │
│ 多环境并行 │ │ │ │ 性策略梯度) │
└───────────┘ └───────────┘ └──────┬───────┘
│ │ + DNN
▼ ▼
┌───────────┐ ┌───────────┐
│ PPO │ │ DDPG │
│ clip 目标 │ │ 连续控制 │
└───────────┘ └─────┬─────┘
│ 治高估/延迟
▼
┌───────────┐
│ TD3 │
│ 双Q/延迟/平滑│
└─────┬─────┘
│ + 熵正则
▼
┌───────────┐
│ SAC │
│ 最大熵/自动α│
└───────────┘统一视角:所有 Actor-Critic 都在回答两个问题——"当前动作好不好"(Critic,价值信号)与"下一个动作怎么出"(Actor,策略)。区别只在三点:
- 策略是随机还是确定性(高斯/分类 vs 直接输出动作);
- 数据是 on-policy 还是 off-policy(用完即弃 vs 回放复用);
- 更新步长如何约束(PPO 用 clip、TRPO 用 KL、SAC 用熵+软更新)。
八、选型建议与工程注意
1. 选型决策树
text
问题来了
├── 离散动作(游戏、选单)→ DQN 系 / PPO
├── 连续动作
│ ├── 样本便宜(仿真可无限生成)→ PPO(并行 rollout)
│ ├── 样本贵(真机、昂贵仿真)→ SAC
│ └── 需要确定性执行(部署无随机)→ TD3
└── 需要明确随机策略(博弈、探索)→ PPO / SAC2. 工程注意清单
| 事项 | 建议 |
|---|---|
| Critic 也要热身 | off-policy 算法前几千步 Critic 是瞎的,别急着看效果 |
| 奖励缩放 | SAC 对奖励量级敏感,先归一化奖励(见奖励工程) |
| 目标网络更新率 τ | 默认 0.005 左右,τ 大则 Critic 不稳 |
| 框架选择 | 直接选成熟实现,别手搓:见框架与工具怎么选 |
| 多 seed 验证 | AC 算法随机性大,单 seed 结论不可信:见从零搭一套 RL 评估 |
九、真实世界的落点
- 连续控制的当家花旦就是 SAC/PPO,见机器人控制与 Sim2Real(灵巧手、ANYmal 四足都用它们);
- 多智能体场景的基础算法 MADDPG/MAPPO 都是 Actor-Critic 的扩展,见多智能体强化学习;
- 大模型对齐的 PPO 阶段同样是 Actor-Critic(策略是 LLM,Critic 是奖励模型/价值头),见RLHF 与人类反馈对齐。
延伸阅读
- 策略梯度方法 —— Actor 一端的理论基础:策略梯度定理、GAE、PPO clip
- 价值学习:从动态规划到 DQN —— Critic 一端的地基:TD 误差、经验回放、目标网络
- 机器人控制与 Sim2Real —— SAC/PPO 在真实机器人上的工程细节
- 框架与工具怎么选 —— SB3/Ray/Brax 里怎么选 SAC、PPO 实现
- 调参与超参数优化 —— AC 算法的核心超参与调参顺序
参考资料
- Mnih, V., Badia, A. P., Mirza, M., et al. (2016). Asynchronous Methods for Deep Reinforcement Learning. ICML. arXiv:1602.01783(A3C)
- Lillicrap, T. P., Hunt, J. J., Pritzel, A., et al. (2016). Continuous control with deep reinforcement learning. ICLR. arXiv:1509.02971(DDPG)
- Fujimoto, S., van Hoof, H., & Meger, D. (2018). Addressing Function Approximation Error in Actor-Critic Methods. ICML. arXiv:1802.09477(TD3)
- Haarnoja, T., Zhou, A., Abbeel, P., & Levine, S. (2018). Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor. ICML. arXiv:1801.01290(SAC)
- Haarnoja, T., Zhou, A., Hartikainen, K., et al. (2018). Soft Actor-Critic Algorithms and Applications. arXiv:1812.05905(SAC 自动温度)
- Konda, V. R., & Tsitsiklis, J. N. (2000). Actor-Critic Algorithms. NeurIPS. Actor-Critic 的理论奠基。