Pengwee Wang's blog

Back

Data Shapley in One Training RunData Shapley in One Training Run
项目内容
发表会议ICLR 2025 Outstanding Paper Runner-Up 🏆
PDFarxiv.org/pdf/2406.11011 ↗
代码github.com/Jiachen-T-Wang/GhostSuite ↗

深度学习中一个核心问题是如何公平地量化每个训练样本对模型性能的贡献,Data Shapley是其中一种方案。但是原始的Shapley 值的计算需要重复训练,对于大规模数据集计算 impractical。In-run Data Shapley提供了一种一次训练即可得到所有样本 Shapley 值的方法。

原始 Data Shapley#

定义#

将训练集 D={z1,z2,...,zn}D = \{z_1, z_2, ..., z_n\} 看作合作博弈中的 nn 个”玩家”,学习算法 AA 为博弈规则,效用函数 V(S)V(S) 为在子集 S⊆DS \subseteq D 上训练得到的模型在固定验证集上的性能(如准确率或负损失)。那么样本 ziz_i 的 Data Shapley Value 定义为所有可能子集的加权边际贡献之和:

ϕi=1n∑k=0n−1(n−1k)−1∑S⊆D∖{i}∣S∣=k[V(S∪{i})−V(S)]\phi_i = \frac{1}{n} \sum_{k=0}^{n-1} \binom{n-1}{k}^{-1} \sum_{\substack{S \subseteq D \setminus \{i\} \\ |S| = k}} \big[ V(S \cup \{i\}) - V(S) \big]

这等价于:

ϕi=1n!∑π∈Π[V(Piπ∪{i})−V(Piπ)]\phi_i = \frac{1}{n!} \sum_{\pi \in \Pi} \big[ V(P_i^\pi \cup \{i\}) - V(P_i^\pi) \big]

其中 PiπP_i^\pi 是在排列 π\pi 中排在 ii 之前的所有样本。

性质#

Data Shapley 是唯一同时满足以下性质的估值方法:

公理含义
Null Player(零贡献)如果一个样本加入任何子集都不改变模型性能,其 Shapley 值为 0
Symmetry(对称性)如果两个样本对所有子集的边际贡献完全相同,它们的 Shapley 值相等
Additivity(可加性)如果性能由两个指标 V+WV+W 衡量,Shapley 值满足 ϕi(V+W)=ϕi(V)+ϕi(W)\phi_i(V+W) = \phi_i(V) + \phi_i(W)
Efficiency(效率)所有样本的 Shapley 值之和等于 V(D)−V(∅)V(D) - V(\emptyset)(即总效用增量)

显然,如果要精确计算规模为n的数据集需要对 2n2^n 个子集训练模型,计算复杂度为 O(2n)O(2^n),对大规模数据集完全不可行。

In-Run Data Shapley#

论文定义局部效用函数:

U(t)(S)=ℓ(w~t+1(S),zval)−ℓ(wt,zval)U^{(t)}(S) = \ell(\tilde{w}_{t+1}(S), z^{\text{val}}) - \ell(w_t, z^{\text{val}})

其中 w~t+1(S)=wt−ηt∑z∈S∇ℓ(wt,z)\tilde{w}_{t+1}(S) = w_t - \eta_t \sum_{z \in S} \nabla \ell(w_t, z),表示只用子集 S⊆batchS \subseteq \text{batch} 做梯度更新后的参数。其含义为在第 tt 步迭代中,如果只使用 SS 中的数据做梯度更新,验证集损失的变化量。

将上式 U(t)(S)U^{(t)}(S) 中 ℓ(w,zval)\ell(w, z^{\text{val}}) 视为关于参数 ww 的多元标量函数,在 wtw_t 处做二阶泰勒展开。

f(w)=f(wt)+∇f(wt)T(w−wt)+12(w−wt)T∇2f(wt)(w−wt)+O(∥w−wt∥3) f(w) = f(w_t) + \nabla f(w_t)^T (w - w_t) + \frac{1}{2} (w - w_t)^T \nabla^2 f(w_t) (w - w_t) + O(\|w - w_t\|^3)

可得

U(t)(S)=−ηt∑z∈S∇ℓ(wt,zval)⋅∇ℓ(wt,z)⏟U1(S)+12ηt2(∑z∈S∇ℓ(wt,z))THt(∑z∈S∇ℓ(wt,z))⏟U2(S)+O(ηt3)U^{(t)}(S) = \underbrace{-\eta_t \sum_{z \in S} \nabla \ell(w_t, z^{\text{val}}) \cdot \nabla \ell(w_t, z)}_{U_1(S)} + \frac{1}{2} \underbrace{\eta_t^2 \left(\sum_{z \in S} \nabla \ell(w_t, z)\right)^T H_t \left(\sum_{z \in S} \nabla \ell(w_t, z)\right)}_{U_2(S)} + O(\eta_t^3)

先给答案,一阶近似下的 In-Run Data Shapley 有闭式解:

ϕz(U)≈∑t=0T−1ϕz(U1(t))\phi_z(U) \approx \sum_{t=0}^{T-1} \phi_z(U_1^{(t)})

其中对每一步 t=0,…,T−1t = 0, \ldots, T-1:

ϕz(U1(t))=−ηt  ∇ℓ(wt,zval)⋅∇ℓ(wt,z)\phi_z(U_1^{(t)}) = -\eta_t \; \nabla\ell(w_t, z^{\text{val}}) \cdot \nabla\ell(w_t, z)

二阶近似下的 In-Run Data Shapley 也有闭式解:

ϕz(U)≈∑t=0T−1(ϕz(U1(t))+12ϕz(U2(t)))\phi_z(U) \approx \sum_{t=0}^{T-1} \left( \phi_z(U_1^{(t)}) + \frac{1}{2} \phi_z(U_2^{(t)}) \right)

其中对每一步 t=0,…,T−1t = 0, \ldots, T-1,组合后的单步公式为:

ϕz(U1(t))+12ϕz(U2(t))=−ηt  ∇ℓ(wt,zval)⋅∇ℓ(wt,z)+ηt22  ∇ℓ(wt,z)⊤Ht(∑zj∈batch∇ℓ(wt,zj))\phi_z(U_1^{(t)}) + \frac{1}{2} \phi_z(U_2^{(t)}) = -\eta_t \; \nabla\ell(w_t, z^{\text{val}}) \cdot \nabla\ell(w_t, z) + \frac{\eta_t^2}{2} \; \nabla\ell(w_t, z)^\top H_t \left( \sum_{z_j \in \text{batch}} \nabla\ell(w_t, z_j) \right)

第一项衡量训练样本 zz 对验证样本损失的直接影响(梯度方向对齐),第二项捕捉 zz 与 batch 中其他样本的交互(通过 Hessian 矩阵调整)。

一阶近似及计算技巧#

对于一阶 In-run Data Shapley,U1U_1 是”可加和效用函数”,满足:

U1(S)=∑z∈Sf(z)U_1(S) = \sum_{z \in S} f(z)

即集合的效用等于集合中每个样本各自贡献的简单加和,每个 f(z)f(z) 只依赖于 zz 自身,与其他样本无关。

则有:

U1(S∪{z})−U1(S)=(f(z)+∑zi∈Sf(zi))−∑zi∈Sf(zi)=f(z)U_1(S \cup \{z\}) - U_1(S) = \left(f(z) + \sum_{z_i \in S} f(z_i)\right) - \sum_{z_i \in S} f(z_i) = f(z)

那么,代入 Shapley 值定义可得:

ϕz(U1)=1N∑k=1N(N−1k−1)−1∑S⊆D−z,∣S∣=k−1f(z)=f(z)⋅1N∑k=1N(N−1k−1)−1(N−1k−1)=f(z)\phi_z(U_1) = \frac{1}{N} \sum_{k=1}^N \binom{N-1}{k-1}^{-1} \sum_{S \subseteq D_{-z}, |S|=k-1} f(z) = f(z) \cdot \frac{1}{N} \sum_{k=1}^N \binom{N-1}{k-1}^{-1} \binom{N-1}{k-1} = f(z)

因此:

ϕz(U1)=−ηt∇ℓ(wt,zval)⋅∇ℓ(wt,z)\phi_z(U_1) = -\eta_t \nabla\ell(w_t, z^{\text{val}}) \cdot \nabla\ell(w_t, z)

其中 ∇ℓ(wt,zval)\nabla\ell(w_t, z^{\text{val}}) 为验证梯度, ∇ℓ(wt,z)\nabla\ell(w_t, z) 为训练梯度,其仍满足shapley值四大公理。

注意上式只用了验证集一个点用于计算shapley值,但由于可加性,因此可以轻易拓展到整个验证集。

个人理解#

可以这样理解:验证梯度是验证点想让模型向哪个方向走,训练梯度是训练样本想让模型往哪个方向走,两个方向一致说明zz是 正贡献,方向相反说明则是负贡献。

对于一阶shapley值的相对大小,将 sz:=ϕz(U1)=−ηt∇ℓ(zval)⋅∇ℓ(z)s_z := \phi_z(U_1) = -\eta_t \nabla\ell(z^{\text{val}}) \cdot \nabla\ell(z) 分解:

sz=−ηt  ∥∇ℓ(zval)∥  ∥∇ℓ(z)∥  cos⁡θs_z = -\eta_t \; \|\nabla\ell(z^{\text{val}})\| \; \|\nabla\ell(z)\| \; \cos\theta

由于 ∇ℓ(zval)\nabla\ell(z^{\text{val}}) 和 ηt\eta_t 在同一 batch 内对所有样本是公共的,则样本间的相对价值取决于两个因素:

因素含义对得分的影响
∥∇ℓ(z)∥\|\nabla\ell(z)\|(梯度范数)该样本在当前参数处的”陡峭程度”——模型对该样本的预测”自信”还是”不自信”范数大 → 该样本的单步影响大(无论正负)
cos⁡θ\cos\theta(方向对齐度)该样本降低自身损失的方向与降低验证损失的方向是否一致越一致 → 正贡献越大;越相反 → 负贡献越大

更具象的类比:把模型训练想象成众人划船:

  • 验证梯度 = 船想去的方向(目标方向)
  • 每个样本的梯度 = 每个人划船的方向和力气
  • ∥∇ℓ(z)∥\|\nabla\ell(z)\| = 这个人划得有多用力
  • cos⁡θ\cos\theta = 这个人划的方向和船要去的方向是否一致

相对贡献的理解:

  • 两个人都在正向划(正贡献),但一个人划得更用力(梯度范数大),他的贡献就更大
  • 两个人用同样的力气,但一个人划的方向和船头方向更对齐(cos⁡θ\cos\theta 更大),他的贡献就更大

以上分析同时可以看出:验证集的质量非常重要。

计算技巧:Ghost Dot-Product#

对线性层 s=aW\mathbf{s} = \mathbf{a}\mathbf{W}(W∈Rd1×d2\mathbf{W} \in \mathbb{R}^{d_1 \times d_2}),链式法则给出:

∂ℓ(i)∂W=∂ℓ(i)∂s(i)⊗a(i)=b(i)⊗a(i)\frac{\partial \ell^{(i)}}{\partial \mathbf{W}} = \frac{\partial \ell^{(i)}}{\partial \mathbf{s}^{(i)}} \otimes \mathbf{a}^{(i)} = \mathbf{b}^{(i)} \otimes \mathbf{a}^{(i)}

其中:

  • a(i)∈Rd1\mathbf{a}^{(i)} \in \mathbb{R}^{d_1} 是第 ii 个样本在该层的输入激活值(前向传播时已计算)
  • b(i)∈Rd2\mathbf{b}^{(i)} \in \mathbb{R}^{d_2} 是第 ii 个样本在该层的输出梯度(反向传播时已计算)

注意到:ℓ=∑j=1Bℓ(j)\ell = \sum_{j=1}^B \ell^{(j)} 是 batch 内损失的和,对 ℓ\ell 做反向传播时,每个样本 ℓ(i)\ell^{(i)} 对 s(i)\mathbf{s}^{(i)} 的偏导等于总损失对 s(i)\mathbf{s}^{(i)} 的偏导:

∂ℓ(i)∂s(i)=∂ℓ∂s(i)\frac{\partial \ell^{(i)}}{\partial \mathbf{s}^{(i)}} = \frac{\partial \ell}{\partial \mathbf{s}^{(i)}}

这意味着 (a(i),b(i))(\mathbf{a}^{(i)}, \mathbf{b}^{(i)}) 在一次 batch 前向+反向传播中全部自然可得,无需额外计算。

因此对于两个样本梯度点积可以这样计算:

∂ℓ(1)∂W⊙∂ℓ(2)∂W=(b(1)⊗a(1))⊙(b(2)⊗a(2))=((a(1))Ta(2))((b(1))Tb(2))\begin{aligned} \frac{\partial \ell^{(1)}}{\partial \mathbf{W}} \odot \frac{\partial \ell^{(2)}}{\partial \mathbf{W}} &= (\mathbf{b}^{(1)} \otimes \mathbf{a}^{(1)}) \odot (\mathbf{b}^{(2)} \otimes \mathbf{a}^{(2)}) \\ &= ((\mathbf{a}^{(1)})^T \mathbf{a}^{(2)})((\mathbf{b}^{(1)})^T \mathbf{b}^{(2)}) \end{aligned}

具体流程如下:

二阶近似 及 高效计算#

ϕz(U(t))=ϕz(U1)+12ϕz(U2)=−ηt∇ℓ(wt,zval)⋅∇ℓ(wt,z)+ηt22∇ℓ(wt,z)THt(∑zj∈batch∇ℓ(wt,zj))\phi_z(U^{(t)}) = \phi_z(U_1) + \frac{1}{2}\phi_z(U_2) = -\eta_t \nabla\ell(w_t, z^{\text{val}}) \cdot \nabla\ell(w_t, z) + \frac{\eta_t^2}{2} \nabla\ell(w_t, z)^T H_t \left(\sum_{z_j \in \text{batch}} \nabla\ell(w_t, z_j)\right)

一阶项已经证明;对于二阶项证明如下:

记 xj:=∇ℓ(wt,zj)x_j := \nabla\ell(w_t, z_j),x~:=∇ℓ(wt,z)\tilde{x} := \nabla\ell(w_t, z),H:=HtH := H_t。

则 U2(S)=ηt2(∑zj∈Sxj)TH(∑zj∈Sxj)U_2(S) = \eta_t^2 \left(\sum_{z_j \in S} x_j\right)^T H \left(\sum_{z_j \in S} x_j\right)。

(a) 先求边际贡献。对任意 S⊆batch∖{z}S \subseteq \text{batch} \setminus \{z\}:

U2(S∪{z})−U2(S)=ηt2(x~+∑j∈Sxj)TH(x~+∑j∈Sxj)−ηt2(∑j∈Sxj)TH(∑j∈Sxj)=ηt2(2x~TH(∑j∈Sxj)+x~THx~)\begin{aligned} U_2(S\cup\{z\}) - U_2(S) &= \eta_t^2 \left(\tilde{x} + \sum_{j\in S} x_j\right)^T H \left(\tilde{x} + \sum_{j\in S} x_j\right) - \eta_t^2 \left(\sum_{j\in S} x_j\right)^T H \left(\sum_{j\in S} x_j\right) \\ &= \eta_t^2 \left( 2\tilde{x}^T H \left(\sum_{j\in S} x_j\right) + \tilde{x}^T H \tilde{x} \right) \end{aligned}

这里展开时注意 (∑Sxj)THx~=x~TH(∑Sxj)\left(\sum_{S} x_j\right)^T H \tilde{x} = \tilde{x}^T H \left(\sum_{S} x_j\right) (标量的转置等于自身),所以交叉项合并为 2x~TH∑Sxj2\tilde{x}^T H \sum_{S} x_j。

(b) 代入 Shapley 值定义。令 n=∣batch∣n = |\text{batch}|:

ϕz(U2)=ηt2⋅1n∑k=1n(n−1k−1)−1∑S⊆batch∖{z},∣S∣=k−1[2x~TH∑j∈Sxj+x~THx~]\phi_z(U_2) = \eta_t^2 \cdot \frac{1}{n} \sum_{k=1}^n \binom{n-1}{k-1}^{-1} \sum_{S \subseteq \text{batch}\setminus\{z\}, |S|=k-1} \left[ 2\tilde{x}^T H \sum_{j\in S} x_j + \tilde{x}^T H \tilde{x} \right]

把常数项 x~THx~\tilde{x}^T H \tilde{x} 提出来。对任意 kk,大小为 k−1k-1 的子集 SS 的数量是 (n−1k−1)\binom{n-1}{k-1},所以:

1n∑k=1n(n−1k−1)−1(n−1k−1)x~THx~=1n∑k=1nx~THx~=x~THx~\frac{1}{n} \sum_{k=1}^n \binom{n-1}{k-1}^{-1} \binom{n-1}{k-1} \tilde{x}^T H \tilde{x} = \frac{1}{n} \sum_{k=1}^n \tilde{x}^T H \tilde{x} = \tilde{x}^T H \tilde{x}

对于含 ∑Sxj\sum_{S} x_j 的项,关键步骤是利用对称性:每个 zj(j≠z)z_j (j \neq z) 出现在所有 SS 中的次数是相同的。大小为 k−1k-1 且包含特定 zjz_j 的子集 SS 的数量是 (n−2k−2)\binom{n-2}{k-2}(从除 zz 和 zjz_j 外的 n−2n-2 个中选 k−2k-2 个)。因此:

1n∑k=1n(n−1k−1)−1∑S,∣S∣=k−12x~TH∑j∈Sxj=2n∑k=2n(n−1k−1)−1(n−2k−2)x~TH(∑zj∈batch∖{z}xj)=2n∑k=2nk−1n−1⋅x~TH(∑zj∈batch∖{z}xj)=x~TH(∑zj∈batch∖{z}xj)\begin{aligned} &\frac{1}{n} \sum_{k=1}^n \binom{n-1}{k-1}^{-1} \sum_{S, |S|=k-1} 2\tilde{x}^T H \sum_{j\in S} x_j \\ &= \frac{2}{n} \sum_{k=2}^n \binom{n-1}{k-1}^{-1} \binom{n-2}{k-2} \tilde{x}^T H \left(\sum_{z_j \in \text{batch}\setminus\{z\}} x_j\right) \\ &= \frac{2}{n} \sum_{k=2}^n \frac{k-1}{n-1} \cdot \tilde{x}^T H \left(\sum_{z_j \in \text{batch}\setminus\{z\}} x_j\right) \\ &= \tilde{x}^T H \left(\sum_{z_j \in \text{batch}\setminus\{z\}} x_j\right) \end{aligned}

其中 (n−2k−2)/(n−1k−1)=k−1n−1\binom{n-2}{k-2}/\binom{n-1}{k-1} = \frac{k-1}{n-1}(组合数化简),而 2n∑k=2nk−1n−1=2n⋅n(n−1)2(n−1)=1\frac{2}{n}\sum_{k=2}^n \frac{k-1}{n-1} = \frac{2}{n} \cdot \frac{n(n-1)}{2(n-1)} = 1(等差数列求和)。

(c) 合并两项得到:

ϕz(U2)=ηt2(x~THx~+x~TH(∑zj∈batch∖{z}xj))=ηt2x~TH(∑zj∈batchxj)\phi_z(U_2) = \eta_t^2 \left( \tilde{x}^T H \tilde{x} + \tilde{x}^T H \left(\sum_{z_j \in \text{batch}\setminus\{z\}} x_j\right) \right) = \eta_t^2 \tilde{x}^T H \left(\sum_{z_j \in \text{batch}} x_j\right)

高效计算#

我没看懂,记录如下

二阶项需要计算梯度-Hessian-梯度乘积:

ϕz(U2)=ηt2⋅∇ℓ(z)T⋅H⋅(∑zj∈batch∇ℓ(zj))\phi_z(U_2) = \eta_t^2 \cdot \nabla\ell(z)^T \cdot H \cdot \left(\sum_{z_j \in \text{batch}} \nabla\ell(z_j)\right)

通过H⋅v=∇(∇L⋅v)H \cdot v = \nabla(\nabla L \cdot v),将 HH 与 vv 的乘积转化为”先算一个标量,再对这个标量求梯度”。

具体流程:

第一次反向传播(与一阶共享,1 次 backprop):

对 ∑z∈batchℓ(z)+ℓ(zval) 做反向传播\text{对 } \sum_{z \in \text{batch}} \ell(z) + \ell(z^{\text{val}}) \text{ 做反向传播}

得到所有样本在各层的激活值 al(i)\mathbf{a}_l^{(i)} 和输出梯度 bl(i)\mathbf{b}_l^{(i)}。

构造标量 ss(用 Ghost Dot-Product 计算,无需构造向量):

s=∇ℓ(zval)⋅(∑j∇ℓ(zj))=∑l((alval)T∑jal(j))  ((blval)T∑jbl(j))s = \nabla\ell(z^{\text{val}}) \cdot \left(\sum_{j} \nabla\ell(z_j)\right) = \sum_l ((\mathbf{a}_l^{\text{val}})^T \sum_j \mathbf{a}_l^{(j)}) \; ((\mathbf{b}_l^{\text{val}})^T \sum_j \mathbf{b}_l^{(j)})

第二次反向传播(1 次额外 backprop):

h:=∂s∂w=H⋅(∑j∇ℓ(zj))h := \frac{\partial s}{\partial w} = H \cdot \left(\sum_j \nabla\ell(z_j)\right)

反向传播自动计算出这个 Hessian-向量积,全程不构造 Hessian 矩阵。

对每个样本用 Ghost Dot-Product 算 ϕz(U2)\phi_z(U_2):

ϕzi(U2)=ηt2⋅∇ℓ(zi)⋅h\phi_{z_i}(U_2) = \eta_t^2 \cdot \nabla\ell(z_i) \cdot h

同样用 Ghost 公式逐层计算:

∇ℓ(zi)⋅h=∑l((al(i))Thla)  ((bl(i))Thlb)\nabla\ell(z_i) \cdot h = \sum_l ((\mathbf{a}_l^{(i)})^T \mathbf{h}_l^a) \; ((\mathbf{b}_l^{(i)})^T \mathbf{h}_l^b)

其中 hla,hlb\mathbf{h}_l^a, \mathbf{h}_l^b 是 hh 按层的分解。

局限性#

  • 验证数据必须在训练前可用
  • 二阶改进幅度有限
  • 只能用于SDG优化器,因为 Adam 的参数更新不是梯度的线性函数

应用#

数据清洗:一次训练后排序移除 Shapley 值最低的样本

数据配比:

Shapley 值衡量的是”贡献”而非”难度”,需要注意高 Shapley 值的样本往往是”难但有价值”的样本,而不是”简单”样本。,同时样本在模型训练的不同阶段会贡献会不同。

一些思路:

追踪每个样本的 Shapley 值随训练步数的变化:

  • 早期高、后期低 → 已学会的基础样本
  • 逐渐从负转正 → “可教”的样本,适合在当前阶段加入
  • 始终为负 → 问题数据,排除
  • 后期才变高 → 适合后期加入的”进阶”样本
Data Shapley in One Training Run
https://pengwee.wang/blog/in-run_data_shapley/
Author Pengwee Wang
Published at May 27, 2026
Comment seems to stuck. Try to refresh?✨