跳过正文

2026春 RL 期末笔记

目录

智能体如何在不确定环境中通过交互学习决策;当环境里不止一个智能体时,多个智能体之间又如何相互影响、竞争、合作并达到某种均衡

该笔记对照课程PPT撰写,由于PPT供参考了三本教材,教材中的符号各有出入,导致笔记中的符号也略显混乱(但应该能基本看懂),阅读时需注意区分。

01 强化学习基础 #

强化学习到底和普通机器学习的不同 #

强化学习不是简单地拟合一个静态数据集,而是系统在运行过程中不断获得知识、行为和认知能力,并把这些能力嵌入系统,使系统性能不断提升。

监督学习里,我们通常有一个固定数据集,例如图片分类中给定图片和标签,模型只需要学习从输入到标签的映射。

强化学习中的数据不是一开始就静态给好的,而是智能体自己在环境里试错产生的。它做一个动作,环境给一个反馈,然后状态又发生变化。也就是说,智能体的行为会改变自己未来能看到的数据分布

概念学习是给定正例、反例,学习目标概念;交互学习则是通过动作影响状态分布,并且天然存在 exploration 和 exploitation 的折中。

强化学习的基本闭环:状态、动作、奖励、策略 #

image.png

Agent 接收环境给出的状态 \(S_t\) 和奖励 \(R_t\),根据策略选择动作 \(A_t\),动作作用于 Environment,环境再返回新的状态 \(S_{t+1}\) 和新的奖励 \(R_{t+1}\)。

强化学习里最重要的对象之一是策略,通常写作:

\[ \pi:S\rightarrow A \]

如果是确定性策略,那么 \(\pi(s)\) 直接告诉你在状态 s 下选择哪个动作。如果是随机策略,则写成:

\[ \pi(a|s) \]

它表示在状态 s 下选择动作 a 的概率。

image.png

MDP:强化学习问题的数学建模 #

MDP,也就是 Markov Decision Process,马尔可夫决策过程

\[ S,\ A,\ \delta,\ R \]

其中 S 是状态集合,A 是动作集合,\(\delta\) 是状态转移概率,R 是即时奖励函数。

\[ \delta(s,a,s') \]

表示当前在状态 s,执行动作 a,下一步转移到状态 s’ 的概率。

\[ R(s,a) \]

表示在状态 s 执行动作 a 得到的即时奖励。

Markov指的是:未来只依赖当前状态和当前动作,而不需要知道更早之前的完整历史

\[ P(S_{t+1}=s'|S_t=s,A_t=a,S_{t-1},A_{t-1},\dots)=P(S_{t+1}=s'|S_t=s,A_t=a) \]

多状态问题:轨迹与返回 Return #

在多状态 MDP 情境下,智能体不再只关心当前一步奖励,而要关心一整条轨迹上的长期收益。

trajectory 的概念是:

\[ s_0,a_0,r_0,s_1,a_1,r_1,s_2,a_2,r_2,\dots \]

这就是一次 episode 或一次经验轨迹。

一条轨迹上有很多即时奖励,我们需要一个返回函数 Return 把所有即时奖励组合成单一值:

有限窗口,也就是只考虑前 H 步:

\[ G_t = \sum_{i=0}^{H-1} R_{t+i+1} \]

无限窗口无折扣:

\[ G_t = \sum_{i=0}^{\infty} R_{t+i+1} \]

但这个式子可能发散。例如每一步奖励都是 1,那么无限加起来就是无穷大。所以很多强化学习问题使用折扣回报:

\[ G_t = \sum_{i=0}^{\infty} \gamma^i R_{t+i+1} \]

这里 \(\gamma\in[0,1)\) 是折扣因子。它的含义是:越远的未来奖励,权重越小。

如果 \(\gamma=0\),智能体只关心眼前一步奖励:

\[ G_t = R_{t+1} \]

如果 \(\gamma\) 越接近 1,智能体越重视长期收益。

提示

为什么要引入折扣因子?

  1. 数学上让无限期回报收敛
  2. 建模上体现远期奖励的不确定性和较低重要性
  3. 算法上让价值函数有稳定的递推结构

价值函数:评价状态和动作的长期价值 #

状态价值函数:

\[ V^\pi(s) \]

表示从状态 s 出发,之后一直按照策略 \(\pi\) 行动,能够获得的期望返回。

形式化写作:

\[ V^\pi(s)=\mathbb{E}_\pi[G_t|S_t=s] \]

这里的期望 \(\mathbb{E}_\pi\) 表示随机性来自两个地方:一是环境转移可能是随机的,二是策略本身也可能是随机的。

动作价值函数:

\[ Q^\pi(s,a) \]

它表示从状态 s 出发,第一步先执行动作 a,之后再按照策略 \(\pi\) 行动,能够获得的期望返回:

\[ Q^\pi(s,a)=\mathbb{E}_\pi[G_t|S_t=s,A_t=a] \]

\(V^\pi(s)\) 是“这个状态整体好不好”;\(Q^\pi(s,a)\) 是“在这个状态下选某个动作好不好”。如果已知 \(Q^\pi(s,a)\),那么改进策略就很自然:在每个状态下选 Q 最大的动作。

\[ \pi'(s)=\arg\max_a Q^\pi(s,a) \]

Bellman 方程 #

一个状态的长期价值 = 当前即时奖励 + 下一状态长期价值的折扣期望。

对于给定策略 \(\pi\),状态价值函数满足:

\[ V^\pi(s)=\mathbb{E}_\pi[R_{t+1}+\gamma V^\pi(S_{t+1})\mid S_t=s] \]

如果策略是确定性的,也就是在状态 s 下动作为 \(\pi(s)\),那么可以展开为:

\[ V^\pi(s)=R(s,\pi(s))+\gamma\sum_{s'}P(s'|s,\pi(s))V^\pi(s') \]

用例子理解策略评估 #

状态是 \(s_0,s_1,s_2,s_3\),动作集合是:\(A=\{+1,-1\}\),折扣因子:\(\gamma=\frac{1}{2}\)

转移规则:\(\delta(s_i,a)=s_{i+a}\)

策略是随机策略:以一半概率选择 +1,一半概率选择 -1

奖励:\(R(s_i,a)=i\)

\[ V^\pi(s_0)=0+\frac{1}{2}\left[\frac{1}{2}V^\pi(s_1)+\frac{1}{2}V^\pi(s_3)\right] \]\[ V^\pi(s_1)=1+\frac{V^\pi(s_0)+V^\pi(s_2)}{4} \]\[ V^\pi(s_2)=2+\frac{V^\pi(s_1)+V^\pi(s_3)}{4} \]\[ V^\pi(s_3)=3+\frac{V^\pi(s_2)+V^\pi(s_0)}{4} \]

解得:

\(V^\pi(s_0)=\frac{5}{3}\),\(V^\pi(s_1)=\frac{7}{3}\),\(V^\pi(s_2)=\frac{11}{3}\),\(V^\pi(s_3)=\frac{13}{3}\)

动态规划:已知完整 MDP 时怎么求策略 #

动态规划不是无模型强化学习。它要求你知道完整模型,也就是知道:

\(P(s'|s,a)\) 和 \(R(s,a)\)

如果模型未知,就不能直接做经典动态规划,只能通过采样经验学习

策略评估 Policy Evaluation 的问题是:给定一个策略 \(\pi\),求它的价值函数 \(V^\pi(s)\)。也就是上述例子

最优控制 Optimal Control 的问题是:找到最优策略 \(\pi^*\),使得从任意状态出发期望返回都最大:

\[ V^*(s)=\max_\pi V^\pi(s) \]

最优状态价值函数满足 Bellman 最优方程:

\[ V^*(s)=\max_a\left[R(s,a)+\gamma\sum_{s'}P(s'|s,a)V^*(s')\right] \]

策略评估时,动作由给定策略 \(\pi\) 决定;最优控制时,我们要在所有动作中选择能让长期价值最大的动作。

动作价值函数的最优形式是:

\[ Q^*(s,a)=R(s,a)+\gamma\sum_{s'}P(s'|s,a)\max_{a'}Q^*(s',a') \]

注意 \(Q^\pi\) 和 \(Q^*\) 的区别:

\[ Q^\pi:\text{先做动作 }a\text{,后面按当前策略 }\pi\text{走} \]\[ Q^*:\text{先做动作 }a\text{,后面每一步都按最优策略走} \]

策略改进:为什么贪心策略会变好? #

贪心策略是:

\[ \pi'(s)=\arg\max_a Q^\pi(s,a) \]

意思是:我先评估当前策略 \(\pi\),得到它的动作价值函数 \(Q^\pi(s,a)\)。然后我在每个状态下都选择当前看起来 Q 最大的动作,得到新策略 \(\pi'\)。

这一步叫 policy improvement,策略改进,即如果在状态 s 下,当前策略原本会选动作 \(\pi(s)\),但我们发现另一个动作 a 的长期价值更高,那么改选 a 不会让策略变差。不断重复“评估—改进”,就得到策略迭代。

但是纯贪心有一个问题:如果我们还没有准确估计所有动作的价值,过早贪心可能导致探索不足。

所以引入 \(\varepsilon\)-贪心:

以 \(1-\varepsilon\) 的概率选择当前最优动作:

\[ \arg\max_a Q(s,a) \]

以 \(\varepsilon\) 的概率选择其他动作。

策略迭代和值迭代 #

策略迭代的逻辑是:

\[ \pi_0\rightarrow V^{\pi_0}\rightarrow\pi_1\rightarrow V^{\pi_1}\rightarrow\pi_2\rightarrow\cdots\rightarrow\pi^* \]

也就是先给一个初始策略,做策略评估,得到 \(V^\pi\);再根据 \(Q^\pi\) 做贪心改进,得到更好的策略;然后重复这个过程,直到策略不再变化。

\[ \pi'(s)=\arg\max_a Q^\pi(s,a)= \arg\max_a \left[ R(s,a) + \gamma\sum_{s'}P(s'|s,a)V^\pi(s') \right] \]

在策略改进时使用的是 \(Q^\pi\) 而不是 \(Q^*\)

值迭代则把“评估”和“改进”揉在一起,直接用 Bellman 最优方程更新:

\[ V_{k+1}(s)=\max_a\left[R(s,a)+\gamma\sum_{s'}P(s'|s,a)V_k(s')\right] \]

通俗一点来说:

策略迭代是“先认真评估当前策略,再改进策略”,每轮计算更重,但是总轮次可能较少

值迭代是“每次更新价值时就顺便假设自己会选最优动作”,每轮更简单但可能需要更多轮

02 时差学习 #

第一章假设 MDP 模型完全已知,即指导状态转移概率 P 和奖励函数 R,那么可以用Bellman方程和动态规划求值函数,求最优策略,但是现实中模型往往未知,所以这一讲开始研究一个更实际的问题:不知道完整模型时,能不能只靠智能体采样到的经验来更新价值函数和策略?

动态规划、Monte Carlo、TD 的核心区别 #

动态规划方法:

\[ V(s_t)\leftarrow\mathbb{E}_\pi\left[r_t+\gamma V(s_{t+1})\right] \]

从当前状态 \(s_t\) 展开整棵未来可能状态树,然后对下一状态的所有可能结果做期望。

动态规划方法不采样,而是利用已知模型做全期望更新。

Monte Carlo 方法 不需要模型。

MC 策略评价的目标是学习 \(V^\pi(s)\),给定若干按照策略 \(\pi\) 访问状态 s 后得到的经验,把访问状态 s 之后获得的返回进行平均。

\[ V(s_t)\leftarrow V(s_t)+\alpha\left[G_t-V(s_t)\right] \]

这里的 \(G_t\) 是从 t 时刻开始直到 episode 结束的完整回报:

MC 的特点是:它不需要模型,也不需要当前的价值估计作为目标的一部分。它直接等一整条轨迹结束,然后用真实累计回报来更新。所以 MC 的优点是估计目标比较“真实”,不依赖自己当前的估计;缺点是必须等 episode 结束才能更新,方差也可能很大。

TD 方法 介于动态规划和 MC 之间:

\[ V(s_t)\leftarrow V(s_t)+\alpha\left[r_t+\gamma V(s_{t+1})-V(s_t)\right] \]

它不像 MC 那样等到 episode 结束,而是在每一次经验之后就更新。

TD error,也就是时差误差,通常记作:

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

Bootstrapping 和 Sampling #

Bootstraps 是“通过一个估计值进行更新”;Sampling 是“根据经验进行更新”。

方法是否 Sampling是否 Bootstrapping
动态规划 DP
Monte Carlo
TD

动态规划不是 sampling,因为它不是等智能体真实走出一条轨迹,而是已知完整模型,对所有可能下一状态求期望。它是 bootstrapping,因为更新 \(V(s)\) 时用到了另一个估计值 \(V(s')\)。

Monte Carlo 是 sampling,因为它用真实采样到的轨迹回报 \(R_t\)。但它不是 bootstrapping,因为更新目标是完整真实回报,不包含当前估计的 \(V(s')\)。

TD 是最有意思的:它既 sampling,又 bootstrapping。它 sampling,是因为它用了一步真实经验 \(s_t,r_t,s_{t+1}\)。它 bootstrapping,是因为目标里用了当前估计的 \(V(s_{t+1})\)。

强化学习算法设计 #

算法构造思路:

  1. 根据先验得到初始认知,也就是初始值函数;
  2. 根据认知选择动作,通常伴随一定随机性;
  3. 获得经验;
  4. 根据反馈修改认知;
  5. 再根据延迟反馈回退修改历史认知。
\[ \text{初始化价值}\rightarrow\text{根据价值选动作}\rightarrow\text{获得奖励和下一状态}\rightarrow\text{更新价值}\rightarrow\text{继续交互} \]

算法设计的核心要素:

  1. 值函数如何表达,是 V 还是 Q;
\[ V^\pi(s)=\mathbb{E}_\pi[R_{t+1}+\gamma V^\pi(S_{t+1})\mid S_t=s] \]\[ Q^\pi(s,a)=\mathbb{E}[R(s,a)]+\gamma\sum_{s'}P(s'|s,a)V^\pi(s') \]
  1. 动作如何随机选择,也就是探索和利用;

    如果 \(\varepsilon\) 很大,探索多;如果 \(\varepsilon\) 很小,利用多。\(\varepsilon\) 可以随着学习 episode 次数下降。也就是说,一开始我们对环境不了解,所以多探索;后面价值估计越来越可靠,就更多利用当前学到的好策略。

  2. 值函数如何更新,是 on-policy 还是 off-policy;

  3. 代表算法包括 SARSA、Q-learning、Actor-Critic。

SARSA:在策略 TD 控制 #

\[ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha[r_{t+1}+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)] \]

它叫 SARSA,是因为一次更新用到了五元组:

\[ S_t,A_t,R_{t+1},S_{t+1},A_{t+1} \]

也就是 State, Action, Reward, State, Action。

SARSA 是 on-policy,也就是在策略学习。它的意思是:用于更新的目标动作 \(a_{t+1}\),就是当前策略实际会选择的动作。假设当前策略是 \(\varepsilon\)-贪心,那么 \(a_{t+1}\) 也是按照这个 \(\varepsilon\)-贪心策略选出来的。也就是说,SARSA 学的是“我当前这套带探索的行为策略”本身的价值。

如果 \(\varepsilon\)-贪心有时会随机探索到一个不太好的动作,SARSA 会把这种探索风险也考虑进价值估计里。因此 SARSA 往往更“保守”。

Q-learning:离策略 TD 控制 #

\[ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha[r_{t+1}+\gamma \max_a Q(s_{t+1},a)-Q(s_t,a_t)] \]

Q-learning 是 off-policy,也就是离策略学习。

的行为策略和目标策略可以不同。行为策略可以是 \(\varepsilon\)-贪心,用来探索;但更新时的目标策略是贪心策略,用 \(\max_a Q(s_{t+1},a)\) 来代表。它学习的是最优贪心策略的价值,而不是当前探索策略本身的价值。

这就是 off-policy 的含义:采样数据的策略和被学习的目标策略不是同一个策略。

从 1 步 TD 到 N 步 TD #

1 步 TD 看一步真实奖励,然后用 \(V(s_{t+1})\) 估计后面所有未来:

\[ R_t^{(1)}=r_t+\gamma V(s_{t+1}) \]

2 步 TD 看两步真实奖励,再用 \(V(s_{t+2})\) 估计后面:

\[ R_t^{(2)}=r_t+\gamma r_{t+1}+\gamma^2 V(s_{t+2}) \]

N 步返回就是:

\[ R_t^{(n)}=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots+\gamma^{n-1}r_{t+n-1}+\gamma^n V(s_{t+n}) \]

然后用 N 步返回更新:

\[ V(s_t)\leftarrow V(s_t)+\alpha[R_t^{(n)}-V(s_t)] \]

直觉上,n 越大,真实采样奖励越多,对当前价值估计的依赖越少,偏差更小但方差更大;n 越小,越依赖当前估计,更新更快但可能有偏差。

由于采样轨迹中的奖励和状态转移具有随机性,真实采样部分越长,更新目标波动越大,因此方差增大。

TD(lambda):平均所有 N 步回报 #

\[ R_t^\lambda=(1-\lambda)\sum_{n=1}^{\infty}\lambda^{n-1}R_t^{(n)} \]

然后用它更新值函数:

\[ \Delta V(s_t)=\alpha[R_t^\lambda-V(s_t)] \]

如果 \(\lambda\) 小,权重集中在短步回报,更像 TD(0)。

如果 \(\lambda\) 大,长步回报权重更大,更像 Monte Carlo。

如果 \(\lambda=1\),退化成 MC 方法;如果 \(\lambda=0\),退化成 TD(0) 方法。

前向视角理解 TD(lambda) #

在每一个状态,向未来看,用未来的“每个状态值函数 + 已获得的奖赏”来更新当前状态的值函数。

但实际算法实现有个问题:你要等未来很多步甚至整个 episode 结束,才能知道这些 N 步回报。这就失去了 TD 在线更新的优势。

所以前向视角主要用于理论理解。它告诉你 \(TD(\lambda)\) 到底在估计什么:它是在用多种长度的回报综合更新当前状态。

后向视角理解 TD(lambda):资格迹 #

资格迹(eligibility trace) 可以理解为:某个历史状态“有多大资格”对当前 TD error 负责。刚刚访问过的状态资格高,很久以前访问过的状态资格低。

\[ e_t(s)=\begin{cases}\gamma\lambda e_{t-1}(s), & s\ne s_t \\\gamma\lambda e_{t-1}(s)+1, & s=s_t\end{cases} \]

也就是说,每一步所有状态的资格都会衰减:

\[ e(s)\leftarrow \gamma\lambda e(s) \]

当前访问到的状态额外加 1:

\[ e(s_t)\leftarrow e(s_t)+1 \]

然后当前 TD error 是:

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

对所有状态更新:

\[ V(s)\leftarrow V(s)+\alpha \delta_t e(s) \]

完整 \(TD(\lambda)\) 算法流程:初始化 \(V(s)、e(s)=0\),每个 episode 中执行动作获得 \(r,s'\),计算 TD error,增加当前状态资格迹,然后对所有状态按 \(\alpha\delta e(s)\) 更新,并衰减资格迹。

提示

\(\delta_t\) 明明是根据当前状态 \(S_t\) 算出来的,为什么更新所有历史状态时都用同一个 \(\delta_t\)?

\delta_t=r_{t+1}+\gamma V(S_{t+1})-V(S_t)

虽然里面出现了 \(S_t\),但它表达的不是“只属于 \(S_t\) 的误差”,而是当前时间步的 TD error

这个差值本来在 TD(0) 中只用来更新 \(S_t\)。\(TD(\lambda)\) 说:不只是 \(S_t\),之前访问过且仍有资格迹的状态,也应该被这次误差信号影响。

03 函数估计 #

这一章解决的问题是:当状态太多、表格存不下时,如何用一个函数来近似值函数,并让这种近似能泛化到没见过的状态。

函数估计的意义是它不再把每个状态看成完全独立的表项,而是用一个带参数的函数来表示价值:

\[ \hat V(s,w)\approx V^\pi(s) \]

这里 \(w\) 是参数,\(\hat V\) 是近似值函数。只要两个状态在特征表示上相似,它们的估计值就会相互影响,从而实现泛化。

简单 RL 问题可以用 lookup table,也就是值函数存储在查找表里,对应算法叫“值表型强化学习算法”;复杂 RL 问题中,值函数 \(V(s_t)\) 依赖参数向量 \(w_t\),而 \(w\) 可以是显式的,比如关系强化学习,也可以是隐式的,比如神经网络强化学习。

表格方法是局部更新,函数估计是参数共享更新

这就是它能泛化的原因,也是它可能不稳定的原因。因为一次更新不再只影响当前状态,而会影响整个函数形状。

强化学习中的函数估计需要特殊考虑:学习过程非稳定 non-stationary,数据非独立同分布 non-iid。

为什么非稳定?因为策略在学习过程中不断变化,策略变了,访问到的状态分布也变了,训练数据分布也跟着变。

为什么非 iid?因为强化学习的数据来自连续轨迹,前后样本高度相关。

梯度下降:函数估计的基本优化工具 #

既然我们用一个参数化函数 \(\hat V(s,w)\) 去近似真实值函数 \(V^\pi(s)\),那自然需要定义一个误差,让估计值尽量接近真实值。

\[ J(w)=\mathbb{E}_\pi\left[(V^\pi(s)-\hat V(s,w))^2\right] \]

如果我们暂时假设真实值 \(V^\pi(s)\) 已知,那么这就是一个标准回归问题。梯度下降的更新思想是:沿着误差下降最快的方向调整参数。

\[ -\frac{1}{2}\nabla_w J(w)=\mathbb{E}_\pi[(V^\pi(s)-\hat V(s,w))\nabla_w \hat V(s,w)] \]

采样梯度下降时,用一个样本近似期望:

\[ \Delta w=\alpha(V^\pi(s)-\hat V(s,w))\nabla_w \hat V(s,w) \]

线性值函数估计 #

\[ \hat V(s,w)=x(s)^T w=\sum_{i=1}^{n} w_i x_i(s) \]

这里 x(s) 是状态 s 的特征向量,w 是参数向量。

我们不再直接用原始状态表示价值,而是先提取一组特征,然后对这些特征加权求和。

比如俄罗斯方块里,一个状态可以用这些特征表示:最高墙高度、平均高度、最小高度、洞的数量、相邻列高度差、峡谷宽度和高度等。

\[ x(s)=[x_1(s),x_2(s),x_3(s)] \]\[ w=[w_1,w_2,w_3] \]\[ \hat V(s,w)=w_1x_1(s)+w_2x_2(s)+w_3x_3(s) \]\[ w \leftarrow w+\alpha(V^\pi(s)-\hat V(s,w))x(s) \]

值表其实也是线性函数估计的特殊形式 #

假设状态集合是:

\[ S=\{s_1,s_2,\dots,s_n\} \]

对于某个状态 s,我们构造一个 one-hot 特征:

\[ x^{table}(s)=\begin{bmatrix}\mathbf{1}(s=s_1)\\\vdots\\\mathbf{1}(s=s_n)\end{bmatrix} \]

如果当前状态是 \(s_2\),那么特征就是:

\[ [0,1,0,\dots,0]^T \]

参数向量是:

\[ w=\begin{bmatrix}w_1\\w_2\\\vdots\\w_n\end{bmatrix} \]\[ \hat V(s,w)=x(s)^Tw \]

如果 \(s=s_2\),那么:

\[ \hat V(s_2,w)=w_2 \]

这就和表格中的 \(V(s_2)\) 完全一样。

真正的困难:强化学习中没有真实标签 V^pi(s) #

在强化学习中,仅有奖励信号,因此需要找到目标值替代真实值函数。

MC 方法使用回报 \(G_t\):

\[ \Delta w=\alpha(G_t-\hat V(s_t,w))\nabla_w \hat V(s_t,w) \]

TD(0) 使用一步目标:

\[ \Delta w=\alpha(R_{t+1}+\gamma \hat V(s_{t+1},w)-\hat V(s_t,w))\nabla_w \hat V(s_t,w) \]

TD(\(\lambda\)) 使用 \(\lambda\)-return:

\[ \Delta w=\alpha(G_t^\lambda-\hat V(s_t,w))\nabla_w \hat V(s_t,w) \]

Monte Carlo 值函数估计 #

回报 \(G_t\) 是关于真实值函数的带噪声无偏采样:

\[ \mathbb{E}[G_t|S_t=s]=V^\pi(s) \]

所以 MC 可以把 \(G_t\) 当作监督学习里的目标值。更新公式是:

\[ w\leftarrow w+\alpha(G_t-\hat V(s_t,w))\nabla_w\hat V(s_t,w) \]

蒙特卡罗估计至少能收敛到一个局部最优解;在线性值函数情况下可以收敛到全局最优。

MC 的“无偏”不是说每一次 \(G_t\) 都等于真实值,而是说很多次采样平均后,它的期望等于真实值。比如从同一个状态出发,有时回报高,有时回报低,但平均起来就是 \(V^\pi(s)\)。

MC 的优点是 target 不依赖当前估计,所以目标相对干净;缺点是必须等到 episode 结束才能知道 \(G_t\),而且单次回报波动很大,方差较高。

TD(0) 值函数估计 #

\[ w\leftarrow w+\alpha[R_{t+1}+\gamma \hat V(s_{t+1},w)-\hat V(s_t,w)]\nabla_w\hat V(s_t,w) \]

TD target 是关于真实值函数的“有偏采样”,因为目标里用了当前估计的 \(\hat V(s_{t+1},w)\)。

但它的优点是可以一步更新,不需要等 episode 结束,而且方差通常比 MC 小。

函数估计中的“两个逼近过程” #

第一层,强化学习本身在逼近真实值函数。强化学习不知道真实的 \(V^\pi(s)\),只能通过采样目标逼近它。MC、TD target、\(\lambda\)-return 都是在构造“学习目标”,但这些目标本身可能有采样噪声或 bootstrap 误差。

第二层,函数估计器也在逼近值函数。即使有了学习目标,函数估计器 \(\hat V(s,w)\) 也不一定能完美表示这个目标。它只能在自身可表示的函数集合里找到一个近似,并且一次参数更新会影响许多状态的估计值。

线性值函数估计中的状态表征 #

一种是人工设计特征,比如俄罗斯方块的空洞数、井深度、行转移数。这种特征可解释性强,但依赖专家经验。

一种是粗编码 Coarse Coding。它用很多重叠区域覆盖状态空间。一个状态落在哪些区域里,对应特征就激活。重叠区域越小,泛化越窄;区域越大,泛化越广;如果区域形状不对称,就会产生不对称泛化。它的核心是:

相近状态会激活相似特征,所以更新一个状态时,也会影响附近状态。

image.png

一种是块编码 Tile Coding。它可以理解成多套错位网格。一个连续状态点会同时落入多个网格块,因此有多个 active features。这样做的好处是既能粗略泛化,又能通过多套网格组合出更细的区分能力。

image.png
image.png

一种是傅立叶基 Fourier Basis。它用不同频率、不同相位的正弦/余弦函数来表示状态。低频函数表示平滑的大趋势,高频函数表示细节变化。多个基函数叠加,可以近似复杂的价值函数。

image.png

一种是核函数 Kernel。它不是直接在原空间里线性分,而是把低维状态映射到更高维特征空间,使原来不可分或不好表示的结构变得更容易线性表示。图里的环形数据就是这个意思:在二维平面中蓝点和红点不好用直线分开,但映射到高维后可能就容易区分。

image.png

值函数估计用作控制 #

\[ \hat Q(s,a,w)\approx Q^\pi(s,a) \]

因为有了 Q(s,a),才能在状态 s 下比较不同动作:

\[ a=\arg\max_a Q(s,a) \]

线性状态-动作价值函数写成:

\[ \hat Q(s,a,w)=x(s,a)^\top w \]

这里的特征不是只描述状态,而是描述状态-动作对

\[ x(s,a)=\begin{bmatrix}x_1(s,a)\\x_2(s,a)\\\cdots\\x_k(s,a)\end{bmatrix} \]

意思是:在当前状态 s 下采取动作 a,这个状态-动作对有什么特征。

比如俄罗斯方块里,一个动作是“把当前方块放在某个位置和方向”。那么 x(s,a) 可以表示:

如果我在状态 s 执行动作 a,落子之后棋盘会有多少空洞、多少高度、多少井深、能消几行……

更新公式的核心形式是:

\[ \Delta w=\alpha\bigl(\text{目标值}-\hat Q(s,a,w)\bigr)\nabla_w \hat Q(s,a,w) \]

如果是线性函数:

\[ \Delta w=\alpha\bigl(\text{目标值}-\hat Q(s,a,w)\bigr)x(s,a) \]

如果用后向视角 TD(λ),就写成:

\[ \hat Q(s,a,w)=x(s,a)^\top w \]\[ E_0=0 \]\[ \delta_t=R_{t+1}+\gamma \hat Q(S_{t+1},A_{t+1},w)-\hat Q(S_t,A_t,w) \]\[ E_t=\gamma\lambda E_{t-1}+x(S_t,A_t) \]\[ w\leftarrow w+\alpha\delta_tE_t \]

注意前面的写法是状态资格迹,这里用的是参数资格迹

如果写的更一般一点不限定线性函数:

\[ E_t=\gamma\lambda E_{t-1}+\nabla_w \hat Q(S_t,A_t,w) \]

04 策略梯度 #

值函数方法有几个明显限制:

第一个限制是连续动作空间。如果动作是离散的,比如“上、下、左、右”,那 \(\max_a Q(s,a)\) 还可以枚举。但如果动作是连续的,比如机械臂每个关节的力矩、自动驾驶的方向盘角度和油门刹车,那动作空间是无限多个。此时要精确求 \(\max_a Q(s,a)\) 就非常困难。离散化会导致精度降低和维度灾难,而 max 操作会带来高计算量。

第二个限制是随机策略问题。有些任务本身就需要随机性。比如剪刀石头布,如果你的策略是确定性的,对手很容易利用你;又比如部分可观测环境中,同一个观测可能对应不同真实状态,确定性动作反而不好。

第三个限制是状态混叠问题,例如 Aliased Gridworld,也就是“重名的格子世界”,有两个灰色状态,它们在观测特征上无法区分,但是一个灰格子应该向左走,另一个灰格子应该向右走,才能更快拿到中间的钻石。如果使用基于值函数的方法,由于两个灰色状态看起来一样,学到的确定性策略可能会在这两个状态都选择同一个动作,比如都向左。这样就会导致其中一个状态永远找不到钻石。

所以策略梯度的出发点是:

值函数方法通常导向确定性贪心动作,而策略梯度方法可以直接优化随机策略,适合连续动作、随机策略和部分可观测问题。

策略梯度的核心思想:直接参数化策略 #

策略梯度方法的基本原理:核心思想是直接参数化并优化随机策略,而不是间接求解价值函数。也就是说,我们直接定义:

\[ \pi_\theta(a|s) \]

它表示在状态 s 下选择动作 a 的概率。参数 \(\theta\) 可以是线性模型参数,也可以是神经网络参数。然后我们的目标是找到一组最优参数:

\[ \theta^* \]

使得策略带来的期望回报最大。

这个过程可以分成两步。

第一步叫 Policy Parameterization,也就是策略参数化。我们不再用 Q(s,a) 间接决定动作,而是直接让策略输出动作概率分布。例如离散动作可以用 softmax:

\[ \pi_\theta(a|s)=\frac{\exp(f_\theta(s,a))}{\sum_{a'}\exp(f_\theta(s,a'))} \]

如果是连续动作,可以让策略输出高斯分布的均值和方差:

\[ a\sim \mathcal N(\mu_\theta(s),\sigma_\theta^2(s)) \]

第二步叫 Policy Optimization,也就是策略优化。我们定义一个目标函数 \(J(\theta)\),表示策略 \(\pi_\theta\) 的好坏,然后计算它关于 \(\theta\) 的梯度:

\[ \nabla_\theta J(\theta) \]

再沿着梯度上升方向更新:

\[ \theta\leftarrow \theta+\alpha\nabla_\theta J(\theta) \]

这里是梯度上升,不是下降,因为我们要最大化回报。

策略梯度的目标函数 J(theta) #

第一种是 episodic 环境中,从初始状态出发的期望回报:

\[ J_1(\theta)=V^{\pi_\theta}(s_1)=\mathbb E_{\pi_\theta}[V_1] \]

这适合有明确 episode 开始和结束的任务,比如一局游戏、一回合控制任务。我们关心从初始状态开始,整条轨迹能拿多少总回报。

第二种是在没有明确初始状态时,对状态分布加权的平均价值:

\[ J_{\text{avgV}}(\theta)=\sum_s d^{\pi_\theta}(s)V^{\pi_\theta}(s) \]

这里 \(d^{\pi_\theta}(s)\) 是在策略 \(\pi_\theta\) 下状态 s 被访问的长期概率。它适合持续任务,比如机器人持续运行、推荐系统持续交互。

image.png

第三种是每个时间步的平均奖励:

\[ J_{\text{avgR}}(\theta)=\sum_s d^{\pi_\theta}(s)\sum_a \pi_\theta(a|s)R_s^a \]

也可以理解成长期平均每一步能获得多少奖励。还可以写成极限平均形式:

\[ \lim_{n\to\infty}\frac{1}{n}\mathbb E[r_1+r_2+\cdots+r_n] \]

这个目标特别适合 continuing task,也就是没有终止的任务。比如一个机器人一直巡逻,一个推荐系统一直服务用户,一个库存系统一直运行。我们不关心“一局结束总共拿多少奖励”,而关心“长期平均每一步表现怎么样”。

为什么不能直接用普通求导? #

现在我们有目标:

\[ J(\theta)=\mathbb E_{\tau\sim\pi_\theta}[R(\tau)] \]

这里 \(\tau\) 是一条轨迹:

\[ \tau=(s_0,a_0,r_1,s_1,a_1,r_2,\dots) \]

\(R(\tau)\) 是整条轨迹的回报。

如果这是普通监督学习,我们的 loss 通常是模型输出的显式函数,可以直接反向传播。但强化学习里,θ 影响的是动作概率,动作又影响后续状态分布,后续状态再影响奖励。也就是说,θ 不只是影响某一步输出,而是影响整条轨迹的分布。这就是策略梯度推导的难点。

有一种有限差分法:如果不知道怎么解析求导,可以对参数某一维加一个很小扰动 ϵ,观察目标函数变化:

\[ \frac{\partial J(\theta)}{\partial \theta_k}\approx\frac{J(\theta+\epsilon u_k)-J(\theta)}{\epsilon} \]

这种方法直觉简单,但维度高时代价非常大。参数有多少维,就要扰动多少次,而且每次还要采样评估策略,方差很高。

还可以用解析法计算策略梯度。这里最关键的技巧是:

\[ \nabla_\theta \pi_\theta(s,a)=\pi_\theta(s,a)\frac{\nabla_\theta \pi_\theta(s,a)}{\pi_\theta(s,a)}=\pi_\theta(s,a)\nabla_\theta\log\pi_\theta(s,a) \]

更常见的写法是:

\[ \nabla_\theta \pi_\theta(a|s)=\pi_\theta(a|s)\nabla_\theta\log\pi_\theta(a|s) \]

这一步叫 log-derivative trick,也叫 score function trick。这是一种“对数梯度技巧”,它可以把乘积转成加法,避免直接计算 \(\pi_\theta\) 的乘积,简化梯度计算,提高稳定性。

轨迹概率通常是很多动作概率的乘积:

\[ P_\theta(\tau)=\pi_\theta(a_1|s_1)\pi_\theta(a_2|s_2)\cdots\pi_\theta(a_T|s_T) \]

如果直接对这个乘积求导,会很麻烦,也容易数值下溢。取 log 之后:

\[ \log P_\theta(\tau)=\sum_{t=1}^{T}\log\pi_\theta(a_t|s_t) \]

乘积变成求和,求导就简单了:

\[ \nabla_\theta\log P_\theta(\tau)=\sum_{t=1}^{T}\nabla_\theta\log\pi_\theta(a_t|s_t) \]

这就是为什么几乎所有策略梯度公式里都会出现:

\[ \nabla_\theta\log\pi_\theta(a_t|s_t) \]

这个量可以理解成:当前选择动作 \(a_t\) 的概率,对参数 \(\theta\) 有多敏感。

image.png

对数梯度技巧的优点可以总结为三点:

第一,轨迹概率原本是很多小数连乘,容易数值下溢;取 log 后变成加法,更稳定。

第二,乘积求导很复杂;取 log 后变成求和,梯度计算更简单。

第三,log 把概率空间从 (0,1) 拉到 (−∞,0),并且梯度变成相对变化率:

\[ \frac{\nabla_\theta \pi_\theta(a|s)}{\pi_\theta(a|s)} \]

让小概率事件的学习信号更明显。

策略梯度定理:最核心公式 #

\[ \nabla_\theta J(\theta)=\mathbb E_{\pi_\theta}\left[\nabla_\theta\log\pi_\theta(a|s)Q^{\pi_\theta}(s,a)\right] \]

如果某个状态动作对 \((s,a)\) 的长期价值 \(Q^\pi(s,a)\) 高,那么我们就应该提高策略在状态 s 下选择动作 a 的概率;如果它的价值低,就降低它的概率。

\[ \nabla_\theta\log\pi_\theta(a|s) \]

决定“参数应该往哪个方向改,才能提高这个动作的概率”。

\[ Q^{\pi_\theta}(s,a) \]

决定“这个动作到底值不值得提高概率”。

推导如下:

\[ J(\theta)=\mathbb E_{\tau\sim \pi_\theta}[R(\tau)]=\sum_\tau P_\theta(\tau)R(\tau) \]\[ \nabla_\theta J(\theta)=\sum_\tau \nabla_\theta P_\theta(\tau)R(\tau) \]\[ \nabla_\theta \log P_\theta(\tau)=\frac{1}{P_\theta(\tau)}\nabla_\theta P_\theta(\tau) \]\[ \nabla_\theta P_\theta(\tau)=P_\theta(\tau)\nabla_\theta \log P_\theta(\tau) \]\[ \nabla_\theta J(\theta)=\sum_\tau P_\theta(\tau)\nabla_\theta \log P_\theta(\tau)R(\tau) \]

写成期望形式就是:

\[ \nabla_\theta J(\theta)=\mathbb E_{\tau\sim\pi_\theta}[\nabla_\theta \log P_\theta(\tau)R(\tau)] \]

REINFORCE:最基础的策略梯度算法 #

REINFORCE 的做法非常直接:用实际采样到的回报 \(G_t\) 来替代 \(Q^\pi(s_t,a_t)\)

因为在策略 \(\pi\) 下,从 \(s_t,a_t\) 开始的实际回报 \(G_t\) 是 \(Q^\pi(s_t,a_t)\) 的一个采样估计:

\[ \mathbb E[G_t|s_t,a_t]=Q^\pi(s_t,a_t) \]

于是得到 REINFORCE 更新:

\[ \theta\leftarrow \theta+\alpha G_t\nabla_\theta\log\pi_\theta(a_t|s_t) \]

如果对一整条轨迹更新,就是:

\[ \theta\leftarrow\theta+\alpha\sum_{t=0}^{T}G_t\nabla_\theta\log\pi_\theta(a_t|s_t) \]

这就是最基本的蒙特卡罗策略梯度算法。

REINFORCE 的优点是简单、无偏,因为它用完整回报 \(G_t\)。但缺点也明显:方差很大。

为什么需要 baseline? #

REINFORCE 用的是:

\[ G_t\nabla_\theta\log\pi_\theta(a_t|s_t) \]

如果 \(G_t\) 很大,就增强动作概率。但问题是,“大”是相对什么而言的?

假设某个游戏所有策略平均都能拿 100 分,一个动作之后拿了 105 分,其实只是略好;另一个状态下平均只能拿 0 分,一个动作之后拿了 20 分,其实非常好。如果只看绝对回报,就无法区分动作相对于当前状态的真实好坏。

所以我们引入 baseline \(b(s_t)\),用:

\[ G_t-b(s_t) \]

替代 \(G_t\)。更新变成:

\[ \theta\leftarrow\theta+\alpha(G_t-b(s_t))\nabla_\theta\log\pi_\theta(a_t|s_t) \]

最常用的 baseline 是状态价值函数:

\[ b(s_t)=V^\pi(s_t) \]

于是:

\[ G_t-V^\pi(s_t) \]

表示“这次实际回报比这个状态的平均水平高多少”。如果高于平均,就增加动作概率;如果低于平均,就降低动作概率。

这就引出了 advantage:

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

它表示动作 a 相比在状态 s 下的平均动作水平,好了多少。策略梯度可以写成:

\[ \nabla_\theta J(\theta)=\mathbb E[\nabla_\theta\log\pi_\theta(a|s)A^\pi(s,a)] \]

这比直接用 Q 更稳定,因为它不再看绝对回报,而是看相对优势。

所以baseline的作用是:它不改变策略梯度期望,但是可以降低方差,使训练更稳定

\[ \mathbb E_{a\sim\pi_\theta}[\nabla_\theta \log \pi_\theta(a|s)b(s)]=b(s)\mathbb E_{a\sim\pi_\theta}[\nabla_\theta \log \pi_\theta(a|s)] \]\[ \mathbb E_{a\sim\pi_\theta}[\nabla_\theta \log \pi_\theta(a|s)b(s)]=b(s)\sum_a\pi_\theta(a|s)\nabla_\theta \log \pi_\theta(a|s) \]\[ \pi_\theta(a|s)\nabla_\theta \log \pi_\theta(a|s)=\pi_\theta(a|s)\frac{\nabla_\theta \pi_\theta(a|s)}{\pi_\theta(a|s)}=\nabla_\theta \pi_\theta(a|s) \]

然后因为求和和求梯度可以交换:

\[ \sum_a\nabla_\theta \pi_\theta(a|s)=\nabla_\theta\sum_a\pi_\theta(a|s) \]

对于任意状态 s,策略对所有动作的概率和一定等于 1:

\[ b(s)\nabla_\theta 1=0 \]\[ \mathbb E_{a\sim\pi_\theta}[\nabla_\theta \log \pi_\theta(a|s)b(s)]=0 \]

证明了 baseline 项在期望意义下不会影响策略梯度。

Actor-Critic:策略梯度和价值函数的结合 #

REINFORCE 使用完整回报 \(G_t\),所以是蒙特卡罗式方法:无偏但方差大,而且必须等 episode 结束。Actor-Critic 的思想是:能不能像 TD 一样,用一个价值函数来估计未来,从而减少方差、实现在线更新?

Actor-Critic 里有两个角色:

Actor 是策略网络,负责选择动作:

\[ \pi_\theta(a|s) \]

Critic 是价值网络,负责评价当前动作或状态:

\[ V_w(s)\quad \text{或} \quad Q_w(s,a) \]

Actor 根据 Critic 给出的评价来更新策略;Critic 根据 TD 误差来更新价值函数。

最常见的一步 Actor-Critic 使用 TD error:

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

这个 \(\delta_t\) 可以看作 advantage 的近似。于是 Actor 的更新可以写成:

\[ \theta\leftarrow\theta+\alpha_\theta\delta_t\nabla_\theta\log\pi_\theta(a_t|s_t) \]

Critic 的更新则是让 \(V_w(s_t)\) 接近 TD target:

\[ w\leftarrow w+\alpha_w\delta_t\nabla_w V_w(s_t) \]
image.png

策略梯度的缺点:为什么它也不好训练? #

第一,方差大。因为策略梯度通常依赖采样轨迹,而轨迹回报随机性很强。REINFORCE 尤其明显,因为它用完整回报 \(G_t\),单条轨迹可能受到很多偶然因素影响。

第二,样本效率低。值函数方法可以反复利用经验估计 Q,而最基础的 on-policy 策略梯度通常要求数据来自当前策略。策略更新后,旧数据分布就不完全匹配新策略了,所以很多样本不能随便重复用。

第三,容易更新过大导致性能崩掉。策略梯度是直接改策略,如果一步更新太大,策略分布可能突然改变,原来能拿高回报的行为被破坏。这就是后面 TRPO、PPO 要解决的问题。

第四,局部最优问题。策略梯度沿着当前梯度上升,但目标函数通常非凸,可能收敛到局部最优或鞍点。

前沿算法:TRPO 和 PPO 在解决什么? #

TRPO 和 PPO 都是在解决同一个关键问题:策略更新不能太激进。

普通策略梯度更新是:

\[ \theta_{\text{new}}=\theta_{\text{old}}+\alpha\nabla_\theta J(\theta) \]

如果学习率 \(\alpha\) 太小,学得慢;如果太大,策略可能突然变差。TRPO 的思想是限制新旧策略之间的 KL 距离:

\[ D_{KL}(\pi_{\theta_{\text{old}}}\|\pi_\theta)\leq \delta \]

也就是说,每次更新策略时,要保证新策略不要离旧策略太远。这样可以获得更稳定的性能提升。

PPO 则把这个思想做得更简单。它用重要性采样比率:

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

表示新策略和旧策略对同一个动作的概率比。如果 \(r_t(\theta)\gt 1\),说明新策略比旧策略更倾向于选这个动作;如果小于 1,说明新策略降低了这个动作概率。

PPO 的 clipped objective 是:

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

05 深度强化学习 #

第三讲主要讲线性函数估计,比如:

\[ \hat V(s,w)=x(s)^Tw \]

第五讲的深度强化学习,就是把这个函数估计器从线性函数换成深度神经网络。于是状态价值、动作价值、策略函数都可以写成神经网络形式:

\[ \hat Q(s,a;w) \]\[ V(s;w) \]\[ \pi_\theta(a|s) \]

这里的 w 或 \(\theta\) 不再是简单的几个线性权重,而是深度网络中成千上万甚至上亿个参数。

深度强化学习的核心:用深度神经网络自动学习状态表示,并近似价值函数或策略函数,从而实现端到端决策。

但是也存在问题:参数空间高维,难以稳定训练,容易过拟合,需要大量数据和高性能计算。

\[ J(w)=\mathbb E\left[\left(r+\gamma\max_{a'}\hat Q(s',a';w)-\hat Q(s,a;w)\right)^2\right] \]

目标项和预测项都含有同一个参数 w,导致追逐移动目标的问题,训练不稳定,前期训练收敛性差

DQN:把 Q-learning 深度化 #

Q-learning 更新是:

\[ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha\left[r_{t+1}+\gamma\max_a Q(s_{t+1},a)-Q(s_t,a_t)\right] \]

如果状态和动作规模不大,我们可以用表格存 Q(s,a)。但在 Atari 游戏里,状态是高维像素图像,无法查表,所以 DQN 用神经网络近似:

\[ \hat Q(s,a;w) \]

输入是状态图像,输出是每个离散动作的 Q 值。比如 Atari 里动作可能是上、下、左、右、开火等,网络一次前向传播输出所有动作对应的 Q 值,然后选择:

\[ a=\arg\max_a \hat Q(s,a;w) \]

DQN 的 TD target 是:

\[ y_t=r_{t+1}+\gamma\max_{a'}\hat Q(s_{t+1},a';w) \]

损失函数是:

\[ L(w)=\left(y_t-\hat Q(s_t,a_t;w)\right)^2 \]

更新方向是:

\[ \Delta w=\alpha\left[r_{t+1}+\gamma\max_{a'}\hat Q(s_{t+1},a';w)-\hat Q(s_t,a_t;w)\right]\nabla_w \hat Q(s_t,a_t;w) \]

但是在更新过程中存在过高估计的问题:

\[ \max_a \hat Q(s',a;w) \]

max 运算会引入高方差,Q 值通常会被高估。深度神经网络在训练初期对每个动作的 Q 值预测都有噪声,算法选择的不是“真实最优动作”,而是“估计值最高的动作”。

据此DQN做出了一些创新:

  1. 目标网络:

    在线网络:

\[ \hat Q(s,a;w) \]
目标网络:
\[ \hat Q(s,a;w_T) \]
在线网络负责当前预测并被频繁更新;目标网络负责计算 TD target,并且不是每一步都更新,而是隔一段时间从在线网络复制参数。于是 target 变成:
\[ y_t=r_{t+1}+\gamma\max_{a'}\hat Q(s_{t+1},a';w_T) \]
损失变成:
\[ L(w)=\left(r_{t+1}+\gamma\max_{a'}\hat Q(s_{t+1},a';w_T)-\hat Q(s_t,a_t;w)\right)^2 \]
target 用的是 \(w_T\),预测用的是 w。由于 \(w_T\) 暂时固定,所以目标不会每一步都剧烈变化。

目标网络可以避免追逐移动的高误差目标,降低高方差影响。
  1. 经验回放 experience replay:

    智能体和环境交互时,会不断产生样本:

\[ (s_t,a_t,r_{t+1},s_{t+1}) \]
DQN 不会马上只用这一个最新样本更新网络,而是先把它存入经验池 replay buffer:
\[ D=\{(s,a,r,s')\} \]
训练时,从经验池中随机抽取一个 mini-batch 来更新网络。

经验回放可以降低样本次序关联性,稳定收敛,同时减少计算量、加快训练。

随机经验回放相当于打乱样本,让训练更接近监督学习中的 iid mini-batch。它还有一个好处:样本可以重复使用,提高样本效率。你采样一次得到的经验,不是只更新一次就扔掉,而是可以在后续训练中多次被抽到。

如果没有经验回放,DQN 会更容易受到连续样本相关性的影响,训练不稳定,样本利用率低。

整个DQN的算法流程如下:

环境给当前状态 s,在线网络根据 s 输出每个动作的 Q 值,用 \(\epsilon\)-greedy 选择动作 a,环境返回奖励 r 和下一状态 s’。这个四元组 \((s,a,r,s')\) 被存入经验池。训练时从经验池随机采样一批样本,用目标网络计算 target:

\[ y=r+\gamma\max_{a'}Q_{\text{target}}(s',a') \]

用在线网络计算当前估计:

\[ Q_{\text{online}}(s,a) \]

然后最小化:

\[ (y-Q_{\text{online}}(s,a))^2 \]

每隔固定步数,把在线网络参数复制给目标网络:

\[ w_T \leftarrow w \]

注意经验池要先攒一点数据再开始训练

提示

DQN 为什么需要目标网络和经验回放?

目标网络解决 TD target 随在线网络快速变化导致的不稳定,经验回放解决连续轨迹样本强相关和样本利用率低的问题;二者一起让深度 Q-learning 更接近稳定的监督学习训练。

image.png

PPO:从策略梯度到稳定可复用数据 #

\[ \nabla J(\theta)\approx\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_n}(G_t^n-b)\nabla \log \pi_\theta(a_t^n|s_t^n) \]

普通策略梯度通常是 on-policy,也就是说,用当前策略 \(\pi_\theta\) 收集数据,然后用这些数据更新 \(\theta\)。问题是,一旦 \(\theta\) 更新了,数据就变成旧策略采样的数据,理论上不能随便重复用。

on-policy 的行为策略和目标策略一致;如果使用 \(\pi_\theta\) 收集数据,当 \(\theta\) 更新时,就需要再次采样训练数据。

这会造成样本效率低。PPO 的目标就是:能不能用旧策略 \(\pi_{\theta'}\) 采样到的数据,去训练新策略 \(\pi_\theta\),并且不要训练崩?

那么需要用重要性采样策略更新约束

  1. 重要性采样:

    如果我们想计算:

\[ \mathbb E_{x\sim p}[f(x)] \]
但只能从另一个分布 \(q(x)\) 采样,那么可以写成:
\[ \mathbb E_{x\sim p}[f(x)]=\mathbb E_{x\sim q}\left[f(x)\frac{p(x)}{q(x)}\right] \]
这个 \(\frac{p(x)}{q(x)}\) 就是重要性权重。目标是使用从固定旧策略 \(\pi_{\theta'}\) 得到的采样数据去训练新参数 \(\theta\),这样可以重复使用样本。

在 PPO 里,重要性权重变成策略概率比:
\[ r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_k}(a_t|s_t)} \]
这里 \(\theta_k\) 是采样数据时的旧策略参数,\(\theta\) 是正在优化的新策略参数。

于是 PPO 的基本 surrogate objective 可以写成:
\[ J_{\theta_k}(\theta)=\mathbb E\left[r_t(\theta)A_t\right] \]
其中 \(A_t\) 是 advantage,表示动作 \(a_t\) 比当前状态平均动作好多少。

直觉上,如果 \(A_t\gt 0\),说明这个动作比平均好,那么我们希望新策略提高它的概率,也就是让 \(r_t(\theta)\gt 1\)。如果 \(A_t\lt 0\),说明这个动作不好,就希望降低它的概率,即 \(r_t(\theta)\lt 1\)。

但如果新旧分布差异太大,重要性权重会非常大,导致梯度方差爆炸。

所以 PPO 的核心思想不是“完全 off-policy”,而是:**在有限范围内复用旧策略采样的数据,但要限制新旧策略差距。**
  1. 策略更新约束:

    PPO 的第一种约束方式:KL 惩罚。目标函数写成:

\[ J_{\text{PPO}}^{\theta'}(\theta)=J_{\theta'}(\theta)-\beta KL(\theta,\theta') \]\[ J_{\theta'}(\theta)=\mathbb E\left[\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta'}(a_t|s_t)}A_{\theta'}(s_t,a_t)\right] \]
KL 项衡量新旧策略分布差距。惩罚项的含义是:如果新策略离旧策略太远,就扣分;如果新旧策略接近,就主要优化 advantage。

还有自适应 KL 惩罚:如果 KL 太大,就增大 \(\beta\),更强地惩罚策略变化;如果 KL 太小,就减小 \(\beta\),允许策略多动一点。

**TRPO的约束是:**
\[ D_{KL}(\pi_{\theta_{\text{old}}}\|\pi_\theta)\leq \delta \]
**PPO2**,也就是更常用的 clipped PPO objective。它不用显式 KL 惩罚,而是直接把概率比裁剪到一个范围内:
\[ r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_k}(a_t|s_t)} \]\[ L^{CLIP}(\theta)=\mathbb E\left[\min\left(r_t(\theta)A_t,\text{clip}(r_t(\theta),1-\epsilon,1+\epsilon)A_t\right)\right] \]
这个公式看起来复杂,但直觉很简单:**不允许新策略相对旧策略把某个动作概率改得太夸张。**

相较 KL 惩罚,Clip 机制更简单、工程上更稳定,不需要显式计算复杂 KL,也少一个难调的惩罚系数 \(\beta\)。

PPO 标志着深度强化学习从“实验室的艺术”走向“工业级的工具”。

它通过重要性采样提高样本复用能力,通过 KL 惩罚或概率比裁剪限制新旧策略差距,从而在稳定性和实现复杂度之间取得平衡。

在 PPO 之前,很多策略梯度算法要么不稳定,要么调参困难,要么实现复杂。TRPO 理论漂亮,但计算复杂,需要二阶近似和约束优化。PPO 用一个简单的 clip objective 就实现了类似“不要更新太大”的效果,训练稳定、实现简单、适用范围广。

A3C:异步优势 Actor-Critic #

\[ \text{Asynchronous Advantage Actor-Critic} \]

可以拆成三部分:

Actor-Critic:有 Actor 学策略,有 Critic 学价值函数。

Advantage:策略更新使用优势函数 A(s,a),而不是直接用 Q(s,a)。

Asynchronous:多个 worker 异步并行采样和更新全局网络。

image.png

多个 worker 并行采样有几个好处。

第一,它提高采样效率。多个环境同时跑,比单个 agent 慢慢采样更快。

第二,它降低样本相关性。DQN 用经验回放来打破样本相关性;A3C 则通过多个 worker 在不同环境副本中并行采样,使数据天然更加多样。

第三,它可以不用 GPU 也训练得比较好。 A3C 使用 16 个 CPU cores,可以在 Atari 上取得了较强表现。

但异步也有问题:worker 计算梯度时使用的是它本地复制的旧参数。当它把梯度传回 global network 时,全局参数可能已经被别的 worker 更新过了。因此梯度可能是 stale gradient,也就是滞后的梯度。这会引入噪声。

所以 A3C 的权衡是:异步并行提高采样效率、增强探索、降低样本相关性,但会引入梯度噪声和参数滞后。实践中这种噪声有时反而像一种正则化,能帮助探索和避免过早收敛。

带熵奖励的 A3C。总损失函数包含三部分:

\[ L=L_{\text{policy}}(\theta)+\lambda L_V(\theta_v)-\beta H(\pi) \]

其中:

\[ L_{\text{policy}}=-\log\pi_\theta(a_t|s_t)A(s_t,a_t) \]

这是策略损失。

\[ L_V \]

是值函数损失。

\[ H(\pi) \]

是策略熵,目的是鼓励 worker 探索,防止策略过早收敛到次优解。

熵可以理解为策略的不确定性。如果策略在某个状态下几乎总选同一个动作,那么熵低;如果多个动作概率比较平均,熵高。加上熵奖励,就是鼓励策略不要太早变得过于确定。

为什么这有用?因为强化学习早期,价值估计和策略估计都不准。如果策略太早确定下来,可能会陷入局部最优。熵奖励可以让策略保持探索,尤其是在多个 worker 并行采样时,有助于收集更多样化的经验。

06 基于模型的强化学习 #

从真实环境中学习一个近似模型,再利用这个模型进行规划或生成模拟数据,从而更高效地优化价值函数或策略。

从 model-free 到 model-based:核心差别是什么? #

所谓 model-free,就是智能体不显式学习环境的转移规律,只关心如何从经验中直接更新值函数或策略。比如 DQN 看到一条经验:

\[ (s_t,a_t,r_{t+1},s_{t+1}) \]

就用:

\[ r_{t+1}+\gamma\max_{a'}Q(s_{t+1},a') \]

去更新 \(Q(s_t,a_t)\)。它并不会显式问:“为什么从 \(s_t\) 执行 \(a_t\) 会到 \(s_{t+1}\)?环境的状态转移函数是什么?”

基于模型的强化学习则不同。它会显式学习环境模型。一个 MDP 本来包含两类核心规律:

\(P(s'|s,a)\) 和 \(R(s,a)\)

前者表示状态如何转移,后者表示动作会带来什么奖励。Model-based RL 的目标就是从经验中学出一个近似模型:

\[ \hat P_\eta(s'|s,a),\quad \hat R_\eta(s,a) \]

这里 \(\eta\) 是模型参数。学到模型以后,智能体就不只能在真实环境里试错,还可以在“虚拟环境”里模拟未来轨迹,然后用模拟经验来更新价值函数或策略。

无模型强化学习从经验中学习值函数或策略函数;基于模型强化学习则从经验中学习一个模型,再从模型中规划一个值函数或策略函数。

为什么要学模型?样本效率是关键 #

Model-based RL 最大的动机是样本效率。现实世界中,真实交互往往很贵、很慢、甚至有危险。比如自动驾驶中,不能让车在真实道路上无限试错;机器人控制中,每次真实操作都可能磨损硬件;医疗决策中,更不可能随便试错。

如果有了模型,智能体就可以在模型里“脑内模拟”。比如自动驾驶车辆可以预测:如果我现在向左变道,未来 1 秒、2 秒、3 秒周围车辆会怎样变化;机器人可以预测:如果我施加这个力矩,机械臂下一步会到哪里。

所以 model-based RL 的直觉是:用模型预测未来,用规划减少真实试错。

但它也有代价。模型如果学错了,规划就会在错误模型上做出错误决策。所以 model-based RL 的核心矛盾是:

\[ \text{样本效率更高}\quad \text{vs.} \quad\text{模型误差可能导致策略错误} \]

模型到底学什么? #

通常模型包含两个部分:

\[ \hat P_\eta(s'|s,a) \]\[ \hat R_\eta(s,a) \]

也就是状态转移模型和奖励模型。给定当前状态 s 和动作 a,模型要预测下一状态 s’ 以及奖励 r。

从监督学习角度看,模型学习非常自然。真实环境交互产生的数据是:

\[ (s_t,a_t,r_{t+1},s_{t+1}) \]

那么学习奖励模型:

\[ \hat R_\eta(s_t,a_t)\approx r_{t+1} \]

就是一个回归问题。学习状态转移模型:

\[ \hat P_\eta(s_{t+1}|s_t,a_t) \]

则可以是回归问题,也可以是概率密度估计问题。如果状态是连续向量,可以预测下一状态均值;如果环境随机性很强,就需要预测一个分布。

如果状态和动作空间很小,可以用查找表模型。比如对每个 (s,a) 统计它转移到各个 s’ 的频率:

\[ \hat P(s'|s,a)=\frac{N(s,a,s')}{N(s,a)} \]

奖励也可以用经验平均:

\[ \hat R(s,a)=\frac{1}{N(s,a)}\sum_{i:(s_i,a_i)=(s,a)}r_i \]

这就是 tabular model。

从真实环境到虚拟环境:模型如何用于规划? #

第一种是基于模型生成模拟经验。也就是说,我们把模型当作一个虚拟环境,从中采样:

\[ (s,a,\hat r,\hat s') \]

然后把这些模拟样本交给前面学过的 model-free 算法,比如 MC、SARSA、Q-learning、DQN。

第二种是直接在模型中做规划或轨迹优化。比如给定当前状态和模型,向未来滚动预测很多步,寻找一串动作:

\[ a_t,a_{t+1},\dots,a_{t+H-1} \]

使得预测回报最大。这种方式更像控制理论里的最优控制。

基于模型的值函数优化:用模型辅助 Q-learning #

前面 Q-learning 只有一种经验来源:

\[ \text{真实环境采样得到 }(s,a,r,s') \]

现在 model-based 方法多了一种经验来源:

\[ \text{模型模拟得到 }(s,a,\hat r,\hat s') \]

然后这两种经验都可以用于 TD 更新:

\[ Q(s,a)\leftarrow Q(s,a)+\alpha\left[r+\gamma\max_{a'}Q(s',a')-Q(s,a)\right] \]

只不过真实经验里的 \(r,s'\) 来自真实环境,模拟经验里的 \(\hat r,\hat s'\) 来自模型。

这就是 Dyna 框架的核心。

Dyna:把直接学习、模型学习和规划结合起来 #

每一次真实交互后,Dyna-Q 会做三件事。

第一,直接 RL。智能体在真实环境中执行动作 a,观察到奖励 r 和下一状态 s’,然后立刻用这条真实经验更新 Q 值:

\[ Q(s,a)\leftarrow Q(s,a)+\alpha[r+\gamma\max_{a'}Q(s',a')-Q(s,a)] \]

第二,模型学习。把这条真实经验存进模型中:

\[ \text{Model}(s,a)\leftarrow (r,s') \]

如果是随机环境,就更新转移概率和奖励均值;如果是确定环境,可以直接记住这个 (s,a) 会到哪里、奖励是多少。

第三,规划。重复 N 次:从过去见过的状态动作对中随机选一个 \((\tilde s,\tilde a)\),用模型生成模拟结果:

\[ (\tilde r,\tilde s')=\text{Model}(\tilde s,\tilde a) \]

然后用这条模拟经验再做 Q-learning 更新。

所以 Dyna-Q 的一次循环可以写成:

\[ \text{真实交互一次}+\text{真实经验更新一次}+\text{模型更新一次}+\text{模拟规划 }N\text{ 次} \]

这里 N 是 planning steps。N=0 时,它退化为普通 Q-learning;N 越大,说明每获得一条真实经验后,用模型“脑补”的更新次数越多。

Dyna 的优势就是:一次真实交互可以被模型反复利用,从而显著提高样本效率。

image.png
image.png

需要注意真实经验和模拟经验的区别:

真实经验是可靠的,但代价高。比如机器人真实执行一次动作,需要时间、电量,还可能损坏设备。

模拟经验代价低,可以大量生成,但它依赖模型是否准确。如果模型学得好,模拟经验很有用;如果模型学得差,模拟经验可能误导策略。这叫 model biasmodel error

Model-free RL 虽然样本效率低,但它更新依据是真实环境经验;Model-based RL 虽然能模拟很多经验,但这些经验可能来自错误模型。如果模型把某个危险动作预测成安全,规划器就会偏向这个动作;如果模型低估某个好动作的长期收益,策略也可能错过它。

更严重的是,模型误差会随时间累积。假设一步预测误差很小,但每一步的小误差都会影响下一步输入,误差可能越滚越大。最后预测轨迹和真实轨迹完全偏离。

所以基于模型方法常见的解决思路包括:模型不准时少用模型,多依赖真实经验;量化模型不确定性;使用概率模型,比如贝叶斯模型、高斯过程;限制模型 rollout 的长度;不断用新真实数据修正模型。

基于模型的策略优化:不只学值函数,也可以直接优化策略 #

控制理论通常有系统动力学方程:

\[ s_{t+1}=f(s_t,a_t) \]

然后求一串控制动作,使总代价最小:

\[ \min_{a_0,\dots,a_{T-1}}\sum_{t=0}^{T-1}c(s_t,a_t) \]

满足:

\[ s_{t+1}=f(s_t,a_t) \]

基于模型的策略优化类似最优控制问题,状态转移方程作为优化问题的条件来使用。

所谓轨迹优化,就是给定当前状态 \(s_t\) 和模型:

\[ \hat f_\eta(s,a) \]

寻找未来一段时间内的动作序列:

\[ a_t,a_{t+1},\dots,a_{t+H-1} \]

使预测累计奖励最大:

\[ \max_{a_t,\dots,a_{t+H-1}}\sum_{k=0}^{H-1}\gamma^k\hat r(s_{t+k},a_{t+k}) \]

并且:

\[ s_{t+k+1}=\hat f_\eta(s_{t+k},a_{t+k}) \]

如果模型是可微的,甚至可以通过梯度反向传播优化动作序列。如果模型不可微,也可以用采样优化、随机搜索、CEM 等方法。

算法 1:先收集数据,学模型,再规划

最简单的 model-based policy optimization 是三步:

先运行一个基础策略,比如随机策略,收集数据:

\[ D=\{(s_t,a_t,s_{t+1})\} \]

然后学习动力学模型:

\[ \hat f_\eta(s_t,a_t)\approx s_{t+1} \]

最后利用模型和代价函数,通过规划计算最优动作或最优轨迹。

即运行随机策略收集数据,学习动力学模型以最小化采样数据上的最小二乘误差,再通过模型进行规划优化行动选择。

这个方法的优点是简单;缺点是非常容易受到模型误差影响。因为模型只在初始随机策略采到的数据分布上训练,如果规划出的动作把系统带到数据没覆盖过的区域,模型预测可能很差。

这就是所谓的 distribution shift:模型训练时见过的状态动作分布,和规划时会访问的状态动作分布不一致。

算法 2:迭代收集数据,不断修正模型

先运行基础策略收集数据,得到数据集 D。然后循环:

学习动力学模型:

\[ \hat f_\eta \]

用模型规划动作;把规划得到的动作放到真实环境中执行;把新得到的数据加入 D;重新训练模型。

也就是说:

\[ \text{收集数据}\rightarrow\text{学模型}\rightarrow\text{规划}\rightarrow\text{真实执行}\rightarrow\text{扩充数据}\rightarrow\text{再学模型} \]

这个方法比算法 1 好,因为模型会不断接触策略实际访问到的状态分布。但它仍然有一个问题:如果一次规划出整条长动作序列并全部执行,后面的动作可能已经建立在错误预测上。前面一小步误差会导致后面整条轨迹偏离。

算法 3:MPC,规划整条轨迹,但只执行第一步

MPC 全称 Model Predictive Control,模型预测控制。

即基于当前状态和系统动力学模型,预测未来一段时间内的系统行为;在预测时域内求解最优控制序列;但真正执行时,只执行第一个控制动作,然后观察新状态,再重新预测和优化。

比如当前状态是 \(s_t\),模型规划出:

\[ a_t^*,a_{t+1}^*,a_{t+2}^*,\dots,a_{t+H-1}^* \]

但是智能体只执行:

\[ a_t^* \]

然后环境返回真实下一状态:

\[ s_{t+1} \]

接着从 \(s_{t+1}\) 重新规划一条新的动作序列。

为什么这样做?因为模型预测越往后误差越大。如果一次性执行完整规划序列,后面动作可能建立在错误状态预测上。而 MPC 每一步都重新观察真实状态并修正规划,可以显著降低模型误差累积。

提示

为什么要规划所有动作?

因为只规划第一个动作会变成短视贪心

\min_{a_t} c(s_t,a_t)

它只考虑当前一步代价,可能选出眼前最优、长期很差的动作。

而规划一整段动作,是在解:

\min_{a_t,\dots,a_{t+H-1}}\sum_{k=0}^{H-1}c(s_{t+k},a_{t+k})

它考虑的是未来一段时间的总代价,所以更有前瞻性。

算法 4:同时学习模型和策略

可以将策略学习与全局模型学习相结合:学习动态模型,然后通过模型反向传播到策略中,以更新优化策略,再运行新策略收集数据并加入数据集。

这时我们有两个参数:

模型参数:

\[ \eta \]

策略参数:

\[ \theta \]

模型学习目标是让:

\[ \hat f_\eta(s_t,a_t) \]

接近真实:

\[ s_{t+1} \]

策略学习目标是让模型 rollout 中的预测回报最大:

\[ J(\theta)=\mathbb E\left[\sum_t \gamma^t \hat r(s_t,a_t)\right] \]\[ a_t=\pi_\theta(s_t) \]\[ s_{t+1}=\hat f_\eta(s_t,a_t) \]

如果模型和策略都是可微的,就可以把奖励对动作、动作对策略参数、下一状态对模型输入的梯度一路反传回去,从而更新策略。

这个方法非常强,但也很依赖模型准确性。如果模型局部不准,策略可能学会“钻模型漏洞”,也就是在模型中表现很好,但真实环境中很差。

MBPO:模型生成短 rollout,辅助策略优化 #

MBPO 的全称通常理解为 Model-Based Policy Optimization。它的核心思想是:学习一个模型,用模型生成模拟数据,但只做短步 rollout,然后把真实数据和模拟数据一起用于策略优化。

为什么强调短 rollout?因为模型误差会随 rollout 长度累积。短 rollout 可以利用模型提高样本效率,同时避免长期预测误差过大。

MBPO 大致流程是:

真实环境中收集数据,放入真实经验池;用真实经验训练 dynamics model;从真实状态出发,在模型中 rollout 几步,生成模拟经验;把模拟经验加入模型经验池;用真实经验和模拟经验训练策略,比如用 SAC 或其他 actor-critic 方法。

你可以把 MBPO 看作 Dyna 思想的现代深度版本。Dyna-Q 是表格时代:真实经验学模型,模型生成模拟经验,再用 Q-learning 更新。MBPO 是深度时代:真实经验学神经网络模型,模型生成短模拟经验,再用深度策略优化方法更新策略。

image.png

Model-based RL 的优势和劣势 #

MBRL 的优势:无模型 RL 样本效率低,依赖试错学习,不支持多步预测和长期规划;而基于模型的强化学习样本效率高,支持长期规划,但可能引入模型误差。

所以这讲的核心权衡可以这样记:

Model-free RL 的优点是简单直接,不用担心模型学错;缺点是样本效率低,很多真实交互被浪费。

Model-based RL 的优点是样本效率高,可以在模型里模拟、规划、预测未来;缺点是模型误差会误导策略,尤其是长 rollout 时误差会累积。

因此现代 MBRL 很多方法都在做折中:既不完全依赖模型,也不完全不用模型,而是把模型作为辅助工具,比如短 rollout、MPC 重规划、模型不确定性估计、真实数据和模拟数据混合训练。

07 离线强化学习 #

离线强化学习的设定是:训练时智能体不能再和环境交互,它只能使用一个固定数据集:

\[ \mathcal D=\{(s_i,a_i,r_i,s_i')\}_{i=1}^N \]

这个数据集可能来自专家,也可能来自普通用户,也可能来自过去某个旧策略,甚至可能混合了专家、新手和随机行为。训练算法只能在这批数据上学习策略,不能主动去环境里试错。

离线强化学习最核心的难点不是“如何最大化回报”本身,而是:当策略想选择数据集中没见过的动作时,我们到底能不能相信价值函数对这个动作的估计?

为什么需要离线强化学习? #

因为在真实环境中从零开始训练强化学习智能体往往不可取,因为风险高、成本大。比如无人驾驶、医疗这些场景,如果让智能体从随机策略开始探索,代价可能非常严重;机器人控制、推荐系统等场景中,大规模在线试错也非常昂贵。

但这些场景往往又有大量历史数据。医院有病历和治疗结果,自动驾驶公司有人工驾驶数据,推荐系统有过去用户点击和购买记录,机器人也可能有人工遥操作数据。离线强化学习就是希望利用这些历史数据,在不进行危险在线试错的情况下,学出一个尽可能好的策略。

所以离线 RL 的价值在于:

\[ \text{利用历史数据}\quad \Rightarrow \quad\text{避免在线试错风险}\quad \Rightarrow \quad\text{仍然希望优化长期回报} \]

On-policy、Off-policy 和 Offline RL 的区别 #

On-policy:当前要优化的策略和收集数据的策略是同一个。比如 PPO 通常是 on-policy,用当前策略采样,再用这批数据更新当前策略。策略一变,就要重新采样。

image.png

Off-policy:行为策略和目标策略可以不同。比如 Q-learning、DQN 可以用 \(\epsilon\)-greedy 策略收集数据,但学习的是贪心最优策略。Off-policy 允许使用别的策略生成的数据,但通常训练过程中仍然可以继续和环境交互,收集新数据。

image.png

Offline RL:它不仅数据可以来自别的策略,而且训练过程中不能再和环境交互。也就是说,算法只有一个固定数据集 \(\mathcal D\),不能通过探索补充新数据。

image.png

离线强化学习最大的挑战:分布偏移 #

离线强化学习面临的最重要挑战是分布偏移:数据集分布和当前策略分布不一致,导致外推误差。

离线数据集 \(\mathcal D\) 是由某个行为策略 \(\beta(a|s)\) 收集的,它覆盖的是行为策略曾经访问过的状态动作对:

\[ (s,a)\sim d^\beta(s,a) \]

但我们训练出来的新策略 \(\pi(a|s)\) 可能会选择不同动作,访问不同状态:

\[ (s,a)\sim d^\pi(s,a) \]

如果 \(\pi\) 选择的动作不在数据集覆盖范围内,价值函数 Q(s,a) 就没有真实数据支撑。这时神经网络仍然会给它一个 Q 值,但这个值只是外推出来的,不一定可靠。

这就叫外推误差 Extrapolation Error

在第三讲的函数估计中,神经网络会对没见过的输入也输出一个值,这叫泛化。但在离线 RL 里,泛化不一定是好事。如果数据里没有“车开上草地”的经验,Q 网络可能根据“草地看起来也平”错误预测高回报。于是策略为了最大化 Q 值,可能真的选择开上草地。

这就是离线 RL 的根本危险:策略会利用 Q 函数在 OOD 区域的错误高估。

为什么普通 Q-learning 在离线数据上会出问题? #

普通 Q-learning 的目标是:

\[ Q(s,a)\leftarrow Q(s,a)+\alpha\left[r+\gamma \max_{a'}Q(s',a')-Q(s,a)\right] \]

问题出在:

\[ \max_{a'}Q(s',a') \]

这个 max 会在所有动作中选一个 Q 值最大的动作,包括数据集中从来没出现过的动作。如果某个 OOD 动作因为估计误差被高估,max 就会选它。然后这个虚假的高值会被作为 TD target,用来反向更新前面的 Q 值。这样错误会沿着 Bellman backup 传播。

所以离线 RL 的核心思路就是:不要让策略过度相信数据集之外的动作。

Behavioral Cloning 行为克隆 #

行为克隆本质上不是强化学习,而是监督学习。它的目标是模仿数据集中出现过的动作:

\[ \pi_\theta(a|s)\approx \beta(a|s) \]

如果动作是离散的,可以用交叉熵损失:

\[ L(\theta)=-\mathbb E_{(s,a)\sim\mathcal D}[\log \pi_\theta(a|s)] \]

如果动作是连续的,可以用均方误差:

\[ L(\theta)=\mathbb E_{(s,a)\sim\mathcal D}[\|\pi_\theta(s)-a\|^2] \]

BC 完全不关心“为什么要这么做”或者“这么做会有什么后果”,只是统计学上模仿专家动作分布。

所以 BC 的优点是简单、稳定、安全。因为它只模仿数据里的行为,不太会跑到 OOD 动作上。缺点也很明显:它最多学到数据集行为的平均水平,很难超越数据本身。如果数据中有很多低质量行为,BC 会照着学。

提示

模仿学习和离线强化学习都依赖静态数据,都能避免在线学习风险,但目标和逻辑不同。

行为克隆的目标是复制数据集中展示的行为:

\pi(a|s)\approx a_{\mathcal D}

它通常需要高质量专家数据,不一定需要奖励信号。它的学习逻辑是监督学习:最小化预测动作和专家动作之间的差距。

离线强化学习的目标是最大化累计回报:

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

它需要奖励信号,或者至少需要能够评价行为好坏的数据。它可以处理混合质量数据,因为它希望从数据里分辨哪些行为好、哪些行为坏,甚至从失败案例中学习“不该做什么”。

模仿学习离线强化学习
学习目标复制数据集中展示的行为在数据中寻找最优路径,超越数据表现
数据要求通常需要高质量的专家数据可以处理混合质量的数据(专家、新手、甚至随机行为)
奖励信号通常不需要奖励函数,学习的是映射关系必须有奖励信号(或事后标注),以此来区分哪些行为是好的
学习逻辑监督学习逻辑:最小化动作预测值与专家动作之间的差距强化学习逻辑:最大化累积回报(Return),进行价值评估
学习效果如果数据很差,模仿学习会学到错误的行为能够从次优或失败的尝试中学习“不该做什么”,从而提取出成功路径

BC 虽然不是真正的离线 RL,但它可以作为离线 RL 的初始化。

原因是 BC 学出的策略接近数据分布,不容易一开始就选择 OOD 动作。然后再用离线 RL 方法进一步根据奖励优化,就有可能比直接从随机策略训练更稳定。

所以可以用BC进行热启动,先用专家数据做 imitation learning,让策略有一个合理起点;再用 RL 或 offline RL 进一步优化长期回报。

BCQ:批量限制 Q 学习 #

Batch-Constrained Q-learning:对于经典表格型强化学习,BCQ 只使用数据集支撑上的目标 Q 值做时序差分计算。

普通 Q-learning 的 target 是:

\[ y=r+\gamma\max_{a'}Q(s',a') \]

这里的 a’ 可以是任意动作,包括数据集中没出现过的 OOD 动作。BCQ 修改这个地方:max 只在数据集支持的动作里做:

\[ y=r+\gamma\max_{a'\in \text{Support}(\mathcal D|s')}Q(s',a') \]

这样可以避免 Q-learning 被 OOD 动作的虚假高 Q 值误导。

如果动作是离散的,判断某个动作是否在数据集支持中比较容易。但连续动作空间里,动作有无穷多个,不可能简单枚举。因此在连续动作设置中,BCQ 使用一个生成模型,比如 VAE,生成距离数据集较近的状态动作对。

具体来说,BCQ 会训练一个行为生成模型:

\[ G_\omega(s) \]

给定状态 s,它生成一些类似数据集中行为策略会做的动作:

\[ a_i\sim G_\omega(s),\quad i=1,\dots,n \]

然后再用一个小扰动网络对这些动作做有限幅度调整:

\[ \tilde a_i=a_i+\xi_\phi(s,a_i) \]

其中扰动被限制在一个小范围内:

\[ \|\xi_\phi(s,a_i)\|\leq \Phi \]

最后只在这些候选动作中选 Q 值最大的:

\[ a^*=\arg\max_{\tilde a_i}Q(s,\tilde a_i) \]

这就实现了“只在数据集附近选动作”。VAE 保证候选动作接近数据分布,扰动网络提供一点优化空间,让策略不只是机械模仿数据,而能在数据附近寻找更高回报动作。

BCQ中也有双 Q 学习,即通过权重系数在最小 Q 值和最大 Q 值之间进行权衡。

为了降低 Q 值高估,很多算法会使用两个 Q 网络:

\[ Q_1(s,a),\quad Q_2(s,a) \]

计算 target 时可以用:

\[ \min(Q_1,Q_2) \]

这样更保守,避免某一个 Q 网络偶然高估。BCQ 中也可以在 min 和 max 之间做权衡,比如:

\[ \lambda \min(Q_1,Q_2)+(1-\lambda)\max(Q_1,Q_2) \]

如果更偏向 min,就更保守;如果更偏向 max,就更乐观。

image.png
image.png

CQL:保守 Q 学习 #

Conservative Q-Learning,保守 Q 学习:学习一个保守的、可作为价值下界的 Q 函数,避免在 OOD 数据上的过高估计。对于新的学习策略 μ,增加它遇见数据上的 Q 函数惩罚。

BCQ 是限制动作选择范围,而CQL 则修改 Q 函数训练目标,让 OOD 动作的 Q 值自动变低。也就是说,CQL 不一定禁止策略看 OOD 动作,但它会让这些动作的价值估计变得保守,从而不容易被选中。

普通 Q-learning 只最小化 Bellman error:

\[ \mathcal L_{\text{TD}}=\mathbb E_{(s,a,r,s')\sim\mathcal D}\left[Q(s,a)-\left(r+\gamma \max_{a'}Q(s',a')\right)\right]^2 \]

CQL 在这个基础上加一个保守正则项,大致思想是:

\[ \text{压低所有动作的 Q 值}-\text{补偿数据集动作的 Q 值} \]

更具体地,它常见形式类似:

\[ \mathcal L_{\text{CQL}}=\mathcal L_{\text{TD}}+\alpha\left(\mathbb E_s\left[\log\sum_a \exp Q(s,a)\right]-\mathbb E_{(s,a)\sim\mathcal D}[Q(s,a)]\right) \]

其中:

\[ \log\sum_a \exp Q(s,a) \]

会对所有动作中较大的 Q 值非常敏感,因此它倾向于把所有动作,尤其是高估动作压下来。

它可以看作 \(\max_a Q(s,a)\) 的平滑近似,哪个动作的 Q 值特别大,\(\exp Q(s,a)\) 就会非常大,从而主导整个 log-sum-exp。

但:

\[ \mathbb E_{(s,a)\sim\mathcal D}[Q(s,a)] \]

会把数据集内真实动作的 Q 值补回来。

CQL还可以和SAC结合:

SAC,也就是 Soft Actor-Critic,本身是一个最大熵 actor-critic 方法。它有策略 \(\pi(a|s)\),也有 Q 函数 Q(s,a)。在在线 SAC 中,Q 函数指导策略往高价值动作移动;策略也通过熵项保持探索。

离线场景中,普通 SAC 容易被 OOD 动作的高估 Q 值误导。CQL 的做法是:训练 Q 函数时加入保守正则,让 Q 对 OOD 动作更悲观。然后策略再根据这个保守 Q 去优化,就不会轻易跑到数据外动作上。

image.png
BCQ (Batch-Constrained Q-learning)CQL (Conservative Q-Learning)
思想原理显式约束 (Explicit Constraint)隐式惩罚 (Implicit Regularization)
核心机制使用VAE限制动作的范围,只在“见过”的动作里选最好的修改Loss函数,主动压低OOD动作的Q值
Q值表现试图让Q值更准确,但不保证不超标具有下界保证,确保估计值不超过真实值
动作选择在VAE采样的n个动作中寻找最大Q值在整个动作空间选最大Q值
实现复杂度较高(需训练VAE、扰动网络、Q网络)。较低(只需在标准Q学习Loss上加一个正则项)
代表哲学没见过的动作我不看没见过的动作我都给差评

极端稀疏奖励下,BCQ 和 CQL 谁更有优势? #

如果数据集中包含少量成功轨迹,而且成功动作分布比较集中,那么 BCQ 可能有优势。因为它限制策略在数据支持附近行动,可以避免乱跑到 OOD 区域。如果成功行为已经在数据中出现,BCQ 可以在这些候选动作中选高 Q 动作。

但如果数据质量混杂、动作空间复杂,而且需要从大量失败样本中区分出少数高价值行为,CQL 可能更灵活。它不只是模仿数据,也不只是限制动作空间,而是通过奖励和 Bellman backup 学习保守 Q,并压低数据外动作。只要成功轨迹的奖励信号能被捕捉,CQL 可以让数据内高回报动作获得相对更高的 Q。

极端稀疏奖励的核心难点是:大部分数据没有正反馈,价值传播很困难。如果数据几乎没有成功样本,那么 BCQ 和 CQL 都很难,因为离线 RL 无法通过探索发现新成功路径。离线 RL 的上限很大程度取决于数据覆盖度。

可以这么总结:BCQ 在需要严格避免 OOD、且数据中已有较好行为覆盖时更安全;CQL 在混合质量数据中更擅长通过保守 Q 学习区分好坏行为,但也依赖奖励信号和成功数据覆盖。极端稀疏奖励下,两者都受数据覆盖限制,不能凭空发现数据中完全没有的成功策略。

08 多智能体系统和博弈均衡 #

在多智能体系统中,环境里有多个 agent。每个 agent 都有自己的动作、策略和收益。一个 agent 的收益函数不再只是:

\[ r(s,a) \]

而更像:

\[ r_i(s,a_1,a_2,\dots,a_n) \]

也就是说,第 i 个智能体的收益取决于所有智能体的联合动作。比如在足球比赛里,你的传球是否有效取决于队友跑位,也取决于对手防守;在拍卖里,你能不能低价买到物品取决于别人出价;在交通网络里,你选哪条路是否拥堵取决于其他司机怎么选。

从田忌赛马的故事可以看出多智能体系统的第一个难点是:对手不是静态环境,而是也会调整策略的决策者,所以策略组合十分重要。

从投票和拍卖来看,多智能体系统不仅关心“agent 怎么学策略”,还关心“规则怎么设计”。投票规则、拍卖规则、奖励分配方式都会影响智能体行为。一个机制设计得不好,可能诱导自私行为、操纵行为或整体效率下降;机制设计得好,则可以让个体理性行为导向更好的整体结果。

多智能体系统共有三类:

合作型多智能体系统 中,智能体目标一致,通常共享奖励。比如无人机集群、智能物流、协作机器人。所有 agent 的目标是一起完成任务。此时问题空间是“智能体学习目标一致”,决策标准通常是提高学习速度、获得全局最优解。

竞争型多智能体系统 中,智能体目标对立,比如棋类、对抗游戏、零和博弈。一个 agent 的收益提高往往意味着另一个 agent 的收益下降。此时决策标准不再是“大家一起最好”,而是“不遗憾”或者“在对手最优反应下自己也尽可能好”。

混合型多智能体系统 最接近现实,比如多人团队对抗游戏、自动驾驶交通、多队伍竞赛。组内可能合作,组间可能竞争。

单智能体只有一个 agent 与环境交互,智能体观察环境动态并进行最优决策;多智能体系统中有多个智能体与环境交互,智能体在观察环境动态的同时,还要协调其他智能体行为,进行最优决策。这将带来非平稳性 的问题:

\[ P_t(s'|s,a_i)\neq P_{t+1}(s'|s,a_i) \]

博弈的形式化定义 #

玩家集合:

\[ N=\{1,2,\dots,n\} \]

每个玩家 i 有自己的策略集合:

\[ A_i \]

所有玩家的联合策略空间是:

\[ A_1\times A_2\times \cdots \times A_n \]

每个玩家都有自己的收益函数:

\[ r_i:A_1\times A_2\times\cdots\times A_n\rightarrow \mathbb R \]

这里多智能体里每个 agent 都有自己的 reward:

\[ r_i(a_i,a_{-i}) \]

其中 \(a_{-i}\) 表示除了 agent i 之外其他所有 agent 的动作或策略。

“最优策略”的四种不同标准 #

社会福利 关注所有参与者收益总和:

\[ \max_a \sum_{i=1}^n r_i(a) \]

它站在整体角度看问题,希望总收益最大。合作型系统中常用这个标准。

帕累托优 关注是否还能在不损害任何人的情况下改善某些人。如果一个策略组合已经无法让某个 agent 变好而不让其他人变差,那么它就是帕累托最优。

纳什均衡 关注个体稳定性。给定其他人的策略,没有任何一个 agent 能通过单方面改变自己的策略获得更高收益。

优超策略 则更强。它是不依赖其他参与者的策略,无论别人怎么做,我这个策略都最好。也就是说,如果一个策略严格优于自己所有其他策略,不管对方怎么选,它就是 dominant strategy。

帕累托优:整体上不能无损改进 #

一个方案 x 是帕累托最优,当且仅当不存在另一个方案 x’,使得至少一个 agent 更好,同时其他所有 agent 不变差。形式上可以写成:

\[ \exists i,\ u_i(x')\gt u_i(x) \]\[ \forall j,\ u_j(x')\ge u_j(x) \]

如果这样的 x’ 存在,那么 x 就不是帕累托最优,因为我们可以在不伤害任何人的情况下让某些人变好。

帕累托优强调的是资源配置是否还有“无损改进”的空间。它不要求公平,也不要求每个人都收益最高,只要求不能在不损害别人的情况下继续改善。

社会福利是帕累托最优的一个子集。

纳什均衡:没有人愿意单方面改变 #

没有参与者可以通过单边改变策略来增加自己的收益。

形式化地,策略组合:

\[ s^*=(s_1^*,s_2^*,\dots,s_n^*) \]

是纳什均衡,如果对每个 agent i,在其他 agent 策略固定为 \(s_{-i}^*\) 时,\(s_i^*\) 是 agent i 的最优反应:

\[ u_i(s_i^*,s_{-i}^*)\ge u_i(s_i,s_{-i}^*)\quad\forall s_i\in A_i \]

纳什均衡不是说所有人收益最高,也不是说整体最优,而是说:在别人都不变的情况下,我单独改变没有好处。

囚徒困境 #

纳什均衡不等于整体最优

  • 双方都坦白:(-5,-5)
  • A 坦白 B 抗拒:(0,-10)
  • A 抗拒 B 坦白:(-10,0)
  • 双方都抗拒:(-1,-1)

每个囚徒如果只考虑自身利益,会选择“坦白”;而囚徒困境的最优策略是双方都选择“抗拒”。

对囚犯 A 来说,如果 B 坦白,A 坦白得到 -5,抗拒得到 -10,所以 A 更愿意坦白。如果 B 抗拒,A 坦白得到 0,抗拒得到 -1,所以 A 还是更愿意坦白。因此“坦白”是 A 的优超策略。对 B 也一样。

所以最终双方都会选择:

\[ (\text{坦白},\text{坦白}) \]

这是纳什均衡,因为给定对方坦白,自己改成抗拒只会更差。但双方都抗拒显然更好,也就是说,纳什均衡不是帕累托最优。

社会福利:<抗拒,抗拒>

帕累托最优:除了<坦白,坦白>以外的所有其他情况

纳什均衡:<坦白,坦白>

超优策略:<坦白,坦白>

Braess 悖论:个体最优会造成整体变差 #

交通网络中有 4000 辆车从起点到终点。原本没有 A 到 B 的近路时,车辆可以较均衡地分配在两条路线,通行时间为 65 分钟;但如果 A 到 B 存在一条通行时间接近 0 的路径,所有司机都会选择看起来对自己最优的路线,结果通行时间变成 80 分钟。

这个例子和囚徒困境很像。每个司机都在做个体最优选择,但所有人的选择叠加起来让整体效率变差。多了一条路,本来应该更好,但因为改变了每个人的策略激励,反而导致拥堵。

这说明在多智能体系统中,环境结构的改变会改变均衡,而均衡不一定带来社会福利提升。机制设计、交通调度、多智能体协作都要考虑这种现象。

无纯策略纳什均衡:石头剪刀布 #

收益表中,如果双方出一样,则 (0,0);如果一方赢,赢者 1,输者 -1。

任何固定动作组合都会有一方想改变。因为石头、剪刀、布之间形成循环克制关系

但石头剪刀布存在混合策略纳什均衡:

\[ P(\text{石头})=P(\text{剪刀})=P(\text{布})=\frac{1}{3} \]

在这个策略下,对方无法利用你的固定偏好。任何纯动作面对均匀随机策略的期望收益都是 0,因此没有人能通过改变策略提高收益。

这说明纳什均衡不一定是纯策略,也可能是随机策略。

多个纳什均衡:恋爱博弈 #

男孩喜欢看球赛,女孩喜欢看电影,但两人都希望一起度过周末。收益表大致是:

  • 都去球赛:(2,1)
  • 都去电影:(1,2)
  • 分开行动:(0,0)

这里有两个纯策略纳什均衡:(球赛,球赛)和(电影,电影)

这两个都是稳定点。问题在于:到底会落到哪个均衡?这就是均衡选择问题。纳什均衡可能不唯一,多个均衡之间如何协调,是多智能体系统中的重要问题。

“非共享支付的博弈” #

每个智能体只知道自己在不同联合动作下能得到多少,不一定知道别人得到多少。

这在多智能体系统里很常见,因为真实系统中各个智能体往往是分布式的,不一定能共享完整信息。比如自动驾驶车辆、机器人群体、交易系统,每个个体可能只知道自己的收益、成本、观测,而不知道其他人的完整偏好。

博弈的分类 #

第一,按是否合作:

合作博弈 里,智能体目标一致,比如大家收益相同:

\[ r_1(a)=r_2(a)=\cdots=r_n(a) \]

这种情况下,大家是一个团队。比如两个机器人一起搬箱子,成功都得分,失败都不得分。

非合作博弈 里,每个人有自己的收益,可能冲突,也可能部分一致。囚徒困境、拍卖、市场竞争都属于这一类。

第二,按人数:

两人博弈 就是两个参与者;多人博弈 就是三个或更多参与者。多智能体强化学习通常会面对多人博弈。

第三,按收益关系:

零和博弈 是你赢多少,对方就输多少。比如石头剪刀布:

\[ (1,-1),(-1,1),(0,0) \]

两个人收益和总是 0。

常和博弈 是总收益固定,不一定是 0。

变和博弈 是总收益会变化,比如合作可能创造更大总收益,竞争可能导致两败俱伤。囚徒困境就是典型变和博弈。

第四,按行动顺序:

静态博弈 是大家同时行动,或者虽然有先后,但后行动者不知道前面的人选了什么。普通矩阵博弈通常是静态博弈。

动态博弈 是有明确行动顺序,后行动者能看到前面的人做了什么。Stackelberg 博弈就是动态博弈。

第五,按信息:

完全信息博弈 是每个参与者都知道所有人的收益函数和规则。

不完全信息博弈 是参与者不知道别人的类型、收益、偏好或信息。现实中的博弈大多是不完全信息的。

Stackelberg 均衡怎么理解 #

Stackelberg 博弈改变了普通纳什博弈的一个假设:玩家不是同时行动,而是有先后顺序。

领导者 leader 先行动,跟随者 follower 后行动。

玩家 1 先选:

\[ A \text{ 或 } B \]

然后玩家 2 看到玩家 1 的选择后,再选:

\[ X \text{ 或 } Y \]

收益矩阵是:

\[ \begin{array}{c|cc} & X & Y\\A & (20,15) & (0,0)\\B & (30,0) & (10,5)\end{array} \]

09 对手建模与虚拟自博弈 #

一个理性个体应该采取行动最大化自身收益。问题在于:其他参与者的策略是否已知?

如果其他参与者的策略已知,那么我可以直接计算针对他们的最优反应,也就是 best response。比如如果我知道对手在石头剪刀布里总是出石头,那我的最优反应就是总出布。

如果其他参与者的策略未知,那就有不同思路。激进策略是预测对手并反制,试图博取收益上限;保守策略是不相信自己能准确预测对手,而是采用均衡策略或最坏情况最优策略,保证收益下限。

最优反应 Best Response:

令其他玩家的联合行为为:

\[ a_{-i}=(a_1,\dots,a_{i-1},a_{i+1},\dots,a_n) \]

那么玩家 i 对 \(a_{-i}\) 的最优反应 \(a_i^*\) 满足:

\[ r_i(a_i^*,a_{-i})\ge r_i(a_i,a_{-i}),\quad \forall a_i\in A_i \]

纳什均衡的正式定义。一个策略组合:

\[ a=(a_1,\dots,a_n)\in A_1\times\cdots\times A_n \]

如果对任意玩家 i,都有:

\[ r_i(a_i,a_{-i})\ge r_i(a_i',a_{-i}),\quad \forall a_i'\in A_i \]

那么 a 是一个纳什均衡。还可以写成更简洁的形式:

\[ \forall i\in N,\quad a_i\in BR(a_{-i}) \]

两种简化方法:独立学习 IL 与对手建模 #

独立学习的做法最直接:把其他 agent 当作环境的一部分。比如每个 agent 都单独运行 Q-learning:

\[ Q_i(s,a_i)\leftarrow Q_i(s,a_i)+\alpha[r_i+\gamma\max_{a_i'}Q_i(s',a_i')-Q_i(s,a_i)] \]

这种方法在合作场景里有时能用,效率也比较高,因为不用显式建模所有人的联合动作空间。但它的问题是明显的:从单个 agent 看,环境是非平稳的,因为其他 agent 的策略也在变。如果我把对手当环境,而这个“环境”自己也在学习,那 Q-learning 的收敛假设就被破坏了。

对手建模则是另一种思路:我不把对手当作黑箱环境,而是显式估计对手策略,例如:

\[ \hat\pi_{-i}(a_{-i}|s) \]

然后基于这个预测选择自己的最优反应。它适用于对手策略相对稳定,或者可预测的场景。但如果对手也在建模我、反制我,就会出现递归推理和复杂互动。

多智能体强化学习算法设计目标:

理性性: 在对手使用固定策略时,智能体最终能学习并收敛到针对该对手的最优策略;

收敛性: 在多个智能体都使用学习算法时,当前智能体能够学习并收敛到一个稳定的策略。通常情况下,收敛性针对系统中的所有智能体使用相同的学习算法。

马尔科夫博弈:多智能体版 MDP #

Markov Game,也叫 stochastic game。它可以看作 MDP 的多智能体扩展。普通 MDP 是:

\[ (S,A,P,R,\gamma) \]

马尔科夫博弈则可以写成:

\[ (N,S,A,T,R,\gamma) \]

其中 N 是智能体集合,S 是状态集合,\(A=A_1\times\cdots\times A_n\) 是联合动作空间,T 是状态转移函数,\(R=(R_1,\dots,R_n)\) 是各智能体奖励函数,\(\gamma\) 是折扣因子。状态转移概率受环境和智能体共同影响。

在给定联合策略 \(\pi=(\pi_1,\dots,\pi_n)\) 时,智能体 i 的值函数可以写为:

\[ V_i^\pi(s)=\mathbb E_\pi\left[\sum_{t=0}^{\infty}\gamma^t r_i(s_t,a_t)\mid s_0=s\right] \]

对应的 Bellman 形式是:

\[ V_i^\pi(s)=\mathbb E_{a\sim \pi(s)}\left[r_i(s,a)+\gamma\sum_{s'}P(s'|s,a)V_i^\pi(s')\right] \]

注意这里的 a 是联合动作:\(a=(a_1,\dots,a_n)\)

Minimax-Q:零和博弈中的多智能体 Q-learning #

它适用于零和博弈,也就是一个智能体的收益等于另一个智能体的损失。比如二人对抗游戏中:

\[ r_1=-r_2 \]

这时 agent 不应该只最大化自己的 Q,而要考虑对手会故意让自己收益最小。因此目标是:

\[ \max_{\pi_i}\min_{a_{-i}} \text{收益} \]

Minimax-Q 的值函数形式大致是:

\[ V_i(s)=\max_{\pi_i(s)}\min_{a_{-i}\in A_{-i}}\sum_{a_i\in A_i}Q_i(s,a_i,a_{-i})\pi_i(s,a_i) \]

即我选择一个混合策略 \(\pi_i\),对手选择最克制我的动作 \(a_{-i}\),我希望在最坏情况下收益最大。

对应的 Q 更新是:

\[ Q_i(s,a_i,a_{-i})\leftarrow Q_i(s,a_i,a_{-i})+\alpha[r_i+\gamma V_i(s')-Q_i(s,a_i,a_{-i})] \]

这里 \(V_i(s')\) 不是简单的 \(\max_a Q(s',a)\),而是一个 minimax 值。因为下一状态下对手也会选择对我最不利的动作。

Minimax-Q 的优点是适合零和博弈,理论上有收敛性、对抗性和学习性;缺点是计算复杂度高、非最优性、依赖充分探索,而且只适用于完全竞争的零和场景。

image.png

Nash-Q:一般随机博弈中的均衡学习 #

Nash-Q 的核心思想是:在每个状态下,把当前 Q 表看成一个阶段博弈,然后求这个阶段博弈的纳什均衡。也就是说,给定状态 s,每个 agent 对联合动作都有一个 Q 值:

\[ Q_i(s,a_1,\dots,a_n) \]

这些 Q 值共同构成一个矩阵博弈。我们在这个矩阵博弈中求一个联合均衡策略:

\[ \pi^*(s)=(\pi_1^*(s),\dots,\pi_n^*(s)) \]

然后用该纳什均衡下的期望 Q 值作为状态价值:

\[ V_i^{Nash}(s)=\mathbb E_{a\sim \pi^*(s)}[Q_i(s,a)] \]

Nash-Q 的更新类似:

\[ Q_i(s,a)\leftarrow Q_i(s,a)+\alpha[r_i+\gamma V_i^{Nash}(s')-Q_i(s,a)] \]

Nash-Q 学习不断进行以下两步操作,直到收敛:

  1. 基于当前每个状态的Q值表,求解纳什均衡,以及每个状态的 \(V_{Nash}\)
  2. 基于纳什均衡价值,使用上式更新 Q 值表
image.png

Nash-Q 作为一种完全中心化方法,仍然有两个缺点:非常高的计算复杂度,无法处理非合作的博弈场景。

同时纳什均衡还可能不唯一,如何选择也是个问题。

Friend-or-Foe Q:朋友-敌人假设下的简化 #

它的适用场景是一般和博弈:一个智能体把其他智能体分为朋友 friend 和敌人 foe。朋友会帮助自己最大化收益,敌人会让自己收益最小。

\[ V_i(s)=\max_{\pi_i,\pi_{\text{friend}}}\min_{\pi_{\text{foe}}}\sum_a Q_i(s,a)\pi(a) \]

Friend-or-Foe 的优势是比 Nash-Q 更容易计算,也更适合团队对抗场景,比如红队蓝队、多智能体对抗游戏。缺点是它要求预先知道谁是朋友、谁是敌人,而且这种二分假设不适合复杂混合关系。

image.png

以上经典MARL都试图把单智能体 Q-learning 的“下一状态最优值”替换为一个多智能体博弈解

对手建模:为什么要建模别人? #

\[ \text{观察对手过去状态和动作}\rightarrow\text{学习对手模型}\rightarrow\text{预测对手未来动作/目标/信念}\rightarrow\text{基于预测选择自己的最优反应} \]

直接建模: 通过过去的行为信息直接构建对手模型。

策略建模 是直接预测对手在当前状态会采取什么动作:

\[ \hat\pi_{op}(a_{op}|h) \]

其中 h 可以是历史观测、当前状态、过去动作序列等。比如在 matching pennies 中,如果观察到对手过去 5 次行动里 3 次出 H、2 次出 T,那么我们可以估计:

\[ P(H)=\frac{3}{5},\quad P(T)=\frac{2}{5} \]

然后根据这个估计选择最佳应对。

对手类型建模 则是假设对手属于某几类类型,比如 A 型、B 型、C 型对手有不同的出牌概率。我们通过观察历史行为更新对不同类型的置信度,然后预测对手行为。比如开始可能认为三类对手概率相等:

\[ P(A)=P(B)=P(C)=\frac{1}{3} \]

观察到一系列行为后,根据它们对各类型的似然,更新后验概率。这样做的好处是模型更结构化,尤其适合对手策略来自有限类型库的情况。

直接建模的优点是简单、直观、样本效率较高;缺点是只能捕捉浅层行为模式。如果对手也在学习、也会反制,直接统计可能很快失效。

递归建模: 我推测对手正在用某种方式推测我的行动。于是我不仅要预测对手动作,还要预测对手的预测。

零层思维,也就是 Level-0 thinking,假设对手完全随机行动。

一层思维,也就是 Level-1 thinking,假设对手会预测我的行动,然后选择最优反应。

二层思维,也就是 Level-2 thinking,假设对手在推测我会如何最佳应对,所以我需要再反推一层。

递归建模的好处是能处理更复杂的策略推理;坏处是层数越高越复杂,而且不一定真实。现实对手未必真的按这么多层推理,层数过高可能反而过拟合或陷入循环。

虚拟博弈:从自博弈中学习平均策略的最优反应 #

虚拟博弈,也就是 Fictitious Play / Fictitious Self-Play。它的基本问题是:如果对手采用对手建模,我该反应什么?思路是在一个轮次博弈过程中,每个个体的行为汇总,若个体采用虚拟博弈算法,其第 t+1 轮选择行为为:

\[ \pi^{t+1}\in\arg\max_{\mu} R(\mu,\bar\pi^{-i}) \]

其中 \(\bar\pi^{-i}\) 是对对手过去策略的平均建模,也可以理解为自己对对手的虚拟信念 belief

虚拟博弈不是只对对手上一轮动作做反应,而是对对手历史平均行为做最优反应。直觉是:我假设对手未来会像过去平均那样行动,于是我对这个平均策略做 best response。

所以虚拟博弈分为两个阶段,一个阶段是统计对手平均策略,另一个阶段是对平均策略做最优反应

由于己方和对方本质上依据过去双方策略进行优化改进,其本质是一种自博弈。

自博弈的含义是:智能体不是只和固定对手训练,而是不断和自己过去版本或平均策略博弈。这样它会逐渐学会应对越来越强的对手。

比如 AlphaGo、AlphaZero 这类系统中,自博弈是核心思想:自己和自己下棋,赢的一方提供学习信号,策略不断迭代。虚拟博弈是更经典、更理论化的自博弈思想:每轮对历史平均策略做最优反应。

不过虚拟博弈也有问题。如果每一轮只学习针对上一轮或平均策略的最佳反应,策略可能在不同反应之间循环,尤其是在石头剪刀布这类循环博弈中。

神经虚拟自博弈:NFSP #

这是把虚拟自博弈和深度强化学习结合起来,用神经网络处理更大规模现实场景。

NFSP 通常有两个核心网络:

一个是强化学习网络,学习 best response 策略。它通过 RL 学会如何对当前对手平均策略获得高收益。这个策略有时记为:

\[ \beta \]

另一个是监督学习网络,学习平均策略。它用历史 best response 行为作为监督数据,拟合过去策略的平均行为。这个策略有时记为:

\[ \pi \]

最优反应动力学与后悔值 #

虚拟博弈中每轮是针对过去对手平均策略做最优决策;如果仅针对最近一轮策略做反应,更新类似:

\[ \pi_{\mu}^{t+1}\in\arg\max_{\mu}R^i(\mu,\pi^{-i}_t) \]

这就是更直接的 best-response dynamics。但例如石头剪刀布,这类策略可能产生循环,无法收敛到均衡。

那么就引出后悔的思想:如果选择某个未采取策略,事后回看是否能获得更高收益。后悔值衡量的是:实际获得的累计收益和事后最佳固定策略收益之间的差距。大致可以写成:

\[ Regret_T=\max_{\pi}\sum_{t=1}^{T}R_i(\pi,\pi_{-i}^t)-\sum_{t=1}^{T}R_i(\pi_i^t,\pi_{-i}^t) \]

如果:

\[ \lim_{T\to\infty}\frac{Regret_T}{T}=0 \]

就叫无憾。意思是:随着时间增长,平均每轮后悔趋近于 0,此时平均策略收敛到纳什均衡。

常见无憾学习算法:FTRL、MWU、RM #

FTRL 是 Follow the Regularized Leader。它的思想是:每轮选择使历史累计收益最大、同时加上正则项的策略。正则项用于避免策略变化过猛。形式上类似:

\[ \pi_{t+1}=\arg\max_{\pi}\sum_{\tau=1}^{t}R_i(\pi,\pi_{-i}^{\tau})+\psi(\pi) \]

其中 \(\psi\) 是正则项。

MWU 是 Multiplicative Weight Update,乘法权重更新。它会提高过去表现好的动作权重,降低表现差的动作权重。直觉上就是“赚钱的动作以后多选,亏钱的动作以后少选”,但权重是乘法式调整。

RM 是 Regret Matching,后悔匹配。它根据每个动作的正后悔值来分配下一轮概率。哪个动作过去后悔越大,说明“早知道选它就好了”,下一轮就更可能选它。

概念核心问题对手是谁怎么更新自己
自博弈通过和自己对战变强自己或历史版本根据自我对局数据更新策略
虚拟博弈对历史平均策略做最佳响应对手的历史频率分布统计对手动作频率,做 best response
对手建模预测具体对手下一步怎么做某个具体对手模型根据预测出的对手策略更新自己

10 经典多智能体算法 #

可以按智能体之间的关系分类:合作型、竞争型、混合型

也可以按通信方式分类:

可通信: 智能体之间可以通过某种方式共享信息;

不可通信: 各智能体只能独立行动。

image.png

第一个核心难点:非平稳性 Non-Stationarity #

在单智能体 RL 中,如果环境固定,状态转移概率 P(s’|s,a) 和奖励函数 R(s,a) 是稳定的。但在多智能体中,其他 agent 也在学习,它们的策略会变。因此对某一个 agent 来说,环境不是固定的,而是在不断变化。

对 agent i 来说,如果它只看到自己的动作 \(a_i\),它感受到的转移概率其实是:

\[ P_i(s'|s,a_i)=\sum_{a_{-i}}P(s'|s,a_i,a_{-i})\pi_{-i}(a_{-i}|s) \]

其中 \(a_{-i}\) 表示其他 agent 的联合动作,\(\pi_{-i}\) 表示其他 agent 的策略。如果其他 agent 的策略 \(\pi_{-i}\) 在训练中不断变化,那么:

\[ P_i^t(s'|s,a_i)\neq P_i^{t+1}(s'|s,a_i) \]

于是 agent i 面对的“环境”就是非平稳的。

例如合作导航,对抗游戏中都会出现这个问题。

独立动作学习者 IL:最简单但有问题 #

每个智能体都把其他智能体当作环境的一部分,只学习自己的 Q 函数:

\[ Q_i(s,a_i) \]

更新方式类似普通 Q-learning:

\[ Q_i(s,a_i)\leftarrow Q_i(s,a_i)+\alpha\left[r_i+\gamma\max_{a_i'}Q_i(s',a_i')-Q_i(s,a_i)\right] \]

IL 的优点是简单,复杂度低,因为每个 agent 只关心自己的动作,不需要枚举联合动作。但问题也正是这里:它忽略了其他 agent 的动作和策略变化。所以存在非平稳性、打破马尔科夫性、无法收敛。

为什么说打破马尔科夫性?因为如果状态 s 中没有包含其他 agent 当前策略或内部状态,那么仅凭 s 和 \(a_i\) 无法决定下一状态分布。

IL可以作为一个重要的 baseline

联合动作学习者 JAL:把联合动作纳入 Q 函数 #

Joint Action Learner

学习联合动作 Q 值:

\[ Q_i(s,a_1,a_2,\dots,a_n) \]

也就是:

\[ Q_i(s,\mathbf a) \]

这样 agent i 在评估动作价值时,会显式考虑其他 agent 的动作。JAL 的更新形式类似:

\[ Q_i(s,\mathbf a)\leftarrow Q_i(s,\mathbf a)+\alpha\left[r_i+\gamma V_i(s')-Q_i(s,\mathbf a)\right] \]

其中 \(V_i(s')\) 要根据联合动作或联合策略计算。

image.png

JAL 本身只是把联合动作纳入学习,而 Nash-Q 则进一步在下一状态求纳什均衡价值。

JAL 的好处是缓解非平稳性,因为它不再把其他 agent 的动作完全隐藏起来。如果能观察到联合动作 \(\mathbf a\),就可以学习“某个联合动作组合”到底好不好。

但 JAL 也有明显缺点。第一,联合动作空间爆炸:

\[ |A_1|\times |A_2|\times\cdots\times |A_n| \]

如果每个 agent 有 5 个动作,10 个 agent 就有:

\[ 5^{10} \]

种联合动作,表格或网络学习都会变得困难。第二,JAL 通常要求能观察到其他 agent 的动作,否则无法更新联合动作 Q。第三,它仍然需要面对协调问题:知道联合动作价值不等于一定能让大家一起选到那个联合动作。

第二个核心难点:相对过度泛化 Relative Overgeneralization #

多智能体强化学习一定能得到全局最优解吗?答案是:不一定。可能存在非最优策略,但它在平均意义上看起来更好,导致 agent 收敛到次优协调。

相对过度泛化的核心原因是:在合作任务中,一个动作的好坏依赖其他 agent 是否配合。某个动作如果和正确队友动作配合,可以获得很高奖励;但如果队友没配合,会得到很低奖励。学习过程中,agent 看到的是“自己的动作在各种队友动作下的平均表现”,于是可能低估真正的最优协调动作。

image.png

“相对过度泛化” 可以理解为:agent 不是完全不知道最优动作,而是把一个需要精确协作的好动作,错误地泛化成“平均来说不好”。

Lenient Q-learning:宽容学习 #

它的基本思想是:在合作学习早期,不要过早惩罚一个动作,因为失败可能不是这个动作本身差,而是其他 agent 没配合好。

对于普通 Q-learning,遇到低 TD target就会降低Q值:

\[ \delta=r+\gamma\max_{a'}Q(s',a')-Q(s,a) \]

如果 \(\delta\lt 0\),说明这次结果比预期差,普通 Q-learning 会下调 Q。但在多智能体合作中,这次差可能是因为队友没配合,而不是当前动作本身不好。Lenient Q-learning 的想法是:对于负更新,尤其在学习早期,要宽容一点,不要马上降低 Q 值。

一种典型做法是引入温度或宽容度 T,温度高时更可能忽略负 TD error;温度逐渐衰减后,算法变得更严格。这样可以给高潜力但需要协作的动作更多机会,避免过早被低估。

image.png

Hysteretic Q-learning:滞后 Q 学习 #

它使用两个学习率:一个用于正 TD error,一个用于负 TD error。

\[ Q(s,a)\leftarrow Q(s,a)+\alpha\delta\quad \text{if } \delta\ge 0 \]\[ Q(s,a)\leftarrow Q(s,a)+\beta\delta\quad \text{if } \delta\lt 0 \]

通常 \(\alpha\gt \beta\)

为什么这样有用?在合作 MARL 中,低回报可能来自队友配合失败,而不是自己动作错误。如果负更新太快,一个本来需要队友配合的好动作会被迅速打低。Hysteretic Q-learning 对负反馈更“迟钝”,让潜在好动作保留更久。

WoLF:Win or Learn Fast,可变学习率 #

当当前策略表现好时,慢慢更新;当当前策略表现差时,快速更新。

通过使用可变学习率,达成快速学习。当前“赢”时,慢速学习;当前“输”时,快速学习。这样做可以减少环境非平稳性与均衡偏离之间的震荡。

WoLF 常和 Policy Hill-Climbing 结合,形成 WoLF-PHC。它不只是更新 Q 值,还更新策略概率。大致思路是:根据 Q 值提升较优动作概率,但学习率根据“当前是否比平均策略好”调整。

image.png

Frequency Maximum Q-learning:递归频率最大 Q 学习 #

计算一个最大回报与出现频率相关的 Q 值,估计某个动作能够达到最大回报的频率,并针对高频率最大 Q 值进行加权。

这也是为相对过度泛化服务的。RO 的问题是平均回报会掩盖最优协作动作。FMQ 则更关注“这个动作是否曾经多次达到过很高回报”。如果某个动作在正确配合时能反复获得高奖励,即使平均值受失败配合拖累,FMQ 也会保留它的潜力。

image.png

FMQ 在普通 Q 值之外,额外记录每个动作的历史最大收益 \(Q_{\max}\) 和最大收益出现频率 F,再用 \(E=(1-F)Q+FQ_{\max}\) 作为乐观动作评价。这样可以鼓励智能体在合作博弈中选择那些“有高收益潜力且高收益经常出现”的动作,从而更容易实现协调。

攀爬博弈 #

\[ \begin{array}{c|ccc} & a & b & c\\\hline a & 11 & -30 & -30\\b & -30 & 7 & 6\\c & 0 & 0 & 5\end{array} \]

攀爬博弈用来测试算法能不能克服相对过度泛化。全局最优 (a,a) 收益最高,但如果没协调好会受到 -30 的严重惩罚,导致普通平均更新容易低估动作 a。宽容 Q、滞后 Q、rFMQ 通过宽容、慢惩罚或乐观最大值机制避免过早放弃 a,所以成功率高;WoLF-PHC 没有专门解决这种协调失败导致的低估问题,所以成功率为 0。

第三个核心难点:信度分配 Credit Assignment #

在合作任务中,只有团队奖励 R(s,a),如何区分每个智能体的贡献?

JAL 中的联合 Q 能看到整体,但不一定知道个体贡献

credit assignment 需要更细的机制:不仅评估联合行为,还要衡量每个个体动作对团队收益的边际贡献。

Difference Rewards:差分奖励

\[ D_i(z)=G(z)-G(z_{-i}+c_i) \]

其中 G(z) 是当前系统整体收益,z 表示全局状态或联合行为;\(z_{-i}+c_i\) 表示把第 i 个 agent 的行为替换成某个默认行为 \(c_i\),其他 agent 保持不变。于是 \(D_i\) 就表示:第 i 个 agent 当前行为相比默认行为,对全局收益贡献了多少。

\[ \text{差分奖励}=\text{团队实际收益}-\text{如果我没贡献时团队会怎样} \]

如果差分奖励大,说明我的行为对团队有正贡献;如果差分奖励小或负,说明我的行为没帮上忙甚至拖后腿。

image.png

但是扩展到多智能体会有相当大的困难:联合动作空间会指数增长。若每个 agent 有动作空间 \(A_i\),联合动作空间是:

\[ A_1\times A_2\times\cdots\times A_n \]

如果每个 agent 有 k 个动作,n 个 agent 的联合动作数就是:

\[ k^n \]

这会导致 Q 表、策略搜索、联合动作评估都很难。

不仅是动作空间,联合动作空间过大会导致搜索成本增加,若智能体在状态中可观测特征维度增加,状态空间也会上升。

Centralized Value Function:集中式价值函数

训练时使用全局信息,集中式值函数包含所有 agent 的状态和动作信息;Q 值更新中使用联合动作信息。

\[ Q_{\text{tot}}(s,a_1,\dots,a_n) \]

或者对每个 agent 写成集中 critic:

\[ Q_i(s,a_1,\dots,a_n) \]

训练时,critic 可以看到全局状态和联合动作,因此可以更准确评估每个 agent 的行为。执行时,每个 agent 仍然只使用自己的局部观测:

\[ \pi_i(a_i|o_i) \]

也就是集中训练、分散执行。

集中式价值函数的好处是缓解非平稳性和信度分配。因为训练时 critic 能看到其他 agent 的动作,不会把其他 agent 的变化完全当作环境噪声;同时也能更好估计某个 agent 动作在联合动作中的贡献。缺点是训练复杂度更高,且需要全局信息。

11 深度多智能体强化学习 #

独立深度 Q 网络:IDQN #

它和 DQN 几乎一样,只是每个智能体都有自己的 Q 网络:

\[ Q_i(o_i,a_i;\theta_i) \]

其中 \(o_i\) 是第 i 个智能体自己的观测,\(a_i\) 是自己的动作。每个 agent 根据自己的 Q 网络选动作,并用经验回放和目标网络更新参数。

普通 DQN 的 target 是:

\[ y=r+\gamma \max_{a'}Q(s',a';\theta^-) \]

IDQN 中第 iii 个 agent 的 target 类似:

\[ y_i=r_i+\gamma \max_{a_i'}Q_i(o_i',a_i';\theta_i^-) \]

然后最小化:

\[ \left(y_i-Q_i(o_i,a_i;\theta_i)\right)^2 \]

它虽然和 DQN 几乎相同,但在 MARL 中所有智能体策略同步变化,训练过程可能出现不稳定性。

IDQN 的经验回放池里存的是过去策略组合产生的数据:

\[ (o_i,a_i,r_i,o_i') \]

但在训练时,其他 agent 的策略已经变了。对单智能体 DQN 来说,经验回放可以打乱样本、提高稳定性;但在 MARL 里,经验回放可能包含“过期”的交互数据,因为当时队友或对手的策略和现在不一样。所以 IDQN 虽然简单,但不能根本解决深度 MARL 的非平稳问题。

image.png

独立优势演员-评论家:IA2C #

它是把单智能体 A2C 独立应用到每个 agent 上。每个智能体有自己的 actor:

\[ \pi_i(a_i|o_i;\phi_i) \]

也有自己的 critic:

\[ V_i(o_i;\theta_i) \]

更新时使用自己的优势估计:

\[ A_i=r_i+\gamma V_i(o_i')-V_i(o_i) \]

actor 更新大致是:

\[ \nabla_{\phi_i}J_i=\mathbb E[A_i\nabla_{\phi_i}\log\pi_i(a_i|o_i)] \]

critic 则最小化 TD error 的平方。

IA2C 的问题和 IDQN 类似。每个 agent 的 critic 只看自己的观测,不知道其他 agent 的动作和状态,所以它很难准确判断当前回报到底是因为自己动作好,还是队友动作好,或者对手犯错。换句话说,独立 critic 无法解决信度分配,也无法充分缓解非平稳性。

image.png

CTDE:集中式训练、分散式执行 #

\[ \text{Centralized Training, Decentralized Execution} \]

CTDE 的思想是:训练阶段可以使用全局信息,例如全局状态、所有 agent 的动作、其他 agent 的观测、历史信息等;但执行阶段,每个 agent 只能根据自己的局部观测独立选择动作。

也就是说,训练时 critic 可以是集中式的:

\[ Q_i(s,a_1,\dots,a_n) \]

或者:

\[ V_i(h_i,z) \]

其中 z 表示全局信息或其他 agent 信息;但执行时 actor 必须是分散的:

\[ \pi_i(a_i|o_i) \]

这样做的好处是:训练时利用更多信息解决非平稳性和信度分配;执行时不依赖全局通信,符合真实多智能体部署要求。

多智能体策略梯度定理 #

单智能体策略梯度是:

\[ \nabla_\phi J(\phi)\propto\sum_sPr(s|\pi)\sum_aQ^\pi(s,a)\nabla_\phi\pi(a|s;\phi) \]\[ \nabla_\phi J(\phi)=\mathbb E[Q^\pi(s,a)\nabla_\phi\log\pi(a|s;\phi)] \]

这个定理若想适用于多智能体场景则需要微调。因为在 MARL 中,一个智能体的回报不仅取决于自身策略 \(\pi_i\),还受其他智能体策略 \(\pi_{-i}\) 影响。

多智能体策略梯度的形式:更新 agent i 的策略时,优势或 Q 值应当考虑联合动作,特别是其他 agent 的动作 \(a_{-i}\)。

\[ \nabla_{\phi_i}J_i=\mathbb E[Q_i^\pi(s,a_i,a_{-i})\nabla_{\phi_i}\log\pi_i(a_i|\tau_i;\phi_i)] \]

其中 \(\tau_i\) 或 \(h_i\) 表示 agent i 的局部历史信息。

集中式评论家:Centralized Critic #

核心思想是:在 Actor-Critic 算法中,执行阶段只使用策略/演员,而训练阶段使用评论家。因此评论家可以基于其他信息组合成集中式信息进行条件化,同时不影响分散式执行。其他信息包括其他智能体的观测 \(o_{-i}\)、其他智能体行为 \(a_{-i}\)、其他智能体观测历史 \(h_{-i}\) 等。

Actor 是执行时真正要用的东西,所以它必须只依赖本地信息:

\[ a_i\sim \pi_i(a_i|o_i) \]

但 critic 只在训练时使用,可以看到更多信息:

\[ Q_i(s,a_1,\dots,a_n)\quad 或 \quad V_i(h_i,z;\theta_i) \]

其中 z 可以包含全局状态、队友动作、对手动作、联合观测等。

image.png

集中式 A2C:训练用全局信息,执行仍独立 #

image.png

集中式 critic 看到联合动作或其他 agent 信息后,价值估计可以条件化在这些信息上,这时,其他 agent 的动作不再是隐藏变量,而是 critic 的输入。对训练来说,这会让学习目标更稳定。

Pareto Actor-Critic 帕累托演员-评论家均衡选择法 #

Pareto-AC 的核心思想是:不只是学一个普通 critic,而是让 critic 帮助智能体选择“帕累托更优的均衡”。

但和普通 A2C 不同的是,它假设在训练时,智能体会认为其他智能体选择的是对自己最有利的策略:

\[ \pi^+_{-i} \in \arg\max_{\pi_{-i}} U_i(\pi_i,\pi_{-i}) \]

固定智能体 i 自己的策略 \(\pi_i\),假设其他智能体会选择让智能体 i 收益最大的策略组合。

然后通过集中式 critic 计算:

\[ \pi^+_{-i} \in \arg\max_{a_{-i}} Q(h_i^t,z^t,\langle a_i^t,a_{-i}\rangle) \]

critic 接收当前信息和联合动作,然后找出对当前智能体最有利的其他智能体动作 \(a_{-i}\)。

最后的损失函数本质上还是策略梯度:

\[ \mathcal L(\phi_i)=-\mathbb E_{a_i^t\sim\pi_i,\ a_{-i}^t\sim\pi_{-i}^+}\left[\log \pi(a_i^t|h_i^t;\phi_i)\left(Q^{\pi^+}(h_i^t,z^t,\langle a_i^t,a_{-i}^t\rangle;\theta_i^q)-V^{\pi^+}(h_i^t,z^t;\theta_i^v)\right)\right] \]

反事实多智能体策略梯度:COMA 的核心思想 #

全称:\(\textbf{Counterfactual Multi-Agent Policy Gradients}\)

核心问题是:我们希望评价 agent i 的动作 \(a_i\) 到底比它在当前状态下可能采取的其他动作好多少。于是定义反事实优势:

\[ A_i(s,\mathbf a)=Q(s,\mathbf a)-\sum_{a_i'}\pi_i(a_i'|\tau_i)Q(s,(a_i',a_{-i})) \]

\(Q(s,\mathbf a)\) 表示当前真实联合动作的团队价值。

\(\sum_{a_i'}\pi_i(a_i'|\tau_i)Q(s,(a_i',a_{-i}))\) 表示其他 agent 的动作 \(a_{-i}\) 固定不变,只把 agent i 的动作替换成它自己策略下可能动作时的平均价值。这就是一个反事实 baseline。

如果这个值大,说明 agent i 的动作对团队结果有正贡献;如果小,说明它这个动作不如自己平均水平。

COMA 的 actor 更新就是:

\[ \nabla_{\phi_i}J=\mathbb E[A_i(s,\mathbf a)\nabla_{\phi_i}\log\pi_i(a_i|\tau_i)] \]

它是 CTDE 的典型算法:critic 是集中式的,能评估 \(Q(s,\mathbf a)\);actor 是分散式的,只根据局部历史选择动作。

集中式价值函数与 VDN #

全称:Value-Decomposition Networks

VDN 的核心假设是:团队总价值可以分解成各个 agent 局部价值之和:

\[ Q_{\text{tot}}(\boldsymbol{\tau},\mathbf a)=\sum_{i=1}^n Q_i(\tau_i,a_i) \]

这里 \(\tau_i\) 是第 i 个 agent 的局部观测历史,\(a_i\) 是它的动作。

\[ \arg\max_{\mathbf a}Q_{\text{tot}}(\boldsymbol{\tau},\mathbf a)=\left(\arg\max_{a_1}Q_1(\tau_1,a_1),\dots,\arg\max_{a_n}Q_n(\tau_n,a_n)\right) \]

集中训练出来的总价值函数可以自然支持分散执行。

image.png

IGM 条件:为什么价值分解必须满足一致性? #

全称:\(Individual-Global-Max\)

它问的是:如何保证基于智能体个体效用函数的分散动作选择,会导向集中式评价函数的最优联合动作?

\[ \arg\max_{\mathbf a}Q_{\text{tot}}(\boldsymbol{\tau},\mathbf a)=\left(\arg\max_{a_1}Q_1(\tau_1,a_1),\dots,\arg\max_{a_n}Q_n(\tau_n,a_n)\right) \]

左边是集中式最优:如果一个中央控制器能看到所有信息,它会选择哪个联合动作。

右边是分散式最优:每个 agent 只根据自己的 \(Q_i\) 独立选动作。

所以价值分解的核心不是随便把 \(Q_{\text{tot}}\) 拆成几个 \(Q_i\),而是要保证拆分后个体贪心和整体贪心一致。

保持 IGM 特性有双重重要意义:

  1. 当所有智能体基于各自效用函数分散选择最大化动作时,产生的联合动作将自动实现集中式价值函数最大化→ 确保有效的分散式执行
  2. 针对集中式价值函数的贪婪联合动作,可通过各智能体基于个体效用函数独立选择贪婪动作来高效获得→ 实现高效的集中式训练

VDN 的局限:线性可分解太强 #

VDN 的假设很简单,但表达能力有限。

在一些简单合作任务里,这够用;但很多多智能体任务中,agent 之间有强交互。比如两个 agent 同时按按钮才开门,一个人按没有用。这种价值不是简单相加就能表示的。

也就是说,VDN 难以表达“组合效应”。有些奖励来自动作之间的协同,而不是每个个体价值简单叠加。于是就需要更强的分解方法:QMIX。

QMIX:单调价值分解 #

QMIX 的核心思想是:不要求总价值是个体价值的线性和,而是用一个 mixing network 把个体 Q 值混合成总 Q:

\[ Q_{\text{tot}}=f_{\text{mix}}(Q_1,Q_2,\dots,Q_n,s) \]

但它要求一个关键单调性条件:

\[ \frac{\partial Q_{\text{tot}}}{\partial Q_i}\ge 0,\quad \forall i \]

这个条件的含义是:如果某个 agent 的局部 Q 值 \(Q_i\) 增大,总 Q 不会下降。

为什么要这个单调性?因为它保证 IGM。只要 \(Q_{\text{tot}}\) 对每个 \(Q_i\) 都单调递增,那么让每个 agent 独立选择最大 \(Q_i\) 的动作,也会使 \(Q_{\text{tot}}\) 最大。

QMIX 的目标是最小化 TD loss:

\[ \mathcal L(\theta)=\mathbb E\left[\left(y_{\text{tot}}-Q_{\text{tot}}(\boldsymbol{\tau},\mathbf a;\theta)\right)^2\right] \]

其中 target 是:

\[ y_{\text{tot}}=r+\gamma\max_{\mathbf a'}Q_{\text{tot}}(\boldsymbol{\tau}',\mathbf a';\theta^-) \]

由于 QMIX 满足单调性,\(\max_{\mathbf a'}Q_{\text{tot}}\) 可以通过每个 agent 分别取:

\[ a_i'=\arg\max_{a_i'}Q_i(\tau_i',a_i') \]

来实现。这就避免了枚举联合动作空间。

\[ \begin{array}{c|ccc} & \text{Linear game} & \text{Monotonic game} & \text{Climbing game}\\\hline\text{Linearly decomposable} & \checkmark & \times & \times\\\text{Monotonically decomposable} & \checkmark & \checkmark & \times\end{array} \]

VDN 假设团队价值能线性加和,所以只能处理线性可分解博弈;QMIX 放宽到单调非线性混合,所以能处理单调可分解博弈。但攀爬博弈中动作价值强烈依赖其他智能体是否配合,不能满足线性或单调分解假设,因此 VDN 和 QMIX 都无法准确表示真实集中式价值函数,容易收敛到次优协调策略。

基于极化算子的策略梯度 #

在合作任务中,某些最优动作组合需要精确配合,但训练早期由于其他 agent 没配合好,这些动作经常获得低回报,从而被低估。所以依然存在RO问题。

基于极化算子的策略梯度 是一种处理RO的思路。

通过极化操作改变价值 landscape,让全局最优协作点更突出。

image.png

RO 的根源是局部平均奖励掩盖全局最优协作。因此极化算子的目标是改变策略梯度所看到的优化信号,让全局最优区域更容易被强化,而局部次优区域不要过早吸引策略收敛。

Lenient-DQN:用深度方法延续宽容学习 #

普通 DQN 用经验回放训练,但在多智能体合作中,一条低回报经验不一定说明当前 agent 动作差,可能只是当时队友没有配合。因此 Lenient-DQN 在更新时,如果 TD error 是负的,不一定马上更新,而是以某个宽容概率决定是否忽略负样本。

\[ \delta=y-Q(o,a) \]

如果:

\[ \delta\gt 0 \]

通常正常更新,因为正反馈说明这个动作可能有潜力。

如果:

\[ \delta\lt 0 \]

则根据温度决定是否更新。温度高时,宽容度高,更可能忽略负更新;温度逐渐衰减后,算法变得严格。

image.png
image.png
image.png

总结来说算法流程是:

环境给状态:

\[ s \]

AutoEncoder 把状态编码成:

\[ \phi(s) \]

哈希表根据 \((\phi(s),a)\) 查出温度:

\[ T(\phi(s),a) \]

用温度决定两件事:

第一,决定探索强度。温度高,更多探索;温度低,更多利用。

第二,决定对负 TD 误差的宽容程度。温度高,负更新更可能被忽略;温度低,负更新更可能被接受。

12 LLM-RL #

大语言模型训练通常先经历预训练,然后进行监督微调,也就是 SFT。SFT 的形式很像普通监督学习:给定 prompt 和人工写好的标准回答,让模型学习在这个 prompt 下生成这个 answer。它本质上还是 token 级别的最大似然训练:

\[ \max_\theta \sum_t \log \pi_\theta(y_t|x,y_{\lt t}) \]

但它有三个局限:

  1. 模仿而非思考: SFT依赖下一个token预测,模型本质上是在模仿标注者的写作风格,而非理解逻辑
  2. 泛化瓶颈: 模型难以处理未见过的分布,容易产生幻觉
  3. 缺乏反馈: 训练过程中只有标准答案,没有错误反馈,模型无法学习如何自我纠错

可以把 LLM 的强化学习建模成一个 MDP 问题:

Agent = LLM,

状态 s 是当前输入的 prompt 和已经生成的 context,

动作 a 是预测下一个 token,

策略是语言模型本身:\(\pi_\theta(y_t|x,y_{\lt t})\)

奖励 R 是对生成内容好坏的评价。目标是最大化累积奖励:\(\max_\theta \mathbb E_{\pi_\theta}\left[\sum_t \gamma^t R_t\right]\)

RLHF:基于人类反馈的对齐 #

Reinforcement Learning from Human Feedback:将人的价值观、偏好和安全准则转化为量化奖励模型。

第一阶段 是 SFT,基础训练,使模型具备基本回复能力。这个阶段主要让模型会听指令、会按格式回答、不会完全乱说。

第二阶段 是训练 Reward Model,也就是奖励模型。做法通常是:给同一个 prompt,让模型生成多个回答,然后让人类标注者比较哪个回答更好。比如回答 A 比回答 B 更有帮助、更安全、更自然。奖励模型学习这些偏好,最终能够给一个回答打分:

\[ R_\phi(x,y) \]

人类直接给回答打绝对分数很难,因为不同标注者尺度不同,但让人比较两个回答哪个更好,往往更稳定,所以 RLHF 常用 pairwise preference。

第三阶段 是用 PPO 等强化学习算法优化语言模型。模型生成回答,奖励模型给分,PPO 调整模型参数,使模型生成更高分的回答。

但 RL 也存在数据工程问题,比如标注一致性与鸿沟

标注员一致性度量: 比如 Fleiss’ Kappa 或 Cohen’s Kappa,用来量化多名标注员对模型输出偏好比较的一致性。如果 kappa 小于 0.4,说明数据存在大量噪声,训练出来的 reward model 可能发生严重方向偏差。

数据鸿沟和局限: 成本高、速度慢;标注者主观性和文化差异会导致奖励模型不一致;模型还可能学会 reward hacking,也就是通过迎合奖励模型的表面偏好获得高分,而不是真正解决问题。

RLAIF:基于 AI 反馈的强化学习 #

核心理念是使用 Teacher 模型对 Student 模型的回答进行评分;宪法 AI 给 Teacher 模型一份原则清单,让其基于规则打分,而非主观感受;优势是实现全自动化流水线,成本降低 90% 以上,支持海量数据对齐。

RLAIF 的优势很明显: 降低人工标注成本,提高训练扩展能力,加快迭代速度,并且可以更容易注入规则、安全目标和原则清单。

“如何用 LLM 自动产生偏好标签”的流程大致是:把任务说明、原文和两个候选总结一起输入给 LLM;让 LLM 分析两个总结哪个更准确、哪个更连贯、哪个覆盖信息更完整;然后生成理由,最后给两个总结打偏好分数,例如 Summary 1 是 0.6,Summary 2 是 0.4

但 RLAIF 也有其局限性: 它降低了人类标注成本,但引入了 AI 评审模型本身的偏差。如果 teacher model 的价值判断有问题,student model 就会学到这些偏差。如果宪法原则写得不完整,模型就可能在原则没有覆盖的情况下做出错误判断。

还有一个问题是“自我强化”。如果 AI labeler 和 student model 来自相似模型家族,它们可能共享同样的偏差。比如 teacher model 偏好某种语言风格,student model 就会被训练得更像这种风格,但不一定更真实、更有帮助。

所以 RLAIF 更适合用来规模化、自动化对齐,但最终仍然需要人类对原则、评估和关键安全行为进行把关。

PPO 在 LLM-RL 中的应用 #

PPO 维护 4 个模型:

Actor 是正在训练的语言模型,也就是当前策略:

\[ \pi_\theta(y|x) \]

Reference Model 是参考模型,通常是 SFT 后冻结的模型:

\[ \pi_{\text{ref}}(y|x) \]

它的作用是约束 Actor 不要离原来的语言能力太远。否则强化学习可能为了追求 reward model 高分,破坏语言流畅性或产生奇怪输出。

Reward Model 是奖励模型:

\[ R_\phi(x,y) \]

Critic / Value Model 是价值模型:

\[ V_\psi(s_t) \]

它估计当前生成到某一步时,未来还能得到多少奖励,用来计算 advantage,降低策略梯度方差。

PPO 会加入 KL 惩罚:

\[ \hat A_t=\left(R_{\text{score}}-\beta KL(\pi,\pi_{\text{ref}})+\gamma V(s_{t+1})\right)-V(s_t) \]

PPO 的 clipped objective 是:

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

通常将 \(\epsilon\) 设置为 0.2

但PPO算法也具有以下痛点:显存占用极高,训练成本非常高,工程实现复杂,训练稳定性要求高,普通团队难以承担

image.png

DPO 在 LLM-RL 中的应用 #

DPO 的想法是:既然我们的偏好数据本来就是这种形式:

\[ (x,\ y_w,\ y_l) \]

其中:

\[ y_w=\text{chosen / winner / 好答案} \]\[ y_l=\text{rejected / loser / 坏答案} \]

那为什么还要绕一圈训练 Reward Model 呢?我们可以直接让模型学会:

\[ P(y_w|x) \gt P(y_l|x) \]

所以 DPO 不需要显式 reward model,也不需要 critic,它直接从偏好对里构造 loss。

DPO 只需要两个模型,一个 Actor model,一个 Reference Model

\[ L_{\text{DPO}}=-\log \sigma\left(\beta \log \frac{\pi_\theta(y_w)}{\pi_{\text{ref}}(y_w)}-\beta \log \frac{\pi_\theta(y_l)}{\pi_{\text{ref}}(y_l)}\right) \]

DPO 希望:

\[ \log \frac{\pi_\theta(y_w)}{\pi_{\text{ref}}(y_w)}\gt \log \frac{\pi_\theta(y_l)}{\pi_{\text{ref}}(y_l)} \]

即好答案相对于参考模型的提升量,要大于坏答案相对于参考模型的提升量。

其中 \(\sigma(z)=\frac{1}{1+e^{-z}}\) ,\(-\log\sigma(\cdot)\) 代表好答案赢得越明显,Loss 越小;坏答案越占优势,Loss 越大。

image.png

RLVR:基于可验证规则反馈 #

Reinforcement Learning from Verifiable Rewards:对于一些任务,奖励不一定要来自人类偏好或 AI 偏好,而可以来自可验证规则。比如数学题答案是否正确、代码是否通过单元测试、逻辑题是否满足约束、格式是否符合要求。

\[ R(x,y)=\begin{cases}1,& \text{答案通过验证}\\0,& \text{答案未通过验证}\end{cases} \]

或者更细一点,按测试通过比例给奖励:

\[ R(x,y)=\frac{\#\text{passed tests}}{\#\text{all tests}} \]

RLVR 的优势是奖励更客观,不需要人类偏好标注,也不需要训练一个可能被 reward hacking 的主观 reward model。比如代码生成任务中,程序能否通过测试是明确的;数学任务中,最终答案能否被验证也比较明确。

但 RLVR 的局限是适用范围有限。很多开放式问答、写作、对话、安全性判断,难以用简单规则完全验证。它更适合数学、代码、形式化推理、工具调用、结构化任务等有明确对错标准的场景。

传统观点认为RLVR只是让模型更容易采样到正确答案,但其实他不仅能提高采样效率,还能强化正确推理路径

GRPO #

Group Relative Policy Optimization:让同一个模型对同一个问题一次生成多份答案,然后在这一组答案内部比较谁更好,谁更差,再用这个“组内相对好坏”来更新模型。

模型一次生成 G 个答案:

\[ o_1,o_2,\dots,o_G \]

然后系统给每个回答打分:

\[ r_1,r_2,\dots,r_G \]

如果是数学题、代码题,可以用规则打分,如果是开放题则可以用奖励模型、评判模型或者人工偏好给分

然后做组内归一化:

\[ A_i=\frac{r_i-\operatorname{mean}(r_{\text{group}})}{\operatorname{std}(r_{\text{group}})+\epsilon} \]

GRPO的目标函数是:

\[ L_{\text{GRPO}}=\frac{1}{G}\sum_{i=1}^{G}\left[\min\left(\frac{\pi_\theta(o_i)}{\pi_{\theta_{\text{old}}}(o_i)}A_i,\operatorname{clip}(\cdots)A_i\right)-\beta KL(\pi_\theta||\pi_{\text{ref}})\right] \]

GRPO 总结:

  1. 省显存,不需要 Critic 和 Reward Model
  2. 基线更稳,依据当下生成的组平均分,训练更稳定
  3. 采样成本高,需要针对同一输入采样多个候选回答,显著增加推理采样成本,训练时间可能随组大小增长而明显上升
  4. 对冷启动要求高,对初始模型能力具有较强依赖。如果初始模型无法生成有效答案,则组内样本奖励差异不足,优势估计难以提供有效学习信号