3、Actor-Critic架构:从策略梯度到Actor-Critic、价值函数作为Critic、优势函数(Advantage Function)的计算、A2C与A3C算法对比

策略梯度方法虽然直接,但有个明显的短板——方差太大。你想想看,一个回合走完,好动作坏动作都混在一起,梯度更新就像在迷雾里开枪。我个人早期做机器人控制时,就吃过这个亏:明明策略在收敛,但loss曲线抖得像心电图,调了三天学习率都没用。

后来我意识到,问题出在「信用分配」上。我们需要一个裁判,来告诉Actor每个动作到底好不好。这个裁判,就是Critic。

从策略梯度到Actor-Critic

策略梯度的核心公式是:

∇J(θ) = E[ ∇log π(a|s) * G_t ]

其中G_t是累积回报。但G_t的方差很大,因为它是整个轨迹的随机变量之和。说白了,你用一个高方差的信号去更新策略,收敛慢是必然的。

Critic的作用,就是用一个价值函数V(s)或Q(s,a)来替代G_t。这样梯度变成:

∇J(θ) = E[ ∇log π(a|s) * (Q(s,a) - V(s)) ]

嗯,这里Q(s,a) - V(s)就是优势函数。Critic负责估计价值,Actor负责更新策略。两者交替训练,互相促进。

核心思想: Actor做决策,Critic做评价。Critic的引入,本质上是把蒙特卡洛的高方差回报,替换成低方差的估计值。

我在项目中遇到过一种情况:Critic网络太强,导致Actor完全跟着Critic走,策略探索性急剧下降。后来我加了个熵正则项,才把探索和利用的平衡找回来。

价值函数作为Critic

Critic通常有两种选择:状态价值函数V(s)或动作价值函数Q(s,a)。

  • V(s): 只依赖状态,计算量小,适合离散动作空间。
  • Q(s,a): 依赖状态和动作,更精确,但维度高,容易过拟合。

我个人习惯用V(s)作为Critic,因为它的训练更稳定。你想想看,Q(s,a)需要为每个动作单独估计,而V(s)只需要一个标量。在连续控制任务中,V(s)的收敛速度明显更快。

Critic的训练目标很简单:最小化TD误差。公式如下:

L(φ) = E[ (r + γV(s') - V(s))² ]

其中φ是Critic的参数。这个损失函数,说白了就是让V(s)逼近真实的回报期望。

避坑指南: 我曾经把Critic的学习率设得和Actor一样大,结果训练直接崩了。后来我习惯把Critic的学习率调低一个数量级,比如Actor用1e-3,Critic就用1e-4。这样Critic更新慢一点,Actor才能跟上。

优势函数(Advantage Function)的计算

优势函数A(s,a) = Q(s,a) - V(s),它衡量的是「这个动作比平均水平好多少」。如果A为正,说明动作好,应该增加概率;反之则减少。

但在实际中,我们很少直接估计Q(s,a)。更常用的方法是:

A(s,a) = r + γV(s') - V(s)

这就是TD误差。你看,只需要一个V(s)网络,就能同时得到Critic和优势函数。计算量直接减半。

还有一种更稳定的做法——GAE(广义优势估计)。它把多个时间步的TD误差加权平均:

A_GAE = Σ (γλ)^t * δ_t

其中δ_t是单步TD误差,λ是平滑系数。λ=0时退化为单步TD,λ=1时接近蒙特卡洛。我一般取λ=0.95,这个值在大多数任务上表现都不错。

注意: 优势函数的方差和偏差是trade-off。λ越小,偏差越小但方差越大;λ越大,方差越小但偏差越大。没有万能参数,得根据任务调。

A2C与A3C算法对比

A2C和A3C,名字就差一个字母,但实现思路完全不同。

特性 A2C A3C
并行方式 同步 异步
梯度更新 等待所有worker完成 每个worker独立更新
训练稳定性 更稳定 可能不稳定
硬件利用率 较低 较高
适用场景 单机多卡 分布式集群

A3C是异步的。每个worker独立与环境交互,计算梯度后直接更新全局参数。这样做的好处是快,但坏处是梯度可能过时——你更新的时候,别人已经把参数改了。

A2C是同步的。所有worker跑完一个batch后,统一计算梯度,再更新。虽然慢一点,但梯度更准确。我个人更推荐A2C,尤其是在单机上。你想想看,A3C的异步更新在代码实现上有很多坑,比如参数锁、梯度冲突,调试起来非常痛苦。

我记得有一次用A3C训练Atari游戏,跑了12个小时,结果发现某个worker的梯度一直没传上去,全局参数根本没更新。换成A2C后,问题就解决了。

我的建议: 如果你刚入门,先从A2C开始。等你对Actor-Critic架构足够熟悉了,再考虑A3C的异步优化。别一上来就搞分布式,容易劝退。

最后,我用一张图总结一下Actor-Critic的核心流程:

环境 Actor Critic 动作a 状态s 奖励r 优势函数 V(s) A(s,a) Actor-Critic 架构流程 实线:数据流 | 虚线:梯度/价值流

从图中可以看到,环境给Actor和Critic都提供状态和奖励。Actor输出动作,Critic输出价值估计。两者通过优势函数连接,形成闭环。

好了,这一章就到这里。Actor-Critic是强化学习里最经典的架构之一,理解它,后面的PPO、SAC都会轻松很多。


公众号:蓝海资料掘金营,微信deep3321