1. 从策略梯度到Actor-Critic框架的演进
在强化学习领域,策略梯度方法为我们提供了一种直接优化策略函数的途径。但当我们深入实践时会发现,原始的REINFORCE算法存在两个显著问题:一是需要完整的轨迹数据才能进行参数更新,二是梯度估计的方差过高导致训练不稳定。这正是Actor-Critic框架诞生的背景。
1.1 策略梯度的核心缺陷
策略梯度定理告诉我们,策略性能的梯度可以表示为:
∇J(θ) = E[∇logπ(a|s) * Q(s,a)]
这个公式虽然优雅,但在实际应用中存在明显局限。首先,Q(s,a)需要通过蒙特卡洛采样来估计,这意味着必须等到一个episode结束才能计算回报。其次,由于采样轨迹的随机性,Q值的估计方差往往很大,导致参数更新方向波动剧烈。
我在实际项目中曾尝试用原始策略梯度训练机械臂控制任务,发现两个典型现象:
- 同一组参数在不同训练回合表现差异极大
- 需要超过5000个完整episode才能看到稳定进步
这些现象正是上述理论缺陷的现实映射。
1.2 价值函数近似的引入
解决上述问题的关键突破在于引入价值函数近似。我们可以用参数化的价值函数来估计Q值,这样带来三个优势:
- 无需等待完整轨迹,实现单步更新
- 通过函数逼近减小方差
- 允许重用历史数据
具体实现时,我们构建两个神经网络:
- Actor网络:负责策略π(a|s)的输出
- Critic网络:负责评估Q(s,a)或V(s)
这种架构下,Critic就像一位严格的教练,不断评估Actor的表现并给出改进建议;而Actor则像运动员,根据反馈调整自己的动作策略。二者相互促进,共同提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. QAC算法深度解析
2.1 QAC的算法架构
QAC(Q-value Actor-Critic)是最基础的AC算法,其核心组件包括:
Critic部分:
python复制class Critic(nn.Module):
def __init__(self, state_dim, hidden_size):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, 1)
)
def forward(self, state):
return self.net(state)
Actor部分:
python复制class Actor(nn.Module):
def __init__(self, state_dim, action_dim, hidden_size):
