深度强化学习(Deep RL)发展出多个主流算法流派,包括基于值函数的 DQN、基于策略梯度的 REINFORCE/PPO,以及融合策略和值函数的 Actor-Critic 框架(如 A2C、DDPG、SAC)。每种方法适用于不同场景,选择合适算法将显著影响模型性能与训练效率。
三大算法流派对比
算法类型 | 特点 | 优点 | 局限 | |
---|---|---|---|---|
Value-based | 学习 Q(s, a) 并通过贪婪策略选动作 | 样本利用率高,适合离散动作空间 | 不适用于连续/高维动作 | |
Policy-based | 直接建模并优化策略 π(a | s) | 适合连续动作,训练稳定 | 样本效率低,梯度方差大 |
Actor-Critic | 同时训练策略和价值函数 | 综合两者优势,适用于复杂控制问题 | 架构复杂,对超参数敏感 |
一、DQN(Deep Q-Network)
类型:Value-based
损失函数(均方 TD 误差):
L(θ) = 𝔼ₜ [(rₜ + γ · maxₐ′ Qθ⁻(sₜ₊₁, a′) − Qθ(sₜ, aₜ))²]
其中:
- θ 是 Q 网络参数
- θ⁻ 是目标网络参数(定期同步)
- 使用贪婪策略选择
a′ = argmax Q(s′, a′)
优化器:Adam 或 SGD,通过反向传播最小化 TD 误差更新 θ。
二、REINFORCE(Monte Carlo Policy Gradient)
类型:Policy-based
策略目标函数:
J(θ) = 𝔼ₜ [log πθ(aₜ|sₜ) · Rₜ]
梯度公式(无偏估计):
∇θ J(θ) = 𝔼ₜ [∇θ log πθ(aₜ|sₜ) · Rₜ]
其中 Rₜ 是从当前时间步开始的累计回报。
训练策略:
- 对每个 episode 完成后,回顾整段轨迹,计算每个状态动作对的梯度贡献。
- 对所有样本梯度求平均,得到期望梯度估计。
- 使用优化器(如 Adam)进行如下更新:
θ ← θ + α ∇θ J(θ)
其中 α 是学习率。
方差控制:常引入 baseline(如 V(sₜ))改写为:
∇θ J(θ) = 𝔼ₜ [∇θ log πθ(aₜ|sₜ) · (Rₜ − b(sₜ))]
这样做可以减小梯度估计的方差,提高训练稳定性。
三、PPO(Proximal Policy Optimization)
类型:Actor-Critic
策略目标函数(Clipped Surrogate Objective):
L(θ) = 𝔼ₜ [min(rₜ(θ) Âₜ, clip(rₜ(θ), 1−ε, 1+ε) Âₜ)]
其中:
- rₜ(θ) = πθ(aₜ|sₜ) / πθ_old(aₜ|sₜ)
- Âₜ 是优势函数,通常估计为 GAE(广义优势估计)或 TD 误差形式
Critic 损失:
Lᵥ = 𝔼ₜ [(V(sₜ) − Rₜ)²]
总损失函数:
L_total = −L(θ) + c₁ · Lᵥ − c₂ · Entropy[πθ]
训练目标是最大化策略目标,最小化值函数误差,同时维持策略分布的多样性(熵奖励)。
优化器:Adam
四、DDPG / TD3(Deterministic Policy Gradient)
类型:Actor-Critic(off-policy)
Critic 损失函数(TD 误差):
L = 𝔼ₜ [(rₜ + γQθ⁻(sₜ₊₁, μθ⁻(sₜ₊₁)) − Qθ(sₜ, aₜ))²]
Actor 策略梯度:
∇θ J = 𝔼ₜ [∇ₐ Qθ(s, a) |ₐ=μθ(s) ∇θ μθ(s)]
DDPG 是一种处理连续动作空间的强化学习算法,结合了 Actor-Critic 架构、确定性策略、经验回放和目标网络。
适用于动作是实数的环境.
DDPG = 深度 Actor-Critic + 连续动作 + Replay Buffer + 目标网络
训练流程
环境 → s_t
↓
Actor(s_t) → a_t
↓
执行 a_t → 得到 r_t, s_{t+1}
↓
存入 Replay Buffer
每 N 步:
从 buffer 采样:
→ 用目标 Actor π' 生成 a'
→ 用目标 Critic Q' 计算目标 y
→ 更新 Critic(最小 MSE)
→ 更新 Actor(最大 Q)
→ 软更新 π', Q'
- 初始化网络
-
Actor 网络: π(s;θ^π)
-
Critic 网络: Q(s,a;θ^Q)
-
同时复制两个目标网络:𝜋′ 、Q ′
- 与环境交互
- 确定当前状态s_t, Actor 输出动作a_t = π(s_t) + N_t (加噪声探索)
- 与环境执行动作, 得到r_t, s_(t+1)
- 存入replay buffer:(s_t, a_t, r_t, s_(t+1))
-
从buffer随机采样一个batch
-
更新Critic网络
- 目标值 y
- 损失函数MSE
- 反向传播优化Critic参数theta^Q
- 更新Actor网络(策略梯度)
- 最大化期望Q值
- 实际现实中通常写作L_actor = -1/N [sumQ(s_i, pi(s_i))]
- 最小化负Q值,更新Actor参数
6.软更新目标网络(Polyak) θ^Q ←τθ^Q +(1−τ)θ^Q′ θ^π′ ←τθ^π +(1−τ)θ^π′
一般 τ=0.005
TD3 改进点:
- 使用双 Critic 网络 Q₁、Q₂,目标为 min(Q₁, Q₂)
- Target Policy 加噪声,增强鲁棒性
- 延迟 Actor 更新,先更新 Critic 多次
优化器:Adam,分别用于 Actor 和 Critic 网络
五、SAC(Soft Actor-Critic)
类型:Actor-Critic(off-policy)
策略目标函数(最大熵):
J(π) = 𝔼ₜ [Q(sₜ, aₜ) − α log π(aₜ|sₜ)]
Critic 损失函数:
L = 𝔼ₜ [(rₜ + γ𝔼ₐ′[Q⁻(sₜ₊₁, a′) − α log π(a′|sₜ₊₁)] − Q(sₜ, aₜ))²]
训练策略:
- 策略网络输出动作分布(如高斯),通过 reparameterization trick(如 a = μ + σ · ξ)实现可导性
- 自动调整温度系数 α 平衡探索与利用(鼓励高熵策略)
优化器:Adam,独立更新策略网络与两个 Critic 网络
总结:算法选择建议
任务场景 | 推荐算法 |
---|---|
离散动作、规则清晰 | DQN, Double DQN |
连续动作、精细控制 | DDPG, TD3, SAC |
高稳定性、对泛化要求高 | PPO, A2C |
高维控制 + 探索重要性高 | SAC |
最后的建议
- 新手推荐:从 PPO 开始,接口清晰、训练稳定
- 高维连续控制:尝试 TD3 或 SAC,性能优于 DDPG
- 低资源或验证思路:先跑通 DQN / REINFORCE,再考虑复杂结构
下一篇将介绍:
“如何保存训练好的模型?如何在真实环境中使用?”