从这一节开始进入 Multi-Agent Reinforcement Learning,也就是多智能体强化学习。
在单智能体 RL 中,我们通常只关心一个 agent 的 return:
$$J(\pi) = \mathbb{E}_{\pi}[G_t]$$但是在多智能体场景下,环境中同时存在多个 agent,每个 agent 的收益不仅取决于自己的动作,也取决于其他 agent 的动作。也就是说,问题从“一个 agent 怎么最大化自己的回报”,变成了“多个 agent 在相互影响时会形成什么结果”。
所以在正式进入 MARL 算法之前,需要先补充一些博弈论中的基本概念。
前置准备
布雷斯悖论
先看一个很经典的例子:布雷斯悖论(Braess’s Paradox)。
假设有 $4000$ 辆车要从 Start 开到 End,中间有两个途径点 $A$ 和 $B$,一开始有两条路线可以选:
$$S \rightarrow A \rightarrow E$$$$S \rightarrow B \rightarrow E$$每条边的通行时间如下,其中 $t$ 表示这条边上的车辆数:
| 路段 | 时间 |
|---|---|
| $S \rightarrow A$ | $\frac{t}{100}$ |
| $A \rightarrow E$ | $45$ |
| $S \rightarrow B$ | $45$ |
| $B \rightarrow E$ | $\frac{t}{100}$ |
设选择 $S \rightarrow A \rightarrow E$ 的车辆数是 $x$,那么选择 $S \rightarrow B \rightarrow E$ 的车辆数就是 $4000-x$。
两条路线的时间分别是
$$T_{SAE}(x) = \frac{x}{100} + 45$$$$T_{SBE}(x) = 45 + \frac{4000-x}{100}$$如果想让两条路都没有单方面换路的动力,就需要两条路时间相同:
$$\frac{x}{100} + 45 = 45 + \frac{4000-x}{100}$$解得
$$x = 2000$$所以最优分流是两条路线各走 $2000$ 辆车,此时每辆车的通行时间都是
$$T = \frac{2000}{100} + 45 = 65$$这个结果很合理:一半车走上面,一半车走下面,大家的时间都是 $65$。
现在加入一条新的 shortcut:
$$A \rightarrow B$$并且这条路不需要时间:
$$T_{AB} = 0$$看起来这应该只会让情况更好,因为每辆车多了一个选择。但是如果每辆车都只按照自己的局部最优来选,结果会变差。
首先,从 $S$ 出发时:
- 走 $S \rightarrow A$ 的时间是 $\frac{t}{100}$,最多也就是 $\frac{4000}{100}=40$
- 走 $S \rightarrow B$ 的时间固定是 $45$
所以每辆车都会更倾向于先走
$$S \rightarrow A$$到达 $A$ 之后:
- 直接走 $A \rightarrow E$ 的时间固定是 $45$
- 走 shortcut 到 $B$,再走 $B \rightarrow E$ 的时间是 $0 + \frac{t}{100}$,最多也是 $40$
所以每辆车又会更倾向于走
$$A \rightarrow B \rightarrow E$$最后所有车都会选择新路线
$$S \rightarrow A \rightarrow B \rightarrow E$$这时 $S \rightarrow A$ 上有 $4000$ 辆车,$B \rightarrow E$ 上也有 $4000$ 辆车,所以每辆车的时间变成
$$T = \frac{4000}{100} + 0 + \frac{4000}{100} = 80$$也就是说,加入一条免费的 shortcut 之后,原来每辆车只需要 $65$,现在反而变成了 $80$。
这就是布雷斯悖论:在多智能体系统中,给每个个体增加一个看似更好的选择,并不一定会提升整体效率。因为每个个体都在做局部最优决策,最后形成的均衡结果可能比原来的系统更差。
博弈结果的评判标准
假设有两个 agent,分别选择动作 $a_1$ 和 $a_2$,收益函数为
$$u_1(a_1,a_2), \quad u_2(a_1,a_2)$$不同的评判标准对应不同的“什么结果是好结果”。
| 标准 | 关注点 | 直觉 |
|---|---|---|
| 社会福利 | 所有 agent 的总收益 | 整体收益最大 |
| 帕累托优 | 是否还能让某些人更好且不让别人更差 | 没有免费的改进空间 |
| 纳什均衡 | 单个 agent 是否有动力单方面改变策略 | 谁都不想自己换动作 |
| 优超 | 某个动作是否无论对方怎么做都更好 | 不看对方,直接选更占优的动作 |
社会福利
社会福利(Social Welfare)关注所有 agent 的收益总和:
$$W(a_1,a_2) = \sum_i u_i(a_1,a_2)$$对于两个 agent 来说就是
$$ W(a_1,a_2) = u_1(a_1,a_2) + u_2(a_1,a_2) $$如果只从社会福利角度评价,那么最好的 joint action 是
$$(a_1^*,a_2^*) = \arg\max_{a_1,a_2} W(a_1,a_2)$$这个标准不关心收益怎么分配,只关心整体加起来是不是最大。
帕累托优
如果一个结果 $x$ 相比另一个结果 $y$,满足:
- 对所有 agent 都不更差
- 至少让一个 agent 变得更好
那么就说 $x$ 帕累托优于 $y$。
写成公式就是
$$u_i(x) \geq u_i(y), \quad \forall i$$并且存在某个 agent $j$ 满足
$$u_j(x) > u_j(y)$$如果一个结果已经不存在任何其他结果能帕累托优于它,那么这个结果就是帕累托最优(Pareto Optimal)的。
需要注意的是,帕累托最优并不意味着总收益最大,也不意味着公平。它只表示:想让某个人更好,就一定会让至少另一个人更差
社会福利是帕累托最优的子集
纳什均衡
纳什均衡(Nash Equilibrium)关注的是稳定性。
如果在一个 joint action $(a_1^*,a_2^*)$ 下,任意一个 agent 在其他 agent 动作不变时,都无法通过单方面改变自己的动作获得更高收益,那么这个 joint action 就是纳什均衡。
对于两个 agent,可以写成
$$u_1(a_1^*,a_2^*) \geq u_1(a_1,a_2^*), \quad \forall a_1$$$$u_2(a_1^*,a_2^*) \geq u_2(a_1^*,a_2), \quad \forall a_2$$也就是说,在纳什均衡处,每个 agent 的动作都是对其他 agent 当前动作的 best response
当我们定义最优反应后,纳什均衡解意味着所有 agent 都在最优反应上
优超
优超(Dominance)关注的是动作之间的比较。
如果对 agent $i$ 来说,动作 $a_i$ 无论其他 agent 选择什么动作,都至少不比动作 $a_i'$ 差,并且在某些情况下更好,那么就说 $a_i$ 弱优超 $a_i'$:
$$u_i(a_i,a_{-i}) \geq u_i(a_i',a_{-i}), \quad \forall a_{-i}$$并且存在某个 $a_{-i}$ 满足
$$u_i(a_i,a_{-i}) > u_i(a_i',a_{-i})$$如果上面的不等式对所有 $a_{-i}$ 都严格成立,那么就是严格优超:
$$u_i(a_i,a_{-i}) > u_i(a_i',a_{-i}), \quad \forall a_{-i}$$直觉上,优超策略就是“不管别人怎么选,我选这个都更好”
如果所有智能体均存在优超,那么优超策略的交集就是一个纳什均衡解
囚徒困境
囚徒困境是最经典的双人博弈问题。两个 agent 都有两个动作:
| 动作 | 含义 |
|---|---|
| C | Cooperate,合作 |
| D | Defect,背叛 |
使用一个常见的收益矩阵:
| Agent 2: C | Agent 2: D | |
|---|---|---|
| Agent 1: C | $(3,3)$ | $(0,5)$ |
| Agent 1: D | $(5,0)$ | $(1,1)$ |
括号中第一个数是 Agent 1 的收益,第二个数是 Agent 2 的收益。
从社会福利看
计算每个结果的总收益:
| 结果 | 收益 | 社会福利 |
|---|---|---|
| $(C,C)$ | $(3,3)$ | $6$ |
| $(C,D)$ | $(0,5)$ | $5$ |
| $(D,C)$ | $(5,0)$ | $5$ |
| $(D,D)$ | $(1,1)$ | $2$ |
所以从社会福利最大化的角度看,最好的结果是
$$(C,C)$$也就是两个 agent 都合作。
从帕累托优看
$(D,D)$ 的收益是 $(1,1)$,而 $(C,C)$ 的收益是 $(3,3)$。
因为
$$3 > 1, \quad 3 > 1$$所以 $(C,C)$ 帕累托优于 $(D,D)$。
但是 $(C,C)$、$(C,D)$ 和 $(D,C)$ 都是帕累托最优的。比如从 $(C,C)$ 变成 $(D,C)$,Agent 1 的收益从 $3$ 变成 $5$,但是 Agent 2 的收益从 $3$ 变成 $0$,这不是帕累托改进。
因此帕累托视角下,$(D,D)$ 明显不是好结果,因为它可以被 $(C,C)$ 同时改善。
从纳什均衡看
如果 Agent 2 选择 $C$,Agent 1 选择 $D$ 的收益是 $5$,选择 $C$ 的收益是 $3$,所以 Agent 1 会选 $D$。
如果 Agent 2 选择 $D$,Agent 1 选择 $D$ 的收益是 $1$,选择 $C$ 的收益是 $0$,所以 Agent 1 还是会选 $D$。
对 Agent 2 也是完全对称的。
所以 $(D,D)$ 是纳什均衡,因为在这个结果下,任何一方单独改成 $C$ 都会让自己的收益从 $1$ 变成 $0$。
$$ (D,D) \quad \text{是囚徒困境中的唯一纳什均衡} $$这里就出现了一个很重要的问题:纳什均衡不一定是社会福利最大的结果,也不一定是帕累托最优的结果。
从优超看
对 Agent 1 来说:
- 如果 Agent 2 选择 $C$,那么 $D$ 的收益 $5$ 大于 $C$ 的收益 $3$
- 如果 Agent 2 选择 $D$,那么 $D$ 的收益 $1$ 大于 $C$ 的收益 $0$
所以 $D$ 严格优超 $C$。
对 Agent 2 来说也是一样,$D$ 严格优超 $C$。
因此从优超策略的角度看,两个 agent 都会选择 $D$,最后得到
$$ (D,D) $$这也是囚徒困境的核心矛盾:个体理性会把系统推向整体更差的结果。
纯策略纳什均衡和混合策略纳什均衡
前面囚徒困境中的 $(D,D)$ 是一个纯策略纳什均衡。
纯策略(Pure Strategy)指的是 agent 直接选择某一个确定动作。比如在石头剪刀布中,直接选择“石头”就是一个纯策略。
如果一个纯策略组合 $(a_1^*,a_2^*)$ 满足任意 agent 都不能通过单方面改变动作获得更高收益,那么它就是纯策略纳什均衡。
但是不是所有博弈都有纯策略纳什均衡。一个典型例子就是石头剪刀布。
石头剪刀布
石头剪刀布的规则是:
| 石头 | 剪刀 | 布 | |
|---|---|---|---|
| 石头 | $0$ | $1$ | $-1$ |
| 剪刀 | $-1$ | $0$ | $1$ |
| 布 | $1$ | $-1$ | $0$ |
上表表示 Agent 1 的收益,Agent 2 的收益是它的相反数,所以这是一个 zero-sum game。
石头剪刀布没有纯策略纳什均衡。原因很简单:
- 如果双方都出石头,那么任意一方都可以改成布来赢
- 如果一方赢了,输的一方总可以改成克制对方的动作
- 如果双方平局,任意一方也可以改成能赢的动作
也就是说,任何确定的动作组合都不是稳定的。
这时就需要引入混合策略(Mixed Strategy)。
混合策略不是直接选择一个确定动作,而是在动作上定义一个概率分布:
$$ \pi_i(a_i) \in \Delta(\mathcal{A}_i) $$对于石头剪刀布,Agent 可以用下面的策略:
$$ \pi(\text{石头}) = \frac{1}{3}, \quad \pi(\text{剪刀}) = \frac{1}{3}, \quad \pi(\text{布}) = \frac{1}{3} $$如果两个 agent 都使用这个均匀随机策略,那么任意一方改成固定出某个动作,期望收益都还是 $0$:
$$ \mathbb{E}[u(\text{石头})] = \frac{1}{3}\cdot 0 + \frac{1}{3}\cdot 1 + \frac{1}{3}\cdot (-1) = 0 $$同理,固定出剪刀或布的期望收益也都是 $0$。
因此没有任何一方能通过单方面改变自己的策略获得更高期望收益,所以
$$ \left( \left(\frac{1}{3},\frac{1}{3},\frac{1}{3}\right), \left(\frac{1}{3},\frac{1}{3},\frac{1}{3}\right) \right) $$是石头剪刀布的混合策略纳什均衡。
Stackelberg 均衡
前面的纳什均衡默认所有 agent 是同时做决策的。而 Stackelberg Game 中存在先后顺序:
- Leader 先选择策略
- Follower 观察到 Leader 的策略后,再选择自己的 best response
因此 Stackelberg 均衡关注的是:Leader 在知道 Follower 会做最优回应的前提下,应该提前承诺什么策略。
设 Leader 的策略为 $a_L$,Follower 的 best response 为
$$ BR_F(a_L) = \arg\max_{a_F} u_F(a_L,a_F) $$那么 Leader 要解的问题是
$$ a_L^* = \arg\max_{a_L} u_L(a_L, BR_F(a_L)) $$最终得到的策略组合
$$ (a_L^*, BR_F(a_L^*)) $$就是 Stackelberg 均衡。
直观来说,Stackelberg 均衡不是“大家同时选完后谁都不想改”,而是“Leader 先承诺,Follower 再最优回应,Leader 提前把这个回应也考虑进去”。
均衡学习
在单智能体 Q-learning 中,下一状态的价值是通过对自己的 action 取最大值得到的:
$$ V(s') = \max_{a'} Q(s',a') $$因此标准 Q-learning 的更新可以写成
$$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_t + \gamma \textcolor{blue}{\max_{a'} Q(s_{t+1},a')} - Q(s_t,a_t) \right] $$但是在多智能体场景中,下一状态的价值不能只看自己的动作,因为其他 agent 的动作也会影响收益。也就是说,$V(s')$ 不再只是一个简单的 $\max_a Q(s',a)$,而是需要根据某种均衡概念,从当前状态对应的 stage game 中计算出来。
这类方法可以统一写成
$$ Q_i(s_t,\mathbf{a}_t) \leftarrow Q_i(s_t,\mathbf{a}_t) + \alpha \left[ r_i^t + \gamma \textcolor{red}{V_i(s_{t+1})} - Q_i(s_t,\mathbf{a}_t) \right] $$其中
$$ \mathbf{a}_t = (a_1^t,a_2^t,\dots,a_n^t) $$表示所有 agent 的 joint action。
所以均衡学习(Equilibrium Learning)的核心就是:每个状态 $s$ 都对应一个由 $Q_i(s,\mathbf{a})$ 构成的矩阵博弈,然后用某种均衡解法计算 $V_i(s)$,再把这个 $V_i(s)$ 放回 TD target 中。
| 方法 | 适用博弈 | $V_i(s)$ 的计算方式 |
|---|---|---|
| Minimax-Q | two-player zero-sum | 最大化自己在最坏对手下的收益 |
| Nash-Q | general-sum game | 先求 Nash equilibrium,再算均衡期望收益 |
| Friend-or-Foe Q | friend / foe 关系已知 | friend 用 max,foe 用 minimax |
Minimax-Q
Minimax-Q 主要用于 two-player zero-sum game,也就是两个 agent 的收益完全相反:
$$ u_1(s,\mathbf{a}) + u_2(s,\mathbf{a}) = 0 $$对于 agent $i$ 来说,对手不是一个普通环境,而是一个会尽可能让自己收益变低的 adversary。所以在计算 $V_i(s)$ 时,agent 需要选择一个混合策略 $\pi_i$,让自己在最坏情况下的收益最大。
Minimax-Q 的核心函数是
$$ V_i(s) = \max_{\pi_i \in \Delta(\mathcal{A}_i)} \min_{a_{-i} \in \mathcal{A}_{-i}} \sum_{a_i \in \mathcal{A}_i} \pi_i(a_i|s) Q_i(s,a_i,a_{-i}) $$这里和标准 Q-learning 最大的区别是:
$$ \textcolor{blue}{\max_{a'} Q(s',a')} \quad \Longrightarrow \quad \textcolor{red}{ \max_{\pi_i}\min_{a_{-i}} \sum_{a_i}\pi_i(a_i|s')Q_i(s',a_i,a_{-i}) } $$也就是说,标准 Q-learning 只假设自己下一步会选最好的动作,而 Minimax-Q 假设对手会选最坏的反制动作。
Minimax-Q 的更新可以写成
$$ Q_i(s_t,a_i^t,a_{-i}^t) \leftarrow Q_i(s_t,a_i^t,a_{-i}^t) + \alpha \left[ r_i^t + \gamma \textcolor{red}{ \max_{\pi_i}\min_{a_{-i}} \sum_{a_i}\pi_i(a_i|s_{t+1})Q_i(s_{t+1},a_i,a_{-i}) } - Q_i(s_t,a_i^t,a_{-i}^t) \right] $$算法流程可以写成
Minimax-Q
初始化 Q_i(s, a_i, a_-i)
for t = 0, 1, 2, ... do
在状态 s_t 根据当前策略选择动作 a_i^t
观察对手动作 a_-i^t、奖励 r_i^t 和下一状态 s_{t+1}
V_i(s_{t+1}) <- max_{pi_i} min_{a_-i} sum_{a_i} pi_i(a_i|s_{t+1}) Q_i(s_{t+1}, a_i, a_-i)
Q_i(s_t, a_i^t, a_-i^t) <- Q_i(s_t, a_i^t, a_-i^t) + alpha [r_i^t + gamma V_i(s_{t+1}) - Q_i(s_t, a_i^t, a_-i^t)]
end for
Nash-Q
Minimax-Q 适合 zero-sum game,但是很多多智能体问题不是零和的。比如两个 agent 可能既有竞争,也有合作,这时候不能简单假设“别人一定会让自己最差”。
Nash-Q 的做法是:在每个状态 $s$,把所有 agent 的 $Q_i(s,\mathbf{a})$ 看成一个 normal-form game,然后先求这个 stage game 的 Nash equilibrium。
设在状态 $s$ 下求得的 Nash equilibrium 为
$$ \boldsymbol{\pi}^*(s) = (\pi_1^*(\cdot|s),\pi_2^*(\cdot|s),\dots,\pi_n^*(\cdot|s)) $$那么 agent $i$ 的状态价值定义为这个均衡下的期望收益:
$$ V_i(s) = \sum_{\mathbf{a}} \left( \prod_{j=1}^{n}\pi_j^*(a_j|s) \right) Q_i(s,\mathbf{a}) $$这里和标准 Q-learning 的区别是:
$$ \textcolor{blue}{\max_{a'} Q(s',a')} \quad \Longrightarrow \quad \textcolor{red}{ \sum_{\mathbf{a}'} \left( \prod_j \pi_j^*(a_j'|s') \right) Q_i(s',\mathbf{a}') } $$也就是说,Nash-Q 不是直接取最大动作,而是先计算一个多智能体均衡策略,再用均衡策略下的期望收益作为 $V_i(s')$。
Nash-Q 的更新可以写成
$$ Q_i(s_t,\mathbf{a}_t) \leftarrow Q_i(s_t,\mathbf{a}_t) + \alpha \left[ r_i^t + \gamma \textcolor{red}{ \sum_{\mathbf{a}'} \left( \prod_j \pi_j^*(a_j'|s_{t+1}) \right) Q_i(s_{t+1},\mathbf{a}') } - Q_i(s_t,\mathbf{a}_t) \right] $$算法流程可以写成
Nash-Q
初始化每个 agent 的 Q_i(s, a)
for t = 0, 1, 2, ... do
所有 agent 在状态 s_t 选择 joint action a_t
观察奖励 r_i^t 和下一状态 s_{t+1}
用 {Q_i(s_{t+1}, a')}_{i=1}^n 构造下一状态的 stage game
求该 stage game 的 Nash equilibrium pi*(s_{t+1})
V_i(s_{t+1}) <- sum_{a'} [prod_j pi_j*(a_j'|s_{t+1})] Q_i(s_{t+1}, a')
Q_i(s_t, a_t) <- Q_i(s_t, a_t) + alpha [r_i^t + gamma V_i(s_{t+1}) - Q_i(s_t, a_t)]
end for
Nash-Q 的直觉很自然,但是实际使用会遇到一个问题:一个 stage game 可能存在多个 Nash equilibrium,此时到底选择哪一个均衡会影响 $V_i(s)$ 的计算结果。
Friend-or-Foe Q
Friend-or-Foe Q 可以看作对 Nash-Q 的一个简化。它不在每个状态中求一般的 Nash equilibrium,而是提前假设其他 agent 和自己之间的关系只有两种:
| 类型 | 含义 | 计算方式 |
|---|---|---|
| Friend | 目标一致,大家一起最大化收益 | max |
| Foe | 目标相反,对方会让自己收益最小 | minimax |
如果其他 agent 是 friend,那么 agent $i$ 假设大家会一起选择让自己收益最大的 joint action:
$$ V_i^{friend}(s) = \max_{\mathbf{a}} Q_i(s,\mathbf{a}) $$如果其他 agent 是 foe,那么就回到 Minimax-Q 的形式:
$$ V_i^{foe}(s) = \max_{\pi_i} \min_{a_{-i}} \sum_{a_i}\pi_i(a_i|s)Q_i(s,a_i,a_{-i}) $$如果同时存在 friend 和 foe,可以把 joint action 拆成三部分:
$$ \mathbf{a} = (a_i, \mathbf{a}_F, \mathbf{a}_E) $$其中 $\mathbf{a}_F$ 表示 friend 的动作,$\mathbf{a}_E$ 表示 foe 的动作。那么更一般的形式可以写成
$$ V_i(s) = \max_{\pi_i,\pi_F} \min_{\pi_E} \mathbb{E}_{a_i,\mathbf{a}_F,\mathbf{a}_E} \left[ Q_i(s,a_i,\mathbf{a}_F,\mathbf{a}_E) \right] $$这里和标准 Q-learning 的区别是:
$$ \textcolor{blue}{\max_{a'} Q(s',a')} \quad \Longrightarrow \quad \textcolor{red}{ \max_{\text{friend actions}} \min_{\text{foe actions}} Q_i(s',\mathbf{a}') } $$也就是说,Friend-or-Foe Q 把其他 agent 先分类:friend 的动作和自己一起 max,foe 的动作进入 min。
算法流程可以写成
Friend-or-Foe Q
初始化 Q_i(s, a),并给定其他 agent 是 friend 还是 foe
for t = 0, 1, 2, ... do
在状态 s_t 选择动作,并观察 joint action a_t
观察奖励 r_i^t 和下一状态 s_{t+1}
if 其他 agent 是 friend then
V_i(s_{t+1}) <- max_{a'} Q_i(s_{t+1}, a')
else if 其他 agent 是 foe then
V_i(s_{t+1}) <- max_{pi_i} min_{a_-i} sum_{a_i} pi_i(a_i|s_{t+1}) Q_i(s_{t+1}, a_i, a_-i)
end if
Q_i(s_t, a_t) <- Q_i(s_t, a_t) + alpha [r_i^t + gamma V_i(s_{t+1}) - Q_i(s_t, a_t)]
end for
总结一下,这三类方法的区别主要就在于 $V_i(s')$ 的定义:
| 方法 | $V_i(s')$ |
|---|---|
| 标准 Q-learning | $\max_{a_i'} Q_i(s',a_i')$ |
| Minimax-Q | $\max_{\pi_i}\min_{a_{-i}'} \mathbb{E}_{a_i'\sim\pi_i}[Q_i(s',a_i',a_{-i}')]$ |
| Nash-Q | $\mathbb{E}_{\mathbf{a}'\sim\boldsymbol{\pi}^*}[Q_i(s',\mathbf{a}')]$ |
| Friend-or-Foe Q | friend 部分取 $\max$,foe 部分取 $\min$ |
从这个角度看,均衡学习其实就是把标准 Q-learning 中的
$$ \max_a Q(s,a) $$替换成一个由博弈均衡定义出来的
$$ V_i(s) $$而不同算法的差异,就体现在它们相信其他 agent 会如何行动。
对手建模
均衡学习的思路是:假设每个状态下都存在一个 stage game,然后通过某种均衡概念计算 $V_i(s)$。
对手建模(Opponent Modeling)的思路不太一样。它不一定要求直接求均衡,而是尝试显式估计其他 agent 的行为模式:
$$ \hat{\pi}_{-i}(a_{-i}|s) $$然后 agent $i$ 在决策时,把这个估计出来的对手策略也考虑进去。
如果在单智能体 Q-learning 中,我们的目标是
$$ \max_{a_i} Q_i(s,a_i) $$那么在对手建模中,更自然的形式是
$$ a_i^* = \arg\max_{a_i} \mathbb{E}_{a_{-i}\sim \hat{\pi}_{-i}(\cdot|s)} \left[ Q_i(s,a_i,a_{-i}) \right] $$也就是说,我们不再假设对手一定按照某个均衡行动,而是先学习一个对手模型,再基于这个模型选择自己的 best response。
策略频率建模
最直接的对手建模方法就是策略频率建模,也可以理解为虚拟博弈(Fictitious Play)的思想。
它的核心假设很简单:对手未来的策略,可以用它过去的动作频率来估计。
假设在状态 $s$ 下,对手动作 $a_{-i}$ 被观察到的次数是
$$ N(s,a_{-i}) $$那么对手策略可以估计为
$$ \hat{\pi}_{-i}(a_{-i}|s) = \frac{N(s,a_{-i})} {\sum_{a'_{-i}}N(s,a'_{-i})} $$然后 agent $i$ 使用这个估计策略来计算自己每个动作的期望价值:
$$ \hat{Q}_i(s,a_i) = \sum_{a_{-i}} \hat{\pi}_{-i}(a_{-i}|s) Q_i(s,a_i,a_{-i}) $$最后选择
$$ a_i^* = \arg\max_{a_i}\hat{Q}_i(s,a_i) $$这个方法的直觉就是:我不需要知道对手内部怎么想,只要统计它在类似状态下过去怎么做,然后对这个经验分布做 best response。
虚拟博弈的过程可以写成
Fictitious Play / Frequency Modeling
初始化 N(s, a_-i) = 0
for t = 0, 1, 2, ... do
观察当前状态 s_t
根据历史频率估计 pi_hat_-i(a_-i|s_t)
a_i^t <- argmax_{a_i} sum_{a_-i} pi_hat_-i(a_-i|s_t) Q_i(s_t, a_i, a_-i)
执行 a_i^t,观察对手动作 a_-i^t
N(s_t, a_-i^t) <- N(s_t, a_-i^t) + 1
end for
这个方法简单、可解释,但也有明显限制:它默认对手策略相对稳定。如果对手也在学习,历史频率就可能滞后于对手当前策略。
对手类型建模
另一类直接建模方法是对手类型建模(Opponent Type Modeling)。
它不是直接估计“对手在每个状态下出每个动作的概率”,而是假设对手来自某个类型集合:
$$ \Theta = \{\theta_1,\theta_2,\dots,\theta_K\} $$每个类型 $\theta_k$ 对应一种策略模型:
$$ \pi_{-i}(a_{-i}|s,\theta_k) $$比如在一个游戏里,对手可能是:
| 类型 | 行为模式 |
|---|---|
| $\theta_1$ | 保守型 |
| $\theta_2$ | 激进型 |
| $\theta_3$ | 随机型 |
| $\theta_4$ | 针对型 |
agent 维护一个关于对手类型的 belief:
$$ b(\theta_k) = P(\theta_k | h_t) $$其中 $h_t$ 表示到当前为止观察到的历史轨迹。
当观察到对手在状态 $s_t$ 下选择动作 $a_{-i}^t$ 后,可以用 Bayes rule 更新类型概率:
$$ b_{t+1}(\theta_k) \propto b_t(\theta_k) \pi_{-i}(a_{-i}^t|s_t,\theta_k) $$归一化后得到新的 belief:
$$ b_{t+1}(\theta_k) = \frac{ b_t(\theta_k)\pi_{-i}(a_{-i}^t|s_t,\theta_k) }{ \sum_j b_t(\theta_j)\pi_{-i}(a_{-i}^t|s_t,\theta_j) } $$有了类型 belief 后,对手策略可以写成一个加权平均:
$$ \hat{\pi}_{-i}(a_{-i}|s) = \sum_k b(\theta_k)\pi_{-i}(a_{-i}|s,\theta_k) $$然后再像前面一样,对这个估计策略做 best response:
$$ a_i^* = \arg\max_{a_i} \sum_{a_{-i}} \hat{\pi}_{-i}(a_{-i}|s) Q_i(s,a_i,a_{-i}) $$算法流程可以写成
Opponent Type Modeling
给定类型集合 Theta = {theta_1, ..., theta_K}
初始化 belief b_0(theta_k)
for t = 0, 1, 2, ... do
pi_hat_-i(a_-i|s_t) <- sum_k b_t(theta_k) pi_-i(a_-i|s_t, theta_k)
a_i^t <- argmax_{a_i} sum_{a_-i} pi_hat_-i(a_-i|s_t) Q_i(s_t, a_i, a_-i)
执行 a_i^t,观察 a_-i^t
b_{t+1}(theta_k) <- normalize[b_t(theta_k) pi_-i(a_-i^t|s_t, theta_k)]
end for
类型建模比频率建模更有结构,因为它可以利用先验知识。但问题也很明显:如果真实对手不在预设类型集合里,那么 belief 更新得再好,也只能在错误的模型集合中选择一个“最像的”类型。
递归建模
前面两种方法都在建模对手的行为,但还没有考虑一个问题:对手可能也在建模我。
递归建模(Recursive Opponent Modeling)的核心就是引入这种层级推理:
$$ \text{我建模你,你也建模我,我再建模你如何建模我} $$可以粗略写成:
| 层级 | 含义 |
|---|---|
| Level-0 | 对手不建模别人,只按固定策略行动 |
| Level-1 | 我认为对手是 Level-0,于是对它做 best response |
| Level-2 | 我认为对手认为我是 Level-0,于是我再对这个推理做 best response |
这种思想在博弈论和多智能体系统中很自然,但递归层数一高就会带来很大的计算复杂度。因为每多一层,都要多维护一层“对手的信念”和“对手对我的信念”。
所以递归建模通常更适合用来理解多智能体推理结构,而不是直接在复杂深度 RL 场景中无限展开。
神经虚拟博弈
现代方法会把虚拟博弈的思想和神经网络结合起来,可以简单理解为 Neural Fictitious Self-Play(NFSP)这一类方法。
在普通虚拟博弈中,我们用显式频率统计来表示平均策略:
$$ \hat{\pi}(a|s) $$但是在大规模状态空间中,不能为每个状态都维护一张表,所以可以用神经网络来近似这个平均策略:
$$ \Pi_\phi(a|s) \approx \text{average policy} $$同时再用一个 Q 网络学习对平均策略的 best response:
$$ Q_\theta(s,a) $$因此 NFSP 类方法通常包含两部分:
| 模块 | 作用 |
|---|---|
| Best response network | 学习当前对手平均策略下的最优反应 |
| Average policy network | 模仿自己的历史行为,近似虚拟博弈中的平均策略 |
可以把它理解为:
$$ \text{RL 学 best response} \quad + \quad \text{SL 学 average policy} $$其中 RL 部分用于让 agent 变强,SL 部分用于记录长期平均策略,使训练过程更接近虚拟博弈中的策略平均。
这个方向的意义在于:它把原本只适合小型矩阵博弈的虚拟博弈,扩展到了高维状态空间和深度强化学习场景。
MARL 的三个困境
正式进入 MARL 算法之前,先把多智能体学习中最常见的三个问题单独拎出来:
| 困境 | 问题 | 直觉 |
|---|---|---|
| 非平稳性 | 其他 agent 也在学习,环境转移分布会变 | 我以为环境固定,其实队友和对手一直在变 |
| 相对过度泛化 | 最优 joint action 因为协作失败被平均成低价值 | 最好的配合很脆弱,次优但稳的行为被学出来 |
| 信度分配 | 全局奖励很难分清每个 agent 的贡献 | 赢了不知道谁功劳大,输了不知道谁背锅 |
这三个问题会贯穿后面很多 MARL 方法。
非平稳性
在单智能体 RL 中,我们通常假设环境转移是固定的:
$$ P(s'|s,a) $$但是在 MARL 中,agent $i$ 看到的转移其实和其他 agent 的策略有关:
$$ P(s'|s,a_i) = \sum_{a_{-i}} P(s'|s,a_i,a_{-i}) \pi_{-i}(a_{-i}|s) $$如果其他 agent 的策略 $\pi_{-i}$ 也在学习,那么从 agent $i$ 的视角看,环境分布就在不断变化。
$$ \pi_{-i}^{t} \neq \pi_{-i}^{t+1} \quad \Longrightarrow \quad P_t(s'|s,a_i) \neq P_{t+1}(s'|s,a_i) $$这就是非平稳性(Non-stationarity)。
IL 和 JAL
处理非平稳性的两种基础思路是 Independent Learner(IL)和 Joint Action Learner(JAL)。
| 方法 | Q function | 是否显式考虑其他 agent 动作 |
|---|---|---|
| IL | $Q_i(s,a_i)$ | 否 |
| JAL | $Q_i(s,\mathbf{a})$ | 是 |
IL 的做法是每个 agent 都把其他 agent 当成环境的一部分,直接学习
$$ Q_i(s,a_i) $$它的更新形式和单智能体 Q-learning 很像:
$$ Q_i(s_t,a_i^t) \leftarrow Q_i(s_t,a_i^t) + \alpha \left[ r_i^t + \gamma \max_{a_i'}Q_i(s_{t+1},a_i') - Q_i(s_t,a_i^t) \right] $$问题是,其他 agent 的策略变化被隐藏进了环境里,所以 IL 面对的是一个非平稳环境。
JAL 的做法更进一步,它直接把 joint action 放进 Q function:
$$ Q_i(s,\mathbf{a}) $$其中 $\mathbf{a}$ 表示所有 agent 的联合动作。
这样 agent 至少知道“整个联合动作”产生了当前结果。在协作任务中,如果把下一状态中最好的联合动作当作 target,那么 JAL 的状态价值可以写成
$$ V_i^{JAL}(s') = \max_{\mathbf{a}'} Q_i(s',\mathbf{a}') $$和 Nash-Q 对比一下,Nash-Q 是先求下一状态 stage game 的 Nash equilibrium:
$$ V_i^{Nash}(s') = \sum_{\mathbf{a}'} \left( \prod_j \pi_j^*(a_j'|s') \right) Q_i(s',\mathbf{a}') $$而 JAL 直接在 joint action 上取最大值:
$$ V_i^{JAL}(s') = \textcolor{red}{ \max_{\mathbf{a}'} Q_i(s',\mathbf{a}') } $$所以 JAL 和 Nash-Q 的关键区别是:
$$ \textcolor{blue}{\text{Nash-Q: 求均衡策略 } \boldsymbol{\pi}^* \text{ 后算期望价值}} \quad \Longrightarrow \quad \textcolor{red}{\text{JAL: 直接对 joint action 取 max}} $$JAL 的更新可以写成
$$ Q_i(s_t,\mathbf{a}_t) \leftarrow Q_i(s_t,\mathbf{a}_t) + \alpha \left[ r_i^t + \gamma \textcolor{red}{ \max_{\mathbf{a}'}Q_i(s_{t+1},\mathbf{a}') } - Q_i(s_t,\mathbf{a}_t) \right] $$算法流程可以写成
Joint Action Learner
初始化 Q_i(s, a)
for t = 0, 1, 2, ... do
在状态 s_t 观察或形成联合动作 a_t
执行 a_t,观察奖励 r_i^t 和下一状态 s_{t+1}
V_i(s_{t+1}) <- max_{a'} Q_i(s_{t+1}, a')
Q_i(s_t, a_t) <- Q_i(s_t, a_t) + alpha [r_i^t + gamma V_i(s_{t+1}) - Q_i(s_t, a_t)]
end for
补充:把联合动作拆成自身动作和其他 agent 动作
如果把联合动作写成
$$ \mathbf{a}=(a_i,a_{-i}) $$那么 JAL 也可以配合一个对手模型
$$ \hat{\pi}_{-i}(a_{-i}|s) $$来计算自己动作的 best response:
$$ V_i(s') = \max_{a_i'} \sum_{a_{-i}'} \hat{\pi}_{-i}(a_{-i}'|s') Q_i(s',a_i',a_{-i}') $$完整流程可以写成
Joint Action Learner with Opponent Model
初始化 Q_i(s, a_i, a_-i) 和对手模型 pi_hat_-i(a_-i|s)
for t = 0, 1, 2, ... do
在状态 s_t 选择动作 a_i^t
观察 (a_i^t, a_-i^t)、奖励 r_i^t 和下一状态 s_{t+1}
更新对手模型 pi_hat_-i(a_-i^t|s_t)
V_i(s_{t+1}) <- max_{a_i'} sum_{a_-i'} pi_hat_-i(a_-i'|s_{t+1}) Q_i(s_{t+1}, a_i', a_-i')
Q_i(s_t, a_i^t, a_-i^t) <- Q_i(s_t, a_i^t, a_-i^t) + alpha [r_i^t + gamma V_i(s_{t+1}) - Q_i(s_t, a_i^t, a_-i^t)]
end for
JAL 比 IL 更能表达多智能体交互,但代价是 joint action 空间会随着 agent 数量指数增长。
相对过度泛化
相对过度泛化(Relative Overgeneralization, RO)通常出现在协作型 MARL 中。
它描述的是这样一种现象:某个 joint action 明明是全局最优,但是它需要多个 agent 精确配合。一旦队友没有配合好,这个动作就会得到很差的回报。结果在学习过程中,这个最优动作被“平均”成了低价值,最后 agent 反而学到了一个更稳但次优的策略。
看一个简单例子,两个 agent 都有动作 $A$ 和 $B$,共享奖励如下:
| Agent 2: A | Agent 2: B | |
|---|---|---|
| Agent 1: A | $10$ | $0$ |
| Agent 1: B | $6$ | $7$ |
全局最优显然是
$$ (A,A) \rightarrow 10 $$但是如果 Agent 2 还在随机探索,那么对 Agent 1 来说:
$$ \mathbb{E}[R|a_1=A] = \frac{1}{2}\cdot 10 + \frac{1}{2}\cdot 0 = 5 $$$$ \mathbb{E}[R|a_1=B] = \frac{1}{2}\cdot 6 + \frac{1}{2}\cdot 7 = 6.5 $$于是 Agent 1 会觉得 $B$ 比 $A$ 更好。Agent 2 也会做出类似判断。最后系统可能收敛到 $(B,B)$,虽然它的回报 $7$ 小于最优的 $10$。
这就是 RO 的核心:最优配合因为早期协作失败被低估,而次优但鲁棒的行为被过度泛化。
滞后 Q-learning
滞后 Q-learning(Hysteretic Q-learning)的核心想法是:在协作任务中,负 TD error 不一定说明当前动作不好,也可能是队友探索导致配合失败。
所以它使用两个学习率:
$$ \alpha > \beta $$当 TD error 为正时,用较大的学习率 $\alpha$ 更新;当 TD error 为负时,用较小的学习率 $\beta$ 更新:
$$ \delta_t = r_t + \gamma \max_{a_i'}Q_i(s_{t+1},a_i') - Q_i(s_t,a_i^t) $$$$ Q_i(s_t,a_i^t) \leftarrow Q_i(s_t,a_i^t) + \begin{cases} \alpha \delta_t, & \delta_t \geq 0 \\ \beta \delta_t, & \delta_t < 0 \end{cases} $$直觉上,它更愿意相信“好结果”,而对“坏结果”保持宽容。
算法流程可以写成
Hysteretic Q-learning
初始化 Q_i(s, a_i),设置 alpha > beta
for t = 0, 1, 2, ... do
选择并执行动作 a_i^t,观察共享奖励 r_t 和 s_{t+1}
delta_t <- r_t + gamma max_{a_i'} Q_i(s_{t+1}, a_i') - Q_i(s_t, a_i^t)
if delta_t >= 0 then
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + alpha delta_t
else
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + beta delta_t
end if
end for
宽容 Q-learning
宽容 Q-learning(Lenient Q-learning)和滞后 Q 的思想很像,也是为了避免早期协作失败过度惩罚好动作。
不同之处在于,宽容 Q 会显式维护一个温度或宽容度:
$$ T(s,a) $$训练早期温度高,对负 TD error 更宽容;访问次数增加后温度逐渐下降,agent 变得更严格。
一种常见写法是根据温度定义宽容概率:
$$ l(s,a) = 1 - e^{-K T(s,a)} $$当 $\delta_t < 0$ 时,以概率 $l(s,a)$ 忽略这次负更新;当 $\delta_t \geq 0$ 时正常更新。
$$ Q_i(s_t,a_i^t) \leftarrow Q_i(s_t,a_i^t) + \alpha \delta_t \quad \text{if } \delta_t \geq 0 \text{ or } u > l(s_t,a_i^t) $$其中 $u \sim U(0,1)$。
算法流程可以写成
Lenient Q-learning
初始化 Q_i(s, a_i) 和温度 T(s, a_i)
for t = 0, 1, 2, ... do
选择动作 a_i^t,观察 r_t 和 s_{t+1}
delta_t <- r_t + gamma max_{a_i'} Q_i(s_{t+1}, a_i') - Q_i(s_t, a_i^t)
l(s_t, a_i^t) <- 1 - exp(-K T(s_t, a_i^t))
u <- Uniform(0, 1)
if delta_t >= 0 or u > l(s_t, a_i^t) then
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + alpha delta_t
end if
T(s_t, a_i^t) <- kappa T(s_t, a_i^t)
end for
滞后 Q 是“负更新变小”,宽容 Q 是“早期负更新可能直接忽略”。
PHC
在介绍 WoLF 之前,先介绍 PHC,也就是 Policy Hill-Climbing。
普通 Q-learning 学到 $Q(s,a)$ 后,通常直接用 $\epsilon$-greedy 选动作。但 PHC 会显式维护一个随机策略:
$$ \pi_i(a|s) $$然后一边用 Q-learning 更新 $Q_i(s,a)$,一边把策略往当前 greedy action 的方向推。
设当前最优动作为
$$ a^* = \arg\max_a Q_i(s,a) $$那么 PHC 的策略更新可以写成
$$ \pi_i(a|s) \leftarrow \pi_i(a|s) + \Delta_{s,a} $$其中
$$ \Delta_{s,a} = \begin{cases} \delta, & a = a^* \\ -\frac{\delta}{|\mathcal{A}|-1}, & a \neq a^* \end{cases} $$最后再把策略裁剪到合法概率范围,并重新归一化:
$$ \sum_a \pi_i(a|s)=1, \quad \pi_i(a|s)\geq 0 $$直觉上,PHC 就是:Q-learning 负责估计动作价值,policy hill-climbing 负责把策略慢慢推向当前看起来最好的动作。
算法流程可以写成
Policy Hill-Climbing
初始化 Q_i(s, a_i) 和策略 pi_i(a_i|s)
for t = 0, 1, 2, ... do
根据 pi_i(.|s_t) 选择动作 a_i^t
执行动作,观察奖励 r_i^t 和下一状态 s_{t+1}
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + alpha [r_i^t + gamma max_{a_i'} Q_i(s_{t+1}, a_i') - Q_i(s_t, a_i^t)]
a* <- argmax_a Q_i(s_t, a)
pi_i(a*|s_t) <- pi_i(a*|s_t) + delta
pi_i(a|s_t) <- pi_i(a|s_t) - delta / (|A|-1), for a != a*
裁剪并归一化 pi_i(.|s_t)
end for
PHC 的问题是它使用固定策略步长 $\delta$。在多智能体场景中,如果所有 agent 都用固定步长调整策略,很容易相互追逐,导致策略震荡。
WoLF-PHC
WoLF-PHC 是在 PHC 上加入 WoLF 原则。WoLF 的全称是 Win or Learn Fast,它的核心思想是:
$$ \text{winning 时学慢一点,losing 时学快一点} $$这里的 winning 通常通过当前策略 $\pi_i$ 和平均策略 $\bar{\pi}_i$ 的价值比较来判断:
$$ V_i(s,\pi_i) = \sum_a \pi_i(a|s)Q_i(s,a) $$$$ V_i(s,\bar{\pi}_i) = \sum_a \bar{\pi}_i(a|s)Q_i(s,a) $$如果
$$ V_i(s,\pi_i) > V_i(s,\bar{\pi}_i) $$说明当前策略比平均策略更好,agent 处于 winning 状态,使用较小步长 $\delta_w$;否则处于 losing 状态,使用较大步长 $\delta_l$:
$$ \delta = \begin{cases} \delta_w, & V_i(s,\pi_i) > V_i(s,\bar{\pi}_i) \\ \delta_l, & \text{otherwise} \end{cases} \quad \delta_w < \delta_l $$所以 WoLF-PHC 和 PHC 的区别就是:PHC 使用固定 $\delta$,而 WoLF-PHC 根据当前是否 winning 自适应选择策略更新步长。
算法流程可以写成
WoLF-PHC
初始化 Q_i(s, a_i), pi_i(a_i|s), pi_bar_i(a_i|s)
设置 delta_w < delta_l
for t = 0, 1, 2, ... do
根据 pi_i(.|s_t) 选择动作 a_i^t
执行动作,观察奖励 r_i^t 和下一状态 s_{t+1}
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + alpha [r_i^t + gamma max_{a_i'} Q_i(s_{t+1}, a_i') - Q_i(s_t, a_i^t)]
更新平均策略 pi_bar_i(.|s_t)
if sum_a pi_i(a|s_t) Q_i(s_t,a) > sum_a pi_bar_i(a|s_t) Q_i(s_t,a) then
delta <- delta_w
else
delta <- delta_l
end if
a* <- argmax_a Q_i(s_t, a)
pi_i(a*|s_t) <- pi_i(a*|s_t) + delta
pi_i(a|s_t) <- pi_i(a|s_t) - delta / (|A|-1), for a != a*
裁剪并归一化 pi_i(.|s_t)
end for
WoLF-PHC 的作用更偏向稳定多智能体中的策略变化:当自己表现不错时不要剧烈改变策略,当自己表现差时更快调整。
rFMQ
rFMQ 可以理解为 Frequency Maximum Q-value 这一类方法的递归版本,它的核心目标也是避免 RO。
普通 Q 值是平均意义下的估计:
$$ Q(s,a) \approx \mathbb{E}[R|s,a] $$但 RO 的问题恰好就出在“平均”上:一个动作只有在队友配合时才很好,配合失败时很差,于是平均值被拉低。
rFMQ 会额外记录两个信息:
| 量 | 含义 |
|---|---|
| $Q_i(s,a_i)$ | 平均回报 |
| $Q_i^{max}(s,a_i)$ | 这个动作曾经得到过的最大回报 |
| $F_i(s,a_i)$ | 这个动作达到最大回报的频率 |
这里最关键的是 $F_i(s,a_i)$ 的递归更新。更准确地说,rFMQ 不只是记录一个最大回报,还要记录这个最大回报是不是经常能够达到。
记这次用于更新的样本 target 为
$$ y_t = r_t + \gamma \max_{a_i'}Q_i(s_{t+1},a_i') $$如果这次出现了新的最大值:
$$ y_t > Q_i^{max}(s_t,a_i^t) $$那么直接更新最大值,并把频率重置为 $1$:
$$ Q_i^{max}(s_t,a_i^t) \leftarrow y_t, \quad F_i(s_t,a_i^t) \leftarrow 1 $$如果没有出现新的最大值,那么才用递归方式更新频率:
$$ F_i(s_t,a_i^t) \leftarrow (1-\alpha_F)F_i(s_t,a_i^t) + \alpha_F \mathbb{I}\left(y_t = Q_i^{max}(s_t,a_i^t)\right) $$实际实现时,连续值场景中一般不会严格相等,所以可以把指示函数换成一个小阈值:
$$ \mathbb{I}\left(|y_t - Q_i^{max}(s_t,a_i^t)| < \epsilon\right) $$这也是 rFMQ 和 FMQ 的一个关键区别:FMQ 关注 maximum value 和达到 maximum 的频率,而 rFMQ 用递归方式在线维护这个频率,并且当新的最大值出现时把 $F$ 重置为 $1$。你刚才指出的理解是对的,这个重置是 rFMQ 的核心点。
有了 $Q^{max}$ 和 $F$ 后,动作选择时使用的增强评价值是
$$ E_i(s,a_i) = (1-F_i(s,a_i))Q_i(s,a_i) + F_i(s,a_i)Q_i^{max}(s,a_i) $$等价地写成
$$ E_i(s,a_i) = Q_i(s,a_i) + F_i(s,a_i)\left(Q_i^{max}(s,a_i)-Q_i(s,a_i)\right) $$也就是说,$F$ 越大,说明这个动作越稳定地达到过高回报,那么 $E$ 就越接近 $Q^{max}$;$F$ 越小,说明最大回报更像偶然事件,那么 $E$ 就更接近普通平均 $Q$。
再用这个增强后的评价值进行 Boltzmann 选择:
$$ P(a_i|s) = \frac{\exp(E_i(s,a_i)/\tau)} {\sum_{a_i'}\exp(E_i(s,a_i')/\tau)} $$直觉上,rFMQ 在说:如果某个动作虽然平均回报不高,但它曾经稳定达到过很高的回报,那么它可能是一个需要队友配合的好动作,不应该太早放弃。
算法流程可以写成
rFMQ
初始化 Q_i(s, a_i), Q_i^max(s, a_i), F_i(s, a_i)
for t = 0, 1, 2, ... do
E_i(s_t, a_i) <- Q_i(s_t, a_i) + F_i(s_t, a_i) [Q_i^max(s_t, a_i) - Q_i(s_t, a_i)]
根据 E_i(s_t, a_i) 用 Boltzmann 分布选择动作 a_i^t
观察奖励 r_t 和下一状态 s_{t+1}
y_t <- r_t + gamma max_{a_i'} Q_i(s_{t+1}, a_i')
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + alpha [y_t - Q_i(s_t, a_i^t)]
if y_t > Q_i^max(s_t, a_i^t) then
Q_i^max(s_t, a_i^t) <- y_t
F_i(s_t, a_i^t) <- 1
else
F_i(s_t, a_i^t) <- (1-alpha_F)F_i(s_t, a_i^t) + alpha_F I(y_t = Q_i^max(s_t, a_i^t))
end if
end for
这类方法和滞后 Q、宽容 Q 的区别是:滞后 Q 和宽容 Q 主要处理负反馈,而 rFMQ 通过记录最大回报与频率,让 agent 不要被平均回报误导。
信度分配
在协作型 MARL 中,很多任务只给一个全局奖励:
$$ R_t = R(s_t,\mathbf{a}_t) $$但是这个奖励是所有 agent 共同产生的。问题是:如果团队成功了,到底是谁贡献最大?如果团队失败了,到底是哪个 agent 的动作导致失败?
这就是信度分配问题(Credit Assignment)。
最直接的做法是让所有 agent 都使用同一个全局奖励:
$$ r_i = R $$但这会带来高方差和学习低效。因为某个 agent 的动作可能很好,却因为其他 agent 的错误导致全局奖励很差;反过来也可能某个 agent 做错了,但被队友补救,所以它仍然拿到高奖励。
差分奖励
差分方法(Difference Reward)的核心思想是:衡量 agent $i$ 的贡献时,不看全局奖励本身,而是看“有它”和“没有它”之间的差别。
设整个系统的状态和 joint action 记作 $z$,全局奖励是
$$ G(z) $$如果把 agent $i$ 的行为替换成一个默认行为 $c_i$,得到 counterfactual 系统
$$ z_{-i} + c_i $$那么 agent $i$ 的差分奖励定义为
$$ D_i(z) = G(z) - G(z_{-i} + c_i) $$这里
| 项 | 含义 |
|---|---|
| $G(z)$ | 真实团队表现 |
| $G(z_{-i}+c_i)$ | 如果 agent $i$ 不产生当前贡献,团队会怎样 |
| $D_i(z)$ | agent $i$ 对全局结果的边际贡献 |
差分奖励的好处是,它仍然和全局目标一致,但能去掉很多与 agent $i$ 无关的噪声。
如果用于 Q-learning,可以直接把奖励替换成差分奖励:
$$ Q_i(s_t,a_i^t) \leftarrow Q_i(s_t,a_i^t) + \alpha \left[ \textcolor{red}{D_i(z_t)} + \gamma \max_{a_i'}Q_i(s_{t+1},a_i') - Q_i(s_t,a_i^t) \right] $$算法流程可以写成
Difference Reward Learning
初始化每个 agent 的 Q_i(s, a_i)
for t = 0, 1, 2, ... do
所有 agent 执行动作,得到系统结果 z_t 和全局奖励 G(z_t)
for each agent i do
构造 counterfactual z_-i + c_i
D_i(z_t) <- G(z_t) - G(z_-i + c_i)
Q_i(s_t, a_i^t) <- Q_i(s_t, a_i^t) + alpha [D_i(z_t) + gamma max_{a_i'} Q_i(s_{t+1}, a_i') - Q_i(s_t, a_i^t)]
end for
end for
差分奖励最大的问题是 counterfactual 不一定容易得到。很多真实环境中,我们无法真的把 agent $i$ 的动作替换掉再跑一次环境,所以需要用模型估计或者用 critic 近似。
其他解决思路
除了差分奖励,还有几类常见思路:
| 方法 | 核心思路 |
|---|---|
| Local reward | 给每个 agent 设计局部奖励,降低全局奖励的噪声 |
| Reward shaping | 在全局奖励之外加入辅助奖励,引导中间行为 |
| Centralized critic | 训练时 critic 看到全局信息,给每个 actor 更准确的梯度 |
| Counterfactual baseline | 用反事实 baseline 估计某个 agent 动作的边际贡献 |
| Value decomposition | 把全局 $Q_{tot}$ 分解成每个 agent 的局部价值 |
比如 COMA 的思想就是使用 centralized critic 构造 counterfactual advantage:
$$ A_i(s,\mathbf{a}) = Q(s,\mathbf{a}) - \sum_{a_i'} \pi_i(a_i'|o_i) Q(s,(a_i',a_{-i})) $$它不是简单问“团队奖励是多少”,而是问“在其他 agent 动作不变时,agent $i$ 当前这个动作比它自己的平均动作好多少”。
再比如 VDN 和 QMIX 这类 value decomposition 方法,会把团队价值写成局部价值的组合:
$$ Q_{tot}(s,\mathbf{a}) = \sum_i Q_i(o_i,a_i) $$或者更一般地写成
$$ Q_{tot} = f_{\text{mix}}(Q_1,Q_2,\dots,Q_n,s) $$这类方法的目标是让每个 agent 能从全局价值中学到自己的局部贡献。
总结一下,信度分配要解决的是:
$$ \text{全局结果} \quad \Longrightarrow \quad \text{个体贡献} $$而不同方法的区别,就在于它们是通过手工奖励、反事实估计、centralized critic,还是 value decomposition 来完成这个拆分。