FAIM算法:基于最优传输的机器学习多准则公平性权衡框架
1. FAIM算法:当机器学习公平性成为一道多选题
在构建一个用于信用评分、招聘筛选或司法风险评估的机器学习模型时,我们常常会陷入一个两难甚至多难的境地。模型在总体上的高准确率,可能掩盖了其对不同群体(如不同性别、种族)的不公平对待。更棘手的是,当我们试图去修正这种不公平时,会发现“公平”本身就有多个相互冲突的定义。比如,要求模型对每个群体的预测都校准良好(即预测概率反映真实概率),可能与要求模型对不同群体中“好”的个体给予同等机会(正类平衡)相矛盾。这就好比试图同时让一个天平保持绝对水平和让两边的砝码重量相等——在基础重量不同的情况下,这几乎是不可能的。
传统的公平性干预方法,如阈值调整或重新加权,往往只能针对单一公平性准则进行优化,强行满足一个目标可能会恶化其他目标。有没有一种方法,能让我们像调节调色盘一样,在多个公平性目标之间进行平滑、可控的权衡呢?这正是FAIM(Fairness-Aware Intervention using Multi-criteria)算法要回答的问题。它没有试图寻找那个不存在的“唯一最优解”,而是引入了一套基于最优传输理论的数学框架,允许决策者通过几个简单的权重参数,来灵活地调配对“群体校准”、“负类平衡”和“正类平衡”等不同公平性诉求的重视程度。这相当于为公平性这个复杂问题提供了一个带有滑块的“控制面板”。接下来,我将深入拆解FAIM背后的核心思想、实现细节,并结合实验数据,分享在实际应用中如何理解和设置这些“公平旋钮”。
2. 公平性冲突的本质与最优传输的解决思路
在深入算法之前,我们必须先理解为什么这些公平性准则会相互“打架”。这并非算法缺陷,而是不同公平性定义在数学上固有的内在冲突。
2.1 三大核心公平性准则的数学表述
假设我们有一个二分类模型(如“是否给予贷款”),它为每个个体
x
输出一个得分
S(x)
(如信用分数),并根据阈值(如0.5)做出决策。我们关注两个受保护的群体
t=1
和
t=2
(如男性和女性)。设
Y(x)
为个体的真实标签(1为正类,0为负类)。三个经典的公平性准则可以表述为:
-
准则A:群体内校准 。对于每个群体
t,以及任意得分s,模型预测为正类的概率应该等于该得分下个体的真实正类比例。即:P(Y=1 | S=s, group=t) = s。 它关心的是预测的“诚实度” :一个声称有70%概率违约的申请人,其真实违约率就应该接近70%,无论他属于哪个群体。 -
准则B:负类平衡 。对于所有真实为负类(
Y=0)的个体,他们得分的条件分布应该在两个群体间一致。即:P(S | Y=0, group=1) = P(S | Y=0, group=2)。 它关心的是对“好”人的公平对待 :在所有实际上不会违约的申请人中,男性和女性获得的信用分数分布应该相同,从而避免某一群体被过度怀疑。 -
准则C:正类平衡 。对于所有真实为正类(
Y=1)的个体,他们得分的条件分布应该在两个群体间一致。即:P(S | Y=1, group=1) = P(S | Y=1, group=2)。 它关心的是对“坏”人的公平对待 :在所有实际上会违约的申请人中,男性和女性获得的信用分数分布应该相同,从而避免某一群体的风险被系统性低估。
2.2 不可能三角与权衡的必要性
著名的“不可能三角”定理指出,除了在极其特殊(通常不现实)的情况下,一个分类器无法同时满足群体内校准、正类平衡和负类平衡。例如,如果两个群体的正类基础率(
P(Y=1|group)
)不同,那么满足校准的模型必然无法同时满足正类或负类平衡。
这就引出了核心问题:既然无法同时完美满足,我们该如何在它们之间做出取舍?FAIM的答案不是“三选一”,而是“按需混合”。它的目标不是找到一个满足所有准则的得分函数
S
,而是
找到一个对原始得分
S
的变换
T
,使得变换后的得分
S' = T(S)
所对应的分布,是三个理想分布(分别完美满足A、B、C准则)的一个加权妥协。
2.3 最优传输:衡量和连接分布差异的尺子
如何量化两个概率分布之间的差异,并找到一个将它们联系起来的“最佳”变换?这就是最优传输理论大显身手的地方。简单类比:想象有两个土堆,分布不同。最优传输要解决的问题是,如何以最小的“总做功”将第一个土堆的形态搬运成第二个土堆的形态。这里“做功”通常用Wasserstein距离(也称推土机距离)来衡量,它不仅考虑概率质量的差异,还考虑取值空间(如得分从0到1)上的几何距离。
FAIM算法的精髓在于,它分别为每个群体
t
构造了三个目标分布:
-
μ_t^A: 完美满足准则A(群体校准)后的得分分布。 -
μ_t^B: 完美满足准则B(负类平衡)后的得分分布。 -
μ_t^C: 完美满足准则C(正类平衡)后的得分分布。
这三个分布构成了一个“公平性目标三角形”。FAIM接下来要做的,就是为每个群体找到一个最终的“公平分布”
μ̄_t
,作为这三个目标分布的加权重心(Wasserstein重心)。权重
θ^A, θ^B, θ^C
(相加为1)就代表了决策者对三个公平性准则的偏好。最后,通过计算从原始分布
ν_t
到这个公平分布
μ̄_t
的最优传输映射
T_t
,并将此映射应用于每个个体的原始得分,即可得到公平化后的新得分。
注意 :这个过程是 逐群体独立进行 的。这意味着我们为男性群体和女性群体分别计算了不同的变换映射
T_男和T_女。公平性不是通过给所有人生硬地套用同一个公式来实现的,而是通过为每个群体量身定制其得分调整策略,使调整后所有群体的分布达到我们设定的平衡目标。
3. FAIM算法核心步骤拆解与实操要点
理解了高层思想,我们来看FAIM算法(Algorithm 1)是如何一步步实现的。我将结合伪代码和具体解释,说明每个步骤的意图、计算细节以及需要注意的坑。
3.1 输入与预处理
算法输入非常直观:
-
rawScores[]: 每个个体的原始模型得分。 -
groundTruthLabels[]: 每个个体的真实二元标签(0或1)。 -
groups[]: 每个个体的群体归属标签。 -
stepsize: 用于将连续得分离散化为直方图的箱宽(bin width)。例如,得分范围在[0,1],stepsize=0.01则会创建100个箱。 -
thetas[[]]: 一个矩阵,每一行对应一个群体t,包含三个权重参数[θ_t^A, θ_t^B, θ_t^C]。
第一步总是预处理
:将原始得分归一化到[0,1]区间,并按照
stepsize
进行离散化。这步至关重要,因为后续的最优传输计算通常在离散分布(直方图)上进行,效率更高。
实操心得:
stepsize的选择 。stepsize不能太小,否则直方图过于稀疏,计算不稳定且耗时;也不能太大,否则会过度平滑,丢失分布细节,影响公平性调整的精度。通常,根据数据量,选择使得每个箱内平均有数十到数百个样本的stepsize是一个不错的起点。可以先尝试0.05或0.02,观察结果分布是否过于锯齿状。
3.2 步骤一:计算满足准则A的分布
μ_t^A
准则A要求群体内校准。对于离散化的每个得分值
s
,在群体
t
内,校准后的得分
s_t^A
应等于在该得分下,真实标签为正例的个体比例。公式即算法第6行:
s_t^A = (# of individuals in group t with score s AND label 1) / (# of individuals in group t with score s)
操作意图
:这本质上是一个
分箱平滑的校准过程
。它为群体
t
内的每个原始得分
s
计算了一个新的、校准后的得分值。然后,通过一个映射
S_t^A
(将
s
映射到
s_t^A
),将群体
t
内所有个体的原始得分进行转换,得到新得分数组
criterionAScores[]
。这个新得分数组的直方图,就是目标分布
μ_t^A
。
潜在问题与处理
:如果某个得分箱
s
在群体
t
内没有样本,或者样本全是负例(分母为0),
s_t^A
的计算会出问题。在实际实现中,需要对这种边界情况进行处理,例如使用相邻箱的值进行插值,或赋予一个默认值(如该群体的整体正例率)。
3.3 步骤二:计算满足准则B的分布
μ_t^B
准则B要求负类平衡。目标是让所有 真实负例 个体的得分分布在群体间一致。算法通过一个巧妙的间接方式实现。
-
计算条件分布
σ_t^-:对于每个群体t,计算其 真实负例个体 的得分分布。注意,这不是整个群体的得分分布,而是Y=0这个子集的分布。这就是公式(4)和算法第17-23行所做的事。它统计了在每个得分箱s上,群体t中真实负例个体所占的比例。 -
计算负例得分的群体间重心
σ̄^-:得到了群体1和群体2的负例得分分布σ_1^-和σ_2^-后,算法计算它们的Wasserstein-2重心σ̄^-(第25行)。这个重心分布,就是我们希望两个群体的负例得分最终都趋近的目标分布。权重通常取各群体负例人数占总负例人数的比例(N_t^- / (N_1^- + N_2^-))。 -
计算最优传输映射
T_t^-并得到μ_t^B:对于每个群体t,计算从其负例得分分布σ_t^-到公共重心σ̄^-的最优传输映射T_t^-(第28行)。这个映射告诉我们,为了达到负例平衡,群体t中每个得分的负例个体,其得分应该被调整到多少。 关键一步 :将这个映射T_t^-仅应用于 该群体内的真实负例个体,改变他们的得分(第29行)。然后, 用调整后的负例得分和未调整的正例得分,共同组成该群体新的完整得分数组 ,其直方图即为μ_t^B。这意味着,μ_t^B是一个混合分布:负例部分被变换以达成平衡,正例部分保持不变。
注意事项:映射的定义域 。如原文第3.3.2节末尾所述,最优传输映射
T_t^-只在σ_t^-分布有支撑(即概率质量大于0)的得分区间上有定义。如果一个得分在群体t的负例中从未出现(例如,一个极其优秀的信用评分从未给过真实违约者),那么映射在这个点上未定义。最自然简单的处理方式是令T_t^- (x) = x,即保持不变。在实现时,需要对得分范围进行外推或插值来处理这些边界点。
3.4 步骤三:计算满足准则C的分布
μ_t^C
准则C是准则B的镜像,关注正类平衡。计算过程与步骤二完全对称,只需将“负例”替换为“正例”。即:
-
计算每个群体
t的真实正例得分分布σ_t^+。 -
计算这些正例分布的重心
σ̄^+。 -
计算从每个
σ_t^+到σ̄^+的传输映射T_t^+,并仅应用于正例个体。 -
用调整后的正例得分和未调整的负例得分,组成新得分数组,得到分布
μ_t^C。
3.5 步骤四:计算最终公平分布并应用变换
这是FAIM的“调配”环节,也是其灵活性的体现。
-
计算加权重心
μ̄_t:对于每个群体t,现在我们有了三个目标分布:μ_t^A,μ_t^B,μ_t^C。算法根据输入的用户偏好权重θ_t^A, θ_t^B, θ_t^C,计算这三个分布的Wasserstein-2重心μ̄_t(第32行)。这个μ̄_t就是为该群体定制的“公平目标分布”。如果θ_t^A=1,则μ̄_t = μ_t^A,即完全追求校准;如果三个θ相等,则μ̄_t是三个分布的等权重心,代表一种折中。 -
计算最终传输映射
T_t并输出公平得分 :最后,计算从该群体的 原始整体得分分布ν_t到刚计算出的 公平目标分布μ̄_t的最优传输映射T_t(第34行)。这个T_t是一个从原始得分到新得分的函数。将该映射应用于群体t内每一个个体的原始得分,即得到最终的公平得分fairScores[](第35行)。
为什么需要这最后一步?
因为前三个步骤产生的
μ_t^A, μ_t^B, μ_t^C
以及它们的重心
μ̄_t
,都是我们构想中的“理想状态”分布。而
T_t
的作用,是找到一个切实可行的、对原始得分扰动最小的变换方式,使得变换后的实际分布尽可能接近这个理想状态。
4. 实验解析:FAIM在合成与真实数据上的表现
理论再优美,也需要实验验证。FAIM论文在合成数据、COMPAS数据和电商数据上进行了测试,结果清晰地展示了其权衡能力。
4.1 合成数据实验:一个清晰的演示
合成数据模拟了一个信用评分场景:一个优势群体(蓝色)和一个劣势群体(橙色)。基础模型系统性地高估了优势群体的信用(预测得分分布右偏),低估了劣势群体的信用(预测得分分布左偏),且对优势群体的预测更准。
结果可视化(对应原文图2) :
- 仅校准(θ^A=1) :得分分布变得两极分化。为了在每个得分区间内让预测概率等于真实正例比例,低分变得更低,高分变得更高。这加剧了群体间得分的分离。
- 仅负类平衡(θ^B=1) :只调整真实负例个体的得分。由于劣势群体中负例比例更高,FAIM将优势群体中负例的得分大幅降低,同时小幅提升劣势群体中负例的得分,使得两个群体负例的得分分布基本重合。这直接降低了优势群体的假正例率。
- 仅正类平衡(θ^C=1) :只调整真实正例个体的得分。原理类似,使得两个群体正例的得分分布重合,降低了劣势群体的假负例率。
- 三者等权混合(θ^A=θ^B=θ^C=1/3) :最终的得分分布和传输映射图,恰好是前三种情况的折中。它没有完全偏向任何一个极端,而是在三个目标间取得了平衡。
性能指标分析(对应原文表1)
:
表格数据证实了上述观察。当
θ^A=1
时,整体准确率提升最明显(从0.852升至0.885),因为校准直接优化了预测概率的准确性。当
θ^B=1
时,优势群体(蓝色)的假正例率大幅下降(从0.869降至0.392),这是负类平衡的直接目标。当
θ^C=1
时,劣势群体(橙色)的假负例率大幅下降(从0.990降至0.389)。而在等权混合下,模型在准确率、FPR、FNR上都取得了不错的、相对均衡的改进。
关键洞见 :这个实验完美展示了FAIM的核心价值—— 可控的权衡 。决策者可以根据业务场景选择侧重点。例如,在司法风险评估中,可能更看重降低假正例率(避免冤枉好人),则可赋予
θ^B更高权重;在医疗诊断中,可能更看重降低假负例率(避免漏诊病人),则可赋予θ^C更高权重。
4.2 COMPAS数据实验:算法无法拯救糟糕的基模型
COMPAS是一个臭名昭著的再犯风险评估工具,被指控存在种族偏见。FAIM在此数据上的实验得出了一个重要结论: “垃圾进,垃圾出” 。
基模型分析 :原始COMPAS模型的准确性在中间得分段(4-7分)非常低,几乎接近随机猜测(准确率约0.5-0.6)。这意味着模型在这些关键得分区间几乎没有判别能力。
FAIM的效果有限 :由于FAIM的核心是最优传输,它主要做的是“重新分配”得分,而不是“创造”判别力。对于一个在中间段近乎随机的模型,FAIM能做的只是让这种随机的分布在不同群体间变得更“公平”一些。实验发现,只有那些原始得分非常接近决策边界(如5分)的个体,其分类结果(高风险/低风险)才会因FAIM调整而改变。对于得分极高或极低的个体,FAIM的调整不足以让他们跨越决策边界。
启示 :FAIM是一个 后处理公平性干预 方法。它能够修正模型预测中的 分布性偏差 ,但无法弥补模型本身的 判别性不足 。如果基模型质量太差,任何公平性后处理都是徒劳的。公平性干预的前提,是一个在总体上有效的模型。
4.3 Zalando电商数据实验:缓解流行度偏见
这个实验展示了FAIM在推荐/排名场景下的应用。问题背景是:知名品牌(高可见度群体)的商品,由于其固有的马太效应(更多曝光、更多点击),即使与不知名品牌(低可见度群体)的商品质量相当,也更容易获得高的排名分数。
数据与设定 :将商品按品牌平均曝光度分为高可见度和低可见度两组。以点击率作为“相关性”的真实标签。目标是让排名模型在评估商品相关性时,减少对品牌可见度的依赖。
结果分析(对应原文表3) :原始模型对低可见度群体存在明显的低估(高假负例率,低召回率)。应用FAIM后:
-
追求校准(
θ^A=1)提升了整体准确率和召回率。 -
追求负类平衡(
θ^B=1)或正类平衡(θ^C=1)则分别拉平了假正例率和假负例率在两组间的差异。 - 三者等权混合取得了综合性的改善。
业务意义 :这为平台提供了一个工具,可以在“最大化整体点击率”和“给新兴或小众品牌公平曝光机会”之间进行权衡。通过调整θ参数,平台可以主动管理其生态系统的多样性,这不仅是商业策略,也可能符合某些地区数字市场法案对公平竞争的要求。
5. 实现FAIM:常见问题、调参心得与避坑指南
将FAIM从论文落地到实际代码,会遇到一系列工程和概念上的挑战。以下是我在复现和实验过程中的一些经验总结。
5.1 计算效率与稳定性
最优传输和Wasserstein重心的计算是FAIM的核心,也是主要的计算瓶颈。对于大规模数据集(数十万样本),直接使用精确算法(如线性规划)求解是不现实的。
解决方案 :
- 离散化与直方图 :正如算法所示,将连续得分离散化到有限个箱中,将分布表示为直方图,能极大简化计算。
- 使用近似算法 :对于Wasserstein距离和重心计算,可以使用Sinkhorn迭代等熵正则化方法。这些方法通过引入一个小的正则化参数,将问题转化为一个可以通过矩阵缩放快速求解的凸优化问题,速度极快,且易于GPU加速。
-
库的选择
:Python中的
POT(Python Optimal Transport) 库提供了高效且稳定的最优传输算法实现,包括Sinkhorn和barycenter的计算,是实现FAIM的绝佳选择。
参数选择 :
-
stepsize(箱宽):需要权衡精度和计算成本。建议通过观察不同stepsize下得到的公平得分分布是否平滑来调整。可以先从较粗的粒度(如0.05)开始,逐步细化,直到分布形态稳定。 -
Sinkhorn正则化参数
:如果使用Sinkhorn算法,正则化参数
reg不能太小(会导致数值不稳定),也不能太大(会过度平滑,损失精度)。通常从reg=0.1或reg=0.05开始尝试。
5.2 权重参数θ的理解与设置
θ^A, θ^B, θ^C
是FAIM提供给决策者的“旋钮”。如何设置它们?
-
业务目标驱动 :这是最重要的原则。你需要问:在这个场景下,哪种不公平的代价最高?
-
信用贷款
:假正例(给信用差的人贷款)导致坏账损失;假负例(拒绝信用好的人)损失利息收入并影响客户关系。通常银行更厌恶坏账,因此可能赋予
θ^B(负类平衡,降低优势群体的假正例)更高权重。 -
疾病筛查
:假负例(漏诊病人)可能导致病情延误,代价是生命健康;假正例(误诊)导致不必要的焦虑和检查成本。通常更看重
θ^C(正类平衡,降低劣势群体的假负例)。 -
内容推荐
:可能更看重
θ^A(校准),希望预测的点击概率真实反映用户兴趣,同时用θ^B/θ^C来适度纠偏,促进多样性。
-
信用贷款
:假正例(给信用差的人贷款)导致坏账损失;假负例(拒绝信用好的人)损失利息收入并影响客户关系。通常银行更厌恶坏账,因此可能赋予
-
网格搜索与帕累托前沿 :一种系统化的方法是进行网格搜索。在
θ^A+θ^B+θ^C=1的平面上选取一系列点(如(1,0,0),(0,1,0),(0,0,1),(1/3,1/3,1/3),(0.5,0.25,0.25)等)。对每个参数组合运行FAIM,计算一系列关心的指标(如总体准确率、各组FPR/FNR差异、最差群体的性能等)。然后将这些结果可视化,找到帕累托最优前沿(即无法在不损害一个指标的情况下改进另一个指标的参数集)。决策者可以在这个前沿上根据偏好进行选择。 -
群体特异性参数 :FAIM允许为不同群体设置不同的θ(
thetas[[]]矩阵)。这在某些场景下很有用。例如,如果历史数据表明对某个群体的歧视特别严重,你可能希望在该群体上使用更强的纠偏权重。但需格外谨慎,因为这可能引入新的公平性问题或法律风险。
5.3 验证与监控
应用FAIM后,绝不能假设万事大吉。
- 必须进行全面的后验评估 :计算公平化后的模型在所有关心的公平性指标上的表现。FAIM优化的是Wasserstein重心,但这不保证传统的公平性指标(如 demographic parity, equalized odds)会按预期变化。需要验证。
- 监控性能-公平性权衡 :记录应用FAIM前后,模型总体性能(AUC, 准确率)和群体间性能差异的变化。确保性能下降在可接受范围内。
-
概念漂移
:FAIM的传输映射
T_t是基于训练数据(或一个历史快照)计算得出的。如果数据分布随时间发生变化(概念漂移),这个映射可能不再适用。需要定期用新数据重新计算映射,或建立在线更新机制。
5.4 一个典型的实现陷阱与解决方案
陷阱
:在计算
μ_t^B
和
μ_t^C
时,只对负例/正例子集应用了传输映射
T_t^-
/
T_t^+
,然后与未调整的另一半合并成新分布。在代码实现时,如果简单地用映射函数去变换整个群体的得分数组,会导致正例/负例个体的得分被错误地变换。
解决方案 :在代码中严格区分群体掩码和标签掩码。伪代码逻辑应清晰如下:
# 假设已为群体t计算了负例传输映射 T_minus_t
group_mask = (groups == t)
neg_mask = (ground_truth_labels == 0) & group_mask
pos_mask = (ground_truth_labels == 1) & group_mask
# 初始化该群体的公平得分数组
fair_scores_t = np.zeros_like(raw_scores[group_mask])
# 仅对负例应用负例映射
fair_scores_t[neg_mask] = T_minus_t(raw_scores[group_mask][neg_mask])
# 正例得分保持不变(或应用其他映射,但在这一步保持不变)
fair_scores_t[pos_mask] = raw_scores[group_mask][pos_mask]
# 然后用 fair_scores_t 生成直方图,得到 mu_t_B
确保这个逻辑在计算
μ_t^B
和
μ_t^C
时被正确实现,是避免结果错误的关键。
FAIM算法为机器学习公平性这一充满张力的领域提供了一个优雅而强大的数学框架。它将“选择哪一个公平定义”的二元难题,转化为了“如何混合多个公平目标”的连续调控问题。通过最优传输理论,它实现了这种混合在分布层面的光滑操作。然而,它并非银弹。它无法挽救一个本身无效的模型,其效果严重依赖于权重参数θ的设置,而这本身就是一个需要结合伦理、法律和业务知识的价值判断过程。在实际应用中,我建议将FAIM作为一个重要的分析工具和干预选项,嵌入到更完整的模型开发与评估流程中,通过可视化的权衡分析,与利益相关者共同做出透明、负责任的决策。
更多推荐
所有评论(0)