共计 2722 个字符,预计需要花费 7 分钟才能阅读完成。
强化学习与深度强化学习的核心差异
在开始讨论 A2C 算法之前,我们需要先理清强化学习 (RL) 和深度强化学习 (Deep RL) 的区别。以下是两者的主要特征对比:

| 特征 | 传统强化学习 | 深度强化学习 |
|---|---|---|
| 状态表示 | 手工设计特征 | 神经网络自动学习特征 |
| 价值函数近似 | 线性函数近似 | 深度神经网络 |
| 适用场景 | 低维状态空间 | 高维状态空间(如图像) |
| 样本效率 | 较高 | 较低 |
| 典型算法 | Q-Learning, SARSA | DQN, A2C, PPO |
A2C 算法架构解析
A2C(Advantage Actor-Critic)属于深度强化学习算法,它结合了策略梯度 (Policy Gradient) 和价值函数近似 (Value Function Approximation) 的优点。其核心思想是:
- Actor 网络负责策略 π(a|s),直接输出动作概率分布
- Critic 网络评估状态价值 V(s),用于计算优势函数 A(s,a)=Q(s,a)-V(s)
- 使用优势函数而非纯回报来更新策略,减少方差
PyTorch 实现 Actor-Critic 双网络
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
class ActorCritic(nn.Module):
def __init__(self, state_dim, action_dim, hidden_size=128):
super(ActorCritic, self).__init__()
# 共享的特征提取层
self.fc1 = nn.Linear(state_dim, hidden_size)
# Actor 网络 - 输出动作概率
self.actor = nn.Linear(hidden_size, action_dim)
# Critic 网络 - 输出状态价值
self.critic = nn.Linear(hidden_size, 1)
def forward(self, x):
x = F.relu(self.fc1(x))
# 策略分布(使用 softmax 确保概率和为 1)
action_probs = F.softmax(self.actor(x), dim=-1)
# 状态价值
state_value = self.critic(x)
return action_probs, state_value
关键超参数调优策略
在 A2C 实现中,以下几个超参数对训练效果影响显著:
- 折扣因子 γ(0.9-0.99):
- 控制未来奖励的重要性
-
对于回合较长的任务,γ 应设大些
-
熵系数 β(0.01-0.1):
- 鼓励探索,防止策略过早收敛
-
随着训练可线性衰减
-
学习率(1e-4-1e-3):
- 通常使用 Adam 优化器
- 可配合学习率调度器
CartPole-v1 环境实战
训练循环核心代码
env = gym.make('CartPole-v1')
model = ActorCritic(env.observation_space.shape[0], env.action_space.n)
optimizer = optim.Adam(model.parameters(), lr=1e-3)
def train_step(states, actions, rewards, dones):
# 转换为 PyTorch 张量
states = torch.FloatTensor(states)
actions = torch.LongTensor(actions)
rewards = torch.FloatTensor(rewards)
# 计算折扣回报
returns = []
R = 0
for r in reversed(rewards):
R = r + gamma * R
returns.insert(0, R)
returns = torch.FloatTensor(returns)
# 获取策略和状态价值
probs, values = model(states)
# 计算优势
advantages = returns - values.detach()
# 策略梯度损失
policy_loss = -(torch.log(probs.gather(1, actions.unsqueeze(1))) * advantages).mean()
# 价值函数损失
value_loss = F.mse_loss(values.squeeze(), returns)
# 熵奖励
entropy = -torch.sum(probs * torch.log(probs), dim=1).mean()
# 总损失
loss = policy_loss + 0.5 * value_loss - 0.01 * entropy
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
TensorBoard 监控训练
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
for episode in range(1000):
state = env.reset()
episode_reward = 0
while True:
# 选择动作
probs, _ = model(torch.FloatTensor(state))
action = torch.multinomial(probs, 1).item()
# 环境交互
next_state, reward, done, _ = env.step(action)
# 存储数据
...
episode_reward += reward
if done:
break
# 记录指标
writer.add_scalar('Reward/episode', episode_reward, episode)
避坑指南
策略梯度高方差问题
- 使用优势函数而非原始回报
- 实现多步回报(n-step return)
- 添加合适的基线(baseline)
- 引入熵正则化项
并行环境采样同步
- 使用 Python 的 multiprocessing 模块
- 确保各环境独立随机种子
- 梯度更新前同步所有 worker 参数
- 使用队列收集各 worker 经验
性能对比与优化
GPU vs CPU 资源占用
| 设备 | 训练速度(episodes/s) | 显存占用 |
|---|---|---|
| CPU | 50 | – |
| GPU | 180 | 1.5GB |
思考题
- A2C 与 PPO 在连续动作空间中的性能对比
- PPO 有更稳定的策略更新
-
A2C 实现更简单,适合快速原型开发
-
自定义 reward 函数设计
- 考虑加入时间惩罚项
- 对极端状态给予更大惩罚
- 使用 reward shaping 技术
总结
通过本文的实践,我们实现了 A2C 算法在 CartPole 环境中的完整训练流程。A2C 作为深度强化学习的经典算法,平衡了实现复杂度和性能,是入门 DRL 的优秀起点。建议读者尝试修改网络结构、调整超参数,观察对训练效果的影响,这将有助于深入理解算法本质。
正文完
