Actor-Critic 算法详解
Actor-Critic(演员 - 评论家)是强化学习中一种结合了策略梯度与值函数估计的混合方法。它通过两个网络的协作,既保留了策略方法的灵活性,又利用值函数降低了方差,从而提升学习效率。
核心思想与角色设定
想象一个正在学习爬山的机器人:
- Actor(演员):负责决策。就像冒险家,根据当前环境状态决定下一步动作(向左还是向右)。
- Critic(评论家):负责评估。就像导师,观察 Actor 的动作并给出反馈(这一步走得好坏如何),帮助 Actor 调整策略。
两者的协作机制如下:
- Actor 观察状态 $s$,根据策略 $\ heta$ 采样动作 $a$。
- 执行动作后获得奖励 $r$ 和下一状态 $s'$。
- Critic 估算当前状态价值 $V(s)$ 和下一状态价值 $V(s')$,计算时序差分误差(TD Error)。
- Actor 利用 TD 误差更新策略参数,Critic 利用均方误差更新价值网络。
这种分工使得 Critic 能提供更稳定的梯度信号,解决纯策略梯度方法中奖励稀疏或高方差的问题。
背景与动机
强化学习的优化目标是最大化累积折扣奖励的期望:
$$J(\theta) = \mathbb{E}{\pi\theta} \left[ \sum_{t=0}^\infty \gamma^t r_t \right]$$
早期的策略梯度方法直接对目标函数求导:
$$\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 后,我们可以用值函数的预测来替代部分随机性,显著降低方差。
数学推导
Critic 的目标是学习状态价值函数 $V^\pi(s)$,最小化 TD 误差的平方:
$$L(w) = \frac{1}{2} \mathbb{E} \left[ \left( r + \gamma V^\pi(s') - V^\pi(s) \right)^2 \right]$$
Actor 的更新则依赖于 Critic 计算的 TD 误差 $\delta$:
$$\delta = r + \gamma V^\pi(s') - V^\pi(s)$$
策略参数更新公式为:
$$\theta \leftarrow \theta + \alpha \cdot \nabla_\theta \log \pi_\theta(a|s) \cdot \delta$$
这里 $\delta$ 充当了优势函数的代理,指导 Actor 向更优方向移动。
PyTorch 实战实现
下面是一个基于 PyTorch 的完整实现示例。我们定义两个网络:PolicyNet(Actor)和 ValueNet(Critic),并在 CartPole 环境中进行训练。
网络结构
import torch
from torch import nn
from torch.nn import functional as F
import numpy as np
class PolicyNet(nn.Module):
"""Actor: 策略网络"""
def ():
(PolicyNet, ).__init__()
.fc1 = nn.Linear(n_states, n_hiddens)
.fc2 = nn.Linear(n_hiddens, n_actions)
():
x = .fc1(x)
x = F.relu(x)
x = .fc2(x)
F.softmax(x, dim=)
(nn.Module):
():
(ValueNet, ).__init__()
.fc1 = nn.Linear(n_states, n_hiddens)
.fc2 = nn.Linear(n_hiddens, )
():
x = .fc1(x)
x = F.relu(x)
x = .fc2(x)
x


