想象你是一位体育教练,要带一支来自不同社区的校队参加市运动会。队里有从小接受系统训练的孩子,也有连正规跑道都没见过的孩子。如果只盯着“全队平均成绩”安排训练,平均分可能很好看,可弱势群体永远坐冷板凳。这不是他们不努力,而是训练方案本身偏心。更麻烦的是,这种偏心会越练越深:强者获得更多资源,弱者更被忽视。 过去,人们习惯等模型“考完试”再检查它有没有偏见,发现问题再补救。但到那时,偏见的习惯早已在一次次练习中固化,改起来伤筋动骨。这篇要讲的“训练中去偏见”,思路完全不同:在模型还在学习的时候就立下规矩,一边学知识,一边学公正。比如给训练规则加上公平条款,请一位专门挑刺的影子教练,对偏袒行为开罚单。模型从第一次练习开始,就在“学得准”和“做得公”之间找平衡。 文章会用带队训练的故事,讲清这套打法的完整流程:偏见从哪来、怎样度量、怎么用规则和对抗压制它、落地时要注意什么。读完你会发现,“边学边补”远比“考完再补”聪明得多。
对 AI 从业者而言,掌握训练中的公平约束,是在模型上线前守住伦理底线的关键能力,能帮你把偏见按在训练源头,交付更可信、更合规的 AI 系统。
目录
可视化演示
展示对抗去偏见网络结构:共享编码器+主模型+对抗器,梯度反转层GRL实现去偏,对比训练前后群体拒绝率差异和AUC指标。
本节配有交互动效(进入视口后自动加载,约 3KB)。
有偏模型:群体拒绝率差异18% 信贷风控模型对特定性别、年龄群体存在系统性拒绝率差异 18%拒绝率差异引发合规风险与品牌风险 对抗去偏见网络通过梯度反转层实现公平性优化
公平性本质:先看清偏见从哪来
教练组队第一天就发现,队员之间的差距不是一天形成的。城区孩子有系统的体训班,郊区孩子连正经训练场都难找。要是按现有成绩直接分组训练,结果必然是强者更强、弱者更弱:这是“起点不公平”,越练越悬殊。教练清楚,不承认起点差距,任何训练方案都是空中楼阁。
模型同样如此。偏见源头往往不在算法,而在喂给它的数据里。历史招聘记录里男性简历占多数,模型就学会“男性更像工程师”;某些群体的样本严重不足,模型对它们“懒得认真学”,预测自然飘忽。这些藏在数据里的倾斜,会随着一次次练习被刻进模型参数。训练中去偏见,第一步就是承认这些源头,而不是假装数据是干净的。
公平性本身也有分寸。群体公平要求不同敏感群体(性别、年龄段、地域)获得统计上一致的结果;个体公平则要求相似的个体得到相似的预测。麻烦的是,两者常互相打架:为追求群体比例一致,可能被迫给两个能力相同的人不同结论,这就是“公平悖论”。数学上已经证明,没有任何单一指标能同时满足所有公平定义,工程上必须先选定目标。
就像教练先给全队做体能摸底,看到差距才能定训练方案。承认“数据偏心”,是训练阶段去偏见的第一块基石;接下来的任务,是把这种差距量化成一把可操作的尺子。
- 组 1 的正例率已知样本属于敏感组 1(如郊区队员)时,标签为正(如被选入主力)的概率。
- 组 0 的正例率样本属于敏感组 0(如城区队员)时的正例率,作为对比基准。
- 不等号两个概率出现系统性差异,说明历史决策或采样过程已经偏向某一群体,是训练中必须矫正的信号。
公平性度量:立一把公平的尺子
教练不能只看全队平均成绩,那会掩盖一切问题。他把队员按来源地分成两组,统计每组获得上场机会的比例:城区组七成、郊区组三成,一眼就看出训练方案偏心。度量公平,第一步就是把“全队平均”换成“分组对照”。
最常用的尺子是统计均等:它要求不同敏感群体的预测正例率相等,即模型给出肯定结论的比例不因群体而异。但只盯这一把尺子可能误伤——有些群体真实能力分布确实不同,于是有了机会均等:在真实标签为正的样本里,各群体被预测为正的比例(召回率)一致,保证“有潜力的队员不被漏掉”。
预测均等则反过来要求,被预测为正的人里各群体真正为正的比例(精确率)一致,保证“被选上的人名副其实”。校准指标还要求模型输出的置信度在不同群体间保持可比。工程上,SPD 值越接近 0 越公平,并设一个容忍阈值 ε(如 0.05),SPD ≤ ε 就算合规。
尺子立起来,教练才能判断训练有没有跑偏。同样,有了 SPD 这类量化指标,“公平”就从口号变成了可优化的目标——下一节的约束方法,正是围着这把尺子做文章。
- 预测正例率模型把组 0 样本判为正类的比例,相当于该组获得的“肯定票”统计。
- 两组相减用组 0 的正例率减组 1 的正例率,得到“肯定票”偏向哪一组的差值。
- 取绝对值只关心差距的大小,不关心谁多谁少,任何一方的系统性优势都算不公平。
公平约束优化:把公平写进损失函数
度量只能发现问题,不能解决问题。教练的应对是立规矩:每周分组对抗,两边上场名额差距不许超过 10%,否则整场训练无效。这相当于给训练过程加了“硬性约束”。但优化器喜欢循序渐进,太硬的约束会让梯度无所适从,于是工程上更常用“软”表达——把公平约定翻译成惩罚项,混进损失函数一起优化。
这就是拉格朗日乘子法的思路:把带约束的优化问题变成无约束问题,将约束乘上系数 λ 放进目标函数。任务损失负责“学得准”,公平惩罚负责“做得公”,λ 是教练手里的哨子——吹不吹得响,决定队员听不听话。
约束有两种形式:硬性阈值要求 SPD 严格不超过 ε,越界就重罚;软性惩罚则按越界程度连续扣分,越过头罚得越狠,让优化更平滑。梯度投影则把参数更新投影回“公平可行域”,保证每一步都不越界。三者本质相同——把公平写进每一轮梯度。
规矩立了还要有力度:λ 太小,公平惩罚形同虚设,模型阳奉阴违;λ 太大,模型只顾公平忘了任务,预测精度崩盘。教练的智慧在于把规矩从硬性命令变成可调校的罚则——下一节的“影子教练”,则是另一种更有进攻性的思路。
- 任务损失模型原有的分类误差(如交叉熵),负责保证预测准确。
- 越界量SPD 超过容忍阈值 ε 的部分;没超过则为 0,避免对正常波动斤斤计较。
- 惩罚系数λ 决定公平惩罚在总损失中的话语权,是训练中最需要调的超参数之一。
对抗去偏:让影子教练专挑毛病
有些偏见藏得很深,看分布、看指标都挺均衡,可一到关键场合就露馅。教练请来一位“影子教练”,他的任务只有一个:挑刺。影子教练从队员每个动作细节里猜他来自哪个社区,猜得越准,说明队员身上“身份痕迹”越重——而这些痕迹正是偏见的藏身之处。
对抗去偏把这个套路搬进神经网络。主模型负责完成分类任务,判别器则尝试从主模型的隐层表征里识别敏感属性。主模型的优化目标里,除了任务损失,还多了一个“反侦察”目标:让判别器完全靠猜,逼着表征里找不到敏感信息的蛛丝马迹。两股力量互相拉扯,像主力队员和影子教练反复斗法。
梯度反转层是实现“骗过判别器”的经典机关:前向传播时表征正常送给判别器,反向传播时把判别器传回的梯度取反,让主模型朝着“让判别器更困惑”的方向更新。训练时要控制两边节奏:判别器太强,表征被压成“信息荒漠”;太弱,又抓不住真正的偏见,这就是所谓的平衡博弈与收敛技巧。
影子教练越挑剔,主力队员越扎实。判别器逼着主模型丢掉“看一眼就能猜到身份”的捷径特征,留下来的表征才真正围绕任务本身。不过对抗训练娇气,动不动就震荡——有没有更稳的办法?下一节的罚单方案就是温和的替代路线。
- 判别器最大化判别器 D 努力从表征中识别敏感属性,使对抗识别损失尽可能大(识别得准)。
- 主模型最小化生成器 G 希望整体目标变小,包括让对抗损失无法增长(让判别器识别不准)。
- 对抗权重λ 控制去偏在总目标中的分量,防止影子教练太强势把任务带偏。
正则化惩罚:给偏科行为开罚单
影子教练适合抓大毛病,日常训练还需要稳定的队规。教练规定:谁在比赛中明显偏袒某类队员,就罚加练。正则化惩罚就是这张罚单——它不搞对抗博弈,而是直接盯住“预测与敏感属性的相关性”,发现相关就扣分,模型自然会收敛手脚。
具体做法是统计隐层表征 h 与敏感属性 s 的协方差,把协方差矩阵的 F 范数平方作为惩罚项加进损失。模型一旦偷偷用性别、年龄、地域做决策,h 与 s 的相关性就会变大,罚单变重,梯度会把这些“小心思”逐渐抹平。相比对抗去偏,这种正则更稳定、更好调,只是对曲折、间接的偏见线索捕捉力稍弱。
惩罚系数 λ 就是队规的严厉程度:λ 大,模型对敏感信息避之不及;λ 小,模型觉得“罚就罚呗”照用不误。工程上还会叠加稀疏约束,鼓励模型用更少的特征维度做决策——特征少了,偷偷传递敏感信息的通道也就少了,偏见没了藏身处。
罚单要开得准,更要开得及时。正则化惩罚没有对抗博弈的震荡问题,训练起来省心,适合当日常“常规队规”。不过再好的队规也得有人执行——最后一节,我们把视角拉回整个训练营。
- 协方差矩阵逐项计算敏感属性 s 与隐层表征 h 之间的线性相关性,是“偷偷用敏感信息”的探测器。
- F 范数平方把协方差矩阵所有元素平方求和,既放大明显的相关信号,也让惩罚处处可导、便于梯度优化。
- 惩罚系数λ 统一控制这张罚单的分量,是配合验证集调优的关键旋钮。
训练实践:把公平变成日常习惯
队规再完善,数据不配合也白搭。教练发现郊区组样本太少、多样性不足,模型对他们“学过但没记住”,于是给少数群体加练——数据重采样:对少数群体样本过采样或加权,让模型在每一轮梯度更新里都能“看到”他们。
训练全程还要有监控屏。教练每轮记录两组队员的登场率和进步曲线,差距一抬头就调整方案。训练中去偏见同样如此:把 SPD、组间准确率差做成训练日志,亲眼盯着它们随轮次变化,是避免“训完才发现离谱”的唯一办法。早停策略也有一席之地——训练后期模型爱走捷径死记硬背,反而放大偏见,适时早停能保住公平。
超参数调优是最后一道工序:λ 选多大、ε 定多宽、对抗训练的轮次比例多少,都要在验证集上联合搜索。综合来看,训练中去偏见是一套流程:数据重采样打底,约束、对抗、正则三招齐上,监控反馈随时纠偏,缺一不可。
训练营的每一天,都在反复回答同一个问题:这轮更新有没有让某个群体更吃亏?把公平性变成训练循环里的默认动作,模型才能走出实验室,既聪明又让人放心。教练的经验讲完了,接下来看看这套打法在真实业务里怎么发光。
- 最优参数训练结束时要找的模型参数,目标是让总损失全局最小。
- 公平惩罚汇总把多种公平手段(约束惩罚、正则项、对抗损失)叠加起来,形成一张立体罚单。
- 整体最小化在“学得准”和“做得公”之间找平衡点,任何一方都不能独大。
AI 应用场景
招聘简历初筛模型
阶段:模型训练阶段(公平性约束)
解决的问题:传统简历筛选靠人工规则,容易延续历史招聘中性别、地域的偏好;直接用历史数据训练排序模型,模型会把“男性更像工程师”这类历史偏见学进打分逻辑。通过在训练损失中加入统计均等约束(设置 ε=0.03),让不同性别组的简历通过率保持一致,从源头降低歧视风险,而不是等上线后再靠人工审核补救。
具体案例:某互联网公司训练简历初筛模型时,以性别为敏感属性,在损失函数中加入 SPD 惩罚项,并在训练日志中实时输出两组通过率曲线。最终模型在 AUC 基本不变的同时,性别组通过率差异从 12% 降到 2.8%,招聘团队的投诉量明显下降。
信贷风控模型
阶段:模型训练阶段(对抗去偏)
解决的问题:银行信贷模型用历史还款记录训练,少数群体样本少且历史拒贷多,模型会机械地低估其信用。对抗去偏让判别器尝试从用户表征中识别年龄、地域等敏感属性,主模型被迫丢弃这些身份线索,做到“不管你是谁,有还款能力就批”,既控制坏账又守住合规底线。
具体案例:某消费金融公司训练贷款审批模型时加入梯度反转层,判别器以年龄为敏感属性做识别。训练后模型对不同年龄段申请人的批准率差距从 9% 降到 3.5%,坏账率没有明显上升,顺利通过了内部模型风险管理评审。
医疗辅助诊断模型
阶段:模型训练阶段(正则化惩罚)
解决的问题:医疗数据常因就诊习惯不同而群体分布不均,模型容易把年龄、性别当作疾病主因,造成漏诊偏差。使用去相关正则化,在损失中惩罚“隐层表征与敏感属性的协方差”,让诊断依据更贴近真实病情指标,减少对身份的依赖。
具体案例:某三甲医院开发糖尿病并发症预测模型,加入协方差正则惩罚项后,模型对老年组与中青年组的漏诊率差异从 7% 降到 2.5%,整体准确率基本持平,临床科室对模型的信任度大幅提升。
Python 演示
import numpy as np class FairLogisticRegression: """带公平约束的逻辑回归: 任务损失 + 统计均等惩罚""" def __init__(self, lr=0.1, lamb=1.0, epsilon=0.05, epochs=200): self.lr = lr # 学习率 self.lamb = lamb # 公平惩罚系数 self.epsilon = epsilon # 公平阈值, SPD 低于它不惩罚 self.epochs = epochs self.w = None self.b = 0.0 self.gap_history = [] # 记录每轮公平差距 def _sigmoid(self, z): return 1.0 / (1.0 + np.exp(-z)) def _predict_proba(self, X): return self._sigmoid(X @ self.w + self.b) def fit(self, X, y, s): """X 特征矩阵, y 标签, s 敏感属性 (0/1)""" n = X.shape[0] self.w = np.zeros(X.shape[1]) n0 = max(np.sum(s == 0), 1) n1 = max(np.sum(s == 1), 1) for _ in range(self.epochs): p = self._predict_proba(X) grad_w = X.T @ (p - y) / n grad_b = np.mean(p - y) spd = np.mean(p[s == 0]) - np.mean(p[s == 1]) if abs(spd) > self.epsilon: direction = 1.0 if spd > 0 else -1.0 proxy = np.zeros(n) proxy[s == 0] = direction / n0 proxy[s == 1] = -direction / n1 grad_w += self.lamb * X.T @ (proxy * p * (1 - p)) / n grad_b += self.lamb * np.mean(proxy * p * (1 - p)) self.w -= self.lr * grad_w self.b -= self.lr * grad_b self.gap_history.append(abs(spd)) return self def score(self, X, y): pred = (self._predict_proba(X) > 0.5).astype(int) return np.mean(pred == y) if __name__ == "__main__": np.random.seed(42) n = 2000 s = np.random.binomial(1, 0.4, size=n) # 敏感属性: 组别 x1 = np.random.randn(n) + 0.8 * s # 特征与组别相关, 偏见源头 x2 = np.random.randn(n) * 0.5 y = (1.2 * x1 - 0.6 * x2 + 0.4 * np.random.randn(n) > 0).astype(int) X = np.column_stack([x1, x2]) base = FairLogisticRegression(lamb=0.0, epochs=200) base.fit(X, y, s) fair = FairLogisticRegression(lamb=2.0, epochs=200) fair.fit(X, y, s) print("无公平约束 准确率:", round(base.score(X, y), 3), "SPD:", round(abs(base.gap_history[-1]), 3)) print("带公平约束 准确率:", round(fair.score(X, y), 3), "SPD:", round(abs(fair.gap_history[-1]), 3))
spd = np.mean(p[s == 0]) - np.mean(p[s == 1])算统计均等差距:两组预测概率均值相减,差距越大越偏心。if abs(spd) > self.epsilon:只在公平差距越线时开罚单,避免对正常波动反应过度。proxy[s == 0] = direction / n0算出“谁贡献了不公平”,给两组配相反的纠偏方向,差距来自哪组就往哪组拉。grad_w += self.lamb * X.T @ (proxy * p * (1 - p)) / n把公平罚单沿 sigmoid 导数回传成梯度,λ 是处罚力度。self.gap_history.append(abs(spd))记录每轮差距,训练后能画出公平收敛曲线,像教练的训练日志。
常见误区
误区只要训练数据足够多、覆盖足够广,模型就不会有偏见。很多人觉得“见得多了自然懂事”。
正解数据量大不代表分布均衡。如果历史决策本身就有系统性偏见,数据越多模型越把偏见学得扎实,还会放大效应。公平必须显式约束:加惩罚项、做对抗去偏,否则模型只会忠诚地复制甚至放大数据里的倾向,就像教练不立规矩,训练量再大也只会让强者更强。
为何常见:大家直觉上认为“见过足够多样本就能还原真实分布”,却忽略了数据是历史决策的产物,数据本身可能偏了。
误区把公平性当成验收环节,模型训完测一遍指标,不合格再修补补丁。
正解事后补救的代价大且效果有限:模型已经学会用敏感信息走捷径,改起来可能伤及主干性能。训练中去偏在梯度层面同步优化,模型从第一轮迭代就不往偏见方向走。就像教练在训练中当场纠正动作,比比赛录像复盘后再改有效得多。
为何常见:这是传统软件工程“先开发后测试”习惯的迁移,忽视了模型学习的累积性——坏习惯是一轮轮梯度迭代固化下来的。
误区把统计均等、机会均等、预测均等全都设为目标,认为它们可以兼得,调参时挨个尝试。
正解数学上存在“不可能三角”:当基础正例率在群体间不同时,统计均等、机会均等与预测均等无法同时满足(Kleinberg 等人的不可能定理)。工程上必须按业务场景选主指标:招聘更看重机会均等,风控更看重预测均等,其余作参考。
为何常见:直觉上“公平”是一个整体概念,容易认为不同度量只是同一目标的不同表述,实际它们捕捉的是不同的公平视角。
误区一听“对抗”就想到生成对抗网络,认为对抗去偏就是生成更多样本来平衡样本。
正解对抗去偏的核心不是生成数据,而是两个网络的博弈:判别器从表征里识别敏感属性,主模型通过梯度反转让表征“骗过”判别器。目的是让模型学到的特征不携带敏感信息,和“造假数据”完全是两条路。
为何常见:“对抗”一词天然联想到 GAN,加上两者都有两个网络博弈的结构,容易张冠李戴。
误区公平惩罚系数直接拉满,认为罚得越狠模型必然又公平又好用。
正解λ 过大会让模型只顾公平、不顾精度——极端情况下所有样本输出相同概率,SPD 为零但预测毫无意义。λ 要在验证集上联合调,兼顾公平指标与准确率,通常从 0.1~1 起步做网格搜索,像教练既要罚偏科又不能把队员练废。
为何常见:惩罚项看起来像“越罚越乖”,忽略了它与任务目标之间的拉锯关系。
面试题
Q1. 统计均等(Statistical Parity)要求模型满足什么条件?
- A.各群体的标签比例保持完全一致
- B.各群体的预测正例率保持相等← 正确答案
- C.所有样本的预测方差全局最小
- D.预测结果与真实标签完全相等
答案:B。统计均等的核心是让 P(ŷ=1|s=0) 与 P(ŷ=1|s=1) 相等,即模型给两个敏感群体“肯定票”的比例一致。A 说的是数据标签的分布,不是模型行为;C 说的是预测方差,与公平无关;D 是完美预测的理想状态,现实中做不到也不必要。
Q2. 机会均等(Equal Opportunity)强调在什么条件下预测率应相同?
- A.所有样本整体上预测率一致
- B.负类样本被预测为负的比率一致
- C.正类样本被预测为正的比率一致← 正确答案
- D.各群体预测置信度方差一致
答案:C。机会均等的定义域是“真实标签为正”的样本集合,要求这个集合内各敏感群体的召回率一致,避免漏掉有潜力的正样本。A 是统计均等的要求;B 关注负类,对应的是“特异性”而非机会均等;D 中的置信度方差属于校准问题,不是机会均等。
Q3. 对抗去偏中,判别器(Discriminator)的主要作用是什么?
- A.从模型表征中识别敏感属性信息← 正确答案
- B.提升模型在训练集上的整体准确率
- C.对模型参数施加稀疏化正则限制
- D.生成更多样化的合成辅助样本
答案:A。判别器在对抗去偏中是“挑刺者”,专门从主模型的隐层表征里识别敏感属性,识别越准说明表征携带的可歧视信息越多;主模型随后用梯度反转让判别器失效。B 是主模型的任务,C 是正则化手段,D 是数据增强,都不是判别器的职责。
Q4. 拉格朗日乘子法在公平约束中是如何体现的?
- A.用乘子缩放所有训练样本的权重
- B.用乘子替换原模型的激活函数
- C.将公平约束转化为对隐层的裁剪
- D.把公平约束作为惩罚项并入损失← 正确答案
答案:D。拉格朗日乘子法把"SPD ≤ ε"这类约束乘上系数 λ 并入目标函数,变成无约束优化问题。A 说的是样本加权,B 是激活函数替换,C 是降维裁剪,都与拉格朗日乘子无关。
Q5. 去相关正则化惩罚主要衡量什么?
- A.所有模型参数中非零元素的个数
- B.特征矩阵与标签向量的点积结果
- C.训练数据中缺失字段的填充次数
- D.预测与敏感属性间的相关程度← 正确答案
答案:D。去相关正则的惩罚项是 ‖Cov(s,h)‖²,衡量敏感属性 s 与隐层表征 h 的相关性,模型越依赖敏感信息协方差越大。A 是稀疏性度量,B 是线性代数运算,C 是数据清洗话题,均不属于公平正则的测量对象。
Q6. 梯度反转层(Gradient Reversal Layer)的作用原理是什么?
- A.将主任务的梯度符号反转以提升精度
- B.反转判别器梯度从而促使表征去偏← 正确答案
- C.将梯度按固定比例缩小防止梯度爆炸
- D.对梯度做随机裁剪以加速收敛过程
答案:B。梯度反转层在前向传播时原样传值,反向传播时把来自判别器的梯度取反,使主模型向“让判别器误判”的方向更新,从而抹掉表征中的敏感线索。A 是优化加速,C 是梯度裁剪,D 是稳定训练技巧,都不涉及对抗去偏。
Q7. 为什么训练过程中去偏通常优于事后补救?
- A.训练时约束会增加推理阶段的耗时
- B.事后补救不需要设计任何额外损失
- C.训练中信息完整且纠正成本较低← 正确答案
- D.事后修正对分布偏移更稳健有效
答案:C。训练中偏见的习惯尚未固化,梯度仍在流动,每一步都可以同时压任务损失与公平惩罚,纠正成本低;事后补救面对的是已经学会捷径的模型,改门限或重训都代价高。A 与事实相反,B 与常理矛盾,D 说反了——事后修正往往对分布偏移更敏感。
Q8. 以下哪些属于训练中施加公平约束的常见方式?
- A.在损失函数中加入公平性惩罚项← 正确答案
- B.用对抗判别器从表征中去除敏感属性← 正确答案
- C.用拉格朗日乘子把公平约束松弛为惩罚← 正确答案
- D.训练完成后对预测结果做阈值平移校正
答案:ABC。A 是正则化惩罚,B 是对抗去偏,C 是拉格朗日约束,三者都作用在训练过程的梯度上。D 是后处理思路,在训练完成后平移决策阈值,不属于训练中约束,故选 [0,1,2]。
Q9. 公平约束训练常见的副作用或挑战有哪些?
- A.约束过强导致主任务性能明显下降← 正确答案
- B.只要训练轮数足够长偏见会自动消失
- C.对抗训练容易出现两边互相压制的情况← 正确答案
- D.模型参数量会自动缩小到原来的一半
答案:AC。公平-精度权衡使约束过强时性能下滑;对抗训练天然存在生成器与判别器互相压制的博弈难点。B 是错误直觉——轮数增多反而可能放大偏见;D 完全无关,去偏不会自动剪枝,故选 [0,2]。
Q10. 哪些做法有助于在训练阶段控制偏见?
- A.直接删除样本中的全部敏感属性特征
- B.训练过程中持续监控公平性指标曲线← 正确答案
- C.对少数群体样本进行重采样再训练← 正确答案
- D.用对抗去偏让表征不携带敏感信息← 正确答案
答案:BCD。监控公平指标、数据重采样、对抗去偏都是训练阶段控制偏见的有效手段。A 是经典误区:敏感属性常与其他特征相关,直接删除后模型仍能从代理特征推断群体身份,必须配合约束方法,故选 [1,2,3]。