演员评论家 Actor-Critic 算法
Actor-Critic 算法是强化学习中一种结合了策略梯度(Policy Gradient)和值函数估计(Value Function Estimation)的方法。它通过'演员'(Actor)负责决策动作,'评论家'(Critic)评估状态价值,两者协作以降低方差并加速收敛。
核心概念与角色设定
想象一个学习爬山的机器人,目标是找到山顶(最高奖励):
- Actor(行动者):像冒险家,根据当前策略决定下一步怎么走(左或右)。它不总是聪明,可能会选错方向。
- Critic(评论者):像导师,观察冒险家的表现,评价这一步的好坏。它会告诉 Actor:'这一步走得好,接近山顶了'或者'走错了'。
协作机制:
- Actor 观察环境,根据策略选择一个动作。
- Critic 根据动作和环境反馈计算'价值',表示该动作的优劣。
- Actor 利用 Critic 的评价调整策略,使未来选择更优。
这种分工使得 Actor 专注于优化策略,而 Critic 专注于准确评估,两者互补。
背景与动机
为什么需要 Actor-Critic?
强化学习主要有三类方法:值函数法(如 Q-Learning)、策略法、以及结合两者的 Actor-Critic。
纯策略梯度方法存在明显局限:
- 高方差:直接使用环境反馈计算梯度会导致更新不稳定。
- 低效率:奖励信号稀疏且传递慢,采样成本高。
引入 Critic 后,通过估算值函数来计算优势函数(Advantage Function),可以显著降低策略梯度的方差,同时保留策略方法的灵活性。
数学推导基础
1. 优化目标
最大化累积折扣奖励的期望: $$J(\theta) = \mathbb{E}{\pi\theta} \left[ \sum_{t=0}^\infty \gamma^t r_t \right]$$
2. 策略梯度定理
为了优化策略参数 $\theta$,计算目标函数的梯度: $$\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)$ 是优势函数,衡量动作的相对好坏。
3. Critic 的作用
Critic 通过最小化均方误差来学习状态值函数 $V^\pi(s)$: $$L(w) = \frac{1}{2} \mathbb{E} \left[ (r + \gamma V^\pi(s') - V^\pi(s))^2 \right]$$ 这里 $\delta = r + \gamma V^\pi(s') - V^\pi(s)$ 即为时间差分(TD)误差,用于指导 Actor 更新。
算法流程
完整的 Actor-Critic 迭代过程如下:
- 初始化 Actor 和 Critic 网络参数。
- 在状态 $s$ 下,Actor 根据策略 $\pi_\theta(a|s)$ 采样动作 $a$。
- 执行动作,获得奖励 $r$ 和下一状态 $s'$。
- Critic 计算 TD 误差 $\delta$。
- Critic 利用 $\delta$ 更新值函数参数,减小预测误差。
- Actor 利用 $\delta$ 更新策略参数,向更优方向移动。
- 重复直至收敛。
PyTorch 实现
下面是一个基于 PyTorch 的完整实现示例。我们定义两个网络:PolicyNet 作为 Actor,ValueNet 作为 Critic。
网络结构
import torch
from torch nn
torch.nn functional F
numpy np
(nn.Module):
():
(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


