共计 2141 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
Actor-Critic(AC)网络是强化学习中结合了策略梯度(Policy Gradient)和价值函数(Value Function)的混合架构。它通过两个核心组件协同工作:

- Actor:负责根据当前状态选择动作(策略函数 π(a|s))
- Critic:评估状态或状态 - 动作对的价值(价值函数 V(s) 或 Q(s,a))
相比纯策略梯度方法,AC 框架的显著优势在于:
1. 通过 Critic 的即时反馈降低策略更新的方差
2. 允许单步更新而非等待完整 episode 结束
3. 天然支持连续动作空间问题
核心概念与参数更新
1. TD 误差的核心作用
时间差分误差(Temporal Difference Error)是连接 Actor 和 Critic 的桥梁:
δ_t = r_t + γV(s_{t+1}) - V(s_t)
其中 γ 为折扣因子。这个误差信号同时用于:
- Critic 更新 :最小化 TD 误差的平方(MSE)
- Actor 更新 :作为策略梯度的权重系数
2. 双网络更新流程
典型 AC 算法的参数更新分为两个并行分支:
- Critic 更新 (价值函数逼近)
- 目标:使 V(s) 准确预测回报的期望值
-
更新公式:
θ_v ← θ_v + α_v δ_t ∇_{θ_v}V(s_t) -
Actor 更新 (策略优化)
- 目标:最大化预期回报
- 更新公式:
θ_π ← θ_π + α_π δ_t ∇_{θ_π}log π(a_t|s_t)
损失函数设计对比
不同损失函数对训练稳定性的影响显著:
| 损失函数 | 公式 | 适用场景 |
|---|---|---|
| MSE | (δ_t)^2 |
低噪声环境 |
| Huber | {0.5δ^2 if |δ|<1, |δ|-0.5 otherwise} |
异常值较多的环境 |
| LogCosh | log(cosh(δ_t)) |
需要平滑梯度的场景 |
代码实现(PyTorch 版)
import torch
import torch.optim as optim
import torch.nn.functional as F
class ActorCritic(torch.nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
# Shared feature extractor
self.fc1 = nn.Linear(state_dim, 64)
# Actor head
self.actor = nn.Linear(64, action_dim)
# Critic head
self.critic = nn.Linear(64, 1)
def forward(self, x):
x = F.relu(self.fc1(x))
return F.softmax(self.actor(x), dim=-1), self.critic(x)
# 训练循环关键片段
def update(batch):
states, actions, rewards, next_states, dones = batch
# 计算 TD 误差
with torch.no_grad():
_, next_values = model(next_states)
targets = rewards + gamma * next_values * (1 - dones)
# Critic 损失
_, values = model(states)
critic_loss = F.huber_loss(values, targets)
# Actor 更新
probs, _ = model(states)
log_probs = torch.log(probs.gather(1, actions))
actor_loss = -(log_probs * (targets - values).detach()).mean()
# 联合优化
optimizer.zero_grad()
(critic_loss + actor_loss).backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5)
optimizer.step()
实用训练技巧
- 参数初始化
- Actor 最后一层用较小标准差的正态初始化(如 0.01)
-
Critic 最后一层初始化为接近 0 的值
-
学习率设置
- 典型比例:α_actor ≈ α_critic/10
-
建议使用 Adam 优化器默认参数
-
梯度处理
- 对 Actor 梯度进行裁剪(norm=0.5~1.0)
- Critic 梯度可适当放宽限制
常见问题与解决方案
- 训练不稳定
- 现象:回报曲线剧烈波动
-
对策:降低学习率、增大 batch size、改用 Huber 损失
-
策略过早收敛
- 现象:Agent 重复相同动作
-
对策:增加熵正则项、尝试不同的探索策略
-
价值函数过估计
- 现象:Critic 预测值持续高于实际回报
- 对策:实现 Target Network、使用 Double Q-learning 技巧
性能优化考量
- Batch Size 选择 :
- 小 batch(32-64):适合简单环境
-
大 batch(256+):需要配合学习率热身
-
网络结构设计 :
- 共享底层特征提取层可提升样本效率
- 对视觉输入建议使用 CNN 作为共享底层
开放性问题
- 如何设计适用于高维动作空间的 Actor 输出层结构?
- 在多智能体场景下,AC 框架需要做哪些关键修改?
- 当遭遇稀疏奖励问题时,哪些改进策略可能有效?
通过系统性地调整这些组件,开发者可以构建出适应不同场景的高效 AC 算法。实际应用中建议从简单环境开始验证,逐步增加复杂度观察训练行为的变化规律。
正文完
发表至: 人工智能
近一天内
