投出去的简历没有回音,你很难知道是被谁看的。可能是一位忙不过来的招聘人员,也可能是一个先把简历过一遍的模型。如果是后者,它为什么把你划到另一边,通常没人能说清。这类时刻构成了讨论算法公平的起点:不是抽象原则,而是一个人面对一个不解释的决定。
一致对待,未必等于公平
关于公平,至少有两套直觉。一套是同样的人同样对待,不因性别、年龄、地域而区别;另一套是处境不同的人需要不同对待,否则起点差异会被原样复制到结果里。两套直觉都成立,只是在具体场景里指向不同做法。
方言和口音的语音识别是个清楚的例子。系统对所有人开放,接口一样,看上去没什么可指摘的。但如果训练语料里某些口音出现得少,识别效果就会差一截。形式上的一致,落到使用体验上并不一致。这时候说要公平,意思是补数据、补评测集,而不是把接口再开放一次。
删掉字段,不等于删掉信息
常见的做法是敏感字段不进入模型。但模型很擅长从别处推断:填表时间、设备型号、地址写到哪个颗粒度、简历里的措辞习惯,都可能成为代理变量,把被删掉的信息换个方式带回来。它们未必出于恶意,只是与历史数据里的差异高度相关。
所以检查一个模型是否公平,光看输入字段列表没什么用,得看它在不同群体上的误差分布——哪些人被误判得多,误判的代价又由谁承担。代价不对称这件事常被忽略:一次误拒和一次误放,对当事人和对机构的影响完全不同。
指标会打架,选择要有人负责
技术讨论里有一个不太好听但重要的事实:几种常见的公平性度量往往难以同时满足,调好一个,另一个可能变差。于是真正的问题不是算出一个公平值,而是在几种不完美的误差分布之间做选择,并说清为什么这样选。这种选择带有价值判断,不该只留给写代码的人。把理由写进文档、交给能承担责任的角色,才算把算法公平从口号挪进流程。
能申诉,比能声明有用
一个系统是否值得信任,很大程度上取决于它出错之后会发生什么。受影响的人能不能知道系统参与了这次决定,能不能拿到一个听得懂的解释,有没有人可以推翻系统的输出,复核结果会不会回到数据和规则里。这几件事都不新,只是很少被当成模型的一部分。
- 当事人是否被告知系统参与了判断
- 解释是否具体到可以反驳的程度
- 是否存在有权覆盖系统输出的角色
- 纠错能否回写到训练与评测环节
这四项里缺任何一项,那句“我们保证公平”都只是一段发布说明。
我的判断是:算法公平不是模型的属性,而是流程的属性。它更像卫生,不是一份检测报告,而是每天的习惯——数据怎么采、标注谁来做、上线前测什么、上线后听谁的。写下一句承诺很容易,难的是有人打电话来投诉时,接电话的那位手里有没有权限。