演员评论家 Actor-Critic 算法
Actor-Critic 算法是强化学习中一种结合了策略梯度(Policy Gradient)和值函数估计(Value Function Estimation)的方法。它通过引入 Critic 来评估状态价值,从而降低策略更新过程中的方差,加速收敛。
核心概念理解
角色设定
在 Actor-Critic 框架中,两个网络分工明确:
- Actor(演员):负责决策。根据当前状态 $s$ 输出动作 $a$ 的概率分布,即策略 $\ heta(a|s)$。
- Critic(评论家):负责评估。估算当前状态的价值 $V(s)$ 或状态 - 动作对的价值 $Q(s, a)$,用于判断 Actor 的动作好坏。
协作机制
- Actor 观察环境并执行动作。
- Critic 接收反馈,计算时序差分误差(TD Error),评价该动作的优劣。
- Actor 利用 Critic 的评价信号更新策略参数,向更优方向移动。
- Critic 同时根据实际奖励更新价值估计,提高评估准确性。
这种机制类似于教练指导运动员:运动员(Actor)尝试动作,教练(Critic)实时反馈效果,双方共同提升表现。
背景与动机
强化学习的演进
强化学习方法主要分为三类:
- 值函数方法(如 Q-Learning):估算价值表,适合离散空间,但面临维度灾难。
- 策略方法(如 REINFORCE):直接优化策略,适合连续空间,但梯度方差大,收敛慢。
- 结合方法(Actor-Critic):取长补短,既保留策略方法的灵活性,又利用值函数降低方差。
策略梯度的局限性
纯策略梯度方法的目标函数梯度为: $$ \nabla_\theta J(\theta) = \mathbb{E}{\pi\theta} \left[ \nabla_\theta \log \pi_\theta(a|s) \cdot A^\pi(s, a) \right] $$ 其中优势函数 $A^\pi(s, a)$ 衡量动作相对于平均水平的优劣。直接使用环境奖励作为基线会导致高方差问题,需要大量采样才能稳定更新。引入 Critic 后,用 TD 误差替代优势函数,显著降低了方差。
数学推导
优化目标
最大化累积折扣奖励的期望: $$ J(\theta) = \mathbb{E}{\pi\theta} \left[ \sum_{t=0}^\infty \gamma^t r_t \right] $$
Critic 更新(值函数估计)
Critic 通过最小化均方误差来学习状态值函数 $V(s)$: $$ L(w) = \frac{1}{2} \mathbb{E} \left[ \left( r + \gamma V^\pi(s') - V^\pi(s) \right)^2 \right] $$ 参数 $w$ 的更新方向由 TD 误差 $\delta$ 决定: $$ \delta = r + \gamma V^\pi(s') - V^\pi(s) $$ $$ w \leftarrow w + \beta \cdot \delta \cdot \nabla_w V^\pi(s) $$
Actor 更新(策略优化)
Actor 利用 Critic 计算的 TD 误差作为优势函数的近似,更新策略参数 $\theta$: $$ \theta \leftarrow \theta + \alpha \cdot \nabla_\theta \log \pi_\theta(a|s) \cdot \delta $$ 这里 $\delta > 0$ 表示动作优于预期,应增加概率;反之则减少。
PyTorch 实现
下面是一个基于 PyTorch 的完整实现示例。代码结构清晰,分为策略网络、价值网络和主训练循环。
网络定义
import torch
import torch.nn as nn
torch.nn functional F
(nn.Module):
():
(PolicyNet, ).__init__()
.fc1 = nn.Linear(n_states, n_hiddens)
.fc2 = nn.Linear(n_hiddens, n_actions)
():
x = F.relu(.fc1(x))
F.softmax(.fc2(x), dim=)
(nn.Module):
():
(ValueNet, ).__init__()
.fc1 = nn.Linear(n_states, n_hiddens)
.fc2 = nn.Linear(n_hiddens, )
():
x = F.relu(.fc1(x))
.fc2(x)


