双延迟深度确定性策略梯度算法 (TD3) 详解
双延迟深度确定性策略梯度算法(Twin Delayed Deep Deterministic Policy Gradient, TD3)是强化学习中专为解决连续动作空间问题设计的一种算法。它由 Fujimoto 等人在 2018 年提出,旨在改进深度确定性策略梯度(DDPG)算法中存在的训练不稳定和 Q 值过估计问题。
一、背景与动机
DDPG 的局限性
DDPG 结合了策略(Actor)和价值函数(Critic),在连续动作空间中表现优异,但在实际应用中暴露出几个关键缺陷:
- Q 值过估计问题:Critic 网络容易高估 Q 值,导致 Actor 基于错误的价值评估进行优化,引发策略震荡。
- 策略噪声敏感:确定性策略直接输出动作,缺乏探索性噪声,容易陷入局部最优。
- 训练不稳定性:Actor 和 Critic 同步更新时,相互干扰可能导致收敛困难。
为了解决上述问题,TD3 引入了三项核心改进机制。
二、核心思想
1. 双 Critic 网络(Twin Critics)
借鉴 Double Q-Learning 的思想,TD3 维护两个独立的 Critic 网络 $Q_{\theta_1}$ 和 $Q_{\theta_2}$。在计算目标 Q 值时,取两者的最小值:
$$ y = r + \gamma \min \big( Q_{\theta_1'}(s', \pi_{\phi'}(s')), Q_{\theta_2'}(s', \pi_{\phi'}(s')) \big) $$
这种保守策略有效减少了因单网络偏差导致的 Q 值高估。
2. 延迟更新(Delayed Policy Updates)
为了避免 Actor 在 Critic 尚未收敛时频繁更新导致的不稳定,TD3 降低了 Actor 的更新频率。通常每更新 Critic $n$ 次(默认 $n=2$),才更新一次 Actor。这使得策略优化建立在更稳定的价值评估之上。
3. 目标策略平滑(Target Policy Smoothing)
在计算目标动作时,加入裁剪后的高斯噪声:
$$ a' = \pi_{\phi'}(s') + \text{clip}(\epsilon, -c, c), \quad \epsilon \sim \mathcal{N}(0, \sigma) $$
这相当于对目标策略进行了正则化,防止策略过拟合到特定的极端动作,提高了鲁棒性。
三、数学细节
Actor-Critic 框架
Actor 负责生成动作,最大化累计奖励;Critic 负责评估状态 - 动作对的价值。
策略梯度: $$ \nabla_\phi J(\pi_\phi) = \mathbb{E}{s \sim \rho^\pi} \left[ \nabla\phi \pi_\phi(s) \nabla_a Q^\pi(s, a) \big|{a=\pi\phi(s)} \right] $$
Critic 损失函数: $$ L(\theta) = \mathbb{E}{(s, a, r, s') \sim \mathcal{D}} \left[ \big( Q\theta(s, a) - y \big)^2 \right] $$
其中目标值 $y$ 如前文所述,包含双 Critic 的最小值和噪声平滑项。
四、PyTorch 实现
以下是一个完整的 TD3 实现示例,基于 PyTorch 和 OpenAI Gym。代码涵盖了环境初始化、经验回放、网络定义及训练循环。
1. 环境与参数配置
import argparse
import gym
import torch
import torch.nn nn
torch.optim optim
collections deque
numpy np
device = torch.cuda.is_available()
parser = argparse.ArgumentParser()
parser.add_argument(, default=)
parser.add_argument(, default=, =)
parser.add_argument(, default=, =)
parser.add_argument(, default=, =)
parser.add_argument(, default=, =)
args = parser.parse_args()
env = gym.make(args.env_name)
state_dim = env.observation_space.shape[]
action_dim = env.action_space.shape[]
max_action = (env.action_space.high[])


