← 返回

从零理解 PPO、DDPG、TD3 与 SAC

Deep Reinforcement Learning · 从零到四大经典算法

从零理解 PPO、DDPG、TD3 与 SAC

从 MDP、价值函数、Bellman 方程和 Actor-Critic 开始,一路推导到四种经典深度强化学习算法:它们到底在优化什么、为什么这样设计、公式如何落到训练代码,以及什么时候该选谁。

连续控制Actor-CriticOn-policy / Off-policy含核心公式与伪代码
先记住四句话:
  • 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,R,\gamma) \]

其中 \(\mathcal S\) 是状态空间,\(\mathcal A\) 是动作空间,\(P(s'\mid s,a)\) 是状态转移概率,\(R\) 是奖励函数,\(\gamma\in[0,1)\) 是折扣因子。

强化学习真正想最大化的不是“下一步奖励”,而是从当前时刻开始的长期折扣回报:

\[ G_t=\sum_{k=0}^{\infty}\gamma^k r_{t+k} \]

当 \(\gamma=0.99\) 时,未来奖励仍然重要,但越远的奖励权重越小。

1.2 Policy:智能体到底怎么行动

策略(Policy)描述“在状态 \(s\) 下应该做什么动作”。常见有两类。

随机策略

\[ a\sim\pi_\theta(a\mid s) \]

网络输出动作分布,再从分布中采样。PPO 和 SAC 都属于这一类。

确定性策略

\[ a=\mu_\theta(s) \]

输入状态后直接输出一个确定动作。DDPG 和 TD3 使用这种形式。

1.3 Value 与 Q:到底什么叫“好”

状态价值函数 \(V^\pi(s)\) 表示:从状态 \(s\) 出发并一直按照策略 \(\pi\) 行动,未来能获得多少期望回报。

\[ V^\pi(s)=\mathbb E_\pi\left[\sum_{k=0}^{\infty}\gamma^k r_{t+k}\mid s_t=s\right] \]

动作价值函数 \(Q^\pi(s,a)\) 更进一步:在状态 \(s\) 先执行动作 \(a\),之后继续按策略行动,未来有多少期望回报。

\[ Q^\pi(s,a)=\mathbb E_\pi\left[\sum_{k=0}^{\infty}\gamma^k r_{t+k}\mid s_t=s,a_t=a\right] \]

1.4 Bellman 方程:长期回报可以递归

Bellman 思想极其重要:长期价值等于“眼前奖励 + 下一状态的长期价值”。对于 Q 函数:

\[ Q(s_t,a_t)=r_t+\gamma\,\mathbb E\left[Q(s_{t+1},a_{t+1})\right] \]

后面 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 的动作:

\[ a=\mu_\theta(s),\qquad \mu_\theta(s)\approx\arg\max_a Q_\phi(s,a) \]

这正是 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 估计其价值:

\[ y_t=r_t+\gamma(1-d_t)Q_{\phi'}\bigl(s_{t+1},\mu_{\theta'}(s_{t+1})\bigr) \]

然后把在线 Critic 当成普通回归网络训练:

\[ L_Q(\phi)=\frac{1}{N}\sum_i\left(Q_\phi(s_i,a_i)-y_i\right)^2 \]

这里的 \(d_t\) 表示真正的终止状态。若环境只是因为 time limit 截断,是否令 bootstrap 为零要根据环境语义谨慎处理。

3.3 Actor 怎么训练

Actor 的目标非常直接:输出一个让 Critic 评分尽可能高的动作。

\[ J(\theta)=\mathbb E_{s}\left[Q_\phi\bigl(s,\mu_\theta(s)\bigr)\right] \]

实际实现常把 Actor loss 写成:

\[ L_{\text{actor}}=-\mathbb E_s\left[Q_\phi\bigl(s,\mu_\theta(s)\bigr)\right] \]

负号只是因为优化器默认做梯度下降:最小化 \(-Q\) 就等价于最大化 \(Q\)。

3.4 确定性策略梯度到底怎么传

因为 Actor 输出的动作会被送进 Critic,所以计算图是 \(\theta\to a\to Q\)。链式法则给出:

\[ \nabla_\theta J\approx\mathbb E\left[\nabla_a Q_\phi(s,a)\big|_{a=\mu_\theta(s)}\,\nabla_\theta\mu_\theta(s)\right] \]

直觉上,Critic 在告诉 Actor:“动作往哪个方向移动,Q 会变大?”

3.5 Replay Buffer 与 Off-policy

DDPG 会把过去的交互样本存入 Replay Buffer,再随机抽 minibatch 训练。这带来两个直接好处:

  • 同一条环境经验可以被重复利用,样本效率高。
  • 随机采样打破连续轨迹之间强烈的时间相关性。

3.6 Target Network 的软更新

Target 网络缓慢追踪在线网络:

\[ \phi'\leftarrow\tau\phi+(1-\tau)\phi',\qquad \theta'\leftarrow\tau\theta+(1-\tau)\theta' \]

典型的 \(\tau\) 很小,例如 \(0.005\)。这样 Bellman target 不会跟着在线网络每一步大幅跳动。

3.7 DDPG 怎么探索

问题在于确定性 Actor 对同一个状态总是给出同一个动作。因此训练时通常显式加入噪声:

\[ a_t=\mu_\theta(s_t)+\epsilon_t,\qquad \epsilon_t\sim\mathcal N(0,\sigma^2) \]

早期论文常使用 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 最大的动作,于是它会被这个“虚高的峰值”吸引,之后数据分布又进一步偏向错误区域。

典型恶性循环Critic 有一点高估 → Actor 专门利用这个高估 → 数据更偏 → Q 进一步失真 → 训练震荡甚至崩溃。

TD3 的设计,几乎就是围绕这个问题展开。

4. TD3:给 DDPG 打三个稳定化补丁

TD3 全称 Twin Delayed Deep Deterministic Policy Gradient。可以把它记成:

\[ \boxed{\text{TD3}=\text{DDPG}+\text{Twin Critics}+\text{Delayed Update}+\text{Target Smoothing}} \]

4.1 改进一:Twin Critics

TD3 同时训练两个 Critic:\(Q_{\phi_1}\) 和 \(Q_{\phi_2}\)。构造目标时不取最大,也不取平均,而是取较小值:

\[ y=r+\gamma(1-d)\min\left(Q'_{1}(s',a'),Q'_{2}(s',a')\right) \]

如果某个 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 在上面加一小段被截断的噪声:

\[ \epsilon\sim\operatorname{clip}\bigl(\mathcal N(0,\sigma^2),-c,c\bigr) \]
\[ a'=\operatorname{clip}\bigl(\mu_{\theta'}(s')+\epsilon,a_{\min},a_{\max}\bigr) \]

它背后的直觉是:一个真正好的动作,附近的小扰动也应该不会突然变得很差。这样可以降低 Actor 对 Critic 中“尖锐伪峰值”的过拟合。

4.4 TD3 的完整 target 与 loss

\[ y=r+\gamma(1-d)\min\left(Q'_1(s',a'),Q'_2(s',a')\right) \]
\[ L_{Q_i}=\mathbb E\left[\left(Q_i(s,a)-y\right)^2\right],\qquad i\in\{1,2\} \]

Actor 通常使用第一个 Critic:

\[ L_\pi=-\mathbb E_s\left[Q_1\bigl(s,\mu_\theta(s)\bigr)\right] \]

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
一句话理解 TD3它没有改变 DDPG 的根本路线,而是努力让“Actor 所相信的 Q”更可信、更平滑、更慢地变化。

5. SAC:把探索直接写进目标函数

SAC 全称 Soft Actor-Critic。它也是 Off-policy Actor-Critic,但与 DDPG/TD3 最大的不同是:SAC 使用随机策略,并优化最大熵目标。

5.1 从“只要高奖励”变成“高奖励 + 高熵”

普通强化学习常写成:

\[ \max_\pi\;\mathbb E\left[\sum_t\gamma^t r_t\right] \]

SAC 则优化:

\[ \max_\pi\;\mathbb E\left[\sum_t\gamma^t\left(r_t+\alpha\mathcal H\bigl(\pi(\cdot\mid s_t)\bigr)\right)\right] \]

熵 \(\mathcal H\) 可以粗略理解成策略“有多随机”。如果一个策略对某个动作的概率接近 1,它的熵低;如果多个动作都有明显概率,它的熵更高。

SAC 的核心态度是:只要多个动作都不错,就不要过早把策略压成一个单点。

5.2 SAC 的 Actor:输出高斯分布,而不是一个动作

连续控制中,Actor 通常输出均值和标准差:

\[ \mu_\theta(s),\qquad \sigma_\theta(s) \]

先从标准高斯采样 \(\epsilon\sim\mathcal N(0,I)\),然后:

\[ u=\mu_\theta(s)+\sigma_\theta(s)\odot\epsilon \]
\[ a=\tanh(u) \]

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 网络:

\[ Q_{\phi_1}(s,a),\qquad Q_{\phi_2}(s,a) \]

同样使用 \(\min(Q_1,Q_2)\) 压制 Q 高估。

5.5 Soft Bellman Backup

对下一个状态 \(s'\),从当前策略采样 \(a'\sim\pi_\theta(\cdot\mid s')\)。Critic 的目标为:

\[ y=r+\gamma(1-d)\left[\min\bigl(Q'_1(s',a'),Q'_2(s',a')\bigr)-\alpha\log\pi_\theta(a'\mid s')\right] \]

与 TD3 相比,关键多了 \(-\alpha\log\pi(a'\mid s')\) 这一项,它对应最大熵目标。

5.6 Critic Loss

\[ L_{Q_i}=\mathbb E\left[\left(Q_i(s,a)-y\right)^2\right],\qquad i\in\{1,2\} \]

5.7 Actor Loss

Actor 通常最小化:

\[ L_\pi=\mathbb E\left[\alpha\log\pi_\theta(a\mid s)-\min\bigl(Q_1(s,a),Q_2(s,a)\bigr)\right] \]

第二项希望 Q 变大;第一项鼓励保持一定随机性。它们之间的权衡由温度系数 \(\alpha\) 控制。

5.8 温度系数 \(\alpha\)

当 \(\alpha\) 很小时,策略更偏向利用;当 \(\alpha\) 较大时,策略会保留更多随机性。现代 SAC 常让 \(\alpha\) 自动学习,使实际策略熵接近某个目标熵。

对于 \(n\) 维连续动作,一种常见启发式目标是:

\[ \mathcal H_{\text{target}}\approx -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
一句话理解 SACTD3 的探索更像“给确定性动作外挂噪声”;SAC 则让随机性成为策略的一部分,并明确把探索收益写进优化目标。

6. PPO:让策略每次只走一小步

PPO 全称 Proximal Policy Optimization。它和前三个算法最大的结构差异是:

\[ \boxed{\text{PPO 是 On-policy;DDPG、TD3、SAC 是 Off-policy}} \]

6.1 On-policy 与 Off-policy

Off-policy 算法可以把旧经验留在 Replay Buffer 中反复使用;PPO 通常要求训练数据来自相对当前的策略。标准流程是:

当前策略采一批 trajectory ↓ 计算 advantage / return ↓ 对这批数据训练若干 epoch ↓ 丢弃这批 rollout ↓ 新策略重新采样

因此 PPO 的环境样本利用率通常低于 SAC/TD3,但它非常适合大规模并行仿真。

6.2 从 Policy Gradient 开始

策略梯度的经典形式是:

\[ \nabla_\theta J=\mathbb E\left[\nabla_\theta\log\pi_\theta(a\mid s)\,Q^\pi(s,a)\right] \]

直觉是:如果某个动作带来高回报,就提高它在这个状态下的概率;如果表现差,就降低概率。

6.3 Advantage:这个动作比“正常水平”好多少

实际中常用 Advantage 代替原始 Q:

\[ A(s,a)=Q(s,a)-V(s) \]

如果 \(A>0\),说明这个动作比当前状态下的平均水平更好;如果 \(A<0\),则更差。

6.4 PPO 想解决的核心问题:Policy Gradient 一步走太远

策略一旦更新过猛,采样分布就会发生巨变,而我们手里的数据仍然来自旧策略。于是 PPO 关注新旧策略对同一个动作给出的概率比:

\[ r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\theta_{\text{old}}}(a_t\mid s_t)} \]

\(r_t=1\) 表示概率没变;\(r_t=1.2\) 表示新策略把该动作概率提高了 20%;\(r_t=0.8\) 则降低了 20%。

6.5 PPO-Clip:最关键的公式

\[ L^{\text{CLIP}}(\theta)=\mathbb E_t\left[ \min\left( r_t(\theta)A_t, \operatorname{clip}\bigl(r_t(\theta),1-\epsilon,1+\epsilon\bigr)A_t \right) \right] \]

典型的 \(\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:

\[ \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \]

然后 Generalized Advantage Estimation(GAE)为:

\[ A_t=\sum_{l=0}^{\infty}(\gamma\lambda)^l\delta_{t+l} \]

常见设置是 \(\gamma=0.99\)、\(\lambda=0.95\)。\(\lambda\) 越小,更多依赖 Critic,方差较低但偏差更大;越接近 1,则使用更多远期真实奖励,偏差更低但方差更高。

6.8 Value Loss 与 Entropy Bonus

PPO 通常同时训练一个值函数 \(V_\phi(s)\),例如:

\[ L_V=\mathbb E\left[\left(V_\phi(s_t)-V_t^{\text{target}}\right)^2\right] \]

整体损失常写成类似:

\[ L=-L^{\text{CLIP}}+c_vL_V-c_e\mathcal H(\pi) \]

不同实现的正负号、value clipping、entropy 系数会有差异,但核心仍是:策略目标 + 值函数目标 + 一点探索鼓励。

6.9 连续动作 PPO

连续动作场景中,Actor 常输出高斯分布的均值和标准差:

\[ \pi_\theta(a\mid s)=\mathcal N\bigl(\mu_\theta(s),\sigma_\theta(s)^2\bigr) \]

实现时通常记录旧策略的 log_prob,然后用:

\[ r_t=\exp\left(\log\pi_{\text{new}}(a_t\mid s_t)-\log\pi_{\text{old}}(a_t\mid s_t)\right) \]

而不是直接做两个很小概率的除法,数值上更稳定。

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. 四种算法放在一起比较

DDPGDeterministic + Off-policy
TD3DDPG + 三个稳定化技巧
SACStochastic + Maximum Entropy
PPOOn-policy + Clipped Update
维度DDPGTD3SACPPO
策略类型确定性确定性随机随机
数据范式Off-policyOff-policyOff-policyOn-policy
Replay Buffer通常无
Critic1 个 Q2 个 Q2 个 Q通常 1 个 V
Target NetworkActor + QActor + 2Q通常 2Q通常不用
探索方式动作外加噪声动作外加噪声策略自身随机 + 熵策略自身随机 + entropy bonus
主要稳定化机制Target + ReplayTwin Q + Delay + SmoothingTwin Q + Maximum EntropyRatio 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 一些常见超参数起点

下面只是常见起点,不是固定答案。环境奖励尺度、动作维度、并行数和网络大小都会改变合适的设置。

参数DDPGTD3SACPPO
\(\gamma\)0.990.990.990.99
学习率3e-4 左右3e-4 左右3e-4 左右3e-4 左右
Batch size128–256128–256128–256依并行规模而定
\(\tau\)0.0050.0050.005
Replay size\(10^6\) 常见\(10^6\) 常见\(10^6\) 常见
Policy delay2 常见
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 通常要标准化

\[ A\leftarrow\frac{A-\mu_A}{\sigma_A+\varepsilon} \]

这不是 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 Smoothing

10.1 最小记忆版

  • DDPG:Actor 直接找高 Q 的连续动作。
  • TD3:防止 Actor 被错误的高 Q 欺骗。
  • SAC:高奖励之外,还奖励策略保持足够的熵。
  • PPO:用概率比和 Clip 约束新旧策略的变化幅度。

10.2 四个最值得记住的公式

DDPG

\[ y=r+\gamma Q'(s',\mu'(s')),\qquad L_\pi=-\mathbb E\left[Q(s,\mu(s))\right] \]

TD3

\[ y=r+\gamma\min\left(Q'_1(s',a'),Q'_2(s',a')\right),\quad a'=\mu'(s')+\epsilon \]

SAC

\[ y=r+\gamma\left[\min(Q'_1,Q'_2)-\alpha\log\pi(a'\mid s')\right] \]

PPO

\[ L^{\text{CLIP}}=\mathbb E\left[\min\left(r_tA_t,\operatorname{clip}(r_t,1-\epsilon,1+\epsilon)A_t\right)\right] \]

参考论文

  1. Lillicrap et al., Continuous Control with Deep Reinforcement Learning(DDPG)
  2. Fujimoto et al., Addressing Function Approximation Error in Actor-Critic Methods(TD3)
  3. Haarnoja et al., Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor(SAC)
  4. Schulman et al., Proximal Policy Optimization Algorithms(PPO)
  5. 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 这条线理解。