强化学习算法笔记:用一套框架串起 MC、TD、DQN、PPO、SAC

27 阅读3分钟

原文地址:www.infyai.cn/2025/12/28/…`

我学强化学习的时候,最大的困扰是:算法太多,名字一堆,每次看完一个新算法就忘了之前的,总觉得它们之间没什么联系。

MC、TD、SARSA、Q-learning、DQN、REINFORCE、PPO、SAC、TD3……这些名字听起来像是完全不同的东西。但其实,它们都在回答同一个问题:怎么让智能体学会做决策

后来我发现,如果你用"三个问题"来看这些算法,它们就不再是一堆孤立的名字,而是有清晰脉络的一个体系:

  1. 它在学什么?(状态价值、动作价值、还是策略)
  2. 它的学习目标从哪来?(真实回报 vs 估计值)
  3. 数据能不能重复用?(on-policy vs off-policy)

强化学习的基本设定

所有算法都在解决马尔可夫决策过程(MDP)

(S,A,P,r,γ)(\mathcal{S}, \mathcal{A}, P, r, \gamma)
  • sSs \in \mathcal{S}:状态
  • aAa \in \mathcal{A}:动作
  • P(ss,a)P(s'|s,a):转移概率
  • r=r(s,a)r = r(s,a):奖励
  • γ[0,1)\gamma \in [0,1):折扣因子

智能体和环境交互,产生一条轨迹:

s0,a0,r1,s1,a1,r2,s_0, a_0, r_1, s_1, a_1, r_2, \dots

回报(Return)是未来奖励的折扣累加:

Gt=k=0γkrt+k+1G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1}

目标是最大化期望回报:

maxπ  J(π)=Eπ[t0γtrt+1]\max_\pi \; J(\pi) = \mathbb{E}_\pi \left[ \sum_{t \geq 0} \gamma^t r_{t+1} \right]

有些算法(比如 SAC)还会加上熵项,鼓励探索:

maxπ  Eπ[t0γt(rt+1+αH(π(st)))]\max_\pi \; \mathbb{E}_\pi \left[ \sum_{t \geq 0} \gamma^t (r_{t+1} + \alpha \mathcal{H}(\pi(\cdot|s_t))) \right]

其中熵 H(π(s))=Eaπ[logπ(as)]\mathcal{H}(\pi(\cdot|s)) = -\mathbb{E}_{a \sim \pi}[\log \pi(a|s)]


三个分类轴:把所有算法放进去

不要一上来就背算法名字,先问自己这三个问题:

轴 A:学什么(表示)

  1. 学状态价值 Vπ(s)V^\pi(s):这个状态"平均有多好"
  2. 学动作价值 Qπ(s,a)Q^\pi(s,a):在状态 ss 做动作 aa 有多好
  3. 学策略 π(as)\pi(a|s):直接学怎么出动作
  4. Actor-Critic:同时学策略(actor)+ 价值(critic)

它们之间的关系:π(s)\pi(\cdot|s) 表示在策略 π\pi 下,状态ss所能执行的动作的条件分布

Vπ(s)=Eaπ(s)[Qπ(s,a)],Aπ(s,a)=Qπ(s,a)Vπ(s)V^\pi(s) = \mathbb{E}_{a \sim \pi(\cdot|s)}[Q^\pi(s,a)], \quad A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)

轴 B:学习目标怎么来(MC vs TD)

  • MC(蒙特卡洛):用完整回报 GtG_t(等到回合结束)
  • TD(时序差分):用一步奖励 + 下一步的估计(bootstrapping)

轴 C:数据能否重复利用(on-policy vs off-policy)

  • on-policy:数据来自当前策略,旧数据基本作废
  • off-policy:可以用旧策略数据(replay buffer),样本效率高

价值函数与 Bellman 方程

所有基于价值的方法(TD、Q-learning、DQN)都在逼近 Bellman 方程。

定义

Vπ(s)=Eπ[Gtst=s],Qπ(s,a)=Eπ[Gtst=s,at=a]V^\pi(s) = \mathbb{E}_\pi[G_t | s_t = s], \quad Q^\pi(s,a) = \mathbb{E}_\pi[G_t | s_t = s, a_t = a]

Bellman 期望方程(评估当前策略)

Vπ(s)=Eaπ,sP[r+γVπ(s)]V^\pi(s) = \mathbb{E}_{a \sim \pi, s' \sim P} \big[ r + \gamma V^\pi(s') \big]
Qπ(s,a)=EsP[r+γEaπ[Qπ(s,a)]]Q^\pi(s,a) = \mathbb{E}_{s' \sim P} \left[ r + \gamma \mathbb{E}_{a' \sim \pi}[Q^\pi(s',a')] \right]

Bellman 最优方程(找最优策略)

V(s)=maxaE[r+γV(s)],Q(s,a)=E[r+γmaxaQ(s,a)]V^*(s) = \max_a \mathbb{E}[r + \gamma V^*(s')], \quad Q^*(s,a) = \mathbb{E} \big[ r + \gamma \max_{a'} Q^*(s',a') \big]

TD 类方法就是在采样下逼近这些方程。


MC vs TD:学习目标从哪来

这一节解释你之前可能困惑的"有偏/无偏、方差大小"。

MC:用真实回报 GtG_t

更新 VV

V(st)V(st)+α[GtV(st)]V(s_t) \leftarrow V(s_t) + \alpha \big[ G_t - V(s_t) \big]

更新 QQ

Q(st,at)Q(st,at)+α[GtQ(st,at)]Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \big[ G_t - Q(s_t, a_t) \big]

直觉:等一局打完再算"这一步最终带来了多少总分"。

  • 优点:target 更"真实",通常无偏
  • 缺点:轨迹随机性累积,方差大;必须等结束;样本效率差

TD(0):一步就更新(bootstrapping)

TD(0) 评估 VV

V(st)V(st)+α[rt+1+γV(st+1)V(st)]δtV(s_t) \leftarrow V(s_t) + \alpha \underbrace{\big[ r_{t+1} + \gamma V(s_{t+1}) - V(s_t) \big]}_{\delta_t}
  • TD target:rt+1+γV(st+1)r_{t+1} + \gamma V(s_{t+1})
  • TD error:δt=rt+1+γV(st+1)V(st)\delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t)

直觉:不等结局,用"下一步我估计还能拿多少分"来更新当前。

  • 优点:在线;更新更频繁;通常方差更小;样本更省
  • 缺点:target 里用了估计 V(st+1)V(s_{t+1})(不是真值),因此通常有偏

n-step 与 TD(λ\lambda):在 MC 与 TD 之间折中

n-step 回报:

Gt(n)=k=0n1γkrt+k+1+γnV(st+n)G_t^{(n)} = \sum_{k=0}^{n-1} \gamma^k r_{t+k+1} + \gamma^n V(s_{t+n})
  • n=1n=1:TD(0)
  • nn \to \infty:趋向 MC

TD(λ\lambda) 把所有 n-step 按 λ\lambda 加权混合(常用资格迹/GAE 思想)。


SARSA 与 Q-learning:都是 TD 控制

很多人以为 SARSA 和 Q-learning 的区别是 TD vs 非 TD。这是错的

它们都是 TD 控制(学 QQ),差别在 on-policy vs off-policy 的 target

SARSA(on-policy TD 控制)

用实际执行的下一动作 at+1a_{t+1}

Q(st,at)Q(st,at)+α[rt+1+γQ(st+1,at+1)Q(st,at)]Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \big[ r_{t+1} + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t) \big]

直觉:"我下一步真的会这么走(含探索),那我就按这条路来学习。"

  • 优点:更"贴合实际行为策略",在有风险探索时更保守
  • 缺点:收敛到的是当前行为策略对应的 QπQ^\pi,探索强时可能偏保守

Q-learning(off-policy TD 控制)

target 用贪心最大值:

Q(st,at)Q(st,at)+α[rt+1+γmaxaQ(st+1,a)Q(st,at)]Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \big[ r_{t+1} + \gamma \max_{a'} Q(s_{t+1}, a') - Q(s_t, a_t) \big]

直觉:"不管我探索时怎么乱走,我学习目标永远按最优动作来算。"

  • 优点:直接逼近 QQ^*,理论上更"追最优"
  • 缺点:max\max 会带来过估计倾向(深度函数逼近下更明显)

DQN:Q-learning + 神经网络 + 稳定器

DQN 用神经网络 Qθ(s,a)Q_\theta(s,a) 近似 QQ,核心更新仍是 Q-learning 的 TD 目标。

TD 目标与损失

用 target network θ\theta^-

y=r+γmaxaQθ(s,a)y = r + \gamma \max_{a'} Q_{\theta^-}(s', a')

最小化平方误差:

L(θ)=E[(yQθ(s,a))2]L(\theta) = \mathbb{E} \big[ (y - Q_\theta(s,a))^2 \big]

为什么 DQN 需要"两个稳定器"

  1. Experience Replay:把经验存入回放池,随机采样打散相关性
  2. Target Networkθ\theta^- 慢更新,避免"目标也跟着你同时变"导致发散

常见 DQN 改进

  • Double DQN:缓解 max\max 过估计
  • Dueling:把 QQ 分解为 VV 与 Advantage
  • PER:优先采样"大 TD error"经验

REINFORCE:纯策略梯度

REINFORCE 是最原始的策略梯度:直接用 MC 回报推策略

基本更新

目标:

J(θ)=Eπθ[G0]J(\theta) = \mathbb{E}_{\pi_\theta}[G_0]

REINFORCE 更新:

θθ+αtθlogπθ(atst)  Gt\theta \leftarrow \theta + \alpha \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \; G_t

直觉:这局分高,就把这局出现过的动作概率往上推。

baseline:从 REINFORCE 走向 Actor-Critic 的关键一步

加入 baseline b(st)b(s_t) 不改变期望梯度,但能显著降方差:

θθ+αtθlogπθ(atst)  (Gtb(st))\theta \leftarrow \theta + \alpha \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \; (G_t - b(s_t))

最常用 b(s)=Vϕ(s)b(s) = V_\phi(s),于是权重近似优势:

GtVϕ(st)A(st,at)G_t - V_\phi(s_t) \approx A(s_t, a_t)

REINFORCE 的问题:

  • 优点:概念最干净,通常无偏
  • 缺点:方差大、样本效率低、训练抖

所以现代方法通常用 Actor-Critic(引入 critic)来替代它。


Actor-Critic 总框架

Actor-Critic = 两个网络(或共享骨干):

  • Actorπθ(as)\pi_\theta(a|s)
  • CriticVϕ(s)V_\phi(s)Qϕ(s,a)Q_\phi(s,a)

你可以把绝大多数现代算法看成在回答两件事:

  1. critic 怎么学(target 怎么构造)
  2. actor 怎么学(目标函数是什么、用什么约束)

Actor 的一般更新(策略梯度形态)

θJ(θ)=E[θlogπθ(as)  A^(s,a)]\nabla_\theta J(\theta) = \mathbb{E} \big[ \nabla_\theta \log \pi_\theta(a|s) \; \hat{A}(s,a) \big]

其中 A^\hat{A} 来自 critic(例如 GAE、TD error、或 soft Q 形式)。

Critic 的一般更新(Bellman/TD 形态)

如果学 VV

minϕE[(V^target(s)Vϕ(s))2]\min_\phi \mathbb{E} \big[ (\hat{V}_{\text{target}}(s) - V_\phi(s))^2 \big]

如果学 QQ

minϕE[(Q^target(s,a)Qϕ(s,a))2]\min_\phi \mathbb{E} \big[ (\hat{Q}_{\text{target}}(s,a) - Q_\phi(s,a))^2 \big]

PPO:on-policy 的稳定策略更新

PPO 是 on-policy Actor-Critic,核心在于:每次策略更新别跨太大步(稳定训练)。

重要性采样比率

rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}

PPO-Clip 目标(核心)

LCLIP(θ)=E[min(rt(θ)A^t,  clip(rt(θ),1ϵ,1+ϵ)A^t)]L^{\text{CLIP}}(\theta) = \mathbb{E} \left[ \min \big( r_t(\theta) \hat{A}_t, \; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \big) \right]

典型 PPO 训练总损失(工程常用)

L(θ,ϕ)=LCLIP(θ)+c1E[(Vϕ(st)V^t)2]value lossc2E[H(πθ(st))]entropy bonusL(\theta, \phi) = -L^{\text{CLIP}}(\theta) + c_1 \underbrace{\mathbb{E} \big[ (V_\phi(s_t) - \hat{V}_t)^2 \big]}_{\text{value loss}} - c_2 \underbrace{\mathbb{E}[\mathcal{H}(\pi_\theta(\cdot|s_t))]}_{\text{entropy bonus}}

PPO 的优劣

  • 优点:非常稳、好调、泛用(离散/连续都能做)
  • 缺点:on-policy → 数据"用完就得再采样",样本效率不如 off-policy(SAC/TD3)

DDPG → TD3:连续动作的 off-policy 确定性 Actor-Critic

连续动作下,maxaQ(s,a)\max_a Q(s,a) 不好做(动作是连续变量),所以常用 actor 直接输出动作。

DDPG(确定性策略)

  • actor:a=μθ(s)a = \mu_\theta(s)
  • critic:Qϕ(s,a)Q_\phi(s,a)

critic 目标:

y=r+γQϕ(s,μθ(s))y = r + \gamma Q_{\phi^-}(s', \mu_{\theta^-}(s'))

critic loss:

L(ϕ)=E[(yQϕ(s,a))2]L(\phi) = \mathbb{E}[(y - Q_\phi(s,a))^2]

actor 目标(最大化 Q):

J(θ)=E[Qϕ(s,μθ(s))]J(\theta) = \mathbb{E}[Q_\phi(s, \mu_\theta(s))]

用链式法则做确定性策略梯度。

TD3:DDPG 的稳定升级

TD3 三招(强烈建议背下来):

  1. 双 Q 取最小:减少过估计

    y=r+γmini=1,2Qϕi(s,a~)y = r + \gamma \min_{i=1,2} Q_{\phi_i^-}(s', \tilde{a}')
  2. target policy smoothinga~=μθ(s)+ϵ\tilde{a}' = \mu_{\theta^-}(s') + \epsilonϵclip(N(0,σ),c,c)\epsilon \sim \text{clip}(\mathcal{N}(0, \sigma), -c, c)

  3. 延迟更新 actor:critic 更新多步后再更 actor

TD3 的优劣

  • 优点:连续控制强、样本效率高、比 DDPG 稳很多
  • 缺点:确定性策略探索依赖外加噪声;实现与超参比 PPO 复杂

SAC:最大熵 off-policy Actor-Critic

SAC 可以理解为:"更会探索、更鲁棒"的 off-policy Actor-Critic

最大熵目标带来的直觉

SAC 不只追求高回报,还追求高熵(策略别太死板)。

直觉:你不希望策略过早变成"死贪心",否则容易卡在次优、也更脆弱。

soft Q 的 Bellman 备份(核心差异)

SAC 的 critic target 多了熵项(或 logπ\log \pi 项)。一种常见写法:

y=r+γ(mini=1,2Qϕi(s,a)αlogπθ(as)),aπθ(s)y = r + \gamma \left( \min_{i=1,2} Q_{\phi_i^-}(s', a') - \alpha \log \pi_\theta(a'|s') \right), \quad a' \sim \pi_\theta(\cdot|s')

critic loss 同样是 MSE:

L(ϕ)=E[(yQϕ(s,a))2]L(\phi) = \mathbb{E}[(y - Q_\phi(s,a))^2]

actor 更新("最大化 Q + 熵")

actor 目标常写成最小化:

J(θ)=EsD,aπθ[αlogπθ(as)miniQϕi(s,a)]J(\theta) = \mathbb{E}_{s \sim D, a \sim \pi_\theta} \big[ \alpha \log \pi_\theta(a|s) - \min_i Q_{\phi_i}(s,a) \big]

即让策略选择那些 Q 高logπ\log \pi 代价低(熵高) 的动作。

温度 α\alpha(可自动调)

很多实现会自动学习 α\alpha,让策略熵靠近目标熵 Htarget\mathcal{H}_{\text{target}}

J(α)=Eaπθ[α(logπθ(as)+Htarget)]J(\alpha) = \mathbb{E}_{a \sim \pi_\theta} \big[ -\alpha(\log \pi_\theta(a|s) + \mathcal{H}_{\text{target}}) \big]

SAC 的优劣

  • 优点:off-policy + replay → 样本效率高;探索强;连续控制很强、训练常更稳健
  • 缺点:实现复杂(双 Q、熵项、温度、更新比等);超参比 PPO 多

一张总对照表

方法学什么MC/TDon/off动作空间核心 target / 目标优点缺点
MC 评估V/QV/QMCon任意GtG_t无偏直观方差大、等结束
TD(0) 评估VVTDon任意r+γV(s)r+\gamma V(s')在线、稳有偏
SARSAQQTDon多为离散r+γQ(s,a)r+\gamma Q(s',a')更保守贴合行为样本效率一般
Q-learningQQTDoff多为离散r+γmaxaQ(s,a)r+\gamma \max_{a'}Q(s',a')追最优、可 off-policy过估计风险
DQNQθQ_\thetaTDoff离散(不大)MSE 拟合 Q-learning target实战强基线连续动作不直接适用
REINFORCEπ\piMCon任意logπGt\nabla\log\pi \cdot G_t概念最纯方差大、慢
PPOπ+V\pi+V多为 TD/GAEon任意clip surrogate + value loss稳、好调样本效率不如 off
TD3μ+Q\mu+QTDoff连续双Q最小+平滑+延迟更新连续控制强、样本效率高实现/调参较复杂
SACπ+Q\pi+QTD(soft)off连续(也可离散)QαlogπQ - \alpha\log\pi(最大熵)探索强、样本效率高实现复杂

选型指南:什么时候用谁

按最关键的两个问题选:

动作空间

  • 离散且动作数不大:优先 DQN(或 PPO 也行但通常不如 DQN 简洁高效)
  • 连续动作:优先 SAC / TD3;想稳且实现简单可选 PPO

采样成本(交互贵不贵)

  • 交互很贵(真实系统/慢仿真):优先 off-policy(SAC/TD3/DQN)
  • 交互便宜(并行仿真)PPO 很舒服(稳、可扩展)

你更在乎什么

  • 稳定、少踩坑:PPO
  • 样本效率、探索、连续控制强:SAC(很多场景首选)
  • 确定性控制、追求"硬"性能:TD3(常作为强 baseline)

常见坑与调参检查单

"致命三元组"(函数逼近 + bootstrapping + off-policy)

很多发散/不稳定都来自这三个同时出现(典型深度 Q 学习、off-policy TD)。

应对:target network、双 Q、replay、合理学习率/归一化、限制更新步长。

PPO 常见要点

  • advantage 归一化几乎必做
  • clip ϵ\epsilon 不要太大;value loss 权重别压过 policy
  • rollout 长度、epoch、batch size 会显著影响稳定性

SAC/TD3 常见要点

  • replay buffer 足够大;warmup 采样(先填 buffer)
  • 更新比(每交互一步更新几次)要合理
  • 观察 Q 值尺度:爆炸通常意味着学习率/目标网络/归一化有问题
  • SAC 的 α\alpha 自动调通常更省心(但要设置合理 target entropy)

最简记忆脉络(一句话版)

  • MC vs TD:target 是 GtG_t(等结局)还是 r+γV^/Q^r+\gamma\hat{V}/\hat{Q}(用下一步估计)
  • SARSA vs Q-learning:target 用 Q(s,a)Q(s',a')(on-policy)还是 maxaQ(s,a)\max_{a'}Q(s',a')(off-policy)
  • DQN:Q-learning + 神经网络 + replay + target network
  • REINFORCE:纯策略梯度(MC),方差大 → 引入 baseline/critic 变 Actor-Critic
  • PPO:on-policy Actor-Critic,核心是"别更新太猛"(clip)
  • TD3:off-policy 连续控制,DDPG 的稳化(三招)
  • SAC:off-policy + 最大熵(探索强、样本效率高)