你是一家千人食堂的主厨,负责让所有来吃饭的员工都满意。你翻出过去一年的点餐记录,发现九成是程序员点的——他们无辣不欢,于是你照着“平均口味”猛加辣椒。结果呢?不吃辣的财务同事、口味清淡的设计师全被辣哭了。这不是厨艺问题,是菜谱偏见问题。AI 模型也一样,它照着“喂”给它的历史数据学习,数据里藏着偏见,模型就会学会偏见。幸运的是,去偏见有章可循——就像食堂可以在买菜前筛选食材、做菜时控制火候、上菜后调整口味一样,AI 去偏见也分数据预处理、训练中约束、后处理修正三个层面。这篇文章会用食堂的故事,带你完整认识偏见从哪来、如何度量、怎么对症下药。

岗位关联

对 AI 从业者而言,掌握去偏见方法是模型合规与风险管控的必备技能。招聘、信贷、医疗等敏感场景中,偏见不仅伤害用户体验,还会带来法律与声誉风险;学会检测和修正偏见,能让你的模型更可信、更负责。

目录
  1. 可视化演示
  2. 偏见源头剖析:菜谱里就藏着“偏辣”
  3. 公平性度量检测:分桌统计满意率
  4. 数据预处理去偏:在买菜环节就把食材配平
  5. 训练过程约束:做菜时盯住辣度下勺子
  6. 后处理结果修正:上菜时按桌调整辣度
  7. 权衡与合规审计:不光是厨艺,还是经营账
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示AI去偏见方法全览的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

AI去偏见方法全览:AI偏见 AI偏见的来源与分类 公平性度量指标体系 核心机制可视化 AI去偏见方法全览整体架构与关键组件

偏见源头剖析:菜谱里就藏着“偏辣”

你翻看食堂过去一年的点餐记录,想弄清大家到底爱吃什么。可这沓记录九成来自程序员——他们深夜加餐、无辣不欢。你照着这份“平均口味”备料,注定让不吃辣的人没饭吃。AI 也一样,它吃的“菜谱”是历史数据。数据里沉淀着过去的偏好、采样时的遗漏、人工标注时的主观判断,模型照单全收,偏见就顺着数据流进了模型。要治偏见,先得知道它藏在哪儿。

偏见大致有四个来源,对应菜谱里的四种“隐患”。其一是历史偏见:过去本身就不公平,比如某行业长期由单一群体主导,历史数据会如实记下这种失衡。其二是采样偏差:采集数据时只覆盖了部分人群,就像只记了程序员的点餐单。其三是标注偏见:标注者的个人倾向影响了标签,同一张图片在不同人手里被打上了不同的“口味标签”。其四是代理特征:我们删掉了敏感属性,可住处、学历、消费习惯等特征依然与群体信息高度相关,模型绕个弯照样“尝得出辣度”。

要量化采样偏差,可以对比数据中的群体占比与真实场景中的占比,两者的差距越大,说明采集越失真。

摸清这四个来源,你才知道该在买菜、做菜还是上菜环节下手。历史沉淀的“旧口味”和只记一拨人的“点餐单”能在采购时补救;标注员的主观“爱好”和换名不换味的“替代配料”则需要配方环节的持续留意。

δsampling=∣Pdata(A=a)−Ppopulation(A=a)∣\delta_{\text{sampling}} = \left| P_{\text{data}}(A=a) - P_{\text{population}}(A=a) \right|
这个公式把“数据里的群体占比”和“真实世界的群体占比”相减并取绝对值,数值越大代表采样偏差越严重,数据就越不能代表真实人群。
  1. 数据占比$P_{\text{data}}(A=a)$ 表示数据集中群体 a 出现的比例,比如女性样本只占 30%。
    Pdata(A=a)P_{\text{data}}(A=a)
  2. 真实占比$P_{\text{population}}(A=a)$ 表示真实场景中该群体的目标占比,比如女性占 50%。
    Ppopulation(A=a)P_{\text{population}}(A=a)
  3. 偏差度量$\delta_{\text{sampling}}$ 将两个占比相减取绝对值,0 代表采集无偏,数值越大说明数据越不能代表真实人群。
    δsampling=∣Pdata(A=a)−Ppopulation(A=a)∣\delta_{\text{sampling}} = \left| P_{\text{data}}(A=a) - P_{\text{population}}(A=a) \right|

公平性度量检测:分桌统计满意率

菜品上齐后,怎么知道有没有亏待哪桌食客?聪明的主厨不会只看“全场平均满意度”——因为辣党给满分、不吃辣的给零分,平均下来还挺好看,但这恰恰掩盖了问题。正确做法是分桌统计:爱吃辣的 A 桌满意率和不吃辣的 B 桌满意率分别是多少?差距一大,就说明有偏。

AI 公平性度量正是“分桌统计满意率”的思路。最常用的是统计均等差异(SPD):比较两个群体被模型判为正例的比例之差。比如信贷模型给 60% 的男性批复、只给 35% 的女性批复,SPD 就是 -0.25,明显偏斜。除了 SPD,还有均等机会(EO):只看“真正该通过的人”里,两组分别有多少人被正确放行;均等化赔率(EOD)则同时要求真正例率和假正例率都接近。指标使用上要记住:单一指标会误导,需按业务语境组合使用。

指标就是主厨手里的“分桌满意度表”。SPD 看整体差异,EO 追问“最该被照顾的那桌菜有没有上对”,EOD 则双向把关。一张表不够,要横着看、竖着看,才能判断这顿饭到底公不公平。

SPD=P(y^=1∣A=1)−P(y^=1∣A=0)\text{SPD} = P(\hat{y}=1 \mid A=1) - P(\hat{y}=1 \mid A=0)
SPD 把受保护组(如女性)和对照组(如男性)“被预测为正例”的概率相减。越接近 0 越公平,正值偏向 A=1 组,负值偏向 A=0 组。
  1. 受保护组正例率$P(\hat{y}=1 \mid A=1)$ 表示在受保护组(A=1)中,模型给出“通过”结论的比例。
    P(y^=1∣A=1)P(\hat{y}=1 \mid A=1)
  2. 对照组正例率$P(\hat{y}=1 \mid A=0)$ 表示对照组(A=0)的“通过”比例。
    P(y^=1∣A=0)P(\hat{y}=1 \mid A=0)
  3. 相减比较$\text{SPD}$ 将两个比例相减,得到两组“受欢迎程度”的数字化差距,是分桌满意度的量化版本。
    SPD=P(y^=1∣A=1)−P(y^=1∣A=0)\text{SPD} = P(\hat{y}=1 \mid A=1) - P(\hat{y}=1 \mid A=0)

数据预处理去偏:在买菜环节就把食材配平

发现了“菜谱偏辣”的问题,最省事的办法是在买菜时就平衡食材:多进点清淡的菜、少囤几筐辣椒,让后厨的原料结构本身不偏向任何一方。你甚至不用改菜谱——食材比例对了,做出来的菜自然不偏。

数据预处理去偏就是这个思路:在训练模型之前先调整训练数据。两大常用武器是重采样和重加权。重采样直接增删样本:少数群体的样本复制多一些(过采样),多数群体的样本删减一些(欠采样)。重加权则不动样本数量,而是给每个样本加一个权重,让模型在损失函数里“更重视”某类样本,等效于把数据分布拉平。此外还有数据增强:为少数群体合成合理的变体样本,相当于“凭空多研发几道清淡菜”。

重加权的核心公式如下,它把“群体与标签的联合分布”拉平为“两者独立时的理想分布”:

预处理就像在采购单上做文章:重采样是直接改进货量,重加权是给每筐菜贴“优先级”标签,数据增强是开发新品种。食材配平了,后面做菜的压力就小很多。但数据层也有局限:如果信息在采集时系统性丢失,靠样本层面补不回来,这时就得进入训练阶段想办法。

wi=P(A=a)⋅P(Y=y)P(A=a,Y=y)w_i = \frac{P(A=a) \cdot P(Y=y)}{P(A=a, Y=y)}
这个权重公式让“群体与标签的联合分布”被拉平为“两者独立时的理想分布”;欠代表的“群体 + 标签”组合会拿到更大的权重,模型因此更关注它们。
  1. 实际联合占比$P(A=a, Y=y)$ 表示数据中属于群体 a 且标签为 y 的样本占比,比如“女性且被拒贷”占 20%。
    P(A=a,Y=y)P(A=a, Y=y)
  2. 理想独立占比$P(A=a) \cdot P(Y=y)$ 表示如果群体和标签相互独立时,“女性且被拒贷”应有的占比。
    P(A=a)⋅P(Y=y)P(A=a) \cdot P(Y=y)
  3. 权重合成$w_i$ 用理想占比除以实际占比,得到每个样本的训练权重。
    wi=P(A=a)⋅P(Y=y)P(A=a,Y=y)w_i = \frac{P(A=a) \cdot P(Y=y)}{P(A=a, Y=y)}
  4. 加权训练将 $w_i$ 乘进损失函数,让模型对“被低估的组合”更敏感。
    L=∑iwi⋅lossiL = \sum_i w_i \cdot \text{loss}_i

训练过程约束:做菜时盯住辣度下勺子

有时候食材没问题,是“做菜的关键动作”出了偏差。主厨一心追求“最高平均分”,拼命加辣椒——反正辣党拍手叫好,平均分上去了。要拦住这种冲动,得在做菜过程中加一条硬规矩:不管这盘菜最终端给谁,辣度都不能偏离基准线太多。

训练中约束去偏就是在训练流程里加入“公平规矩”。最直接的是公平正则项:在原有损失函数上加上公平差距的惩罚项,差距越大惩罚越重,模型在优化时被迫兼顾准确与公平。另一个经典方法是对抗性去偏:让一个辅助判别器尝试从模型的预测结果中“猜出”敏感属性,主模型则努力让预测结果不泄露群体信息——两者互相对抗,主模型最终学会“不带偏见地下结论”。约束优化方法则把公平要求写成硬约束,在满足约束的前提下优化精度。

正则项像“每道菜辣度不能超线”的厨房纪律,对抗性去偏则像一个挑剔的试菜员:试菜员专挑“这盘菜是不是只照顾辣党”来说事,主厨被逼着做出让多数人都能吃、试菜员挑不出毛病的菜。不过纪律太严也会压制发挥——训练层的权衡,就是在“菜品的口味”和“公平的底线”之间找平衡点。

Ltotal=Ltask+λ⋅∣SPD∣L_{\text{total}} = L_{\text{task}} + \lambda \cdot |\text{SPD}|
总损失 = 原有任务损失 + 公平惩罚。λ 越大,公平的“分量”越重,但模型可能牺牲部分准确率。
  1. 任务损失$L_{\text{task}}$ 是模型原本的预测误差(如交叉熵),负责让预测更准。
    LtaskL_{\text{task}}
  2. 公平惩罚项$|\text{SPD}|$ 是统计均等差异的绝对值,差距越大代表越不公平。
    ∣SPD∣|\text{SPD}|
  3. 权衡系数$\lambda$ 调节公平与准确之间的比重,是训练时要调的超参数。
    λ\lambda
  4. 最小化总损失$L_{\text{total}}$ 将任务损失与公平惩罚相加,训练过程同时优化准确与公平。
    Ltotal=Ltask+λ⋅∣SPD∣L_{\text{total}} = L_{\text{task}} + \lambda \cdot |\text{SPD}|

后处理结果修正:上菜时按桌调整辣度

就算菜已经做好、辣度已经定型,主厨还是能补救:给不吃辣的桌额外配一碗清汤涮一涮,或者多夹几块不辣的配菜。上菜环节的微调不改变菜本身,却能让不同食客的体验对齐。

后处理修正就是“上菜时的补救”,它不动模型参数,只调整输出的使用方式。最常用的是阈值调整:每个群体各用一个判断阈值,让两组的关键指标对齐。比如把男性的批复阈值设在 0.6、女性的设在 0.5,最终让两组的真正例率一致。其次是概率校准:把模型打分校准成可信的概率,再在分组内重新决策。还有拒绝选项分类:在置信度模糊的区域“放弃判断”或转人工,减少两组间不一致的处理结果。

为每个群体寻找阈值的公式如下:

阈值调整像“给不吃辣的桌配清汤”,不改菜的原料和做法,只改上菜方式;概率校准是把“辣度评分”讲得更诚实;拒绝选项则是遇到拿不准的口味干脆不做判断、请老师傅(人工)出马。后处理见效快、改动小,但如果菜本身太辣或食材太差,再多清汤也救不回来——能在前两步解决的事,别拖到上菜时。

τa=arg⁡min⁡t∣TPRa(t)−τ∣\tau_a = \arg\min_{t} \left| \text{TPR}_a(t) - \tau \right|
对每个群体 a,找一个阈值 t,使该群体在阈值下的真正例率尽可能接近目标值 τ(如 80%),从而实现两组敏感度对齐。
  1. 目标敏感度$\tau$ 是期望达到的真正例率水平,比如希望两组都能筛出 80% 的真正例。
    τ\tau
  2. 组内真正例率$\text{TPR}_a(t)$ 是群体 a 在某个阈值 t 下正确预测为正例的比例。
    TPRa(t)\text{TPR}_a(t)
  3. 最优点选择$\arg\min_t$ 表示在候选阈值中寻找使差值最小的 t,即为该组定制的最优阈值。
    arg⁡min⁡t\arg\min_{t}
  4. 分组应用不同群体的阈值 $\tau_a$ 各自独立,最终让两组的敏感度对齐。
    τa=arg⁡min⁡t∣TPRa(t)−τ∣\tau_a = \arg\min_{t} \left| \text{TPR}_a(t) - \tau \right|

权衡与合规审计:不光是厨艺,还是经营账

主厨很快发现一个扎心的事实:要让每桌食客都满意,可能就得牺牲“平均满意度”——毕竟辣椒是多数人的心头好。去偏也常常遇到公平与精度的此消彼长。但这条“跷跷板”不是死的:如果数据本身有偏且信息不足,去偏反而可能带来“免费的午餐”,既更公平又不降精度。

实践中要在多个目标间做综合评估,可以用一个合成指标同时考察准确率与最坏情况的公平差距。除了权衡,还要注意“多指标冲突”:某些公平指标在数学上无法同时满足(著名的“不可能定理”),必须结合业务语境决定优先保证哪个指标。最后是合规审计:把敏感属性如何设定、用了哪些指标、做了哪些去偏、效果如何验证全部记录下来,形成可供监管复查的文档,这就是主厨的“经营台账”。

最后你会发现,去偏不只是厨艺问题,更是经营策略:有限的预算(准确率)怎么分配、优先照顾哪桌食客(哪种公平)都要写进经营手册。主厨记录每天的分桌满意度、食材账本和调整日志,模型团队也要写出可审计的“公平台账”——这就是 AI 从“能跑”走向“可信、合规”的关键一步。

Score=ACC×(1−max⁡kgk)\text{Score} = \text{ACC} \times \left( 1 - \max_{k} g_k \right)
综合得分 = 准确率 ×(1 − 最大公平差距)。最坏的那项公平差距被显式扣分,防止“平均不错、某组很惨”的模型蒙混过关。
  1. 准确率$\text{ACC}$ 是模型总体预测正确的比例,代表任务完成度。
    ACC\text{ACC}
  2. 归一化公平差距$g_k$ 是第 k 项公平指标(SPD、EOD 等)的归一化差距,0 为完全公平,1 为极端不公。
    gkg_k
  3. 最坏情况$\max_k g_k$ 取所有公平差距中最大的一项,聚焦“最受伤害的群体”。
    max⁡kgk\max_k g_k
  4. 合成得分$\text{Score}$ 把准确率与惩罚相乘,综合反映模型“既准又公平”的程度。
    Score=ACC×(1−max⁡kgk)\text{Score} = \text{ACC} \times \left( 1 - \max_{k} g_k \right)

AI 应用场景

招聘简历筛选模型的去偏

阶段:数据预处理(重加权)+ 训练中约束(对抗性去偏)

解决的问题:一家科技公司的简历初筛 AI 沿用了过去十年的录用数据,而历史数据中女性工程师占比极低,模型无形中把“性别”当成了录用信号,同等简历的女候选人通过率明显偏低。传统修法只删掉性别字段,却挡不住“毕业院校 → 年龄 → 性别”的代理链条。

具体案例:数据团队对简历数据的“群体-标签”组合做重加权,让“女性 + 录用”组合在训练中的权重恢复合理;训练时引入对抗判别器,让模型预测结果无法被推断出性别;上线前用 SPD 与均等机会双指标验收,把群体通过率差距从 18 个百分点压到 3 个百分点以内。

信贷风控模型的公平性后处理

阶段:后处理修正(阈值调整 / 概率校准)

解决的问题:某银行信贷模型在相同收入水平下,对少数族裔的拒贷率显著更高。模型已经上线,重新训练成本高、风险大,需要尽量不动模型的情况下快速缩小平差。

具体案例:风控团队先在各群体内做概率校准,再以“均等化赔率”为目标做阈值调整——对两组分别设置批复阈值,使假阳性率对齐;同时将全流程写入模型风险管理文档,向监管提交公平性审计报告,顺利通过年度模型合规检查。

医疗影像模型的偏见检测与数据增强

阶段:偏见检测度量 + 数据增强

解决的问题:某皮肤科影像 AI 在深肤色人群上的误诊率远高于浅肤色人群。问题根源是训练集中深肤色图片严重不足,属于典型的采样偏差。

具体案例:医院先用分组正例率对比定位到肤色维度差距,再通过图像增强合成更多深肤色样本、补充多中心影像数据;重新训练后用均等机会指标验证,将深肤色人群的敏感度从 71% 提升到 89%,并撰写模型影响评估报告。

Python 演示

python79 行
import numpy as np  class FairLoanModel:    def __init__(self, seed=42):        self.rng = np.random.default_rng(seed)        self.w = None        self.thresholds = {0: 0.5, 1: 0.5}     def make_data(self, n=400):        # 0=男性, 1=女性; 女性历史收入低, 还款记录偏差        a = self.rng.integers(0, 2, n)        income = self.rng.normal(1.0 - 0.4 * a, 0.5, n)        base = 1.2 * income        y = (base + self.rng.normal(0, 0.6, n) > 0).astype(int)        x = np.c_[income, self.rng.normal(0, 1, n)]        return x, y, a     def fit(self, x, y, a, sample_w=None):        n = len(y)        if sample_w is None:            sample_w = np.ones(n)        x_aug = np.c_[np.ones(n), x]        if self.w is None:            self.w = np.zeros(x_aug.shape[1])        for _ in range(800):            p = self._sigmoid(x_aug @ self.w)            grad = x_aug.T @ (sample_w * (p - y)) / n            self.w -= 0.15 * grad     def predict_proba(self, x):        return self._sigmoid(np.c_[np.ones(len(x)), x] @ self.w)     def _sigmoid(self, z):        return 1.0 / (1.0 + np.exp(-np.clip(z, -20, 20)))     def predict(self, x, a):        scores = self.predict_proba(x)        return (scores >= np.array([self.thresholds[g] for g in a])).astype(int)     def spd(self, x, a):        pred = self.predict(x, a)        return pred[a == 1].mean() - pred[a == 0].mean()     def equalize_thresholds(self, x, y, a, target_tpr=0.8):        # 后处理: 让两组的真正例率都对齐到 target_tpr        for g in (0, 1):            mask = (a == g) & (y == 1)            if mask.sum() > 0:                scores = self.predict_proba(x[mask])                self.thresholds[g] = np.percentile(scores, (1 - target_tpr) * 100)  def reweight(x, y, a):    # 数据预处理: 让群体与标签在加权后相互独立    n = len(y)    w = np.ones(n)    for g in (0, 1):        for lab in (0, 1):            mask = (a == g) & (y == lab)            p_join = mask.mean()            p_a = (a == g).mean()            p_y = (y == lab).mean()            w[mask] = p_a * p_y / (p_join + 1e-9)    return w  if __name__ == "__main__":    model = FairLoanModel()    x, y, a = model.make_data(600)    model.fit(x, y, a)    print("去偏前 SPD = %.3f" % model.spd(x, a))     w = reweight(x, y, a)    model.fit(x, y, a, sample_w=w)    print("重加权后 SPD = %.3f" % model.spd(x, a))     model.equalize_thresholds(x, y, a, target_tpr=0.8)    print("再经阈值调整 SPD = %.3f" % model.spd(x, a))
目的:用模拟信贷数据演示从“数据重加权”到“后处理阈值调整”的完整去偏流程,定量对比干预前后的 SPD 变化。
  1. y = (base + self.rng.normal(0, 0.6, n) > 0).astype(int)模拟标签:收入越高还款概率越大,叠加上噪声让问题更真实
  2. grad = x_aug.T @ (sample_w * (p - y)) / n带权梯度:样本权重直接参与每一步参数更新,等效于改变训练数据的分布
  3. w[mask] = p_a * p_y / (p_join + 1e-9)重加权核心公式:用“群体与标签独立时的理想占比”除以“实际联合占比”
  4. model.fit(x, y, a, sample_w=w)用加权后的数据重新训练,让模型不再偏好历史占优的组合
  5. model.equalize_thresholds(x, y, a, target_tpr=0.8)后处理:分组计算阈值,使两组的真正例率对齐到 80%
  6. print("去偏前 SPD = %.3f" % model.spd(x, a))用统计均等差异量化每一步干预的效果,验证差距是否收敛

常见误区

误区我训练模型时已经把性别、种族这些字段都删掉了,模型根本看不到敏感属性,为什么还说我的模型有偏见?

正解删除字段不等于消除偏见。其他特征可能是敏感属性的“代理变量”——比如住址邮编、毕业院校、消费习惯,它们和群体信息高度相关,模型绕个弯照样能推断出群体身份,偏见照样传导。正如食堂菜单上不写“辣”字,但每道菜都放辣椒粉,不吃辣的人还是没得选。更稳妥的做法是保留敏感属性用于审计和干预,而不是假装它不存在。

为何常见:直觉上“看不见 = 不偏见”,忽略了特征之间的相关性;实操中删除字段最省事,容易给人“已经处理过了”的错觉。

误区我把统计均等差异(SPD)优化到了接近 0,两组正例率一样了,模型应该完全公平了吧?

正解不同公平定义之间可能互相冲突。SPD 是“结果层面的均等”,但它可能掩盖“该通过的人没通过”的问题:比如两组通过率相同,但女性组里真正有资格的人被大量误拒,男性组里不合格的人被大量放行。SPD 归零不等于均等机会(EO)达标。正确做法是结合业务语境,用 SPD、EO、EOD 多个指标交叉验证——就像主厨不能只看平均分,还要分桌看满意率是否真的合理。

为何常见:单一指标易度量、易优化,而且很多工具包默认只输出一个指标,容易让人误以为一项达标就是全部达标。

误区模型已经训练好了,直接用后处理调阈值不就行了?又省事又见效快,为什么还要改数据和训练过程?

正解后处理只改输出边界,不改模型内部。如果打分本身质量差、偏见深,后处理会牺牲大量准确率——相当于菜已经辣到没法入口,再配清汤也救不回原味。而且后处理只对已定义的群体有效,遇到训练数据里根本没见过的群体就束手无策。正确策略是:数据层能配平的先配平,训练层能约束的加约束,后处理作为最后一道防线补齐残余差距。

为何常见:后处理代码量最小、上线最快,改一个阈值即可看到指标变化,容易让人高估它的能力、低估它的代价。

误区公平和准确是天平的两端,想去偏就得砍精度,我们业务 KPI 不允许,所以干脆不做。

正解这取决于数据本身的质量。如果数据存在明显的采样偏差或标注偏差,去偏往往能带来“免费的午餐”:模型不再被少数群体的噪声带偏,反而更准。只有当数据已经很干净、瓶颈确实在公平-精度权衡上时,才会看到明显的此消彼长。正确做法是量化权衡曲线(先测两个指标,再决定取舍),而不是拍脑袋拒绝去偏。

为何常见:极端案例传播广,给人留下“公平 = 低效”的刻板印象;同时缺少量化对比的习惯,容易把个别结论当成普遍规律。

误区我们公司出于隐私保护,数据里根本不存性别、种族这些字段,那公平性工作是不是就做不了了?

正解隐私保护与公平审计并非对立。没有显式敏感属性时,可以用代理特征做间接检测,也可以在部署后抽样复核真实身份;同时,GDPR 等法规要求对高风险模型做影响评估,主动采集合规审计数据反而是一种负责任的姿态。正如食堂不查每位食客的身份证,但可以通过窗口排队和反馈记录发现“辣菜窗口排队太长”的问题——没有完美标签,也能找到改进方向。

为何常见:把“保护隐私”和“测量公平”错误地对立起来,忽略了代理变量和抽样审计这些可行的折中手段。

面试题

Q1. 关于算法偏见的来源,以下哪项说法最准确?

单选题 · easy

  • A.偏见只来自算法内部的数学公式设计
  • B.偏见可来自历史数据、采样和标注等多环节← 正确答案
  • C.只要特征不含敏感属性就能保证绝对公平
  • D.偏见是深度学习模型不可缓解的固有缺陷

答案:B。偏见主要来自数据的全链路(历史记录、采样方式、标注过程)以及算法设计,B 全面准确。A 只看算法忽略数据;C 忽视了代理变量会绕开敏感属性;D 说“不可缓解”与事实相反,去偏见方法正是为缓解偏见而生的。

Q2. “统计均等差异(SPD)”主要度量的是两组用户的什么差距?

单选题 · easy

  • A.被预测为正例比例之间的差距← 正确答案
  • B.整体预测准确率之间的差距
  • C.输入特征分布之间的差距
  • D.模型训练时损失的收敛差距

答案:A。SPD 的定义是两组被预测为正例的比例之差,A 正确。B 说的是准确率差异,C 说的是特征分布,D 说的是训练收敛情况,它们都不属于群体公平性的定义范畴。

Q3. 数据预处理阶段的“重加权”方法的本质是?

单选题 · easy

  • A.给损失函数添加一个 L2 正则项
  • B.删掉所有少数群体的样本再训练
  • C.给样本赋权使群体与标签不再相关← 正确答案
  • D.把标签由数值型改成类别型变量

答案:C。重加权的核心是给每个样本分配权重,使加权后的数据中群体与标签相互独立,C 正确。A 的 L2 正则属于训练层手段;B 是粗暴删除,属于欠采样但并非重加权本质;D 是标签处理,与公平性无关。

Q4. 仅从特征中删除敏感属性,为何仍无法保证模型公平?

单选题 · mid

  • A.因为模型会自动在内部重新生成敏感属性
  • B.因为删除特征会显著降低整体的准确率
  • C.因为敏感属性在模型推理过程中无法获取
  • D.因为其他特征可能是敏感属性的代理变量← 正确答案

答案:D。删除敏感属性后,邮编、学历、消费习惯等特征仍可能与群体信息高度相关,成为代理变量,模型照样能间接推断出群体身份并复制偏见,D 正确。A 说模型“自动生成敏感属性”不准确;B 删除特征未必显著降精度;C 与公平性问题无关。

Q5. 关于对抗性去偏,以下说法正确的有哪些?

多选题 · mid

  • A.判别器尝试从预测结果推断敏感属性← 正确答案
  • B.主模型努力让预测结果不泄露群体信息← 正确答案
  • C.辅助判别器能识别出敏感属性即代表有偏见← 正确答案
  • D.对抗性去偏只适用于线性模型或简单任务

答案:ABC。对抗性去偏中,判别器从预测结果猜测敏感属性,主模型反向努力隐藏群体信息,判别器识别成功恰恰说明预测结果泄露了群体信息、存在偏见,A、B、C 均正确。D 错误,该方法同样适用于神经网络等深度模型。

Q6. 后处理“阈值调整”方法最适用的场景是?

单选题 · mid

  • A.训练数据已经完全没有任何偏见的场景
  • B.群体打分分布不同且需对齐敏感度的场景← 正确答案
  • C.特征数量明显少于训练样本数量的场景
  • D.模型在验证集上发生明显过拟合的场景

答案:B。阈值调整适合打分分布存在群体差异、需要对齐真正例率或假正例率的场景,B 正确。A 说数据已无偏见时没必要;C 的维度问题和 D 的过拟合问题都属于模型训练的其他议题,与输出端阈值调整无关。

Q7. 关于公平性与准确率的权衡,下列理解正确的是?

单选题 · mid

  • A.数据有偏时去偏可能不损精度甚至提升精度← 正确答案
  • B.任何去偏操作都必然大幅降低模型准确率
  • C.公平性与模型准确率之间没有任何关联
  • D.准确率越高的模型在公平性上必然越好

答案:A。当数据本身存在采样或标注偏差时,去偏可视为“纠正噪声”,往往不损精度甚至提升精度,这就是常说的“免费午餐”,A 正确。B 过于绝对;C 说完全无关不符合实际;D 认为准确率高必然公平也没有依据。

Q8. 在“偏见检测度量”中,属于群体公平指标的有哪些?

多选题 · hard

  • A.统计均等差异指标简称 SPD← 正确答案
  • B.均等机会指标英文简称 EO← 正确答案
  • C.均等化赔率指标英文简称 EOD← 正确答案
  • D.交叉熵损失函数指标简称 CE

答案:ABC。SPD、均等机会(EO)、均等化赔率(EOD)都是从群体层面比较不同组别预测结果的公平性指标,A、B、C 正确。交叉熵是训练时的损失函数,衡量单样本预测误差,不属于公平性度量。

Q9. 关于去偏的三个阶段,下列说法正确的有?

多选题 · hard

  • A.预处理阶段可在训练前实施重采样与重加权← 正确答案
  • B.训练中可加入公平正则项约束模型行为← 正确答案
  • C.后处理阶段只调整输出边界不改变模型参数← 正确答案
  • D.三个阶段必须全部实施才能实现有效去偏

答案:ABC。重采样与重加权属于训练前的数据准备,公平正则项在训练过程中生效,阈值调整等后处理只改输出边界、不动模型参数,A、B、C 正确。D 过于绝对,实际工程中常按需组合,并非三个阶段缺一不可。

Q10. 当多个公平指标要求互相冲突、无法同时满足时,正确的处理方式是?

单选题 · extreme

  • A.同时将全部指标严格优化到零值即达公平
  • B.直接放弃公平性转而只优化模型准确率
  • C.从多个指标中随机抽取一个进行优化
  • D.结合业务语境选定首要指标并记录权衡取舍← 正确答案

答案:D。公平指标之间存在数学上的不可能性,无法同时全部归零,正确做法是结合业务语境(如信贷关注假阳性、医疗关注漏诊)确定首要指标,并记录权衡过程供合规审计,D 正确。A 在数学上不可行;B 放弃公平不可取;C 随机选取缺乏业务依据。