负责任工程
负责任工程
本章宗旨
为什么一个完全按照指令运行的系统仍然可能造成伤害?
运维以低延迟、高可用性和持续稳定的预测质量为目标。负责任工程则追问:这些目标是否描述了正确的行为,系统为谁服务,以及其规格说明遗漏了哪些尚未衡量的成本。机器学习系统可能满足延迟、吞吐量和总体准确率要求,同时却在复制历史歧视、奖励有害的用户互动、消耗缺乏正当依据的能源,或在缺乏充分隐私与问责控制的情况下使用数据。这样的系统并未发生故障;它正在高效地优化一份不完整的规格说明。被遗漏的约束表现为不同人群之间不均衡的结果、全生命周期成本与排放、人们无法理解或提出异议的决策,以及伤害发生后无法重建的证据。如果未在部署前将这些后果定义为需求,并在部署后加以监测,那么在伤害不断累积时,常规健康检查仍可能全部显示正常。负责任工程将这些后果视为系统失效,要求以诊断、衡量和缓解延迟或准确率退化时同等的严谨程度处理它们。这项工作需要将广泛的责任义务转化为可测试的边界、有记录的假设、可追溯的数据,以及在生产环境中仍可强制执行的响应路径。用数据—算法—机器的术语来说,责任拓展了正确性的定义:必须审查数据中编码的伤害及其使用是否合法,必须以可辩护的结果要求和效率要求约束算法,而机器基础设施必须在整个系统生命周期中监测、记录并强制执行这些边界。
学习目标
- 解释经过优化的机器学习系统如何通过代理变量、反馈回路和分布偏移放大伤害
- 运用数据—算法—机器诊断,将责任失效定位到数据、算法目标或监测基础设施
- 根据混淆矩阵计算公平性指标,并比较公平性—准确率帕累托前沿上的权衡
- 设计分组评估、压力测试和监测,以便在部署前暴露特定子群体的失效
- 将总成本、推理占主导地位的现象及碳影响作为可衡量的责任约束进行分析
- 构建模型卡、数据说明书、数据血缘记录和审计轨迹,以支持问责
- 依据监管要求和人工复核要求,评估隐私、访问控制与合规设计
将责任纳入系统工程
2014 年,亚马逊构建了一款 AI 招聘工具1,该工具会对包含“women’s”(女性的)一词的简历扣分,例如“women’s chess club captain”(女子国际象棋俱乐部队长),并降低女子学院毕业生的评分。系统忠实地优化其既定目标:识别与以往录用者相似的候选人。系统没有发生执行崩溃或优化失败;历史招聘模式编码了性别偏见,而梯度下降在大规模应用中系统性地复制了这些偏见。
如果说 MLOps 是保障可靠性的控制回路,那么负责任工程就是保障安全性的控制回路。MLOps 监测运行时健康状况,并在预测吞吐量下降时触发重新训练;负责任工程则监测结果分布,并在系统造成伤害时触发干预。用系统工程的术语来说,模型可以通过验证(完全符合其指定的训练目标),却无法通过确认(未能满足运行、安全或法律要求)(National Aeronautics and Space Administration 2016)。这种失效源于不完整的规格说明,而非编译器执行或数值优化中的故障。
传统软件工程将缺陷隔离在模块内部,尽管共享依赖仍可能传播故障。机器学习系统引入了依赖数据的耦合:数据流经共享表示,因此,损坏或有偏的输入会改变服务于后续每次推理的稠密参数矩阵。有偏的训练数据集不会触发编译期断言或运行时崩溃;它会悄无声息地改变整个系统的决策边界。数据—算法—机器分类体系 形式化了一个诊断框架,用于沿数据—算法—机器三个轴定位这类失效的源头:缺乏代表性或有偏的输入(数据)、未对齐的损失函数构造(算法),或服务基础设施中的遥测盲区(机器)。这使责任成为架构不变量,而非部署后的补丁。
负责任工程拓展了机器学习系统正确性的定义。传统的正确性——确保数值稳定性、延迟有界和服务高可用性——仍然必要,但并不充分。生产系统必须满足更广泛的运行边界:不同人口统计子群之间的误差差异有界、能源支出具有正当依据,以及数据血缘可验证。这种扩展后的正确性将工程纪律应用于总体性能指标所忽视的失效模式。p99 延迟突增会在运维仪表板上触发自动告警;人口统计群体之间的公平性退化却不会被总体损失指标发现,直到现实世界中发生伤害才显现出来(原则 原则(英文原版))。两者都需要严谨的遥测和自动化回归测试。
要强制落实扩展后的正确性,就需要能够衡量总体基准测试所掩盖问题的硬件与数据基础设施。本书各处量化的能源预算和加速器资源占用会直接转化为碳排放,因此,效率优化与服务延迟一样,构成了一项物理层面的责任约束。数据治理基础设施——包括访问控制策略、数据血缘跟踪和不可变审计日志——使这些运行边界能够在生产环境中得到强制落实。然而,在构建这些控制措施之前,系统架构师必须先厘清数学收敛在何处、为何偏离系统安全性:标量损失最小化与现实世界结果之间存在结构性差距。
工程责任差距
一个贷款模型即使批准了多数群体中 95% 的合格申请者,同时拒绝了少数群体中 40% 的同等合格申请者,仍然可能获得较低的总体损失。这种技术正确性与负责任的结果之间的责任差距,是机器学习系统工程面临的核心挑战之一,而现有测试方法并非为应对这一挑战而设计。这一差距通过具体机制显现:代理变量、反馈回路和分布偏移。每种机制都通过不同的路径造成伤害,而常规监测无法察觉这些路径。
当优化成功而系统失效时
亚马逊招聘工具的失败,将这一责任差距具体定位到了数据—算法—机器分类体系的数据轴上(见页边定位图):失效源于历史训练信号,而非算法或软件缺陷。一个使用十年历史招聘数据训练的模型,忠实地优化了给定目标,但这些历史模式编码了性别偏见,系统又在候选人评分中复制了这种偏见 (Dastin 2018)。
在经验风险最小化框架下,模型通过识别简历语料库中词元层面的相关性来最小化分类损失。由于历史上技术岗位的录用者主要是男性,与女子学院、女性组织或女性活动相关的词元,与正向录用标签呈现负统计相关。优化算法准确提取了训练数据的经验分布,但这一分布反映的是历史招聘实践,而非候选人的能力。高维文本表示会编码并放大这些统计规律,将社会偏见直接嵌入下游向量表示中 (Bolukbasi et al. 2016)。
亚马逊曾尝试从训练流水线中移除显式性别标识和带有性别含义的词语,以进行补救。这项干预未能确保推荐结果无偏,因为高维特征空间包含保留了人口统计信号的代理变量。2 清除个别属性后,相关特征依然存在:居住隔离使邮政编码与种族相关,申请者姓名与族裔相关,而医疗服务利用情况与社会经济条件相关。在亚马逊的简历流水线中,即使显式性别词语已被删除,剩余词汇——包括就读特定学院或参与特定学生组织的信息——仍然编码了与性别相关的模式 (Dastin 2018)。因此,从训练数据中移除受保护属性,并不足以保证公平性。
有效的补救需要覆盖整个系统生命周期的架构干预,而非表层的数据过滤。在评估层,针对不同人口统计子群体开展分组测试,可以在部署前量化评分分布的差异。在算法层,对抗去偏通过辅助网络尝试从中间表示中预测受保护属性,同时惩罚主模型保留此类信号,从而抑制敏感特征,但仍需持续开展子群体验证。在运行层,针对临界评分进行人工复核,只有在复核人员接受培训、拥有实际权限并受到审计时,才能提供保障;如果他们只是机械地认可模型输出,则无法发挥作用。最后,在监测层,持续跟踪下游招聘结果,可以检测离线损失指标所掩盖的差别影响。由于在现有流水线上补建这些防护措施在技术上难以实现,亚马逊放弃了该项目 (Dastin 2018)。
War Story 1.1: COMPAS 再犯风险算法审计(2016 年)
机制:在基准再犯率不同的人群之间优化校准性,必然导致不同种族群体之间的预测均等性与错误率平衡在数学上存在权衡。
影响:未再次犯罪的黑人被告被错误标记为高风险的比例,接近白人被告的两倍(44.9% 对 23.5%);与此同时,再次犯罪的白人被错误标记为低风险的情况则常见得多。
应对:审计揭示了为何仅凭校准性无法判断错误分布是否可接受。任何使用此类评分的司法辖区,都需要明确规定哪些公平性标准具有重要性,开展跨群体的独立验证,并审查评分如何进入决策工作流。
系统启示:这些评分在不同种族之间大致满足校准性,但由于各群体的假正例率和假负例率并不相同,因此违反了均等化机会准则。形式化的公平性研究结果表明,当基准率不同时,校准性与错误率均等性存在冲突,这说明工程责任要求明确选择应优先满足哪项公平性约束。
亚马逊招聘工具与 COMPAS 风险评估系统3说明了本节的核心论点:优化成功可以与灾难性的系统失效并存。两个模型都没有遭遇软件缺陷或硬件故障。在这两个案例中,优化算法都针对给定目标正确运行。失效发生在架构层面:问题规格说明不完整。当技术目标(最小化经验预测误差或实现统计校准)偏离系统规格说明(在不同用户群体中实现公平、可辩护的结果)时,对损失函数的高度数学忠实性会直接放大伤害。
标准生产遥测无法检测规格说明失效。监测流水线跟踪运行不变量——推理延迟、内存利用率、吞吐量和总体验证损失——而在模型系统性地将错误不均等地分配到不同子群体时,这些指标仍可全部显示正常。一条流水线可能满足技术验证要求(严格符合其代码和损失函数),却完全无法通过系统确认(违反运行和社会要求)。要防止无声的规格说明失效,就必须将责任指标纳入主要测试框架:验证损失函数是否是系统真实目标的可辩护代理,并在部署前强制满足子群体错误率均等性要求。
Checkpoint 1.1: 负责任的设计
责任是系统属性,而非模型属性。
失效模式
检查
静默失效模式
设想一家医院的脓毒症模型:电子健康记录(EHR)工作流变更改变了生命体征的记录方式,此后,模型开始建议对低风险患者实施激进治疗。如页边图所示,一处上游修改在系统影响范围内传播,却没有触发告警:模型置信度评分仍然很高,推理延迟仍符合服务等级协议,所有系统健康检查均显示正常。这种失效悄无声息:输入数据分布已经偏移,但运行监测流水线没有检测分布漂移的机制。
Definition 1.1: 分布偏移
分布偏移已在 引言 中引入,并在 机器学习运维 中落实为漂移检测方法。当部署分布不同于开发或评估模型时所用的分布时,就会发生分布偏移。标准经验风险最小化通常假设训练分布与部署分布一致。协变量偏移改变 \(p(x)\),同时保持 \(p(y \mid x)\) 稳定;标签偏移改变 \(p(y)\),同时保持 \(p(x \mid y)\) 稳定;概念漂移则改变 \(p(y \mid x)\)。
- 意义:Jensen-Shannon 散度 \(\mathcal{D}_{\text{JS}}(P_t \lVert P_0)\) 等散度统计量衡量的是分布变化,而非准确率下降。有效的告警阈值必须针对每项任务、表示、标签生成过程和部署环境进行经验校准,并在标签可用时与观测到的结果建立联系。\(\mathcal{D}_{\text{JS}}\) 值为 0.1,对某个特征空间可能无害,对另一个却可能很严重,而且输入散度监测可能漏掉概念漂移。
- 区别:分布偏移描述的是开发条件与部署条件之间的变化。它并不意味着学习到的映射在训练时就是正确的,也并非每次偏移都会降低性能。
- 常见误区:分布偏移是一个涵盖多种相互重叠分类体系的统称。仅监测 \(p(x)\) 可以检测部分协变量变化,但无法确定 \(p(y \mid x)\) 是否保持稳定;检测概念漂移通常需要带标签的结果或具有合理依据的代理指标。
这个脓毒症场景说明了一类以可用性为中心的监测无法检测的失效。在传统软件系统中,灾难性失效通常会显著暴露:空指针异常终止执行,段错误使进程停止,或耗尽的套接字池返回网络超时。机器学习系统引入了统计性失效模式,在这些模式下,损坏或退化的输出看起来与有效预测毫无区别。浮点张量继续流经矩阵乘法内核,加速器执行在延迟预算内完成,下游服务收到结构格式正确的响应。
分布偏移是这种静默退化背后的第一种主要机制(有关漂移的运行检测与监测策略详见 机器学习运维)。失效源于环境:训练后,输入的实际分布发生了变化,但模型没有内部遥测来检测这种差异。使用新数据重新训练,可以在分布偏移下部分恢复准确率。然而,即使数据分布完全平稳,第二种更根本的静默失效机制依然存在,而重新训练无法解决它:指标错位。
当目标函数优化一个可观测的代理指标,而该指标偏离了系统旨在实现的不可观测结果时,就会发生指标错位。如页边图所示,古德哈特定律描述了这种偏离:一旦代理指标成为优化目标,它就不再是衡量其背后真实目标的可靠尺度。
Systems Perspective 1.1: 对齐差距
从概念上说,假设指标已归一化到共同尺度,equation 1 刻画了这一差距: \[ \text{Gap} = \mathbb{E}[\text{Proxy}] - \mathbb{E}[\text{True}] \tag{1}\]
如果模型使点击量增加 20%,却使满意度下降 5%,那么带符号的对齐差距就会增大。
系统洞见:工程师无法直接优化不可观测的目标。他们需要对代理指标进行有充分依据的验证;只有当随机留出组的结果衡量了真实目标或有合理依据的替代指标时,才能据此估计因果效应。
对齐差距说明了一种源于算法轴的失效:损失函数优化了错误设定的目标,因此,即使模型能够泛化且测试误差为零,它推动的结果仍可能与组织或社会目标相冲突。相比之下,分布偏移源于数据轴:模型逻辑保持完好,但输入分布偏离了训练分布。两种失效都是静默的,却需要截然不同的工程响应——重新设计损失函数,或监测输入并重新训练。混淆两者,会将工程投入浪费在无效的补救措施上。为了定位静默失效的根因,系统工程师会运用在 引言 中引入、并在 数据—算法—机器分类体系 中形式化的数据—算法—机器分类体系。
Systems Perspective 1.2: 数据—算法—机器分类体系
- 数据(信息):训练数据是否反映了历史偏见?(例如,亚马逊的招聘工具从带有偏见的历史数据中学习)。问题出在燃料。
- 算法(逻辑):目标函数是否在优化一个会带来危害的代理指标?(例如,优化“参与度”会加剧两极分化)。问题出在蓝图。
- 机器(物理):其社会效益是否足以证明能源成本的合理性?(例如,为微不足道的任务训练一个庞大模型)。问题出在引擎。
在该分类体系中定位主导失效,可以确定首先应测试的补救措施:改进数据整理(数据)、采用更安全的目标(算法),或使用更高效的基础设施(机器)。实际失效可能跨越多个维度,因此仍须对干预措施进行端到端评估。
数据—算法—机器分类体系区分了失效源于何处,而运维工程则需要识别不同失效模式何时以及如何在生产遥测数据中显现。Table 1 按检测延迟、影响范围和恢复干预措施对机器学习系统失效进行分类。传统基础设施崩溃和吞吐量瓶颈会立即触发告警,而统计性失效则悄无声息地持续数天乃至数月,其间技术健康检查始终显示正常。
| 失效类型 | 示例检测时间 | 示例影响范围 | 可能的响应措施 | 示例 |
|---|---|---|---|---|
| 崩溃 | 立即 | 全部 | 修正原因后重启 | 内存不足错误 |
| 性能下降 | 数分钟 | 全部 | 缓解资源争用 | 资源争用导致延迟骤增 |
| 数据质量 | 数小时至数天 | 部分 | 可能需要修正数据 | 上游系统传入损坏的输入 |
| 分布偏移 | 数天至数周 | 部分或全部 | 可能需要适应性调整 | 新用户群体引起总体人群变化 |
| 公平性违规 | 数周至数月 | 子群体 | 可能需要重新设计 | 历史模式中的偏见被放大 |
YouTube 推荐反馈回路(在 生产环境中的债务模式 中作为一种技术债务模式进行了分析)大规模地体现了这一模式 (M. H. Ribeiro et al. 2020)。4 M. H. Ribeiro et al. (2020) 审计了 YouTube 上的激进化路径,发现用户会从较温和的频道类别迁移至更极端的频道类别,且推荐路径可以连通这些类别。更普遍的系统层面教训是:反馈回路可能完全按照设计运行,却产生与社会价值观相冲突的结果。因此,必须针对下游危害测试推荐目标,而不能只依据参与度代理指标进行测试。
Facebook 对动态消息的全面改版与 YouTube 反馈回路形成了一个富有启发性的对照:工程团队主动牺牲短期参与度指标,以遏制代理指标脱钩并保护长期用户留存 (Mosseri 2018)。
Example 1.1: 动态消息代理指标的转变
诊断:仅优化短期参与度代理指标,使排序输出与用户的长期福祉脱钩,放大了标题党内容和被动消费行为。
系统层面的教训:参与度指标是价值的代理指标,而非价值本身。推荐算法需要采用带有显式安全约束的多目标优化,以防止代理指标失效。
当代理指标失配与人口统计异质性交织时,静默失效就会表现为结构性歧视。分布偏移往往表现为群体不匹配:在汇总基准上接受评估的模型,在特定人口统计子群体上的表现不可靠,却不会触发总体错误告警。当训练目标优化的代理指标反映了历史不平等时,模型就会将这些差异编码进决策边界。这一机制曾导致亚马逊的实验性招聘引擎对包含“women’s”一词的简历进行降分,并在临床医疗分诊中再次出现,造成危及生命的后果。
War Story 1.2: 代理变量陷阱(2019 年)
机制:该模型预测“未来医疗费用”,以此作为“未来健康需求”的代理指标。由于美国医疗系统在病情程度相同的黑人患者身上的支出低于白人患者,算法学到了这一模式,并为黑人患者分配了更低的风险评分。
影响:在任一给定风险评分下,黑人患者的慢性疾病负担都显著高于白人患者,从而降低了黑人患者被纳入专门照护的比例。
响应:研究表明,在所分析的阈值下,用健康需求的直接度量替代费用,会使被识别为需要额外照护的患者中黑人患者的占比从 17.7% 提高至 46.5%。
系统层面的教训:优化代理指标会继承生成该指标的系统所具有的偏见。必须针对系统服务的每个人口统计子群体,审计代理指标与目标之间的关系。
静默失效模式从根本上改变了软件工程与运行验证之间的系统契约。传统软件验证依赖确定性断言:单元测试断言输出与某个精确值一致,内存边界检查器断言缓冲区分配不会越界,看门狗定时器确保 RPC 延迟不超出服务等级协议的约定。在机器学习系统中,仅凭确定性不变量无法验证正确性。即使底层模型正在提供带有偏见、未经校准或有害的预测,浮点矩阵乘法仍可正常执行,内存使用仍可保持稳定,延迟检查仍可显示正常。要将责任目标转化为结构化的工程实践,就必须使统计验证成为实际运行流程:持续监控各人口统计切片中的协变量偏移,审计代理指标与目标之间的相关性,并在静默错误传播到整个生产系统之前,对闭环反馈施加限制。
负责任工程何时能够奏效
每一个有记录的成功案例都具有相同的结构性转变:将模糊的责任目标转化为可以明确规定、测试、沟通,并在必要时用于阻止部署的工程约束。Gender Shades 是一项于 2018 年开展的审计,揭示了商业性别分类系统中严重的错误率差异 (Buolamwini and Gebru 2018);在其研究结果公布后,微软投入资源,改善了各人口统计群体的性别分类性能。定向数据收集、模型调整和系统性的分组评估为团队提供了明确的错误率目标,使深肤色受试者的审计错误率降至 2% 以下 (Raji and Buolamwini 2019)。公布这些分组基准确立了可验证的基线,并将外部审计结果转化为实际运行中的发布门槛。
Twitter 的自动图像裁剪系统在另一种约束下体现了同样的严谨做法。2020 年,用户对预览缩略图中的种族和性别偏见提出质疑。Twitter 审计了该系统,报告了测得的差异及局限性,并转向采用不裁剪的预览图,赋予用户更多控制权 (Yee et al. 2021)。在这一案例中,负责任工程改变了产品设计,而非依靠对自动排序阈值进行渐进式调整。
差分隐私将这一模式形式化:隐私要求成为数学保证,而非政策愿景 (Dwork 2008)。5 实现差分隐私的系统会校准注入的噪声,以平衡效用与隐私损失,使用隐私核算器跟踪重复分析中的累计隐私支出,并记录所选参数。
这些成功案例表明,只有将高层原则转化为贯穿数据—算法—机器技术栈、可强制执行的系统约束,负责任工程才能发挥作用:整理训练数据分布、为算法损失函数设定边界,或在执行运行时中跟踪隐私预算。执行这些约束需要具备停止部署或停用违反规定边界的组件的运维权限。每一项成功的干预都依赖持续评估,但验证这些统计约束与传统软件验证存在根本差异。
测试挑战
传统软件测试依据明确的规格评估行为:算术函数必须返回其操作数的精确和,关系数据库必须保持外键完整性。这类确定性属性可以直接映射为可执行断言。
负责任机器学习的属性难以简单地形式化。公平性具有多种数学定义,在基础发生率不相等和预测不完美等条件下,这些定义可能相互冲突 (Chouldechova 2017; Kleinberg et al. 2017)。何为公平取决于具体情境、价值观以及技术系统自身无法解决的权衡。个体公平性要求相似个体受到相似对待,而群体公平性则要求不同人口统计类别获得公平的结果。这些标准可能相互冲突,在它们之间做出选择需要超出优化范畴的价值判断。
公平性约束与预测性能之间可能存在权衡,但这种关系取决于具体应用。帕累托前沿表示这样一组配置:在所绘制的目标中,任何一个目标的改善都必然导致另一个目标退化。Figure 1 展示了一条假设的公平性—准确率前沿。其中的三个点说明了可能的政策选择;它们并不意味着无约束训练总会在高差异条件下使准确率最大化,也不意味着零差异必然降低准确率,或每一种应用都存在最佳平衡点。
该前沿告诉工程师可能需要选择何种权衡,但只有先测量子群体性能,才能绘制这条前沿。当工程师与利益相关方共同定义适合特定应用的标准时,责任属性才能变得可测试。Gender Shades 项目6展示了如何通过跨人口统计类别的分组评估揭示汇总指标中不可见的差异 (Buolamwini and Gebru 2018),暴露出责任监控必须在部署前捕获的子群体失效。Table 2 展示了商业性别分类系统在不同人口统计群体中产生的显著错误率差异。具体而言,一个包含 10,000 个样本、足以验证多数群体的测试集,对于占总体人群 1 percent 的少数子群体,仅能提供 100 个样本——这实际上意味着,要进行高置信度验证,所需数据量必须达到验证多数群体时的 100×。
| 人口群体 | 错误率(%) | 相对于浅肤色男性 |
|---|---|---|
| 浅肤色男性 | 0.8% | 基准(1.0\(\times\)) |
| 浅肤色女性 | 9.8% | 12.2× |
| 深肤色男性 | 0.7% | 0.9× |
| 深肤色女性 | 34.5% | 43.1× |
正如 table 2 所量化呈现的,分组评估揭示了汇总得分所掩盖的问题。Face++ 报告的浅肤色男性错误率为 0.8 percent,深肤色女性错误率为 34.5 percent(准确率分别为 99.2 percent 和 65.5 percent)。汇总指标完全没有表明,深肤色女性的错误率竟为浅肤色男性的 43.1×。
不存在定义可接受差异的通用阈值,但团队应在部署前设定明确且有充分依据的界限。例如,团队可以将错误率比值低于 1.25\(\times\),或假阳性率之差小于 5 个百分点,作为特定应用的发布政策。在美国就业法中,差别影响原则7塑造了监管监督方式,而五分之四规则8则提供了一项独立且不具决定性的录用率诊断标准。关键的工程准则是制定适合具体应用及适用法律的标准,而不是将某一领域的阈值泛化到其他领域。
要在部署前发现潜在的责任落实失效问题,就需要将测试扩展到统一验证集之外,涵盖三种不同的验证范式。
切片评估将评估数据划分为不同的人口统计群组和运行场景群组,并针对每个切片独立计算指标。模型的总体准确率可能达到 95%,但在低收入申请者或农村群组上却降至 78%——这种严重的性能差异在汇总报告中不可见。
不变性测试验证模型决策在语义无关的特征替换下是否保持稳定。当人口统计特征在法律和技术层面均与信用状况无关时,将贷款申请中的申请人姓名从“John”替换为“Jamal”等操作,不得改变批准概率。CheckList 等行为测试框架通过围绕行为能力和扰动不变性组织验证套件,而非围绕静态验证损失,将这一原则付诸实施 (M. T. Ribeiro et al. 2020)。
边界测试和压力测试用于探查经验验证数据稀少或缺乏代表性的输入范围。边界评估刻画模型在分布边缘的行为,例如极端年龄分布、罕见交易金额或样本稀少的地理类别;在这些区域,预测方差可能急剧增大。压力测试将这些边缘情形进一步扩展到对抗条件,包括受损的特征流水线、突发的协变量偏移,以及旨在检验性能退化时安全裕度的合成边缘案例。利益相关方红队测试通过引入来自受影响群体、针对领域的对抗性探测,补充自动化测试套件,从而发现统计基准所忽视的失效模式。
负责任的测试策略是对传统软件测试的补充,而不是替代。每种策略的选择、配置和解释都需要共同判断。法律专家无法独自确定医疗算法应关注哪些人口统计切片,产品经理也无法独自确定贷款模型应采用哪些不变性测试。领域专家、受影响的利益相关方、政策专家和工程师必须共同界定相关危害;随后,工程师将这些要求编码为可量化的测试和生产控制措施。因此,责任落实既需要在工程团队内部明确归属,也需要工程团队之外的独立监督。
工程团队在责任落实中的主导作用
截至亚马逊放弃该招聘工具时,已尝试的整改仍未能让人确信该工具能够避免提出歧视性建议 (Dastin 2018)。早期的设计选择可能会缩小可用的修复空间。负责任 AI 工程不能完全交由伦理委员会或法务部门承担。这些部门提供必要的监督,但缺乏在开发过程早期发现问题所需的技术访问权限。
法律或伦理审查可以在临近部署时发现问题,却无法恢复系统此前已经排除的设计选项。如果团队在训练模型时没有引入公平性约束,选择了无法支持可解释性要求的架构,或者构建的数据流水线缺少监测所需的人口统计属性,那么审查只能接受、拒绝,或要求进行昂贵的重新设计。因此,工程师在机器学习开发生命周期中处于关键位置,因为他们的选择界定了所有后续干预的解空间:架构决定哪些公平性约束能够适用,优化目标决定系统学习哪些模式,而数据流水线则决定能否开展分组评估。
Definition 1.2: 负责任 AI 工程
负责任 AI 工程是一门工程学科,通过将社会和监管要求转化为数据—算法—机器各轴上可测试的约束,来设计、部署和维护具有概率性输出的系统:数据轴上的约束包括允许的数据内容、来源和构成;算法轴上的约束包括允许的模型行为及鲁棒性属性;机器轴上的约束则包括延迟、能源、计算预算、碳排放和审计日志保留等基础设施界限。
- 意义:数据—算法—机器的每个轴都获得了具体的治理约束:数据轴受《通用数据保护条例》(GDPR)等隐私法规约束,这些法规限制可以收集哪些记录、字段和特征;算法轴受公平性和鲁棒性指标约束(例如,受保护群体之间的人口统计均等性偏差不超过 \(\varepsilon = 5\%\),即正类预测率之差不得超过 5 个百分点;或者在对抗扰动 \(\|\delta\|_\infty \leq 0.01\) 下,准确率下降幅度小于 2%,其中该扰动表示在 \(\ell_\infty\) 范数下,每个归一化特征的最坏情况输入变化均被限制在 0.01 以内);机器轴则受资源和基础设施预算约束,例如延迟、每次推理的能耗、碳排放和审计日志保留。违反这些界限属于系统失效,而非研究上的不足。
- 区别:与阐述理想价值观的 AI 伦理不同,负责任 AI 工程将这些价值观转化为可量化、可测试的不变量,通过自动化测试和持续监测进行验证,并采用与保障延迟 SLO 相同的生命周期实践。
- 常见误区:一种常见误解是,责任要求可以在开发结束时再“添加”。对可收集数据的约束会影响能够学习和审计的内容,而基础设施选择会影响能够保留哪些证据。后期整改仍可能可行,但其范围通常更窄、速度更慢、成本更高。
以工程为中心的方法并不会削弱多元视角在识别潜在危害方面的重要性。产品经理、用户研究人员、受影响群体和政策专家提供了不可或缺的知识,帮助理解系统为何在技术上成功却在社会层面失效。工程师将这些关切转化为可量化的要求和可测试的属性,并在整个开发生命周期中加以验证。有效的责任落实需要工程师既倾听利益相关方的关切,又具备实施适当保障措施的技术能力。
工程团队并非孤立运作。正如 figure 2 所清晰呈现的,工程实践嵌套于更广泛的组织、行业和监管治理结构之中,每一层都对其内部层级施加约束。最内层的卓越技术实践有助于遵守外部治理向内传递的要求,但不能取代对这些要求的遵守。
\scalebox{0.9}{%
\begin{tikzpicture}[line join=round,font=\sffamily\small]
\definecolor{col1}{RGB}{249,240,241}
\definecolor{col2}{RGB}{246,231,233}
\definecolor{col3}{RGB}{229,220,228}
\definecolor{col4}{RGB}{211,212,214}
\definecolor{blue1}{RGB}{0,76,151}
\definecolor{green1}{RGB}{46,139,87}
\tikzset{%
EL1/.style={align=flush center,
ellipse,
inner xsep=2pt,
%node distance=0.4,
draw=crimson,%mygreen,
line width=0.75pt,
fill=col1,%mygreen!06,
minimum width=134mm, minimum height=73mm
},
Box2/.style={Box, draw=myred, fill=magenta!03 },
Txt/.style={crimson,align=center,font=\sffamily\bfseries\fontsize{8pt}{8}\selectfont},
Txt1/.style={black!60,align=center,font=\sffamily\fontsize{6pt}{7}\selectfont},
LineA/.style={black!50,line width=1.25pt,
{{Triangle[width=1.0*5pt,length=1.0*8pt]}-{Triangle[width=1.0*5pt,length=1.0*8pt]}},
shorten <=0pt,shorten >=0pt},
}
\node[EL1](E1){};
\node[below=3pt of E1.north,Txt]{政府监管\\
{\color{black!70}\sffamily\itshape\fontsize{6pt}{6}\selectfont 法律、行政命令、监管机构}};
\node[EL1,minimum width=105mm, minimum height=61.5mm,fill=col2](E2)
at(0,-0.28){};
\node[below=2pt of E2.north,Txt]{行业\\
{\color{black!70}\sffamily\itshape\fontsize{6pt}{6}\selectfont
可信认证与外部审查}};
\node[EL1,minimum width=77mm, minimum height=49mm,
draw=blue1,fill=col3](E3)
at(-0.35,-0.44){};
\node[below=4pt of E3.north,Txt,blue1]{组织\\
{\color{black!70}\sffamily\itshape\fontsize{6pt}{6}\selectfont
安全文化与组织设计}};
\node[EL1,minimum width=49mm, minimum height=33mm,
draw=green1,fill=col4](E4)
at(-0.85,-0.87){};
\node[below=18pt of E4.north,Txt,green1](T1){团队\\ 可靠系统};
\node[below=1pt of T1,Txt1]{%
审计轨迹\\ 验证 \& 偏差测试\\
可解释界面\\ 软件工程工作流程};
\node[left=6pt of E3.east,anchor=east,Txt1]{%
领导层\\ 承诺
\\[1ex]
招聘 \& 培训
\\[1ex]
内部审查};
\node[left=6pt of E2.east,anchor=east,Txt1]{%
审计机构
\\[1ex]
认证\\ 机构
\\[1ex]
专业\\ 学会};
%line below
\coordinate(L)at ($(E1.south)+(-45mm,-2mm)$);
\coordinate(D)at ($(E1.south)+(45mm,-2mm)$);
\draw[-latex,Txt1](L)--node[below=1pt]{要求向内传递;技术实践支撑合规}(D);
\end{tikzpicture}}这些治理层级界定了责任归属,但尚未涵盖常规性能指标所忽略的成本。
除了伦理要求之外,负责任工程还能通过三种相互强化的机制创造商业价值。最直接的机制是风险缓解:机器学习系统失效会带来法律和财务风险,而系统性的责任落实实践可以降低这些风险。亚马逊在发现内部招聘模型的建议存在与性别相关的差异后,放弃了该模型。实施分组评估、文档记录和监测的组织,可以降低代价高昂的失效事件发生的概率,并在问题出现时保留其工程过程的证据。
第二种机制是监管合规,其驱动力是因司法管辖区和应用风险而异的法律要求。例如,欧盟《人工智能法案》对高风险 AI 应用进行分类,并强制要求满足风险评估、数据治理、透明度和人类监督等技术要求。将责任要求融入工程实践的组织,可以通过已有的文档和监测来证明合规,避免昂贵的事后改造;其中的工程启示是,主动控制通常比部署后重建证据成本更低。
Systems Perspective 1.3: 铁律的完整成本
竞争差异化补全了商业价值论证。信任可以影响企业对机器学习服务的采购决策;能够通过模型卡、审计轨迹和公开评估结果证明其系统性责任落实实践的组织,可能获得竞争对手无法取得的部署资格。苹果的隐私定位、微软的负责任 AI 原则和 Anthropic 的安全研究表明,责任落实可以是一项战略投资,而非纯粹的防御性成本。
当部署所用的运行时和硬件能够利用量化表示,且实测工作负载能耗确实下降时,模型压缩 中的量化技术可以降低推理能耗。当系统依法收集了必要的结果数据和子群体数据时,机器学习运维 中的监测基础设施可以支持分组公平性评估。负责任工程通过将原则转化为流程的结构化框架,把这些能力整合为规范的实践。
及早应用系统性流程,本可以降低 section 1.1 中所考察失效事件的发生概率或严重程度。检查清单、文档标准、测试规程和监测基础设施将责任原则转化为可重复的工程工作流程,但并不能保证防止失效。
负责任工程检查清单
结构化的部署前审查本可以揭示亚马逊招聘工具所学习到的性别相关信号,而分组测试则暴露了 COMPAS 的错误率差异。这两起失效事件有一个共同原因:责任落实被视为独立的审查阶段,而没有融入开发工作流程。负责任工程检查清单将评估嵌入工程决策产生持久风险的各个环节:部署前、文档记录中、针对特定人群的评估过程中、解释与合规的边界处,以及上线后的监测中。这些阶段相互衔接:评估确定测量对象,文档保留假设,公平性评估检查性能能否在不同群体中保持,可解释性与合规将决策转化为义务,而监测则将检测到的违规与干预措施衔接起来。
部署前评估
在贷款审批模型进入生产环境之前,团队必须确定训练数据的来源,识别哪些人群得到代表、哪些人群缺失,预判失效模式,并为受影响用户界定申诉与救济途径。Table 3 将这项评估划分为五个阶段,区分了关键路径阻塞项与可在记录风险接受决定后继续推进的高优先级事项。
| 阶段 | 优先级 | 关键问题 | 所需文档 |
|---|---|---|---|
| 数据 | 关键路径 | 这些数据来自哪里?哪些人群得到代表?哪些人群缺失?可能编码了哪些历史偏差? | 数据来源记录、人口统计构成分析、采集方法文档 |
| 训练 | 高优先级 | 系统在优化什么?损失函数隐含惩罚了什么?架构选择如何影响结果? | 目标函数说明、正则化选择、超参数选择依据 |
| 评估 | 关键路径 | 性能能否在不同用户群体中保持?存在哪些边缘案例?测试集是如何构建的? | 按人口群体分组的指标、边缘案例测试结果、测试集构成分析 |
| 部署 | 关键路径 | 系统将影响哪些人?失效时会发生什么?受影响用户有哪些申诉与救济途径? | 影响评估、利益相关方识别、回滚程序、用户通知规程 |
| 监测 | 高优先级 | 如何检测异常?由谁审查系统行为?什么情况会触发干预? | 监测仪表板规范、告警阈值、审查计划、升级处理程序 |
关键路径事项是部署阻塞项:在这些问题得到回答之前,系统不得进入生产环境。高优先级事项应得到处理,但在记录风险接受决定并制定整改时间表后,可以继续推进。这一区分使团队能够负责任地交付,而无须在首次部署前要求每个维度都达到完美。
table 3 的“评估”一行提出了一个关键问题:性能能否在不同用户群体中保持。回答这一问题需要为每个群体构建统计上有效的测试集;当代表性不均衡时,这可能带来出乎意料的严格数据要求。
Napkin Math 1.1: 代表性的统计学
随机抽样:要通过随机抽样,从占比为 1 percent 的群体中获得 10,000 images,团队必须收集并标注: \(D_{\text{eval,total}}\) = 10,000 images / 0.01 = 1,000,000 images
分层抽样:专门针对该群体进行抽样(例如,通过主动学习或社区联络),则只需要 10,000 images。 系统启示:在随机抽样下,依靠“自然分布”的数据开展公平性评估,成本高得难以承受。有效验证少数群体所需的数据量是验证多数群体的 100×。公平性需要有意识的数据工程,而不仅仅是更多数据。
有意识的数据工程解决了模型在评估期间看到什么的问题,但如果系统缺乏充分的人类监督,即使数据集具有完美的代表性,也无法防止部署时造成伤害。粗略估算 1.1 中推导出的代表性成本构成了一道部署前门槛;接下来的问题是,当模型上线并开始做出影响人们的决策时,会发生什么。
War Story 1.3: 自动化悖论(2018 年)
机制:感知系统检测到一名正在横穿道路的行人,却反复在车辆、自行车和未知类别之间切换分类结果,不断重置轨迹预测,而自动紧急制动功能被有意禁用。
影响:安全驾驶员因查看个人手机而分心,未能接管车辆,最终导致了一起致命碰撞事故。
修复措施:Uber 为车队加装了驾驶员监控摄像头,重新启用了自动紧急制动功能,并在自动驾驶道路测试期间实行双操作员配置。
系统教训:增加人类后备人员会形成一个具有自身失效模式的新系统。自动化的高可靠性可能使人产生自满并降低警觉,因此,有效的后备机制需要工作负荷设计、注意力监测,以及针对人机组合系统的安全论证。
对于高风险应用,部署阶段应明确哪些环节需要人类监督。人在回路(HITL)系统 会将存在不确定性、后果重大或被标记的决策交由人工审核,而非自主采取行动。有效的 HITL 设计必须明确四项要求:审核范围(哪些决策需要人工审核)、触发升级处理的置信度阈值、审核人员接受的培训,以及监测审核人员表现的机制。HITL 并非万能解决方案:人工审核人员可能不加审查地批准自动化决策、引入自身偏见,或因告警数量过多而不堪重负。有效的 HITL 设计需要根据具体应用风险和审核人员能力,校准人机之间的职责边界。
部署前评估框架类似于航空飞行前检查清单,后者在时间压力下规范关键检查。生产环境中的机器学习部署同样需要纪律和严格验证。检查清单促使团队提出正确的问题,但并不能证明系统是安全的;文档标准则保存这些问题的答案,并使其能够随模型一同流转。
模型文档标准
设想接手一个没有元数据的生产模型:该模型在指定测试集上的准确率达到 94%,但测试集的来源、训练数据的构成,以及已评估的人口统计或环境切片均未记录。缺乏这些基线时,更新或重新部署模型就可能在分布偏移下出现未经衡量的性能退化。模型卡 为训练完成的模型提供了标准化接口规范9 (Mitchell et al. 2019)。类似于计算机工程中的组件数据表,模型卡随模型制品一起记录其运行边界、评估条件和预期运行情境。
完整的模型卡涵盖七个核心部分,共同形式化定义模型的运行包络。首先是支持复现和审计的技术细节(架构、训练流程和超参数)。它在说明预期用途的同时,明确列出不适用的应用,以防止将为消费级照片索引训练的模型改用于高风险监控等范围蔓延现象。随后,模型卡记录影响性能的因素(人口统计群体、环境条件或传感器差异),为评估切片和生产监控提供指导。
其余部分对实证行为进行量化并界定边界。性能指标必须针对 section 1.2.4 中确定的运行因素报告分解结果,因为总体准确率会掩盖子群体之间的系统性差异。记录训练和评估数据集能够辨明潜在的抽样偏差,并界定所报告指标成立的数据分布。最后,伦理考量、注意事项和建议通过记录已知失效模式、未建模的边缘情形和运行缓解措施,使部署中的权衡变得明确。
将这一模式应用于 MobileNetV2,可以说明这些类别如何转化为具体的部署约束;table 4 汇总了由此形成的边缘分类服务模型卡。
| 部分 | 内容 |
|---|---|
| 模型细节 | MobileNetV2 架构,具有 3.5M 个参数,采用深度可分离卷积,在 ImageNet 上训练。经过 INT8 量化,用于边缘部署。 |
| 预期用途 | 在移动设备上进行实时图像分类,延迟要求低于 50 ms。适用于照片整理和无障碍功能等消费级应用。 |
| 影响因素 | 性能随图像质量(模糊、光照)、物体在画面中的大小,以及 ImageNet 分布之外的类别而变化。 |
| 指标 | 在 ImageNet 验证集上的 top-1 准确率为 71.8%(全精度:72.0%)。准确率因类别而异:常见物体为 85%,细粒度区分为 45%。 |
| 伦理考量 | 训练数据反映了 ImageNet 在地理和人口统计代表性方面的偏差。尚未针对高风险应用(医疗诊断、安全筛查)进行验证。在代表性不足地区的图像上,性能可能下降。 |
数据集数据表 为数据层提供了配套文档 (Gebru et al. 2021)。从数据—算法—机器的视角来看,模型卡规定算法和机器的边界,包括量化精度和推理延迟预算;数据表则记录数据来源、采集方法、筛选整理规则和人口统计构成。这些文档标准共同建立起系统的运行契约:文档规定系统在设计上能够容忍哪些情况,而实证测试则验证系统是否在其服务的不同人群中公平地发挥作用。
跨人群测试
揭示 Gender Shades 差异的分解评估(section 1.2.4)如今成为一项实际的发布门禁任务:选择切片、指标和阈值,以决定是否允许部署。总体性能指标会掩盖用户人群之间的差异,即平均值的缺陷 (Savage 2009);负责任的测试需要开展分解评估,考察每个相关子群体的性能。
Systems Perspective 1.4: 平均值的缺陷
平均值的缺陷确立了核心测试原则:总体指标会掩盖尾部失效。将这一原则转化为工程工作流程,需要确定应单独考察哪些人群切片和失效模式。由于视觉分类器、推荐引擎和音频唤醒词检测器的失效方式各不相同,公平性指标和评估切片必须体现应用领域的特点。在医疗诊断中,年龄和生理性别等人口统计群体决定切片定义。在内容审核中,方言和语言语境起主导作用。在金融信贷审批中,信贷法规要求对受法律保护的类别进行审计。
将这些评估落到实处,需要测试基础设施具备四项核心能力。第一,分层评估 分别计算各群体的性能指标,揭示人群之间的错误率差异。第二,交叉分析 评估属性组合,捕捉在单因素切片中无法显现的叠加失效模式。第三,当子群体样本量不足导致点估计噪声较大时,置信区间可量化统计不确定性。第四,时间监测在整个部署期间持续跟踪群体性能,在分布漂移影响总体健康检查之前,检测其对少数群体切片造成的性能损害。
只有当工程团队明确了指标、子群体切片和告警阈值后,工具选择才有意义。Fairlearn (Bird et al. 2020)、AI Fairness 360 (Bellamy et al. 2019) 和 Google 的 What-If Tool (Wexler et al. 2020) 等开源评估套件简化了分层指标和交叉指标的计算,但软件库无法提供领域判断。它们会计算工程师查询的任何指标,却无法决定哪些人口统计边界重要、为值班工程师校准呼叫告警阈值,或选择适当的法律公平性约束。
实际的发布门禁必须区分缺乏证据与证明表现一致的证据。如果某个切片缺乏足够的带标签验证数据,无法以统计置信度界定错误率,CI/CD 门禁就必须报告数据不足,而非错误地判定通过,进而触发定向数据采集或限制部署范围。因此,人群测试落实的是一种三状态运行契约:通过、未通过或证据不足。
Lighthouse 1.1: 不同原型的公平性问题
仅凭架构并不能决定公平性;每一行指出的都是特定部署中应优先测试的风险,而非该模型家族的普遍属性。
| 原型 | 主要公平性风险 | 关键评估指标 | 现实示例 |
|---|---|---|---|
| ResNet-50(计算巨兽) | 训练数据偏差(与部署相关的群体代表性不足) | 按人口统计群体分解的准确率 | 在特定应用的人口统计切片上评估已部署的分类器;Gender Shades 的数值并非对 ResNet-50 的测量结果 |
| GPT-2(带宽吞噬者) | 语料库偏差(网络文本中过度呈现多数群体观点) | 按提示词的人口统计语境划分的有害内容生成率;刻板印象得分 | 对于提及少数群体的提示词,大语言模型会生成更多有害续写 |
| DLRM(稀疏散布) | 反馈循环放大(热门条目获得更多数据) | 按条目类别及供应商或创作者群体划分的推荐曝光份额 | 过滤气泡:系统向相似用户推荐相似内容,减少小众创作者被发现的机会 |
| DS-CNN(微型约束) | 部署情境不匹配(在干净音频上训练,在嘈杂的现实环境中部署) | 按声学环境和说话者口音划分的假阳性率 | 语音助手对带口音语音的表现较差;某些语言的电视音频会触发唤醒词检测 |
系统启示:公平性评估必须与各原型的失效模式相匹配。视觉模型需要按人口统计群体分层的准确率;大语言模型(LLM)需要有害内容和刻板印象探测;推荐系统需要曝光审计;TinyML 需要声学环境测试。机器学习系统 中作为微型约束灯塔案例引入的关键词检测(KWS)系统,其 DS-CNN(一种深度可分离卷积神经网络(CNN))恰好面临这一挑战:它在干净的录音室音频上训练,却必须在实际部署的家庭环境中,面对不同口音、背景噪声水平和说话者人口统计特征,保持公平的性能表现(这一治理挑战将在 section 1.5 中讨论)。
实例:贷款审批中的公平性分析
某贷款审批模型报告,其在多数群体上的准确率为 85 percent,在所有受评估申请人中的总体准确率为 82.5 percent——这些数值或许足以满足粗粒度汇总仪表板的要求。按人口群组分别评估模型,可以揭示汇总指标如何掩盖严重差异。Table 6 详细列出了多数群体(A 组)的结果:
| 批准(预测) | 拒绝(预测) | |
|---|---|---|
| 已还款(实际) | 4,500 (TP) | 500 (FN) |
| 已违约(实际) | 1,000 (FP) | 4,000 (TN) |
Table 6 确立了多数群体的基准,用于评估三项标准的公平待遇准则,每项准则都对应不同的业务运行目标:10
人口统计均等要求各群体的正向选择率相等,而不考虑其实际资质(\(P(\hat{Y}=1 \mid A=a) = P(\hat{Y}=1 \mid A=b)\))。A 组的批准率为 \((4,500 + 1,000) / 10,000 = 55\%\),而 B 组的批准率为 \((600 + 200) / 2,000 = 40\%\)。由此产生的 15 percentage-point 差异表明,两个群体的选择结果并不均等。
机会均等要求各群体中合格申请人的真正率相等(\(P(\hat{Y}=1 \mid Y=1, A=a) = P(\hat{Y}=1 \mid Y=1, A=b)\))。A 组的真正率(TPR)为 \(4,500 / (4,500 + 500) = 90\%\),这意味着具有还款能力的申请人中有 90 percent 获得贷款。B 组则仅为 \(600 / (600 + 400) = 60\%\)。这一 30 percentage-point 差异揭示,相较于 A 组中同等资质的申请人,B 组的合格申请人遭到了不成比例的拒绝。
均等化几率进一步收紧约束,要求真正率和假正率均相等(\(P(\hat{Y}=1 \mid Y=y, A=a) = P(\hat{Y}=1 \mid Y=y, A=b)\),其中 \(y \in \{0,1\}\))。11A 组的假正率(FPR)为 \(1,000 / (1,000 + 4,000) = 20\%\),与 B 组的 \(200 / (200 + 800) = 20\%\) 相同。虽然假正率一致,但真正率上的显著差距违反了均等化几率。由于群体基础率不相等且预测不完美会使多项公平性准则相互不相容,因此必须明确选择实际运行中要提供的保证,并为其提供依据,而不能从汇总准确率推导出这些保证。
在 table 7 中,对同一模型在少数人口群体上的评估揭示了这些准则如何在错误分布不均等时产生分歧:
| 批准(预测) | 拒绝(预测) | |
|---|---|---|
| 已还款(实际) | 600 (TP) | 400 (FN) |
| 已违约(实际) | 200 (FP) | 800 (TN) |
这些指标之所以存在分歧,是因为它们体现了不同的政策选择,即哪些错误率最为重要。在这一情境中,模型以高得多的比率拒绝 B 组的合格申请人(假负率为 40 percent,而 A 组为 10 percent),同时保持相近的假正率。这些混淆矩阵证实了实际运行中的差异,但无法确定它究竟源于分类阈值、标注偏差、遗漏特征、采样偏斜,还是历史歧视。
在收集和使用受保护属性合法且具有正当依据的情况下,生产系统可以自动执行这些计算,并在差异超过预定义阈值时触发审查。Listing 1 明确规定了失败处理约定:无法定义的群体比率应报告为数据不足,而不是与阈值进行比较。
def compute_fairness_metrics(confusion_matrix):
tp, fp, tn, fn = (
confusion_matrix[k] for k in ["TP", "FP", "TN", "FN"]
)
total = tp + fp + tn + fn
return {
# Demographic parity
"approval_rate": (tp + fp) / total if total else None,
# Equal opportunity
"tpr": tp / (tp + fn) if (tp + fn) else None,
# Equalized odds (with TPR)
"fpr": fp / (fp + tn) if (fp + tn) else None,
}
# Compare groups and flag disparities exceeding threshold
for metric in ["approval_rate", "tpr", "fpr"]:
if metrics_a[metric] is None or metrics_b[metric] is None:
report_insufficient_data(metric)
continue
disparity = abs(metrics_a[metric] - metrics_b[metric])
# e.g., 0.05 for high-stakes applications
if disparity > FAIRNESS_THRESHOLD:
trigger_alert(metric, disparity)自动化监控能够实现人工审计在大规模下无法做到的事情:持续跟踪公平性指标,并在差异出现时立即发出告警。30 percentage-point 的 TPR 差异远超这一情境中 5 个百分点的发布阈值,表明模型在部署前需要进行公平性干预。Table 8 汇总了两个群体的指标计算结果及其差异。
| 指标 | A 组 | B 组 | 差异 |
|---|---|---|---|
| 批准率 | 55% | 40% | 15 pp |
| 真正率 | 90% | 60% | 30 pp |
| 假正率 | 20% | 20% | 0 pp |
将相同的分类阈值应用于不同的分数分布,说明了汇总性能如何掩盖严重的子群体差异 (Barocas and Selbst 2016),如 figure 3 所示。仅凭汇总准确率无法判断这些结果对任一群体是否公平。
\scalebox{0.7}{%
\begin{tikzpicture}[line join=round,font=\sffamily]
\tikzset{%
LineA/.style={line width=2.5pt,black!50,text=black},
LineD/.style={line width=1.5pt,black!50,text=black,dashed,dash pattern=on 4pt off 3pt},
circR/.style={draw=red, fill=white,line width=2.5pt,circle, minimum size=5mm, inner sep=0pt},
circB/.style={draw=blue!70!black, fill=white,line width=2.5pt,circle, minimum size=5mm, inner sep=0pt},
}
\newcommand{\fplus}[1][black]{%
\tikz\draw[#1,scale=0.55,line width=3.5pt] (0,0) -- (1,0)(0.5,0.5) -- (0.5,-0.5);
}
\draw[LineA](0,0)coordinate(A1)node[left](SA){子群体 A}--(12.5,0)coordinate(A2);
\draw[LineA](0,-1.25)coordinate(B1)node[left]{子群体 B}--(12.5,-1.25)coordinate(B2);
\coordinate(D7G)at($(A1)!0.3!(A2)$);
\coordinate(D8G)at($(A1)!0.63!(A2)$);
\coordinate(D7D)at($(B1)!0.3!(B2)$);
\coordinate(D8D)at($(B1)!0.63!(B2)$);
\draw[LineD]($(D7G)+(0,1)$)node[above](SE){75\%}--($(D7D)+(0,-0.37)$);
\draw[LineD]($(D8G)+(0,1)$)node[above]{81.25\%}--($(D8D)+(0,-0.37)$)coordinate(DO);
\foreach \x in{0.25,0.35,0.42,0.49}{
\node[circB,yshift=4mm]at($(A1)!\x!(A2)$){};
}
\foreach \x in{0.68,0.75,0.82,0.89}{
\node[yshift=4mm]at($(A1)!\x!(A2)$){\fplus[blue!70!black]};
}
\foreach \x in{0.05,0.12,0.19,0.42}{
\node[circR,yshift=4mm]at($(B1)!\x!(B2)$){};
}
\foreach \x in{0.35,0.49,0.56,0.75}{
\node[yshift=4mm]at($(B1)!\x!(B2)$){\fplus[red]};
}
\node[draw=none,fit=(SA)(A2)(SE)(DO)](FI){};
\node[circB,below left =-2pt and 1pt of FI.210](CI1){};
\node[circR,right=5pt of CI1](CI2){};
\node[right=0pt of CI2]{正类结果};
\node[below right=-7pt and 0pt of FI.300](CI3){\fplus[blue!70!black]};
\node[right= -6pt of CI3](CI4){\fplus[red]};
\node[right=0pt of CI4]{负类结果};
\node[below=17pt of FI.south]{\footnotesize 颜色表示子群体;标记形状表示结果。};
\end{tikzpicture}}缓解这些差异需要在数据—算法—机器流水线的各个阶段进行干预,而每个阶段都会带来特定的系统取舍:
通过阈值调整进行后处理,为不同群体分别设置决策边界,降低 B 组的批准阈值,以使 TPR 相等。实际运行中的代价是该群体内的假正例增加,即批准了之后可能违约的申请人。
通过样本重加权进行预处理,在训练期间调整 B 组样本的损失惩罚权重,在不丢弃数据的情况下增强代表性不足群体的梯度信号。12这种取舍体现在更广泛的损失曲面上,重加权可能降低多数群体切片上的准确率。
通过对抗去偏进行训练中处理,引入一个辅助分类头,尝试从内部表示中恢复受保护属性,并在人口统计信息泄露时惩罚编码器。13由此得到的表示满足选定的公平性不变条件,代价则是训练不稳定、对超参数敏感以及额外的计算开销。
在这些干预措施之间做出选择,需要利益相关方就特定部署领域中可接受的取舍达成一致。系统工程师通过明确这些取舍并将其量化,使其能够落实为行动。
Checkpoint 1.2: 公平性准则
公平性并非单一指标,而是一种受约束的设计选择。
量化公平性与准确率之间的取舍
Kleinberg et al. (2017) 中的不可能性定理证明,相互排斥的公平性准则必然带来工程取舍,并对 figure 1 中引入的帕累托前沿进行了形式化。然而,仅知道存在取舍还不够:系统工程师必须量化施加公平性约束所带来的确切效用代价,为实际运行决策提供依据。自动化招聘流水线使这种经济层面的取舍变得具体。
Napkin Math 1.2: 公平性的代价
机理:通过调整处于不利地位群体的分类阈值 \((\gamma_{\text{cls}})\),可以使各群体的 TPR 相等。
- 初始状态:群体 A(\(\text{TPR} =\) 90 percent),群体 B(\(\text{TPR} =\) 70 percent)。总体准确率 = 85 percent。
- 干预:降低 \(\gamma_{\text{cls},g=B}\),直至 \(\text{TPR}_{g=B} =\) 90 percent。
- 代价:降低阈值会增加假正例(录用未达到要求的候选人)。
数学分析:
- 在该情景假定的阈值响应下,消除 20 percentage-point 的 TPR 差距,会使处于不利地位群体的假正率增加 15 percentage-point。
- 如果正例基准率为 20 percent,成功录用一人的价值为 $100,000,而错误录用一人的成本为 $50,000,则必须同时核算干预带来的收益与成本:
- \(\Delta\text{Utility} = \Delta\text{TPR} \times \text{Base Rate} \times \text{Hire Value} - \Delta\text{FPR} \times (1 - \text{Base Rate}) \times \text{Bad Hire Cost}\)。
- 对群体 B 的每位申请者,新增真正例带来的价值为 $4,000,新增假正例带来的成本为 $6,000,净损失为 $2,000。
- 这相当于群体 B 基准效用的 20 percent。当群体 B 占申请者的 30 percent 时,全体申请者平均每人的损失为 $600;要计算总体损失百分比,还需要另一个群体的基准效用。
系统洞见:在此情景下,“公平性的代价”是群体内部 20 percent 的效用损失,无法据此推导出总体损失百分比。损失并非必然发生:当 TPR 差距源于阈值校准不当时,消除差距可以提高净效用。当基准阈值接近效用最优点,且新增录用者偏向不合格者时,才会出现这种损失。工程团队有责任向利益相关方同时提供帕累托前沿及其所依据的运行假设。
这一计算为利益相关方提供了在公平性—准确率前沿上选择某一点的方法,但仍无法解释任何具体决策。当贷款申请者被拒绝时,告知其“模型对这一人口群体的真正率为 60%,而其他群体为 90%”,并不能提供可据以采取行动的信息。申请者需要知道申请为何被拒绝,以及哪些方面可以改变。这些问题需要可解释性,即能够阐明哪些输入特征促成了具体预测的能力。
可解释性要求
被算法系统拒绝授信的贷款申请者,依据适用法律,可能有权获知原因或导致不利决定的具体因素,而不仅仅是汇总统计数据。可解释性14支持这一能力:它使人类能够监督自动化决策,支持在问题出现时进行调试,并可满足适用的决策透明度要求。
所需的可解释性程度因应用情境和监管环境而异。Table 9 将常见部署场景与其可解释性需求对应起来。
| 应用领域 | 可解释性程度 | 典型要求 |
|---|---|---|
| 信贷决策 | 对适用范围内的决定提供具体原因 | 可能必须向申请者披露主要原因 |
| 医疗诊断 | 决策支持 | 支持临床审查及适用的文档记录要求 |
| 内容审核 | 取决于具体情境 | 在有要求时支持通知或申诉 |
| 推荐 | 取决于具体情境 | 提供与用途及适用规则相适应的透明度 |
| 欺诈检测 | 受控披露 | 权衡适用的通知义务与对抗性规避风险 |
选择可解释性策略时,需要在三种不同的设计范式中权衡解释忠实度、服务延迟和架构灵活性:
事后解释方法包括 SHapley 加性解释(SHAP)和局部可理解的模型无关解释(LIME),它们无需修改模型内部结构,即可为单次预测生成特征重要性分数。15由于这些方法会评估查询点周围的扰动,它们将解释与模型架构解耦,但也引入了服务路径上的延迟开销和采样近似。
内在可理解模型通过结构约束来确保透明度,采用浅层决策树、稀疏线性模型,或每个参数都直接映射到物理决策边界的广义加性模型。这种内在清晰性往往以牺牲高维输入上的表达能力为代价。需要强调的是,注意力权重等内部表示并不构成对因果决策逻辑的忠实事后解释。
基于概念的解释将内部激活转换为人类可理解的语义概念,而不是原始输入坐标。通过将潜在向量投影到有方向的概念向量上,这类方法弥合了底层传感器特征与高层运行审计之间的鸿沟,但需要带标注的概念集来校准投影。
Example 1.2: 医院捷径
诊断:神经网络学到了捷径特征(医院特有的扫描仪伪影和文本标记),而非真正的肺部生物病理特征。
系统启示:模型会利用特征空间中阻力最小的路径。外部验证对于检测捷径学习至关重要;显著性图可以提供辅助证据,但无法证明模型学到了预期机制。
医院捷径说明,可理解性是一项系统要求,而非展示层面的润色:团队需要足够的可见性,以便在部署前调查捷径。Figure 4 将由此产生的权衡排列在同一条轴上。在左侧,受到适当约束的决策树和线性模型可以提供直接的可审计性,不过特征设计和模型规模仍然重要。在右侧,深度神经网络和卷积架构可以为复杂任务提供更强的能力,但难以由人直接检查,因此需要 LIME 或 SHAP 等事后解释摘要,而这些摘要本身也必须经过验证。
\begin{tikzpicture}[line join=round,font=\sffamily\small]
\tikzset{%
Box/.style={align=flush center,
inner xsep=2pt,
node distance=0.4,
draw=mygreen,
line width=0.75pt,
fill=mygreen!06,
minimum width=24mm, minimum height=10mm
},
Box2/.style={Box, draw=myred, fill=magenta!03 },
Txt/.style={,font=\sffamily\itshape\footnotesize,black!50},
LineA/.style={black!50,line width=1.25pt,
{{Triangle[width=1.0*5pt,length=1.0*8pt]}-{Triangle[width=1.0*5pt,length=1.0*8pt]}},
shorten <=0pt,shorten >=0pt},
}
\ExplSyntaxOn
\fp_new:N \l__ctr_rect_width_fp
\fp_new:N \l__ctr_rect_height_fp
\fp_new:N \l__ctr_rect_angle_fp
\tl_new:N \l__ctr_rect_spec_tl
\tl_new:N \l__ctr_rect_name_tl
\int_new:N \g__ctr_rect_shading_int
\keys_define:nn { colour_transition_rectangle }
{
width .fp_set:N = \l__ctr_rect_width_fp,
width .initial:n = {6},
height .fp_set:N = \l__ctr_rect_height_fp,
height .initial:n = {3},
angle .fp_set:N = \l__ctr_rect_angle_fp,
angle .initial:n = {0},
}
\NewDocumentCommand \ColourTransitionRectangle { O{} m }
{
\group_begin:
\keys_set:nn { colour_transition_rectangle } {#1}
\clist_set:Nn \l_tmpa_clist {#2}
\int_compare:nNnTF { \clist_count:N \l_tmpa_clist } = {1}
{
% only a color
\path[fill=\clist_item:Nn \l_tmpa_clist {1}]
({\fp_eval:n{-\l__ctr_rect_width_fp/2}}, {\fp_eval:n{-\l__ctr_rect_height_fp/2}})
rectangle
({\fp_eval:n{ \l__ctr_rect_width_fp/2}}, {\fp_eval:n{ \l__ctr_rect_height_fp/2}});
}
{
%Multiple colors -> one unique shading across the entire rectangle
\__ctr_rect_build_shading:V \l_tmpa_clist
\shade[
shading=\tl_use:N \l__ctr_rect_name_tl,
shading~angle=\fp_eval:n { -\l__ctr_rect_angle_fp }
]
({\fp_eval:n{-\l__ctr_rect_width_fp/2}}, {\fp_eval:n{-\l__ctr_rect_height_fp/2}})
rectangle
({\fp_eval:n{ \l__ctr_rect_width_fp/2}}, {\fp_eval:n{ \l__ctr_rect_height_fp/2}});
}
\group_end:
}
\cs_new_protected:Npn \__ctr_rect_build_shading:n #1
{
\tl_clear:N \l__ctr_rect_spec_tl
\int_step_inline:nn { \clist_count:n {#1} }
{
\tl_put_right:Nx \l__ctr_rect_spec_tl
{
color(\fp_eval:n {100*(##1-1)/(\clist_count:n {#1}-1)}bp)=(\clist_item:nn {#1}{##1})
}
% Add ; only between items, not at the end
\int_compare:nNnF {##1} = {\clist_count:n {#1}}
{
\tl_put_right:Nn \l__ctr_rect_spec_tl {;}
}
}
\int_gincr:N \g__ctr_rect_shading_int
\tl_set:Nx \l__ctr_rect_name_tl
{ colourtransitionrect\int_use:N \g__ctr_rect_shading_int }
\use:e
{
\exp_not:N \pgfdeclarehorizontalshading
{ \tl_use:N \l__ctr_rect_name_tl }
{ 100bp }
{ \tl_use:N \l__ctr_rect_spec_tl }
}
}
\cs_generate_variant:Nn \__ctr_rect_build_shading:n { V }
\ExplSyntaxOff
\tikzset {
pics/DT/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac,, every node/.append style={transform shape}]
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,
circle,minimum size=5mm]at(0,0.6)(CX1){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,
circle,minimum size=4mm]at(-0.7,-0.6)(CX2){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,
circle,minimum size=4mm]at(0.7,-0.6)(CX3){};
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CX2)--(CX1)--(CX3);
\end{scope}
}
}
}
\tikzset {
pics/LR/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac,, every node/.append style={transform shape}]
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,
circle,minimum size=3.5mm]at(-0.7,-0.6)(2CX1){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,
circle,minimum size=3.5mm]at(0.5,0.6)(2CX4){};
\draw[draw=\drawcolor,line width=0.7*\Linewidth](2CX1)--(2CX4);
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=white,
circle,minimum size=3.5mm]at(-0.3,-0.2)(2CX2){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=white,
circle,minimum size=3.5mm]at(0.1,0.2)(2CX3){};
\end{scope}
}
}
}
\tikzset {
pics/LRL/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac,, every node/.append style={transform shape}]
\draw[draw=\drawcolor,line width=\Linewidth]
(-0.8,-0.7)to[bend right=35](-0.1,0)to[bend left=35](0.6,0.7);
\end{scope}
}
}
}
\tikzset {
pics/RF/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac,, every node/.append style={transform shape}]
\draw[-{Circle[fill=white,length=6.5pt]},draw=\drawcolor,line width=\Linewidth]
(0,-0.7)to(0,0.7);
\draw[-{Circle[fill=white,length=5.5pt]},draw=\drawcolor,line width=\Linewidth]
(-0.7,-0.7)to(-0.7,0.6);
\draw[-{Circle[fill=white,length=5.5pt]},draw=\drawcolor,line width=\Linewidth]
(0.7,-0.7)to(0.7,0.6);
\end{scope}
}
}
}
\tikzset {
pics/NN/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac,, every node/.append style={transform shape}]
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=5mm]at(1,0)(CD1){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=5mm]at(0,0.4)(CD2){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=5mm]at(0,-0.4)(CD3){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=5mm]at(-1,0.7)(CD4){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=5mm]at(-1,-0.7)(CD5){};
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD5)--(CD3);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD5)--(CD2);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD4)--(CD3);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD4)--(CD2);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD1)--(CD3);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD1)--(CD2);
\end{scope}
}
}
}
\tikzset {
pics/CNN/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac,, every node/.append style={transform shape}]
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(1.3,0)(CD1){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(0.3,0.4)(CD2){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(0.3,-0.4)(CD3){};
%
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(-0.7,0.7)(CD4){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(-0.7,-0.7)(CD6){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(-0.7,0)(CD5){};
%
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(-1.7,0.7)(CD7){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(-1.7,-0.7)(CD9){};
\node[draw=\drawcolor,line width=\Linewidth,inner sep=1pt,fill=\drawcolor!10,
circle,minimum size=4.5mm]at(-1.7,0)(CD8){};
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD7)--(CD4);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD7)--(CD5);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD8)--(CD4);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD8)--(CD6);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD9)--(CD5);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD9)--(CD6);
%
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD4)--(CD3);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD4)--(CD2);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD3)--(CD3);
%
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD6)--(CD3);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD6)--(CD2);
%
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD1)--(CD3);
\draw[draw=\drawcolor,line width=0.7*\Linewidth](CD1)--(CD2);
\end{scope}
}
}
}
\pgfkeys{
/channel/.cd,
Depth/.store in=\Depth,
Height/.store in=\Height,
Width/.store in=\Width,
filllcirclecolor/.store in=\filllcirclecolor,
filllcolor/.store in=\filllcolor,
drawcolor/.store in=\drawcolor,
drawcircle/.store in=\drawcircle,
scalefac/.store in=\scalefac,
Linewidth/.store in=\Linewidth,
picname/.store in=\picname,
filllcolor=BrownLine,
filllcirclecolor=violet!20,
drawcolor=red,
drawcircle=violet,
scalefac=1,
Linewidth=0.5pt,
Depth=0.2,
Height=0.5,
Width=0.25,
picname=C
}
\definecolor{color2}{RGB}{36,140,106}
\definecolor{color4}{RGB}{58,105,158}
\definecolor{color5}{RGB}{110,83,117}
\ColourTransitionRectangle[
width=12,
height=0.2,
angle=0
]{mygreen,mygreen,myblue,myred,myred}
\path[thick] (-60mm,-1.0mm) rectangle (60mm,1.0mm);
\coordinate(POG)at(-60mm,1.0mm);
\coordinate(POD)at(-60mm,-1.0mm);
\coordinate(KRG)at(60mm,1.0mm);
\coordinate(KRD)at(60mm,-1.0mm);
\coordinate(SRG)at(0mm,1.0mm);
\draw[LineA]($(POD)+(0,-4mm)$)coordinate(LE)--($(KRD)+(0,-4mm)$)
coordinate(DE);
\foreach \i [count=\x, evaluate=\i as \t using \i/12] in {1,3,5,7,9,11}{
\coordinate(T\x)at($(LE)!\t!(DE)$);
}
\foreach \i/\col in {1/mygreen,
2/color2,
3/myblue,
4/color4,
5/color5,
6/myred}{
\fill[\col](T\i)circle(3.75pt);
}
\foreach \i [count=\x] in {{决策\\ 树},
{线性\\ 回归},
逻辑\\ 回归,
随机\\ 森林,
神经\\ 网络,
卷积神经网络/\\Transformer}{
\node[align=flush center,font=\sffamily\footnotesize,below=5pt of T\x]{\i};
}
\node[Box,left=of LE](B1){可解释性\\更高};
\node[Box2,right=of DE](B2){可解释性\\更低};
%\foreach \i [evaluate=\i as \t using \i/12] in {1,3,5,7,9,11}
%\fill[red] ($(LE)!\t!(DE)$) circle (2.75pt);
\pic[shift={(0,0)}] at ($(T1)+(0,-16mm)$){DT={scalefac=0.35,picname=1,drawcolor=mygreen, Linewidth=1pt}};
\pic[shift={(0,0)}] at ($(T2)+(0,-16mm)$){LR={scalefac=0.35,picname=1,drawcolor=color2, Linewidth=1pt}};
\pic[shift={(0,0)}] at ($(T3)+(0,-16mm)$){LRL={scalefac=0.35,picname=1,drawcolor=myblue, Linewidth=1.5pt}};
\pic[shift={(0,0)}] at ($(T4)+(0,-16mm)$){RF={scalefac=0.35,picname=1,drawcolor=color4, Linewidth=1.0pt}};
\pic[shift={(0.08,0)}] at ($(T5)+(0,-16mm)$){NN={scalefac=0.35,picname=1,drawcolor=color5, Linewidth=1.0pt}};
\pic[shift={(0.2,0)}] at ($(T6)+(0,-16mm)$){CNN={scalefac=0.35,picname=1,drawcolor=myred, Linewidth=1.0pt}};
%
\draw[mybrown,line width=0.75pt,decoration={brace,amplitude=7pt},decorate]
($(POG)+(0,2mm)$)--($(SRG)+(-2mm,2mm)$)
node [text=black,midway,above=2mm] {内在可解释};
%
\draw[mybrown,line width=0.75pt,decoration={brace,amplitude=7pt},decorate]
($(SRG)+(2mm,2mm)$)--($(KRG)+(0mm,2mm)$)
node [text=black,midway,above=2mm] {需要事后解释};
%
\node[below=21mm of T2,Txt]{直接检查决策逻辑};
\node[below=21mm of T5,Txt]{使用 LIME、SHAP 或注意力图};
\end{tikzpicture}具体选择取决于应用的问责要求。有关不利措施的法律要求为其涵盖的信贷决策提供准确、具体的理由,但并不强制采用特定的模型架构。其他应用可能承担不同的透明度、安全性或可申诉性义务。这一谱系并不意味着“越简单越好”,因为可解释性很高但预测不准确的模型也可能造成损害。工程挑战在于选择能够满足应用预测要求和问责要求的模型及解释流程。
某些可解释性和透明度要求具有法律效力。欧盟《人工智能法案》于 2024 年 8 月 1 日生效,并分阶段适用,对其涵盖的高风险系统规定了文档记录、透明度、人工监督和风险管理义务 (European Parliament and Council of the European Union 2024)。B 条例要求为其涵盖的不利措施提供具体的主要理由,其官方解释指出,披露的理由必须准确描述实际考虑或评分的因素(《美国联邦法规》第 12 编第 1002.9 条;官方解释)。适用的技术机制取决于系统、决策、司法管辖区和法律义务。
监管格局
监管将负责任工程从最佳实践层面的主张转变为架构约束。设想一个信贷模型拒绝了某位申请人的申请,而该申请人询问原因、对决策提出异议,随后又要求访问决策中使用的有关她的数据。系统必须做到的不只是报告一个准确率分数。它必须生成与具体决策相对应的解释,保留产生该输出的模型与数据血缘,将争议转交至实质性人工复核流程,保留审计日志,并在数据权利适用时支持删除或访问工作流。如今,负责任工程在明确的监管框架内开展,这些框架将透明度、监督和问责转化为技术要求。
监管首先通过风险分类进入架构。欧盟《人工智能法案》 建立了一套全面框架,按风险等级对人工智能系统进行分类,并据此规定强制要求。16 该法案于 2024 年 8 月 1 日生效,并分阶段适用:关于禁止行为的规则于 2025 年开始适用,而高风险系统及其他运营主体的义务则根据系统类别和实施指南分阶段适用。第 99 条规定,对被禁止的人工智能实践,最高罚款为 3500 万欧元或全球营业额的 7%;而其他许多运营主体义务所对应的罚款上限为 1500 万欧元或全球营业额的 3% (European Parliament and Council of the European Union 2024)。
对于系统工程师而言,合规的关键在于架构能力,而非罚款标准。受该法案涵盖的高风险系统17 必须落实风险管理、数据治理、技术文档、透明度、人工监督,以及准确性、稳健性和安全性要求。因此,受其涵盖的信贷决策系统从一开始就需要具备可审计性:模型版本、训练数据来源、验证证据、人工监督设计、日志记录和部署后监控都必须成为架构的一部分,而不是上线后才汇编的文档。
可申诉性带来了第二项架构要求。GDPR 将同一申请人的工作流延伸至数据主体权利。第 22 条赋予欧盟数据主体一项权利,即不受完全基于自动化处理且产生法律效果或类似重大影响的决策所约束,但该权利受规定的例外情形及保障措施约束。18 第 15 条第 1 款第 (h) 项另行赋予数据主体获取有关第 22 条所指自动化决策所涉逻辑的有意义信息的权利。工程团队应确定哪些决策属于适用范围,并据此设计所需的解释和人工复核能力。在要求提供实质性复核流程的情况下,该流程必须配备实际执行复核的人员,并提供摘要、来源追溯和审计工具支持。
美国行业性法律通过特定领域的证据要求,提出了类似的能力要求。这些法规不像欧盟《人工智能法案》那样统一,但也可能规定相关的工程义务。在信贷示例中,《平等信贷机会法》(ECOA)及其实施条例 B 条例要求为其涵盖的不利措施提供具体的主要理由,而且这些理由必须准确描述实际考虑或评分的因素(《美国联邦法规》第 12 编第 1002.9 条;官方解释)。如果消费者报告信息或信用评分影响了决策,《公平信用报告法》(FCRA)还会增加告知义务;如果同一套评分机制用于住房领域,《公平住房法》(FHA)还会增加禁止歧视的约束。其技术影响是实际而非抽象的:受相关法规涵盖的系统需要具备相应证据和控制措施,以支持适用的理由说明、告知、复核和非歧视义务。
Checkpoint 1.3: 合乎伦理的部署
部署是各项保障措施必须真正投入运行的环节。
安全保障
监控计划
包括《健康保险可携带性与责任法案》(HIPAA)19 和美国食品药品监督管理局(FDA)指南在内的医疗卫生法规,以不同的交付材料体现了同样的模式:受保护健康信息的控制措施、验证记录、审计日志和事件响应。就业系统同样需要证据,证明自动化筛选不会复制具有歧视性的招聘做法。在各个领域,任务都是将每项义务转化为具体能力:解释、人工复核、血缘追溯、访问控制、删除、监控或事件响应。因此,部署检查点并不是一份美国行业性法规核对清单,而是监管格局所隐含的共同生产运行约定。
应对这些监管要求的工程方法是主动开展架构设计。从一开始就将文档记录、监控、可解释性和人工监督纳入系统的团队,能够高效地证明其合规性。而必须事后补建这些能力的团队,则面临代价高昂的流水线重新设计或部署受阻。然而,监管准备仅覆盖预先规划的路径;即使设计良好的系统也可能在生产环境中发生故障,因此,做好事件响应准备至关重要。
监控与事件响应
Zillow 报告称,2021 年第三季度,其 Homes 业务分部在以高于修订后的未来售价估计值的价格购入房屋后,计提了 $304 百万20 的存货减值 (Zillow Group 2021)。从系统诊断的角度看,这次失败是预测不确定性、分布偏移、运营能力限制以及熔断机制不足共同作用的结果。运营安全要求在模型承接生产流量之前建立事件响应和监控机制,而不是等到资本损失或社会危害累积后才诊断故障。Table 10 将 机器学习系统的事件响应 中的事件严重程度分类调整用于负责任的部署;在这一场景中,检测机制不仅必须发现服务中断,还必须揭示公平性违规和人口群体切片上的性能退化。这五个组成部分遵循标准的事件响应生命周期,但运营保障的关键在于部署前验证这一列。要求列规定了每个组成部分必须完成的任务;验证列则明确了上线前必须证明的事项:通过历史回放测试的告警阈值、在负载下演练过的自动回滚路径,以及具有书面升级处理路径的值班轮值安排。没有经过验证的控制措施支撑的要求只是一种意图,而不是保障,因此,这道验证关卡是部署的前提。
| 组成部分 | 要求 | 部署前验证 |
|---|---|---|
| 检测 | 能够识别异常、性能退化和公平性违规的监控系统 | 已测试告警阈值,已建立值班轮值安排,已记录升级处理路径 |
| 评估 | 评估事件范围和严重程度的程序 | 已定义严重程度分类,已准备影响评估模板 |
| 缓解 | 在调查过程中减少危害的技术能力 | 已测试回滚程序,备用系统可运行,紧急停用开关功能正常 |
| 沟通 | 通知利益相关方的规程 | 联系人列表保持更新,已准备消息模板,已定义审批链 |
| 补救 | 实施永久性修复和系统改进的流程 | 根本原因分析程序,与变更管理的集成 |
在传统软件运维中,监控关注的是非此即彼的服务故障:进程崩溃、内存不足错误、网络超时和 HTTP 5xx 响应。相比之下,机器学习系统会积累表现为静默退化的技术债务 (Sculley et al. 2015)。推理服务可能始终保持亚毫秒级的 p99 延迟,且不出现任何进程异常,却仍在提供基于已损坏的输入模式或未经校准的权重计算出的预测。此外,反馈回路可能强化早期的错误预测,将最初的微小偏移放大为遍及用户群体的级联错误。事件响应规划必须考虑这些机器学习特有的静默失效模式,部署持续遥测,在预测质量恶化之前检测统计漂移和公平性违规。机器学习运维 中的监控基础设施为这一运营规范提供了基础,将传统系统指标扩展到对数据分布、模型行为和下游结果的检查。
负责任的生产监控将五类运营信号整合到一个持续的遥测监测体系中:
性能稳定性跟踪用于检测传统基础设施健康检查难以发现的渐进式预测漂移。服务级告警会因延迟突增或进程崩溃而触发,但随着现实世界分布的变化,预测质量可能在数周内逐步下降,导致决策质量退化,却不抛出运行时异常。
子群体均等性监控随时间评估不同人口群体切片和运营切片中的误差分布。总体准确率指标会掩盖局部退化;跟踪各划分群组的假阴性率和假阳性率,可以在有偏预测累积成系统性危害之前,标记出正在出现的差异。
输入分布监控在模型执行推理之前,评估原始特征流的统计差异。由于真实标签往往需要相当长的时间才能到达,对照训练基线计算差异指标,可以在损坏的输入产生无效预测之前,发现上游协变量偏移、模式损坏和传感器故障。
结果监控在真实结果逐步获得时,对照已记录的预测审查下游决策后果。将贷款偿还或临床干预成功等观测事件与预测概率进行比较,可以验证评分校准是否保持稳定,并识别自动化决策扭曲后续环境状态的反馈回路。
用户反馈渠道收集定性投诉、异议行为和申诉。由于对数百万次查询进行统计汇总本身就会平滑掉低频异常,由用户发起的争议遥测能够揭示自动化指标阈值未能捕获的尾部失效模式和未被度量的危害。
这些维度共同将模型级指标、数据层偏移、现实世界结果和人工报告连接到一个统一的监测体系中。
遥测基础设施只有与严格的运营响应相结合,才能提供保护。自动化仪表板需要明确的审查频率、清晰的值班责任归属和明确的升级处理程序,以确保新出现的异常能够触发纠正性的工程行动,而不是停留在被动观察层面。
不同人口群组之间的公平表现仅涵盖负责任工程的一个维度。运营支出和物理能源消耗构成了同样关键的约束。每次训练运行、每个推理请求和每条监控流水线都会消耗电力,进而产生碳排放和运营支出。一条机器学习流水线可能实现人口群体间的均等性,同时消耗比任务实际所需高出数个数量级的计算资源,造成未受监控的环境足迹并推高运营成本。负责任的工程必须同时管理系统为谁服务,以及在提供服务时消耗了哪些物理资源。
环境与成本意识
2019 年,研究人员估计,一个大型自然语言处理(NLP)模型在开发阶段进行的训练和架构搜索,其碳排放量可能相当于五辆汽车整个生命周期的碳排放量 (Strubell et al. 2019)。后续分析表明,被引用最多的架构搜索估计值对代理任务、硬件、数据中心效率和电网碳强度等假设高度敏感 (Patterson et al. 2021)。这一修正使负责任工程的论点更加明确,而非削弱了它:训练运行会消耗以兆瓦时计的电力,规模化推理会将单次请求中的低效放大为可测量的环境影响,而资源密集型模型则将缺乏大规模计算预算的组织排除在外。因此,模型压缩、硬件加速 和 基准测试 中介绍的优化技术也兼具负责任工程工具的作用,将计算效率与环境可持续性、经济可及性和长期可扩展性联系起来。
将效率视为责任
训练一个大型语言模型需要消耗数千个 GPU 小时,以及以兆瓦时计的能源。然而,其中很大一部分开销并非学习任务本身所固有,而是源于偶然复杂性:本可通过微调满足需求却从头训练,部署超出任务需要的大型架构,以及在超参数搜索中探索冗余配置。计算成本既取决于工程选择,也取决于模型运行所遵循的物理规律。绿色 AI 将效率视为首要指标,而不是事后才考虑的问题。21
在硬件层面,环境影响随机器生命周期内的总电能消耗而变化,并受到加速器利用率、数据中心冷却开销(电能使用效率)以及当地电网碳强度的影响。在加速器封装内部,能量耗散主要由跨内存层次结构的数据移动主导,而非算术运算:从片外高带宽内存(HBM)或 DRAM 传输操作数所消耗的能量,比在本地 SRAM 或寄存器文件中执行一次乘加运算高出数个数量级。只有当算法和运行时优化在生产负载下、针对经过验证的质量目标降低了实测瓦时数,从而在硅芯片层面抑制这种物理耗散时,它们才能减轻环境负担。
物理资源需求也决定了部署的可及性。过度参数化模型需要通过高带宽互连(如 NVLink)连接的多加速器节点来容纳其内存占用,这会将运行控制局限于集中式云设施。通过压缩模型,使其工作集能够容纳于通用 DRAM 或边缘处理器的统一内存中,可以扩大部署范围。这种本地执行消除了对持续高带宽网络连接和经常性云 API 支出的依赖,使得在数据产生的客户端设备上直接进行低延迟、保护隐私的推理成为可能。
在每天处理数百万个请求的生产规模下,单次查询的低效会在整个加速器集群中迅速累积。根据机器学习系统铁律(\(T_{\text{exec}} = D_{\text{vol}} / \text{BW} + O / (R_{\text{peak}} \cdot \eta_{\text{hw}}) + L_{\text{lat}}\)),单次查询的执行延迟决定了单个加速器在不违反服务级延迟目标的前提下所能维持的请求吞吐量。缩短执行时间,可以用规模更小的已配置集群支撑相同的总体流量。关键在于,只有当容量规划缩减了活跃设备集群的规模时,这些运营节省才能转化为能源消耗和基础设施成本的下降。如果集群容量保持不变,延迟改善只会增加加速器的空闲时间,使硬件在未执行有效工作的情况下仍消耗基线静态漏电功率。
优化技术通过针对数据、算法和机器各层中执行与能耗方程的特定项,实现这些目标。量化将数值精度从 16 位浮点表示降低到 INT8 或 FP4,减少通过总线传输的内存流量 \(D_{\text{vol}}\),提高算术强度,并将计算交由开关能耗更低的高吞吐量张量单元执行。剪枝消除不活跃的权重和结构化通道,减少总运算次数 \(O\) 和内存存储占用。知识蒸馏将过度参数化教师模型学到的表征迁移到紧凑的学生架构中,同时减少运算次数和内存占用。在机器层,硬件加速和内核融合消除片外内存往返访问,将中间激活张量保留在片上 SRAM 中,以最大化硬件效率 \(\eta_{\text{hw}}\)。
负责任的工程将这些优化视为训练和部署之前就应确立的架构设计约束,而不是应用于过大模型的事后补救措施。系统要求在规定目标预测质量的同时,也明确规定延迟、内存容量和能源消耗的上限。工程任务就是找到满足这些约束的最紧凑架构和执行策略。
效率工程实践
将效率要求落实到实践,首先要在选择或训练架构之前,确定机器运行的约束范围,包括热设计功耗、电池容量和峰值延迟。负责任的系统工程将硬件限制视为首要的架构设计约束,而不是先部署过大的网络,再依赖事后压缩。模型选择优先考虑满足预测质量要求的最紧凑架构,随后通过量化或算子融合等针对性优化,尽量减少内存流量和能源消耗。
边缘部署场景使这些物理限制成为直接约束:被动散热和电池容量划定了无法通过协商消除的边界。考虑一个示例可穿戴设备,其功率预算为 500 mW,必须依靠一块小型电池持续进行 24 小时的推理。Table 11 比较了四种部署场景中的假设约束,从功率预算为 5 W 的智能手机,到以 100 mW 功率运行的物联网传感器。
| 部署场景 | 功率预算 | 延迟要求 | 典型用例 |
|---|---|---|---|
| 智能手机 | 5 W | 100 ms | 照片增强、语音助手 |
| 物联网传感器 | 100 mW | 1 second | 异常检测、环境监测 |
| 嵌入式摄像头 | 1 W | 30 FPS (33 ms) | 实时目标检测、监控 |
| 可穿戴设备 | 500 mW | 500 ms | 健康监测、活动识别 |
根据这些运行约束范围评估候选架构,可以判断算法是否适合目标机器,同时不超出其散热或延迟限制。Table 12 从参数量、推理运行时功率和延迟三个方面,分析了四个视觉模型,并将其与 table 11 中定义的智能手机和物联网预算进行对照。
| 模型 | 参数量 | 推理功率 | 延迟 | 适用于智能手机? | 适用于物联网设备? |
|---|---|---|---|---|---|
| MobileNetV2 | 3.5M | 1.2 W | 40 ms | Yes | No |
| EfficientNet-B0 | 5.3M | 1.8 W | 65 ms | Yes | No |
| ResNet-50 | 25.6M | 4.5 W | 180 ms | No | No |
| TinyML 模型 | 200K | 50 mW | 200 ms | No | Yes |
对于 table 11 中的可穿戴设备预算,TinyML 模型的功率预算与实际功率之比为 10×,而 MobileNetV2 的功率与同一功率预算之比为 2.4×,且尚未考虑持续运行时的热约束。满足设备约束是必要条件,但一旦大规模部署,单次推理的能耗就会累积为总体排放和运营成本。降低实测单次推理能耗的技术,只有在不将计算成本转移到上游训练或未计量的预处理环节时,才能减少环境影响;而云端和集群的财务成本节约则直接取决于资源配置和硬件利用率。
总拥有成本
一个团队花费 $3,200 训练了一个推荐模型,并为这一较低的成本感到欣喜。六个月后,他们发现,为该模型提供服务每年需要花费 $500,000。这一出乎意料的情况说明,在高流量下,持续发生的推理成本可能主导总拥有成本22。其他系统的成本可能主要来自训练、数据、人员或闲置容量,因此应通过测量确定优化重点。
考虑一个每天服务 10M 用户的推荐系统实例。训练成本看起来相当可观:数据准备消耗 100 GPU-hours,费率约为 $4/hour(费用为 $400);针对多种配置的超参数搜索需要 500 GPU-hours(费用为 $2,000);最终训练运行使用 200 GPU-hours(费用为 $800)。总训练成本约为 $3,200。
在这一场景中,推理成本占主导地位。10M 用户每天各接收 20 条推荐,系统每天执行 200M 次推理。若将每次推理的 10 milliseconds 视为未批处理、无重叠的专用 GPU 服务时间需求,则需要约 23.1 GPUs 持续运行。按 $2.50/GPU-hour 的费率计算,该场景的年度 GPU 成本达到 $506,944。
在三年的运行期内,每季度再训练一次产生的总训练成本约为 $38,400,而同期推理成本总计为 $1.5M。由此得到的 40:1 比值仅适用于这些假设,但它决定了优化投入回报最高的方向:推理延迟和模型服务效率。
当服务请求达到数十亿次时,单次查询优化就变得十分重要。在其他工作负载假设保持不变的情况下,将单次查询的加速器服务时间需求降低五分之一,可以减少所需硬件。CPU、GPU 和张量处理单元之间的硬件选择会改变成本和碳足迹,具体变化取决于工作负载与部署方式。通过量化和剪枝进行模型压缩,如果能够降低实测服务时间需求,且不造成不可接受的质量损失,就可以降低大规模推理的成本。
总拥有成本(TCO)还涵盖计算以外的其他维度。运维成本包括监控、维护、再训练和事件响应,这些成本都会随着系统复杂度和应用领域分布偏移速率的增加而上升。机会成本体现为机器学习系统消耗的资源无法再用于其他用途。一个项目中的资源浪费会限制其他项目能够尝试的工作。
工程师应评估投资回报率(ROI):机器学习系统创造的价值是否足以证明其资源消耗是合理的。一个将用户参与度提高 1% 的推荐系统,可能不足以证明数百万美元的计算成本是合理的,而一个能够挽救生命的医疗诊断系统则足以证明这一点。明确权衡有助于负责任地分配资源。23
TCO 计算方法
量化运行阶段的碳影响,需要实测或估算的能源使用量、设施额外能耗以及适用的电网碳强度。工程师可以采用结构化方法,将训练、推理和运维成本分别记入独立账簿,从而估算三年总拥有成本。训练通常是一项周期性资本支出,推理则随每次用户查询持续产生费用,而运维成本通过遥测、再训练周期和事件响应不断累积。账簿方法将训练、模型服务和运维基础设施的成本核算形式化。
Napkin Math 1.3: 计算的碳成本
变量:
- 功率:每个 GPU 为 400 W(场景基准)。
- 碳强度:0.4 kg/kWh CO2eq(经舍入的电网基准)。
数学关系:Equation 2 给出了标准换算关系: \[ \text{Carbon} = \text{Energy (kWh)} \times \text{Carbon Intensity (kg/kWh)} \tag{2}\] 代入基准假设: \[\begin{gather*} \left(\text{0.4 kW} \times \text{1 hour}\right) \times \text{0.4 kg/kWh} = \text{0.16 kg CO}_2\text{eq per GPU-hour} \end{gather*}\] 系统洞见:这一换算因子使账簿能够在跟踪“货币成本”的同时跟踪“碳成本”,使排放量成为后续各 TCO 表中的一项核心工程指标。
训练成本
训练成本包括初始开发和持续的重新训练。Table 13 对这些成本进行了分解,展示了每季度一次的重新训练如何在三年的运行期内累积成本。
| 成本组成项 | 计算方式 | 财务成本 | 碳排放(kg CO2) |
|---|---|---|---|
| 初始数据准备 | 小时数 \(\times\) 费率 | 100 GPU-hr \(\times\) $4 = $400 | 16 kg |
| 超参数搜索 | 实验次数 \(\times\) 每次实验成本 | 50 \(\times\) $40 = $2,000 | 80 kg |
| 最终训练 | 小时数 \(\times\) 费率 | 200 GPU-hr \(\times\) $4 = $800 | 32 kg |
| 每个训练周期小计 | $3,200 | 128 kg | |
| 重新训练频率 | 每年周期数 \(\times\) 年数 | 4/year \(\times\) 3 years = 12 | 相同的乘数(12 个周期) |
| 训练总成本 | 小计 \(\times\) 周期数 | $38,400 | 1,536 kg |
推理成本
Table 14 展示了将流量转化为成本的换算链:每日查询次数换算为 GPU 秒数,GPU 秒数换算为 GPU 小时数,GPU 小时数再换算为美元成本和碳排放。只有当工作负载以 GPU 小时表示时,才计入碳排放,因此查询次数和 GPU 秒数所在行的碳排放列是有意留空的,并非遗漏数据。沿着换算链到达最后一行,即可得到 table 16 中总成本比较所用的推理成本项;只有将该项与训练和运维成本进行比较,才能判断推理是否占主导地位。
| 成本组成项 | 计算方式 | 财务成本 | 碳排放(kg CO2) |
|---|---|---|---|
| 每日查询次数 | 用户数 \(\times\) 每位用户的查询次数 | 10M \(\times\) 20 = 200M | - |
| 每日 GPU 秒数 | 查询次数 \(\times\) 服务需求时间 | 200M \(\times\) 0.01 s = 2M sec | - |
| 每日 GPU 小时数 | 秒数 ÷ SEC_PER_HOUR | 556 GPU-hr | 88.9 kg |
| 年度 GPU 成本 | 小时数 \(\times\) 365 \(\times\) 费率 | 556 \(\times\) 365 \(\times\) $2.50 = $507K | 32,444.4 kg |
| 三年推理成本 | 年度成本 \(\times\) 3 | $1.52M | 97,333.3 kg |
运维成本
运维成本涵盖基础设施、人员和事件响应。机器学习系统会产生传统软件所没有的运维负担:“事件响应”往往意味着排查静默失效(数据漂移、特征损坏或分布偏移),而非单纯的服务中断;“监控基础设施”必须持续跟踪不同人口群体切片中模型预测的统计异常,而不仅仅是服务可用性。Table 15 逐项列出了这些持续支出,它们往往令主要关注计算成本的团队感到意外。
| 成本组成项 | 年度估算 | 三年总计 |
|---|---|---|
| 监控基础设施 | $50K | $150K |
| 值班工程人员(0.5 FTE) | $100K | $300K |
| 事件响应(估算) | $20K | $60K |
| 运维总成本 | $510K |
table 16 中鲜明的成本构成回答了资金流向何处:推理占 73.5 percent,运维占 24.6 percent,而训练仅占 1.9 percent。
| 类别 | 三年成本 | 占比 | 建模估算的加速器碳排放 |
|---|---|---|---|
| 训练 | $38K | 1.9% | 1.5 t |
| 推理 | $1.52M | 73.5% | 97.3 t |
| 运维 | $510K | 24.6% | 未估算 |
| 总拥有成本 | $2.07M | 100% | ~98.9 t 建模估算小计 |
这些占比使效率从调优偏好转变为一项责任检查。
Checkpoint 1.4: 效率即责任
总拥有成本揭示了负责任的优化在哪些方面最能发挥作用。
环境影响
前一节的 TCO 分析涵盖了账单上列示的成本,但计算资源还会产生成本,而这些成本并不体现在任何账单中。运营排放取决于实测能耗、设施电能使用效率(PUE)以及区域电网碳强度(\(\text{gCO}_2\text{e}/\text{kWh}\));制造环节的隐含环境影响则需要单独核算。运营排放的一阶估算为 \(\text{Energy}_{\text{hardware}} \times \text{PUE} \times \text{Carbon Intensity}\)。运营碳排放衡量模型实际执行期间所消耗电力产生的排放,而隐含碳排放涵盖芯片执行第一个周期之前,硬件供应链各环节——硅晶圆制造、封装、运输和设施建设——所排放的温室气体。随着数据中心电网日益转向可再生能源,隐含碳排放往往占加速器全生命周期碳足迹的一半以上,这意味着,为获得少量运营效率提升而过早更换旧服务器,反而可能增加全生命周期的净排放。单次请求能耗以每次推理的焦耳数衡量,而每 FLOP 的焦耳数则表征硬件执行计算工作的能源效率。如果某项优化改变了利用率、硬件或工作负载的部署位置,那么即使它降低了 TCO,也未必会降低能耗或排放。数据中心的用电使工作负载设计、硬件、云区域和执行时机都成为负责任工程的一部分 (Henderson et al. 2020)。通过对大型基础模型训练进行规模量级计算,可以更清楚地理解其影响程度。
当满足所需工作负载和质量目标的实测全生命周期能耗与排放下降时,效率优化与环境责任便相互一致。更细粒度的碳核算方法建立在这一基础之上:生命周期评价追踪系统整个生命周期的环境影响;范围 1/2/3 排放分别核算直接排放、外购电力产生的排放,以及供应链或使用阶段的排放;碳感知调度则将工作转移至碳强度更低的时段或区域。
决定性能的物理量同样影响责任履行。数据移动和计算都会产生芯片级能耗,而数据中心排放还取决于利用率、设施开销、电网碳强度和隐含环境影响。帕累托分析既适用于准确率与公平性目标,也适用于准确率与延迟目标;但当当前解被其他解支配时,重新调整目标权重可能同时改善多项指标。负责任工程将本书一直讲授的约束优化问题扩展为:在吞吐量和延迟之外,还将社会影响纳入目标。
Napkin Math 1.4: 规模的碳成本
计算:
- 能耗:1,287 MWh = 1,287,000 kWh。
- 碳强度:本情景采用 \(\approx\) 429 g/kWh CO2(0.429 kg/kWh)(Patterson et al. 2021)。
- 总排放量:1,287,000 kWh \(\times\) 0.429 kg/kWh = 552,123 kg CO2(552 t)。
- 比较:本情景假设每辆乘用车每年排放 4.6 t CO2。
系统洞见:在这一训练能耗情景下,运营排放量等于 120 辆乘用车的假定年排放量。在电网电源构成相同的条件下,总训练能耗降低 1%,将使计算所得排放量减少,减排效果约相当于让 1.2 cars 停驶一年。
前面各节提出的检查清单、公平性指标、可解释性机制和效率分析,告诉工程团队应衡量什么以及应如何行动。随之而来的一个自然问题是:什么样的基础设施能够记录这些答案、支持审计,并将违规情况转交至适当的干预环节,而不依赖人的记忆。答案在于数据治理——这是一门将政策意图转化为可强制执行的技术控制措施的工程学科。
数据治理与合规
推荐模型和定向投放模型持续以集群规模摄取用户遥测数据,因此,数据流水线中的治理失效会立即成为机器学习系统摄取与验证基础设施的失效。治理是使问责机制得以落地的执行层:只有当系统能够证明其摄取了哪些数据、哪些主体访问过数据、哪一项法律依据授权了处理,以及适用的删除请求或异议请求是否得到执行时,公平性指标、模型卡和影响评估才具有实际效力。
针对 Meta Ireland 的执法决定使治理约束变得具体:系统既必须为处理活动确立合法依据,也必须保护底层数据。2023 年 1 月,爱尔兰数据保护委员会分别对 Meta Ireland 处以 EUR 210M 和 EUR 180M 的罚款(合计 EUR 390M)。这些决定涉及在个性化广告处理中违法依赖合同必要性作为依据,以及违反透明性和公平性要求,并非针对安全泄露事件 (Data Protection Commission 2023)。
数据工程 中考察的存储架构充当数据治理的执行机制,决定哪些主体可以访问数据、如何追踪查询,以及流水线是否满足法定要求。每一项架构决策——从摄取策略,经由提取、转换、加载(ETL)流水线,到持久化存储布局——都具有治理层面的影响,而这些影响会在监管审计、隐私调查或模型召回时显现。数据治理通过以下机制,将抽象政策转化为具体的系统工程:对训练分区实施经过身份认证的访问控制,利用不可变审计基础设施记录数据集访问,在特征提取过程中执行隐私保护转换,以及通过确定性血缘系统将训练快照追溯关联到已部署的模型检查点。由于这些义务约束的是技术架构,而非组织层面的文书工作,因此它们本身构成了一项工程原则;这项原则适用于本章,有别于本书各部分开篇用于构建全书框架的原则。
Principle: 将合规作为工程约束
推论:处理受监管数据的系统必须将适用义务映射到技术控制措施和组织控制措施。根据司法管辖区、数据、参与主体和用例的不同,访问控制、删除、异议申诉、审计和血缘追踪可能是必需的,也可能是有益的。《通用数据保护条例》(GDPR)、《加利福尼亚州消费者隐私法》(CCPA)、巴西《通用数据保护法》(LGPD,Lei Geral de Proteção de Dados)以及中国《个人信息保护法》(PIPL)在适用范围和义务方面各不相同,因此,没有一份统一的控制措施检查清单能够确保同时符合这些法规。
数据治理在四个功能领域中,将安全、隐私、合规和血缘落实为相互依赖的工程约束。
安全基础设施通过双向身份认证、基于角色的授权、静态与传输中加密,以及贯穿摄取生命周期的、以硬件为信任根的密钥管理,保护原始特征、训练分区和模型产物。
隐私机制即使在经过身份认证的数据使用者之间,也会管控信息暴露。差分隐私、k-匿名性和自动化特征脱敏等技术在保护单条记录所涉及个人的同时,为下游模型训练保留统计信号。
合规框架将特定司法管辖区的法规(如 GDPR、CCPA 和 LGPD)转化为硬性架构约束,用于管控流水线的数据保留期限、同意验证和跨境数据复制。
血缘与审计系统构建基于密码学的追踪记录,使整个数据生命周期均可检查。如果缺少确定性血缘,无法从已部署权重经训练快照追溯至原始摄取日志,那么安全声明和监管合规主张就仍然无法验证。
机器学习系统 中作为微型约束灯塔案例引入的 KWS 系统,说明了 table 5 中识别出的公平性风险如何在治理层面加剧。已部署的语音助手在私人空间中持续采集环境声学帧,维护已注册的说话人档案,并定期与使用广泛人群音频语料库进行训练的云端流水线同步。这些运行能力带来了涵盖同意管理、数据最小化、访问审计和删除权的治理义务。
在 KWS 架构中,这四个领域直接映射到硬件和流水线中的执行点。安全机制保护跨越边缘到云端边界的数据:边缘微控制器上的硬件密钥库保护已存储的说话人模板,双向 TLS 对传输中的遥测数据进行身份认证,基于角色的访问控制则管控对云存储中集中式训练音频的访问。隐私机制管控内存缓冲区和遥测数据:在设备端关键词触发检测之前,环形 SRAM 缓冲区持续覆盖环境音频,确保未触发检测的语音绝不写入持久化闪存,也不经网络外传;同时,差分隐私限制整个设备群声学模型再训练过程中的信息泄露。合规机制使法律义务的履行自动化:当用户撤回同意或行使删除权时,自动化删除流水线会清除所有云端层级和冷备份中的用户语音档案及声学训练分区。血缘与审计机制建立基于密码学的来源追溯关系:内容哈希和签名清单将每个已部署的深度可分离卷积神经网络(DS-CNN)二进制文件,经由特定训练集划分和声学数据增强种子,关联回原始录音。
Figure 5 展示了支持这些领域的更广泛运行模型,将组织政策、数据目录、数据来源规程、质量指标和共享模式定义与技术控制措施协调起来。技术机制与组织流程必须作为相互强化的子系统共同运作:缺少与身份映射的访问控制时,加密存储仍易遭受未授权数据外传;缺少可验证审计轨迹时,即使存储本身合规,也无法经受监管检查。在数据—算法—机器分类体系中,数据治理构成了数据轴的运行控制平面,确保供给算法并在机器上处理的数据具有合法来源、受控的隐私边界以及全生命周期的完整性。
\resizebox{.85\textwidth}{!}{
\begin{tikzpicture}[line join=round,font=\sffamily]
%Gear style
% #1 number of teeths
% #2 radius intern
% #3 radius extern
% #4 angle from start to end of the first arc
% #5 angle to decale the second arc from the first
% #6 inner radius to cut off
\tikzset{
pics/gear/.style args={#1/#2/#3/#4/#5/#6/#7}{
code={
\pgfkeys{/channel/.cd, #7}
\begin{scope}[shift={($(0,0)+(0,0)$)},scale=\scalefac,every node/.append style={transform shape}]
\pgfmathtruncatemacro{\N}{#1}%
\def\rin{#2}\def\rout{#3}\def\aA{#4}\def\aOff{#5}\def\rcut{#6}%
\path[rounded corners=1.5pt,draw=\drawcolor,fill=\filllcolor]
(0:\rin)
\foreach \i [evaluate=\i as \n using (\i-1)*360/\N] in {1,...,\N}{%
arc (\n:\n+\aA:\rin)
-- (\n+\aA+\aOff:\rout)
arc (\n+\aA+\aOff:\n+360/\N-\aOff:\rout)
-- (\n+360/\N:\rin)
} -- cycle;
\draw[draw=none,fill=white](0,0) circle[radius=\rcut];
\end{scope}
}}
}
%Data style
\tikzset{mycylinder/.style={cylinder, shape border rotate=90, aspect=1.3, draw, fill=white,
minimum width=25mm,minimum height=11mm,line width=\Linewidth,node distance=-0.15},
pics/data/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=STREAMING,scale=\scalefac, every node/.append style={transform shape}]
\node[mycylinder,fill=\filllcolor!50] (A) {};
\node[mycylinder, above=of A,fill=\filllcolor!30] (B) {};
\node[mycylinder, above=of B,fill=\filllcolor!10] (C) {};
\end{scope}
}
}
}
%cloud style
\tikzset {
pics/cloud/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=CLO,scale=\scalefac, every node/.append style={transform shape}]
\draw[draw=\drawcolor,line width=\Linewidth](0,0)to[out=170,in=180,distance=11](0.1,0.61)
to[out=90,in=105,distance=17](1.07,0.71)
to[out=20,in=75,distance=7](1.48,0.36)
to[out=350,in=0,distance=7](1.48,0)--(0,0);
\draw[draw=\drawcolor,line width=\Linewidth](0.27,0.71)to[bend left=25](0.49,0.96);
\draw[draw=\drawcolor,line width=\Linewidth](0.67,1.21)to[out=55,in=90,distance=13](1.5,0.96)
to[out=360,in=30,distance=9](1.68,0.42);
\end{scope}
}
}
}
%person style
\tikzset {
pics/person/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=PER,scale=\scalefac, every node/.append style={transform shape}]
\coordinate (head-center) at (0,0);
\coordinate (top) at ([yshift=-2mm]head-center);
\coordinate (left) at ([yshift=-10mm,xshift=-7mm]head-center);
\coordinate (right) at ([yshift=-10mm,xshift=7mm]head-center);
\draw[rounded corners=1.5mm,line width=\Linewidth,fill=\filllcolor]
(top) to [out=-10,in=100]
(right) to [bend left=15]
(left) to [out=80,in=190]
(top);
\draw[fill=\filllcirclecolor,line width=\Linewidth] (head-center) circle (0.35);
\end{scope}
}
}
}
%padlock
\tikzset{
pics/lokot/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[shift={($(0,0)+(0,0)$)},scale=\scalefac,every node/.append style={transform shape}]
\fill[fill=\filllcolor](0,0)--(2.7,0)--++(270:1.6)to[out=270,in=0](1.85,-2.45)--++(180:1.1)to[out=180,in=270](0,-1.3)--cycle;
\fill[fill=white](1.32,-0.9)+(230:0.3)arc[start angle=230, end angle=-50, radius=0.3]--++(280:0.75)--++(180:0.62)--cycle;
\path[](0.27,0)circle(1pt)coordinate(K1);
\path[](0.57,0)circle(1pt)coordinate(K2);
\path[](2.10,0)circle(1pt)coordinate(K3);
\path[](2.4,0)circle(1pt)coordinate(K4);
\path[](K1)--++(90:0.6)coordinate(KK1);
\path[](K2)--++(90:0.5)coordinate(KK2);
\path[](K4)--++(90:0.6)coordinate(KK4);
\path[](K3)--++(90:0.5)coordinate(KK3);
\fill[fill=\filllcolor](K1)--(KK1)to[out=90,in=90,distance=37](KK4)--(K4)--(K3)--(KK3)to[out=90,in=90,distance=29](KK2)--(K2)--cycle;
\end{scope}
}
}
}
%testing
\tikzset{
pics/testing/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=TESTING1,shift={($(0,0)+(0,0)$)},scale=\scalefac,every node/.append style={transform shape}]
\newcommand{\tikzxmark}{%
\tikz[scale=0.18] {
\draw[line width=0.7,line cap=round,GreenLine] (0,0) to [bend left=6] (1,1);
\draw[line width=0.7,line cap=round,GreenLine] (0.2,0.95) to [bend right=3] (0.8,0.05);
}}
\newcommand{\tikzxcheck}{%
\tikz[scale=0.16] {
\draw[line width=0.7,line cap=round,GreenLine] (0.5,0.75)--(0.85,-0.1) to [bend left=16] (1.5,1.55);
}}
\node[draw, minimum width =15mm, minimum height = 20mm, inner sep = 0pt,
rounded corners,draw = \drawcolor, fill=\filllcolor!10, line width=\Linewidth](COM){};
\node[draw=GreenLine,inner sep=4pt,fill=white](CB1) at ($(COM.north west)!0.25!(COM.south west)+(0.3,0)$){};
\node[xshift=0pt]at(CB1){\tikzxcheck};
\node[draw=GreenLine,inner sep=4pt,fill=white](CB2) at ($(COM.north west)!0.5!(COM.south west)+(0.3,0)$){};
\node[xshift=0pt]at(CB2){\tikzxmark};
\node[draw=GreenLine,inner sep=4pt,fill=white](CB3) at ($(COM.north west)!0.75!(COM.south west)+(0.3,0)$){};
\node[xshift=0pt]at(CB3){\tikzxmark};
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB1)+(0.3,0.05)$)--++(0:0.8);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB1)+(0.3,-0.12)$)--++(0:0.7);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB2)+(0.3,0.05)$)--++(0:0.8);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB2)+(0.3,-0.12)$)--++(0:0.6);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB3)+(0.3,0.05)$)--++(0:0.8);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB3)+(0.3,-0.12)$)--++(0:0.6);
\end{scope}
}
}
}
%quality
\tikzset{
pics/quality/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=QUALITY1,shift={($(0,0)+(0,0)$)},scale=\scalefac,every node/.append style={transform shape}]
\node[draw=\drawcolor, minimum width =20mm, minimum height = 12mm, inner sep = 0pt,
rounded corners,fill=\filllcolor, line width=2.0pt](COM){};
\draw[draw = \drawcolor,line width=1.0pt]
($(COM.north west)!0.85!(COM.south west)$)-- ($(COM.north east)!0.85!(COM.south east)$);
\node[GreenLine](CB1) at ($(COM.north west)!0.25!(COM.south west)+(0.3,0)$){
\mbox{\ooalign{$\checkmark$\cr\hidewidth$\square$\hidewidth\cr}}};
\node[GreenLine](CB2) at ($(COM.north west)!0.6!(COM.south west)+(0.3,0)$){
\makebox[0pt][l]{$\square$}\raisebox{.15ex}{\hspace{0.1em}$\checkmark$}};
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB1)+(0.3,0.05)$)--++(0:1.3);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB1)+(0.3,-0.12)$)--++(0:1.0);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB2)+(0.3,0.05)$)--++(0:1.3);
\draw[GreenLine,decoration={zigzag,segment length=4pt, amplitude=0.5pt},decorate]($(CB2)+(0.3,-0.12)$)--++(0:1.0);
\end{scope}
}
}
}
%graph
\tikzset{pics/graph/.style = {
code = {
\pgfkeys{/channel/.cd, #1}
\begin{scope}[local bounding box=GRAPH,scale=\scalefac, every node/.append style={transform shape}]
\draw[line width=2*\Linewidth,draw = \drawcolor](-0.20,0)--(2,0);
\draw[line width=2*\Linewidth,draw = \drawcolor](-0.20,0)--(-0.20,2);
\foreach \i/\vi in {0/10,0.5/17,1/9,1.5/5}{
\node[draw, minimum width =4mm, minimum height = \vi mm, inner sep = 0pt,
draw = \drawcolor, fill=\filllcolor!20, line width=\Linewidth,anchor=south west](COM)at(\i,0.2){};
}
\end{scope}
}
}
}
\pgfkeys{
/channel/.cd,
Depth/.store in=\Depth,
Height/.store in=\Height,
Width/.store in=\Width,
filllcirclecolor/.store in=\filllcirclecolor,
filllcolor/.store in=\filllcolor,
drawcolor/.store in=\drawcolor,
drawcircle/.store in=\drawcircle,
scalefac/.store in=\scalefac,
Linewidth/.store in=\Linewidth,
picname/.store in=\picname,
filllcolor=BrownLine,
filllcirclecolor=violet!20,
drawcolor=black,
drawcircle=violet,
scalefac=1,
Linewidth=0.5pt,
Depth=1.3,
Height=0.8,
Width=1.1,
picname=C
}
% Styles for planets, satellites, and arrows
\tikzset{%
planet/.style = {circle, draw=none,semithick, fill=blue!30,fill=cyan!80!black!30,text width=27mm, inner sep=1mm,align=center},
satellite/.style = {circle, draw=none, semithick, fill=#1!20,text width=18mm, inner sep=1pt, align=flush center,minimum size=21mm},
arr/.style = {-{Triangle[length=3mm,width=6mm]}, color=#1,line width=3mm, shorten <=1mm, shorten >=1mm}
}
% Outer circle and central planet
\node[draw=BackLine!50,line width=5pt,circle,minimum size=216.8]{};
\node (p) [planet] {\bfseries 数据\\ 治理 };
% Satellites around the planet
\foreach \i [count=\k] in {red,cyan, purple, green!80!black!70!, orange, yellow,brown!80!,violet}
{
\node (s\k) [satellite=\i] at (\k*45:3.6) {};
}
% Arcs around satellites
\def\ra{24mm}
\foreach \i [count=\k] in{-45,0,45,90,135,180,225,270}{
\pgfmathtruncatemacro{\newX}{\i + 180}
\draw[BrownLine, line width=0.75pt,{Circle[BrownLine,length=4pt]}-{Circle[BrownLine,length=4pt]}]
(s\k)+(\i:0.5*\ra) arc[start angle=\i, end angle=\newX, radius=0.5*\ra];
}
%Gears decoration
\pic[shift={(0.33,0.23)}] at (s4) {gear={10/1.45/1.9/10/2/0.7/scalefac=0.22,drawcolor=RedLine,filllcolor=RedLine}};
\pic[shift={(-0.4,-0.2)}] at (s4) {gear={10/1.45/1.9/8/2/0.75/scalefac=0.25,drawcolor=RedLine,filllcolor=RedLine}};
% Persons icons
\pic[shift={(0.1,0.45)}] at (s2) {person={scalefac=0.7,drawcolor=RedLine,filllcolor=Green!70,Linewidth=1pt,filllcirclecolor=yellow}};
\pic[shift={(-0.1,0.3)}] at (s2) {person={scalefac=0.7,drawcolor=RedLine,filllcolor=Green!70,Linewidth=1pt,filllcirclecolor=yellow}};
% Padlock icon
\pic[shift={(-0.5,0.15)}] at (s3){lokot={scalefac=0.35,picname=1,drawcolor=violet!,filllcolor=violet,Linewidth=0.7pt}};
% Cloud icon
\pic[shift={(-0.6,-0.49)}] at (s6) {cloud={scalefac=0.75,drawcolor=red,filllcolor=red,Linewidth=1.75pt}};
% Data quality block
\pic[shift={(0,-0.0)}] at (s5) {quality={scalefac=0.70,drawcolor=BlueLine,filllcolor=cyan!10,Linewidth=1.75pt}};
% Data element placement
\pic[shift={(0.03,-0.43)}] at (s8){data={scalefac=0.4,picname=1,drawcolor=BlueLine, filllcolor=BlueLine,Linewidth=0.7pt}};
% Policies block with checkmarks
\pic[shift={(0.04,0.0)}] at (s1){testing={scalefac=0.7,picname=1,drawcolor= BrownLine,filllcolor=BrownL!80!, Linewidth=0.75pt}};
% Bar chart icon
\pic[shift={(-0.35,-0.51)}] at (s7){graph={scalefac=0.5,picname=1,drawcolor=RedLine, filllcolor=RedL!40!,Linewidth=1.0pt}};
% Labels for satellites
\node[above=5pt of s2]{组织};
\node[left=5pt of s3]{数据安全};
\node[left=5pt of s4]{数据运维};
\node[left=5pt of s5,align=center]{数据质量 \&\\ 主数据};
\node[below=5pt of s6]{数据获取};
\node[right=5pt of s7,align=center]{数据 \& \\ 分析定义};
\node[right=5pt of s8]{数据目录};
\node[right=5pt of s1]{政策};
\end{tikzpicture}
}安全与访问控制架构
设想一位数据科学家正在查询特征存储,以获取训练数据。她可以读取聚合后的语音特征,但无法访问生成这些特征的原始录音。服务流水线可以读取在线特征以执行推理,却无法写入训练数据集。两者都不能修改源数据。这种隔离是有意设计的:它体现了一种分层安全架构,将治理要求转化为流水线各阶段可强制执行的技术控制措施。特征存储通过将组织政策映射到经过身份验证的身份和数据库权限,实施基于角色的访问控制(RBAC)。这些控制措施覆盖不同的存储层:对象存储实施存储桶级访问策略,数据仓库对敏感字段实施列级安全控制和动态脱敏,特征存储则维护彼此隔离的读写路径,将低延迟在线推理的键值查询与高吞吐量离线批量训练的数据提取分离。
如果没有加密,访问控制机制仍不完整。加密能够保护静态数据和传输中的数据,但无法防止解密后或经授权访问后的滥用。存储在数据湖中的训练语料库依赖服务端信封加密,其密钥通过专用密钥管理服务(如 AWS KMS 或 Google Cloud KMS)进行管理。特征存储对静态表实施对称加密(如 AES-256),并使用 TLS 1.3 保护跨服务传输。Lighthouse KWS 边缘设备结合使用传输加密与非对称代码签名,前者保障载荷的机密性,后者验证模型更新的完整性;这两种控制措施都需要安全的密钥管理和更新授权。为保护训练与推理过程中正在使用的数据,系统通过基于硬件的安全隔离区(可信执行环境,如 AMD SEV-SNP、Intel TDX 或机密 GPU)实现机密计算。主机 CPU 安全隔离区通过隔离和加密系统 DRAM 页,防范不可信的虚拟机监控程序,而多加速器系统还必须保护物理互连。机密加速器架构利用 PCIe IDE(完整性与数据加密)将硬件信任根扩展至 PCIe 总线,并使用片上密码引擎加密 HBM。明文权重、激活值和敏感用户输入始终被限制在处理器芯片内部,确保具有特权的主机操作系统、虚拟机监控程序和云运营商均无法查看或篡改执行内存。
序列化权重、ONNX(开放神经网络交换)导出文件和检查点需要获得与训练数据相同的保护。模型权重属于专有知识产权,并在数据—算法—机器(D·A·M)各层暴露出关键的攻击面。在机器层,反序列化未经验证的检查点文件(如 Python pickle 归档)会在训练节点和推理工作节点上引入任意代码执行漏洞。生产流水线通过使用受限序列化格式(如 Safetensors)、具有写保护的晋级关卡,以及密码学签名(如 Ed25519)来消除这一漏洞;这些签名会在服务基础设施将参数加载到加速器内存之前验证制品完整性。在数据层和算法层,流水线必须在整个生命周期中防御对抗性威胁。在数据投毒攻击中,攻击者将精心构造的对抗样本插入训练语料库,使模型在推理时产生定向的异常行为或触发后门。如果攻击者能够访问预测 API 或原始权重,成员推断会探查训练集中是否包含特定患者或用户的记录 (Shokri et al. 2017),而模型提取攻击则通过系统性的查询探测窃取模型功能 (Tramèr et al. 2016)。在推理时,逃逸攻击针对输入特征构造受 \(\ell_p\) 范数球(\(\|\delta\|_p \le \epsilon\))约束、对模型构成最坏情况且人类无法察觉的扰动(\(\delta\)),在不改变权重或训练数据的情况下触发高置信度误分类。要保护服务基础设施免受逃逸攻击,需要在训练期间采用鲁棒优化,例如在每一步通过输入梯度计算最坏情况扰动的对抗训练,这会大幅提高反向传播的算术强度和浮点运算量需求;也可以采用输入净化和随机平滑等运行时防御措施。
访问控制和密码学安全隔离区规定了谁能够访问数据,以及数据在存储、传输和执行过程中如何受到保护。控制访问只解决了一半问题:如果数据本身未得到充分保护,即使是获得授权的用户,也可能损害个人隐私。
隐私保护技术方法
当聚合统计信息足以满足需求时,即使数据科学家拥有合法的训练数据访问权限,也不需要且不应看到单个用户的记录。隐私保护技术24通过确定系统即使向授权用户也可以披露哪些信息,弥补了这一缺口,在访问控制之外增加了第二层保护。差分隐私为任意单条记录对导出结果的输出分布所能产生的最大影响提供了形式化的数学界限。在机器学习系统中,差分隐私通过差分隐私随机梯度下降(DP-SGD)在训练期间实施。标准反向传播在经过优化的矩阵乘法内核中,对大小为 \(B\) 的整个批次进行梯度聚合,从不显式生成逐样本导数。DP-SGD 打破了这一执行模型:系统必须在求和之前,将每个样本梯度的 \(\ell_2\) 范数裁剪至阈值 \(C\),以限制每条记录的敏感度,随后注入从高斯分布 \(\mathcal{N}(0, \sigma^2 C^2 \mathbf{I})\) 中采样的、经校准的噪声。在硬件加速器上,逐样本裁剪使标准的批次级张量缩并无法使用。通过微批次逐个计算样本梯度会大幅降低算术强度,并使内核启动队列饱和;而在整个批次上向量化计算逐样本梯度,则会使中间激活值和梯度的内存占用扩大至 \(B\) 倍,迅速耗尽加速器 HBM。此外,每个小批次步骤都会泄露可度量的信息量,因此需要隐私核算器跟踪组合训练步骤中的累计 epsilon 预算,并在隐私预算耗尽之前停止优化。
成员推断攻击等经验验证方法可以通过测量外部观察者能否判断训练集中是否包含某条特定记录,来补充这些形式化检查;但经验性攻击无法从数学上证明某个 \((\epsilon, \delta)\) 界限成立。25 成员推断必须与模型反演攻击区分开来。在模型反演攻击中,攻击者利用模型输出的连续置信度,直接重建训练对象的底层私有特征值或面部形象 (Fredrikson et al. 2015)。成员推断回答的是一个关于是否存在的二元问题(“此人是否出现在训练集中?”),而反演则利用输出概率分布合成敏感数据本身。防御反演攻击需要在预测服务 API 中屏蔽或量化连续置信度分数,将输出分布截断为前 \(k\) 个类别,并在训练期间通过差分隐私限制参数对训练数据的记忆。
虽然差分隐私能够限制模型输出的信息泄露,但在采集连续原始传感器数据流时,只要原始数据离开采集设备,就会立即产生安全隐患。持续监听的边缘架构(如灯塔示例中的 KWS 系统)受到严格的隐私约束,因为麦克风对环境声音的连续采样必须同时满足严格的数据最小化要求和保留边界。为消除传输暴露风险,系统将声学特征提取和唤醒词验证完全限制在本地低功耗微控制器或数字信号处理器(DSP)上。输入音频样本流经片上 SRAM 中的一个小型易失性循环缓冲区,较早的帧会不断被新采样的脉冲编码调制(PCM)数据覆盖。除非设备端声学模型确认检测到了明确的触发关键词,否则原始音频绝不会离开本地易失性内存,也不会持久化到非易失性闪存中。
将原始音频限制在本地边缘内存中能够落实数据最小化原则,但也使集中式训练流水线无法收集多样化的声学变化,以持续提高模型准确率。联邦学习通过直接在客户端设备上执行模型训练、聚合模型权重更新而非汇集原始用户音频,化解了这一矛盾。26 在每轮训练中,选定的边缘设备针对新触发的语音片段计算本地梯度,并将参数增量传输至中央协调器。这一架构转变以严重的物理系统瓶颈为代价,换取了数据集中化风险的降低。当每轮需要通过蜂窝网络或 Wi-Fi 信道传输数百万个参数时,无线上行带宽会严重限制通信吞吐量。电池供电的客户端设备经常因热限制或连接不稳定而在一轮训练中途离线,成为掉队节点;用户设备之间非独立同分布(non-IID)的数据分布还会导致本地梯度偏离,威胁模型收敛。此外,原始梯度更新仍易遭受梯度反演和重建攻击 (Zhu et al. 2019),因此生产环境中的联邦学习流水线需要将梯度压缩与稀疏化、安全多方聚合以及本地差分隐私噪声注入结合使用。
当触发式音频录音或聚合后的模型检查点必须保留在集中式基础设施上,以供验证或下游训练时,隐私保护的重点就转向自动化生命周期管理。自动化保留与密码学擦除流水线在主 Blob 存储、特征缓存和分布式训练分区中执行严格的生存时间策略。可验证的密码学擦除协议确保数据达到保留期限时,销毁加密密钥并覆写存储块,防止已删除的音频流残留在数据库副本或冷备份快照中。
面向监管合规的架构设计
当欧洲用户依据 GDPR 行使适用的删除权时,语音助手必须确定哪些个人数据和下游产物属于请求范围,并在法规规定的响应期限内执行相应工作流 (European Parliament and Council of the European Union 2016)。合规要求将法律义务转化为系统架构约束,影响流水线设计、存储选择和操作规程。GDPR 的数据最小化原则要求将收集和保留的数据限制在实现所述目的所必需的范围内。第 15 条规定的访问权涵盖正在处理的个人数据及有关该处理的特定信息,而非所有仅仅与用户相关联的产物。
在全球运营的语音助手面临相互交叠的监管制度,因为要求因司法管辖区而异,且根据用户年龄和数据敏感程度的不同而有不同的适用方式。GDPR 跨境传输规则允许通过充分性认定、适当保障措施或有限的例外条款进行传输,而非一概要求数据本地化。这些规则仍可能推动区域化存储、复制和处理方面的选择。数据卡 (Pushkarna et al. 2022) 将来源、预期用途和风险记录为操作元数据,如 figure 6 所示,但一份有效的数据卡本身并不能使数据集或模型符合合规要求。
\begin{tikzpicture}[font=\footnotesize\sffamily,line width=0.75pt]
\newcommand\Warning[1][1.4]{%
\makebox[#1em][c]{%
\makebox[0pt][c]{\raisebox{.3em}{\fontsize{7pt}{7}\selectfont\bfseries !}}%
\makebox[0pt][c]{\color{red}\LARGE$\bigtriangleup$}}}%
\colorlet{BlueD}{blue!50!black}
\newcommand\barrow{%
\begin{tikzpicture}
\begin{scope}[local bounding box=BARROW,scale=0.6, every node/.append style={transform shape}]
\node[fill=white,draw=BlueD,line width=0.75pt,rectangle,minimum width=4mm,
minimum height=4mm,inner sep=0pt](RS1){};
\draw[shorten >=1pt,shorten <=-1.5pt,draw=BlueD,line width=0.75pt,
-{Latex[length=2pt, width=3pt]}](RS1.center)--(RS1.north east);
\end{scope}
\end{tikzpicture}
}
\tikzset{%
Text/.style={align=flush left},
TextB1/.style={align=flush left,font=\fontsize{11pt}{13}\selectfont\sffamily\bfseries},
TextB2/.style={align=flush left,font=\fontsize{10pt}{11}\selectfont\sffamily\bfseries},
TextB3/.style={align=flush left,font=\fontsize{9pt}{10}\selectfont\sffamily\bfseries},
TextBLUE/.style={BlueD},
TextF/.style={align=flush left,font=\fontsize{6.5pt}{8}\selectfont\sffamily},
Box/.style={%
draw=BrownLine,
line width=0.75pt,
rounded corners=3pt,
fill=BrownL!40,
minimum height=5mm
},
}
\node[TextB1](N11){Open Images Extended - 更具\\包容性的人物标注(MIAP)};
\node[TextBLUE,below=1mm of N11.south west,anchor=north west](N12){
数据集下载~\barrow • 相关出版物~\barrow};
\node[TextF,text width=92mm,right=14mm of N12.south east,anchor=south west](N13){本数据集旨在用于
人物检测中的公平性研究和公平性评估。
本数据集包含从 Open Images V6 中抽取的 100,000 张图像,
并添加了额外标注。标注包括
每个可见人物的边界框在图像中的坐标。每个边界框均标注了
感知到的性别呈现和
年龄范围呈现属性。它可与 Open Images V6 联合使用。};
%
\scoped[on background layer]
\node[draw=none,fit=(N11)(N13)](BB1){};
%%%%%%%2
\node[TextB2,below=8mm of N11.south west,anchor=north west](N21){作者信息};
\node[TextBLUE,below=0mm of N21.south west,anchor=north west](N22){发布方};
\node[TextB3,below=0mm of N22.south west,anchor=north west](N23){Google LLC};
\node[TextBLUE,right=16mm of N22.east,anchor=west](N24){行业类型};
\node[TextF,below=0mm of N24.south west,anchor=north west](N25){企业 - 科技};
\node[TextBLUE,right=32mm of N24.east,anchor=west](N26){数据集作者};
\node[TextF,below=0mm of N26.south west,anchor=north west](N27){Candice Schumann,Google,2021 \\
Susanna Ricco,Google,2021 \\ Utsav Prabhu,Google,2021 \\ Vittorio Ferrari,Google,2021\\
Caroline Pantofaru,Google,2021};
%
\node[TextBLUE,below=15mm of N22.south west,anchor=north west](N28){发布方};
\node[TextB3,below=0mm of N28.south west,anchor=north west](N29){Google LLC};
\path[red](N28)-|coordinate(S21)(N25.south west);
\node[TextBLUE,anchor=west](N24)at(S21){资金来源类型};
\node[TextF,below=0mm of N24.south west,anchor=north west](N210){私人资助};
\path[red](N28)-|coordinate(S22)(N26);
\node[TextBLUE](N211)at(S22){数据集联系人};
\node[TextF,Box,text=BlueD,below=0mm of N211.south west,anchor=north west,
xshift=1.5mm](N212){[email protected]};
%
%%%% 3
\node[TextB2,below=34mm of N21.south west,anchor=north west](N31){动机};
\node[TextBLUE,below=0mm of N31.south west,anchor=north west](N32){数据集目的};
\node[TextB3,below=0mm of N32.south west,anchor=north west](N33){研究用途\\[1ex]
机器学习};
\node[TextF,below=0mm of N33.south west,anchor=north west](N33a){训练、测试和验证};
\path[red](N32)-|coordinate(S30)(N24.south west);
\node[TextBLUE,anchor=west](N34)at(S30){主要应用};
\node[TextF,Box,below=0mm of N34.south west,anchor=north west,xshift=1.5mm](N3212){机器学习};
\node[TextF,Box,right=2mm of N3212.east,anchor=west,xshift=1.5mm](N3213){目标识别};
\node[TextF,Box,below=8mm of N34.south west,anchor=north west,xshift=1.5mm](N3212){机器学习公平性};
%
\path[red](N32)-|coordinate(S300)(N211.south west);
\node[TextBLUE,anchor=west](N36)at(S300){问题领域};
\node[TextF,below=0mm of N36.south west,anchor=north west](N37){本数据集旨在用于人物检测相关的公平性研究
和\\公平性评估。};
\node[TextBLUE,below=0mm of N37.south west,anchor=north west](N35){
参见配套文章~\barrow};
%
\node[TextBLUE,below=17mm of N32.south west,anchor=north west](N38){};
\node[TextB3,below=0mm of N38.south west,anchor=north west](N39){};
\path[red](N38)-|coordinate(S31)(N34.south west);
\node[TextBLUE,anchor=west](N39)at(S31){主要动机};
\node[TextF,below=-1mm of N39.south west,anchor=north west,text width=50mm, align=flush left](N310){%
\leftmargini=9pt\vspace*{-4mm}
\begin{itemize} \itemsep=-3pt
\item 为人物边界框提供更完整的真实标注。
\item 为更广泛的公平性研究群体提供标准公平性评估集。
\end{itemize}};
%
\path[red](N38)-|coordinate(S32)(N35.south west);
\node[TextBLUE,anchor=west](N34)at(S32){预期和/或适宜的用例};
\node[TextF,below=-1mm of N34.south west,anchor=north west,text width=75mm, align=flush left](N310){%
\leftmargini=9pt\vspace*{-4mm}
\begin{itemize} \itemsep=-3pt
\item \textbf{机器学习模型评估用途:}人物检测、公平性评估
\item \textbf{机器学习模型训练用途:}人物检测、目标检测
\end{itemize}\vspace*{-2mm}
此外:\\\vspace*{-2mm}
\leftmargini=9pt
\begin{itemize}\itemsep=-3pt\vspace*{-1mm}
\item \textbf{人物检测:}不指定性别或年龄呈现\\
\item \textbf{公平性评估:}针对性别和年龄呈现\\
\item \textbf{公平性研究:}不构建性别呈现或年龄分类器
\end{itemize}
};
\path[red](N38)-|coordinate(S32)(N36);
%%%%%%%%%%4
\node[TextB2,below=52mm of N31.south west,anchor=north west](N41){数据集使用};
\node[TextBLUE,below=0mm of N41.south west,anchor=north west](N42){使用安全性};
\node[TextB3,below=0mm of N42.south west,anchor=north west](N43){有条件使用};
\node[TextF,below=0mm of N43.south west,anchor=north west](N431){存在一些已知的\\不安全应用。};
%
\path[red](N42)-|coordinate(S40)(N39.south west);
\node[TextBLUE,anchor=west](N44)at(S40){不安全应用};
\node[TextF,below=0mm of N44.south west,anchor=north west,xshift=1.0mm,yshift=1mm](N441){
\Warning};
\node[TextF,Box,right=-1mm of N441.east,anchor=west,xshift=1.5mm](N442){性别分类};
\node[TextF,Box,right=0mm of N442.east,anchor=west,xshift=1.5mm](N443){年龄分类};
%
\path[red](N42)-|coordinate(S401)(N310.south west);
\node[TextBLUE,anchor=west](N46)at(S401){不安全用例};
\node[TextF,below=0mm of N46.south west,anchor=north west,text width=72mm](N47){本数据集不应用于创建性别或年龄分类器。感知性别和年龄标签旨在记录第三方仅依据视觉线索评估的性别和年龄呈现,而非个人自我认同的性别或实际年龄。};
%
\node[TextBLUE,below=14mm of N42.south west,anchor=north west](N48){联合使用};
\node[TextB3,below=0mm of N48.south west,anchor=north west](N49){可安全地与\\其他数据集联合使用};
\path[red](N48)-|coordinate(S41)(N44.south west);
\node[TextBLUE,anchor=west](N44)at(S41){已知可联合使用的数据集};
\node[TextF,below=0mm of N44.south west,anchor=north west,text width=55mm](N410){%
\leftmargini=9pt\vspace*{-4mm}
\begin{itemize} \itemsep=-3pt
\item 本数据集中的数据可与 \textcolor{BlueD}{Open Images V6} 合并使用
\end{itemize}};
\path[red](N48)-|coordinate(S42)(N46.south west);
\node[TextBLUE,anchor=west](N411)at(S42){已知联合用途};
\node[TextF,below=0mm of N411.south west,anchor=north west,
](N412){分析未按照\\ Open Images V6 流程进行标注的边界框标注。};
%%%%%%%%%%%%%%%%5
\node[TextBLUE,below=35mm of N41.south west,anchor=north west](N52){方法};
\node[TextB3,below=0mm of N52.south west,anchor=north west](N53){目标检测};
%
\path[red](N52)-|coordinate(S50)(N44.south west);
\node[TextBLUE,anchor=west](N54)at(S50){概述};
\node[TextF,below=0mm of N54.south west,anchor=north west](N510){可使用 TensorFlow 中的\\ Object Detection API 训练人物目标检测器。};
%
\path[red](N52)-|coordinate(S501)(N411.south west);
\node[TextBLUE,anchor=west](N56)at(S501){已知局限};
\node[TextF,below=0mm of N56.south west,anchor=north west,text width=74mm](N57){
如果本数据集与原始 Open Images 数据集联合使用,则人物负样本
应仅从具有明确的图像级“无人物”标签的图像中选取。\\
\smallskip
本数据集中的所有样本都已由原始 Open Images 标注流程
标注为至少包含一个人物。};
%
\node[TextBLUE,below=17mm of N52.south west,anchor=north west](N58){方法};
\node[TextB3,below=0mm of N58.south west,anchor=north west](N59){公平性评估};
\path[red](N58)-|coordinate(S51)(N54.south west);
\node[TextBLUE,anchor=west](N54)at(S51){概述};
\node[TextF,below=0mm of N54.south west,anchor=north west](N510){可针对按性别呈现和年龄呈现划分的\\
子集开展公平性评估。};
\path[red](N58)-|coordinate(S52)(N56.south west);
\node[TextBLUE,anchor=west](N511)at(S52){已知局限};
\node[TextF,below=0mm of N511.south west,anchor=north west,text width=74mm](N512){性别呈现仍然
偏向未知和以男性特征为主的类别,同时
年龄呈现范围偏向中年。};
%
\node[draw=none,fit=(N52)(N512)](BB5){};
\scoped[on background layer]
\node[draw=BrownLine,inner xsep=0mm,inner ysep=0mm,yshift=0mm,
fill=BrownL!10,fit=(BB1)(BB5),line width=0.75pt](BB){};
\foreach \i in{0.303,0.595,0.80}{
\draw[BrownLine,line width=0.75pt]($(BB.north west)!\i!(BB.south west)$)--($(BB.north east)!\i!(BB.south east)$);
}
\foreach \i in{0.097}{
\draw[BrownLine,line width=2.75pt]($(BB.north west)!\i!(BB.south west)$)--($(BB.north east)!\i!(BB.south east)$);
}
\end{tikzpicture}构建数据血缘基础设施
数据卡字段一旦进入流水线,就成为操作检查依据:来源、预期用途、风险和保留元数据决定哪些数据集可以训练哪些模型,以及审计期间必须追踪哪些产物。合规义务的可信程度取决于证明其得到履行的基础设施。当监管机构询问“哪些训练数据生成了这个模型?”或用户行使适用的删除权时,组织必须以工程层面的精确性作答,而不能依靠人工调查。数据血缘提供了这种能力,它将流水线关系形式化为由产物版本和转换任务构成的有向无环图(DAG),从而将静态文档转化为可查询的基础设施。Apache Atlas 和 DataHub27 等血缘系统与 Airflow 和 Kubeflow 等流水线编排器集成,以自动捕获这些关系。当 Airflow DAG 从对象存储中读取音频文件并将其转换为频谱图时,血缘系统会记录每个步骤,并将每个特征张量追溯到其源音频文件。血缘追踪还支持下游影响分析。当收到删除请求时,遍历血缘图可以识别所有需要失效处理、重新训练或法律审查的衍生产物,包括缓存的频谱图、特征嵌入和检查点权重。
生产环境中的关键词检测(KWS)系统在整个数据工程生命周期中实施血缘追踪。源音频摄取会创建血缘记录,将每个音频文件与其获取方式关联起来,以支持核验是否满足同意要求。随着音频转化为特征和嵌入,处理流水线的执行会扩展血缘图,并为每次转换记录代码版本和超参数。训练作业创建从特征集合到模型产物的血缘边,记录哪些数据版本训练了哪些模型版本。当语音助手设备下载模型更新时,血缘追踪会记录此次部署,以便在后续发现训练数据存在质量或合规问题时支持召回。血缘捕获了来源信息,但可问责的运行还需要访问历史:谁在何时依据何种授权接触了数据。
审计基础设施与问责
问责轨迹记录访问事件,以履行 HIPAA 和《萨班斯—奥克斯利法案》(SOX)等法规规定的义务。然而,在生产环境的机器学习系统中,捕获每一次访问事件会造成严重的写放大瓶颈。主数据集规模随用户数量或采集时长线性增长,而审计数据量则随数据集访问次数、服务请求数和流水线阶段数的乘积增长。在高吞吐量服务流水线中记录完整的特征载荷和中间激活张量,会使保留的审计遥测数据量相对于主数据存储呈凸性增长。这种写放大会迅速耗尽摄取带宽和二级存储容量,迫使系统将审计元数据与底层载荷数据解耦。
生产环境中的关键词检测架构通过分层审计拓扑解决这一权衡,在捕获保真度、存储开销和边缘带宽限制之间取得平衡。
在边缘层,受严格 SRAM 预算约束的微控制器将本地状态转换、唤醒时间戳和电源状态记录到易失性循环环形缓冲区中。为节省无线通信能耗和上行带宽,设备避免持续传输未压缩的遥测数据;它们仅在预定维护窗口或充电周期内,通过安全传输将紧凑的批量摘要刷写至集中式存储。
遥测数据到达集中式基础设施后,审计从带宽受限的边缘设备转向高吞吐量特征存储。在这一特征层,离线和在线特征存储会为每次读写事务生成仅追加的审计事件。这些事件不复制高维特征向量,而是记录发起请求的服务身份、获授权主体的假名、特征组哈希值和读取时间戳。这种仅记录元数据的日志策略支持细粒度访问核验,同时使日志量与访问事务数量而非载荷大小成正比。
数据从特征存储流入跨加速器集群运行的训练流水线。在这一训练层,集群调度器记录确定性清单,将训练作业直接映射到不可变的数据分区哈希值、git 提交 SHA 和超参数配置。这些清单能够验证流水线的完整性和可复现性,但也揭示了系统固有的能力边界:访问日志可以确认处理过哪些记录,却无法证明已删除的用户数据是否仍残留在学习得到的模型权重中。因此,履行删除要求需要触发自动化重新训练工作流或可证明的机器遗忘验证,而不能仅依赖数据库审计日志。
监管要求将审计责任从数据访问扩展到预测时的推理行为。要重建 section 1.3.3.1 中某位申请人被拒绝贷款的原因,或边缘语音助手发生唤醒词误触发的原因,就必须审计推理时的确切运行状态。如果没有推理时日志记录,审计轨迹可能只能确认数据库访问,却无法捕获产生某项决策所用的模型检查点、决策阈值和运行时特征。为每个推理请求归档原始输入张量会带来难以承受的存储写入负担;因此,生产服务系统会记录紧凑且用途受限的决策清单。这些清单捕获当前模型版本的哈希值、运行时决策阈值、输出置信度分数或原因代码,以及输入特征的密码学哈希值,从而将每项决策的重建转化为带索引的数据库查询。
安全、隐私、合规和审计28这四个治理领域共同构成了数据—算法—机器分类体系中机器层的执行层。它们提供所需的物理遥测和边界约束执行能力,用于验证算法约束、追踪数据来源,并在整个模型生命周期中维持问责。然而,即使系统实施了全面的治理基础设施,工程团队仍经常陷入隐蔽的误区:将审计日志视为被动的合规文书,假定汇总指标能够保证子群体公平性,或认为可以在部署后补加负责任工程的约束。
谬误与陷阱
即使已建立评估框架、公平性指标、可解释性机制、效率分析和治理基础设施,团队仍可能失败。团队可能在基准测试取得成功后才补做公平性工作,信任汇总准确率,或将合规证据视为文书材料而非系统行为;这些做法源于传统软件工程中的直觉,而在传统软件工程中,缺陷通常是局部的,测试则具有确定性。在谬误影响设计决策之前,及早识别这些失败模式,远比部署后才发现问题成本低。
谬误:可以在系统实现技术目标之后再处理责任问题。
团队往往认为,可以在模型展现出优异的基准测试性能后,再补充公平性约束。在生产环境中,早期的架构决策会限制后续仍然可行的干预措施。亚马逊的招聘工具(参见 section 1.2.1)说明了这一陷阱:补救尝试未能让人确信该系统能够避免给出歧视性推荐,亚马逊最终放弃了该项目 (Dastin 2018)。推迟落实责任的组织可能面临重新设计、带着已记录的风险部署,或取消项目的局面。在数据契约、监控和发布准入条件确定之前尽早纳入公平性约束,成本可能低于事后改造。
陷阱:依赖汇总指标评估公平性。
工程师往往认为,总体准确率高就意味着系统对所有用户都表现良好。平均值谬误(section 1.3.3)揭示了这种直觉为何失效:汇总指标可能掩盖子群体之间的巨大差异(section 1.2.4)。section 1.3.3.1 中的贷款审批分析表明,真正率(TPR)差距为 30 percentage-point,符合条件的少数群体申请者的拒绝率是多数群体的 4×。当常规监控仅跟踪汇总数据时,这些差异可能长期存在而未被发现。生产系统需要开展分组评估,并采用针对具体应用的阈值,例如本例中使用的 1.25\(\times\) 错误率比值或 5 个百分点的 TPR 差值。
谬误:从训练数据中移除敏感属性就能消除偏差。
团队移除性别、种族以及受保护属性,期望借此确保公平性。当其他特征与敏感特征相关时,它们可能充当代理变量。邮政编码、购买模式、浏览历史、大学名称和语言选择都可能间接携带人口统计学信号。亚马逊的系统(参见 section 1.2.1)会对“女子”等词语以及两所女子学院的毕业生给予负面评分 (Dastin 2018)。一项人群健康研究发现,纠正基于费用的代理指标,会使获得额外帮助的黑人患者比例从 17.7% 提高到 46.5% (Obermeyer et al. 2019)。仅移除受保护属性本身并不能确立公平性。
陷阱:认为文档足以落实问责。
团队投入精力编写模型卡,随后便认为责任要求已经得到满足。文档提供了透明度(section 1.3.2),却不具备强制执行力。如果缺乏技术限制,系统被改用于贷款审批,那么模型卡中“未经高风险决策场景验证”的声明便无法发挥作用。问责需要融入实际运行:监控仪表板、书面明确的子群体差异告警阈值、事件响应流程,以及防止系统超出已验证用例范围进行部署的访问控制。
谬误:负责任的 AI 主要是法律合规问题。
团队将责任视为外部监督,而非工程实践。在法律审查前数月作出的工程决策,对解决方案空间的约束比任何合规评估都更大。架构选择决定了哪些公平性干预措施可行,而数据流水线设计则决定了分组评估是否可能开展。正如 section 1.2.5 所阐明的,将责任作为工程目标进行设计的系统能够实现高效验证;在后期审查时才补充责任要求的系统,则面临重新设计或带着已记录的风险部署的局面。
陷阱:衡量训练的环境影响,却不衡量推理的环境影响。
公共讨论聚焦于训练运行的碳排放,工程师在评估环境责任时也常常沿用这一视角。section 1.4.3 中的示例性总拥有成本(TCO)分析说明了为何这一关注点并不完整:在其未采用批处理的服务需求假设下,推理与训练的成本之比约为 40:1。一个定期训练、但每天提供数百万次服务的模型,其生命周期环境足迹可能主要来自推理,而非训练。对于 table 16 中分析的推荐系统,训练占三年成本的 1.9 percent,而推理占 73.5 percent。在本例中,推理的 CO2 排放量约为训练的 63×。如果工程师只优化训练效率,却忽略单次查询的推理需求,就可能未对该场景中占比更大的部分进行审视。这些数值取决于具体场景,但它们说明了为何生命周期核算必须同时涵盖这两个部分。
谬误:模型权重不受数据治理和删除请求约束。
团队常常认为,一旦训练数据被编入模型权重,数据就已经消失,合规义务也就无法延伸至该产物。模型可能记忆训练数据,而成员推理攻击可能揭示某条记录是否曾出现在训练数据中 (Shokri et al. 2017)。特定权重是否构成个人数据,或是否需要在收到擦除请求后采取行动,取决于具体情况。当某项请求可能影响已部署的产物时,工程团队应跟踪从数据到模型的血缘关系,并与法律和隐私专家共同评估删除、限制处理、重新训练、机器遗忘或补偿性控制措施 (Cao and Yang 2015; Bourtoule et al. 2021)。
纵观这些失败案例,反复出现的错误是将责任视为一份文档、一个指标或一次后期审查,而非系统属性。可度量的约束、持续监控和可强制执行的治理,使责任贯穿整个生命周期。
总结
负责任工程是完整落实的机器学习系统工程,并非一门独立学科。本章从责任差距(技术性能与负责任结果之间的距离)出发,沿着从故障诊断、预防到强制执行的路径展开,展示了代理变量、反馈回路和分布偏移如何在常规指标仍处于可接受水平时伤害用户。工程应对措施包括:使部署前评估系统化的检查清单,使差异可度量的公平性指标,根据适用的利益相关方要求和监管要求选择的解释机制,以及能够发现隐性故障并将信号与响应衔接起来的监控基础设施。
将责任关切转化为可度量的属性,使其成为可处理的问题。针对具体应用、具有合理依据的差异界限可以测试;“做到公平”则无法测试。这种转化并不局限于公平性:在本章的示例性 TCO 场景中,加速器服务需求降低 20 percent 可节省 $304K,并且根据模型估算,在所述假设下可避免排放 19 t CO2。文档落实为明确说明预期用途和已知局限的模型卡。治理落实为访问控制、血缘跟踪和审计基础设施,使合规证据切实可得,而非仅停留在愿望层面。在这些情形中,抽象的伦理义务转化为可以明确规定、测试、监控和强制执行的具体工程要求。
本章提出的负责任工程实践是完整工程不可或缺的组成部分,而非叠加在技术工作之上的外部约束。忽视公平性、效率、透明度或治理的系统,在技术上是不完整的。对延迟预算和内存约束所采用的严谨性,必须同样延伸至公平性准则、环境影响以及适用的监管要求。从系统构建之初就纳入这些考量,可以使义务具备可测试性,更早揭示权衡,并使生产环境中的故障更易诊断和治理。
要点回顾: 对谁而言可靠?
- 总体正确性掩盖伤害:模型在总体上可能显得准确,但某个子群体的错误率可能是另一个子群体的 43.1×,Face++ 的 Gender Shades 审计就是如此。因此,负责任的评估应从分组切片和交叉群体切片入手,而不能仅依赖总体准确率。
- 阈值使责任具备可测试性:“做到公平”无法测试,但有界的差异、书面明确的预期用途和可解释性要求可以测试。将价值观转化为可度量的约束,使团队能够审视公平性、准确率、延迟和成本之间的权衡。
- 效率是一项社会约束:高效模型可以降低能耗和成本,并让更多主体具备部署模型的能力。在本章的示例场景中,推理与训练的成本之比为 40:1,因此,单次查询优化属于负责任工程的范畴。
- 监控必须关注结果:偏差和隐私失效可能在运行时间仪表板显示一切正常时持续发生,因为有害预测在运行层面看起来并无异常。生产监控必须以对待延迟回退同等的严谨性,跟踪子群体结果、数据血缘、反馈回路和事件处理路径。
- 治理必须内建于系统:模型卡、数据说明书、访问控制、擦除工作流、人工复核路径和审计轨迹都是技术基础设施,而非可有可无的政策附加层。GDPR 等法规要求的能力应在流水线设计中予以纳入;后续补救可能仍然可行,但一旦系统开始提供决策服务,补救的空间可能更小、成本也可能更高。
一个完全按照指令行事的系统之所以危险,恰恰是因为指令永远不可能完备。赋予模型的每一个目标都是一份存在缺口的规约,而优化器就是一台寻找这些缺口的机器。它可能再现数据中潜藏的偏差,追逐代理指标而非真正目标,并将结果称为成功,因为目标中没有任何内容对此作出相反规定。负责任工程就是将规约遗漏的内容补写进去的学科。约束和监控可以降低优化过程放大数据中所含伤害的风险。这与本书其他部分对延迟和内存施加的约束属于同一类约束,只是在这里,它保护的是目标从未提及的人;一个速度快、准确率高,却错误对待其服务对象的模型,其失败程度并不亚于一个崩溃的模型,只是更加悄无声息。
Footnotes
亚马逊招聘工具:亚马逊爱丁堡工程团队自 2014 年起开发该系统,按 1–5 分对求职者进行评分。系统使用约十年的简历进行训练,其中绝大多数来自男性求职者,反映了科技行业的性别比例。到 2015 年,性别偏见问题已被发现;在多次尝试补救之后,该项目于 2017 年被放弃 (Dastin 2018)。工程成本并非计算开销,而是机会成本:一个历时多年的招聘项目因目标编码了历史偏见而失败,成为机器学习工具中有据可查的规格说明失效案例。↩︎
代理变量:当其他相关特征仍保留相似信号时,移除一个代理变量可能收效甚微。反过来,仅凭相关性既不能证明存在歧视,也不能确定适当的干预措施。移除受保护属性、子群体评估、反事实测试、因果分析,以及审查完整决策过程,可以提供互补证据;任何单一诊断手段都无法构成完备的防护。↩︎
COMPAS(面向替代制裁的罪犯矫正管理画像系统):在所分析的数据中,COMPAS 评分在不同种族之间大致满足校准性,即给定评分在不同群体中对应着相近的实际观测再犯概率。由于不同人群的再犯比例不同,校准性与错误率差异同时存在 (Chouldechova 2017; Kleinberg et al. 2017)。因此,仅进行校准测试既无法确立错误率均等性,也无法判断错误的分配是否可接受。↩︎
古德哈特定律:“当一个度量成为目标时,它就不再是一个好的度量”(斯特拉森对古德哈特 1975 年货币政策观察的概括)(Strathern 1997; Goodhart 1984)。推荐反馈回路是这一现象在机器学习中的典型体现:梯度下降以人工内容策展者无法企及的速度优化观看时长代理指标,而系统自身的输出又重塑了训练分布——消费极端内容的用户产生的数据会进一步强化极端性,使代理指标与用户福祉脱钩的速度比人工编辑流程快数个数量级。↩︎
差分隐私:由 Dwork et al. (2006) 提出,如果对于所有仅相差一条记录的相邻数据集 \(D, D'\) 以及输出集合 \(\mathcal{S}\),随机化机制 \(\mathcal{M}\) 均满足 \(\mathbb{P}[\mathcal{M}(D) \in \mathcal{S}] \leq e^\epsilon \cdot \mathbb{P}[\mathcal{M}(D') \in \mathcal{S}] + \delta\),则该机制满足 \((\epsilon, \delta)\)-差分隐私。其中,\(\epsilon\) 限定隐私损失的上界,\(\delta\) 则允许以很小的概率超出这一上界;二者可接受的取值取决于威胁模型和政策。系统层面的权衡涉及效用,而不只是实现复杂度:更强的隐私保护通常需要更多噪声或更严格的采样,而隐私损失会在重复查询或训练步骤之间组合累积。因此,工程师必须使用有效的隐私核算器跟踪累计隐私损失,并报告所选预算背后的假设。↩︎
Gender Shades:Joy Buolamwini(麻省理工学院媒体实验室)和 Timnit Gebru(微软研究院)于 2018 年开展的一项研究,使用 Fitzpatrick 皮肤类型量表审计了微软、IBM 和 Face++ 的商用性别分类系统。该量表最初是 Thomas Fitzpatrick 于 1975 年为评估紫外线敏感性而开发的皮肤科分类体系,后来得到临床应用验证 (Fitzpatrick 1988);本研究将其改作算法审计的人口统计基准。该研究展示了分组评估的价值;在 table 2 复现的 Face++ 结果中,深肤色女性的错误率为浅肤色男性的 43.1×。微软后来报告的错误率下降表明,公开审计结果可以推动可量化的整改 (Raji and Buolamwini 2019)。↩︎
差别影响:在 Griggs 诉 Duke Power Co. 案(1971 年)中,美国最高法院依据《民权法》第七章裁定,即使不存在歧视意图,一项就业措施也可能因其实际作用而违法 (Supreme Court of the United States 1971)。差别影响是一种法律诉求,其构成要件因法律和情境而异,并非任何统计差异的同义词。模型结果和代理变量可以提供相关证据,但仅凭指标不足以认定法律责任。↩︎
五分之四规则:1978 年《雇员甄选程序统一指南》将五分之四规则用作实用的就业甄选诊断标准 (Equal Employment Opportunity Commission et al. 1978)。如果某群体的录用率低于录用率最高群体的 80%,通常被视为存在不利影响的证据;但该指南也承认,更小的差异也可能具有重要意义,而且该比值并不具有决定性。↩︎
模型卡:模型卡主要解决的失效模式是范围蔓延——在未重新验证预期用途的情况下,从“它适用于情形 A”逐渐扩展为“在情形 B 中也试试”。实践中,模型卡往往在部署决策做出后才编写,记录的是已观察到的行为,而非对行为施加约束。配套的“数据集数据表”(Gebru et al. 2021) 将同样的原则应用于训练数据。缺少这两类文档中的任何一类,模型卡都会沦为历史记录,而非工程防护措施。↩︎
公平性指标的不相容性:本计算示例中测得的差异表明,同一组混淆矩阵可以同时违反人口统计均等、机会均等和均等化几率。另一个不可能性结论表明,当群体基础率不相等且预测不完美时,若干理想准则——包括校准类预测均等和错误率平衡——通常无法同时满足 (Chouldechova 2017)。在这些情况下,优化一项准则可能会损害另一项准则。因此,系统设计者必须明确说明取舍,而不能假定所有保证都能同时实现。↩︎
均等化几率:由 Hardt et al. (2016) 形式化定义,要求各受保护群体的 TPR 和 FPR 均相等;较弱的“机会均等”则将这一要求放宽为仅要求 TPR 相等。均等化几率后处理可能需要依赖群体的随机化决策,而非仅使用确定性阈值。它还要求在决策时获取受保护群体信息,并且必须依据适用法律进行评估;例如,美国信贷监管通常限制使用受保护特征来评估信用资质。↩︎
重加权:一种源于统计学中重要性采样的预处理技术:在训练期间,为代表性不足群体的样本赋予更高的损失权重,从而在不移除任何数据的情况下增强它们对梯度更新的影响。Kamiran and Calders (2012) 表明,恰当选择的权重能够减少训练数据带来的差别影响。系统层面的取舍因应用而异:重加权会改变损失景观,并可能降低其他切片上的性能,因此必须结合该应用的帕累托前沿评估其代价。↩︎
对抗去偏:其关键区别在于对表示施加压力:对抗器抑制主模型编码受保护属性信息,这可以减少受保护属性泄露,并有助于在受评估分布下满足选定的公平性准则 (Zhang et al. 2018);它无法在任意部署分布偏移下提供普遍的公平性保证;这些保证依赖于有关不变性、标签、因果结构以及偏移类型的假设。阈值调整等后处理方法在不同假设下也可能适用,但当部署环境中的人口构成或标签生成过程发生变化时,必须重新验证。其代价是额外的训练、超参数调优和切片级验证,而非某个通用的百分比开销。↩︎
可解释性与可理解性:可理解性通常描述人们理解模型或其行为的容易程度,往往通过简短规则列表或稀疏线性模型等受约束的结构来实现。可解释性的范围更广,包括 LIME 和 SHAP 等事后解释方法。这两种属性都不会自动具备:采用不透明特征的线性模型可能难以理解,而特征归因并不是对决策的因果解释。从系统角度看,内在约束会影响模型选择,而事后解释方法会增加计算与验证流程,其成本取决于方法、模型和服务工作流。GDPR 中关于访问权和自动化决策的条款,对其涵盖的处理活动使用了“有关所涉逻辑的有意义信息”这一表述 (European Parliament and Council of the European Union 2016),因此适当的技术方法取决于具体决策和适用法律。↩︎
LIME(局部可理解的模型无关解释)与 SHAP(SHapley 加性解释):LIME (Ribeiro et al. 2016) 在每个预测附近拟合一个局部可理解的代理模型;SHAP (Lundberg and Lee 2017) 将合作博弈论中的 Shapley 值引入统一的加性框架,以计算特征贡献。精确计算 Shapley 值需要在所有可能的特征子集上评估某个特征的边际贡献,其复杂度随特征数量呈指数增长(\(O(2^M)\));因此,实际生产部署依赖多项式时间的模型专用算法(例如用于决策树的 TreeSHAP)或采样近似(例如 KernelSHAP),以避免不可接受的服务延迟。从系统权衡的角度看,必须明确规划解释忠实度、延迟和实现复杂度的预算,而不能将解释视为没有成本的能力。↩︎
欧盟《人工智能法案》(第 2024/1689 号条例):首个全面的人工智能法律框架,定义了四个风险等级,处罚因违法类别而异;违反人工智能实践禁令的罚款最高可达 3500 万欧元或全球营业额的 7%;其他许多义务(包括许多高风险系统运营主体义务)所对应的罚款上限为 1500 万欧元或全球营业额的 3%。该法案具有域外效力:非欧盟组织将系统投放欧盟市场,或其系统输出在欧盟境内使用时,可能需要遵守该法案。对系统工程的影响是具体的:高风险人工智能需要用于形成审计轨迹的日志基础设施、内置于架构中的人工监督机制,以及 CE 标志——所有这些能力都必须从一开始就纳入设计,而不能在部署后再补装。↩︎
高风险人工智能(欧盟《人工智能法案》附件 III):附件 III 列举了生物识别、关键基础设施、教育、就业、基本服务、执法、移民和司法等领域的特定使用场景。分类取决于预期用途和第 6 条的标准,其中包括对某些不会实质性影响决策或不会构成重大风险的系统予以排除;附件 III 范围内用于对个人进行画像的系统仍属于高风险系统。仅凭模型架构无法确定分类。↩︎
GDPR(《通用数据保护条例》)第 15 条和第 22 条:第 22 条限制某些完全自动化、且产生法律效果或类似重大影响的决策,并针对规定的例外情形要求提供保障措施,包括人工介入、表达观点的能力以及对决策提出异议的能力;第 15 条第 1 款第 (h) 项规定了获取有关此类自动化决策所涉逻辑的有意义信息的访问权 (European Parliament and Council of the European Union 2016)。欧洲数据保护委员会的指南强调,所要求的人工监督必须具有实质性,而不能仅仅是“走过场式批准” (European Data Protection Board 2018)。如果每日 1M 次决策中有 0.1 percent 被申诉或升级处理,系统就必须处理 1,000 cases/day;这是工作量假设,而不是模型错误率。↩︎
HIPAA(《健康保险可携带性与责任法案》):于 1996 年颁布,其《隐私规则》和《安全规则》的要求确立了受保护健康信息的标准 (United States Congress 1996; U.S. Department of Health and Human Services 2003, 2005);在获得适用授权或通过其他获准途径(例如机构审查委员会(IRB)或隐私委员会批准的授权豁免)的情况下,可将受保护健康信息(PHI)用于训练;去标识化数据,以及附有数据使用协议的有限数据集,提供了其他途径。如果模型输出能够识别个人,或能够合理地用于识别个人,则其仍可能属于 PHI;审计和证据设计必须体现《安全规则》对文档留存的要求。民事罚款实行分级制度,并依据法规进行通胀调整 (U.S. Department of Health and Human Services 2026)。↩︎
Zillow 的数据—算法—机器(D·A·M)失败:Zillow 在 2021 年计提的减值是一个有价值的系统案例,因为已披露的业务失败同时涉及预测不确定性和运营执行问题 (Zillow Group 2021)。数据—算法—机器诊断将数据维度解释为历史房屋销售数据与疫情期间价格波动之间的不匹配,将算法维度解释为在提供可靠不确定性估计的同时为房屋定价的困难,将机器维度解释为需要更严格的能力限制和熔断机制的自动化 iBuying 购房流水线。这是对 Zillow 公开披露内容的工程解读,并不意味着 Zillow 已确定某个单一的技术根本原因。↩︎
绿色 AI:Schwartz et al. (2020) 对比了“红色 AI”(不惜任何代价追求性能)与“绿色 AI”(以效率为首要指标)。计算量增长的依据来自《AI 与计算》对 2012–2018 年趋势的分析,该分析报告称,最大规模 AI 训练运行所使用的计算量增长了 300,000\(\times\) (Amodei and Hernandez 2018)。绿色 AI 的提议——为每项发表的结果同时报告 FLOPs 和准确率——将效率从工程偏好重新界定为科学报告义务,使不同研究团队为获得边际准确率提升所付出的资源成本变得可见且可比较。↩︎
TCO(总拥有成本):机器学习的 TCO 包括标注、监控、再训练、补救措施、能源、审计和合规成本。当流量足够大时,持续发生的推理成本可能超过一次性训练费用;利用率和更新频率决定了两者的相对占比。↩︎
机器学习 ROI(投资回报率):部署成本与训练成本之比会随流量、利用率、硬件、更新频率、人员配置和事件处置负担而变化。合适的模型选择取决于实测生命周期成本和任务价值,而非固定比值。↩︎
隐私保护技术:K-匿名性 (Sweeney 2002) 确保就选定的准标识符而言,每条记录都与至少 \(k-1\) 条其他记录不可区分;l-多样性在等价类内增加属性取值的多样性 (Machanavajjhala et al. 2007);t-接近性则限制分布距离 (Li et al. 2007)。这些句法保证针对的威胁与差分隐私不同,其本身无法防止所有机器学习特有的信息泄露:在去标识化数据上训练的模型,在某些条件下仍可能记忆样本或泄露成员身份信号 (Shokri et al. 2017)。相比之下,差分隐私在指定机制和隐私预算下限制单条记录的影响,提供一种即使存在辅助信息也旨在保持有效的语义保证;因此,这些方法并不构成简单的强弱层级,适当的保护措施取决于发布内容、威胁模型和效用要求。↩︎
成员推断攻击:这种攻击利用模型行为推断某条记录是否出现在训练中;过拟合可能增强这一信号 (Shokri et al. 2017)。在实践中,模型对训练样本给出的较高置信度有助于区分成员与非成员。测得的攻击成功率取决于模型访问方式、数据分布和防御假设。成功的经验性攻击揭示了实际存在的信息泄露,但其本身不足以证明某个声称的 \((\epsilon, \delta)\) 界限遭到违反。形式化的差分隐私保证来自机制及其隐私核算。↩︎
联邦学习:McMahan et al. (2017) 提出了联邦平均(FedAvg),其中每台设备在本地训练,并共享模型更新而非原始记录。这种架构可以限制原始数据的常规传输,但并不构成隐私保障:模型更新可能通过重构攻击泄露训练信息 (Zhu et al. 2019)。因此,可以将联邦学习与安全聚合、差分隐私和保留控制相结合,形成纵深防御设计,其保障取决于完整协议。↩︎
数据血缘系统:Apache Atlas 和 DataHub 从流水线执行过程中捕获有关数据流的元数据,创建以数据集为节点、以转换为边的图。GDPR 第 30 条要求记录处理活动 (European Parliament and Council of the European Union 2016),并未专门要求自动化的模型级血缘。不过,在收到适用请求时,血缘有助于识别可能需要删除、限制处理、重新训练或法律审查的衍生产物。↩︎
审计轨迹:审计完整性需要防止未经授权的修改,但保留和删除义务因记录类型和法律而异;具备保留控制的仅追加对象存储或密码学哈希链能够提供篡改证据,而无需确立记录永不删除的普遍规则。大型平台每天可能记录数十亿个事件;HIPAA《安全规则》还要求将规定的政策和程序文档保留多年 (U.S. Department of Health and Human Services 2005)。保留规划必须区分必须保存的记录与必须最小化或删除的个人数据。↩︎

