Deep Reinforcement Learning · 从零到四大经典算法
从零理解 PPO、DDPG、TD3 与 SAC
从 MDP、价值函数、Bellman 方程和 Actor-Critic 开始,一路推导到四种经典深度强化学习算法:它们到底在优化什么、为什么这样设计、公式如何落到训练代码,以及什么时候该选谁。
- DDPG:用一个确定性 Actor 直接输出连续动作,再让 Critic 告诉它“动作往哪边改 Q 会更高”。
- TD3:给 DDPG 加上双 Critic、延迟策略更新和目标动作平滑,重点解决 Q 高估与训练不稳定。
- SAC:把策略本身做成随机分布,同时优化奖励和熵,让“探索”直接写进目标函数。
- PPO:不使用 Replay Buffer,而是拿当前策略采一批数据,用概率比率和 Clip 限制每次策略更新幅度。
1. 从零开始:强化学习到底在优化什么?
强化学习可以先想成一个不断循环的交互过程。在时刻 \(t\),智能体观察状态 \(s_t\),根据策略选择动作 \(a_t\),环境返回奖励 \(r_t\) 和下一个状态 \(s_{t+1}\)。
状态 s_t → 动作 a_t → 环境 → 奖励 r_t + 新状态 s_{t+1}例如机器人走路时,状态可以是关节角、速度和身体姿态;动作可以是每个关节的力矩;奖励则可以鼓励向前运动、惩罚能耗和摔倒。
1.1 MDP:把问题写成数学模型
标准强化学习通常建模为马尔可夫决策过程(MDP):
其中 \(\mathcal S\) 是状态空间,\(\mathcal A\) 是动作空间,\(P(s'\mid s,a)\) 是状态转移概率,\(R\) 是奖励函数,\(\gamma\in[0,1)\) 是折扣因子。
强化学习真正想最大化的不是“下一步奖励”,而是从当前时刻开始的长期折扣回报:
当 \(\gamma=0.99\) 时,未来奖励仍然重要,但越远的奖励权重越小。
1.2 Policy:智能体到底怎么行动
策略(Policy)描述“在状态 \(s\) 下应该做什么动作”。常见有两类。
随机策略
网络输出动作分布,再从分布中采样。PPO 和 SAC 都属于这一类。
确定性策略
输入状态后直接输出一个确定动作。DDPG 和 TD3 使用这种形式。
1.3 Value 与 Q:到底什么叫“好”
状态价值函数 \(V^\pi(s)\) 表示:从状态 \(s\) 出发并一直按照策略 \(\pi\) 行动,未来能获得多少期望回报。
动作价值函数 \(Q^\pi(s,a)\) 更进一步:在状态 \(s\) 先执行动作 \(a\),之后继续按策略行动,未来有多少期望回报。
1.4 Bellman 方程:长期回报可以递归
Bellman 思想极其重要:长期价值等于“眼前奖励 + 下一状态的长期价值”。对于 Q 函数:
后面 DDPG、TD3、SAC 的 Critic 训练,本质上都在利用这个递归关系构造监督目标。
2. Actor-Critic 为什么自然出现?
现在我们有两个需求:一方面需要一个模块负责“做动作”,另一方面需要一个模块负责“评价这个动作值不值得做”。于是 Actor-Critic 自然出现。
Actor
学习策略:\(a=\pi_\theta(s)\) 或 \(a\sim\pi_\theta(\cdot\mid s)\)。它负责做决定。
Critic
学习 \(V_\phi(s)\) 或 \(Q_\phi(s,a)\)。它负责评价当前状态或动作。
state s
│
▼
Actor ───► action a ───► Environment
▲ │
│ ├── reward r
│ └── next state s'
│
Critic: 评价 V(s) 或 Q(s,a),给 Actor 学习信号2.1 为什么连续动作空间更麻烦
DQN 在离散动作里可以直接枚举动作并计算 \(\arg\max_a Q(s,a)\)。但机器人控制的动作可能是 \([-1,1]^{12}\) 中的连续向量,不可能把无穷多个动作逐一枚举。
一个自然的思路是增加 Actor,让神经网络自己学会输出一个高 Q 的动作:
这正是 DDPG 的核心出发点。
3. DDPG:让 Actor 在连续动作空间里直接寻找高 Q
DDPG 全称 Deep Deterministic Policy Gradient。它是一种 Off-policy、确定性 Actor-Critic 算法,主要针对连续动作控制。
3.1 四个网络
经典 DDPG 通常维护四个网络:
- 在线 Actor:\(\mu_\theta(s)\)
- 在线 Critic:\(Q_\phi(s,a)\)
- Target Actor:\(\mu_{\theta'}(s)\)
- Target Critic:\(Q_{\phi'}(s,a)\)
Target 网络的作用不是“额外学习一套策略”,而是提供变化更慢的 Bellman 目标,避免训练目标和预测值一起剧烈漂移。
3.2 Critic 怎么训练
Replay Buffer 中存储经验 \((s_t,a_t,r_t,s_{t+1},d_t)\)。对于一条样本,先使用 Target Actor 给出下一个动作,再使用 Target Critic 估计其价值:
然后把在线 Critic 当成普通回归网络训练:
这里的 \(d_t\) 表示真正的终止状态。若环境只是因为 time limit 截断,是否令 bootstrap 为零要根据环境语义谨慎处理。
3.3 Actor 怎么训练
Actor 的目标非常直接:输出一个让 Critic 评分尽可能高的动作。
实际实现常把 Actor loss 写成:
负号只是因为优化器默认做梯度下降:最小化 \(-Q\) 就等价于最大化 \(Q\)。
3.4 确定性策略梯度到底怎么传
因为 Actor 输出的动作会被送进 Critic,所以计算图是 \(\theta\to a\to Q\)。链式法则给出:
直觉上,Critic 在告诉 Actor:“动作往哪个方向移动,Q 会变大?”
3.5 Replay Buffer 与 Off-policy
DDPG 会把过去的交互样本存入 Replay Buffer,再随机抽 minibatch 训练。这带来两个直接好处:
- 同一条环境经验可以被重复利用,样本效率高。
- 随机采样打破连续轨迹之间强烈的时间相关性。
3.6 Target Network 的软更新
Target 网络缓慢追踪在线网络:
典型的 \(\tau\) 很小,例如 \(0.005\)。这样 Bellman target 不会跟着在线网络每一步大幅跳动。
3.7 DDPG 怎么探索
问题在于确定性 Actor 对同一个状态总是给出同一个动作。因此训练时通常显式加入噪声:
早期论文常使用 Ornstein-Uhlenbeck noise;现代实现中简单的 Gaussian noise 也很常见。
3.8 DDPG 训练流程
初始化 Actor μθ、Critic Qφ
复制得到 Target Actor μθ'、Target Critic Qφ'
初始化 Replay Buffer D
循环:
a = μθ(s) + exploration_noise
与环境交互,得到 r, s', done
D.add(s, a, r, s', done)
从 D 随机采样 minibatch
y = r + γ(1-done) Qφ'(s', μθ'(s'))
更新 Critic:最小化 (Qφ(s,a) - y)^2
更新 Actor:最小化 -Qφ(s, μθ(s))
软更新两个 Target Network
3.9 DDPG 最大的问题:Critic 的错误会被 Actor 主动利用
假设真实 Q 是 10,但 Critic 因函数逼近误差把某个动作预测成 13。Actor 正在主动寻找使 Q 最大的动作,于是它会被这个“虚高的峰值”吸引,之后数据分布又进一步偏向错误区域。
TD3 的设计,几乎就是围绕这个问题展开。
4. TD3:给 DDPG 打三个稳定化补丁
TD3 全称 Twin Delayed Deep Deterministic Policy Gradient。可以把它记成:
4.1 改进一:Twin Critics
TD3 同时训练两个 Critic:\(Q_{\phi_1}\) 和 \(Q_{\phi_2}\)。构造目标时不取最大,也不取平均,而是取较小值:
如果某个 Critic 把某个动作高估了,另一个 Critic 不一定同时犯同样的错。取最小值会有意识地压制过度乐观的估计,这就是 Clipped Double Q-learning。
4.2 改进二:Delayed Policy Update
DDPG 每更新一次 Critic 就更新一次 Actor;TD3 则先让 Critic 多走几步,再动 Actor。常见设置是 policy_delay = 2:
Critic update
Critic update
Actor update + Target update
Critic update
Critic update
Actor update + Target update原因很朴素:如果 Critic 自己都还没学准,Actor 太快追着它跑只会放大噪声。
4.3 改进三:Target Policy Smoothing
DDPG 的 target action 是 \(\mu_{\theta'}(s')\)。TD3 在上面加一小段被截断的噪声:
它背后的直觉是:一个真正好的动作,附近的小扰动也应该不会突然变得很差。这样可以降低 Actor 对 Critic 中“尖锐伪峰值”的过拟合。
4.4 TD3 的完整 target 与 loss
Actor 通常使用第一个 Critic:
4.5 TD3 训练流程
从 Replay Buffer 采样 batch
ε = clip(N(0, σ²), -c, c)
a' = clip(TargetActor(s') + ε, action_low, action_high)
y = r + γ(1-done) * min(TargetQ1(s', a'), TargetQ2(s', a'))
更新 Q1 和 Q2
每隔 policy_delay 次:
更新 Actor,使 Q1(s, Actor(s)) 增大
软更新 Target Actor、Target Q1、Target Q2
5. SAC:把探索直接写进目标函数
SAC 全称 Soft Actor-Critic。它也是 Off-policy Actor-Critic,但与 DDPG/TD3 最大的不同是:SAC 使用随机策略,并优化最大熵目标。
5.1 从“只要高奖励”变成“高奖励 + 高熵”
普通强化学习常写成:
SAC 则优化:
熵 \(\mathcal H\) 可以粗略理解成策略“有多随机”。如果一个策略对某个动作的概率接近 1,它的熵低;如果多个动作都有明显概率,它的熵更高。
SAC 的核心态度是:只要多个动作都不错,就不要过早把策略压成一个单点。
5.2 SAC 的 Actor:输出高斯分布,而不是一个动作
连续控制中,Actor 通常输出均值和标准差:
先从标准高斯采样 \(\epsilon\sim\mathcal N(0,I)\),然后:
tanh 把动作压到 \([-1,1]\),再按环境动作范围缩放即可。
5.3 Reparameterization Trick:让随机采样也能反向传播
把随机性集中到参数无关的 \(\epsilon\) 上以后,计算图变成 \(\theta\to(\mu,\sigma)\to u\to a\to Q\),因此仍然可以通过普通反向传播更新 Actor。这就是重参数化技巧。
5.4 SAC 也使用两个 Critic
现代 SAC 通常维护两个 Q 网络:
同样使用 \(\min(Q_1,Q_2)\) 压制 Q 高估。
5.5 Soft Bellman Backup
对下一个状态 \(s'\),从当前策略采样 \(a'\sim\pi_\theta(\cdot\mid s')\)。Critic 的目标为:
与 TD3 相比,关键多了 \(-\alpha\log\pi(a'\mid s')\) 这一项,它对应最大熵目标。
5.6 Critic Loss
5.7 Actor Loss
Actor 通常最小化:
第二项希望 Q 变大;第一项鼓励保持一定随机性。它们之间的权衡由温度系数 \(\alpha\) 控制。
5.8 温度系数 \(\alpha\)
当 \(\alpha\) 很小时,策略更偏向利用;当 \(\alpha\) 较大时,策略会保留更多随机性。现代 SAC 常让 \(\alpha\) 自动学习,使实际策略熵接近某个目标熵。
对于 \(n\) 维连续动作,一种常见启发式目标是:
不同代码库对符号和参数化方式可能略有区别,阅读实现时要看清楚它优化的是 \(\alpha\) 还是 \(\log\alpha\)。
5.9 SAC 训练流程
初始化随机 Actor πθ、Q1、Q2 和两个 Target Q
初始化 Replay Buffer
循环:
a ~ πθ(a|s)
与环境交互并写入 Replay Buffer
采样 minibatch
a' ~ πθ(a'|s')
y = r + γ(1-done) * [
min(TargetQ1(s',a'), TargetQ2(s',a'))
- α log πθ(a'|s')
]
更新 Q1、Q2
a ~ πθ(a|s)
更新 Actor:最小化 α log πθ(a|s) - min(Q1,Q2)
可选:自动更新 α
软更新 Target Q
6. PPO:让策略每次只走一小步
PPO 全称 Proximal Policy Optimization。它和前三个算法最大的结构差异是:
6.1 On-policy 与 Off-policy
Off-policy 算法可以把旧经验留在 Replay Buffer 中反复使用;PPO 通常要求训练数据来自相对当前的策略。标准流程是:
当前策略采一批 trajectory
↓
计算 advantage / return
↓
对这批数据训练若干 epoch
↓
丢弃这批 rollout
↓
新策略重新采样因此 PPO 的环境样本利用率通常低于 SAC/TD3,但它非常适合大规模并行仿真。
6.2 从 Policy Gradient 开始
策略梯度的经典形式是:
直觉是:如果某个动作带来高回报,就提高它在这个状态下的概率;如果表现差,就降低概率。
6.3 Advantage:这个动作比“正常水平”好多少
实际中常用 Advantage 代替原始 Q:
如果 \(A>0\),说明这个动作比当前状态下的平均水平更好;如果 \(A<0\),则更差。
6.4 PPO 想解决的核心问题:Policy Gradient 一步走太远
策略一旦更新过猛,采样分布就会发生巨变,而我们手里的数据仍然来自旧策略。于是 PPO 关注新旧策略对同一个动作给出的概率比:
\(r_t=1\) 表示概率没变;\(r_t=1.2\) 表示新策略把该动作概率提高了 20%;\(r_t=0.8\) 则降低了 20%。
6.5 PPO-Clip:最关键的公式
典型的 \(\epsilon\) 是 0.2。注意:PPO 不是简单地把所有 ratio 硬截成 \([0.8,1.2]\),而是用这个 surrogate objective 让“继续朝过度变化方向走”不再带来额外收益。
6.6 为什么取 min?
假设 \(A_t=10>0\),说明这个动作很好。如果新策略把它的概率从旧策略的水平提高到 \(r=2\),普通目标给出 \(20\),而 Clip 后只有 \(1.2\times10=12\)。取二者最小值后,继续把概率推得更高也不会得到更多目标收益。
反过来,如果 \(A_t<0\),算法同样会限制把坏动作概率压得过猛。这个“不让新策略离旧策略太远”的思想,就是 Proximal 的含义。
6.7 GAE:PPO 常用的 Advantage 估计
先定义 TD residual:
然后 Generalized Advantage Estimation(GAE)为:
常见设置是 \(\gamma=0.99\)、\(\lambda=0.95\)。\(\lambda\) 越小,更多依赖 Critic,方差较低但偏差更大;越接近 1,则使用更多远期真实奖励,偏差更低但方差更高。
6.8 Value Loss 与 Entropy Bonus
PPO 通常同时训练一个值函数 \(V_\phi(s)\),例如:
整体损失常写成类似:
不同实现的正负号、value clipping、entropy 系数会有差异,但核心仍是:策略目标 + 值函数目标 + 一点探索鼓励。
6.9 连续动作 PPO
连续动作场景中,Actor 常输出高斯分布的均值和标准差:
实现时通常记录旧策略的 log_prob,然后用:
而不是直接做两个很小概率的除法,数值上更稳定。
6.10 PPO 完整训练流程
循环:
用当前策略 π_old 并行采集 T 步 rollout
记录 s, a, r, done, old_log_prob, V(s)
用 GAE 计算 advantage A
计算 value target / return
常见做法:标准化 advantage
对同一批 rollout 做 K 个 epoch:
打乱数据并切 minibatch
new_log_prob = log πθ(a|s)
ratio = exp(new_log_prob - old_log_prob)
policy_obj = min(
ratio * A,
clip(ratio, 1-ε, 1+ε) * A
)
更新 Actor / Critic
丢掉这批 rollout,用新策略重新采样
7. 四种算法放在一起比较
| 维度 | DDPG | TD3 | SAC | PPO |
|---|---|---|---|---|
| 策略类型 | 确定性 | 确定性 | 随机 | 随机 |
| 数据范式 | Off-policy | Off-policy | Off-policy | On-policy |
| Replay Buffer | 有 | 有 | 有 | 通常无 |
| Critic | 1 个 Q | 2 个 Q | 2 个 Q | 通常 1 个 V |
| Target Network | Actor + Q | Actor + 2Q | 通常 2Q | 通常不用 |
| 探索方式 | 动作外加噪声 | 动作外加噪声 | 策略自身随机 + 熵 | 策略自身随机 + entropy bonus |
| 主要稳定化机制 | Target + Replay | Twin Q + Delay + Smoothing | Twin Q + Maximum Entropy | Ratio Clip + GAE |
| 样本效率 | 高 | 高 | 高 | 相对较低 |
| 工程稳定性 | 偏敏感 | 较好 | 通常很好 | 通常很好 |
| 典型强项 | 教学、基线 | 连续控制、确定性策略 | 连续控制通用首选之一 | 大规模并行仿真 |
7.1 从“数据怎么流”再看一遍
DDPG
Environment → Replay Buffer → Q → Actor。核心是“Actor 找最大 Q”。
TD3
Environment → Replay Buffer → Q1/Q2 → min → 延迟 Actor。核心是“先把 Q 变可信”。
SAC
Environment → Replay Buffer → Twin Q ↔ Stochastic Actor。核心是“奖励 + 熵”。
PPO
Current Policy → Rollout → GAE → Clip 更新 → 丢弃数据。核心是“每次别走太远”。
8. 实际任务怎么选?
如果你面对的是普通连续控制任务,下面是一套很实用的选择思路。
- 环境交互昂贵:优先考虑 SAC / TD3。Off-policy 可以重复利用旧数据。
- 想要一个现代、通常比较稳的连续控制默认基线:SAC 往往是第一批应该尝试的算法之一。
- 希望确定性策略、算法逻辑简洁:TD3 很合适。
- 有数千甚至数万个并行仿真环境:PPO 非常有吸引力,尤其在机器人仿真和游戏环境中。
- 学习算法原理:先吃透 DDPG,再看 TD3,能非常清楚地理解 TD3 三个改进为什么存在。
DDPG 今天更多是“重要基础算法 + 教学基线”。在没有特殊理由的情况下,实际连续控制项目通常会优先尝试 TD3 或 SAC,而不是直接停在 DDPG。
8.1 一些常见超参数起点
下面只是常见起点,不是固定答案。环境奖励尺度、动作维度、并行数和网络大小都会改变合适的设置。
| 参数 | DDPG | TD3 | SAC | PPO |
|---|---|---|---|---|
| \(\gamma\) | 0.99 | 0.99 | 0.99 | 0.99 |
| 学习率 | 3e-4 左右 | 3e-4 左右 | 3e-4 左右 | 3e-4 左右 |
| Batch size | 128–256 | 128–256 | 128–256 | 依并行规模而定 |
| \(\tau\) | 0.005 | 0.005 | 0.005 | — |
| Replay size | \(10^6\) 常见 | \(10^6\) 常见 | \(10^6\) 常见 | — |
| Policy delay | — | 2 常见 | — | — |
| PPO clip \(\epsilon\) | — | — | — | 0.2 常见 |
| GAE \(\lambda\) | — | — | — | 0.95 常见 |
9. 实现中最容易踩的坑
9.1 动作缩放
神经网络可能自然输出 \([-1,1]\),环境却要求 \([-10,10]\) 或每个维度不同范围。需要明确做 affine scaling,并确保训练动作、存入 Replay Buffer 的动作、计算 log-prob 的动作坐标系一致。
9.2 Observation / Reward 尺度
如果一个观测维度在 \(10^{-2}\) 量级,另一个在 \(10^4\) 量级,网络优化会明显更困难。观测归一化、reward scaling 或 reward normalization 往往非常重要。
9.3 Terminal 与 Truncation 不要混为一谈
“真正进入终止状态”和“Episode 因最大步数到期被截断”并不总是同一回事。若错误地把所有 truncation 都当成 \(V(s')=0\),Bellman target 和 GAE 都可能产生系统偏差。
9.4 SAC 的 tanh-squashed Gaussian 要修正 log-prob
SAC 先采样高斯变量 \(u\),再令 \(a=\tanh(u)\)。由于变量变换改变了概率密度,计算 \(\log\pi(a\mid s)\) 时需要加上 Jacobian 修正。成熟库通常已经处理;自己实现时这是高频 bug。
9.5 PPO 的 Advantage 通常要标准化
这不是 PPO 理论定义的一部分,但工程上很常见,通常能让不同 batch 的梯度尺度更稳定。
9.6 PPO 不要把同一批 rollout 用到“失去 On-policy 味道”
PPO 会对一批 rollout 训练多个 epoch,但不是无限重复。epoch 太多、学习率太大或者 minibatch 太小,都可能让新策略很快偏离采样它的旧策略。实践中可监控 approximate KL、clip fraction 和 entropy。
9.7 训练曲线别只看单次 seed
深度强化学习对随机种子非常敏感。比较算法时,应至少运行多个 seeds,报告均值、方差或置信区间;否则“这个算法更强”可能只是一次幸运初始化。
10. 一张脑图记住全部
Reinforcement Learning
│
└── Actor-Critic
│
┌───────┴────────┐
│ │
Off-policy On-policy
│ │
Replay Buffer PPO
│ ┌──┴──┐
┌───┴────┐ GAE Clip
│ │
Deterministic Stochastic
│ │
DDPG SAC
│
TD3 = Twin Q + Delayed Actor + Target Smoothing10.1 最小记忆版
- DDPG:Actor 直接找高 Q 的连续动作。
- TD3:防止 Actor 被错误的高 Q 欺骗。
- SAC:高奖励之外,还奖励策略保持足够的熵。
- PPO:用概率比和 Clip 约束新旧策略的变化幅度。
10.2 四个最值得记住的公式
DDPG
TD3
SAC
PPO
参考论文
- Lillicrap et al., Continuous Control with Deep Reinforcement Learning(DDPG)
- Fujimoto et al., Addressing Function Approximation Error in Actor-Critic Methods(TD3)
- Haarnoja et al., Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor(SAC)
- Schulman et al., Proximal Policy Optimization Algorithms(PPO)
- Schulman et al., High-Dimensional Continuous Control Using Generalized Advantage Estimation(GAE)
建议学习顺序:MDP → V/Q → Bellman → Policy Gradient → Actor-Critic → DDPG → TD3 → SAC;PPO 则从 Policy Gradient → Advantage/GAE → Trust Region 思想 → PPO-Clip 这条线理解。