Actor-Critic方法演进:从QAC到DDPG的数学脉络与实践解析
1. Actor-Critic方法的核心思想
Actor-Critic方法就像是一个演员和一个评论家的组合。演员负责根据当前策略采取行动,而评论家则负责评估这些行动的好坏。这种结构巧妙地将基于价值的方法(value-based)和基于策略的方法(policy-based)结合在一起,形成了强化学习中最强大的算法框架之一。
在实际应用中,Actor对应的是策略网络(policy network),它负责生成动作。比如在机器人控制中,策略网络会根据当前传感器数据决定关节电机的转动角度。Critic则对应价值网络(value network),它会评估当前状态和动作的价值。就像足球教练会根据球员表现给出评分,Critic通过TD误差或优势函数来指导Actor的策略更新。
这种架构的优势在于:
- 实时反馈:Critic能提供每一步的即时评估,不像蒙特卡洛方法要等到回合结束
- 低方差:相比纯策略梯度方法,Critic的评估能显著降低方差
- 灵活性:可以方便地引入各种改进技术,如baseline、重要性采样等
2. 从QAC到A2C的演进之路
2.1 最基础的QAC算法
QAC(Q Actor-Critic)是最简单的Actor-Critic实现,它直接使用SARSA算法作为Critic。具体实现时,我们会维护两个神经网络:
# QAC的伪代码实现 class QAC: def __init__(self): self.actor = PolicyNetwork() # 策略网络 self.critic = QNetwork() # Q值网络 def update(self, s, a, r, s_next): # Critic更新 q_value = self.critic(s,a) next_a = self.actor.sample_action(s_next) td_target = r + gamma * self.critic(s_next, next_a) critic_loss = MSE(q_value, td_target) # Actor更新 policy_grad = log_prob(a) * (td_target - q_value) self.actor.optimize(policy_grad)QAC虽然简单,但暴露了两个关键问题:
- 高方差:直接使用Q值作为基准会导致梯度估计波动大
- 样本效率低:因为是on-policy方法,旧数据不能重复利用
2.2 A2C的方差缩减魔法
Advantage Actor-Critic(A2C)通过引入优势函数(Advantage Function)解决了QAC的方差问题。优势函数的数学定义为:
A(s,a) = Q(s,a) - V(s)这个改进就像是用"相对成绩"替代"绝对分数"——我们不再关心动作的绝对价值,而是关注它比平均水平好多少。
实践中的技巧在于如何高效计算优势函数。常见的方法有:
- TD误差法:δ = r + γV(s') - V(s)
- GAE(广义优势估计):结合多步TD误差的加权平均
在代码实现上,A2C只需要一个价值网络:
# A2C的核心更新逻辑 def update(self, s, a, r, s_next, done): # 计算TD误差 v_value = self.critic(s) next_v = 0 if done else self.critic(s_next) td_error = r + gamma * next_v - v_value # Actor更新 log_prob = self.actor.get_log_prob(s, a) actor_loss = -log_prob * td_error # Critic更新 critic_loss = MSE(v_value, r + gamma * next_v)3. Off-policy的改造工程
3.1 重要性采样的数学原理
将on-policy方法改造成off-policy的关键是重要性采样(Importance Sampling)。这项技术的核心思想是:通过权重修正,使来自不同分布的样本能够用于当前分布的期望估计。
数学表达式为:
E_{x∼p}[f(x)] = E_{x∼q}[f(x)p(x)/q(x)]其中p是目标分布,q是采样分布。
在强化学习中,这相当于:
∇J(θ) = E_{a∼β}[ (π(a|s)/β(a|s)) * ∇logπ(a|s) * Q(s,a) ]其中β是行为策略,π是目标策略。
3.2 实践中的陷阱与解决方案
虽然理论完美,但直接应用重要性采样会遇到:
- 权重爆炸:当π(a|s)远大于β(a|s)时,重要性权重会变得极大
- 高方差:权重引入的随机性会增大方差
工程实践中常用的解决方案包括:
- 权重裁剪:限制最大权重值
- 方差归一化:动态调整学习率
- 混合策略:结合on-policy和off-policy更新
4. 确定性策略梯度(DPG)的突破
4.1 从随机到确定的范式转变
DPG(Deterministic Policy Gradient)标志着策略梯度方法的一个重要转折——从随机策略转向确定性策略。这在连续动作空间(如机器人控制、自动驾驶)中表现出显著优势:
- 计算效率:不再需要积分整个动作空间
- 稳定性:确定性策略的梯度方差更小
- 可扩展性:天然适合高维连续控制问题
数学上,DPG的梯度表达式为:
∇J(θ) = E_{s∼ρ}[∇θμ(s) * ∇aQ(s,a)|a=μ(s)]这个公式揭示了一个重要特性:梯度只依赖于状态分布,与动作分布无关,这使得DPG天然具备off-policy能力。
4.2 DDPG的实现细节
DDPG(Deep DDPG)是DPG的深度版本,引入了几个关键创新:
- 目标网络:稳定训练过程
- 经验回放:提高样本效率
- 探索噪声:如OU过程,解决确定性策略的探索问题
典型的DDPG实现包含以下组件:
class DDPG: def __init__(self): self.actor = ActorNetwork() self.critic = CriticNetwork() self.target_actor = copy.deepcopy(self.actor) self.target_critic = copy.deepcopy(self.critic) self.replay_buffer = ReplayBuffer(100000) def update(self, batch): # 计算critic损失 target_q = r + gamma * self.target_critic(s', self.target_actor(s')) critic_loss = MSE(self.critic(s,a), target_q) # 计算actor损失 actor_loss = -self.critic(s, self.actor(s)).mean() # 软更新目标网络 self.soft_update(self.target_actor, self.actor) self.soft_update(self.target_critic, self.critic)在实际应用中,我发现DDPG对超参数非常敏感。特别是学习率和噪声参数,需要仔细调整。一个实用的技巧是先用简单的任务(如Pendulum)进行参数调试,再迁移到复杂环境。
