🏠 总目录📚 本教程 23 · Shapley 值
📑 本页目录(点开跳转)

23 · Shapley 值

42 分钟 | ⭐⭐ 你可能早就在用它了,只是不知道它是这么来的


🎯 一句话

Shapley 值 = 假设大家随机排队进场,每个人平均带来多少增量。

上一章的 nucleolus 站在稳定那一边(谁也别想掀桌);Shapley 值站在公平那一边(干多少拿多少)。同一份数据,两个都「对」的答案。


🎲 一、公平怎么量:先想清楚「一个人值多少」

手套博弈里 nucleolus 把 1 全给右手套的人,2、3 号一分不拿。那怎么才算「按贡献分」

第一个想法:看 $i$ 加进来时多带来多少 —— $v(S\cup\{i\}) - v(S)$,叫 $i$ 对 $S$ 的边际贡献

⚠️ 但这个数取决于 $S$ 是谁:糖对「已经有面粉的团队」和对「空团队」价值完全不同。单一个边际贡献不能当答案。

Shapley 的答案:所有加入顺序一视同仁,取平均。 想象 n 个人随机排队依次进场,每人进场时结算他当场带来的增量。 你的报酬 = 你在所有 $n!$ 种排队顺序下增量的平均值。


📐 二、定义

记 $\Pi_N$ 为 $N$ 的全部排列。对排列 $\pi$,令 $S_\pi(i)$ = 排在 $i$ 前面的那些人,则 $i$ 在 $\pi$ 中的边际贡献是 $\Delta_\pi(i) = v(S_\pi(i)\cup\{i\}) - v(S_\pi(i))$。

$$\phi_i \;=\; \frac{1}{n!}\sum_{\pi\in\Pi_N} \Delta_\pi(i)$$

等价的按联盟写法(把贡献相同的排列合并同类项):

$$\phi_i \;=\; \frac{1}{n!}\sum_{S\subseteq N\setminus\{i\}} |S|!\,(n-|S|-1)!\,\bigl(v(S\cup\{i\})-v(S)\bigr)$$

💡 那两个阶乘就是「有多少种排列会让 $i$ 恰好接在 $S$ 后面」:$S$ 内部随便排($|S|!$ 种),$i$ 之后的人随便排($(n-|S|-1)!$ 种)。两种写法是同一件事,手算时用排列版,写程序时用联盟版。


🔨 三、n=3 完整手算(这一节请拿纸跟着做)

Alice 带面粉值 $2,Bob 带糖值 $1,Charles 带草莓值 $3。两两合作:AB 做普通煎饼 $5,AC 做草莓煎饼 $7,BC 卖糖和草莓 $4。三人一起做爆款 $16。

S {A} {B} {C} {A,B} {A,C} {B,C} {A,B,C}
v(S) 0 2 1 3 5 7 4 16

套路:列出 6 个排列,每个排列从左到右依次结算增量。

排列 A 的增量 B 的增量 C 的增量
A,B,C $v(A)=2$ $5-2=3$ $16-5=11$
A,C,B $v(A)=2$ $16-7=9$ $7-2=5$
B,A,C $5-1=4$ $v(B)=1$ $16-5=11$
B,C,A $16-4=12$ $v(B)=1$ $4-1=3$
C,A,B $7-3=4$ $16-7=9$ $v(C)=3$
C,B,A $16-4=12$ $4-3=1$ $v(C)=3$

$$\phi_A=\tfrac{2+2+4+12+4+12}{6}=6,\quad \phi_B=\tfrac{3+9+1+1+9+1}{6}=4,\quad \phi_C=\tfrac{11+5+11+3+3+3}{6}=6$$

两个必做的自查: ① 三人加起来 $6+4+6=16=v(N)$ ✓ ② 每一行加起来也是 16($2+3+11$、$2+9+5$、…)—— 因为一行就是望远镜求和 $v(\{a_1\})+[v(\{a_1,a_2\})-v(\{a_1\})]+\dots=v(N)$。

💡 第 ② 条就是效率的完整证明:每行和都是 $v(N)$,$n!$ 行平均下来当然还是 $v(N)$。算错一个数,行和立刻对不上 —— 这是手算最好用的检错手段。


⚖️ 四、四条公理,唯一确定它

公理 说的是什么
效率 $\sum_i \phi_i = v(N)$ —— 全分完
对称 若对所有 $S$ 都有 $v(S\cup\{i\})=v(S\cup\{j\})$,则 $\phi_i=\phi_j$ —— 贡献一样就拿一样
虚拟成员 若 $i$ 对任何 $S$ 的边际贡献都是 0,则 $\phi_i=0$ —— 白吃的不给钱
可加性 $\phi_i(N,v_1+v_2)=\phi_i(N,v_1)+\phi_i(N,v_2)$ —— 两笔生意分开算再相加,和合起来算一样

定理(Shapley 1953)同时满足这四条的分配方式有且只有 Shapley 值。 它不是「一种合理的分法」,是唯一一种。这是它能被到处引用的根本原因。

另一个刻画(Young 1985)把可加性换成边际性 —— 「只要 $i$ 在两个博弈里的所有边际贡献都相同,他拿的就该相同」—— 效率 + 对称 + 边际性同样唯一确定 Shapley 值。

⚠️ 可加性看着像技术条件,其实是最有争议的一条:它要求「两个项目并做一个项目」时分配不变,而现实里合并往往产生协同效应。知道公理在哪,就知道结论在哪失效。


🧤 五、公平 ≠ 稳定:回到手套博弈

简单博弈里 Shapley 值有个更快的算法:

$$\phi_i = \frac{i\ \text{的边际贡献为 1 的排列数}}{n!}$$

手套博弈(1 号右手套,2、3 号各一只左手套)的 6 个排列,谁把局面从「输」变成「赢」:

排列 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1
关键的人 2 3 1 1 1 1

$$\phi_1=\tfrac46,\quad \phi_2=\phi_3=\tfrac16$$

分法 站在哪一边
Nucleolus $(1,\,0,\,0)$ 稳定 —— 也是这个博弈的整个核心
Shapley 值 $(\tfrac46,\tfrac16,\tfrac16)$ 公平 —— ⚠️ 不在核心里

⚠️⚠️ Shapley 值不保证落在核心里。 给 2 号 1/6,1 号和 3 号立刻会甩开他重新配对(他们俩合计只拿到 $\tfrac46+\tfrac16=\tfrac56 < 1$)。

这就是这两章最该带走的一句话「按贡献分」和「没人想掀桌」是两个不同的目标,它们经常给出不同答案。 选哪个取决于你怕的是什么 —— 怕不公平,还是怕散伙。


📈 六、凸博弈:两者和解的那一类

定义:$(N,v)$ 是凸的,如果对所有 $S,T$ 有 $v(S\cup T)+v(S\cap T)\ge v(S)+v(T)$。等价地:

$$B\subseteq A\subseteq N\setminus\{i\}\ \Longrightarrow\ v(A\cup\{i\})-v(A)\ \ge\ v(B\cup\{i\})-v(B)$$

人话:⭐ 联盟越大,同一个人加进来的边际贡献越大(规模报酬递增,滚雪球)。

两条结论:

💡 凸博弈是「公平和稳定不打架」的那一类。 手套博弈不凸 —— 2 号在 $\{1\}$ 后面加入贡献 1,在 $\{1,3\}$ 后面加入贡献 0,边际贡献变小了,正好反着。


🗳️ 七、Banzhaf 指数:另一把尺子

简单博弈里还有一个常用的权力度量。

手套博弈的获胜联盟只有 $\{1,2\},\{1,3\},\{1,2,3\}$。前两个里两人都关键;$\{1,2,3\}$ 里只有 1 号关键(去掉 2 还剩 $\{1,3\}$ 仍赢)。于是 $\eta=(3,1,1)$,$\beta=(\tfrac35,\tfrac15,\tfrac15)$

⚠️ Banzhaf 和 Shapley 的关键差别:Shapley 除以 $n!$(按排列平均),满足效率,是一个分配方案;Banzhaf 除以关键计数总和,不满足效率,只是一个相对权力指数。要分钱用 Shapley,要比较投票权大小两个都常见。


🗜️ 八、怎么把 v 写短,怎么算得动

上一章说过 $v$ 有 $2^n$ 个数。两种常见的简洁表示:

① 图博弈:给一张带权无向图,$v(S)$ = $S$ 导出子图的边权之和(比如「合作两两产生价值」)。

$$\phi_i=\tfrac12\sum_{j\ne i} w(\{i,j\})\qquad \text{⭐ 每条边的价值,两个端点一人一半}$$

多项式时间(Deng & Papadimitriou 1994)—— 但 ⚠️ 判断核心是否非空是 NP-完全的,「算 Shapley 容易、判核心难」在这里第一次出现。图博弈不是完全表达的(有些 $v$ 写不出来)。

② MC-nets(边际贡献网络):把 $v$ 写成一组规则 模式 → 值,模式是成员的合取(允许否定),$v(S)$ = 所有适用规则的值之和(Ieong & Shoham 2005)。

例:$x_1\wedge x_2\to 5$、$x_2\to 2$、$x_3\to 4$、$x_2\wedge\neg x_3\to -2$。那么 $v(\{2\})=2-2=0$,$v(\{2,3\})=2+4=6$,$v(\{1,2\})=5+2-2=5$,$v(N)=5+2+4=11$。

MC-nets 是完全表达的(每个联盟单独写一条规则即可),而且 —— 由 Shapley 值的可加性,只要逐条规则算 Shapley 再相加就行,线性时间。 第四节那条「看着像技术条件」的公理,在这里换成了算法。

算 Shapley 判核心非空
加权投票博弈 NP-难 多项式时间
图博弈 多项式时间 NP-完全
MC-nets 线性时间 NP-难

⚠️ 两列没有一行是同时容易的,而且难易顺序还会对调。别默认「概念简单 ⟹ 算得动」。


🤖 九、⭐⭐ 你可能早就在用 Shapley 值了

把「成员」换成「特征」,把「合作赚的钱」换成「模型的预测值」,Shapley 值就变成了 SHAP —— 目前工业界最主流的模型解释工具。

$$\text{预测值} = \underbrace{\phi_0}_{\text{基准}} + \sum_i \phi_i$$

那条「严格加起来等于预测值」的性质,就是第四节的效率公理;「对所有加入顺序取平均」也一字不差地搬了过来,原因还是同一个:特征之间有交互,取平均是为了公平分摊交互那部分。

而「$n!$ 个排列」的指数复杂度在工程上后果很具体:精确算不动,所以要么近似(KernelSHAP,慢到线上用不了),要么利用结构 —— TreeSHAP 靠树的结构在多项式时间内精确算出 Shapley 值。这正是第八节「表示法决定复杂度」的又一个实例,也是 SHAP 在大量用 GBDT 的工业界流行的直接原因。


🔗 这一章连到哪里

去哪 为什么
⭐⭐ ../模型上线之后/10-SHAP能做什么不能做什么.html 你可能早就在用 Shapley 值了,只是不知道它是这么来的。 那一章讲它落到工程上的样子:三种实现差四个数量级、TreeSHAP 为什么能精确算,以及三种误用 —— ⭐ 尤其是「拿 SHAP 当因果去改产品」那个复购 −0.4% 的事故。理论这边保证的是「公平分摊」,不是「改了会有用」
22-联盟博弈与核心.html 手套博弈的核心只有 $(1,0,0)$,而 Shapley 给 $(\tfrac46,\tfrac16,\tfrac16)$。回去看为什么稳定性会把 2、3 号的手套算成 0
24-投票规则.html Banzhaf 和 Shapley 都在量「一票有多大权力」。那一章问的是同一件事的另一半:票汇总成决定的规则本身该怎么选

✅ 检查点

  1. Shapley 值的一句话直觉是什么?为什么不能只取某一个联盟的边际贡献?
  2. $\phi_i$ 的排列版和联盟版公式各写一遍。联盟版里那两个阶乘是从哪来的?
  3. 煎饼博弈($v$:A=2, B=1, C=3, AB=5, AC=7, BC=4, ABC=16)的 Shapley 值是多少?手算时有哪两个自查?
  4. 唯一确定 Shapley 值的四条公理是什么?哪一条最有争议,为什么?
  5. 手套博弈的 Shapley 值是多少?它在核心里吗?这说明了什么?
  6. 凸博弈怎么定义(用边际贡献的说法)?为什么它的 Shapley 值一定在核心里?
  7. Banzhaf 指数怎么算?手套博弈的 $\beta$ 是多少?它和 Shapley 最关键的差别是哪一条?
  8. 图博弈的 Shapley 值公式是什么?MC-nets 为什么能线性时间算 Shapley?
  9. SHAP 里的「可加性」对应这一章的哪条公理?为什么 SHAP 必须「对所有顺序取平均」?
👀 答案
  1. 假设大家随机排队进场,每人平均带来多少增量。不能只看一个联盟,因为边际贡献取决于前面已经有谁 —— 糖对「已有面粉的团队」和对「空团队」价值完全不同。
  2. 排列版 $\phi_i=\frac{1}{n!}\sum_\pi \Delta_\pi(i)$;联盟版 $\phi_i=\frac{1}{n!}\sum_{S\subseteq N\setminus\{i\}}|S|!(n-|S|-1)!\,(v(S\cup\{i\})-v(S))$。两个阶乘是「有多少种排列让 $i$ 恰好接在 $S$ 后面」:$S$ 内部 $|S|!$ 种排法,$i$ 后面的人 $(n-|S|-1)!$ 种。
  3. $\phi_A=6,\ \phi_B=4,\ \phi_C=6$。自查:① 总和 $=16=v(N)$;② 每一行的三个增量也加起来 =16(望远镜求和),算错一个数行和立刻对不上。
  4. 效率、对称、虚拟成员、可加性,四条同时满足的分配唯一(Shapley 1953)。最有争议的是可加性 —— 它要求「两个项目合并成一个」时分配不变,而现实里合并常有协同效应。
  5. $(\tfrac46,\tfrac16,\tfrac16)$。⚠️ 不在核心里(核心只有 $(1,0,0)$;1 号和 3 号合计只拿 $\tfrac56<1$,会甩开 2 号重新配对)。说明「按贡献分」和「没人想掀桌」是两个不同目标
  6. $B\subseteq A \Rightarrow v(A\cup\{i\})-v(A)\ge v(B\cup\{i\})-v(B)$ —— 联盟越大,同一个人的边际贡献越大。因为每个排列的边际贡献向量都在核心里,Shapley 值是它们的平均,而核心是凸集
  7. $\eta_i$ = $i$ 是关键成员(去掉他联盟从赢变输)的联盟个数,$\beta_i=\eta_i/\sum_j\eta_j$。手套博弈 $\eta=(3,1,1)$,$\beta=(\tfrac35,\tfrac15,\tfrac15)$。关键差别:Shapley 满足效率、是分配方案;Banzhaf 不满足效率、只是相对权力指数。
  8. $\phi_i=\frac12\sum_{j\ne i}w(\{i,j\})$ —— 每条边的价值两个端点一人一半。MC-nets 靠 Shapley 值的可加性:逐条规则单独算再相加即可。
  9. 对应效率公理(各特征贡献严格加起来等于预测值减基准)。必须对所有顺序取平均,是因为特征之间有交互,一个特征在已知另一个时的边际贡献不同,取平均才能公平分摊交互那部分。

🛑 可以停在这里

走神救援

⭐⭐Shapley 值 = 假设大家随机排队进场,每人平均带来多少增量:$\phi_i=\frac{1}{n!}\sum_\pi\Delta_\pi(i)$,其中 $\Delta_\pi(i)=v(S_\pi(i)\cup\{i\})-v(S_\pi(i))$。为什么要对所有顺序取平均?因为边际贡献取决于前面已经有谁 —— 糖对「已有面粉的团队」和对「空团队」价值完全不同。等价的联盟版里那两个阶乘 $|S|!(n-|S|-1)!$ 就是「有多少种排列让 i 恰好接在 S 后面」。🥞n=3 手算套路(面粉 A=2、糖 B=1、草莓 C=3,AB=5、AC=7、BC=4、ABC=16):列 6 个排列,每行从左到右依次结算增量,求和除以 6$\phi_A=6,\phi_B=4,\phi_C=6$。⭐ 两个自查:总和 $=16=v(N)$;每一行也加起来 =16(望远镜求和),这既是效率的完整证明,也是手算最好用的检错手段。⭐四条公理(效率 / 对称 / 虚拟成员 / 可加性)唯一确定 Shapley 值(Shapley 1953);Young 1985 用「效率+对称+边际性」也唯一确定它。⚠️ 最有争议的是可加性(要求项目合并后分配不变,而现实里合并常有协同效应)。🧤手套博弈(1 号右手套,2、3 号各一只左手套):简单博弈可以只数「谁把局面从输变赢」,6 个排列里 1 号占 4 个 → Shapley $=(\tfrac46,\tfrac16,\tfrac16)$,而 nucleolus $=(1,0,0)$。⚠️⚠️ Shapley 值不在核心里 —— 给 2 号 1/6,1 号和 3 号合计只剩 5/6 < 1,他们会甩开他重新配对。⭐「按贡献分」和「没人想掀桌」是两个不同目标。 和解的那一类叫凸博弈($B\subseteq A\Rightarrow$ 边际贡献更大,联盟越大加进来越值钱):核心非空,每个排列的边际贡献向量都在核心里,Shapley 是它们的平均、核心又是凸集,所以 Shapley 也在核心里。Banzhaf 指数数「$i$ 是关键成员的联盟个数」再归一化,手套博弈 $\eta=(3,1,1)\Rightarrow\beta=(\tfrac35,\tfrac15,\tfrac15)$;⚠️ 它不满足效率,是权力指数不是分配方案。表示法:图博弈 $\phi_i=\frac12\sum_j w(\{i,j\})$(多项式时间,但判核心非空是 NP-完全);MC-nets 用规则 模式→值 写 $v$,完全表达,靠可加性逐规则相加、线性时间。⚠️ 三种表示里「算 Shapley」和「判核心」没有一行同时容易。⭐⭐最后一件事:把「成员」换成「特征」、把「赚的钱」换成「预测值」,Shapley 值就是 SHAP。 那条「各特征贡献严格加起来等于预测值」正是效率公理;而 $n!$ 的指数复杂度,正是 SHAP 必须近似、或靠 TreeSHAP 用树结构做到多项式时间精确的原因。

下一节 👉 24-投票规则.md

打卡记录保存在你的浏览器里,首页能看到总进度