☰
第303篇 Actor-Critic方法详解
2026/10/14 11:11:38 网站建设 项目流程

上篇聊了策略梯度,从REINFORCE到A2C。你可能注意到一个趋势:纯粹的策略梯度方法方差太大,需要引入价值函数来降低方差。Actor-Critic就是把策略(Actor)和价值函数(Critic)显式地分成两个组件,让它们各司其职。

这个框架是现在主流RL算法的基础。PPO、A3C、DDPG、SAC,本质上都是Actor-Critic的不同变体。理解了这个框架,后面学具体算法就轻松很多。

Actor和Critic各自干什么

Actor是策略网络,负责选择动作。输入当前状态s,输出动作的概率分布π_θ(a|s)。训练时用策略梯度来更新参数θ,目标是最大化期望回报。

Critic是价值网络,负责评估Actor的表现。输入当前状态s(有时也包含动作a),输出价值估计V(s)或Q(s,a)。训练时用TD误差来更新参数,目标是让价值估计尽可能准确。

两者的协作方式是这样的:Actor执行动作后获得奖励,Critic评估这个动作好不好(计算优势函数A = Q-V或TD误差δ = r + γV(s') - V(s)),然后Actor根据这个评估来调整自己的策略。好的动作概率增大,差的动作概率减小。

# Actor-Critic的核心更新逻辑 # Actor更新:用优势函数加权策略梯度 # loss_actor = -log π_θ(a|s) * A.detach() # loss_actor += entropy_coeff * entropy # 熵正则化 # Critic更新:最小化价值估计的TD误差 # loss_critic = (V(s) - (r + γ * V(s')).detach())^2

注意A.detach()——优势函数不传梯度给Critic。Actor和Critic的loss是分开计算的,各自更新各自的参数。

为什么Actor-Critic比纯策略梯度好

纯策略梯度(REINFORCE)用的是从当前时刻到episode结束的累积回报G_t作为权重。这个G_t有两个问题:方差大,而且必须等episode结束才能更新。

Actor-Critic用Critic的估计替代了G_t。Critic给出的是当前状态的价值V(s)或者动作价值Q(s,a),不需要等episode结束。这就把蒙特卡洛方法变成了时序差分(TD)方法,每一步都能更新。

从偏差-方差的角度看:REINFORCE用的是无偏但高方差的蒙特卡洛估计;Actor-Critic用的是有偏但低方差的TD估计。Critic刚开始训练不好时偏差大,但随着Critic越来越准,偏差会减小。实践中这个trade-off是非常值得的。

还有一个好处:Actor-Critic可以处理非终止状态。REINFORCE必须等到episode结束才能计算回报,但很多机器人任务是连续控制的(比如平衡、行走),没有明确的终止状态。Actor-Critic用Critic的估计作为bootstrap,不需要等episode结束。

DDPG:连续控制的Actor-Critic

DDPG(Deep Deterministic Policy Gradient)是2016年的工作,专门解决连续动作空间的控制问题。它是确定性策略的Actor-Critic——Actor直接输出动作值(不是概率分布),Critic估计Q(s,a)。

DDPG有四个网络:Actor、Critic、Target Actor、Target Critic。Target网络是主网络的慢拷贝,用于稳定训练。Actor的更新用确定性的策略梯度:∇J = E[∇_a Q(s,a) · ∇_θ π(s)]。直觉上就是:Critic告诉Actor"在这个状态下,动作往哪个方向调能增大Q值"。

DDPG还用了两个关键技巧。经验回放(Experience Replay):把采集到的(s, a, r, s')存到缓冲区,训练时随机采样batch。这打破了数据之间的时序相关性,提高了数据利用率。缓冲区的大小通常在10万到100万之间,太小了数据多样性不够,太大了内存吃不消。采样时一般用均匀分布,也可以用优先级回放(Prioritized Replay),给TD误差大的样本更高的采样概率。

软更新(Soft Update):Target网络参数用θ_target = τ·θ + (1-τ)·θ_target来更新,τ通常取0.005。这比硬拷贝更稳定。硬拷贝就是每隔N步把主网络的参数直接复制给Target网络,这种方式会导致Target值突然跳变,训练不稳定。软更新让Target值缓慢变化,训练曲线更平滑。

DDPG的网络架构也有讲究。Actor和Critic通常都是3-4层的全连接网络,隐藏层大小256或400。连续控制任务中,Actor的最后一层用tanh激活,输出范围在[-1, 1]之间,然后乘以动作范围的上界。Critic接收状态和动作的拼接作为输入,有两种常见的结构:一种是早期融合(状态和动作拼在一起过网络),一种是后期融合(状态和动作分别过网络,在某个中间层合并)。实验表明后期融合通常效果更好。

DDPG在连续控制任务上表现不错,但它有个已知问题:Q值容易过高估计。因为Critic用的是max操作(隐式地,通过选取最优动作),误差会累积。

TD3:修复DDPG的过估计

TD3(Twin Delayed DDPG)是2018年的工作,针对DDPG的三个问题提出了三个修复。

第一个是双Critic。用两个独立的Q网络,取较小的那个Q值来做目标。这直接解决了过估计问题——跟Double DQN的思路类似。

第二个是延迟Actor更新。Critic每更新两次,Actor才更新一次。这给Critic足够的时间来稳定Q值估计,避免Actor基于不准确的Q值做优化。

第三个是目标平滑。在目标动作上加少量噪声,让Critic在动作空间上平滑,减少对局部峰值的过拟合。

TD3在MuJoCo基准测试上大幅超过DDPG,是目前连续控制任务中最可靠的off-policy算法之一。

面试要点

面试中聊Actor-Critic,几个核心概念要能讲清楚。

Actor和Critic的交互机制。Actor负责探索(输出动作),Critic负责评估(给出价值)。Actor根据Critic的评估来调整策略。这种分工让算法既能探索又能学习,比纯策略梯度或纯价值方法都更有优势。

on-policy和off-policy在Actor-Critic中的体现。A2C是on-policy的,数据用完就扔。DDPG/TD3是off-policy的,用经验回放重用数据。off-policy的样本效率高,但训练更不稳定,需要更多的工程技巧(目标网络、梯度裁剪等)。

Actor-Critic到PPO的演进。PPO本质上也是Actor-Critic,但它通过截断重要性采样比率来限制策略更新的幅度,防止策略一步走太远导致崩溃。这个改进让PPO成为目前最流行的on-policy算法。

超参数的敏感性。Actor-Critic方法的超参数很多:学习率、折扣因子γ、GAE的λ、熵系数、网络结构等。这些超参数的选择对最终效果影响很大。实践中一般先用默认值跑一遍(Stable-Baselines3的默认值已经调得不错了),然后根据训练曲线做调整。如果训练初期回报上升很快但后期震荡,可能是学习率太大或者Critic不够准确。如果一直不收敛,可能是探索不够(增大熵系数)或者奖励尺度不合适(做归一化)。

奖励缩放(Reward Scaling)和观测归一化(Observation Normalization)是工程中非常重要的技巧。不同任务的奖励尺度可能差很多(有的任务奖励在0-1之间,有的在0-1000之间),不做归一化的话超参数就没法通用。Stable-Baselines3内部自动做了观测的running mean归一化和奖励的缩放,这也是它开箱即用的原因之一。

给你的建议

理解Actor-Critic最好的方式是动手实现一个。从A2C开始,在CartPole或Pendulum上跑通。然后改成DDPG,体会on-policy和off-policy的区别。

建议读一读Lilian Weng的博客"Implementation of Reinforcement Learning Algorithms",里面给出了清晰的伪代码和实现细节。代码方面,Stable-Baselines3的实现质量很高,适合学习参考。


上一篇:第302篇 策略梯度——从REINFORCE到现代方法

下一篇预告:第304篇 PPO——最流行的强化学习算法

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询