共计 1722 个字符,预计需要花费 5 分钟才能阅读完成。
强化学习基础与算法分类
强化学习通过智能体与环境的交互学习最优策略,其核心方法可分为两类:

- Value-based 方法 (如 Q -Learning):
- 依赖价值函数估计
- 通过贪心策略选择动作
-
适合离散动作空间
-
Policy-based 方法 (如 REINFORCE):
- 直接优化策略函数
- 支持连续动作空间
- 存在高方差问题
Actor-Critic 结合两者优势:
1. Actor 网络负责策略生成(Policy-based)
2. Critic 网络评估状态价值(Value-based)
核心挑战与数学原理
策略梯度高方差问题
策略梯度定理表达式:
$$\nabla_\theta J(\theta) = \mathbb{E}\left[\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t|s_t) Q^\pi(s_t,a_t)\right]$$
- 原始策略梯度依赖轨迹累计回报
- 通过引入基线(baseline)降低方差:
$$\nabla_\theta J(\theta) \approx \mathbb{E}\left[\nabla_\theta \log \pi_\theta(a_t|s_t) A^\pi(s_t,a_t)\right]$$
价值函数估计偏差
- Critic 网络需平衡 TD(0) 与 MC 方法的偏差 - 方差权衡
- 采用 n -step TD 可平滑过渡:
$$G_t^{(n)} = \sum_{k=0}^{n-1} \gamma^k r_{t+k} + \gamma^n V(s_{t+n})$$
PyTorch 实现详解
网络结构定义
import torch.nn as nn
class PolicyNetwork(nn.Module):
def __init__(self, state_dim, action_dim, hidden_size=64):
super().__init__()
self.fc1 = nn.Linear(state_dim, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, action_dim)
# 连续动作空间使用 tanh 激活
self.tanh = nn.Tanh()
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return self.tanh(self.fc3(x))
优势函数计算
def compute_advantages(rewards, values, gamma=0.99, lam=0.95):
"""GAE(Generalized Advantage Estimation) 实现"""
deltas = rewards[:-1] + gamma * values[1:] - values[:-1]
advantages = []
adv = 0
for delta in reversed(deltas):
adv = delta + gamma * lam * adv
advantages.insert(0, adv)
return torch.tensor(advantages)
性能优化策略
并行采样加速
- 使用 SubprocVecEnv 创建多个环境实例
- 同步收集不同环境的交互数据
- 合并批次时注意保持轨迹独立性
经验回放设计
- Prioritized Experience Replay 注意事项:
- 重要性采样校正(IS weights)
- 分段更新优先级
- 避免过度重播高 TD-error 样本
生产环境避坑指南
梯度爆炸检测
- 监控网络权重范数:
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=5.0)
训练不稳定调试
- 价值函数损失突然增大时降低学习率
- 策略熵低于阈值时增加探索
- 定期保存模型快照
延伸思考问题
- 连续动作空间下如何设计 Critic 网络结构才能更好捕捉状态 - 动作对的非线性关系?
- 多智能体场景中如何解决 credit assignment 问题?
- 离线强化学习如何避免因分布偏移导致的策略退化?
完整实现代码参见 GitHub 仓库(示例链接)。实际部署时建议从 CartPole 等简单环境开始验证,逐步迁移到复杂场景。
正文完
发表至: 人工智能
近一天内
