Skip to content

Actor-Critic 家族

本页速览 价值 + 策略的合流:A2C/A3C、DDPG、TD3、SAC、PPO 的谱系图;on-policy 与 off-policy 的统一视角;连续控制为什么是 SAC 的主场。

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 主要对手:

维度SACTD3PPO
on/off-policyoffoffon
策略类型随机(高斯)确定性随机(高斯/分类)
样本效率最高高低(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,策略)。区别只在三点:

  1. 策略是随机还是确定性(高斯/分类 vs 直接输出动作);
  2. 数据是 on-policy 还是 off-policy(用完即弃 vs 回放复用);
  3. 更新步长如何约束(PPO 用 clip、TRPO 用 KL、SAC 用熵+软更新)。

八、选型建议与工程注意 ​

1. 选型决策树 ​

text
问题来了
├── 离散动作(游戏、选单)→ DQN 系 / PPO
├── 连续动作
│   ├── 样本便宜(仿真可无限生成)→ PPO(并行 rollout)
│   ├── 样本贵(真机、昂贵仿真)→ SAC
│   └── 需要确定性执行(部署无随机)→ TD3
└── 需要明确随机策略(博弈、探索)→ PPO / SAC

2. 工程注意清单 ​

事项建议
Critic 也要热身off-policy 算法前几千步 Critic 是瞎的,别急着看效果
奖励缩放SAC 对奖励量级敏感,先归一化奖励(见奖励工程)
目标网络更新率 τ默认 0.005 左右,τ 大则 Critic 不稳
框架选择直接选成熟实现,别手搓:见框架与工具怎么选
多 seed 验证AC 算法随机性大,单 seed 结论不可信:见从零搭一套 RL 评估

最大的坑:Reward 没设计好就换算法

"SAC 不行就换 PPO,PPO 不行就换 TD3"是最常见的无效循环。大多数"算法不收敛"其实是奖励设计或环境 bug 的问题(见常见陷阱与反模式)。先用奖励工程的十条清单过一遍,再谈换算法。

九、真实世界的落点 ​

延伸阅读 ​

参考资料 ​

  • 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 的理论奠基。