Actor-Critic:两个网络各干什么
Critic 估 \(V\) 或 \(Q\) 给 Actor 提供低方差信号;critic 不准会把 policy 带偏。

1. 曲线正常但回报不涨
接触-rich 的机械臂抓取任务里,常见一种迷惑:approx_kl 在裁剪范围内,策略损失稳步下降,评估回报却长期平台。排查超参、换随机种子、加大训练步数,效果有限。根因往往在 价值网络没跟上——Actor-Critic 把策略优化与价值估计拆开,Actor 输出动作分布 ,Critic 输出状态价值 或动作价值 。策略梯度用优势函数 降方差,但优势来自 Critic 的时序差分 bootstrap;Critic 偏了,Actor 就在噪声上更新,表现成「损失在降、行为不变」。
2. 更新机制与 bootstrap
每步用 TD 误差或 GAE 更新 Critic,用优势更新 Actor:
A2C 同步采样、A3C 异步采样;PPO 加裁剪限制策略跳变;SAC 加熵正则。共同点是 bootstrap:Critic 用 而非完整蒙特卡洛回报,用偏差换方差。Stable-Baselines3 日志里的 explained_variance 近似 ;长期低于 0.3 说明 Critic 欠拟合,策略更新方向噪声大。可增大 vf_coef、提高 Critic 学习率或加宽价值网络容量。
3. 共享特征层的陷阱
PPO 默认策略与价值共享多层感知机前几层。策略梯度回传会修改共享特征,可能伤害价值头。我会把价值头学习率设成与策略相同或略大;若 explained_variance 长期为负,说明价值估计比回报还散,裁剪再漂亮也救不了策略方向。接触丰富任务有时做 Critic 预热——前若干步只更新价值网络——避免早期乱动动作破坏 rollout 质量。
复杂 sim2real 任务里,分离编码器有时更省事:只微调 Actor 主干,Critic 重训。离策略 Actor-Critic 还要盯 replay 里动作对数概率是否按行为策略存储;同策略则盯 rollout 是否过期。
4. 与纯策略梯度的取舍
A2C 同步更新、PPO 多轮复用同一 rollout,都属于 Actor-Critic 家族。选 PPO 主要是因为实现简单、超参不敏感,不是样本效率最优。A3C 异步 worker 曾流行;现在 PPO 加向量环境更常见。Critic 滞后时策略跟着错:表现为 approx_kl 正常但回报不涨——临时增大 vf_coef 或只训 Critic 几个更新周期值得试。策略损失降而回报不升,十之八九 Critic 或优势有问题,不是策略学习率不够。
5. 案例:冻结 Actor 诊断
某次四足 locomotion 实验,explained_variance 长期在 0.1 以下。我冻结 Actor 只训 Critic 五千步,价值损失下降、explained_variance 升至 0.6 以上,再联合训练后回报才开始爬升。对比纯 REINFORCE 和 Actor-Critic 在同任务上的样本效率,后者在相近墙钟时间下更快甩开随机基线。Shared trunk 换 backbone 做 sim2real 时,独立价值网络迁移有时比共享主干更稳。
6. 终止与截断的处理
Gymnasium 区分 terminated 与 truncated:真终止处下一状态价值应为零;超时是否仍 bootstrap 要与 PPO/SAC 的价值目标一致。Actor 与 Critic 侧处理不一致,优势与回报会互相打架。Advantage 归一化若遗漏,策略更新幅度会失控。truncated 与 bootstrap 掩码写进单一函数,避免一处修、另一处忘。
7. 验收
- 冻结 Actor 只训 Critic 若干步,价值损失应下降、
explained_variance应上升。 terminated与truncated的 bootstrap 在 Actor 和 Critic 侧一致。- 优势已归一化,策略更新幅度可控。
- 对比纯策略梯度与 Actor-Critic 的样本效率,后者应更快甩开随机。
- Sim2real 换 backbone 时,分离价值网络迁移是否比共享主干更稳。
Actor 管「往哪走」,Critic 管「这一步值多少」。Critic 是 Actor 的导航仪——导航仪偏了,车再稳也到不了目的地。
相关
也可以看看
johan's blog