高风险应用的机器学习-全-
高风险应用的机器学习(全)
原文:
zh.annas-archive.org/md5/b365d9938b949aa410098bbbb69c46a8译者:飞龙
序言
著名统计学家乔治·博克斯曾经著名地说过:“所有模型都是错误的,但有些是有用的。”承认这一事实构成有效风险管理的基础。在机器学习日益自动化我们生活中重要决策的世界中,模型失败的后果可能是灾难性的。采取刻意措施来减轻风险并避免意外伤害至关重要。
在 2008 年金融危机之后,监管机构和金融机构意识到管理模型风险以确保银行安全的重要性,完善了模型风险管理(MRM)的实践。随着人工智能和机器学习的广泛应用,MRM 原则正在被应用于管理其风险。美国国家标准与技术研究院的 AI 风险管理框架作为这一演变的例证。从高级管理监督到政策和程序,包括组织结构和激励措施,正确治理和控制整个过程对于促进模型风险管理文化至关重要。
在《面向高风险应用的机器学习》中,霍尔、柯蒂斯和潘迪提出了一个框架,用于将机器学习应用于重大决策。通过记录的模型失败案例和新兴法规提供了令人信服的证据,强调了强有力的治理和文化的重要性。不幸的是,这些原则在非受监管行业,如银行之外,仍然很少被实施。该书涵盖了重要的主题,包括模型透明性、治理、安全性、偏见管理等。
在机器学习中,仅进行性能测试是不够的,因为非常不同的模型可能由于模型多样性而具有相同的性能。模型还必须具有可解释性、安全性和公平性。这是第一本强调固有可解释模型及其最近的发展和应用的书籍,特别是在模型影响个人的情况下,如消费金融领域。在这些场景中,解释性人工智能(XAI)事后解释方法通常面临重大挑战。
开发可靠和安全的机器学习系统还需要严格评估模型的弱点。本书提供了两个详尽的示例以及模型调试方法论,包括通过错误或残差切片识别模型缺陷,评估输入数据损坏下模型的鲁棒性,评估模型输出的可靠性或不确定性,以及通过压力测试测试模型在分布变化下的弹性。这些对于在高风险环境中开发和部署机器学习至关重要。
机器学习模型有潜力通过自动化迅速且规模化地对历史上被边缘化的群体造成不成比例的伤害。偏见的模型决策对受保护群体产生有害影响,持续加剧社会和经济差距。本书将教读者如何通过社会技术视角解决模型公平性问题。作者还详细研究了模型去偏差技术的影响,并就如何在不同受监管行业应用这些技术提供了实用建议。
《高风险应用的机器学习》 是一本实用、主观和及时的书籍。各类读者都能在这个充满挑战的主题中找到丰富的见解,无论你是一名数据科学家,希望更好地理解你的模型,还是一名负责确保符合现有标准的经理,或者是一名试图改进组织风险控制的高管。
Agus Sudjianto,博士
威尔斯法格(Wells Fargo)公司模型风险负责人,执行副总裁(EVP)
前言
今天,机器学习(ML)是人工智能(AI)中最具商业价值的子学科。ML 系统被用于在全球经济和政府中作出高风险决策,如就业、保释、假释、贷款、安全等高影响应用。在企业环境中,ML 系统被用于组织的各个部门——从面向消费者的产品到员工评估,再到后台自动化等等。事实上,过去的十年见证了 ML 技术的更广泛应用。但同时也证明,ML 对其运营者、消费者甚至普通公众都带来了风险。
和所有技术一样,ML 可能会失败——无论是无意的误用还是有意的滥用。截至 2023 年,已有数千份关于算法歧视、数据隐私侵犯、训练数据安全漏洞及其他有害事件的公开报告。在组织和公众能够实现这一令人兴奋的技术的真正好处之前,必须减轻这些风险。应对 ML 的风险需要从业者采取行动。虽然本书旨在遵循初步形成的标准,但 ML 实践仍缺乏广泛接受的专业许可或最佳实践。这意味着在部署到现实世界中时,个体从业者主要要对其技术的好坏后果负责。高风险应用的机器学习将为从业者提供模型风险管理过程的深入理解,并介绍如何使用常见的 Python 工具来训练可解释模型,并通过调试确保其可靠性、安全性、偏见管理、安全性和隐私问题。
注意
我们采用了 Stuart Russell 和 Peter Norvig 的书籍人工智能:一种现代方法中对 AI 的定义:设计和构建智能系统,这些系统接收来自环境的信号,并采取影响该环境的行动(2020 年)。对于机器学习(ML),我们使用通常被归因于阿瑟·塞缪尔的普遍定义:[一种]研究领域,使计算机能够在没有显式编程的情况下学习(大约 1960 年)。
谁应该阅读这本书
这是一本主要面向早期至中期职业生涯的机器学习工程师和数据科学家的技术书籍,他们希望了解机器学习的责任使用或机器学习风险管理。代码示例使用 Python 编写。也就是说,这本书可能并非适合每一个在 Python 编码的数据科学家和工程师。如果你希望学习一些模型治理基础知识,并更新你的工作流程以适应基本的风险控制,那么这本书适合你。如果你的工作需要遵守某些不歧视、透明、隐私或安全标准,这本书也适合你。(尽管我们不能保证合规性或提供法律建议!)如果你想训练可解释的模型,并学会编辑和调试它们,那么这本书也适合你。最后,如果你担心你在机器学习中的工作可能导致与社会学偏见、数据隐私违规、安全漏洞或其他自动决策造成的已知问题相关的意外后果,并且你希望采取行动,那么这本书也适合你。
当然,这本书可能也会吸引其他人的兴趣。如果你从物理学、计量经济学或心理测量学等领域转入机器学习,这本书可以帮助你学习如何将新的机器学习技术与建立的领域专业知识和有效性或因果关系的概念相结合。本书可能为监管者或政策专业人士提供一些关于当前可用于遵守法律、法规或标准的机器学习技术状态的见解。技术风险执行官或风险经理可能会发现本书对提供适用于高风险应用的更新 ML 方法的概述很有帮助。专业的数据科学家或机器学习工程师也可能会觉得本书具有教育意义,但他们可能也会发现它挑战了许多已建立的数据科学实践。
读者将学到什么
阅读这本书的读者将接触传统的模型风险管理以及如何将其与计算机安全最佳实践(如事件响应、漏洞赏金和红队演练)融合,以将经过实战验证的风险控制应用于机器学习工作流程和系统中。本书将介绍一些较旧和较新的可解释模型,以及使机器学习系统更加透明的解释技术。一旦我们建立了高度透明模型的坚实基础,我们将深入探讨如何测试模型的安全性和可靠性。当我们能看到我们的模型如何工作时,这项工作就变得更加容易!我们将远远超出留置数据的质量测量,探索如何应用诸如残差分析、敏感性分析和基准测试等众所周知的诊断技术到新类型的机器学习模型上。然后,我们将进一步结构化模型以进行偏差管理、测试偏差,并从组织和技术角度进行偏差纠正。最后,我们将讨论机器学习管道和 API 的安全性。
注意
欧盟 AI 法案草案将以下机器学习应用归类为高风险:生物识别身份验证;关键基础设施管理;教育;就业;公共(如公共援助)和私人(如信贷放款)的基本服务;执法;移民和边境管控;刑事司法;以及民主进程。这些是我们在提到高风险应用时考虑的 ML 使用案例类型,这也是为什么我们选择在本书中的代码示例中专注于计算机视觉和基于树的表格数据模型的原因。
读者还应该注意,在本书的第一版中,我们专注于更为成熟的机器学习方法来进行估算和决策。我们没有深入探讨无监督学习、搜索、推荐系统、强化学习和生成型人工智能。这样做有几个原因:
-
这些系统还不是最常见的商业生产系统。
-
在继续进行更复杂的无监督、推荐和强化学习或生成方法之前,我们掌握基础知识至关重要。本书的第一版专注于基础知识,这将使读者能够稍后进行更复杂的项目。
-
对于这些系统的风险管理尚不如我们在本书中专注的监督模型类型那样理解透彻。直截了当地说——正如我们在本书的其余部分经常做的那样——使用失败模式、缓解措施和控制措施未知的模型可能会增加风险。
我们希望将来能够重返这些话题,并承认它们今天对数十亿人产生了积极和消极的影响。我们还注意到,通过一点创造力和努力,本书中的许多技术、风险缓解措施和风险管理框架可以和应该应用于无监督模型、搜索、推荐和生成型人工智能。
注意
像 ChatGPT 和 GitHub Copilot 这样的前沿生成型人工智能系统,是影响我们生活的一种激动人心的方式。这些系统似乎已经解决了早期类似系统困扰的偏见问题。然而,在高风险应用中使用它们仍然存在风险。如果我们在使用它们时有顾虑,我们应考虑以下简单的防护措施:
不要从用户界面复制粘贴。
不直接使用生成的内容,也不将我们自己的内容直接粘贴到界面中,可以限制知识产权和数据隐私风险。
检查所有生成的内容。
这些系统继续生成错误、冒犯性或其他问题内容。
避免自动化的自满。
一般来说,这些系统更适合于内容生成,而不是决策支持。我们应该小心,不要让它们无意中为我们做出决定。
与 NIST AI 风险管理框架的一致性
为了遵循我们自己的建议,并使本书对于那些在高风险应用上工作的人更加实用,我们将突出本书中提出的方法与新生的国家标准与技术研究所(NIST)AI 风险管理框架(RMF)的一致性。应用外部标准是一种众所周知的风险管理策略,而 NIST 在权威技术指导方面拥有令人难以置信的记录。AI RMF 具有许多组成部分,但最核心的两个部分是 AI 信任度特征和核心 RMF 指南。信任度特征确立了 AI 风险管理的基本原则,而核心 RMF 指南则提供了风险控制实施的建议。我们将在第 I 部分的每一章的开头,使用一个引用框来详细说明内容如何以及在哪些方面与核心 NIST AI RMF 的地图、测量、管理和治理功能相关联。我们希望与 NIST AI RMF 的对齐可以提高本书的可用性,使其成为更有效的 AI 风险管理工具。
警告
NIST 不会审查、批准、认可或以其他方式处理本书中的任何内容,包括与 AI RMF 相关的任何声明。所有 AI RMF 内容仅仅是作者的观点,并且绝不反映 NIST 的官方立场或 NIST 与本书或作者之间的任何官方或非官方关系。
书籍大纲
本书分为三个部分。第 I 部分从实际应用的角度讨论问题,必要时混入理论。第 II 部分包含长篇 Python 编程示例,从结构化和非结构化数据的角度讨论第 I 部分中的主题。第 III 部分提供了如何在真实世界的高风险用例中取得成功的宝贵建议。
第 I 部分
第一章深入探讨了待定法规、产品责任的讨论,并对传统模型风险管理进行了彻底的处理。由于许多这些实践假设对建模采用了相对稳定和专业的方法,与今天普遍的“快速迭代、破坏式革新”精神截然不同,我们还将讨论如何将假定失败的计算机安全最佳实践纳入模型治理中。
第二章介绍了可解释模型的新兴生态系统。我们深入讨论了广义可加模型(GAM)家族,但也讨论了许多其他类型的高质量和高透明度估计器。 第二章还概述了许多不同的后评解释技术,但着重于严谨性和这个有些被过度宣传的负责任机器学习技术子领域的已知问题。
第三章以测试模型的假设和真实世界可靠性的方式进行模型验证。我们将讨论软件测试基础,并触及模型调试领域的亮点。
第四章概述了机器学习中公平性和偏见的社会技术方面,然后过渡到技术性偏见测量和修复方法。 第四章然后详细讨论了偏见测试,包括对差异冲击和差异有效性的测试。 第四章还涵盖了已建立的和保守的偏见修复方法,以及更先进的双目标、对抗性以及前处理、处理中和后处理的修复技术。
第五章通过讲述如何对抗 ML 系统来结束第一部分,从计算机安全的基础开始,深入讨论常见的 ML 攻击、对抗性 ML 和鲁棒 ML。
第一部分中的每一章结束时都会进行案例讨论,涉及 Zillow 的 iBuying 崩溃、英国的 A 级考试丑闻、自动驾驶 Uber 的致命事故、Twitter 的首次偏见漏洞赏金以及真实世界的机器学习逃避攻击等主题。每一章还将概述内容与 NIST AI RMF 的一致性。
第二部分
第二部分通过一系列详细的代码示例章节扩展了第一部分中的想法。 第六章在一个基本的消费金融案例中详细介绍了可解释增强机器(EBMs)、XGBoost 和可解释人工智能技术。
第七章将后评解释技术应用到 PyTorch 图像分类器中。
在第八章,我们将调试我们的消费金融模型以解决性能问题,并在第九章中为我们的图像分类器做同样的处理。
第十章包含与偏见测试和偏见修复相关的详细示例,而第十一章则提供了针对基于树的模型的机器学习攻击和对策的示例。
第三部分
我们在第十二章中以更一般的建议结束本书,介绍如何在高风险的机器学习应用中取得成功。这并不是通过快速推进和破坏来实现的。对于一些低风险的用例,快速而不拘一格的方法可能没问题。但随着机器学习在更多高风险应用中的规范化使用,破坏事物的后果变得更加严重。第十二章通过实践经验为在高风险场景中应用机器学习提供了宝贵的实用建议。
本书第一版的希望是提供一个合法的选择,以取代目前机器学习中常见的不透明和紧迫时间框架的工作流。本书应该为从业者提供一组词汇、思想、工具和技术,使他们在非常重要的工作中更加审慎。
示例数据集
本书依赖于两个主要数据集,用于解释技术或演示方法,并讨论它们的结果。这些是示例数据集,不适合在高风险应用中训练模型,但它们广为人知且易于获取。它们的缺点也使我们能够指出各种数据、建模和解释的陷阱。在接下来的章节中,我们会多次提到这些数据集,因此在深入阅读本书其他部分之前,请务必熟悉它们。
台湾信用数据
在结构化数据章节——第六章、8 章、10 章和 11 章——我们使用了来自加州大学尔湾分校机器学习库或Kaggle中稍作修改的台湾信用数据版本。该信用卡违约数据包含 2005 年台湾信用卡客户的人口统计和支付信息。通常情况下,该数据集的目标是使用过去的支付状态(PAY_*)、过去的支付金额(PAY_AMT*)和账单金额(BILL_AMT*)作为输入,预测客户是否能够满足下一笔付款(DELINQ_NEXT = 0)。货币金额以新台币报告。我们在该数据集中添加了模拟的SEX和RACE标记,以说明偏见测试和补救方法。我们将支付信息作为输入特征,并遵循管理 ML 系统中偏见的最佳实践,不使用人口统计信息作为模型输入。完整的数据字典可在表 P-1 中找到。
表 P-1. 信用卡违约数据字典
| Name | 建模角色 | 测量级别 | 描述 |
|---|---|---|---|
ID |
ID | Int | 唯一行标识符 |
LIMIT_BAL |
输入 | 浮点数 | 先前授信额度 |
SEX |
人口统计信息 | Int | 1 = 男性;2 = 女性 |
RACE |
人口统计信息 | Int | 1 = 西班牙裔;2 = 黑人;3 = 白人;^(a) 4 = 亚洲人 |
EDUCATION |
人口统计信息 | 整数 | 1 = 研究生院;2 = 大学;3 = 高中;4 = 其他 |
MARRIAGE |
人口统计信息 | 整数 | 1 = 已婚;2 = 单身;3 = 其他 |
AGE |
人口统计信息 | 整数 | 年龄(岁) |
PAY_0, PAY_2–PAY_6 |
输入 | 整数 | 过去付款记录;PAY_0 = 2005 年 9 月偿还状况;PAY_2 = 2005 年 8 月偿还状况;…;PAY_6 = 2005 年 4 月偿还状况。偿还状况的测量尺度为:-1 = 按时支付;1 = 一个月延迟支付;2 = 两个月延迟支付;…;8 = 八个月延迟支付;9 = 九个月及以上延迟支付 |
BILL_AMT1–BILL_AMT6 |
输入 | 浮点数 | 账单金额;BILL_AMT1 = 2005 年 9 月账单金额;BILL_AMT2 = 2005 年 8 月账单金额;…;BILL_AMT6 = 2005 年 4 月账单金额 |
PAY_AMT1–PAY_AMT6 |
输入 | 浮点数 | 先前付款金额;PAY_AMT1 = 2005 年 9 月付款金额;PAY_AMT2 = 2005 年 8 月付款金额;…;PAY_AMT6 = 2005 年 4 月付款金额 |
DELINQ_NEXT |
目标 | 整数 | 下一个客户的付款是否拖欠(迟到),1 = 迟到;0 = 按时 |
| ^(a) 有关“白人”是否应该与“黑人”一样在提到种族人口统计群体时大写的持续辩论。在本书中,我们通常遵循许多权威声音在出版界和学术界的做法,将“黑人”大写,以认可其共同的历史和文化身份。 |
正如读者在接下来的章节中将看到的,该数据集编码了一些病理缺陷。它太小,无法训练可用的高容量机器学习估算器,而 DELINQ_NEXT 的几乎所有信号都编码在 PAY_0 中。随着本书的进展,我们将努力解决这些问题并揭示其他问题。
Kaggle 胸部 X 光数据
对于深度学习章节——第六章和第九章——我们将使用 Kaggle 的胸部 X 光图像数据集。该数据集由大约 5800 张图像组成,包括肺炎和正常两类。这些标签由人类领域专家确定。这些图像是去标识化的胸部 X 光片,拍摄于广州妇女儿童医疗中心的例行护理访问期间。参见图 P-1 以查看肺炎图像示例。

图 P-1. Kaggle 胸部 X 光数据集中的肺炎图像示例
我们将在这本书的后续章节中面临的主要问题是数据集规模较小——即使用于迁移学习任务,数据集中图像之间存在的错位,可能导致快捷学习的视觉伪影,以及需要领域专业知识来验证建模结果。与台湾信用数据类似,我们将在本书的后续章节中解决这些问题并发现更多问题。
本书中使用的惯例
本书使用以下排版约定:
Italic
表示新术语或重要想法。
Constant width
用于程序清单,以及段落内部用于引用程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。
注意
此元素表示一般性的注意事项或建议。
警告
此元素表示警告或注意事项。
在线图表
您可以在https://oreil.ly/MLHA-figures找到一些图表的更大、彩色版本。每个图表的链接也会出现在它们的标题中。
使用代码示例
补充材料(代码示例、练习等)可在https://oreil.ly/machine-learning-high-risk-apps-code下载。
注意
随着时间的推移,代码示例可能会与书中打印的示例有所不同。
如果您有技术问题或使用代码示例遇到问题,请发送电子邮件至bookquestions@oreilly.com。
本书旨在帮助您完成工作。一般而言,如果本书提供了示例代码,您可以在您的程序和文档中使用它。除非您要复制大量代码,否则无需联系我们请求许可。例如,编写一个使用本书中多个代码片段的程序不需要许可。销售或分发 O’Reilly 图书的示例需要许可。通过引用本书回答问题并引用示例代码不需要许可。将本书中大量示例代码整合到您产品的文档中需要许可。
我们感谢您,但通常不需要署名。署名通常包括标题、作者、出版商和 ISBN。例如:“Machine Learning for High-Risk Applications by Patrick Hall, James Curtis, and Parul Pandey (O’Reilly)。2023 年版权 Patrick Hall, James Curtis, and Parul Pandey, 978-1-098-10243-2。”
如果您觉得您使用的代码示例超出了合理使用范围或以上授权,请随时联系我们permissions@oreilly.com。
致谢
感谢我们在 O’Reilly 的编辑和制作团队,特别是 Michele Cronin 和 Gregory Hyman;我们的副校对,Liz Wheeler;以及我们的项目编辑,Rebecca Novack 和 Nicole Butterfield。也特别感谢我们的技术评审员 Navdeep Gill,Collin Starkweather,Hariom Tatstat 和 Laura Uzcátegui。
Patrick Hall
感谢 Lisa 和 Dylan 在漫长的起草和编辑过程中的爱和支持。也感谢我过去十年在高级分析研究所,SAS 研究所,乔治·华盛顿商学院,H2O.ai,SolasAI,AI 事故数据库,NIST 和 BNH.AI 的同事们。
James Curtis
感谢我的妻子 Lindsey,她坚定的爱构成了我生活的基石。我的孩子 Isaac 和 Micah 在编写本书时没有提供太多帮助,但我仍然感激他们。最后,我必须感谢我在 SolasAI 的前同事,特别是 Nick 和 Chris,为他们提供的许多富有洞察力的讨论。
Parul Pandey
写这本书时,我非常感激丈夫 Manoj 和儿子 Agrim 的爱和支持。他们不仅鼓励我承担这项巨大任务,而且在我花数小时在书房工作时深表理解。
第一部分:AI 风险管理的理论和实践应用
第一章:当代机器学习风险管理
构建最佳的机器学习系统始于文化能力和业务流程。本章介绍了许多文化和程序方法,可以用来改进 ML 性能并保护我们组织的 ML 免受现实世界的安全性和性能问题。它还包括一个案例研究,说明了当 ML 系统在没有适当人类监督的情况下使用时会发生什么。本章讨论的方法的主要目标是创建更好的 ML 系统。这可能意味着改进体外测试数据的性能。但实际上意味着构建一旦部署在体内就能按预期运行的模型,以便我们不会损失金钱、伤害人员或造成其他伤害。
注意
In vivo是拉丁文,意为“在生活中”。我们有时会使用这个术语来表示与人类用户交互时 ML 模型在真实世界中的表现方式。In silico意思是“通过计算建模或计算机模拟”,我们将使用这个术语来描述数据科学家在开发环境中部署 ML 模型之前经常进行的测试数据。
本章以讨论当前机器学习法律和监管环境以及一些新兴的最佳实践指导开始,以帮助系统开发人员了解在安全性和性能方面的基本义务。我们还会介绍本书如何与国家标准与技术研究所(NIST)AI 风险管理框架(RMF)保持一致。因为不学习历史的人注定会重蹈覆辙,该章节还突出了 AI 事故,并讨论了为何了解 AI 事故对于 ML 系统的安全性和性能至关重要。由于许多 ML 安全问题需要超越技术规范的思考,该章节还融合了模型风险管理(MRM)、信息技术(IT)安全指导以及其他领域的实践,提出了许多改进组织内 ML 安全文化和流程的想法。该章节将以一个关于安全文化、法律后果和 AI 事故的案例研究作为结尾。
本章讨论的风险管理方法没有一种是万全之策。如果我们希望成功地管理风险,我们需要从众多可用的控制措施中选择最适合我们组织的措施。较大的组织通常能够进行比较全面的风险管理。大型组织的读者可能能够在各个部门、分部或内部职能中实施许多控制措施。较小的组织的读者将不得不审慎选择其风险管理策略。最终,技术风险管理很大程度上取决于人的行为。无论组织实施哪些风险控制措施,都需要与建立和维护 ML 系统的人员的强有力治理和政策相结合。
法律和监管环境的快照
ML 没有监管是个谬论。ML 系统可能会违法。忘记或忽视法律背景是组织对 ML 系统做的最危险的事情之一。尽管如此,ML 的法律和监管环境又复杂且快速变化。本节旨在提供重要的法律和监管法规的概览和认识。我们将首先介绍即将推出的欧盟 AI 法案。然后我们将讨论许多美国联邦法律和法规与 ML 相关,美国州和市政法律与 AI 相关,以及产品责任的基本情况,最后以对最近联邦贸易委员会(FTC)的执法行动的概述结束本节。
警告
作者不是律师,本书中没有任何法律建议。法律与 AI 的交集是一个极其复杂的主题,数据科学家和 ML 工程师无法单独处理。您可能对您所工作的 ML 系统有法律上的顾虑。如果是这样,请寻求真正的法律建议。
欧盟 AI 法案建议
欧盟已提议针对人工智能的全面法规,预计将于 2023 年通过。被称为欧盟 AI 法案(AIA),它们将禁止某些使用 AI 的方式,如扭曲人类行为、社会信用评分和实时生物识别监视。AIA 将其他使用情形视为高风险,包括在刑事司法、生物识别识别、就业筛选、关键基础设施管理、执法、基本服务、移民等领域的应用,对这些领域施加了高度的文档化、治理和风险管理责任。其他应用将被视为有限或低风险,对其制造商和运营商的合规义务较少。就像欧盟的《通用数据保护条例》(GDPR)已经改变了美国及全球公司处理数据的方式一样,欧盟的 AI 法规旨在对美国及其他国际 AI 部署产生巨大影响。无论我们是在欧盟工作与否,可能都需要开始熟悉 AIA。阅读附件,特别是定义术语和布局文件和符合性要求的附件 1 和 3-8,是了解 AIA 的最佳方式之一。
美国联邦法律和法规
由于几十年来我们在政府和经济中以各种形式使用算法,许多美国联邦法律和法规已经涉及人工智能(AI)和机器学习(ML)。这些法规通常关注算法引发的社会歧视问题,同时也涉及透明度、隐私等主题。1964 年和 1991 年的《民权法案》、《美国残疾人法案》(ADA)、《平等信贷机会法》(ECOA)、《公平信用报告法》(FCRA)和《公平住房法》(FHA)等是一些旨在防止就业、信贷借贷和住房等领域的算法歧视的联邦法律。ECOA 和 FCRA 以及它们在《B 条例》中更为详细的实施尝试增加 ML 基础信贷借贷的透明度,并保障信贷消费者的申诉权利。对于被拒绝的信贷申请,贷方应当说明拒绝的原因,即不利行动,并描述驱动决策的 ML 模型的特征。如果提供的推理或数据有误,消费者应能够申诉决策。
MRM 实践的定义部分包含在联邦储备委员会的SR 11-7 指南中,这形成了对大型美国银行进行监管审查的一部分,并为在关键金融应用中使用的机器学习的良好和可靠性表现设置了组织、文化和技术流程。本章的很大部分受到 MRM 指导的启发,因为它是经过最多次检验的机器学习风险管理框架。类似于 1996 年的《健康保险移植和责任法案》(HIPAA)和《家庭教育权利与隐私法案》(FERPA)等法律在医疗保健和学生数据隐私方面设定了严格的期望。与 GDPR 类似,HIPAA 和 FERPA 与机器学习的互动具有实质性、复杂且仍在辩论中的影响。这些甚至不是所有可能影响我们机器学习使用的美国法律,但希望这个简要列举提供了美国联邦政府认为重要而需要监管的概念。
州和市政法律
美国各州和城市也已经开始制定 AI 和 ML 的法律和法规。纽约市(NYC)的地方法规 144 号要求对自动化就业决策工具进行偏见审计,最初预计将于 2023 年 1 月生效。根据这项法律,纽约市的每家主要雇主都必须对自动化就业软件进行偏见测试,并在其网站上发布结果。华盛顿特区提议的《通过算法停止歧视法案》试图复制联邦对非歧视和透明度的期望,但适用范围更广,适用于在 DC 运营或使用许多 DC 市民数据的公司。
许多州还通过了自己的数据隐私法律。与老式的 HIPAA 和 FERPA 联邦法不同,这些州数据隐私法律通常是有意设计为部分监管 AI 和 ML 的使用。像加利福尼亚州、科罗拉多州、弗吉尼亚州等州通过的数据隐私法律提到增加透明度、减少偏见或两者兼顾,适用于自动决策系统。一些州还将生物特征数据或社交媒体纳入其监管范围。例如,伊利诺伊州的《生物信息隐私法》(BIPA)禁止许多生物特征数据的使用,并且伊州监管机构已经开始了执行行动。联邦数据隐私或 AI 法律的缺失,加上这些新的州和地方法律,使得 AI 和 ML 的合规性格局非常复杂。我们对 ML 的使用可能或可能不受到监管,或者根据系统的具体应用、行业和地理位置在不同程度上受到监管。
基本产品责任
作为消费品制造商,数据科学家和机器学习工程师有责任创建安全系统。引用最近的布鲁金斯研究所报告,“产品责任法作为解决人工智能伤害的途径”,“制造商有责任制造在合理预见的使用方式下安全的产品。如果人工智能系统在可预见的使用方式下造成伤害,原告可以主张制造商因未能认识到可能性而存在过失。” 就像汽车或电动工具制造商一样,机器学习系统的制造商也要遵守广泛的过失和安全法律标准。产品安全已经成为大量法律和经济分析的主题,但本小节将专注于最早和最简单的过失标准之一:汉德法则。以法官勒纳德·汉德命名,并在 1947 年首次提出,它为机器学习产品制造商提供了一个可行的过失和尽职调查框架。汉德法则指出,产品制造商承担了一种关怀的负担,并且在这种关怀上投入的资源应始终大于可能涉及产品的事故的成本。用代数方式表述:
更通俗地说,组织被期望按照与可预见风险相关的成本水平来应用关怀,即时间、资源或金钱。否则将可能导致法律责任。在图 1-1 中,负担是抛物线增长线,而风险或概率乘以损失是抛物线下降线。尽管这些线条与具体测量无关,但它们的抛物线形状旨在反映消除所有机器学习系统风险的最后一公里问题,并显示超过合理阈值的额外关怀会导致递减的风险回报率。

图 1-1. 汉德法则(改编自“事故法中责任替代标准的经济分析”)
注:
对技术事故的风险的相当标准定义是估计的事故发生的可能性乘以其估计的成本。更广泛地说,国际标准化组织(ISO)在企业风险管理背景下定义风险为“不确定性对目标的影响”。
尽管按照 Hand 法则准确计算数量可能太耗资源,但在设计机器学习系统时考虑到过失和责任的概念非常重要。对于给定的机器学习系统,如果事故发生的概率高,如果与系统事故相关的金钱或其他损失很大,或者两者都很大,组织需要额外投入资源来确保该系统的安全性。此外,组织应尽最大努力记录尽职调查超过估计的故障概率乘以估计的损失。
联邦贸易委员会执法
我们可能会陷入麻烦的情况是怎样的?如果你在受监管的行业工作,你可能知道你的监管者。但如果我们不知道我们的工作是否受到监管,或者如果我们越过了法律或监管的红线会有什么后果,那么我们可能需要最关注的是美国联邦贸易委员会(FTC)。FTC 广泛关注不公平、欺骗或掠夺性贸易行为,并且他们已经找到理由在三年内摧毁了至少三个知名的机器学习算法。凭借他们的新执法工具算法返还,FTC 有能力删除算法和数据,并且通常会禁止未来通过有问题的算法进行收入的生成。剑桥分析公司是第一家面临这种惩罚的公司,因为他们在 2016 年选举期间围绕欺骗性数据收集实践。Everalbum和WW,即重量观察者,也曾面临返还。
FTC 对于执行 AI 和 ML 的联邦法律一直持续关注,毫不掩饰其意图。 FTC 委员会在算法和经济正义方面撰写了漫长的论文。 他们还发布了至少两篇博客,为希望避免执行行动的公司提供了高层次的指导。 这些博客突出了组织应该采取的若干具体步骤。 例如,在“使用人工智能和算法”中,FTC 明确表示,不应误导消费者与伪装成人类的 ML 系统互动。 "责任"是“在公司使用 AI 中追求真相,公平和公平性”的另一个主题,“对自己负责,否则 FTC 将代您负责”(原作者强调)。 这种非常直接的语言对于监管者来说是不寻常的。 在“使用人工智能和算法”中,FTC 提出:“考虑如何对自己负责,以及使用独立标准或独立专业知识是否有意义,以退后一步并审视您的 AI。” 下一节介绍了我们可以使用的一些新兴独立标准,以增加责任感,制造更好的产品并减少任何潜在的法律责任。
权威最佳实践
当今数据科学大多数缺乏专业标准和许可,但一些权威指导正在逐渐出现。 ISO 正在开始概述AI 的技术标准。 确保我们的模型符合 ISO 标准将是将独立标准应用于我们的 ML 工作的一种方法。 特别是对于美国的数据科学家来说,NIST AI RMF 是一个非常重要的项目要关注。
AI RMF 的第 1 版于 2023 年 1 月发布。 框架提出了 AI 系统信任度的特征:有效性,可靠性,安全性,韧性,透明度,责任,可解释性,解释性,偏见管理和增强隐私。 然后,它在四个组织功能(映射,测量,管理和治理)中提供了可操作的指导。 映射,测量,管理和治理功能中的指导被细分为更详细的类别和子类别。 要查看这些指导类别,请查看RMF或AI RMF playbook,该书提供了更详细的建议。
注意
NIST AI 风险管理框架是改进 AI 和 ML 系统信任度的自愿工具。 AI RMF 不是法规,NIST 也不是监管机构。
为了遵循我们自己的建议,以及监管机构和权威指南的建议,并使本书更加实用,我们将指出每个章节在 第一部分 中与 AI RMF 的内容如何对应。在这段文字之后,读者将找到一个专门匹配 AI RMF 子类别的信息框。这样做的目的是让读者能够使用表格了解每个章节讨论的方法如何帮助他们遵循 AI RMF。由于在某些情况下,子类别的建议可能对机器学习从业者而言显得抽象,我们提供更加实践导向的语言,与 RMF 类别相匹配;这将有助于将 RMF 转化为实际的机器学习部署。查看信息框,看看我们如何认为 第一章 与 AI RMF 相符,并在 第一部分 的每个章节开头寻找类似的表格。
AI 事件
在很多方面,机器学习安全流程和相关模型调试的基本目标,也在 第三章 中讨论,是预防和减轻 AI 事件。在这里,我们宽泛地定义 AI 事件为系统可能造成危害的任何结果。当使用 Hand 法则作为指导时,一个 AI 事件造成的损失会增加,而操作人员采取的措施来减少这些损失会减少。
因为复杂系统趋向于失败,所以没有缺乏可以作为例子讨论的 AI 事件。AI 事件可以从令人讨厌的事情到致命的事情不等——从 购物中心安保机器人摔倒楼梯,到 自动驾驶汽车撞到行人,再到 大规模转移医疗资源 远离最需要它们的人群。如 图 1-2 所示,AI 事件大致可以分为三大类:
滥用
AI 可以被用于恶意目的,与其他 AI 系统的特定攻击和攻击无关。也许现在已经有黑客利用 AI 来增加其更一般攻击的效率和强度。未来可能会更加可怕,像自主无人机攻击和威权政权的族群分类已经在地平线上了。
攻击
研究人员已经发布了各种主要类型的攻击示例 —— 保密性、完整性和可用性攻击(有关更多信息,请参见第五章)。保密性攻击涉及从 AI 系统端点窃取训练数据或模型逻辑。完整性攻击包括通过敌对示例、逃避、冒充或毒化来对训练数据或模型结果进行敌对操作。可用性攻击可以通过更标准的拒绝服务方法、过度使用系统资源的海绵示例,或通过某些对手引起的算法歧视来拒绝向某些用户群体提供系统服务。
失败
AI 系统的故障往往涉及算法歧视、安全和性能失误、数据隐私侵犯、透明度不足或第三方系统组件问题。
AI 事件是现实存在的。就像它们产生的系统一样,AI 事件可能非常复杂。AI 事件有多种原因:故障、攻击和滥用。它们还倾向于将传统的计算机安全概念与数据隐私和算法歧视等问题融合在一起。

图 1-2. AI 事件的基本分类(改编自“当 AI 失败时该怎么办”)
2016 年的Tay 聊天机器人事件是一个富有启发性的例子。 Tay 是由微软研究部门的一些全球领先专家为增强人们对 AI 的认识而设计的最新型聊天机器人。发布仅 16 小时后——在发布 96,000 条推文后——Tay 已经演变成了一个新纳粹色情作家,并被迫关闭。 发生了什么? Twitter 用户很快就发现,Tay 的自适应学习系统很容易被毒化。 被发表在机器人上的种族主义和性内容被整合到了其训练数据中,并迅速导致了令人反感的输出。 数据毒化是一种完整性攻击,但由于其进行的背景,此攻击导致了算法歧视。 还值得注意的是,Tay 的设计者们,作为一家拥有极其充足研究资金的顶尖研究中心的世界级专家,似乎已经设置了一些防范措施。 Tay 会对某些热门问题做出预先制定的回应。 但这还远远不够,Tay 最终演变成了微软研究部门的公共安全和算法歧视事件。
以为这是个别事件?错了。最近,再次由于炒作和未能系统地考虑性能、安全性、隐私和安全风险,Tay 的许多明显失败在 Scatter Lab 发布的其李露达聊天机器人中再次重演。设计 ML 系统时,计划应与过去已知的事件进行比较,以期预防未来类似事件。这正是最近AI 事件数据库工作及相关出版物的目的所在。
AI 事件也可以成为负责任技术开发的非政治激励因素。无论好坏,有关算法歧视和数据隐私等话题的文化和政治观点可能存在广泛差异。让一个团队就伦理考虑达成一致可能非常困难。让他们致力于防止尴尬且潜在成本高昂或危险的事件可能会更容易,这应该是任何认真的数据科学团队的基本目标。AI 事件的概念是理解 ML 安全的核心;本章内容的中心主题是可以用来预防和减轻 AI 事件的文化能力和业务流程。我们将在接下来的章节深入探讨这些减轻措施,并深入研究一个真实事件以结束本章。
机器学习风险管理的文化能力
组织文化是负责任 AI 的重要方面。本节将讨论文化能力,如责任制,自己的香槟,领域专业知识以及陈旧的“快速前进,打破障碍”的格言。
组织责任制
成功缓解 ML 风险的关键是组织内对 AI 事件的真正责任制。如果当 ML 系统失败、遭到攻击或被滥用以不正当目的时,没有人的工作岗位受到影响,那么很可能这个组织中没有人真正关心 ML 的安全性和性能。除了考虑风险、应用软件质量保证(QA)技术和模型调试方法的开发人员外,组织还需要有人员或团队验证 ML 系统技术并审计相关流程。组织还需要有人负责 AI 事件响应计划。这就是为什么领先的金融机构,在其长期受监管的预测建模使用中,采用一种被称为模型风险管理的实践。MRM 模仿了联邦储备的SR 11-7 模型风险管理指南,这是在 2008 年金融危机中出现的。值得注意的是,MRM 的实施通常涉及负责任的高级管理人员和数个团队,这些团队负责模型和 ML 系统的安全性和性能。
MRM 标准的实施通常需要几个不同的团队和高层领导。以下是构成 MRM 文化支柱的关键原则之一:
书面政策和流程
制定和使用机器学习的组织规则应该明确并对所有组织利益相关者可获得。接近机器学习系统的人员应接受有关政策和流程的培训。这些规则也应进行审计,以了解何时需要更新。没有人应该声称对规则一无所知,规则应该是透明的,并且不得未经批准更改。政策和流程应包括明确的机制,用于将严重风险或问题上报给高级管理层,并可能应提出举报者流程和保护措施。
有效挑战
有效挑战要求具有改变系统能力的专家,这些专家并未构建被挑战的机器学习系统,进行验证和审计。MRM 实践通常将有效挑战分布在三个“防线”上,有良心的系统开发者构成第一防线,独立、技术娴熟且授权的技术验证人员和流程审计员分别构成第二和第三防线。
负责任的领导
组织内特定的高管应负责确保 AI 事件不会发生。这个职位通常被称为首席模型风险官(CMRO)。CMRO 的任职条件和薪酬往往与机器学习系统的表现挂钩。CMRO 角色为机器学习的安全性和性能提供了非常直接的文化检查。如果我们的老板真的关心机器学习系统的安全性和表现,那么我们也会开始关注。
激励措施
数据科学人员和管理人员必须被激励以负责任的方式实施机器学习。通常,压缩的产品时间表可能会激励先创建一个最小可行产品,而将严格的测试和修复工作放在模型生命周期的最后阶段,即部署到生产前。此外,机器学习的测试和验证团队通常会根据与机器学习开发团队相同的标准进行评估,导致了测试人员和验证人员被鼓励快速行动而非确保质量的基本不匹配。通过将时间表、绩效评估和支付激励与团队功能对齐,有助于巩固负责任的机器学习文化和风险缓解。
当然,小型或年轻组织可能无法分配一个全职员工来监控机器学习系统风险。但是,如果机器学习系统导致事件发生,有一个个人或团队应该负责,并且如果系统运行良好,则应该获得奖励。如果一个组织假设每个人都对机器学习风险和 AI 事件负责,那么实际上没有人会负责。
有效挑战文化
无论我们的组织是否准备采用成熟的 MRM 实践,我们仍然可以从 MRM 的某些方面中受益。特别是,有效挑战的文化能力可以应用于 MRM 背景之外的环境。在其核心,有效挑战意味着在整个 ML 系统开发过程中积极质疑和追问所采取的步骤。一个鼓励严肃质疑 ML 系统设计的组织文化,将更有可能开发出有效的 ML 系统或产品,并在问题爆发成有害事件之前抓住问题。需要注意的是,有效挑战不能是恶意的,必须对所有开发 ML 系统的人员平等适用,特别是所谓的“摇滚明星”工程师和数据科学家。有效挑战还应该是有结构的,例如每周会议,在这些会议中当前的设计思路会受到质疑,并且会认真考虑替代的设计选择。
多样化和经验丰富的团队
多样化的团队可以为 ML 系统的设计、开发和测试带来更广泛和以前未关联的视角。而非多样化的团队则经常不能做到这一点。许多人已经记录了数据科学家在培训或 ML 系统的结果中未考虑人口统计多样性可能导致的不幸后果。解决这类疏忽的一个潜在方案是增加 ML 团队中的人口统计多样性,从其当前令人遗憾的水平。在构建团队时,业务或其他领域的经验也很重要。领域专家在特征选择和工程以及系统输出的测试中起着关键作用。在开发 ML 系统的疯狂竞争中,领域专家的参与也可以作为安全检查。广义的数据科学家通常缺乏处理特定领域数据和结果所需的经验。误解输入数据或输出结果的含义是一个灾难的配方,可能导致在系统部署时发生 AI 事故。不幸的是,当涉及到数据科学家忽视或忽略领域专业知识重要性时,社会科学就应该特别强调。在被称为“科技对社会科学的悄然殖民”的趋势中,一些组织已经进行了令人遗憾的 ML 项目,试图取代应由训练有素的社会科学家做出的决策,或者简单地完全忽视社会科学领域专业知识的集体智慧。
亲自体验
也被称为“吃自己的狗食”,喝我们自己的香槟的做法指的是在我们自己的组织内使用我们自己的软件或产品。通常是一种预阿尔法或预贝塔测试的形式,喝我们自己的香槟可以在实际部署环境的复杂性中发现问题,这些问题在影响客户、用户或公众之前可以识别出来。由于像概念漂移、算法歧视、快捷学习和未充分规范化等严重问题在标准机器学习开发过程中很难识别,喝我们自己的香槟为机器学习系统提供了一个有限而受控的,但也是现实的测试平台。当组织雇佣了在机器学习系统部署领域具有不同人口统计和专业背景的团队,并且包括领域专家时,喝我们自己的香槟更有可能发现各种问题。喝我们自己的香槟还将经典的黄金法则引入到人工智能中。如果我们不愿意在自己身上或我们自己的组织中使用某个系统,那么我们可能不应该部署该系统。
注意
在考虑部署环境的一个重要方面是我们的机器学习系统对生态系统和地球的影响,例如:
-
机器学习模型的碳足迹
-
机器学习系统可能通过引发 AI 事件对环境造成损害的可能性
如果我们担心我们模型的环境影响,我们应该将机器学习治理与我们组织的更广泛的环境、社会和治理工作联系起来。
快速前进与破坏事物
“快速前进与破坏事物”这句口号对许多“摇滚明星”工程师和数据科学家几乎是一种宗教信仰。不幸的是,这些顶尖从业者似乎也忘记了,当他们快速前进并破坏事物时,事物就真的会被破坏。随着机器学习系统做出更多涉及自动驾驶车辆、信用、就业、大学成绩和考勤、医疗诊断和资源分配、抵押贷款、预审保释、等等高影响决策,破坏事物意味着不仅仅是有 bug 的应用程序。它可能意味着一个小组数据科学家和工程师在规模上对许多人造成了实际的伤害。参与高影响机器学习系统的设计和实施需要改变思维方式,以防止严重的性能和安全问题。从优先考虑能够推动的软件功能数量或 ML 模型的测试数据准确性,转向认识到他们工作的影响和下游风险,这是从业者必须进行的转变。
机器学习风险管理的组织流程
组织流程在确保机器学习系统安全和性能方面起着关键作用。与前一节讨论的文化能力一样,组织流程是机器学习系统可靠性的关键非技术决定因素。本节关于流程的内容首先督促从业者考虑、记录并尝试减轻其机器学习系统中已知或可预见的故障模式。然后我们进一步讨论关于 MRM 的更多内容。虽然“机器学习风险管理的文化能力”侧重于使 MRM 取得成功所必需的人和思维方式,本节将概述 MRM 在高级预测建模和机器学习系统中用于减轻风险的不同流程。虽然 MRM 是我们可以共同努力追求的一个值得的流程标准,但还有一些重要的流程控制不典型地包含在 MRM 中。我们将在本节超越传统的 MRM,并突出像对编程或双人编程以及代码部署安全权限要求等关键风险控制流程。本节将以讨论 AI 事故响应结束。无论我们在设计和实施机器学习系统时多么努力地减少伤害,我们仍然必须准备应对失败和攻击。
预测故障模式
机器学习安全和伦理专家大致同意需要思考、记录并尝试减轻机器学习系统可预见故障模式的重要性。不幸的是,他们也大多同意这是一项非平凡的任务。值得庆幸的是,近年来在这一主题上出现了新的资源和学术研究,可以帮助机器学习系统设计者以更系统化的方式预测事件。如果可以确定潜在故障的整体类别,那么加强机器学习系统以获得更好的现实世界表现和安全性将成为一项更为积极和高效的任务。在本小节中,我们将讨论一种这样的策略,以及几种用于思考未来机器学习系统中事件的额外流程。
已知的过去失败
正如在“通过分类事件预防重复的现实世界 AI 故障:AI 事故数据库”中所讨论的,我们在机器学习系统中减轻潜在 AI 事故的最有效方法之一是将我们的系统设计与过去的失败设计进行比较。就像交通专业人员调查和分类事件一样,然后利用所得结论预防相关事件并测试新技术,几位机器学习研究人员、评论员和行业组织已开始收集和分析 AI 事故,以期防止重复和相关的失败。最显著和成熟的 AI 事故库可能是AI 事故数据库。这一可搜索和互动资源允许注册用户使用关键字搜索视觉数据库,并查找有关公开记录事件的不同类型信息。
在开发 ML 系统时请参考此资源。如果类似于我们当前设计、实施或部署的系统在过去曾经引发过事件,这是我们新系统可能会引发事件的最强指标之一。如果在数据库中看到熟悉的东西,我们应该停下来,仔细思考我们正在做的事情。
想象力的失败
在没有详细背景和细节的情况下想象未来从来不容易。通常是机器学习系统运行的背景,加上意想不到或无法预知的细节,导致 AI 事件的发生。在最近的一篇研讨会论文中,《“克服 AI 注入系统开发和部署中的想象失败”》的作者提出了一些结构化方法来假设这些难以想象的未来风险。除了深思熟虑 AI 事件的“谁”(例如投资者、客户、脆弱的非用户)、“什么”(例如福祉、机会、尊严)、“何时”(例如立即、频繁地、长时间内)、“如何”(例如采取行动、改变信念)之外,他们还敦促系统设计者考虑以下内容:
-
假设系统的影响只会是有益的(并承认系统影响存在不确定性的时候)
-
系统的问题域和应用用例,而不仅仅是数学和技术
-
任何意外或令人惊讶的结果,用户互动以及对系统的响应
引起 AI 事件对组织来说是令人尴尬的,如果不是成本高昂或违法的话。AI 事件还可能伤害消费者和公众利益。然而,通过一些远见,目前已知的许多 AI 事件本可以得到缓解,甚至完全避免。在进行研究和概念化 ML 失败的尽职调查时,我们还可能发现我们的设计或系统必须完全重做。如果情况如此,可以安慰自己,系统实施或部署的延迟可能比我们的组织或公众由于发布有缺陷的系统可能遭受的损害要少。
模型风险管理流程
MRM 流程的过程方面要求对建模系统进行彻底的文档记录,对系统进行人工审核,并对系统进行持续监控。这些流程代表了美联储 SR 11-7 MRM 指导方针的大部分治理负担,由美联储和美国货币监理署监督,用于在重要消费金融应用中部署的预测模型。虽然只有大型组织才能完全接受 MRM 所提供的所有内容,但任何认真的机器学习从业者都可以从这一学科中学到一些东西。以下部分将 MRM 流程细分为更小的组成部分,以便读者可以开始考虑在其组织中使用 MRM 的方面。
风险分级
正如本章开头所述,某个 ML 系统部署的风险是可能发生的危害的概率和由此导致的可能损失的乘积的结果。在 MRM 的背景下,风险和损失的乘积有一个更正式的名字,物质性。物质性是一个强大的概念,使组织能够为 ML 系统分配现实的风险级别。更重要的是,这种风险分层允许有效分配有限的开发、验证和审计资源。当然,最高物质性应用程序应该得到最大的人工关注和审查,而最低物质性应用程序则有可能由自动机器学习(AutoML)系统处理,并进行最少的验证。因为 ML 系统的风险缓解是一个持续且昂贵的任务,所以在高、中、低风险系统之间进行适当的资源分配是有效治理的必需。
模型文档
MRM 标准还要求系统进行彻底的文档化。首先,文档化应该能够为系统利益相关者、持续的系统维护以及一定程度的事件响应负责。其次,文档化必须在各系统之间标准化,以实现最高效的审计和评审流程。文档化是确保合规性的关键所在。文档模板,如下一节列表所示,是数据科学家和工程师在标准化工作流程的后期阶段填写的文档,也是大多数文档模板和框架要求在最终模型文档中添加姓名和联系信息的地方,这样就清楚知道谁没有尽力。作为参考,以下章节列表粗略结合了 MRM 文档和欧盟《人工智能法案附件》推荐的典型部分:
-
基本信息
-
开发人员和利益相关者的名称
-
当前日期和修订表
-
模型系统概要
-
业务或价值论证
-
预期用途及用户
-
潜在危害和伦理考虑
-
-
开发数据信息
-
开发数据来源
-
数据字典
-
隐私影响评估
-
假设与限制
-
数据预处理软件实施
-
-
模型信息
-
描述经过同行评审的训练算法
-
模型规范
-
性能质量
-
假设与限制
-
用于训练算法的软件实施
-
-
测试信息
-
质量测试与整改
-
歧视测试与整改
-
安全测试与整改
-
假设与限制
-
用于测试的软件实施
-
-
部署信息
-
监控计划和机制
-
上游和下游依赖关系
-
申诉和覆盖计划和机制
-
审计计划和机制
-
变更管理计划
-
事件响应计划
-
-
参考文献(如果我们正在进行科学研究,那么我们将在格式化的参考文献中建立在巨人的肩膀上!)
当然,这些文件可能会有数百页之长,特别是对于重要性高的系统。对于较小或较年轻的组织,提议的数据表和模型卡标准也可能有所帮助,以实现这些目标。如果读者觉得为其组织撰写冗长的模型文档目前看起来不可行,那么也许这两种更简单的框架可能会起到作用。
模型监控
机器学习安全的一个主要租户是,机器学习系统在现实世界中的表现很难预测,因此必须进行监控。因此,部署系统的性能应经常进行监控,直到系统被废弃为止。系统可以监控任何数量的问题条件,最常见的是输入漂移。虽然机器学习系统的训练数据在静态快照中编码了有关系统操作环境的信息,但世界绝非静态。竞争对手可以进入市场,可以颁布新的法规,消费者口味可能会改变,以及可能会发生流行病或其他灾难。这些因素中的任何一个都可能使输入到我们的机器学习系统的实时数据偏离其训练数据的特征,从而导致性能下降甚至危险。为了避免这种不愉快的惊喜,最好的机器学习系统都会监控输入和输出分布的漂移以及质量下降,通常被称为模型衰减。虽然性能质量是最常见的监控指标,但机器学习系统也可以监控异常输入或预测、特定攻击和黑客,以及公平性特征的漂移。
模型清单
任何部署机器学习的组织都应该能够回答简单的问题,比如:
-
当前部署了多少个机器学习系统?
-
这些系统影响了多少客户或用户?
-
每个系统的负责利益相关者是谁?
MRM 通过使用模型清单实现了这一目标。模型清单是组织所有机器学习系统的精心策划和最新数据库。模型清单可以作为关键信息文档的存储库,但也应链接到监控计划和结果、审计计划和结果、重要的过去和即将进行的系统维护和变更,以及事件响应计划。
系统验证和流程审核
在传统的 MRM 实践下,机器学习系统在发布之前会经历两次主要审查。第一次审查是对系统进行技术验证,由熟练的验证人员(通常是博士级别的数据科学家)尝试揭示系统设计和实施中的问题,并与系统开发人员合作解决发现的问题。第二次审查涉及流程。审计和合规人员仔细分析系统设计、开发和部署情况,以及文档和未来计划,确保满足所有法规和内部流程要求。此外,由于机器学习系统会随时间变化和漂移,审查必须在系统经历重大更新或在约定的未来周期时进行。
读者可能又在想,他们的组织没有足够的资源进行如此广泛的审查。当然,对许多小型或年轻的组织来说,这是现实。对于几乎任何组织来说,验证和审计的关键在于拥有未开发系统的技术人员进行测试,有一个审查非技术内部和外部义务的功能,以及对重要的机器学习系统部署进行签字监督。
变更管理
像所有复杂的软件应用程序一样,机器学习系统往往包含大量不同的组件。从后端机器学习代码,到应用程序编程接口(API),再到图形用户界面(GUI),系统中任何组件的更改都可能引起其他组件的副作用。加入数据漂移、新兴数据隐私和反歧视法规等问题,以及对第三方软件的复杂依赖,使得机器学习系统的变更管理成为一个严重问题。如果我们处于任务关键的机器学习系统的规划或设计阶段,我们可能需要将变更管理作为一流的流程控制。如果没有明确的变更管理计划和资源,系统演变过程中可能出现的流程或技术错误,例如未经同意使用数据或 API 不匹配,将非常难以防止。此外,没有变更管理,这样的问题甚至可能在引发事件之前都不被察觉。
在整本书中我们将围绕 MRM 进行讨论。它是治理和管理机器学习系统中最经受考验的框架之一。当然,MRM 并非唯一可以从中获取启发来改进机器学习安全性和性能流程的地方,接下来的小节将从其他实践领域中提取经验教训。
注意
阅读 21 页的SR 11-7 模型风险管理指南是提升自己在机器学习风险管理方面技能的快速途径。阅读时特别注意文化和组织结构的重点。管理技术风险往往更多关乎人而非其他任何事物。
超越模型风险管理
从财务审计、数据隐私和软件开发的最佳实践以及 IT 安全中,可以从许多 ML 风险管理教训中汲取经验。本小节将重点介绍传统 MRM 范围之外的想法:模型审计、影响评估、申诉、覆盖、选择退出、配对或双人编程、最小权限、漏洞赏金以及事件响应,所有这些都从 ML 安全性和性能角度来看。
模型审计和评估
审计是 MRM 中常见的术语,但它的含义远不止它通常被认为的在更传统的 MRM 场景中的第三道防线。短语模型审计近年来变得日益突出。模型审计是一种官方的测试和透明度行使,重点关注跟踪某些政策、法规或法律的 ML 系统的遵从情况。模型审计通常由独立的第三方进行,审计人员与被审计组织的互动有限。关于模型审计的详细介绍,请查阅最近的论文“算法偏见和风险评估:实践经验教训”。论文“弥合 AI 责任空白:定义内部算法审计的端到端框架”提出了一个坚实的审计和评估框架,甚至包括了工作文档示例。相关术语模型评估似乎指的是一种更为非正式和合作的测试和透明度行使,可以由外部或内部团体进行。
ML 审计和评估可能侧重于偏见问题或其他严重风险,包括安全性、数据隐私危害和安全漏洞。无论它们的关注点在哪里,审计和审计人员都必须公正和透明。进行审计的人应当遵守明确的伦理或专业标准,截至 2023 年几乎不存在这样的标准。如果没有这些问责机制或约束性指南,审计可能会成为一种无效的风险管理实践,甚至是技术洗白的行为,用以认证有害的 ML 系统。尽管存在缺陷,审计是政策制定者和研究人员最受欢迎的风险控制策略之一,并被写入法律中——例如前述的纽约市地方法 144 号。
影响评估
影响评估是许多领域中用于预测和记录系统一旦实施可能引起的潜在问题的正式文档方法。由于它们在数据隐私方面的使用,影响评估开始出现在组织的机器学习政策和提议的法律中。影响评估是一种有效的方式来思考和记录机器学习系统可能造成的危害,增加了 AI 系统设计者和运营者的责任感。但影响评估单靠自身是不够的。在记住之前提出的风险和重要性定义的基础上,影响只是风险的一个因素。必须将影响与可能性结合起来形成风险度量,然后必须积极地减轻风险,其中风险最高的应用程序需要最多的监督。影响评估只是更广泛的风险管理过程的开始。像其他风险管理过程一样,它们必须以适应系统评估的节奏进行。如果一个系统变化迅速,那么它将需要更频繁的影响评估。影响评估的另一个潜在问题是当它们由也正在被评估的机器学习团队设计和实施时。在这种情况下,会有诱惑力减少评估的范围并淡化任何潜在的负面影响。影响评估是更广泛的风险管理和治理战略的重要组成部分,但必须根据特定系统的需求进行频繁进行,并可能由独立的监督专业人员进行。
申诉、覆盖和选择退出
用户或运营商申诉和覆盖大多数机器学习系统中不可避免的错误决策的方式应该内建进去。在不同学科中它有许多名称:可行的追索权、干预性、救济或不良行为通知。这可以简单到谷歌搜索栏的“举报不当预测”功能,或者复杂到向用户呈现数据和解释,并允许对明显错误的数据点或决策机制提出申诉。另一种类似的方法是选择退出,让用户与组织以传统方式进行业务,无需经过任何自动化处理。许多数据隐私法律和主要的美国消费者金融法律涉及追索权、选择退出或两者兼而有之。自动强加错误决策于许多用户是机器学习中最明显的伦理错误之一。我们不应该陷入一个如此明显且众所周知的伦理、法律和声誉陷阱中,但许多系统确实如此。这很可能是因为要使申诉、覆盖和选择退出得当,需要从设计机器学习系统的一开始就进行规划和资源投入。
- 配对和双重编程
由于它们倾向于复杂且随机,很难确定任何给定的机器学习算法实现是否正确!这就是为什么一些领先的机器学习组织将机器学习算法实现两次作为质量保证机制的原因。这种双重实现通常通过以下两种方法之一来实现:配对编程或双重编程。在配对编程方法中,两位技术专家独立编写算法。然后他们联合起来解决他们实现之间的任何差异。在双重编程中,同一实践者在非常不同的编程语言中两次实现相同的算法,例如 Python(面向对象)和 SAS(过程化)。然后他们必须调和他们两个实现之间的任何差异。任何一种方法都倾向于捕捉到许多在系统部署之前否则会被忽视的错误。配对和双重编程也可以与数据科学家原型算法的更标准的工作流程保持一致,同时专业工程师为其进行部署。但是,为了使这一切发挥作用,工程师必须自由地挑战和测试数据科学原型,而不应仅仅重新编码原型。
模型部署的安全权限
IT 安全中最小权限的概念指出,没有系统用户应该比他们需要的权限更多。最小权限是一个基本的过程控制,因为机器学习系统涉及到许多其他 IT 系统,所以往往会被机器学习的构建和所谓的“摇滚明星”数据科学家所抛弃。不幸的是,这是机器学习安全性和性能的反模式。在过度宣传的机器学习和摇滚明星数据科学的世界之外,人们早就意识到工程师无法充分测试自己的代码,并且产品组织中的其他人员——产品经理、律师或高管——应该决定何时发布软件的最终决定。
由于这些原因,部署机器学习系统所需的 IT 权限应该在 IT 组织的多个团队之间分配。在开发阶段,数据科学家和工程师确实必须保持对其开发环境的完全控制。但是,在重要的发布或审查即将到来时,将推动修复、增强或新功能推送到面向用户的产品的 IT 权限从数据科学家和工程师转移到产品经理、测试人员、律师、高管或其他人员。这样的过程控制提供了一个门槛,防止未经批准的代码被部署。
漏洞赏金
漏洞赏金是我们可以从计算机安全中借鉴的另一个概念。传统上,漏洞赏金是指组织为发现其软件问题(特别是安全漏洞)而提供奖励。由于机器学习主要是软件,我们可以为机器学习系统设立漏洞赏金。虽然我们可以利用漏洞赏金在机器学习系统中发现安全问题,但我们也可以利用它们来发现与可靠性、安全性、透明度、可解释性、可解释性或隐私相关的其他类型问题。通过漏洞赏金,我们使用货币奖励来激励社区在标准化流程中提供反馈。正如我们在本章的其他地方所强调的那样,激励在风险管理中至关重要。一般而言,风险管理工作是繁琐且资源消耗大的。如果我们希望用户为我们找出机器学习系统中的重大问题,我们需要支付他们或以其他有意义的方式奖励他们。漏洞赏金通常是公开的努力。如果这让一些组织感到不安,内部黑客马拉松活动——不同团队在机器学习系统中寻找漏洞——可能会产生一些相同的积极影响。当然,参与者越多,激励参与的效果可能越好。
AI 事故响应
根据备受尊敬的SR 11-7 指南,“即使具备熟练的建模和健壮的验证,模型风险也无法消除。”如果来自机器学习系统和模型的风险无法消除,那么这些风险最终将导致事故。事故响应在计算机安全领域已经是一个成熟的实践。类似于NIST和SANS这样的古老机构多年来一直发布计算机安全事故响应指南。考虑到机器学习技术相比于通用企业计算技术来说是一种较不成熟且风险较高的技术,高影响或任务关键的人工智能系统必须有正式的 AI 事故响应计划和实践。
正式的人工智能事故响应计划使组织能够更快速、更有效地响应不可避免的事故。事故响应也涉及到本章开头讨论的“手”规则。通过事先准备的事故响应计划,组织可能能够在 AI 事故演变为昂贵或危险的公开场面之前识别、控制和消除 AI 事故。AI 事故响应计划是减轻与 AI 相关风险的最基本和普遍的方式之一。在系统部署之前,应起草并测试事故响应计划。对于年轻或小型组织而言,无法完全实施模型风险管理,人工智能事故响应是一种经济高效且强大的 AI 风险控制方法。借鉴计算机事故响应,AI 事故响应可以分为六个阶段:
第一阶段:准备
除了为我们的组织明确定义 AI 事故外,为 AI 事故做准备还包括人员、后勤和技术计划,以应对事故发生时的情况。必须预留预算进行响应,必须制定沟通策略,并必须实施用于标准化和保留模型文档、越带频外沟通和关闭 AI 系统的技术保障。为 AI 事故做准备并排练的最佳方法之一是通过桌面讨论练习,组织关键人员通过真实的事件来进行工作。用于 AI 事故桌面讨论的好的起始问题包括以下内容:
-
谁有组织预算和权力来应对 AI 事故?
-
所涉及的 AI 系统是否可以被下线?由谁操作?成本如何?会影响到哪些上游流程?
-
需要联系哪些监管机构或执法机构?谁来联系他们?
-
需要联系哪些外部律师事务所、保险机构或公共关系公司?谁来联系他们?
-
谁将负责管理沟通?在响应者之间内部沟通?在与客户或用户之间外部沟通?
第二阶段:识别
识别是指组织发现 AI 失败、攻击或滥用的情况。识别还意味着保持对与 AI 相关的滥用保持警惕。在实践中,这往往涉及更一般的攻击识别方法,如网络入侵监控,以及更专门用于 AI 系统故障的监控,如概念漂移或算法歧视。识别阶段的最后一步通常是通知管理层、事件响应人员和其他在事件响应计划中指定的人员。
第三阶段:封锁
封锁指的是减轻事件的直接伤害。请记住,伤害很少限于事件开始的系统。与更一般的计算机事件类似,AI 事件可能会产生影响整个组织及其客户技术的网络效应。实际的封锁策略将取决于事件是由外部对手、内部失误还是 AI 系统的非标签使用或滥用引起的。必要时,封锁也是与公众进行沟通的好的起点。
第四阶段:消灭
消灭涉及纠正任何受影响的系统。例如,封锁任何受攻击系统的入侵或外泄渠道,或关闭歧视性 AI 系统,并临时替换为可信赖的基于规则的系统。消灭后,不应该再由此事件引起新的伤害。
第五阶段:恢复
恢复意味着确保所有受影响的系统恢复正常,并采取控制措施以防止将来类似事件的发生。恢复通常意味着重新培训或重新实施 AI 系统,并测试它们是否在事前文档化的水平上运行。恢复也可能需要对人员的技术或安全协议进行仔细分析,尤其是在意外故障或内部攻击的情况下。
第 6 阶段:吸取教训
吸取的教训指的是根据当前事件响应中遇到的成功和挑战,对 AI 事件响应计划进行的修正或改进。响应计划的改进可以是过程或技术导向的。
在阅读以下案例时,考虑事件响应的各个阶段,以及 AI 事件响应计划是否对 Zillow 有效地控制风险。
案例研究:Zillow iBuying 的兴起与衰落
2018 年,房地产科技公司 Zillow 进入购买房屋并翻新以获取利润的业务,即iBuying。公司相信其专有的、由机器学习驱动的Zestimate算法不仅能够吸引大量用户到其极其受欢迎的网络产品上。据彭博报道,Zillow 雇用领域专家验证他们算法生成的数字,当他们开始购买房屋时。首先,当地的房地产经纪人会为房产定价。这些数字与 Zestimate 相结合,然后由最终的专家团队审核每一份报价之前。
根据Bloomberg,Zillow 很快淘汰了这些领域专家团队,以便“更快地出价”,更倾向于更纯粹的算法方法的速度和规模。当 Zestimate 在 2021 年初未能适应迅速升温的房地产市场时,据报道,Zillow 介入增加其报价的吸引力。由于这些变化,公司开始以每季度近 1 万套房屋的速度收购房产。翻新越多意味着需要更多的员工和更多的翻新承包商,但正如彭博所述,“Zillow 的人员跟不上”。尽管人员增加了 45%并引进了“大批”承包商,但 iBuying 系统未能实现盈利。由于疫情期间的人员和供应挑战、过热的住房市场以及处理大量抵押贷款的复杂性,iBuying 项目难以管理。
2021 年 10 月,Zillow 宣布将在年底前停止出价。由于 Zillow 对快速增长的渴望以及劳动力和供应短缺,公司拥有大量待清理的房屋库存。为解决库存问题,Zillow 大多数房屋都是以亏损的价格重新上市。最终,11 月 2 日,Zillow 宣布将其库存减记超过 5 亿美元。Zillow 进入自动翻新房屋业务的尝试告终。
副作用
除了其失败的冒险带来的巨额经济损失外,Zillow 宣布将裁员约 2,000 名员工,占公司总数的四分之一。2021 年 6 月,Zillow 的股价约为每股 120 美元。截至本文撰写时,将近一年后,股价约为 40 美元,抹去了超过 300 亿美元的股票价值。(当然,整个价格下跌不能完全归咎于 iBuying 事件,但它确实影响了损失的程度。)Zillow 的 iBuying 失败根源于许多交织在一起的原因,不能脱离 2020 年爆发的疫情和颠覆房地产市场的影响。在接下来的章节中,我们将探讨如何将本章关于治理和风险管理的学习应用于 Zillow 的不幸经历。
Lessons Learned
这一章给我们关于 Zillow iBuying 传奇故事教会了什么?根据公开报道,Zillow 决定排除高重要性算法的人工审查可能是整个事件中的一个因素。我们还质疑 Zillow 是否充分考虑了其承担的财务风险,是否建立了适当的治理结构,以及 iBuying 的损失是否可能作为 AI 事件更好地处理。关于 Zillow 的这些问题我们并不了解答案,所以我们将集中讨论读者可以应用于他们自己组织的见解。
Lesson 1: 与领域专家进行验证。
在本章中,我们强调了多样化和经验丰富的团队作为负责任的 ML 开发的核心组织能力的重要性。毫无疑问,Zillow 在房地产市场拥有全球一流的内外部专业知识。然而,出于速度和自动化的考虑——有时被称为“快速推进并打破事物”或“产品速度”——Zillow 将专家排除在收购房屋过程之外,选择依赖其 Zestimate 算法。根据彭博社 2022 年 5 月的跟进报道,“据熟悉这一过程的人士称,Zillow 告诉其定价专家停止质疑算法。”这种选择可能对该冒险业务产生致命影响,特别是在快速变化、受疫情驱动的房地产市场中。无论炒作多大,AI 目前还不如人类聪明。如果我们在 ML 中做出高风险决策,请保持人类的参与。
Lesson 2: 预测故障模式。
2020 年的新冠疫情在许多领域和市场上引起了范式转变。通常假设未来会像过去的机器学习模型在许多行业可能普遍受到影响。我们不应该期望像 Zillow 这样的公司能预见到一场大流行。但正如我们所讨论的那样,严格审视我们的机器学习系统失败模式是高风险环境中机器学习的关键能力。我们不清楚 Zillow 的模型治理框架的具体细节,但 Zillow iBuying 的失败强调了有效挑战和提出难题的重要性,比如“如果未来两年进行装修的成本翻倍会怎样?”和“在六个月内为房屋支付超过两个百分点的成本会带来怎样的商业风险?”对于这样一个高风险系统,可能的失败模式应该被详细列举和记录,可能需要董事会的监督,实际的财务风险应该清楚地告知所有高级决策者。在我们的组织中,我们需要知道 ML 错误的成本,并且高级领导层愿意承担这些成本。也许 Zillow 的高级领导确实被告知了 iBuying 的财务风险,也许没有。现在我们知道的是,Zillow 冒了很大的风险,但并没有得到回报。
Lesson 3: 治理至关重要。
Zillow 的首席执行官以冒险精神而闻名,并拥有赢得重大赌注的经验。但我们并非每一次都能赢得这些赌注。因此,在进行自动决策时,尤其是在高风险场景下,我们需要管理和控制风险。SR 11-7 规定:“验证的严谨性和复杂性应与银行整体模型使用相符。” Zillow 并非银行,但彭博社 2022 年 5 月的事后分析这样表述:Zillow 试图从在线广告销售转型为经营一家规模庞大的对冲基金和建筑业务。Zillow 极大地增加了其算法的重要性,但似乎没有大幅增加对这些算法的治理。正如指出的那样,在其 iBuying 项目期间,大多数公开报道都指出 Zillow 减少了对其算法的人工监督,而非增加了监督。独立的风险功能应有权力,具有组织地位以阻止模型投入生产,并拥有适当的预算和员工水平,直接向董事会汇报,并独立于由首席执行官和首席技术官领导的业务和技术功能运作。这种组织结构在运行如期时,能够更客观地基于风险做出关于机器学习模型性能的决策,并避免业务和技术领导人评估自身系统风险时常见的利益冲突和确认偏差。我们不知道 Zillow 是否有独立的模型治理功能——在如今的消费金融之外,这种情况相当罕见。但我们知道,在损失变得惊人之前,没有任何风险或监督功能能够阻止 iBuying 项目。作为单一技术人员,协助我们的组织对其机器学习系统进行独立审计是一种可行的风险缓解实践。
第四课:AI 事件大规模发生。
Zillow 的 iBuying 行为并不好笑。金钱损失了。职业生涯也受到了影响——成千上万的员工被裁员或辞职。这看起来像是一个价值 300 亿美元的人工智能事故。从事故响应的角度来看,我们需要做好系统可能失败的准备,需要监控系统可能失败的情况,并且需要有记录和演练的计划,以进行遏制、清除和恢复。根据公开报道,Zillow 似乎意识到了它的 iBuying 问题,但其文化更注重大获成功,而不是为失败做好准备。考虑到财务损失的规模,Zillow 的遏制努力可能本可以更加有效。Zillow 通过在 2021 年 11 月宣布近 50 亿美元的减记来根除其最严重的问题。至于恢复,Zillow 的领导层已经制定了一个新的房地产超级应用计划,但考虑到本文写作时的股价,恢复还有很长的路要走,而投资者们则感到疲惫。复杂系统向失败漂移。也许在我们与机器学习大赌一把时,采用更加严谨的事故处理方法能够拯救我们的组织。
从 Zillow Offers 事件中我们可以得到的最后而且最重要的教训是这本书的核心。新兴技术总是伴随着风险出现的。早期的汽车是危险的。飞机过去经常撞山。机器学习系统可能会持续性地推动歧视性实践,存在安全和隐私风险,并且表现出乎意料。机器学习和其他新兴技术的根本区别在于,这些系统可以快速做出决策并且在巨大的规模上操作。当 Zillow 依赖其 Zestimate 算法时,它可以将购买规模扩展到每天数百套房屋。在这种情况下,结果是损失了数亿美元,股票损失更大,成千上万的工作岗位消失。当目标是资本获取、社会福利计划或者决定谁可以得到新肾时,这种大规模快速失败的现象可能会更加直接地产生破坏性影响。
资源
进一步阅读
第二章:可解释和可解释的机器学习
科学家们几个世纪以来一直在将模型拟合到数据中,以更多地了解观察到的模式。可解释的机器学习模型和 ML 模型的事后解释呈现了这种长期实践中的渐进但重要的进展。因为 ML 模型更容易学习非线性、微弱和交互信号,所以使用可解释的 ML 模型和事后解释技术的人现在也能更轻松地学习他们数据中的非线性、微弱和交互信号。
在这一章中,我们将深入探讨在进行主要可解释建模和事后解释技术之前,关于解释和说明的重要思想。我们还将涵盖事后解释的主要陷阱——其中许多可以通过同时使用可解释模型和事后解释来克服。接下来,我们将讨论可解释模型和事后解释的应用,如模型文档和对错误决策的可行回溯,这些增加了对 AI 系统的问责。本章将以讨论英国的所谓“A 级考试丑闻”作为结尾,这是一个全国性的 AI 事件,其中一个可解释性强、高度文档化的模型做出了不负责任的决策。关于可解释模型和事后解释的讨论将在第六章和第七章继续进行,我们将探讨与这些主题相关的两个深入的代码示例。
重要的解释性和可解释性思想
在深入讨论训练可解释模型和生成事后解释技术之前,我们需要讨论数学和代码背后的重要思想。我们将从确认透明性不等同于信任开始。我们可以信任我们不理解的事物,并理解我们不信任的事物。更简单地说:透明性促进理解,而理解与信任是不同的。事实上,对于建立不良 ML 系统的更深入理解实际上可能会降低信任。
人工智能的可信度由国家标准技术研究所(NIST)定义,使用各种特征:有效性、可靠性、安全性、管理偏差、安全性、弹性、透明度、责任制、可解释性、可解释性和增强隐私。透明度使得实现其他理想的可信度特征更加容易,并且使调试变得更加简单。然而,人类操作员必须采取这些额外的治理步骤。可信度通常通过测试、监控和上诉流程实现(参见第一章和第三章)。由可解释的 ML 模型和事后解释增强的透明度应该促进那些有助于使传统线性模型可信的诊断和调试。这也意味着几十年来依赖于线性模型的受监管应用,由于每个消费者的解释和一般文档要求,现在很可能对准确和透明的 ML 模型充满了机遇。
警告
是否可解释、可解释或其他透明并不意味着模型是好的或可信的。是否可解释、可解释或其他透明使人类能够对模型是否良好或可信做出高度的知情决策。
通过指定的上诉和覆盖流程对错用基于 ML 的决策的对象进行补偿,可能是提高信任的最重要的使用可解释模型和事后解释。合理上诉自动化决策的能力有时被称为可操作的追索权。对于消费者——或求职者、患者、囚犯或学生来说,要对自动化和不可解释的决策提出上诉是非常困难的。可解释的 ML 模型和事后解释技术应允许决策对象理解基于 ML 的自动化决策,这是逻辑上诉流程的第一步。一旦用户能够证明他们的输入数据或决策逻辑是错误的,ML 系统的操作者应该能够覆盖最初的错误决策。
注意
使得申诉和覆盖自动决策的机制应始终与高风险的 ML 系统一起部署。
区分解释性和解释之间的差异也很重要。在开创性研究中“解释性与人工智能中的解释能力的心理基础”,NIST 的研究人员能够使用广泛接受的人类认知概念来区分解释性和解释能力。根据 NIST 的研究人员,解释性和解释能力的类似但不完全相同的概念被定义如下:
解释
一种高层次、有意义的心理表征,将刺激置于上下文中并利用人类背景知识。一个可解释的模型应该为用户提供数据点或模型输出在上下文中的描述。
说明
一种低层次、详细的心理表征,试图描述一个复杂过程。机器学习解释是描述特定模型机制或输出形成过程的说明。
注释
解释性远比可解释性更高的门槛。实现解释性意味着将机器学习机制或结果置于背景中,这通常无法通过模型或事后解释来实现。解释性通常通过简明的文字说明、引人入胜的可视化或交互式图形用户界面来实现。解释性通常需要与适用领域内和用户互动经验中的专家以及其他跨学科专业人士合作。
现在让我们更加详细地探讨一些使机器学习模型可解释或可解释的因素。如果输入数据混乱,模型要想实现透明度就非常困难。我们从这里开始讨论。在考虑输入数据和透明度时,请考虑以下内容:
可解释的特征工程
如果我们的目标是透明度,我们应避免过于复杂的特征工程。尽管来自自编码器、主成分或高阶交互的深度特征可能使我们的模型在测试数据中表现更好,但即使我们将它们输入到一个本质上可解释的模型中,解释这些特征也将是困难的。
有意义的特征
使用特征作为某些模型函数的输入假设它与函数输出,即模型的预测相关。因为它们提高了测试数据性能,使用无意义或松散相关的特征违反了解释模型运作方式的基本假设。例如,如果除了其他特征外,我们使用眼睛颜色来预测信用违约,模型可能会收敛到某个收敛标准,我们可以计算 Shapley 增加解释(SHAP)值来评估眼睛颜色。但在这种情况下,眼睛颜色在此语境中没有真正的有效性,与信用违约也没有因果关系。虽然眼睛颜色可能作为潜在系统偏见的代理,但声称眼睛颜色解释信用违约是无效的。应用常识或更好的因果发现方法来增加模型及相关解释的有效性。
单调特征
单调性有助于解释性。在可能的情况下,使用与目标变量呈单调关系的特征。如果需要,应用像分箱这样的特征工程技术来诱导单调性。
如果我们可以依赖我们的数据用于解释和可解释性目的,那么我们可以使用添加性输入的概念、约束、线性和平滑性、原型、稀疏性和总结,以确保我们的模型尽可能透明:
添加性输入
将输入保持在 ML 模型中分离,或将它们的互动限制在一个小组内,对于透明度至关重要。传统的 ML 模型因将输入特征组合和重新组合成难以解开的高次交互而臭名昭著。与此形成鲜明对比的是,传统的线性模型以独立和添加的方式处理输入。从线性模型中得出的输出决策通常是学习模型参数和输入特征值的简单线性组合。当然,与传统的不透明 ML 模型相比,传统的线性模型的性能质量通常显著较差。
进入广义可加模型(GAM)。 GAM 保持输入特征独立,实现透明度,但也允许对每个特征行为进行任意复杂建模,极大提高性能质量。我们还将在下一节讨论 GAM 的近亲 GA2Ms 和可解释增强机器(EBMs)。它们都通过保持输入独立并允许可视化处理这些单独输入的复杂方式来工作。最终,它们保持高透明度,因为用户不必解开输入及其相互影响的复杂性,输出决策仍然是学习模型参数的简单线性组合和应用于数据输入值的某些函数。
约束
传统的不可解释 ML 模型因其灵活性而受到推崇。它们可以在训练数据中建模几乎任何信号生成函数。然而,当涉及透明度时,通常不是一个好主意去模拟观察到的响应函数的每一个细微之处。由于过拟合,结果表明,对未见数据的性能也不是一个好主意。有时,我们在训练数据中观察到的只是噪声,甚至是老式错误。因此,与其过度拟合错误数据,往往更明智的做法是应用约束,通过迫使模型遵守因果概念而增加透明度,并帮助处理未见数据的性能。
在训练 ML 模型时可以应用任意数量的约束,但其中一些最有帮助和广泛可用的包括稀疏性、单调性和交互约束。稀疏性约束通常通过 L1 正则化实现(通常减少模型中的参数或规则数量),增强对更可管理的输入参数和内部学习机制的重视。正单调性约束意味着随着模型的输入增加,其输出绝不能减少。负单调性约束确保随着模型的输入增加,其输出永远不会增加。交互约束防止 ML 模型的内部机制过度组合和重新组合过多不同特征。这些约束可以用来鼓励模型学习可解释的因果现象,而不是关注不稳健的输入、任意的非线性和可能是模型结果错误和偏差驱动因素的高度交互。
线性和平滑性
线性函数默认是单调的,可以用单一数值系数描述。平滑函数是可微的,意味着可以通过导数函数或值在任何位置进行概述。基本上,线性和平滑函数行为更良好,通常更容易概述。相比之下,无约束和任意的 ML 函数可能以不符合人类理解的方式跳跃或打结,使得需要进行的内在概述几乎不可能。
原型
原型指的是可以用于解释先前未见数据的模型输出的良好理解数据点(行)或典型特征(列)。几十年来,原型已经出现在许多 ML 中,并且已被用来解释和解读模型决策。比如使用最近邻居来解释 k-最近邻预测,或者基于质心位置对聚类进行描述—这些都是原型。原型在计算机视觉的典型复杂和不透明世界中也变得重要,比如这个看起来像那个的深度学习。
稀疏性
ML 模型,不管好坏,现在可以通过数万亿个参数来训练。然而,它们的人类操作者能否根据超过几十个参数进行推理尚存在争议。当代 ML 模型中的信息量必须被概述以保持透明。一般来说,ML 模型中的系数或规则越少,它就越稀疏和可解释。
摘要
总结可以采用多种形式,包括变量重要性度量、代理模型和其他事后机器学习方法。可视化可能是传达关于机器学习模型概述信息的最常见方式,而压缩信息的近似方法是总结的致命弱点。加性、线性、平滑和稀疏模型通常更容易总结,而事后解释过程在这些情况下更有可能有效。
达到机器学习的透明度与流行和商品化的不可解释方法相比需要额外的努力。不要担心。最近的论文“设计天然可解释的机器学习模型”以及像InterpretML、H2O和PiML等软件包提供了一个很好的框架,用于训练和解释透明模型。本章的其余部分将重点介绍最有效的技术方法和常见的陷阱,以便我们在下次设计 AI 系统时考虑。
可解释模型
几十年来,许多机器学习研究人员和从业者都努力工作在一个看似合乎逻辑的假设下,即更复杂的模型更准确。然而,正如杰出教授辛西娅·鲁丁在她影响深远的“停止解释黑盒机器学习模型进行重大决策,改用可解释模型”中指出的,“认为准确性和可解释性之间必然存在权衡是一种错误”。我们稍后将探讨关于可解释模型与事后解释之间的紧张关系。现在,让我们集中关注准确且可解释模型的强大理念。它们为高度准确的决策提供了潜力,同时改善了从机器学习中学习的人类、可操作的追索过程和监管合规性、改善安全性,以及更好地解决包括不准确性和偏见在内的各种问题。这些吸引人的特征使得可解释的机器学习模型对从业者和消费者来说都是一种普遍的双赢局面。
接下来,我们将介绍一些最流行的可解释机器学习模型类型。我们将从大类加性模型开始,包括惩罚回归、广义加性模型、广义可加性模型和解释性基础模型。我们还将涵盖决策树、约束树集成和其他选项,然后再讨论事后解释技术。
加性模型
最广泛使用的可解释机器学习模型之一是基于传统线性模型的模型:惩罚回归模型、广义加性模型(GAMs)、以及 GA2Ms(或 EBMs)。这些技术通过现代方法增强了传统建模方法,通常显著提升了性能。但它们也通过单独和累加的方式处理输入特征,或仅允许少量交互项来保持解释性高。它们还依赖直观的可视化技术来增强可解释性。
惩罚回归
我们将从惩罚回归开始讨论可解释模型。惩罚回归更新了 19 世纪的典型回归方法,使之适应 21 世纪。这类模型通常生成线性、单调响应函数,并产生类似传统线性模型的全局可解释结果,但通常具有预测性能的提升。惩罚回归模型避免了依赖假设的正规方程方法来找到模型参数,而是采用更复杂的约束和迭代优化过程,允许在使用验证数据自动选择更好模型的同时处理相关性、特征选择和异常值处理。
在图 2-1 中,我们可以看到惩罚回归模型在 80 多个训练迭代中学习了六个输入特征的最优系数。我们可以看到在优化过程开始时,所有参数值都非常小,并且随着过程的收敛而增长。这是因为通常在训练过程中会在输入特征上设置大的惩罚。这些惩罚通常会随着训练的进行而减少,以允许少量输入进入模型,或者保持模型参数人为地小,或两者兼而有之。(读者在某些情况下也可能听到惩罚回归系数被称为“缩小”的说法。)在每次迭代中,当更多特征进入模型,或系数值增长或变化时,当前模型将应用于验证数据。训练将继续进行预定义数量的迭代,或者直到验证数据的性能停止改进为止。

图 2-1. 弹性网络回归模型中选择特征的正则化路径(数字,彩色版本)
除了基于验证的早停止程序外,惩罚回归还通过迭代重新加权最小二乘(IRLS)技术、L1 和 L2 参数范数的两种类型的惩罚,以及链接函数,来处理异常值、特征选择、相关输入和非线性。
IRLS
IRLS 是一种旨在最小化异常值影响的成熟过程。它开始像传统的回归,但在第一次迭代后,IRLS 过程检查哪些输入数据行导致较大的误差。然后在拟合模型系数的后续迭代中减少这些行的权重。IRLS 持续执行这种拟合和降低权重的过程,直到模型参数收敛到稳定值。
L1 范数惩罚
也称为最小绝对收缩和选择算子(LASSO),L1 惩罚将绝对模型参数的总和最小化。这种惩罚效果使得不必要的回归参数趋向于零,并为回归模型选择一个小而代表性的特征子集,同时避免在旧的逐步特征选择中出现的潜在多重比较问题。当单独使用时,L1 惩罚已知可以提高性能质量,特别是在大量潜在相关的输入特征导致逐步特征选择失败的情况下。
L2 范数惩罚
也称为岭回归或 Tikhonov 回归,L2 惩罚最小化模型参数的平方和。L2 范数惩罚稳定模型参数,尤其是在存在相关性时。与 L1 范数惩罚不同,L2 范数惩罚不选择特征。相反,它们通过保持所有模型参数小于传统解决方案中的参数来限制每个特征对整体模型的影响。较小的参数使得任何一个特征难以主导模型,并且在模型训练过程中,相关性不会引起奇怪的行为。
链接函数
链接函数使线性模型能够处理训练数据的常见分布,例如使用 logit 链接函数将逻辑回归拟合到具有两个离散结果的输入数据中。其他常见且有用的链接函数包括 Poisson 链接函数用于计数数据或伽马分布输出的反向链接函数。将结果与其分布族和链接函数匹配,例如二项分布和逻辑回归的 logit 链接函数,对于训练可部署的模型是绝对必要的。许多机器学习模型和库在惩罚回归软件包之外不支持必要的链接函数和分布族,以解决训练数据中的基本假设。
当代惩罚回归技术通常结合以下内容:
-
基于验证的早期停止以提高泛化能力
-
处理异常值的 IRLS
-
特征选择目的的 L1 惩罚
-
用于稳健性的 L2 惩罚
-
各种目标或误差分布的链接函数
读者可以在统计学习的要素(Springer)中了解更多关于惩罚回归的内容,但对于我们的目的来说,更重要的是知道何时可以尝试惩罚回归。 惩罚回归已经广泛应用于许多研究领域,但对于具有许多特征的商业数据来说尤为适用,即使是拥有更多特征而不是行的数据集,以及具有大量相关变量的数据集。 惩罚回归模型还保留了传统线性模型的基本可解释性,所以我们在有许多相关特征或需要最大透明度时会考虑它们。 此外,了解到惩罚回归技术并不总是为回归参数创建置信区间、t统计量或p值。 这些类型的测量通常只能通过自举法获得,这可能需要额外的计算时间。 R 软件包elasticnet和glmnet由 LASSO 和弹性网回归技术的发明者维护,而H2O 广义线性模型紧密遵循原始软件的实现,同时允许大大改进的可扩展性。
对于惩罚回归模型的一个新而极其有趣的转折是超稀疏线性整数模型,或者SLIM。 SLIMs 还依赖于复杂的优化程序,其目标是创建只需要简单算术即可评估的准确模型。 SLIMs 旨在训练线性模型,这些模型可以由在高风险环境中工作的人类进行心算评估,比如医疗保健。 如果我们面临需要最高可解释性和需要现场工作人员快速评估结果的应用程序,我们就会想到 SLIMs。 另一方面,如果我们正在寻找更好的预测性能,以匹配许多不可解释的机器学习技术,但同时保持高度解释性,那么就考虑 GAMs——我们将在接下来介绍。
广义可加模型
GAM 是线性模型的一种泛化,允许为每个模型输入拟合系数和函数,而不仅仅是每个输入的系数。以这种方式训练模型允许每个输入变量以独立但非线性的方式处理。单独处理每个输入有助于保持解释性高。允许非线性改进了性能质量。传统上,GAM 依赖样条来拟合每个输入的非线性形状函数,并且大多数 GAM 实现生成了拟合的形状函数的便利图表。根据我们的监管或内部文档要求,我们可以直接在预测模型中使用形状函数以提高性能。如果不能,我们可以直接查看一些拟合的形状函数,并将其替换为更可解释的多项式、对数、三角或其他简单的输入特征函数,这也可能提高预测质量。最近,通过 神经加法模型 (NAMs) 和 GAMI-Nets 引入了 GAM 的一个有趣变化。在这些模型中,人工神经网络用于拟合形状函数。在下一节讨论可解释性增强机器时,我们将继续主题估计形状函数的 ML。Rudin Group 最近还提出了 GAM 的一个变体,其中使用单调阶跃函数作为形状函数以实现最大解释性。查看 “快速稀疏分类广义线性和加法模型” 以查看它们的实际效果。
注意
我们将使用术语 形状函数 来描述 GAM 类似模型对每个输入和交互特征应用的学习非线性关系。这些形状函数可能是传统的样条,也可以是由机器学习估算器如增强树或神经网络拟合的。
能够更改模型部分以更好地符合现实或人类直觉的能力的半官方名称是 模型编辑。可编辑性是许多可解释模型的另一个重要方面。模型经常从错误或偏见的训练数据中学习错误或偏见的概念。可解释模型使人类用户能够发现错误并予以修正。GAM 模型家族特别适合模型编辑,这是这些强大建模方法的另一个优势。读者可以在 统计学习元素 中了解更多关于 GAM 的信息。要尝试 GAM,请查看 R 的 gam 包或更实验性的 H2O 或 pyGAM 实现。
GA2M 和可解释性增强机器
GA2M 和 EBM 代表了 GAM 的直接和实质性改进。首先让我们来讨论 GA2M。GA2M 中的“2”指的是将少量成对交互作用作为模型输入的考虑。选择在 GAM 中包含少量交互项可以提升性能,而不会牺牲可解释性。交互项可以作为等高线图与通常伴随 GAM 的二维输入特征图一起绘制。一些敏锐的读者可能已经熟悉 EBM,这是 GA2M 的重要变体。在 EBM 中,每个输入特征的形状函数通过增强学习迭代地进行训练。这些响应函数可以是样条函数、决策树,甚至是决策树的增强集成。通过使用增强学习训练加法模型,通常可以获得比使用典型的 GAM 反向适配方法更准确的最终模型。
由于这些进展,GA2Ms 和 EBMs 现在在表格数据的性能质量上与不可解释的机器学习模型相媲美,甚至有所超越,同时还具备可解释性和模型编辑的明显优势。如果您的下一个项目是结构化数据,请尝试使用微软研究的InterpretML包来尝试 EBMs。EBMs 为我们讨论加性模型画上了句号。接下来我们将转向决策树,这是另一种高质量、高可解释性模型,在统计学、数据挖掘和机器学习领域都取得了成功记录。
决策树
决策树是另一种流行的预测模型。当作为单棵树使用时,它们从训练数据中学习高度可解释的流程图,并且往往比线性模型表现出更好的预测性能。当作为集成模型,例如随机森林和 GBMs 时,它们失去了可解释性,但往往成为更好的预测器。在接下来的几节中,我们将讨论单棵树模型和能保留一定可解释性的约束决策树集成。
单决策树
从技术上讲,决策树是有向图,其中每个内部节点对应一个输入特征。对于创建最高目标纯度或增强预测质量的输入特征值,有图边指向子节点。每个终端节点或叶节点代表目标特征的一个值,给定由根到叶的路径表示的输入特征的值。这些路径可以用简单的 if-then 规则进行可视化或解释。
更直观地说,决策树就是数据导出的流程图,就像我们在图 2-2 中看到的那样。决策树非常适合在结构化数据上训练可解释模型。当目标是理解输入和目标变量之间的关系,并使用布尔逻辑“if-then”时,它们非常有益。它们也非常擅长在训练数据中找到交互作用。特别是在树的顶部附近,父子关系往往指向可以用来更好理解建模目标驱动因素的特征交互,或者它们可以用作交互项以提高加法模型的预测准确性。也许它们相对于更直接的加法模型的主要优势在于,它们能够直接在字符值、缺失数据、非标准化数据和非归一化数据上进行训练。在这个大数据时代,决策树能够构建具有最小数据预处理的模型,这有助于消除机器学习模型中的额外人为误差来源。

图 2-2. 一个简单的决策树模型形成的数据导出流程图
这些优点都是决策树的利大于弊,为什么不应该使用决策树呢?首先,只有在决策树较浅时才能解释。一旦决策树的 if-then 分支超过五层,解释就变得困难。此外,它们在处理声音、图像、视频和文本等非结构化数据时性能通常较差。非结构化数据已经成为深度学习和神经网络的领域。与许多模型一样,决策树需要进行高度调整。决策树具有许多超参数或设置,必须使用人类领域知识、网格搜索或其他超参数调整方法来指定。这些方法至少是耗时的,最坏的情况下,可能会导致偏见和过拟合。单个决策树也不稳定,添加几行数据到训练或验证数据并重新训练可能会导致完全重新排列的流程图。这种不稳定性是许多机器学习模型的致命弱点。
决策树在每次创建新分支或者 if-then 规则时都会做出局部最优(或贪婪)决策。其他机器学习模型采用不同的优化策略,但最终结果都是一样的:一个不是数据集最佳模型,而是在众多可能选项中的一个良好候选模型。对于任何给定数据集来说,可能存在多个良好模型的问题至少有两个名称,良好模型的多样性和拉瑟蒙效应。(拉瑟蒙这个名字来源于一部著名电影,其中证人们对同一起谋杀案描述不同。)拉瑟蒙效应与另一个令人头痛的问题相关,即欠指定性,在这种情况下,超参数调整和基于验证数据的模型选择导致模型在测试场景中看起来很好,但在实际世界中却失败。我们如何避免决策树的这些问题呢?主要是通过训练可以看到和检查的单棵树,并确保它们的逻辑在部署时能够保持稳定。
决策树的更广泛主题有许多变体。例如,线性树模型在决策树的每个叶节点拟合线性模型,增加了标准决策树的预测能力,同时保持所有解释性。Rudin 教授的研究小组引入了最优稀疏决策树作为对不稳定性和欠指定性问题的一种响应。另一个解决这些问题的方法是基于人类领域知识的手动约束。接下来我们将讨论约束决策树集成,但如果读者准备尝试标准决策树,有许多可以尝试的包,其中 R 包rpart是最好的之一。
有约束的 XGBoost 模型
现在流行的梯度提升包 XGBoost 支持单调约束和交互约束。如前所述,用户提供的单调约束强制 XGBoost 模型保持更可解释的输入与预测之间的单调关系。交互约束可以防止 XGBoost 无限重组特征。这些软件功能将通常是一个充满不充分问题的不透明树集成模型转变为一个高度健壮的模型,能够从数据中学习,并接受专家用户提供的因果驱动约束。这些新的训练选项使人类领域专家能够使用因果知识来设置模型关系的方向,并指定哪些输入特征不应该互动,结合 XGBoost 在可扩展性和性能上的成熟记录,使其在可解释机器学习领域成为一个不容忽视的强力选择。虽然不像 EBMs 那样直接可解释,因为梯度提升机(GBMs)将特征组合和重组成一系列嵌套的 if-then 规则,但受限的 XGBoost 模型适合各种事后可解释和可视化技术。解释技术通常使从业者能够确认他们注入模型的因果知识,并理解复杂集成的内部工作方式。
可解释机器学习模型的生态系统
除了加法模型和基于树的模型之外,还有一个完整的可解释机器学习模型生态系统。其中一些模型已经为人熟知几十年,一些代表对旧方法的调整,还有一些是全新的。无论是新的还是旧的,它们都挑战了不可解释机器学习的现状——这是件好事。如果读者对可解释模型的各种选择感到惊讶,那么想象一下客户在我们能够解释 AI 系统决策驱动因素、帮助他们确认或否定关于他们业务的假设,并向用户提供解释的时候会有多么惊讶,并且还能保持高水平的预测质量。确实,有很多可解释模型的选择,肯定会有一个适合我们下一个项目的。与其要求我们的同事、客户或商业伙伴盲目信任不透明的机器学习管道,不如考虑下次使用可解释的神经网络;k-最近邻;基于规则、因果或图形的模型;甚至是稀疏矩阵分解:
因果模型
因果模型,其中因果现象以可证明的方式与某些感兴趣的预测结果相关联,通常被视为可解释性的黄金标准。鉴于我们经常可以查看定义模型工作方式的图表,并且它们是使用人类领域或因果推断技术组成的,它们几乎可以自动解释。它们也不像传统的不可解释的机器学习模型那样在训练数据中适应噪声。因果模型唯一困难的部分是找到训练它们所需的数据,或者训练过程本身。然而,因果模型的训练能力继续改善,像pyMC3这样的贝叶斯模型和dowhy这样的因果推断软件包多年来一直使从业者能够构建和训练因果模型。更近期,微软和优步公司分别发布了使用它们公司的建模库EconML和causalml进行因果推断的真实用例的因果推断教程。如果我们关心稳定的、可解释的模型,请认真关注这个领域。曾经被认为几乎不可能训练的因果模型正在逐渐进入主流。
可解释神经网络
由富国银行风险管理部门发布并完善的可解释神经网络(XNNs)证明,即使对于最不可解释的模型,稍加独创和努力也能使其变得可解释并保持高度的性能质量。可解释神经网络使用与 GAMs、GA2Ms 和 EBMs 相同的原理来实现高解释性和高预测性能,但是有所不同。像 GAMs 一样,XNNs 只是形状函数的加法组合。然而,它们在 GAMs 基础上添加了额外的索引结构。XNNs 是广义可加性索引模型(GAIMs)的一个例子,其中类似于 GAM 的形状函数由能够学习有趣的高阶交互的低投影层输入。
在 XNN 中,使用反向传播来学习变量的最佳组合(见c 在线 XNN 图)作为输入,这些变量通过子网络学习的形状函数(见在线图中的 b)以加法方式与最优权重结合,形成网络输出(见在线图中的 a)。虽然可能不是最简单的可解释模型,但 XNN 已经被改进以提高可扩展性,它们可以自动识别训练数据中的重要交互作用,并且事后解释可以用来将其预测分解为局部准确的特征贡献。最近提出的另一种有趣的透明神经网络类型在“神经添加模型:用神经网络进行可解释机器学习”中提出。NAMs 看起来与 XNN 类似,但它们放弃了试图定位交互项的底层。
k最近邻 (k-NN)
k-NN 方法使用原型或类似的数据点来进行预测。以这种方式推理不需要训练,其简单性通常吸引人类用户。如果将k设为三,对新点的推断涉及查找最接近的三个点,并从这三个点中取平均标签或模态标签作为新点的预测结果。这种逻辑在我们日常生活中很常见。以住宅房地产评估为例。通常会将一个家庭每平方英尺的价格评估为三个可比房屋每平方英尺的平均价格。当我们说“听起来像”,“感觉像”或“看起来像”时,我们可能正在使用原型数据点来推断我们生活中的事物。通过与原型的比较进行解释的概念,促使鲁丁集团采用了this-looks-like-that,这是一种新型深度学习,利用与原型的比较来解释图像分类预测。
基于规则的模型
从数据集中提取预测性的 if-then 规则是另一种长期存在的 ML 建模类型。if-then 规则的简单布尔逻辑是可解释的,只要规则的数量、规则中分支的数量和规则中的实体数量受到限制。RuleFit和skope-rules是两种流行的技术,旨在从训练数据中找到预测性和可解释性规则。基于规则的模型也是鲁丁集团的领域。在可解释和高质量的基于规则的预测器中,他们的杰出作品包括可证明最优规则列表(CORELS)和可扩展贝叶斯规则列表。鲁丁集团的这些及其他宝贵贡献的代码都可以在他们的公共代码页面上找到。
稀疏矩阵分解
将大数据矩阵分解为两个较小的矩阵是一种常见的降维和无监督学习技术。大多数较旧的矩阵分解技术将数据的原始列重新分配到数十个派生特征中,使得这些技术的结果难以解释。然而,随着在矩阵分解中引入 L1 惩罚,现在可以从大量数据的矩阵中提取新特征,其中只有少数原始列在任何新特征上具有较大的权重。通过使用sparse principal components analysis (SPCA),例如,我们可能会发现,从客户财务数据中提取新特征时,这个新特征仅由原始数据集中的债务收入比和循环账户余额特征组成。我们可以因此推断出,这个特征与消费者债务相关。或者,如果我们发现另一个新特征在收入、支付和支出方面具有较高的权重,那么我们可以将这个特征解释为与现金流相关。Nonnegative matrix factorization (NMF)给出了类似的结果,但假设训练数据只取正值。对于像术语计数和像素强度这样的非结构化数据,这种假设始终成立。因此,NMF 可用于找到文档中主题的可解释摘要,或将图像分解为可解释的子组件字典。无论我们使用 SPCA 还是 NMF,所得的提取特征可以用作可解释的摘要、可解释比较的原型、可视化的轴或模型中的特征。事实证明,就像许多可解释的监督学习模型是广义加性模型的特殊实例一样,许多无监督学习技术都是generalized low-rank models的实例,我们可以在 H2O 中尝试这些技术。
现在我们已经介绍了可解释模型的基础知识,接下来我们将讨论后事因果解释技术。在此之前,请记住,同时使用可解释模型和后事因果解释是完全可以的。可解释模型通常用于将领域知识整合到学习机制中,以解决训练数据中固有的假设或限制,或构建人类能够理解的功能形式。后事因果解释通常用于可视化和总结。虽然后事因果解释通常被讨论为提高传统不透明机器学习模型透明度的手段,但我们将在接下来的部分介绍其应用存在的许多理由。同时使用可解释模型和后事因果解释,以改进和验证彼此,可能是这两种技术的最佳普遍应用。
后事因果解释
我们将首先讨论全局和局部特征归因措施,然后转向替代模型和描述模型行为的流行类型绘图,还将触及几种无监督学习的事后解释技术。我们还将讨论事后解释的缺陷,读者在形成对解释的印象和实践时应牢记以下三点的广泛总结:
-
如果一个模型没有意义,它的解释也不会有意义。(我们无法解释无意义的东西。)
-
机器学习模型很容易变得如此复杂,以至于无法准确总结。
-
向广大用户和利益相关者传达关于机器学习系统的解释信息是困难的。
尽管存在这些困难,事后解释几乎总是必要的,以确保可解释性和透明性。即使像逻辑回归这样被认为高度透明的模型,也必须被总结,以满足透明度的监管义务。不管好坏,我们可能都无法摆脱事后解释和总结。因此,让我们尽可能使其运作良好。
警告
许多模型必须以事后方式总结才能被解释。然而,机器学习解释通常是不正确的,检查它们需要严格的测试和与基础可解释模型的比较。
特征归因和重要性
特征归因是解释机器学习模型中最核心的方面之一。特征归因方法告诉我们输入特征对模型预测的贡献有多大,无论是全局(整个数据集)还是局部(一行或几行数据)。特征归因值通常可以是正数或负数。
当我们讨论特征重要性时,我们指的是每个特征对模型预测贡献的全局度量。与特征归因不同,特征重要性值通常始终为正数。也就是说,特征重要性值衡量了一个特征对模型在数据集上整体行为的显著性贡献。另一方面,特征归因为我们提供了关于特征贡献的更详细信息。
尽管一些更成熟的全局特征重要性指标不是由局部测量的聚合产生的,但是今天通常会将局部特征归因平均(或以其他方式聚合)为全局特征重要性。我们将首先讨论新的局部特征归因方法,然后转向全局方法。
注意
全局解释总结了整个数据集或大量数据样本上的模型机制或预测。局部解释执行相同类型的总结,但适用于数据的较小段落,甚至是单行或单元数据。
“特征重要性”这个名字可能会误导。我们只是在近似地描述一个模型认为重要的内容。例如,考虑一个依赖基于梯度的方法来检测视频帧中“重要”方面的计算机视觉安全系统。如果没有适当的培训和部署规范,这样的系统将很难检测到穿着数字伪装服装的个体,因为新款数字伪装服装专门设计成能够融入各种背景,并且保持布料与不同背景之间的视觉梯度平滑和不可检测。但是,在安全应用中,检测穿着伪装服装的人难道不是最重要的事情之一吗?在本节的其余部分,请记住,“特征重要性”高度依赖于模型的理解和训练。
本地解释和特征归因
在某些应用中,确定哪些输入特征影响了特定预测是至关重要的,即测量本地特征归因。看看图 2-3 ,看看本地特征归因是如何发挥作用的。

图 2-3. 两个可解释模型的本地特征归因,适用于预测概率的第 10、50 和 90 百分位数的三个个体(数字,彩色版本)
图 2-3 展示了两种类型的本地特征归因值,分别对应两种不同模型,在信用贷款示例中针对三个不同客户的应用。第一个客户处于违约概率的第 10 百分位数,他们可能会接受提供的信贷产品。第二个客户处于第 50 百分位数,不太可能接受提供的产品。第三个客户处于违约概率的第 90 百分位数,并且是一个极高风险申请人的例子。总结的两个模型分别是惩罚的广义线性模型(GLM)和单调约束的 GBM。由于这两个模型都具有相对简单的结构,对于手头的问题是有意义的,我们在处理关于事后解释的开场白中提出的警告时做得不错。这些解释应该是可信的,并且足够简单,能够准确地总结。
注意
使解释更具可解释性的一个实际方法是将它们与某些有意义的基准进行比较。这就是为什么我们将我们的特征归因值与 Pearson 相关性进行比较,并将我们的部分依赖和个体条件期望(ICE)值与平均模型预测进行比较。这应该使图表的观看者能够将更抽象的解释值与更容易理解的基准值进行比较。
我们如何总结模型的本地行为?对于惩罚 GLM 模型,我们将模型系数乘以每个申请人输入特征的值。对于 GBM,我们应用 SHAP。这两种本地特征归因技术都是加法的并且在本地精确——意味着它们总结到模型预测值。它们都是从一个偏移值计算得出,GLM 截距或 SHAP 截距,这些值在数值上相似但并不相等(这在图 2-3 中未考虑)。并且这两个值可以在相同的空间中生成:无论是对数几率还是预测概率,取决于计算的方式。
绘制的值告诉我们什么?对于概率违约率排名为第 10 百分位的低风险申请人,我们可以看到他们的最新账单金额BILL_AMT1非常有利,并且推动了他们的预测向下。同一客户的 SHAP 值讲述了稍微不同的故事,但 GBM 是在不同的特征集上训练的。SHAP 值描述了申请人在所有考虑的属性上都是较低风险的。对于第 50 百分位的申请人,我们看到大多数本地特征归因值都保持接近它们各自的截距,并且对于高风险申请人,几乎所有的本地特征归因值都是正值,推动了预测值的增加。两个模型似乎都认为是申请人最近的付款状况(PAY_0,PAY_2和PAY_3)在推动风险方面起到了作用,而 GBM 和 SHAP 也专注于付款金额信息。
这些仅是本地特征归因的两种类型,我们将讨论许多其他类型。但这个小例子可能会引起一些问题,如果我们在继续之前不加以解释的话,这些问题可能会困扰读者。首先,生成解释并不意味着这些模型就是好模型;这只是意味着我们可以更明智地决定这些模型是否良好。其次,不同的模型对相同数据行给出不同的解释并不罕见。但仅仅因为它常见,并不意味着它就是正确的。这不是我们应该接受并跳过的事情。虽然在图 2-3 中的模型在操作相同特征时似乎表现出了足够的一致性,但这很遗憾,这只是后续解释的最佳案例,因为我们选择了相对简单的模型,并确保了 GLM 系数的符号和 GBM 的单调约束方向与领域专业知识一致。对于训练在数百个或更多相关特征上的复杂、无法解释的模型,我们可能会看到模型解释之间的一致性大大降低,这应该引起警觉。
不同模型在相同数据行上产生相似解释的概念被称为一致性。在高风险应用中,一致性是一个合理的目标,以增强对结果的信任和多个重要决策系统之间的一致性。
正如读者可能已经开始注意到的那样,事后解释是复杂而充满风险的,这就是为什么我们建议将这些技术与可解释模型配对使用,这样模型可以用来检查解释,反之亦然。尽管如此,我们仍然推进到主要的局部解释技术概述——反事实、基于梯度的、遮挡、原型、SHAP 值等等:
反事实
反事实解释告诉我们,改变输入特征的值以改变模型预测结果所需的值。当通过某个标准量改变输入变量时,预测的摆动越大,从反事实的角度来衡量,该特征就越重要。更多详情,请查看克里斯托夫·莫尔纳尔的可解释机器学习中的“反事实解释”第 9.3 节。要尝试反事实解释,请查看微软研究的“DiCE: 机器学习分类器的多样反事实解释”。
基于梯度的特征归因
将梯度视为复杂机器学习函数每个小部分的回归系数。在深度学习中,基于梯度的局部解释方法很常见。当用于图像或文本数据时,梯度通常可以叠加在输入图像和文本上,创建高度视觉化的解释,描绘如果改变输入的哪些部分会对模型输出产生最大变化。据说对这一想法的各种调整会导致改进的解释,例如integrated gradients、layer-wise relevance propagation、deeplift和Grad-CAM。关于基于梯度的归因方法的优秀且高度技术性的审查,请参见安科纳等人的“Towards Better Understanding of Gradient-based Attribution Methods for Deep Neural Networks”。要查看这些技术可能出现的问题,请参见“Sanity Checks for Saliency Maps”。在我们训练深度学习模型并比较各种归因技术的第九章中,我们将回到这些想法。
遮挡
遮蔽(occlusion)是一种简单而强大的概念,即从模型预测中移除特征并跟踪结果的变化。大的变化可能意味着该特征很重要,小的变化可能意味着它不那么重要。遮蔽是 SHAP、leave-one-feature-out(LOFO)等许多解释方法的基础,包括计算机视觉和自然语言处理中的许多方法。当梯度不可用时,遮蔽可以用于生成复杂模型的解释。当然,从数学上讲,从模型中移除输入并生成相关解释需要非常谨慎。要了解遮蔽和特征移除技术的权威评估,请参阅 Covert、Lundberg 和 Lee 的《通过移除来解释:模型解释的统一框架》,其中介绍了可以追溯到遮蔽和特征移除的 25 种解释方法。
原型
原型是数据的实例,极其代表大量数据。原型用于通过总结和比较来解释。一种常见的原型是k-means(或其他)聚类中心。这些原型是类似数据群体的平均表示。它们可以根据距离和实际相似性与其所在群体内部和其他群体中的其他点进行比较。现实世界的数据通常非常异质化,很难找到能够良好代表整个数据集的原型。批评是那些不能很好地被原型表示的数据点。原型和批评共同构成了一组点,可以用于总结和比较,从而更好地理解数据集和机器学习模型。此外,几种 ML 模型,如k-NN 和 this-looks-like-that 深度学习,都基于原型的概念,从而增强了它们的整体可解释性。要了解更多关于原型的信息,请查阅 Molnar 的原型和批评章节。
还有各种其他的局部解释技术。读者可能听说过treeinterpreter或eli5,它们为决策树集成生成局部准确的加法归因值。Alethia为修正线性单元(ReLU)神经网络提供模型摘要和局部推理。
接下来,我们将专门讨论沙普利值,这是数据科学家可用的最受欢迎和严谨的本地解释类型之一。在继续之前,我们再次提醒读者,这些事后解释技术,包括 SHAP,并非魔法。虽然理解哪些特征影响 ML 模型决策的能力是一项令人难以置信的突破,但有大量文献指出这些技术存在问题。要充分利用它们,要以冷静和科学的态度对待它们。做实验。使用可解释的模型和模拟数据来评估解释质量和有效性。我们选择的解释技术在随机数据上是否提供令人信服的解释?(如果是,那就不好了。)在数据轻微扰动时,该技术是否提供稳定的解释?(通常是好事。)生活中没有完美的东西,包括本地事后解释在内。
沙普利值
沙普利值是由诺贝尔经济学奖得主和数学家劳埃德·沙普利创建的。沙普利添加解释(SHAP)统一了像 LIME、LOFO、treeinterpreter、deeplift 等方法,以生成准确的本地特征重要性值,并且可以聚合或可视化以创建一致的全局解释。除了他们自己的 Python 包SHAP,以及各种 R 包,SHAP 在像 H2O、LightGBM 和 XGBoost 这样的流行机器学习软件框架中得到支持。
SHAP 的起始方式与许多其他解释技术相同,提出了直观的问题:如果没有这个特征,这一行的模型预测会是什么?那么 SHAP 与其他类型的本地解释有何不同?确切地说,在典型的 ML 模型有如此多复杂交互的系统中,必须使用不包括感兴趣特征的所有可能输入集的平均值来回答这个简单问题。这些不同的输入组称为联盟。对于一个简单的包含 20 列的数据集来说,这意味着平均需要考虑大约五十万个不同的联盟上的模型预测。现在,对我们数据集中的每个预测重复这个删除和平均的过程,我们可以看到为什么 SHAP 比大多数其他本地特征归因方法考虑了更多信息。
SHAP 有很多不同的变种,但最流行的是 Kernel SHAP、Deep SHAP 和 Tree SHAP。其中,Tree SHAP 较少使用近似,而 Kernel 和 Deep SHAP 更多使用近似。Kernel SHAP 的优势在于可以用于任何类型的模型,即 模型无关。它就像本地可解释模型无关解释(LIME)结合联盟博弈理论方法。然而,对于超过少数输入,Kernel SHAP 经常需要不可持续的近似来达到可接受的运行时间。Kernel SHAP 还需要指定 背景数据,或者在计算解释过程中使用的数据,这对最终的解释值有很大影响。Deep SHAP 也依赖于近似,并且可能不如更容易计算的基于梯度的解释适用于手头的模型和数据集。另一方面,Tree SHAP 更快且更精确。但正如其名称所示,它只适用于基于树的模型。
注意
许多解释技术依赖于“背景数据”,这是与被解释的观测数据分开的数据,用于支持解释的计算。例如,当我们计算 SHAP 值时,我们通过从数据中移除特征来形成联盟。当我们在这个联盟上评估模型时,我们通过从背景数据中抽样来替换缺失值。背景数据可以对解释产生很大影响,必须谨慎选择,以避免与解释技术的统计假设冲突,并为解释提供正确的上下文。
数据科学家在 Tree SHAP 中通常容易犯错误的两个主要领域是解释 SHAP 本身和未能理解技术不同参数化中固有的假设。对于解释,让我们从认识 SHAP 作为平均模型预测的偏移开始。SHAP 值是相对于该偏移计算的,较大的 SHAP 值意味着该特征导致模型预测与平均预测有显著偏离。较小的 SHAP 值意味着该特征不会使模型预测太远离平均预测。我们经常倾向于从 SHAP 值中读取比实际存在的更多信息。我们倾向于从 SHAP 值中寻找因果或反事实逻辑,但这是不可能的。SHAP 值是特征对模型预测贡献的加权平均,跨大量联盟。它们不提供因果或反事实解释,如果我们希望它们有任何意义,底层模型也必须有意义。
注意
SHAP 值可以解释为与某个输入特征值相关的模型结果偏离平均预测的差异。
Tree SHAP 还要求用户进行权衡。根据每个联合中缺失特征的填充方式(扰动方法),我们在解释的哲学和不同的缺陷之间进行选择。
如果没有显式传递背景数据,Tree SHAP 的默认设置将使用树路径依赖扰动,该扰动使用了树的每条路径上经过的训练示例数来近似背景数据分布。如果向 Tree SHAP 提供了背景数据,则从该数据中采样以填充缺失的特征值,这称为干预性特征扰动。选择背景数据集的额外灵活性使得解释更加精确,但即使对于经验丰富的实践者而言,选择合适的背景数据集也可能是一个复杂的任务。我们将在第六章详细讨论选择适当的背景数据集及其可能产生的影响。
除了增加的复杂性外,干预性特征扰动的主要缺点是它们会产生不现实的数据实例。这意味着当我们评估某个特征的归因时,我们可能是在一堆永远不会在真实世界中观察到的假观察中进行评估。另一方面,干预允许我们避开对相关特征的担忧。相比之下,树路径依赖特征扰动对相关特征更为敏感,但它们试图只考虑现实中可能存在的数据点。
警告
由于相关性和信息过载的一般问题,良好的解释通常要求基础模型在较少数量的与建模目标直接相关且不相关的特征上进行训练。正如优秀论文“真实于模型还是真实于数据?”的作者所说,包括 SHAP 的创始人 Scott Lundberg:“目前,特征归因的最佳情况是在特征起初是独立的情况下进行扰动。”
这些假设和限制的网状结构意味着即使在使用 Tree SHAP 时,我们仍然必须谨慎和深思熟虑。不过我们可以简化工作。相关性是许多可解释模型和事后解释技术的敌人,SHAP 也不例外。作者喜欢从不具有严重多重共线性问题的合理数量的输入特征开始。在好的情况下,我们可以使用因果发现方法找到这些特征。然后,我们会使用领域知识在 XGBoost 中应用单调约束到输入特征上。对于一般的特征重要性目的,我们会使用带有tree_path_dependent特征扰动的 Tree SHAP。对于像信用评分这样的应用,其适当的背景是由背景数据和interventional SHAP 值定义的。例如,美国有关信用拒绝解释生成的某些监管评论建议我们“确定申请人的分数远低于每个因素的平均分数的因素”,这意味着我们的背景数据集应该由刚刚超过最低及格分数的申请人组成。
本地解释和特征重要性的关键应用
本地特征归因值的最关键应用可能是满足监管要求。目前美国的主要要求是使用不良行动通知来解释信用拒绝。不良行动报告流程的关键技术组成部分是原因代码。原因代码是模型预测的纯文本解释,用模型的输入特征描述。它们是本地特征归因的进一步步骤,其中原始的本地特征归因值与产品可能被拒绝的原因匹配。消费者应该能够查看其负面预测的原因代码,并在数据输入或决策因素明显错误时按规定的申诉流程进行申诉。
不良行为报告是更高层次概念的一个具体实例,该概念被称为可操作的救济,其中透明的模型决策基于用户可以控制的因素,并且可以由模型用户上诉或被模型操作者覆盖。许多即将出台和提议的法规,如加利福尼亚州、华盛顿特区和欧盟的法规,可能会引入类似的解释或救济要求。在面对监管审查时,或者只是在为其他人类做重要决策时,我们希望我们的解释尽可能准确、一致和可解释。虽然我们期望局部特征归因将成为生成所需原始数据的最方便技术工具之一,但当我们将局部特征归因与可解释模型和其他类型的解释结合使用时,我们会得到最佳的解释,正如本章后续部分所述。
全局特征重要性
全局特征重要性方法量化了复杂机器学习模型在整个数据集上每个输入特征对预测的全局贡献,而不仅仅是单个数据点或行的贡献。全局特征重要性测量有时能够揭示训练好的机器学习函数中变量推动方向的平均情况,但有时则不然。在最基本的情况下,它们仅仅陈述了某个特征与响应的关系幅度相对于其他输入特征的大小。了解这些信息几乎从未有坏处,而且由于大多数全局特征重要性测量方法都是较旧的方法,因此模型验证团队通常会预期这些信息。图 2-4 提供了特征重要性图的示例,其中我们比较了两个模型的全局特征重要性。

图 2-4. 两个可解释模型的全局特征重要性与皮尔逊相关性的比较(数字版,彩色版)
像这样的图表帮助我们回答以下问题:
-
某一特征重要性排序是否比另一种更合理?
-
这个图反映了我们从训练数据中应该学到的模式吗?
-
模型是否过于强调某一个或两个特征?
全局特征重要性是进行基本检查的一种直接方法。在图 2-4 中,我们将特征重要性与皮尔逊相关性进行比较,以基本了解哪些特征应该是重要的。在皮尔逊相关性和两个模型之间,我们可以看到大家都认为PAY_0是最重要的特征。然而,GLM 几乎将其决策重要性全部放在了PAY_0上,而 GBM 则在更大的输入集合上分散了重要性。当模型过分强调一个特征时,就像图 2-4 中的 GLM 那样,如果最重要特征的分布漂移,这可能使它们在新数据中不稳定,并且容易进行对抗性模型操纵。对于图 2-4 中的 GLM,恶意行为者只需改变单个特征PAY_0的值,就能极大地改变模型的预测结果。
全局特征重要性度量可以通过多种方式计算。许多数据科学家在学习决策树时首次接触特征重要性。决策树的一种常见特征重要性方法是根据某个特定特征在每个分裂中变化的分裂标准总和。例如,如果决策树(或树集合)被训练为最大化每个分裂的信息增益,那么分配给某个输入特征的特征重要性就是该特征在树(们)中每次使用时相关的总信息增益。基于扰动的特征重要性是另一种常见的特征重要性测量方法,它是一种与模型无关的技术,这意味着几乎可以用于所有类型的 ML 模型。在基于扰动的特征重要性中,会对感兴趣的输入特征进行洗牌(随机排序),并进行预测。通常是在洗牌感兴趣特征之前和之后的某些原始分数(通常是模型预测或类似均方误差(MSE)的东西)的差异即为特征重要性。另一种类似的方法被称为留一特征法(LOFO,或留一协变量法,LOCO)。在 LOFO 方法中,某个特征从模型的训练或预测中被某种方式移除——例如通过重新训练时不包含该特征并进行预测,或通过将特征设置为缺失并进行预测。在具有感兴趣特征和不具有感兴趣特征的模型之间相关得分的差异被视为 LOFO 重要性。
虽然排列和 LOFO 通常用于衡量预测差异或准确性或误差分数的差异,但它们的优势在于能够估计特征对模型相关任何事物的影响。例如,可以很容易地计算基于排列或 LOFO 的对公平度量的贡献,从而帮助我们洞察到哪些具体特征正在导致任何检测到的社会偏见。这一模式同样适用于关于模型的任何数量的感兴趣的测量标准——如误差函数、安全性、隐私等等。
注意
类似扰动特征重要性和 LOFO 的技术可以用于估计除了模型预测之外的许多数量的贡献。
由于这些技术已经得到很好的确认,我们可以找到大量相关的信息和软件包。关于基于分割的特征重要性的深入讨论,请查看《数据挖掘导论》(Pearson)的第三章。《统计学习的要素》(Elements of Statistical Learning)的第 10.13.1 节介绍了基于分割的特征重要性,而第 15.3.2 节则简要介绍了随机森林背景下基于排列的特征重要性。R 包vip提供了大量变量重要性图,我们也可以尝试 Python 包lofo-importance进行 LOFO 分析。当然,大多数全局特征重要性技术都有其缺点和弱点。基于分割的特征重要性存在严重的一致性问题,而像大多数事后可解释 AI(XAI)一样,基于排列和 LOFO 的方法也会因为相关性而导致我们偏离正确方向。文章“没有免费的变量重要性”详细讨论了与全局特征重要性有关的有时排除问题。但是,正如本章中多次重复的那样,具有合理数量的非相关和逻辑输入的受限模型将帮助我们避免全局特征重要性的最严重问题。
SHAP 在全局特征重要性中也发挥了作用。SHAP 本质上是一种局部特征归因方法,但可以进行聚合和可视化,以创建全局特征重要性信息。与传统特征重要性措施相比,SHAP 提供的许多优势中,其解释可能是最重要的。使用基于分割、置换和 LOFO 的特征重要性时,我们通常只看到输入特征重要性的相对顺序,也许会对特征如何实际贡献于模型预测有一些定性概念。通过 SHAP 值,我们可以计算整个数据集中特征归因的平均绝对值,这种特征重要性测量与单个观察结果上的模型预测有着清晰和定量的关系。SHAP 还为特征重要性提供了许多粒度级别。虽然 SHAP 可以直接聚合成特征重要性值,但这一过程可能会平均掉重要的局部信息。SHAP 提供了从最局部级别(单个行)到全局级别的特征重要性值的选项。例如,聚合 SHAP 跨重要部分(如美国各州或不同性别),或使用 SHAP 软件包中的众多可视化工具,可以提供比单一平均绝对值更具信息性和代表性的特征重要性视图。与置换和 LOFO 特征重要性一样,SHAP 还可用于估计除了模型预测之外的重要性量。它能够估计对模型错误和公平性度量(如人口统计平等)的贡献。
这就结束了我们关于特征重要性的讨论。无论是全局还是局部,特征重要性可能是我们在构建模型时首先遇到的后验 XAI 技术。正如本节所示,特征重要性远不止于条形图或运行 SHAP。要在特征重要性方面取得最佳结果,我们必须熟悉许多方法的优缺点。接下来,我们将介绍替代模型——另一种引人注目的解释方法,但也需要深思熟虑。
替代模型
替代模型是复杂模型的简单模型。如果我们能构建一个简单且可解释的模型来代替更复杂的模型,我们可以利用替代模型的可解释特性来解释、总结、描述或调试更复杂的模型。替代模型通常是模型无关的。我们几乎可以将它们用于任何机器学习模型。替代模型的问题在于,它们大多是一种行业技巧,几乎没有数学上的保证能够真正代表它们试图总结的更复杂模型。这意味着在使用替代模型时,我们必须小心,并至少要检查它们是否是准确且稳定地代表了它们试图总结的更复杂模型。在实践中,这通常意味着在许多不同的数据分区上查看不同类型的准确性和误差测量,以确保对更复杂模型预测的忠实度高,并且在新数据中保持高并在交叉验证期间保持稳定。替代模型还有许多名称。读者可能听说过模型压缩、模型蒸馏或模型提取。所有这些要么是替代建模技术,要么与之密切相关。与特征重要性类似,还有许多不同类型的替代模型。在接下来的部分中,我们将首先介绍决策树替代模型,这些模型通常用于构建全局解释,然后过渡到 LIME 和 anchors,这些模型通常用于生成局部解释。
决策树替代
决策树替代模型通常是通过训练决策树使用复杂模型的原始输入和预测结果来创建的。在替代模型中显示的特征重要性、趋势和交互作用被认为是复杂模型内部机制的指示。没有理论保证简单的替代模型高度代表更复杂的模型。但是,由于决策树的结构,这些替代模型创建了非常可解释的流程图,显示了更复杂模型的决策过程,正如在图 2-5 中可见。有关训练决策树替代模型的规定方法,例如在“从训练网络中提取树结构表示”和“通过模型提取实现可解释性”中探讨的方法。

图 2-5. 决策树替代模型为单调梯度提升机创建了一个流程图
注
当它们创建更复杂模型的流程图时,决策树替代模型可以是非常可解释的。
在实践中,通常可以通过像对数损失、均方根误差(RMSE)或 R²这样的度量指标来衡量代理树预测与数据分区中更复杂模型预测的保真度,并通过交叉验证来衡量这些预测的稳定性。如果代理决策树未能提供与更复杂模型相比的高保真度,可以考虑更复杂的可解释模型,如 EBMs 或 XNNs,作为代理。
图 2-5 中的代理模型是在与其要总结的更复杂的 GBM 相同的输入上训练的,但是与训练原始指示支付违约的目标不同,它是在 GBM 的预测上进行训练的。在解释这棵树时,被使用得更多或更频繁的特征被认为在解释 GBM 时更重要。在 GBM 中,相互位于上下的特征可能有强烈的相互作用,而本章还讨论了其他技术,如可解释性增强机器和偏依赖与 ICE 的比较,可以用来确认训练数据或 GBM 模型中存在这些相互作用。
注意
决策树代理可以用来寻找与线性模型或 LIMEs 中使用的交互作用。EBMs 和偏依赖与 ICE 之间的差异也可以用来在数据和模型中找到交互作用。
树中的决策路径也可以用来理解更复杂的 GBM 如何做出决策。从树的根节点到树底部的平均预测的决策路径追踪,我们可以看到,那些最近(PAY_0)和次近(PAY_2)还款状态良好,并且第五次最近的支付金额(PAY_AMT5)较大的客户,根据原始模型,最有可能不会有未来的违约问题。那些最近和第五最近还款状态不利的客户,似乎最可能有未来的支付问题。(PAY_3的分割显示了大量的噪音,这里不进行解释。)在这两种情况下,GBM 似乎在考虑最近和过去的还款行为来做出关于未来支付的决策。这种预测行为是合乎逻辑的,但在可能的情况下应通过其他手段确认。与大多数代理模型一样,决策树代理是有用且高度可解释的,但不能单独用于重要的解释或解释任务。
线性模型和局部可解释的模型无关解释
LIME 是最早、最著名且最受批评的事后解释技术之一。正如其名字所示,它通常用于生成局部解释,方法是将线性模型拟合到更复杂模型预测的某个小区域。虽然这是其最常见的用法,但这是该技术的简化视角。
当首次在 2016 年的文章“‘为什么要相信你?’解释任何分类器的预测”中介绍时,LIME 被提出作为一个具有几个令人钦佩特质的框架。其中最吸引人的特性之一是对局部解释的稀疏性要求。如果我们的模型有一千个特征,我们应用 SHAP,我们将得到每个预测的一千个 SHAP 值。即使 SHAP 对我们的数据和模型完美,我们每次想解释一个预测时仍需整理一千个值。LIME 框架通过要求生成的解释是稀疏的来规避了这个问题,这意味着它们重点关注少数几个局部重要特征,而不是模型中包含的所有特征。
注意
LIME 值可以解释为 LIME 预测与相关输入特征值所归因的 LIME 截距之间的差异。
LIME 框架的其余部分指定了将可解释的替代模型拟合到另一个模型预测的加权局部区域。这是对 LIME 框架的更忠实的描述——一个带有罚项以诱导稀疏性的局部加权可解释替代模型,适用于某个任意的更复杂模型的预测。这些思想是有用且相当合理的。
警告
始终确保 LIME 通过适当的拟合统计和可视化来很好地拟合基础响应函数,并且局部模型截距未解释某个给定预测中驱动最显著现象。
正是 LIME 的流行实现让经验不足的用户陷入麻烦,并且带来安全问题。对于表格数据,软件包lime要求用户选择要解释的行,基于指定的输入数据集生成相对简单的数据样本,通过用户选择的行对样本进行加权,将加权样本与更复杂模型在样本上的预测进行 LASSO 回归拟合,最后使用 LASSO 回归系数为用户指定的行生成解释。在这个实现中存在许多潜在问题:
-
对于实时解释而言,采样是一个问题,因为它需要数据生成并在评分管道中拟合模型,并且还会使用户遭受可能改变解释的数据毒化攻击的风险。
-
生成的 LIME 样本可能包含大量超出范围数据,可能导致不现实的局部特征重要性值。
-
局部特征重要性值是从局部 GLM 截距偏移而来的,有时这个截距可以解释最重要的局部现象。
-
选定预测局部区域内的极端非线性和高度交互可能会导致 LIME 完全失败。
因为 LIME 可以用于几乎任何类型的机器学习模型来生成稀疏解释,所以如果我们愿意耐心地思考 LIME 的过程,它仍然可以是我们工具箱中的好工具。如果我们需要使用 LIME,我们应该绘制 LIME 预测与我们更复杂的模型预测之间的图,并用 RMSE、R²或类似方法分析它们。我们应该注意 LIME 截距,并确保它不是单独解释我们的预测,从而使实际的 LIME 值变得无用。为了增加 LIME 的准确性,尝试在离散化的输入特征和手动构建的交互上应用 LIME(我们可以使用决策树替代模型来猜测这些交互)。使用交叉验证来估计局部特征贡献值的标准偏差甚至置信区间。请记住,局部线性模型的拟合不佳或不准确本身就具有信息性,通常表明预测区域内的极端非线性或高度交互。
Anchors 和规则
在 LIME 之后,可能有一些教训在心中,同一组研究人员发布了另一种模型无关的局部后处理解释技术,名为 anchors。Anchors 生成高保真度的简明语言规则集,用于描述机器学习模型预测,特别关注于找到该预测最重要的特征。读者可以在“Anchors: High-Precision Model-Agnostic Explanations”和软件包anchor中了解更多关于 anchors 的信息。虽然 anchors 是一种有文档记录的技术,具有其优点和缺点,但它只是使用基于规则的模型作为替代模型的一个特殊实例。正如本章的第一部分讨论的那样,基于规则的模型对非线性和交互有良好的学习能力,同时仍然普遍可解释。以前突出显示的许多基于规则的模型可以作为替代模型进行评估。
模型性能图
除了特征重要性和替代模型之外,部分依赖(partial dependence)、个体条件期望(individual conditional expectation)以及累积局部效应(ALE)图已经流行起来,用于描述训练模型关于输入特征的行为。在本节中,我们将讨论部分依赖和 ICE,以及部分依赖真正应该只与 ICE 一起使用,并讨论 ALE 作为部分依赖的更现代替代品。
部分依赖和个体条件期望
部分依赖图显示了我们基于感兴趣的一个或两个输入特征的值的机器学习响应函数的估计平均方式,同时平均其他所有输入特征的效果。记住平均化部分。我们将回到这一点。部分依赖图可以展示复杂机器学习模型中的非线性、非单调性和双向交互,并且可以用来验证在单调约束下训练的响应函数的单调性。部分依赖与树集成一起在统计学习要素第 10.13 节中引入。ICE 图是部分依赖图的一个更新、局部且较少为人知的适应。它们描述了当改变一个特征时模型如何为数据的单个行为。ICE 与部分依赖很好地配对在同一图中,以提供更多局部信息,以增补部分依赖提供的更全局信息。ICE 图首次在论文“窥探黑匣子内部:通过个体条件期望图可视化统计学习”中引入。有许多软件包供我们尝试部分依赖和 ICE。对于 Python 用户,请查看PDPbox和PyCEbox。对于 R 用户,有pdp和ICEbox软件包。此外,许多建模库支持部分依赖,无需使用外部软件包。
应将部分依赖与 ICE 图配对使用,因为 ICE 图可以显示由于强交互或相关性导致部分依赖的平均化而产生的不准确性。当 ICE 曲线与部分依赖曲线分歧时,这可能表明输入特征之间存在强交互,这是一起使用它们的另一个优势。然后,我们可以使用 EBMs 或替代决策树来确认训练数据或被解释模型中的交互存在。另一个技巧是将部分依赖和 ICE 与感兴趣特征的直方图一起绘制。这可以深入了解任何绘制的预测是否可信,并得到训练数据的支持。在图 2-6 中,部分依赖、ICE 和PAY_0的直方图用于总结单调 GBM 的行为。

图 2-6. 对于一个重要的输入变量,部分依赖和 ICE,附带直方图和均值目标值叠加,用于单调梯度增强机器 (数字,彩色版本)
警告
由于已知的多个弱点,不应在没有 ICE 的情况下使用部分依赖,或者应该使用 ALE 代替部分依赖。
在顶部,我们可以看到PAY_0的直方图,并且只有很少的数据是针对那些最近两个月内付款超过两个月的客户。在底部,我们看到了在预测违约概率十分位点上的部分依赖和 ICE 曲线。部分依赖和 ICE 帮助我们确认了PAY_0的受限 GBM 响应函数的单调性。即使在PAY_0较高值的数据较少时,模型似乎表现合理。随着客户最近付款越来越晚,违约概率呈单调增加,而在较高的PAY_0值时,违约概率稳定,尽管几乎没有数据支持该分类器在该区域内的行为。也许我们会认为每次使用单调约束时,我们都能保护我们的 ML 模型免受在没有足够训练数据的情况下学习愚蠢行为的影响,但事实并非如此。是的,单调约束有助于稳定性和欠确定性问题,部分依赖和 ICE 帮助我们发现这些问题(如果发生的话),但我们在这里算是幸运的。事实是,我们需要检查所有模型在训练数据稀疏区域内的不稳定行为,并准备好专门的模型,甚至是人工案例工作者,以便为这些困难的数据行做出良好的预测。
注意
通过比较可解释模型的形状函数、部分依赖、ICE 或 ALE 图与直方图,可以通过视觉发现仅基于少量训练数据的预测,从而提供模型结果不确定性的基本定性度量。
在移动到 ALE 图之前,再给一个建议:就像特征重要性、SHAP、LIME 以及所有操作于背景数据集上的解释技术一样,我们必须思考部分依赖和 ICE 的上下文问题。它们都使用了一些隐含的背景数据。对于部分依赖来说,这是我们感兴趣的任何数据集,其所有要绘制特征的值均设置为某个特定值。这改变了交互和相关性的模式,尽管这是一个异国情调的问题,但它使我们容易受到数据毒化攻击的影响,正如“通过数据毒化愚弄部分依赖”中所述。对于 ICE 来说,隐含的背景数据集是单行数据,其感兴趣特征设置为某个特定值。请注意 ICE 值的绘制是否与该行中观察到的其余数据组合得太不现实。
累积局部效应
ALE 是一种较新且高度严格的方法,用于表示 ML 模型在输入特征值的各个值上的行为,引入自"可视化黑盒监督学习模型中预测变量效应"。与部分依赖图类似,ALE 图展示了预测与输入特征值之间的关系形状,即非线性或非单调性。当训练数据中存在强相关性时,ALE 图尤为重要,而这种情况下部分依赖通常无法胜任。与部分依赖相比,ALE 计算速度更快。在 R 中试试ALEPlot,以及 Python 版的ALEPython。
聚类分析
尽管我们已经花了大量精力解释监督学习模型,但有时我们需要使用无监督技术。特征提取和聚类是两种最常见的无监督学习任务。我们在讨论可解释模型时探讨了如何通过稀疏方法如 SPCA 和 NMF 使特征提取更易于理解。并且通过应用非常成熟的事后方法来进行特征提取,聚类也常常能更加透明。最简单的方法是使用均值和中位数描述聚类中心,或者根据聚类创建数据集的原型成员。从这里开始,我们可以利用原型相关的概念如总结、比较和批评来更好地理解我们的聚类解决方案。另一种技术是应用特征提取,特别是稀疏方法,将高维聚类解决方案投影到二维或三维用于绘图。一旦在稀疏可解释的轴上绘制,使用领域知识来理解和检查一组聚类就更容易了。还可以使用特征分布来理解和描述聚类。可以将特征在聚类内的密度与其在其他聚类或整体分布中的密度进行比较。与其他聚类或整个训练数据具有最不相似分布的特征可以视为聚类解决方案中更重要的特征。最后,可以应用替代模型来解释聚类。使用与聚类算法相同的输入和聚类标签作为目标,我们适配一个可解释的分类器如决策树到我们的聚类,并利用替代模型的可解释特性来深入了解我们的聚类解决方案。
实践中的事后解释的顽固困难
除非我们小心,否则后事后解释可能会陷入非常模糊的领域。我们已经注意到了讨论技术方法的缺陷,但在处理这些技术在现实世界高风险应用时,还有更多需要考虑的因素。作为一个提醒,鲁丁教授的 “停止解释黑盒机器学习模型用于高风险决策,而改用可解释模型” 概述了后事后解释在不透明机器学习模型和高风险用途中的主要批评。根据鲁丁的观点,传统机器学习模型的解释:
-
建立在错误的信念上,即不可解释的模型比可解释的模型更准确
-
不够忠实于复杂模型的实际内部工作
-
经常是荒谬的
-
难以校准对外部数据
-
过于复杂
因此,在本章中,我们主张使用后事后解释与可解释模型结合使用,其中模型和解释可以相互作为过程控制。即使以这种更加风险感知的方式使用解释,仍然存在严重的问题需要解决。本节将重点介绍我们在实践中最常见的关注点。我们将通过强调在组合使用可解释模型和后事后解释的优势时,结束本节。但是,正如透明度案例将展示的那样,即使在技术透明度的技术方面大部分正确,人为因素对于最终的成功或失败仍然至关重要,尤其是在高风险的机器学习应用中。
Christoph Molnar 不仅在教我们如何使用解释方面很多产出;他和合著者们也很忙于研究它们的缺陷。如果读者希望深入了解常见解释方法的问题细节,我们建议阅读 “机器学习模型中模型无关解释方法的一般缺陷” 和早期的 可解释机器学习方法的局限性。接下来,我们将概述我们在实践中最常见的问题:确认偏见、背景、相关性和局部依赖、黑客行为、人类解释、不一致以及解释的忠实度:
确认偏见
在本章的大部分内容中,我们讨论了增加透明度作为一件好事。虽然这当然是,增加人类对机器学习模型的理解能力以及能够干预这些模型的能力确实为我们的机器学习工作流程开了一些存在确认偏差的裂缝。例如,假设我们坚信某种互动应该在模型中得到表现,基于类似项目的过去经验。然而,这种互动却没有出现在我们的可解释模型或事后解释的结果中。我们很难知道我们的训练数据是否存在偏见,是否遗漏了已知的重要互动,或者我们是否有偏见。如果我们干预我们模型的机制以某种方式注入这种互动,我们可能只是屈从于自己的确认偏差。
当然,完全缺乏透明度也会允许确认偏差肆意妄为,因为我们可以随意解释模型的行为。避免确认偏差的唯一真正方法是坚持科学方法和经过实践检验的科学原则,如透明度、验证性和可重复性。
背景
“不要缺乏背景的解释”,Przemysław Biecek 博士及其团队说道。在实践中,这意味着使用逻辑和现实的背景数据生成解释,并确保背景数据不能被对手操纵。即使对解释有坚实的背景数据,我们仍然需要确保我们的基础机器学习模型也在一个逻辑上下文中运行。对我们来说,这意味着有合理数量的不相关输入特征,所有这些特征都与建模目标有直接关系。
相关性和依赖关系
虽然在许多情况下,相关性可能不会阻止机器学习算法进行训练并生成准确的计算机预测,但它确实使解释和解释非常困难。在大型数据集中,通常存在许多相关特征。相关性违反了独立性原则,这意味着我们不能真实地单独解释特征。当我们试图移除一个特征时,就像许多解释技术所做的那样,另一个相关的特征将会进入并取代它在模型中的位置,从而使尝试移除的效果和移除本意的解释工具无效。我们还依赖于扰动特征来解释,但如果特征之间存在相关性,仅仅扰动其中一个特征来导出解释是毫无意义的。更糟糕的是,在处理机器学习模型时,它们可以学习局部依赖关系,这意味着在逐行基础上存在不同的类似相关的关系。理解相关性如何破坏解释的复杂性几乎是不可能的,更不用说复杂的局部依赖可能会产生相同的影响了。
Hacks
利用背景数据的解释技术可能会受到对手的修改。这些技术包括 LIME 和 SHAP,如在“Fooling LIME and SHAP: Adversarial Attacks on Post hoc Explanation Methods”中所探讨的,以及局部依赖,如在“Fooling Partial Dependence via Data Poisoning”中所述。虽然这些黑客攻击目前可能是个奇特的担忧,但我们不希望成为 ML 解释领域的首次重大黑客攻击的一部分。确保用于生成背景数据的代码是安全的,并且在解释计算过程中背景数据不能被不当操纵。无论是针对训练数据还是背景数据,数据污染对内部攻击者来说都是容易的。即使背景数据是安全的,解释仍可能以恶意方式被误解释为所谓的“公平洗白”,即滥用解释来洗白偏见,同时仍然将模型用户暴露于真实危害之中。
人类解释
对于经验丰富的从业者和研究人员来说,机器学习有时候也很难理解。然而,ML 解释的受众远不止行业专家。ML 的高风险应用通常涉及对其他人类重要的决策。即使这些人高度受过教育,我们也不能指望他们理解局部依赖和 ICE 图或一系列 SHAP 值。为了在高风险情况下正确进行透明度的展示,我们需要与心理学家、领域专家、设计师、用户交互专家等人员合作。这将需要额外的时间和产品迭代,以及技术人员、领域专家和用户之间的广泛沟通。如果不进行这项额外工作,即使实现了技术透明度的目标,也可能导致彻底的失败,正如“Case Study: Graded by Algorithm”所讨论的那样。
不一致
一致性指的是在不同模型或数据样本中稳定的解释。一致性难以实现,并且对于高风险的机器学习应用非常重要。在像信用或预审判释放决定等情况下,人们可能会受到多个自动化决策及其相关解释的影响,尤其在未来更加自动化的情况下如此。如果解释为同一结果决策提供了不同的原因,将会使本已困难的情况变得更加复杂。为了增强一致性,解释需要针对训练数据和应用领域中的真实、可泛化的现象进行关键性调整。为了实现一致性,我们需要在相当数量的独立特征上训练我们的模型。模型本身也需要是简约的,即受限于遵守现实世界的关系。相反,对于复杂、未明确规范、难以解释的具有大量相关输入的模型来说,一致的解释是不可能的。
衡量解释质量
想象一下训练模型,审视结果,然后假设它正常工作并部署它。这很可能是一个糟糕的主意。但这就是我们所有人如何处理事后解释的方式。鉴于前面章节中提出的所有技术问题,我们显然需要测试解释,并查看它们在给定数据源和应用程序中的工作情况,就像我们对任何其他机器学习技术一样。像在部署之前测量模型质量一样,我们应该也在努力测量解释质量。已经有提出这种测量和常识测试技术的公开建议。"Towards Robust Interpretability with Self-Explaining Neural Networks"提出了显式性,即解释是否立即可理解;忠实性,即解释是否符合已知重要因素;以及稳定性,即解释是否与相邻数据点一致。"On the (In)fidelity and Sensitivity of Explanations"介绍了相关的同名测试。除了这些正式测量提议之外,如果我们同时使用可解释模型和解释,我们可以检查可解释模型机制和事后解释是否相互确认。如果存在较老的可信解释,我们可以将其用作测试新解释忠实度的基准。此外,稳定性测试通常不应导致事后解释发生重大变化,这种测试中,数据或模型以微小方式扰动。
警告
在高风险用例中部署之前,请测试解释。尽管解释缺乏地面真实性是一个困难的障碍,但应将解释与可解释的模型机制进行比较。可以使用与基准解释的比较、显式性和保真度测量、扰动、与最近邻的比较以及模拟数据来测试解释质量。
毫无疑问,通过应用一些后处理方法来解释任何模型的吸引力是不可否认的。但考虑到我们刚刚讨论过的所有技术和世俗问题,希望我们已经说服读者传统的机器学习模型解释有点空想。解释不可解释的可能并非不可能,但在今天技术上很困难,一旦我们考虑到实现现实世界透明度所需的所有人为因素,它变得更加困难。
结合可解释模型和事后解释
随着我们结束本章更多的技术讨论,我们想要强调新的研究成果,帮助阐明为何解释传统 ML 模型如此困难,并给读者留下一个结合可解释模型和事后解释的示例。两篇最新论文将传统 ML 模型的固有复杂性与透明度困难联系起来。首先,《评估机器学习模型的局部可解释性》(链接)用 ML 模型决策关联的运行时操作数量作为复杂性的代理,并显示随着操作数量的增加,解释性降低。其次,《通过功能分解量化模型复杂性以获得更好的事后解释性》(链接)利用特征数量、交互强度和主效应复杂性来衡量 ML 模型的总体复杂性,并显示最小化这些标准的模型更容易解释。总结一下,复杂模型难以解释,简单模型更易解释,但绝对不容易。图 2-7 提供了一个增加解释的简单模型的示例,以及为什么即使这样做也很困难。
图 2-7 包含一个经过训练的三级决策树,显示了一个突出显示的决策路径,以及沿着该决策路径进行数据单行的树 SHAP 值。尽管图 2-7 看起来简单,实际上它揭示了机器学习和机器学习解释中的几个基本问题。在我们深入讨论图 2-7 所呈现的困难之前,让我们沉浸在一个具有完整全局决策机制预测模型的荣耀中,并且我们可以生成输入特征对任何模型预测的数值贡献。这种透明度曾经仅限于线性模型,但我们在本章涵盖的所有新方法使得这种透明度对于更广泛的高容量模型成为现实。这意味着,如果我们小心的话,我们可以训练更复杂的模型,从数据中学习更多,并且仍然能够解释和从结果中学习。我们可以从数据中更多地学习,可靠地这样做,并且从结果中作为人类学到更多。这是一个巨大的突破。

图 2-7. 简单的可解释模型与事后解释信息配对
注
使用可解释模型和事后解释相结合,相互验证,并最大化 ML 模型的透明度。
现在让我们深入探讨图 2-7 中的困难,同时要记住,在使用机器学习模型和事后 XAI 时,这些问题总是存在的(我们可以在这种简单情况下看到它们并思考它们)。注意所选个体的决策路径考虑了PAY_0、PAY_6和PAY_AMT1。现在看看 Tree SHAP 值。它们给PAY_2比PAY_6更高的权重,并且比PAY_AMT1更重要,但PAY_2和PAY_5不在决策路径上。这是因为 SHAP 计算考虑了具有不同PAY_0、PAY_AMT1和PAY_6值的人工观测,而这些观测走不同的决策路径。无论我们使用tree_path_dependent还是interventional特征扰动,我们都会看到这种行为。
这种现象很不直观,但是它是正确的,不是近似误差的结果。我们本可以使用不同的软件包或方法,并可能生成与图 2-7 中突出显示的单一决策路径一致的本地解释,但那样我们就无法获得伴随 Shapley 值和 SHAP 的深刻理论支持。至少通过 SHAP,我们知道我们的解释显示了这种效果的原因。总体而言,解释机器学习模型非常困难,而且原因很多。在将解释部署到高风险环境之前,始终测试解释,并确保理解你所应用的事后技术。
第六章将更详细地讨论 SHAP 如何使用背景数据,并根据不同设置计算特征归因。在将像 SHAP 这样的特征归因方法用于高风险应用之前,我们都需要理解这些微妙之处。在解释的技术方面,有很多需要考虑的事情。接下来的案例将深入探讨一些解释中的人为因素,这可能更难以把握正确。
案例研究:通过算法评分
向机器学习模型中增加透明度并非易事。即使我们在可解释模型的技术细节和事后解释方面做得很好,仍然有许多人为因素需要小心处理。在英国发生的所谓A 级丑闻 是一个未能理解高风险基于机器学习的决策中人为因素的典型案例。2020 年春季,随着 COVID 封锁在英国全境蔓延,学生、教师和政府官员意识到无法像往常那样进行标准化测试。作为解决国家标准化测试问题的首次尝试,教师被要求估算对确定大学入学和影响其他重要生活结果的 A 级考试的学生表现。不幸的是,教师的估算被视为不可信,以至于使用估算的学生表现将对过去和未来的学生都不公平。
为了解决教师的正面偏见,英国资格和考试监管办公室(Ofqual)决定实施算法来调整教师的预测。 调整算法的统计方法由专家实施,并在学生收到成绩后发布了一个模型文档。 该算法旨在生成一个最终成绩分布,类似于以往几年的结果。 它保留了教师的排名,但使用过去的学校表现来调整成绩向下。 苏格兰的学生首先看到了结果。 根据ZDNet,“35.6%的成绩降低了一个等级,而 3.3%降低了两个等级,0.2%降低了三个等级。”
在接下来的几个月里,学生对可能存在的对贫困学校和全国各地区的偏见发出了强烈抗议,引发了一场规模庞大、缓慢蔓延的 AI 事件。 尽管官员们已经看到了苏格兰的问题,他们在英格兰也应用了相同的流程,但同时设立了免费申诉流程以及学生有权在稍后的日期重新考试。 最终,对公众信任造成的不可修复的损害,以及透明但带有偏见的根据过去学校表现调整个人分数的概念,让许多人无法接受。 最终,英国政府决定使用原始的教师估计值。 根据Wired,“政府实际上已将行政责任转移到了大学,他们现在必须考虑是否接受更多的申请——尽管进行了政策调整,但不可能兑现所有原始的录取要约。” 同一篇文章还指出,过去教师对学生表现的估计显示了种族偏见。 这真是一团糟。
令人震惊的是,其他机构也采纳了算法评分的想法来改变人生的大学入学考试。国际文凭(IB)是一个精英教育项目,为全球中学生提供先进的统一课程。2020 年春季,IB 因 COVID-19 取消了春季考试后,匆忙部署了一个算法用于学生的评分,被报道为“急忙部署的”。该系统使用的信号包括学生的作业成绩以及他们学校过去的成绩。“由于时间问题,未预料到的负面评分对申请美国大学和大学的 IB 学生非常有害,这些大学根据过去的表现保留了空间,但可以根据最终表现取消,‘打碎了他们秋季及以后的计划。’”一些学生的算法分数如此之低,以至于他们可能失去了在美国著名大学及其本国的安全学校的位置。更糟糕的是,与 Ofqual 算法不同,IB 没有公开他们的算法工作原理,而申诉费用则高达将近 800 美元。
撇开 IB 缺乏透明度不谈,这些事件中似乎存在三个主要问题。规模是 ML 的固有风险,这些算法被用于全球许多学生。大规模转化为高物质性,但单靠透明度并不足以抵消信任和偏见问题。理解并非信任。Ofqual 的技术报告和其他公共分析超出了许多学生和家长的理解能力。但对他们来说不难理解的是,贫困地区有更差的公立学校,这在 2020 年两次影响了受影响学生——一次是像往常一样的整体方式,然后是当他们的分数被调整向下时。第二个因素是决策的严重性。大学录取在许多人的生活中起着重要作用。决策的严重性将物质性提升到更高的程度——可能是不可能的程度,失败变得肯定。ML 固有地是概率性的。它会出错。而当赌注这么高时,公众可能根本不会接受它。
这里存在的第三个主要问题是明显的不平等影响性质。例如,很小的班级没有通过算法进行评分。哪里有最小的班级?私立学校。一篇Verge 文章声称,“付费私立学校(也称为独立学校)从使用的算法中不成比例地受益。与去年相比,这些学校的 A 级及以上成绩增加了 4.7%。”ZDNet报告称,“在苏格兰贫困地区进行更高课程的学生通过率减少了 15.2%,而在更富裕地区为 6.9%。”通过邮政编码或过去的学校表现调整,内含系统性偏见,学生和家长在情感上理解这一点。正如BBC引述的那样,苏格兰的教育部长最终意识到,这场丑闻使“年轻人感觉他们的未来是由统计建模而不是他们自己的能力决定的。”我们应该想象如果这件事影响了我们或我们的孩子,我们会有什么感受。尽管围绕自动决策制定了如此多的宣传,几乎没有人希望感觉到他们的未来是由算法决定的。
尽管这可能从一开始就是一个注定失败的、不可能达到高材料应用的 ML,但可以做更多事情来增加公众的信任。例如,Ofqual 可以在应用于学生之前发布算法。他们还可以在使用算法之前征求公众意见。英国开放数据倡导者 Jeni Tennison 在这里指出,“这里的问题的一部分是,这些问题只有在学生得到成绩之后才出现,当我们本可以在此之前进行这些讨论并检查算法并了解其影响的时候。”这里的主要教训是,技术透明并不等同于广泛社会的理解,即使可以实现理解,也不能保证信任。即使我们在技术透明方面做得很好,如本章提出的那样,仍然有很多工作需要做,以确保 ML 系统对用户或主体正常工作。最后,这只是一个 AI 事件,虽然这是一个大事件,但不应忽视那些正在伤害人们的更小的事件,并且我们必须记住,未来更多的人将受到 AI 系统的伤害。正如 Tennison 所说,“这件事成为头条新闻,因为它影响了全国如此多的人,影响了有声音的人。还有其他的自动决策制定一直在进行,比如围绕福利的,这些都影响到很多没有这么强大声音的人。”
资源
更多阅读
第三章:调试机器学习系统以实现安全性和性能
数十年来,错误或者在保留测试数据上的准确性一直是评判机器学习模型的标准。不幸的是,随着机器学习模型被嵌入到部署更广泛和更敏感的应用程序的人工智能系统中,传统的模型评估方法已经被证明是不足够的。例如,整体测试数据的曲线下面积(AUC)几乎无法告诉我们有关偏见和算法歧视、透明度不足、隐私伤害或安全漏洞的任何信息。然而,这些问题往往是人工智能系统部署后失败的原因。为了获得可接受的实时性能,我们必须超越为研究原型设计的传统模拟评估方法。此外,安全性和性能的最佳结果出现在组织能够混合和匹配在第一章中描述的适当的文化能力和流程控制与促进信任的机器学习技术时。本章介绍了关于培训、调试和部署机器学习系统的部分,深入探讨了测试和提高实时安全性、性能和 AI 信任的众多技术方法。请注意,第 8 和 9 章提供了用于模型调试的详细代码示例。
培训
关于训练 ML 算法的讨论从可重复性开始,因为没有这一点,我们无法知道 ML 系统的任何一个版本是否真的比另一个好。数据和特征工程将简要讨论,并且培训部分结束时概述了模型规范的关键点。
可重复性
没有可重复性,我们就像在沙上建房子。可重复性是所有科学工作的基础,包括人工智能。没有可重复的结果,很难知道每天的努力是否改进了 ML 系统,甚至是否改变了它。可重复性有助于确保正确的实施和测试,一些客户可能只是要求它。以下技术是数据科学家和 ML 工程师用来为他们的 ML 系统建立坚实可重复基础的一些最常见的技术之一:
基准模型
基准模型是培训、调试和部署机器学习系统的重要安全性和性能工具。本章将多次讨论它们。在模型培训和可重复性的背景下,我们应始终从可重复的基准模型构建。这允许在可重复性丢失时进行回滚的检查点,同时也促进了实际进展。如果昨天的基准模型是可重复的,并且今天的进展超出了那个基准模型,那就是真正可衡量的进展。如果在进行更改之前系统性能指标反弹,而在进行更改后它们仍然反弹,我们就无法知道我们的更改是有帮助还是有害的。
硬件
由于机器学习系统通常通过图形处理单元(GPU)和其他专用系统组件实现硬件加速,硬件仍然是保持可重现性的特别关注点。如果可能,尽量在开发、测试和部署系统中保持硬件尽可能相似。
环境
机器学习系统始终在某种计算环境中运行,由系统硬件、系统软件以及我们的数据和机器学习软件堆栈指定。这些任何方面的变化都可能影响机器学习结果的可重现性。幸运的是,像 Python 虚拟环境和 Docker 容器这样的工具已经成为数据科学实践中的常见工具,用于保存软件环境。来自 Domino、gigantum、TensorFlow TFX 和 Kubeflow 的其他专业环境管理软件可以提供更广泛的计算环境控制。
元数据
有关数据的数据对于可重现性至关重要。跟踪与模型相关的所有工件,例如数据集、预处理步骤、数据和模型验证结果、人工签名和部署详细信息。这不仅允许回滚到数据集或模型的特定版本,还允许详细调试和 AI 事件的法证调查。关于跟踪元数据的开源示例工具,可以查看 TensorFlow ML Metadata。
随机种子
数据科学家和工程师在特定代码块中设置的随机种子是机器学习可重现性的耕牛。不幸的是,它们通常伴随语言或包特定的说明。在不同的软件中学习种子可能需要一些时间,但结合仔细的测试,随机种子使得复杂的机器学习系统的构建模块能够保持可重现性。这是整体可重现性的先决条件。
版本控制
小的代码更改可能会导致机器学习结果的 drastic 改变。我们自己的代码及其依赖项的更改必须在专业的版本控制工具中跟踪,以便希望能够重现结果。Git 和 GitHub 是软件版本控制的免费且无处不在的资源,但还有很多其他探索的选择。关键是,数据也可以通过诸如 Pachyderm 和 DVC 等工具进行版本控制,从而追踪数据资源的变化。
虽然可能需要一些试验,但这些方法和技术的某种组合应该能够保证我们机器学习系统的可重现性水平。一旦确保了这种基本的安全性和性能控制,就可以考虑数据质量和特征工程等其他基线因素了。
注意
在模型调试和机器学习安全中,诸如基准测试、异常检测和监控等几个主题无处不在,并且它们出现在本章的几个不同部分和上下文中。
数据质量
关于机器学习和机器学习系统的数据质量和特征工程已经有许多书籍写成。这个简短的小节重点介绍了从安全性和性能角度来看这个广阔实践领域中一些最关键的方面。首先和最重要的是,偏见、混杂特征、不完整性和开发数据中的噪声形成了重要的假设并定义了我们模型的限制。像数据集的大小和形状这样的基础知识也是重要的考虑因素。机器学习算法对数据有很高的需求。小数据和宽松散的数据都可能导致现实世界中的灾难性性能故障,因为两者都会导致系统在测试数据上表现正常,但实际上与现实世界现象没有实质联系。小数据可能使得难以检测到拟合不足、规范不足、过拟合或其他基本性能问题。散乱的数据可能导致对某些输入值的过度自信的预测。如果由于稀疏问题在训练中未能看到某些数据范围,大多数机器学习算法将在这些范围内发布预测,而不会发出基于几乎没有信息的警告。快进到我们章节的案例讨论,世界上根本没有足够的培训视频来填补自动驾驶汽车需要学习以安全驾驶的所有示例情况的整个空间。例如,夜间骑自行车过马路的人是大多数人都会意识到的危险,但如果没有许多带标签的这种相对罕见事件的视频帧,深度学习系统处理这种情况的能力可能会因训练数据的稀缺而受到损害。
还有一些其他数据问题可能会引起安全担忧,例如数据质量不佳导致纠缠或重要信息的误代表和过拟合,或者机器学习数据和模型管道问题。在本章的背景下,纠缠 意味着训练数据中的特征、实体或现象代理其他与目标更直接关系的信息(例如,在物体识别中,雪代理了哈士奇)。过拟合指的是在训练数据中记忆噪声和由此产生的乐观错误估计,而管道问题是由将数据准备和建模组件的不同阶段结合成一个生成预测的可执行文件而引起的问题。表 3-1 可应用于大多数标准的机器学习数据,以帮助识别具有安全性和性能影响的常见数据质量问题。
表 3-1。常见的数据质量问题,带有症状和建议的解决方案。根据乔治·华盛顿大学 DNSC 6314(机器学习 I)课堂笔记进行适应并获得许可。
| 问题 | 常见症状 | 可能的解决方案 |
|---|---|---|
| 偏倚数据:当数据集包含感兴趣现象的信息,但这些信息始终且系统性地错误时。(详见第四章获取更多信息。) | 偏倚模型和偏倚、危险或不准确的结果。延续过去的社会偏见和歧视。 | 与领域专家和利益相关者协商。应用科学方法和实验设计(DOE)方法。(获取更多数据。获取更好的数据。) |
| 字符数据:当某些列、特征或实例使用字符串代替数值表示时。 | 信息丢失。偏倚模型和偏倚、危险或不准确的结果。漫长且无法忍受的训练时间。 | 各种数值编码方法(例如标签编码、目标或特征编码)。适当的算法选择,例如基于树的模型、朴素贝叶斯分类。 |
| 数据泄漏:当验证或测试分区的信息泄漏到训练数据中。 | 不可靠或危险的域外预测。过拟合模型和不准确的结果。在硅中过于乐观的性能估计。 | 数据治理。确保所有训练中的日期早于验证和测试中的日期。确保跨分区不出现相同的标识符。在特征工程中谨慎应用——在分区后工程化,而不是之前。 |
| 脏数据:这个表中所有问题的结合,在现实世界的数据集中非常普遍。 | 信息丢失。偏倚模型和偏倚、不准确的结果。漫长且无法忍受的训练时间。不稳定和不可靠的参数估计和规则生成。不可靠或危险的域外预测。 | 组合此处的解决策略。 |
| 不同特征尺度:当诸如年龄和收入等特征记录在不同的尺度上时。 | 不可靠的参数估计、偏倚模型和偏倚、不准确的结果。 | 标准化。适当的算法选择,例如基于树的模型。 |
| 重复数据:出现超过预期的行、实例或实体。 | 因意外权重过高相同实体在训练期间导致的偏倚结果。偏倚模型和偏倚、不准确的结果。 | 与领域专家谨慎进行数据清理。 |
| 纠缠:当训练数据中的特征、实体或现象代表与目标直接关系更密切的其他信息时(例如,在对象识别中雪代表哈士奇)。 | 不可靠或危险的域外预测。快捷学习。 | 应用科学方法和 DOE 方法。应用可解释的模型和事后解释。在域内进行测试。 |
| 伪造或毒害数据:在训练数据中注入或操纵的数据、特征、属性、现象或实体,以引发人工模型结果。 | 不可靠或危险的域外预测。偏倚模型和偏倚、不准确的结果。 | 数据治理。数据安全。应用稳健的机器学习方法。 |
| 高基数分类特征:例如邮政编码或产品标识符等代表同一属性的许多分类级别的特征。 | 过拟合模型和不准确的结果。漫长且无法容忍的计算时间。不可靠或危险的域外预测。 | 目标或特征编码变体,按级别平均(或类似,例如中位数,BLUP)。离散化。嵌入方法,例如实体嵌入神经网络,因子分解机。 |
| 不平衡的目标:当一个目标类别或值比其他类别或值更常见时。 | 单一类别模型预测。偏倚的模型预测。 | 比例过采样或欠采样。逆先验概率加权。混合模型,例如零膨胀回归方法。后验调整预测或决策阈值。 |
| 不完整数据:当数据集不编码感兴趣现象的信息时。未收集到的信息干扰模型结果。 | 无用的模型,毫无意义或危险的结果。 | 与领域专家和利益相关者咨询。应用科学方法和 DOE 方法。(获取更多数据。获取更好的数据。) |
| 缺失值:特定行或实例缺少信息时。 | 信息丢失。偏倚模型和偏倚、不准确的结果。 | 插补。离散化(即分箱)。适当的算法选择,例如基于树的模型,朴素贝叶斯分类。 |
| 噪声:未能为建模提供清晰信号的数据。具有相同输入值但不同目标值的数据。 | 不可靠或危险的域外预测。训练过程中性能不佳。 | 与领域专家和利益相关者咨询。应用科学方法和 DOE 方法。(获取更多数据。获取更好的数据。) |
| 非标准化数据:同一实体的值以不同方式表示的数据。 | 不可靠的域外预测。漫长且无法容忍的训练时间。不可靠的参数估计和规则生成。 | 与领域专家仔细进行数据清洗。 |
| 异常值:与其他数据行或实例不同或奇怪的数据。 | 偏倚模型和偏倚、不准确的结果。不可靠的参数估计和规则生成。不可靠的域外预测。 | 离散化(即分箱)。Winsorizing。稳健损失函数,如 Huber 损失函数。 |
| 稀疏数据: 数据中有很多零值或缺失值;数据未能编码足够关于感兴趣现象的信息。 | 长时间的、无法忍受的训练时间。由于信息不足、维度诅咒或模型规范错误导致的无意义或危险的结果。 | 特征提取或矩阵因子分解方法。适当的数据表示(如 COO、CSR)。应用业务规则、模型断言和约束,弥补训练数据稀疏区域中学习到的不合逻辑的模型行为。 |
| 强多重共线性(相关性): 特征之间存在强线性依赖关系。 | 不稳定的参数估计、不稳定的规则生成和危险或不稳定的预测。 | 特征选择。特征提取。L2 正则化。 |
| 未识别的时间和日期格式: 时间和日期格式,由数据处理或建模软件不正确编码。 | 不可靠或危险的领域外预测。不可靠的参数估计和规则生成。过拟合模型和不准确的结果。在硅内性能估计过于乐观。 | 与领域专家协商进行仔细的数据清洗。 |
| 宽数据: 列数、特征数、像素数或标记数远远多于行数、实例数、图像数或文档数。 P >> N。 | 长时间的、无法忍受的训练时间。由于维度诅咒或模型规范错误导致的无意义或危险的结果。 | 特征选择、特征提取、L1 正则化、不假设 N >> P 的模型。 |
在高风险应用中,数据可能出现许多问题,导致模型性能不可靠或危险。或许我们会认为可以通过特征工程解决数据质量问题。但特征工程的好坏取决于执行它的思维和代码质量。如果我们在特征工程中不十分小心,很可能只会给自己带来更多的错误和复杂性。机器学习流水线中常见的特征工程问题包括以下几点:
-
API 或版本不匹配数据清洗、预处理和推理包之间
-
推理期间未应用所有数据清洗和转换步骤
-
推理期间未重新调整过采样或欠采样
-
无法在推理期间优雅或安全地处理训练时未见过的值
当然,在数据准备、特征工程和相关流水线中可能会出现许多其他问题,尤其是机器学习算法能接受的数据类型变得更加多样化时。检测和解决这类问题的工具也是数据科学工具包中的重要组成部分。对于 Python Pandas 用户来说,ydata-profiling 工具(以前称为 pandas-profiler)是一种可视化辅助工具,帮助检测许多基本的数据质量问题。R 用户也有选择的余地,正如 Mateusz Staniak 和 Przemysław Biecek 在 “R 自动探索性数据分析包的景观” 中讨论的那样。
实现真实世界结果的模型规范
一旦我们的数据准备和特征工程流水线成熟,就该考虑机器学习模型的规范。对于真实世界性能和安全性的考虑与发表论文或在机器学习竞赛排行榜上最大化性能的考虑大不相同。尽管验证和测试错误的测量仍然重要,但更大的问题是准确表示数据和常识真实世界现象具有最高优先级。本小节通过突出基准和替代模型的重要性,校准、结构有效性、假设和限制、适当的损失函数、避免多重比较,并预览强大机器学习和机器学习安全性与可靠性的新兴学科来讨论安全性和性能的模型规范。
基准和替代方案
在开始机器学习建模任务时,最好从经过同行评审的训练算法开始,并在可能的情况下复制与该算法相关联的任何基准。虽然学术算法很少能满足复杂业务问题的所有需求,但从一个知名算法和基准开始可以确保训练算法的实施正确。一旦完成这个检查,再考虑调整复杂算法以解决特定问题的特殊怪癖。
除了与基准的比较之外,评估多种替代算法方法是另一个可以提高安全性和性能结果的最佳实践。训练许多不同的算法并谨慎选择最终部署的最佳选项的实践通常会产生更高质量的模型,因为它增加了评估的模型数量,并迫使用户理解它们之间的差异。此外,评估替代方法在符合广泛的美国非歧视和疏忽标准方面非常重要。一般来说,这些标准要求证明评估了不同的技术选项,并在部署之前在消费者保护和业务需求之间做出适当的权衡。
校准
仅仅因为复杂的机器学习流程的末端弹出一个介于 0 和 1 之间的数字,并不意味着它是一个概率。大多数机器学习分类器生成的未校准概率通常需要进行后处理,以赋予其真正的概率意义。我们通常使用一个缩放过程,甚至是另一个模型,来确保当流程输出 0.5 时,所讨论的事件实际上发生在过去记录数据中大约 50%的类似实体中。scikit-learn提供了一些用于机器学习分类器校准的基本诊断和函数。当模型输出的分布与已知结果的分布不匹配时,校准问题也会影响回归模型。例如,保险中的许多数值量并不服从正态分布。使用默认的平方损失函数,而不是来自伽马或 Tweedie 家族的损失函数,可能导致预测不像已知的数据生成过程中的值那样分布。无论我们如何考虑校准,根本问题是受影响的机器学习模型预测与现实不符。我们永远无法做出好的预测和决策。我们需要我们的概率与过去的结果率保持一致,我们需要我们的回归模型生成与建模数据生成过程相同分布的预测值。
构建效度
构建效度是社会科学(尤其是心理测量学和测试)的一个概念。构建效度意味着有合理的科学依据认为测试表现反映了预期的构建。换句话说,是否有科学证据表明标准化测试的问题和分数能预测大学或工作表现?为什么我们在机器学习书中提到这个?因为这些天机器学习模型经常用于与心理测量测试相同的目的,并且在我们看来,机器学习模型通常缺乏构建效度。更糟糕的是,不与训练数据或其现实世界领域的基本结构相符的机器学习算法可能会引发严重事件。
在选择机器学习模型和线性模型之间时,许多人往往默认使用机器学习模型。选择机器学习算法来解决建模问题基本上是建立在一些基本假设上——即输入特征的高阶交互和非线性是预测现象的重要驱动因素。相反,选择使用线性模型则隐含地减少了交互作用和非线性的影响。如果这些特质对于良好的预测很重要,它们就必须对线性模型进行明确指定。无论哪种情况,重要的是要考虑如何通过建模算法处理训练数据中的主效应、相关性和局部依赖性、交互作用、非线性、簇、异常值以及层次结构,并测试这些机制。一旦部署,为了实现最佳的安全性和性能,必须在机器学习模型中表示与时间、地理位置或不同类型网络实体之间的依赖关系。如果没有这些与现实的明确联系,机器学习模型就会缺乏结构有效性,很可能无法表现出良好的实际性能。特征工程、约束、损失函数、模型架构和其他机制都可以用来使模型适应其任务。
假设和限制
偏差、纠缠、不完整、噪音、范围、稀疏性和训练数据的其他基本特征开始定义我们模型的假设和限制。正如讨论的那样,建模算法和架构也具有假设和限制。例如,基于树的模型通常无法在训练数据范围之外进行外推。机器学习算法的超参数是另一个隐藏假设可能引起安全性和性能问题的地方。可以根据领域知识或通过像网格搜索和贝叶斯优化这样的技术方法选择超参数。关键在于不要满足于默认设置,系统地选择设置,并且不要因为多重比较问题而自欺欺人。在训练数据中测试错误之间的独立性或绘制模型残差并寻找强烈模式是确保一些基本假设得到处理的一般和经过时间考验的方法。我们不太可能绕过所有数据和模型的假设和限制。因此,我们需要在模型文档中记录任何未解决或怀疑的假设和限制,并确保用户了解使用模型可能违反其假设和限制的情况。这些将被视为超出范围或非标签使用,就像在不恰当的方式使用处方药一样。顺便说一句,建构有效性与模型文档和专注于模型限制和假设的风险管理框架密切相关。监管专业人员希望从业者通过书面方式详细讨论其模型背后的假设,并确保其建立在有效的结构下,而不是假设之上。
默认损失函数
许多学习算法伴随的另一个常常未明示的假设涉及平方损失函数。许多机器学习算法默认使用平方损失函数。在大多数情况下,平方损失函数因其在观测值之间的可加性和线性导数而更多是数学上的便利性问题。随着现代工具如autograd的出现,这种便利性越来越不必要。我们应该根据问题域匹配我们选择的损失函数。
多重比较
在机器学习中,模型选择通常意味着尝试许多不同的输入特征集、模型超参数和其他模型设置,如概率截断阈值。我们经常使用逐步特征选择、网格搜索或其他方法,在同一组验证或留存数据上尝试许多不同的设置。统计学家可能会称之为多重比较问题,并可能指出,我们进行的比较越多,我们碰巧找到的那些看起来很好的设置就越有可能。这是一种隐蔽的过拟合类型,我们在后续的实际性能中重新使用同一留存数据太多次,选择在那里效果良好的特征、超参数或其他设置,然后经历后期性能不佳。因此,可重复使用的留存方法,通过改变或重新采样验证或留存数据,使我们的特征、超参数或其他设置更具普适性,是非常有用的。
机器学习的安全和稳健的未来
新兴的稳健机器学习领域正在涌现出具有改进稳定性和安全特性的新算法。各种研究人员正在创建具有最优性保证的新学习算法,例如最优稀疏决策树。研究人员还整理了关于机器学习安全性和可靠性的优秀教程材料。今天,这些方法需要定制实现和额外工作,但希望这些安全性和性能进步很快将更普遍地可用。
模型调试
一旦模型被正确规范和训练,技术安全和性能保障流程的下一步就是测试和调试。多年来,这类评估集中在留存数据的整体质量和错误率上。随着机器学习模型被纳入面向公众的机器学习系统,并且公开报道的 AI 事件数量急剧增加,更加严格的验证显然是必要的。新兴的模型调试领域应运而生,以满足这一需求。模型调试将机器学习模型更多地视为代码,而不是抽象数学。它应用一系列测试方法来发现机器学习模型和机器学习系统管道中的软件缺陷、逻辑错误、不准确性和安全漏洞。当然,在发现这些缺陷时,也必须加以修复。本节详细探讨了模型调试,从基本和传统方法开始,然后概述了我们试图发现的常见缺陷,进而介绍了专业的测试技术,并最终讨论了缺陷修复方法。
注意
除了许多可解释的 ML 模型外,开源软件包PiML包含了一套详尽的面向结构化数据训练的 ML 模型调试工具。即使它不完全适用于特定用例,它也是一个学习更多和获得模型调试灵感的好去处。
软件测试
当我们停止把漂亮的图表和令人印象深刻的结果表视为 ML 模型训练任务的最终目标时,基本的软件测试变得更加重要。当 ML 系统部署时,它们需要在各种情况下正常工作。在与 ML 系统相关的几乎所有其他方面中,使软件正常工作是一门精确的科学。软件测试的最佳实践是众所周知的,并且在许多情况下甚至可以自动化。至少,关键任务的 ML 系统应该进行以下测试:
单元测试
所有函数、方法、子程序或其他代码块都应该有关联的测试,以确保它们按预期行为,并且是可重复的。这确保了 ML 系统的构建模块是坚固的。
集成测试
应该对所有 API 和模块、层或其他子系统之间的接口进行测试,以确保正确的通信。后端代码更改后的 API 不匹配是 ML 系统的经典失败模式。使用集成测试来捕获此类及其他集成故障。
功能测试
功能测试应该应用于 ML 系统用户界面和端点,以确保它们在部署后的行为符合预期。
混沌测试
在混乱和对抗条件下进行测试可以在我们的 ML 系统面对复杂和令人意外的实际场景时取得更好的结果。由于很难预测 ML 系统可能失败的所有方式,混沌测试可以帮助探索更广泛的故障模式,并在所谓的“未知未知”面前提供一些保障。
还应该将两种额外的 ML 特定测试加入到组合中,以进一步提高质量:
随机攻击
随机攻击是在 ML 中进行混沌测试的一种方式。随机攻击将 ML 模型暴露于大量随机数据中,以捕捉软件和数学问题。现实世界是一个混乱的地方。我们的 ML 系统将会遇到它未准备好的数据。随机攻击可以减少这些事件及相关的故障或事件。
基准测试
使用基准来跟踪系统随时间的改进。ML 系统可能非常复杂。我们怎么知道工程师今天改变的三行代码对整个系统性能会有影响呢?如果在变更前后对系统性能进行可重复性的基准测试,回答这类问题就容易多了。
ML 是软件。因此,所有传统企业软件资产上进行的测试也应该在重要的 ML 系统上进行。如果我们不知道从哪里开始进行模型调试,我们就从随机攻击开始。读者可能会对随机数据在 ML 系统中暴露出的数学或软件错误感到震惊。当我们能够将基准添加到组织的持续集成/持续开发(CI/CD)流水线中时,这是向保证 ML 系统的安全性和性能迈出的另一大步。
注意
随机攻击可能是开始模型调试最简单和最有效的方式。如果调试感觉压倒性,或者不知道从哪里开始,可以从随机攻击开始。
传统模型评估
一旦我们对我们的 ML 系统中的代码有信心,集中精力测试我们的 ML 算法的数学就变得更容易。查看标准性能指标非常重要。但这并不是验证和调试过程的终点,而是开始。在考虑域内性能时,与评估统计数字的精确值相关性较小,更多的是将体外表现映射到体内表现。
如果可能的话,尽量选择具有逻辑解释和实际或统计阈值的评估统计数字。例如,对于许多类型的预测问题可以计算 RMSE,并且关键是它可以用目标的单位进行解释。对于分类任务的曲线下面积,其范围在低端为 0.5,在高端为 1.0。这些评估措施允许对 ML 模型性能进行常识解释,并与确定质量的广泛接受的阈值进行比较。使用多个指标进行分析同样重要,并且要跨数据的重要部分以及跨训练、验证和测试数据分区分析性能指标。在比较训练数据内部段的性能时,重要的是所有这些段展示出大致相等和高质量的性能。在一个大客户段上表现出色,但在其他所有人身上表现不佳,在像 RMSE 这样的平均评估统计值中看起来还可以。然而,如果由于许多不满意的客户导致公共品牌损害,这看起来并不好。在段间性能变化也可能是不充分规范的迹象,这是我们在本章中将深入探讨的严重 ML 缺陷。对训练、验证和测试数据集的性能分析通常也是为了分析欠拟合和过拟合。像模型性能一样,我们可以查找整个数据分区或段的过拟合和欠拟合。
传统模型评估中另一个实际考虑因素是选择概率截断阈值。大多数分类的 ML 模型生成数值概率,而不是离散决策。选择与实际决策相关联的数值概率截断可以通过多种方式完成。虽然总是诱人地最大化某些复杂的评估指标,但考虑现实世界的影响也是一个好主意。让我们考虑一个经典的贷款例子。假设违约概率模型的阈值最初设置为 0.15,这意味着得分低于 0.15 的每个人都可以批准贷款,而得分达到或超过阈值的人则被拒绝。思考以下问题:
-
对于这个阈值,预期的货币回报是什么?财务风险是多少?
-
在这个阈值下,会有多少人能获得贷款?
-
多少女性?多少少数族裔成员?
在概率截断阈值之外,估计领域内表现总是个好主意,因为这是我们真正关心的。评估指标很好,但重要的是赚钱与亏钱,甚至是挽救生命与失去生命。我们可以首先尝试通过为分类问题的混淆矩阵的每个单元或回归问题的每个残差单元分配货币或其他价值来理解现实世界的价值。做一次草稿计算。我们的模型看起来会赚钱还是赔钱?一旦我们掌握了这种估值的要领,我们甚至可以直接将不同模型结果的价值水平纳入 ML 损失函数中,并优化以适应最适合的实际部署模型。
对于 ML 来说,错误和准确度指标始终很重要。但是一旦 ML 算法在部署的 ML 系统中使用,数值值和比较的重要性就不如在发表论文和数据科学竞赛中那么重要了。因此,继续使用传统的评估措施,但尝试将它们映射到领域内的安全性和性能。
常见的机器学习 bug
我们已经讨论了无法再现性、数据质量问题、适当的模型规范、软件错误和传统评估。但是复杂 ML 系统可能出现更多问题。当涉及到 ML 的数学时,有一些新出现的陷阱和许多众所周知的陷阱。本小节将讨论包括分布偏移、认识不确定性、弱点、不稳定性、泄漏、循环输入、过拟合、快捷学习、欠拟合和规范不足在内的 bug。
分布偏移
在不同训练数据分区之间以及模型部署后,底层数据的变化是机器学习系统的常见故障模式。无论是新竞争对手进入市场还是全球性灾害爆发,世界都是一个动态变化的地方。不幸的是,今天大多数的机器学习系统从静态的训练数据快照中学习模式,并尝试在新数据中应用这些模式。有时候这些数据是保留的验证或测试分区数据,有时候是生产评分队列中的实时数据。然而,输入特征分布的漂移是一个严重的错误,必须被捕捉并解决。
警告
基于自适应、在线或强化学习的系统,或者只需最少人为干预即可更新自身的系统,面临严重的对抗性操纵、误差传播、反馈环路、可靠性和稳健性风险。虽然这些系统可能代表了当前技术水平,但它们需要高水平的风险管理。
在训练机器学习模型时,要注意训练、交叉验证、验证或测试集之间的分布变化,可以使用人口稳定性指数(PSI)、Kolmogorov-Smirnov(KS)检验、t 检验或其他适当的措施。如果一个特征在一个训练分区与另一个训练分区有不同的分布,可以删除它或者进行严格的正则化。在调试期间进行的另一个智能分布变化测试是模拟可能部署条件下的分布变化,并重新测量模型质量,特别关注表现不佳的行。如果我们担心我们的模型在经济衰退期间的表现,我们可以模拟分布变化来模拟更多的延迟付款、较低的现金流和更高的信用余额,然后看看我们的模型的表现如何。在训练数据中记录分布信息非常关键,这样可以轻松检测部署后的漂移。
认识不确定性和数据稀疏性
认识论不确定性 是指由于缺乏知识而产生的不稳定性和错误的一种花哨的说法。在机器学习中,模型传统上通过训练数据获取知识。如果我们庞大的多维训练数据中有稀疏部分,那么在该区域内我们的模型很可能存在高度的不确定性。听起来理论上有道理,却不是空穴来风。考虑一个基本的信贷放款模型。我们倾向于有大量关于已持有信用卡并支付账单的人的数据,但往往缺乏关于没有信用卡的人(因为他们的过去信用卡数据不存在)或者不支付账单的人(因为绝大多数客户都会支付)的数据。轻松知道要向信用评分高且按时支付账单的人发放信用卡。艰难的决策是针对信用历史较短或波动较大的人。对于我们确实需要了解的人群缺乏数据可能会导致严重的认识论不确定性问题。如果数百万客户中只有少数几个客户最近账单拖欠了四五个月,那么机器学习模型对于如何最好地处理这些人几乎没有学习到什么。
这种现象在 “规约性不足” 部分有所体现(该部分始于 ),在这里举例说明了模型对于最近账单拖欠超过两个月的人是毫无意义的。这种表现较差且可能不稳定的区域有时被称为 弱点。通过观察总体误差或性能指标很难找到这些弱点。这只是仔细在训练或留置数据段测试模型的众多原因之一。这也是为什么我们在 第二章 中将部分依赖和个别条件期望图与直方图配对使用。在这些图表中,我们可以看到模型行为是否受到训练数据的支持。一旦我们确定了导致认识论不确定性和弱点的数据稀疏区域,通常需要依靠人类知识——通过约束模型形式以根据领域经验逻辑行事,通过增加业务规则来扩展模型,或者将落入稀疏区域的案例交给人工工作者做出艰难决策。
不稳定性
机器学习模型在训练过程中或在对实时数据进行预测时可能表现出不稳定性或缺乏鲁棒性和可靠性。训练过程中的不稳定性通常与训练数据量小、训练数据的稀疏区域、训练数据中高度相关的特征或高方差的模型形式(如深度单一决策树)有关。交叉验证是检测训练过程中不稳定性的典型工具。如果模型在交叉验证折叠中显示出显著不同的错误或准确性特性,则存在不稳定性问题。通过更好的数据和低方差的模型形式(如决策树集成)通常可以修复训练不稳定性。ALE 或 ICE 的绘图也倾向于揭示训练数据稀疏区域中的预测不稳定性,可以使用敏感性分析(扰动、模拟、压力测试和对抗性示例搜索)来分析预测的不稳定性。
注意
机器学习中有两种简单的方式来思考不稳定性:
-
当输入数据的微小变化导致输出数据的巨大变化
-
当增加少量训练数据导致重新训练时得到一个截然不同的模型时
如果通过这些技术来探索我们的响应曲面或决策边界揭示出预测出现的剧烈波动,或者我们的 ALE 或 ICE 曲线在特征值的高低范围内反复跳动,尤其是在极端值附近,这说明我们也存在不稳定性问题。这种类型的不稳定性通常可以通过约束和正则化来修复。请查看第八章中的代码示例,看看这些修复方法是如何实施的。
泄漏
在训练、验证和测试数据分区之间的信息泄漏发生在验证和测试分区的信息泄漏到训练分区,导致过度乐观的错误和准确性测量。泄漏可能由于多种原因而发生,包括以下几点:
特征工程
如果使用不正确,某些特征工程技术,如插补或主成分分析,可能会将验证和测试数据的信息污染到训练数据中。为了避免这种泄漏,需对训练数据分区统一进行特征工程,但是分开操作。或确保在训练数据中计算并应用于验证和测试数据的信息,如插补所需的均值和模式,而不是反过来。
对时间数据的错误处理
不要用未来来预测过去。大多数数据都与时间有些关联,无论是显性的,如时间序列数据,还是其他隐含的关系。误用或打破这种关系会导致常见的信息泄漏问题。如果我们处理的是时间相关的数据,模型验证方案中必须使用时间。最基本的规则是,最早的数据应该用于训练分区,而较晚的数据应该根据时间分成验证和测试分区。关于时间序列预测最佳实践的一个可靠(并且免费)资源是Forecasting: Principles and Practice (OTexts)。
多个相同的实体
有时相同的个人、财务或计算交易,或其他建模实体会出现在多个训练数据分区中。当这种情况发生时,必须小心确保机器学习模型不会记住这些个体的特征,然后将这些个体特定的模式应用于新数据中的不同实体。
保留一个未触及的、具有时间意识的留出集,可以帮助诚实估计真实世界性能中的许多信息泄漏问题。如果这样的留出集上的误差或准确性看起来比在模型开发中使用的分区上要不那么乐观,我们可能会有信息泄漏问题。更复杂的建模方案,包括堆叠、门控或赌博,可以使信息泄漏变得更难以预防和检测。然而,一个基本的经验法则仍然适用:不要使用在学习或模型选择中涉及的数据来进行真实性能评估。使用堆叠、门控或赌博意味着我们需要更多的留出数据来为这些复杂模型的不同阶段做出准确的实时质量猜测。对数据验证方案的仔细记录和部署中的模型监控等更一般的控制也对任何机器学习系统都是必要的。
循环输入
随着机器学习系统被纳入更广泛的数字化努力中,或者作为更大决策支持努力的一部分实施,多个数据驱动系统通常会互相交互。在这些情况下,误差传播和反馈循环错误可能会发生。误差传播发生在一个系统中的小错误导致或放大另一个系统中的错误时。反馈循环是一种机器学习系统可能因正确而失败的方式。反馈循环发生在机器学习系统影响其环境,然后这些影响重新纳入系统训练数据时。反馈循环的例子包括预测性警务导致对某些社区的过度警务,或者就业算法通过不断推荐正确但非多样化的候选人而加剧了招聘中的多样性问题。系统之间的依赖关系必须记录,部署的模型必须监控,以便调试工作可以检测到误差传播或反馈循环错误。
过拟合
当复杂的机器学习算法从训练数据中过多地记忆特定信息,却未学习到足够通用概念以便部署后发挥作用时,就会出现过拟合问题。过拟合通常由高方差模型或对于手头数据来说过于复杂的模型引起。过拟合通常表现为在训练数据上的性能明显优于验证、交叉验证和测试数据分区上的性能。由于过拟合是一个普遍存在的问题,有许多可能的解决方案,但大多数都涉及减少所选模型的方差。这些解决方案的示例包括:
集成模型
集成技术,特别是自举聚合(即装袋)和梯度提升已知可以减少单个高方差模型的错误。因此,如果遇到过拟合问题,我们可以尝试其中一种集成方法。请记住,当从单一模型切换到多模型时,虽然可以减少过拟合和不稳定性,但也可能会失去解释性。
减少架构复杂性
神经网络可能有太多的隐藏层或隐藏单元。集成模型可能有太多的基学习器。树可能太深。如果我们认为观察到了过拟合现象,我们会使我们的模型架构更简单。
正则化
正则化指的是许多复杂的数学方法,用于减少机器学习模型中学习规则或参数的强度、复杂性或数量。事实上,现在许多类型的机器学习模型都包含多种正则化选项,因此我们确保使用这些选项来减少过拟合的可能性。
更简单的假设模型家族
一些机器学习模型在初始状态下可能比其他模型更复杂。如果我们的神经网络或梯度提升机(GBM)看起来出现了过拟合现象,我们可以尝试使用更简单的决策树或线性模型。
过拟合传统上被视为机器学习的致命弱点。虽然这是最常见的错误之一,但从安全性和性能角度考虑,它只是许多可能的技术风险之一。与信息泄漏一样,随着机器学习系统变得更加复杂,过拟合变得更难检测。在部署之前,始终保留一组未触及的留存数据集,以评估真实世界的性能。还需要应用更通用的控制措施,如验证方案的文档化、模型监控和在实时数据上进行模型的 A/B 测试,以防止过拟合。
快速学习
快捷学习发生在复杂的机器学习系统被认为是在学习和决策某一主题,比如肺部扫描异常或工作面试表现,但实际上它学习了一些更简单相关的概念,比如机器识别号或 Zoom 视频通话背景。快捷学习往往源于训练数据中纠缠的概念、缺乏构造效度以及未能充分考虑和记录假设和限制。我们使用可解释模型和可解释人工智能技术来理解驱动模型决策的学习机制,并确保我们理解我们的机器学习系统如何做出科学上有效的决策。
欠拟合
如果有人告诉我们关于一组数据的统计信息,我们可能会想知道这些统计数据基于多少数据,以及这些数据的质量是否足够高,可以信任。如果有人告诉我们,他们有数百万、数十亿甚至数万亿的统计数据供我们考虑,他们需要大量数据来证明所有这些统计数据是有意义的。就像平均数和其他统计数据一样,机器学习模型中的每个参数或规则都是从数据中学习的。大型机器学习模型需要大量数据才能学习到足够多的内容,使其数百万、数十亿或数万亿学习机制具有意义。当复杂的机器学习算法缺乏足够的训练数据、约束或其他输入信息时,就会发生欠拟合,它只从训练数据中学习到了一些可泛化的概念,但没有足够的具体内容在部署时发挥作用。欠拟合可以通过在训练和验证数据上表现不佳来诊断。另一个欠拟合的证据是如果我们的模型残差比随机噪声具有显著更多的结构。这表明数据中存在着我们的模型未能检测到的有意义模式,这也是我们检查模型调试的残差的另一个原因。我们可以通过增加模型复杂性或更好地提供训练数据来减轻欠拟合问题。我们还可以通过其他方式提供更多的输入信息,例如新特征、应用于模型参数分布的贝叶斯先验,或各种类型的架构或优化约束。
不充分规范
四十位研究人员最近发表了《“欠规范性对现代机器学习的可信度构成挑战”》。这篇论文为几十年来存在的问题命名,即欠规范性。欠规范性源于核心的机器学习概念——多个优良模型的存在,有时也被称为拉肖蒙效应。对于任何给定的数据集,存在许多准确的机器学习模型。有多少呢?通常远远超过人类技术人员能够理解的范围。虽然我们使用验证数据从训练期间尝试的多个模型中选择一个好的模型,但基于验证数据的模型选择并不足以确保我们选择了最佳模型——甚至是一个可用的模型用于部署。假设某个数据集有一百万个基于训练数据的好的机器学习模型以及大量的潜在假设模型。通过验证数据选择可能会将这些模型减少到一百个模型的池子中。即使在这种简单的情况下,我们仍然只有百分之一的机会选择正确的模型用于部署。我们如何增加这些机会?通过将领域知识注入机器学习模型中。通过将基于验证的模型选择与领域信息约束相结合,我们有更大的机会选择一个适合当前任务的可行模型。
幸运的是,测试欠规范性可能相对简单。欠规范性的一个主要症状是模型性能依赖于与领域结构、数据或模型无关的计算超参数。如果我们的模型性能因随机种子、线程或 GPU 数量或其他计算设置而变化,那么我们的模型可能是欠规范的。另一个测试欠规范性的方法在图 3-1 中有所说明。
图 3-1 展示了在示例训练数据和模型的重要部分中的多个错误和准确度测量。在这里,对于由重要特征PAY_0的高值定义的段落,性能的显著变化指向潜在的欠规范问题,这很可能是由于该区域训练数据的数据稀疏性所致。(在由SEX定义的段落中,性能更加平衡,这是从偏见测试的角度来看一个好迹象,但这当然不是检测偏见问题的唯一测试。)修复欠规范性通常涉及将现实世界的知识应用于机器学习算法中。这样的领域知识机制包括图连接、单调约束、交互约束、beta 约束或其他架构约束。

图 3-1. 分析关键部分的准确度和错误是检测偏见、欠规范性和其他严重机器学习错误的重要调试方法(数字,彩色版本)。
注意
本节、本章以及本书中讨论的几乎所有错误都可能会对某些数据段产生更大影响。为了获得最佳性能,重要的是在训练、验证和测试或留存数据的不同类型段落中测试弱点(性能质量)、过度拟合和欠拟合、不稳定性、分布变化以及其他问题。
在本小节讨论的每个机器学习错误都具有现实世界的安全性和性能影响。这些错误的一个统一主题是,它们导致系统在实际部署和长期使用中表现与预期不同。不可预测的性能会导致意外故障和人工智能事件。利用本文讨论的潜在错误和错误检测方法的知识,确保验证和测试性能的估计与部署性能相关,将有助于预防现实世界中的事件。现在我们知道要找什么错误,从软件、传统评估和机器学习数学的角度出发,接下来我们将讨论如何通过残差分析、敏感性分析、基准模型以及其他测试和监控方法来发现这些错误。
残差分析
残差分析是另一种传统模型评估的类型,对于机器学习模型和系统非常有效。在其最基本的层面上,残差分析意味着从错误中学习。这不仅在生活中非常重要,也在组织的机器学习系统中同样重要。此外,残差分析是一种经过时间考验的模型诊断技术。本小节将使用一个例子和三种通用的残差分析技术来将这一成熟的学科应用于机器学习。
注意
我们使用术语残差来表示适当的误差测量,与模型损失测量有些同义。我们明白这里并非严格按照定义的 ŷ[i]–y[i] 的意义来使用它。我们使用这个术语来强调残差分析在回归诊断中的重要性和悠久历史,并突显其在常见的机器学习工作流中的基本缺失。
请注意,在接下来的章节中,读者可能会看到数据集中的人口特征,比如SEX,用于偏见测试。在很大程度上,本章将把例子信贷放贷问题视为一般的预测建模练习,并不考虑适用的公平放贷法规。关于机器学习中偏见管理以及一些法律和监管问题的深入讨论,请参阅第四章和第十章。
残差分析和可视化
对整体和分段残差进行绘图,并检查它们是否显示出不同问题类型的典型模式,是长期以来的模型诊断技术。残差分析可应用于机器学习算法,通过一些创造性工作和努力,能带来很大的益处。简单地绘制整个数据集的残差可以很有帮助,特别是用于发现导致极大数值误差的异常行或分析误差的整体趋势。然而,按特征和级别分解残差值和图形可能更具信息性。即使我们有很多特征或特征具有多个分类水平,我们也不能掉以轻心。从最重要的特征及其最常见的级别开始。寻找违反模型假设的残差中的强烈模式。许多类型的残差应随机分布,表明模型已从数据中学习到所有重要信息,除了不可避免的噪音。如果我们在按特征和级别分解的残差中发现强烈模式或其他异常情况,我们首先确定这些错误是否来自数据,如果不是,则可以使用 XAI 技术追踪模型中的问题。残差分析被认为是重要的线性回归模型的标准做法。机器学习模型可能面临更高的风险和更多的故障,因此它们需要更多的残差分析。
残差建模
使用可解释模型对残差建模是了解我们的机器学习系统可能出错方式的另一种好方法。在图 3-2 中,我们对从与错过信用卡付款相关的更复杂模型的残差进行了单一且浅层的决策树训练。
该决策树编码了描述更复杂模型错误的规则。例如,我们可以看到当某人错过信用卡付款时,但看起来是一个很好的客户时,模型生成的最大数值残差。当某人的最近的还款状态(PAY_0)小于 0.5,他们第二最近的还款金额(PAY_AMT2)大于或等于 2,802.50,他们第四最近的还款状态(PAY_4)小于 1,并且他们的信用额度大于或等于 256,602 时,我们看到平均对数损失残差为 2.71。这是一个大的错误率,会拉低我们的整体性能,并且如果我们对已受青睐的人口群体做出太多的误判,可能会产生偏见后果。
另一个有趣的用途是使用决策树创建模型断言,即关于模型预测的实时业务规则,可以在发生错误时进行标记。在某些情况下,这些断言可能仅仅是警示模型监控器可能正在发布错误决策,或者模型断言可能涉及纠正措施,例如将这行数据路由到更专业的模型或人工案件工作者。

图 3-2. 一个可解释的决策树模型,用于错过信用卡支付的客户
对残差的本地贡献
绘制和建模残差是精通者熟悉的更古老的技术。最近的一个突破使得可以计算出对模型错误的 Shapley 值贡献。这意味着对于任何数据集的任何特征或行,我们现在可以知道哪些特征驱动了模型的预测,哪些特征驱动了模型的错误。这个进步对于 ML 究竟意味着什么,尚有待确定,但可能性确实令人着迷。这种新的 Shapley 值技术的一个明显应用是比较预测的特征重要性和残差的特征重要性,如 图 3-3 中所示。

图 3-3. 对预测和模型错误的 Shapley 特征重要性进行比较(数字化、彩色版本)
在 图 3-3 中,预测的特征重要性显示在上方,以 logloss 计算的模型错误的特征重要性显示在下方。我们可以看到,PAY_0 在预测和错误中都占主导地位,从而证实了该模型在一般情况下过于依赖PAY_0。我们还可以看到,相较于对预测的贡献,PAY_2 和 PAY_3 在对错误的贡献上排名更高。鉴于此,尝试删除、替换或损坏这些特征可能是有意义的。请注意,图 3-3 是通过在整个验证数据集上汇总对 logloss 的 Shapley 贡献而制作的。然而,这些数量是逐个特征和逐行计算的。我们还可以将这种分析应用于数据中的段或人口群体,这为检测和纠正模型下不稳定特征的有趣可能性打开了新的可能性。
警告
类似 图 3-3 的特征重要性图,一个特征远远超过其他所有特征,这对 vivo 的可靠性和安全性非常不利。如果该单一重要特征的分布发生变化,我们的模型性能就会受到影响。如果黑客找到一种修改该特征值的方法,他们就可以轻易操纵我们的预测。当一个特征主导了模型,我们很可能需要一个与该特征相关的业务规则,而不是一个 ML 模型。
这结束了我们对 ML 的残差分析的简要介绍。当然,还有其他研究 ML 模型错误的方法。如果读者喜欢其他方法,那就去试试吧!重要的是对所有高风险的 ML 系统进行某种残差分析。除了接下来要讨论的敏感性分析,残差分析是 ML 模型调试工具箱中的一个必不可少的工具。
敏感性分析
与线性模型不同,很难理解机器学习模型在新数据上的外推或性能,除非明确对其进行测试。这就是敏感性分析的简单而强大的理念。找到或模拟有趣的场景数据,然后查看我们的模型在该数据上的表现。除非进行基本的敏感性分析,否则我们真的不会知道我们的机器学习系统在这些情景中的表现如何。当然,还有结构化和更有效的敏感性分析变体,比如微软研究院的InterpretML库。进行敏感性分析的另一个好选择,也是更高级模型调试技术的良好起点,是随机攻击,如“软件测试”中讨论的。像压力测试、可视化和对抗示例搜索等其他方法也提供了标准化的敏感性分析方式:
压力测试
压力测试涉及模拟代表现实逆境场景的数据,如经济衰退或大流行,并确保我们的机器学习模型和任何下游业务流程能够抵御逆境情况的压力。
可视化
可视化,如累积局部效应的绘图、个体条件期望和部分依赖曲线,是观察机器学习算法在各种真实或模拟输入特征值下性能的已知高度结构化方法。这些图表还可以揭示可能导致模型性能弱点的数据稀疏区域。
对抗示例搜索
对抗示例是能够引起机器学习模型意外反应的数据行。深度学习方法可用于生成非结构化数据的对抗示例,而 ICE 和遗传算法可用于生成结构化数据的对抗示例。对抗示例(及其寻找过程)是发现我们机器学习响应函数或决策边界局部不稳定性的一种好方法,一旦部署可能引发事故。正如读者可以在图 3-4 中看到的那样,对抗示例搜索是评估模型性能的一种极佳方式。
符合性方法
符合性方法尝试计算模型预测的经验界限,可以通过建立模型输出的上限和下限来帮助我们理解模型的可靠性。
扰动测试
随机扰动验证、测试或保留数据以模拟不同类型的噪声和漂移,然后重新测量 ML 模型的性能,也可以帮助确定模型鲁棒性的一般界限。通过这种扰动测试,我们可以理解和记录会破坏我们模型的噪声或漂移量。需要记住的一件事是,表现不佳的行通常在扰动测试下的表现下降速度比平均行更快。要仔细观察表现不佳的行,以了解它们何时会拖累整个模型的性能。

图 3-4。展示有趣模型行为的对抗性示例搜索结果(数字,彩色版本)
图 3-4 首先通过找到展示预测大幅波动的 ICE 曲线来创建。使用负责该 ICE 曲线的数据行作为种子,对该行中的四个最重要特征的值进行数千次扰动并生成相关预测,从而导致图 3-4 中的多个图表。对敌对示例搜索的第一个发现是,基于 ICE 曲线的这种启发式技术使我们能够生成几乎可以从模型中获得任何响应的对抗性示例。我们发现,某些行可可靠地产生非常低和非常高的预测以及两者之间的一切。如果此模型可通过预测 API 使用,我们可以轻松操纵它。
在寻找所有这些对抗性示例的过程中,我们还了解了有关我们的模型的一些信息。首先,总体上它可能是单调的,并且在我们模拟的所有行中绝对是单调的。其次,该模型针对那些进行了极高支付的人会发出默认预测。即使某人最近的支付金额是一百万美元,并且超过了他们的信用额度,一旦此人的最近付款逾期两个月,该模型将会发出默认预测。这可能对提前还款构成问题。我们真的想为那些预付了数百万美元但现在最近付款逾期两个月的人发出默认或违约决定吗?也许是,但这不是应该迅速或自动做出的决定,就像这个模型会做的那样。第三,看起来我们可能已经找到了真正的对抗性示例攻击路径。最近低还款金额导致违约概率显著增加。如果黑客想从这个模型中引发高违约预测,设置PAY_AMT1和PAY_AMT2为低值可能是他们的方法。
就像我们在残差分析中提到的那样,读者可能会想到其他的敏感性分析技术,这是很好的。只是确保在你的机器学习模型上应用某种形式的现实模拟测试。本章的案例研究就是一个在部署机器学习系统前未进行现实模拟测试导致的最糟糕结果的例子。这就结束了我们对敏感性分析的简要讨论。对于那些希望更深入了解的人,我们推荐凯文·墨菲的免费开放书籍Probabilistic Machine Learning: Advanced Topics(MIT 出版社)第十九章。接下来,我们将讨论不同背景下的基准模型,这是一种经过时间考验和常识化的模型调试方法。
基准模型
本章的多个部分都讨论了基准模型。它们是非常重要的安全和性能工具,在整个机器学习生命周期中都有用。本小节将讨论在模型调试的背景下使用基准模型,并总结其他关键用途。
注意
在可能的情况下,比较机器学习模型的性能与线性模型或广义线性模型的性能基准。如果线性模型胜过机器学习模型,则使用线性模型。
使用基准模型进行调试的第一种方法是比较基准和问题机器学习系统的性能。如果机器学习系统无法胜过简单的基准模型——很多情况下可能是如此——那么就得重新来过。假设一个系统通过了这个初始基线测试,基准模型可以用作比较工具,用于审查机制并找出机器学习系统中的 bug。例如,数据科学家可以提出这样的问题:“我的基准模型预测正确而我的机器学习系统预测错误的是哪些?”鉴于基准模型应该是被充分理解的,应该清楚它为什么是正确的,这种理解也应该提供一些线索,表明机器学习系统出了什么问题。基准还可以用于可复现性和模型监控,如下所述:
可复现性基准
在对复杂的机器学习系统进行更改之前,有必要有一个可复现的基准模型,用于衡量性能的增减。一个可复现的基准模型是这种测量任务的理想工具。如果这个模型可以被集成到允许自动化测试可复现性和将新系统更改与已建立基准进行比较的 CI/CD 流程中,那就更好了。
调试基准
将复杂的机器学习模型机制和预测与一个信任的、深入理解的基准模型的机制和预测进行比较,是发现机器学习 bug 的有效方法。
监控基准
在一个受信任的基准模型和复杂的机器学习系统之间比较实时预测是捕捉严重机器学习错误的一种方式。如果一个受信任的基准模型和复杂的机器学习系统对相同的新数据实例给出明显不同的预测,这可能是机器学习黑客、数据漂移,甚至偏见和算法歧视的迹象。在这种情况下,可以使用基准预测代替机器学习系统的预测,或者在人类分析员确定机器学习系统预测有效之前暂停预测。
注意
请记住,调试技术通常是靠不住的统计或机器学习方法,有时甚至需要对它们进行调试。
如果我们有效地设置基准,甚至可能可以使用同一个模型执行所有三项任务。可以在开始工作之前运行基准来建立基线,然后将同一个模型用于调试和模型监控的比较。当一个新版本的系统以可重复的方式优于旧版本时,系统核心的机器学习模型可以成为新的基准。如果我们的组织能够建立这种工作流程,我们将通过基准和迭代的方式提高机器学习的安全性和性能。
修复:修复错误
调试的最后一步是修复错误。前面的小节已经概述了测试策略、需要注意的错误以及一些具体的修复方法。本小节概述了一般的机器学习错误修复方法,并讨论了如何在示例调试场景中应用这些方法。在机器学习模型调试期间需要考虑的一般策略包括以下几点:
异常检测
奇怪的输入和输出通常对机器学习系统不利。这些可能是实时安全性、偏见或安全性与性能问题的证据。监视机器学习系统的数据队列和预测结果,记录异常事件的发生,并在必要时提醒利益相关者。
注意
可以使用一些基于规则、统计和机器学习技术来检测未见数据队列中的异常。这些技术包括数据完整性约束、置信限、控制限、自编码器和孤立森林。
实验设计和数据增强
收集更好的数据通常可以解决机器学习错误。此外,数据收集不必通过反复试验,数据科学家也不必依赖其他组织流程的数据副产品来选择训练数据。设计实验的成熟科学已经被数据从业者使用了几十年,以确保他们收集适当类型和数量的数据进行模型训练。关于“大”数据的普遍权威和过度压缩的部署时间表是数据科学家不实践设计实验的最常见原因。不幸的是,这些不是忽视设计实验的科学理由。
模型断言
模型断言是应用于 ML 模型预测的业务规则,用于修正学习的 ML 模型逻辑中的缺陷。使用业务规则来改进预测模型是一种历史悠久的补救技术,可能会伴随我们数十年。如果存在简单的逻辑规则可以应用于纠正可预见的 ML 模型失败,请勇敢地实施。在预测分析领域,最优秀的从业者和组织已经使用这个技巧几十年了。
模型编辑
鉴于 ML 模型是软件,这些软件构件可以被编辑以纠正发现的任何错误。某些模型,如 GA2Ms 或可解释增强机(EBMs),旨在被编辑用于模型调试。其他类型的模型可能需要更多的创造力来编辑。无论如何,编辑必须由领域考虑来证明,因为这可能使训练数据上的表现看起来更差。ML 模型优化以降低误差。如果我们编辑这个高度优化的结构以使领域内性能更好,我们很可能会恶化传统的评估统计数据。没关系。我们更关心体内的安全性、鲁棒性和可靠性,而不是硅内测试错误。
模型管理和监控
ML 模型及其容纳它们的 ML 系统是动态实体,必须根据资源允许的程度进行监视。所有关键任务的 ML 系统应该有良好的文档记录、清单和实时监控安全、偏倚、安全性和性能问题。当某些事情开始出错时,利益相关者需要快速得到警报。"部署"给出了有关模型监控的更详细处理。
单调性和交互约束
许多 ML 错误发生是因为 ML 模型具有过多的灵活性,并且由于学习自偏倚和不准确的训练数据而脱离现实。用现实世界的知识约束模型是解决几种 ML 错误的一般方法。在像 XGBoost 这样的流行工具中,单调性和交互约束可以帮助 ML 从业者在复杂的 ML 模型中执行逻辑领域假设。
噪声注入和强正则化
许多 ML 算法都有正则化的选项。然而,如果 ML 模型过分强调某个特征,可能需要应用更强或外部的正则化。L0 正则化可以直接用于限制模型中的规则或参数数量,当必要时,可以使用手动噪声注入来破坏某些特征的信号,以减少那些在 ML 模型中不当重要的特征。
科学方法
数据科学家、ML 工程师、他们的经理和业务合作伙伴之间的确认偏见经常共谋,将半成品演示推向市场产品,基于体外测试数据评估的假设和局限性。如果我们能够遵循科学方法,记录关于实际结果的假设,并通过设计的实验客观地测试该假设,我们在实际应用中取得成功的机会就会大大提高。有关在 ML 中使用科学方法的更多想法,请参阅第十二章。
警告
通常来说,机器学习(ML)仍然更像是经验科学而不是工程学科。我们尚未完全理解 ML 在何种情况下表现良好以及可能的所有失败方式,特别是在实际应用中。这意味着我们必须应用科学方法,避免问题,如确认偏见,以达到良好的实际应用效果。仅仅使用正确的软件和平台,并遵循工程最佳实践,并不意味着我们的模型会表现良好。
有关模型调试和示例数据及模型的详细信息,请参见“资源”。目前,我们已经学到了关于模型调试的很多知识,现在是时候转向部署的 ML 系统的安全性和性能。
部署
一旦发现并修复了 bug,就是时候部署我们的 ML 系统以进行实际决策了。ML 系统比大多数传统软件系统更加动态。即使系统操作员不更改任何代码或系统设置,结果仍可能发生变化。一旦部署,必须检查 ML 系统的领域安全性和性能,必须对其进行监控,并确保操作员能够迅速关闭它们。本节将介绍如何增强 ML 系统部署后的安全性和性能:领域安全性、模型监控和紧急关闭开关。
领域安全性
领域安全性意味着在实际世界中的安全性。这与标准的模型评估甚至改进后的模型调试非常不同。从业者如何朝着实现实际世界安全目标的方向努力?A/B 测试和冠军挑战方法允许在实时操作环境中进行一定量的测试。流程控制,如列举可预见的事件、实施用于应对潜在事件的控制措施,并在真实或有压力的条件下测试这些控制措施,对于实现实际应用的稳定性非常重要。为了弥补无法预测的事件,我们对 ML 系统输出应用混沌测试、随机攻击和手动预测限制。让我们将事件分为可以预见的和无法预见的,并考虑这两种情况的一些细节:
可预见的实际世界事件
A/B 测试和冠军挑战者方法是通过在实时数据流或其他现实条件下相互测试模型的第一步,以实现领域内健壮测试。除了这些较为标准的做法之外,资源应该投入到领域专家和思考可能发生的事件上。例如,在信贷借款中常见的故障模式包括偏见和算法歧视、缺乏透明度以及在经济衰退期间表现不佳。对于其他应用,比如自动驾驶车辆,它们可能会以多种方式意外或有意造成伤害。一旦记录了潜在的事件,那么安全控制措施就可以被采用来针对最可能或最严重的潜在事件。在信贷借款中,模型被测试是否存在偏见,通过不利行动通知向消费者提供解释,并且对模型进行监控以便及时捕捉性能下降。在自动驾驶车辆领域,我们仍需学习很多,正如"案例研究:自动驾驶车辆致死"将展示的那样。无论是哪种应用,安全控制措施必须进行测试,并且这些测试应该是现实的,并与领域专家合作进行。当涉及到人类安全时,由数据科学家运行的模拟不足够。安全控制措施需要在活体中进行测试和加固,并与深刻理解应用领域安全的人员协调一致。
不可预见的现实世界事件
机器学习系统与其环境之间的互动可能是复杂且令人惊讶的。对于高风险的机器学习系统,最好承认可能会发生不可预见的事件。我们可以尝试在这些潜在的惊喜发生之前,通过混乱测试和随机攻击来捕获一些问题。重要的机器学习系统应该在奇怪和混乱的使用案例中进行测试,并暴露于大量随机输入数据。尽管这些测试需要耗费时间和资源,但它们是少数几个可用来测试所谓的“未知未知”的工具之一。鉴于没有测试制度能够捕捉到每一个问题,将常识性的预测限制应用于系统也是理想的。例如,在没有人工监督的情况下,不应该发放大额贷款或高利率。也不应该让自动驾驶车辆以非常高的速度行驶,而缺乏人类干预。今天,有些行动仍然不应完全自动执行,预测限制是实施这种控制的一种方式。
领域安全的另一个关键方面是知晓是否发生问题。有时候,故障可能在变成有害事件之前被捕获到。为了迅速发现问题,机器学习系统必须进行监控。如果检测到事件,可能需要启动事件响应计划或者关闭开关。
模型监控
在本章中已经多次提到,重要的机器学习系统一旦部署,必须进行监控。本小节重点讨论模型监控的技术方面。它概述了模型衰减、稳健性和概念漂移漏洞的基础知识,如何检测和解决漂移问题,以及在监控中测量多个关键绩效指标(KPIs)的重要性,并简要突出了一些其他值得注意的模型监控概念。
模型衰减和概念漂移
无论我们如何称呼它,输入到机器学习系统中的数据很可能会偏离系统训练时的数据。随着时间推移,输入值分布的变化有时被称为数据漂移。我们试图预测的统计特性也可能会漂移,有时这特指为概念漂移。COVID-19 危机很可能是历史上这些现象的最佳例证之一。在疫情高峰期间,消费者行为很可能向更加谨慎的方向漂移,伴随着迟付和信用违约分布的整体变化。这些变化是痛苦的,它们可能会严重影响机器学习系统的准确性。需要注意的是,我们有时会因为离标使用机器学习模型而导致自己的概念漂移问题。
注意
输入数据和预测结果都可能会漂移。这两种漂移都可以被监测到,而且这两种漂移可能直接相关也可能不相关。当性能下降时,如果没有显著的输入漂移,这可能是由于现实世界中的概念漂移。
检测和解决漂移
检测漂移的最佳方法是监控实时数据的统计属性——包括输入变量和预测。一旦建立了监控统计属性的机制,我们可以设置警报或告警,以在发生重大漂移时通知利益相关者。测试输入通常是开始检测漂移的最简单方法。这是因为有时候长时间内不可能知道真实的数据标签,即与 ML 系统预测相关联的真实结果值。相反,输入数据值在 ML 系统必须生成预测或输出时立即可用。因此,如果当前输入数据属性与训练数据属性不同,我们可能面临问题。由于比较当前和训练质量所需的信息不能立即获得,监视 ML 系统输出的漂移可能更加困难。 (考虑抵押贷款违约与在线广告点击不同时发生的情况。)监控预测的基本思想是实时观察预测并寻找漂移和异常,可能使用统计测试、控制限和规则或 ML 算法来捕捉异常值。而当已知的结果变得可用时,测试模型性能的下降并快速和频繁地进行持续偏差管理。
有已知的策略来解决不可避免的漂移和模型衰减。这些包括以下内容:
-
使用包含一定量新数据的扩展训练数据刷新 ML 系统
-
频繁刷新或重新训练 ML 系统
-
当检测到漂移时,刷新或重新训练 ML 系统
值得注意的是,任何生产中的 ML 模型重新训练都应遵循本章和书中其他地方讨论的风险缓解技术,就像它们应用于 ML 系统的初始训练一样。
监控多个关键绩效指标
大多数关于模型监控的讨论侧重于模型准确性作为主要的关键绩效指标(KPI)。然而,偏差、安全漏洞和隐私损害也应该被监控,可能也应该被监控。在新的已知结果可用时,可以应用与训练时相同的偏差测试。在第五章和第十一章讨论的众多其他策略中,可以用来检测可能危及系统安全或隐私的恶意活动。如果可能的话,可能是最关键的 KPI 是 ML 系统的实际影响。无论是节省或创造金钱,还是挽救生命,衡量 ML 系统的预期结果和实际价值可以带来关键的组织见解。在分类问题中,为混淆矩阵单元分配货币或其他值,并为回归问题中的残余单元分配货币或其他值,是估计实际业务价值的第一步。请参见第八章,以获取估计业务价值的基本示例。
超出范围的值
训练数据永远无法覆盖 ML 系统在部署后可能遇到的所有数据。大多数 ML 算法和预测功能无法很好地处理超出范围的数据,可能会简单地发出平均预测或崩溃,而不会通知应用软件或系统操作员。ML 系统操作员应该做出具体安排来处理数据,如大量数值、罕见分类值或在训练期间未遇到的缺失值,以确保 ML 系统在遇到超出范围的数据时能正常运行并警告用户。
异常检测和基准模型
异常检测和基准模型在本小节中补充了关于模型监控的技术讨论。这些主题在本章的其他地方已经讨论过,并在此处简要涉及了监控的背景下:
异常检测
ML 系统中的奇怪输入或输出值可能表明稳定性问题或安全和隐私漏洞。可以使用统计数据、ML 和业务规则来监控输入和输出的异常行为,以及整个 ML 系统。记录任何检测到的异常行为,向利益相关者报告,并在必要时准备采取更严厉的行动。
基准模型
将简单基准模型与 ML 系统预测进行比较作为模型监控的一部分,可以帮助及时发现稳定性、公平性或安全性异常。基准模型应更稳定,更易确认为最少歧视性,且更难以被攻击。我们在评分新数据时同时使用高度透明的基准模型和更复杂的 ML 系统,然后实时比较 ML 系统的预测与信任的基准预测。如果 ML 系统与基准模型之间的差异超过某个合理的阈值,那么退回到发出基准模型的预测或者将数据行发送进行更多审查。
无论是新数据中的超出范围值、令人失望的关键绩效指标、漂移或异常—这些实时问题是 AI 事件发生的关键节点。如果我们的监控检测到这些问题,自然而然的反应可能是关闭系统。下一小节将专门讨论这个问题:ML 系统的紧急停止开关。
紧急停止开关
紧急停止开关很少是单独的开关或脚本,而是一套捆绑在一起的业务和技术流程,用于尽可能地关闭 ML 系统。在触发类比的紧急停止开关之前,需要考虑很多因素。ML 系统的输出通常会进入下游的业务流程,有时包括其他 ML 系统。这些系统和业务流程可能是使命关键的,例如用于信贷核准或电子零售支付验证的 ML 系统。要关闭 ML 系统,不仅需要正确的技术知识和可用的人员,还需要理解该系统在更广泛组织流程中的位置。在进行中的 AI 事件中开始考虑关闭严重缺陷的 ML 系统是一个糟糕的时机。因此,紧急停止流程和紧急停止开关是我们 ML 系统文档和 AI 事件响应计划的重要补充(见第一章)。这样,当需要关闭 ML 系统时,我们的组织可以做出迅速而明智的决定。希望我们永远不会处于必须触发 ML 系统紧急停止开关的境地,但不幸的是,近年来 AI 事件变得越来越常见。当在技术补救方法与文化能力和业务流程相结合时,可以增强 ML 系统的安全性和性能。如果不应用这些控制措施,可能会发生糟糕的事情。
案例研究:自动驾驶车辆致命事件
2018 年 3 月 18 日晚,伊莱恩·赫兹伯格在亚利桑那州凤凰城的一个宽广的十字路口推着自行车过马路。在成为最引人注目的 AI 事故之一的事件中,她被一辆自动驾驶的 Uber 测试车辆撞击,该车以大约 40 英里每小时的速度行驶。根据国家运输安全委员会(NTSB)的说法,测试车辆的驾驶员在紧急情况下有义务控制车辆,但却因手机分心。自动驾驶的机器学习系统也未能拯救赫兹伯格女士。直到撞击前 1.2 秒系统才识别出她,已经太晚避免了严重的碰撞。
后果
自动驾驶车辆被认为比今天由人操作的车辆提供更多安全保障。虽然涉及自动驾驶汽车的致命事故很少见,但机器学习自动驾驶尚未兑现更安全道路的最初承诺。NTSB 的报告指出Uber 的“系统设计未考虑行人乱穿马路的情况”。报告还批评公司松散的风险评估和不成熟的安全文化。此外,Uber 员工在凤凰城事故前几天就严重关注了前 18 个月内的 37 起事故以及测试车辆驾驶员的常见问题。由于凤凰城的事故,Uber 在其他四个城市停止了自动驾驶车辆的测试,美国和加拿大各地的地方政府开始重新审视自动驾驶车辆测试的安全协议。驾驶员被控过失杀人罪。Uber 被免除刑事责任,但与遇难者家属达成了经济赔偿协议。Tempe 市和亚利桑那州还因赫兹伯格女士家属对他们分别索赔 1000 万美元而被起诉。
一个不做准备的法律体系
必须指出,美国的法律体系在处理人工智能事故的现实中显得有些措手不及,这可能会使员工、消费者和一般公众在面对我们中间运行的机器学习系统带来的独特危险时,基本上毫无保护。欧洲议会已提出了针对机器学习系统的责任制度,这将大部分防止大型技术公司逃避未来事件中的责任。在美国,任何关于联邦人工智能产品安全法规的计划仍处于初步阶段。在此期间,AI 安全事故的个别案例可能会由缺乏处理 AI 事故教育和经验的下级法院决定,使大科技公司和其他机器学习系统运营商能够利用极不对称的法律资源来对付卷入复杂机器学习系统事故的个人。即使对于公司和机器学习系统运营商来说,这种法律空白也并非理想。虽然缺乏法规似乎有利于那些拥有最多资源和专业知识的人,但这也使得风险管理和预测 AI 事故结果变得更加困难。无论如何,未来的世代可能会因我们允许将第一起 AI 事故的刑事责任,牵涉到许多数据科学家和其他高薪专业人士及高管,全部归咎于一名据称是自动驾驶车辆的安全驾驶员而对我们进行严厉的评判。
学到的教训
从这一章节和之前的章节中学到了什么教训可以应用到这个案例中?
第一课:文化至关重要。
成熟的安全文化是一种广泛的风险控制措施,将安全置于设计和实施工作的前沿,并在流程和技术遗漏的特殊情况下弥补不足。从上一代改变生活的商业技术(如航空航天和核能)中汲取的经验表明,优步如果有更成熟的安全文化,可能已经可以预防这起事件,尤其是因为事故发生前几天有员工提出了严重的担忧。
第二课:减轻可以预见的故障模式。
国家运输安全委员会(NTSB)得出结论称,优步的软件并未将乱穿马路的行人视为故障模式。对于任何开过有行人的车的人来说,这应该是一个很容易预见的问题,任何自动驾驶汽车都应该做好准备。通常情况下,除非人类工程师为此做好准备,机器学习系统并不会为这类事件做好准备。这一事件向我们展示了当这些准备工作未提前做好时会发生什么。
第三课:在其运行领域测试机器学习系统。
碰撞后,Uber 停止并重置其自动驾驶汽车程序。改进后,它能够通过模拟展示,新软件在撞击前四秒就开始失效。为什么在 2018 年 3 月的撞车事件之前,没有将步行的行人这种易预见的现实用相同的领域模拟测试呢?公众可能永远不会知道。但是列举失败模式并在现实场景中测试它们可以防止我们的组织不得不回答这类令人不快的问题。
一个潜在的额外教训是考虑不仅是意外故障,比如 Uber 的事故,还有针对 ML 系统的恶意黑客攻击以及利用 ML 系统进行暴力行为。恐怖分子以前曾将机动车辆变成致命武器,所以这是一个已知的失败模式。必须在自动驾驶汽车和驾驶辅助功能中采取预防措施,以防止黑客攻击和暴力事件。无论是意外还是恶意攻击,AI 事故肯定会造成更多人员伤亡。我们希望政府和其他组织能认真对待 ML 安全问题,并在未来尽量减少这类严峻事件的发生。
资源
进一步阅读
代码示例
第四章:机器学习中的偏见管理
在机器学习系统中管理偏见的有害影响远不止于数据、代码和模型。我们数据科学家被教导用来评估模型优良性的主要方法——模型的平均性能质量——与其是否导致现实世界中的偏见有害几乎无关。即使是完全准确的模型也可能造成偏见危害。更糟糕的是,所有的机器学习系统都表现出一定程度的偏见,偏见事件似乎是最常见的 AI 事件之一(参见图 4-1)。业务流程中的偏见通常会带来法律责任,并且 ML 模型中的偏见会实实在在地伤害到人们。

图 4-1. 根据对 1988 年至 2021 年 2 月 1 日之间 169 起公开报道事件的定性分析,展示了不同类型 AI 事件的频率(图片由 BNH.AI 提供)。
本章将提出一些在社会技术方面检测和减轻偏见的方法,至少作为我们作为实践技术人员的最佳努力。这意味着我们将努力理解 ML 系统偏见在更广泛社会背景下的存在。为什么呢?所有 的 ML 系统都是社会技术系统。一开始我们可能很难相信这一点,所以让我们通过一个例子来深入思考。让我们考虑一个用于预测物联网应用中传感器故障的模型,该模型只使用其他自动化传感器的信息。该模型很可能是由人类训练的,或者是某个人决定需要这样一个模型。此外,该模型的结果可能被用来指导订购新传感器,这可能会影响制造工厂的就业或者那些负责修理或更换故障传感器的人员。最后,如果我们的预防性维护模型失败,那些与系统互动的人可能会受到伤害。对于我们能够想到的每一个看似纯技术的例子,决策技术如 ML 不能不与某种形式的人类互动。
这意味着在 ML 系统中解决偏见问题没有纯技术的解决方案。如果读者希望直接跳到偏见测试和偏见修正的代码中,请参阅第十章。但我们不建议这样做。读者会错过关于偏见是什么以及如何以积极方式思考它的重要信息。本章首先通过几个权威来源定义偏见,以及如何识别可能影响我们建立 ML 系统或我们用户解释结果的认知偏见。然后,本章将广泛概述谁倾向于在 AI 偏见事件中受到伤害以及他们经历的伤害类型。接下来,我们将介绍测试 ML 系统中偏见的方法,并讨论使用技术和社会技术方法减轻偏见。最后,本章将通过 Twitter 图像裁剪算法的案例讨论来结束。
注意
有些偏差管理的方面必须根据模型的具体架构进行调整,但很多偏差管理并不是特定于模型的。本章中的许多理念,特别是从 NIST SP1270 偏差指南和 Twitter 偏差悬赏中得出的理念,可以应用于像 ChatGPT 或 RoBERTa 语言模型这样的各种复杂 AI 系统。如果读者想要看到实践情况,请查看 IQT Labs 的RoBERTa 审计。
ISO 和 NIST 对偏差的定义
国际标准化组织(ISO)在《“Statistics—Vocabulary and Symbols—Part 1”》中将偏差定义为“参考值偏离真实值的程度”。这是偏差的一个非常一般的概念,但偏差是一个复杂且异质的现象。然而,在所有情况下,它都是关于从真实值出现的某种系统偏离。在决策任务中,偏差表现出多种形式。基于人们皮肤中黑色素水平而拒绝人们就业是实质性和伦理上的错误。仅仅因为某个想法是第一个浮现的并不代表它是正确的是事实上的错误。而仅仅基于不完整和不具代表性的数据训练 ML 模型也是实质性和伦理上的错误。在最近的 NIST 工作中,《“Towards a Standard for Identifying and Managing Bias in Artificial Intelligence”(SP1270)》将偏差主题分为三大类别,与这些偏差示例相一致:系统性、统计性和人为偏差。
系统性偏差
在 ML 中,我们常说的偏差通常指的是系统性偏差。这些是历史性的、社会的和制度性的偏差,遗憾的是,它们已经深深融入我们的生活中,并且在 ML 训练数据和设计选择中默认出现。系统性偏差在 ML 模型中的常见后果是将人口统计信息纳入系统机制中。这种纳入可能是明显和明确的,例如当语言模型(LMs)被重新用于生成针对特定人口群体的有害和冒犯性内容时。然而,在实践中,将人口统计信息纳入决策过程往往是无意和隐性的,导致跨人口群体之间出现不同的结果率或结果普遍性,例如将更多男性简历与更高薪职位描述匹配,或设计问题排斥某些用户群体(例如身体残疾者)与系统进行交互。
统计性偏差
统计偏见可以被视为人类在规范机器学习系统时所犯的错误,或者像概念漂移这样的影响机器学习模型的新兴现象,这些现象对人类来说很难消除。统计偏见的其他常见类型包括基于不具代表性的训练数据进行预测,或者误差传播和反馈循环。机器学习模型中统计偏见的一个潜在指标是在不同数据交叉部分(例如人口统计群体)中的性能质量差异。机器学习模型的差异有效性是一种特定类型的偏见,与人类偏见描述的不同结果率或结果普遍性略有不同。实际上,维护人口统计群体内模型性能的最大化与维护正面结果率的平等之间存在文件化的紧张关系。统计偏见还可能导致严重的人工智能事件,例如当新数据中的概念漂移使系统的决策比正确决策更多,或者当反馈循环或误差传播导致短时间内大量错误预测的产生时。
人类偏见与数据科学文化
在设计、实施和维护机器学习系统的个人和团队中,可能会出现多种人类或认知偏见。有关更完整的人类偏见列表,请阅读 NIST SP1270 指导文件。以下是我们经常看到的最频繁影响数据科学家和机器学习系统用户的人类偏见:
锚定
当一个特定的参考点或锚点对人们的决策产生不当影响时。就像当一个最先进的深度学习模型的基准值长期停留在 0.4 AUC,然后有人得到了 0.403 AUC。我们不应该认为这很重要,但我们却被固守在 0.4 上。
可用性启发法
在决策过程中,人们往往会过分重视易于或迅速浮现在脑海中的事物。换句话说,我们经常将易记住与正确混淆。
确认偏见
人们倾向于偏爱与自己现有信念一致或确认的信息。当我们自欺欺人地认为我们的机器学习模型比实际效果更好时,确认偏见在机器学习系统中就成了一个大问题。
邓宁-克鲁格效应
在某一领域或任务中能力较低的人倾向于高估他们的自我评估能力。当我们允许自己认为我们是某件事的专家,只因为我们能import sklearn并运行model.fit()时,这种情况就会发生。
资金偏见
偏向于突出或促进支持或满足项目资助机构或财务支持者结果的偏见。我们做让老板开心的事情,让投资者开心的事情,以及增加我们自己薪水的事情。真正的科学需要防止其进展被有偏见的财务利益改变的保障措施。
群体思维
当一个群体中的人们倾向于根据他们希望符合群体或害怕与群体唱反调的愿望而做出非最优决策时。即使我们有信心自己是对的,也很难不同意我们的团队。
麦克纳马拉谬误
认为决策应该仅基于定量信息,而忽视难以衡量的定性信息或数据点的信念。
技术至上主义
认为技术总是解决方案的信念。
所有这些偏见都可能导致不恰当和过于乐观的设计选择,进而导致系统部署时的性能不佳,最终给系统用户或操作者带来伤害。我们将进一步探讨可能出现的伤害及如何解决这些问题。目前,我们想强调一个常识性的缓解措施,这也是本章的主题之一。我们不能不从多个不同的视角来看待问题就妥善处理偏见。在机器学习中,抵抗偏见的第一步是在做出系统重要决策时,确保有一个多元化的利益相关者团队在场(或视频会议中)。为了避免那些使偏见的机器学习模型造成伤害的盲点,我们需要多种不同类型的视角来指导系统的设计、实施和维护决策。是的,我们在讨论从不同的人口统计学视角收集意见,包括那些有残疾的人。我们也在谈论教育背景,比如社会科学家、律师和领域专家。
此外,考虑数字鸿沟。令人震惊的是,仍然有相当大比例的人口无法接入良好的互联网连接、新计算机和像本书这样的信息。如果我们对用户作出结论,我们需要记住有一大部分人口无法包含在用户统计中。忽略潜在用户是系统设计、偏见测试和机器学习生命周期中其他关键时刻的重大偏见和伤害源。如今,机器学习的成功仍然需要那些深刻理解我们试图解决的现实世界问题,并且了解我们的设计、数据和测试可能会排除哪些潜在用户的人参与。
美国的机器学习偏见法律概念
我们应该注意许多重要的法律偏见概念。然而,理解法律体系是极其复杂和依赖背景的也很重要。仅仅知道一些定义还远远不足以使我们在这些问题上具备真正的专业知识。作为数据科学家,法律事务是我们不应该让邓宁-克鲁格效应占据上风的领域。有了这些警示,让我们来简单概述一下。
警告
如果您对 ML 模型中的偏见有任何疑问或担忧,请立即联系您的法律团队。处理 ML 模型中的偏见是信息经济中最困难和严重的问题之一。数据科学家需要律师的帮助来妥善解决偏见风险。
在美国,影响公众的决策过程中的偏见问题已被监管数十年。美国早期法律和法规的一个主要焦点是就业事务。像受保护组、不公平待遇和不公平影响这样的概念现在已扩展到更广泛的消费金融和住房法律,并且甚至被引用到像纽约市雇用中使用的 AI 审计要求等全新的地方法律中。欧盟中的非歧视问题在《基本权利宪章》、《欧洲人权公约》以及《欧盟职能条约》中得到了解决,对我们来说尤为重要的是在拟议的欧盟 AI 法中的某些方面。虽然要总结这些法律和法规是不可能的,甚至在美国这边,以下定义我们认为最直接适用于数据科学家日常工作。它们很粗略地取自《民权法案》、《公平住房法案》(FHA)、《平等就业机会委员会》(EEOC)法规、《平等信贷机会法案》(ECOA)以及《美国残疾人法案》(ADA)。以下定义涵盖了法律上受保护的特征以及这些法律试图保护我们免受的法律观念:
受保护组
在美国,许多法律和法规禁止基于种族、性别(或性别,在某些情况下)、年龄、宗教信仰、国籍和残疾状况等类别进行歧视。在住房公平法(FHA)下被禁止的决策依据包括种族、肤色、宗教、国籍、性别、家庭状况和残疾。作为非美国法规的一个例子,欧盟的 GDPR 禁止使用关于种族或民族、政治观点等类别的个人数据。这也是为什么传统的偏见测试比较受保护组和所谓的控制(或参考)组的结果之一。
不公平待遇
不公平待遇是许多行业中非法的特定类型歧视。这是一种因为种族、性别或其他特征等受保护特征而对一个人采取不利待遇的决策。对于从事就业、住房或信用申请的数据科学家来说,这意味着在使用人口统计数据进行机器学习模型时我们应该非常小心,甚至在我们的偏见修复技术中也是如此。一旦人口统计数据被用作模型的输入,这可能意味着某人的决策可能因其人口统计特征而有所不同,而这种不公平待遇在某些情况下可能会产生结果。
警告
对于不同待遇的担忧,以及更一般的系统性偏见,通常是为什么我们尽量避免直接将人口统计标记作为机器学习模型的输入。为了谨慎起见,在大多数常见情景下,人口统计标记不应作为模型输入,但应用于偏差测试或监测目的。
不同的影响
不同的影响是另一种法律上引起关注的歧视形式。它基本上是指跨人群之间不同的结果率或者存在率。不同的影响更正式地定义为一种看似中立的政策或做法的结果,它会不成比例地损害到受保护的群体。对于数据科学家来说,不同的影响往往会发生在我们不使用人口统计数据作为输入,而使用某些与人口统计数据相关的内容作为输入的情况。以信用评分为例:它们相当准确地预测违约,因此在消费信贷预测模型中经常被视为有效使用。然而,它们与种族存在相关性,使得某些少数群体的平均信用评分较低。如果我们在模型中使用信用评分,这往往会导致某些少数群体的正面结果比例较低,这是不同的影响的常见例子。(这也是为什么几个州已经开始限制在某些与保险相关的决策中使用信用评分的原因。)
差异效度
差异效度有时在就业领域中会出现。而不同的影响通常是指跨人群之间的不同结果率,差异效度则更多地涉及跨群体之间的表现质量不同。这种情况发生在某些群体的就业测试更能有效预测工作表现,而对其他群体则效果不佳。差异效度之所以重要,是因为其数学基础,而非法律构建,几乎适用于所有机器学习模型。常见情况是使用不具代表性的训练数据,并构建出对某些群体效果更好的模型,而许多较新的偏差测试方法专注于这种类型的偏差。
屏蔽
筛除是一种非常重要的歧视类型,突显了 ML 系统的社会技术性质,并证明了仅通过测试和平衡模型分数是不足以保护免受偏见的。当残疾人士,如视力有限或细微运动技能困难者,无法与就业评估交互,并因此被默认筛除出工作或晋升时,就发生了筛除。筛除是一个严重的问题,EEOC 和劳工部正在关注 ML 在这一领域的应用。需要注意的是,筛除通常不能通过数学偏见测试或偏见修复来修复;它通常必须在系统设计阶段解决,在这个阶段,设计师确保残疾人士能够使用最终产品的界面。筛除也突显了为何在构建 ML 系统时需要律师和残疾人士的视角。如果没有这些视角,我们很容易在构建 ML 系统时忽视残疾人士,这有时可能会导致法律责任的产生。
这结束了我们对偏见一般定义的讨论。读者可以看到,这是一个复杂且多方面的主题,涉及各种人文、科学和法律问题。在本章后面讨论偏见测试时,我们将通过更具体但可能更复杂的数学定义来补充这些定义。接下来,我们将概述谁更容易在 ML 系统中经历偏见和相关伤害。
ML 系统中谁更容易经历偏见
任何人群在与 ML 系统互动时可能会遇到偏见和相关伤害,但历史告诉我们,某些群体更容易更频繁地遭受偏见和伤害。事实上,这是受监督学习的本质所致——它只从过去记录的数据中学习和重复模式——导致年长者、残障人士、移民、有色人种、女性和性别非符合个体更容易面对 ML 系统的偏见。换句话说,那些在现实世界或数字世界中经历歧视的人,在与 ML 系统打交道时也很可能会经历它,因为所有这些歧视都已记录在数据中,并用于训练 ML 模型。本节列出的这些群体通常受到各种法律的保护,但并非总是如此。他们通常会成为偏见测试的比较群体,以评估两个人口统计学群体之间得分或结果的统计平等性。
许多人属于多个受保护或边缘化群体。交集性的重要概念告诉我们,社会伤害集中在那些属于多个受保护群体的人身上,偏见不应仅分析作用于边缘化群体单一维度。例如,AI 伦理研究人员最近表明,一些商业可用的面部识别系统在性别分类准确性上存在显著差异,较深肤色的女性是最容易被误分类的群体。最后,在定义这些群体之前,还重要考虑麦克纳马拉谬误。把这种复杂的人类归类为这种钝化的分类法是正确的吗?可能不是,而且很可能这种简化的群体分配方式,通常是因为这些类别在数据库中作为二进制标记列很容易表示,也是偏见和潜在伤害的源头。在管理机器学习系统中的偏见时,总是有很多注意事项,因此在这些方面谨慎行事,我们走入定义更容易受到歧视的简化人口群体的领域:
年龄
通常,40 岁及以上的老年人在在线内容中更容易遭受歧视。在更传统的应用场景如就业、住房或消费金融中,年龄的分界线可能更高。然而,参加医疗保险或一生积累财富可能使老年人成为其他场景中受青睐的群体。
残疾
那些身体、心理或情感残疾的人可能是最有可能受到机器学习系统偏见影响的人群之一。虽然法律框架可能不适用,但排除的概念普遍适用于就业以外的情况。在设计机器学习系统时,经常忽视残疾人群,无论进行多少数学偏见测试或补救,都无法弥补这一点。
移民身份或国籍
居住在非本国出生地的国家,并具有任何移民身份的人,包括入籍公民,在面对重大偏见挑战时众所周知。
语言
尤其是在在线内容中,这是机器学习系统的一个重要领域,使用非英语语言或以非拉丁文字书写的人可能更容易遭受偏见影响。
种族和民族
除白人以外的种族和民族,包括那些认同为多种族的人,通常在与机器学习系统互动时会遭受偏见和伤害。一些人在计算机视觉任务中更喜欢肤色标度而不是传统的种族或民族标签。菲茨帕特里克标度就是一个肤色标度的例子。
性别与性别
非男性异性恋男性更有可能在 ML 系统的作用下经历偏见和伤害。在在线内容中,女性通常会被偏爱,但是以有害的方式。作为男性凝视现象,关于女性的媒体可能因其取向于对女性的客体化、压制或性别化而吸引人并受到积极的对待(例如在社交媒体中推广)。
交叉群体
属于前述两个更广泛群体的两个或更多群体的人可能经历的偏见或伤害可能比他们所属的两个更广泛群体的简单总和更大。本章描述的所有偏见测试和缓解步骤都应考虑交叉群体。
当然,这些并不是唯一可能从 ML 模型中经历偏见的人群,而无论动机如何,对人群进行分组都可能存在问题。然而,了解从哪里开始寻找偏见很重要,我们希望我们的列表足以达到这一目的。现在我们知道在哪里寻找 ML 偏见,让我们讨论我们应该注意的最常见的伤害。
人们经历的伤害
在线或数字内容中存在许多常见的伤害类型。这些伤害经常发生,或许频繁到我们可能对它们视而不见。以下列表突出了常见的伤害,并提供了例子,以便我们下次看到它们时能更好地识别。这些伤害与阿巴盖尔·李·布兰克在《计算机视觉机器学习与未来导向伦理》中提出的情况密切相关,该书描述了计算机视觉中这些伤害发生的案例:
贬低
包含积极侮辱或冒犯性内容——例如,聊天机器人如Tay或Lee Luda生成的冒犯性内容。
抹消
抹去挑战主流社会范式或被边缘化群体遭受的过去伤害的内容——例如,压制讨论种族主义或指责白人至上主义的内容。
Exnomination
将白人、男性或异性恋等概念视为中心人类规范——例如,在线搜索将芭比娃娃作为“CEO”的第一个女性结果返回。
误识别
错误地认定一个人的身份或未能认识到某人的人性——例如,误识别黑人在自动图像标记中。
刻板印象
倾向于将所有群体成员赋予特征——例如,LM 自动将Muslims 与暴力联系起来。
Underrepresentation
在模型输出中缺乏公平或充分的对人群群体的代表性——例如,生成模型认为所有医生都是白人男性,所有护士都是白人女性。
有时这些伤害可能仅在在线或数字空间中产生影响,但随着我们的数字生活越来越多地与生活的其他部分重叠,伤害也会溢出到现实世界。在医疗保健、就业、教育或其他高风险领域中,机器学习系统可能通过错误地拒绝人们获取所需资源而直接造成伤害。由机器学习系统造成的最明显的现实世界伤害类型包括以下几种:
经济伤害
当机器学习系统降低某些活动的经济机会或价值时——例如,男性看到更多比女性更好的工作广告时(链接)。
身体伤害
当机器学习系统伤害或导致某人死亡时——例如,人们过度依赖自动驾驶技术时。
心理伤害
当机器学习系统引发心理或情感困扰时——例如,当推荐令人不安的内容给儿童时。
声誉伤害
当机器学习系统损害个人或组织的声誉时——例如,消费信用产品的推出因歧视指控而受损。
不幸的是,机器学习系统的用户或主体可能会以奇怪的方式遭受额外的伤害或伤害的组合。在我们深入讨论下一节中各种偏见测试之前,请记住,与用户确认他们是否遭受到这里讨论的伤害或其他类型的伤害,可能是追踪机器学习系统偏见最直接的方法之一。实际上,从最基本的角度来看,重要的是人们是否经历伤害,而不是某些分数是否通过了一个必然存在缺陷的数学测试。在设计我们的系统时,我们必须考虑这些伤害,与我们的用户沟通以确保他们不会遭受伤害,并努力减少伤害。
检测偏见
如果有可能,ML 系统可能会对人们造成伤害,应该对其进行偏见测试。本节的目标是介绍测试 ML 模型偏见的最常见方法,以便读者可以开始这一重要的风险管理任务。测试既不简单也不确定。就像在性能测试中一样,系统在测试数据上看起来可能很好,但在部署后可能会失败或造成伤害。或者系统在测试和部署时可能表现出最小的偏见,但随着时间的推移可能会演变成做出有偏见或有害预测。此外,已知存在许多测试和效果大小测量存在缺陷并相互冲突。要了解这些问题的概述,请参阅普林斯顿大学教授阿尔温德·纳拉亚南在 ML 公平性、问责性和透明度会议上的演讲视频“21 个公平定义及其政治”。要深入了解为什么我们不能简单地同时最小化所有偏见度量的数学分析,请参阅“在公平确定风险评分中的固有权衡”。牢记这些警告,让我们开始探索当代偏见测试方法。
测试数据
本节涵盖了测试偏见所需的训练数据以及如何在模型训练之前对该数据进行偏见测试。ML 模型从数据中学习。但没有一种数据是完美的或没有偏见的。如果训练数据中存在系统性偏见,该偏见可能会表现在模型的输出中。从训练数据开始测试偏见是合乎逻辑的。但要做到这一点,我们必须假设某些数据列是可用的。至少,对于每一行数据,我们需要人口统计标记、已知结果(y,依赖变量,目标特征等),稍后,我们将需要模型结果——回归模型的预测以及分类模型的决策和置信分数或后验概率。虽然有少数不需要人口统计标记的测试方法,但大多数被接受的方法都需要这些数据。没有这些数据?测试将会更加困难,但我们将提供一些关于推断人口统计标记标签的指导。
注意
我们的模型和数据远非完美,所以在偏见测试中,不要让完美成为良好结果的敌人。我们的数据永远不会完美,我们也永远找不到完美的测试。测试非常重要,但要在现实世界中成功进行偏见缓解,它只是更广泛的 ML 管理和治理流程的一部分。
需要了解或推断人口统计学标记的需求是解决机器学习中偏见问题的一个很好的例子,这需要全面的设计思维,而不仅仅是在我们的管道末端添加另一个 Python 包。人口统计标记和个体级数据在隐私角度上也更为敏感,有时组织出于数据隐私原因不收集这些信息。虽然数据隐私与非歧视法律的相互作用非常复杂,但很可能并非数据隐私义务能够取代非歧视义务。但作为数据科学家,我们不能单独回答这类问题。任何数据隐私与非歧视要求之间的潜在冲突必须由律师和合规专家处理。这类复杂的法律考量是解决机器学习中偏见问题时必须引入广泛利益相关者的一个例子。
警告
在就业、消费者金融或其他禁止差异对待的领域,我们需要在直接基于受保护类成员信息改变我们的数据之前与法律同事核实,即使我们的意图是为了减少偏见。
现在,读者们可能开始意识到进行偏见测试有多么具有挑战性和复杂性。作为技术人员,处理这种复杂性不是我们唯一的责任,但我们需要意识到它并在更广泛的团队中共同努力解决机器学习系统中的偏见问题。现在,让我们进入负责准备数据并测试偏见的技术人员角色。如果我们有所需的数据,我们倾向于寻找三个主要问题——代表性、结果分布和代理:
代表性
这里的基本检查是计算训练数据中每个人口统计群体的行比例,理念是一个模型将难以学习只有少量训练数据行的群体。一般来说,训练数据中不同人口统计群体的比例应反映模型将被部署的人口。如果不是这样,我们可能需要收集更具代表性的数据。也可以对数据集进行重抽样或重新加权以实现更好的代表性。然而,如果我们在就业、消费者金融或其他禁止差异对待的领域工作,我们确实需要在直接基于受保护类成员信息改变我们的数据之前与法律同事核实。如果我们遇到差异有效性问题(本章后面描述),那么重新平衡我们的训练数据以在群体之间具有更大或相等的代表性可能是有必要的。在不同类别之间实现平衡可能会提高跨群体的预测质量,但可能不会有助于或甚至会恶化正面结果的不平衡分布。
结果分布
我们需要了解结果(y变量值)如何在不同人群之间分布,因为如果模型学习到某些群体比其他群体获得更多积极结果,这可能导致不均衡影响。我们需要计算y在每个人群中的双变量分布。如果我们发现不同人群之间的结果不平衡,那么我们可以尝试重新抽样或重新加权我们的训练数据,但有一些法律上的注意事项。更可能的情况是,我们将简单地意识到这个模型存在严重的偏差风险,当我们测试其结果时,我们需要特别注意,并可能计划某种补救措施。
代理
在大多数商业应用的机器学习中,我们不应该根据人口统计标记来训练模型。但即使我们不直接使用人口统计标记,像姓名、地址、教育细节或面部图像这样的信息可能编码了大量的人口统计信息。其他类型的信息也可能作为人口统计标记的代理。发现代理的一种方法是基于每个输入列构建对抗模型,看这些模型是否能预测任何人口统计标记。如果它们能够预测人口统计标记,那么这些列编码了人口统计信息,并且很可能是人口统计的代理。如果可能的话,应该从训练数据中移除这些代理。代理在训练数据中可能也更隐蔽。没有标准技术来测试这些潜在的代理,但我们可以应用与直接代理相同的对抗建模技术,不过不使用特征本身,而是使用我们怀疑可能充当代理的特征之间的工程化交互。我们还建议,拥有专门的法律或合规利益相关者,审查我们模型中的每一个输入特征,以便关注代理歧视风险。如果无法移除代理,或者我们怀疑存在潜在的代理,我们应该特别注意系统结果的偏差测试结果,并准备在偏差缓解过程中采取补救措施。
描述的测试和代表性、结果分布以及训练数据中的代理检查,所有这些都依赖于人口统计标签的存在,就像大多数模型结果测试一样。如果我们没有这些人口统计标签,那么一个被接受的方法是推断它们。贝叶斯改进的姓氏地理编码(BISG)方法从姓名和邮政编码数据中推断种族和族裔。令人悲哀但事实如此,美国社会仍然如此分离,以至于邮政编码和姓名往往能够准确预测种族和族裔,准确率通常超过 90%。这种方法是由兰德公司和消费者金融保护局(CFPB)开发的,并且在消费金融领域的偏见测试中具有很高的可信度。CFPB 甚至在其GitHub上提供了 BISG 的代码!如有必要,类似的方法也可以用于从姓名、社会安全号码或出生年推断性别。
传统方法:测试等效结果
一旦我们评估了数据的偏见,确保我们有执行偏见测试所需的信息,并训练了一个模型,那么现在就是测试其结果是否存在偏见的时候了。我们将从讨论偏见测试的角度开始,首先解决一些已建立的测试。这些测试通常在法律、法规或法律评论中具有先例,并且它们倾向于关注不同人群之间结果的平均差异。关于传统偏见测试指导的很好概述,请参阅简明指南,由联邦承包合规办公室提供,用于测试就业选择程序的公平性。对于这类测试,无论是分析多项选择就业测试的分数还是来自先进人工智能推荐系统的数值分数,都无关紧要。
注意
本节中的测试与 统计平等 的概念对齐,即模型为所有人群生成大致相等的概率或有利的预测。
表 4-1 强调这些测试通常被分为统计和实用测试的类别,并且适用于连续和二元结果。这些测试在很大程度上依赖于保护组的概念,其中受保护组的平均结果(例如女性或黑人)与某个控制组(例如男性或白人)的平均结果进行简单直接的配对比较。这意味着我们至少需要为数据中的每个保护组进行一个测试。如果这听起来有些老派,确实是这样。但由于这些测试在法规和诉讼设置中使用最多几十年,因此在开始尝试新的方法之前,最好从这些测试开始。更为成熟的测试还倾向于具有已知的阈值,指示何时的值存在问题。这些阈值列在表 4-1 中,并在接下来的章节中进行了更详细的讨论。
表 4-1. 一些用于衡量机器学习模型偏差的常见指标,适用的阈值如有^(a)所示
| 测试类型 | 离散结果/分类测试 | 连续结果/回归测试 |
|---|---|---|
| 统计显著性 | 逻辑回归系数 | 线性回归系数 |
| 统计显著性 | χ² 检验 | t-检验 |
| 统计显著性 | Fisher’s 精确检验 | |
| 统计显著性 | 二项 z | |
| 实际显著性 | 组间均值比较 | 组间均值比较 |
| 实际显著性 | 组间均值差异的百分点/marginal effect | 组间均值差异的百分点 |
| 实际显著性 | Adverse impact ratio (AIR)(可接受范围:0.8–1.25) |
Standardized mean difference (SMD, Cohen’s d)(小差异:0.2,中等差异:0.5,大差异:0.8) |
| 实际显著性 | 概率比 | |
| 实际显著性 | 落后到平等 | |
| 差异效度 | 准确度或 AUC 比率(可接受范围:0.8–1.25) |
R² 比率(可接受范围:0.8–1.25) |
| 差异效度 | TPR、TNR、FPR、FNR 比率(可接受范围:0.8–1.25) |
MSE、RMSE 比率(可接受范围:0.8–1.25) |
| 差异效度 | 赔率平等([控制 TPR ≈ 保护 TPR ∣ y = 1] 和 [控制 FPR ≈ 保护 FPR ∣ y = 0]) |
|
| 差异效度 | 机会平等([控制 TPR ≈ 保护 TPR ∣ y = 1]) |
|
| ^(a) TPR = 真正例率;TNR = 真负例率;FPR = 假正例率;FNR = 假负例率 |
统计显著性测试
统计显著性测试可能是跨学科和法律管辖区最广泛接受的,因此让我们首先关注它。统计显著性测试用于确定在新数据中是否可能看到跨受保护群体的模型结果的平均或比例差异,或者结果差异是否是当前测试数据集的随机属性。对于连续结果,我们经常依赖于两个人口统计学组之间平均模型输出的 t 检验。对于二元结果,我们经常使用二项 z 检验来检验两个不同人口统计学组的正面结果比例,卡方检验来检验模型输出的列联表,以及当列联表中的单元格中的个体少于 30 个时,使用 Fisher 精确检验。
如果你认为这是一大堆成对测试,忽略了重要信息,干得好!我们可以使用传统的线性或逻辑回归模型,拟合我们机器学习模型的分数、已知结果或预测结果,以了解某些人口统计标记变量在其他重要因素存在的情况下是否具有统计显著的系数。当然,评估统计显著性也是困难的。因为这些测试几十年前就被规定了,大多数法律评论都指出,在 5%的水平上的显著性是证明模型结果中存在不可接受的偏倚的证据。但在当代数据集中,行数达到数十万、数百万或更多时,任何小的结果差异都将在 5%的水平上显著。我们建议在 5%显著性水平上分析传统的统计偏倚测试结果,并根据我们数据集大小适当调整显著性水平。我们会把大部分精力放在调整后的结果上,但要记住,在最坏的情况下,我们的组织可能会面临法律审查和外部专家的偏倚测试,这些测试将把我们约束在 5%的显著性阈值上。这将是与我们法律部门同事交流的又一个好时机。
实际意义测试
美国最为人熟知且最常被滥用的偏倚测试工具是不利影响比率(AIR)及其相关的四分之五法则阈值。让我们首先了解它是什么,然后再看它是如何被从业者滥用的。AIR 是用于二元结果的测试,是某些结果的比例,通常是积极结果,比如得到工作或贷款的比例,针对某些受保护的群体,除以关联控制组的该结果比例。这个比例与四分之五或 0.8 的阈值相关联。这个四分之五法则在 1970 年代末由 EEOC(美国就业机会平等委员会)提出,作为一条实用的分界线,四分之五以上的结果非常受欢迎。在就业事务中,AIR 和四分之五法则仍被一些联邦法院认为是非常重要的数据,而其他联邦法院则认为这种测量过于缺陷或简化,不重要。在大多数情况下,AIR 和四分之五法则在就业之外没有正式的法律地位,但在消费金融等受管制行业仍偶尔用作内部偏倚测试工具。此外,AIR 可能会出现在专家在诉讼中的证词中,涉及任何与偏倚相关的事项。
AIR 是一种简单而流行的偏见测试。那么,我们对 AIR 的误解有哪些呢?很多。技术人员往往会错误地解释它。AIR 超过 0.8 不一定是好迹象。如果我们的 AIR 测试结果低于 0.8,那可能是个坏迹象。但如果超过五分之四,这并不意味着一切都没问题。另一个问题是混淆 AIR 指标和 0.8 阈值与法律概念的差异冲击。我们无法解释为什么,但有些供应商字面上称 AIR 为“差异冲击”。它们并不相同。数据科学家不能确定某些结果的差异是否真正属于差异冲击。差异冲击是由律师、法官或陪审团做出的复杂法律决定。对四分之五规则的关注也使处理偏见的社会技术性质变得模糊。在某些就业案件中,四分之五只有在法律上有意义。像任何数值结果一样,单靠 AIR 测试结果是不足以在复杂的机器学习系统中识别偏见的。
尽管如此,查看 AIR 结果和其他实际意义结果仍然可能是个好主意。另一个常见的度量标准是标准化平均差异(SMD,或科恩的d)。SMD 可以用于回归或分类输出——因此比 AIR 更加模型无关。SMD 是某个受保护群体的平均结果或得分减去控制组的平均结果或得分,再除以结果的标准差的一种度量。在权威社会科学文献中,SMD 的大小为 0.2、0.5 和 0.8 与群体结果的小、中和大差异相关。其他常见的实际意义度量包括百分点差异(PPD),或者两个群体的平均结果之间的差异,以百分比表示,以及缺额,使受保护群体和控制群体的结果等同所需的人数或货币金额。
在传统的结果测试中,最坏的情况是,统计和实际测试结果显示在一个或多个受保护和对照组之间的结果有意义的差异。例如,当比较黑人和白人的就业推荐时,看到显著的二项式-z检验和低于 0.8 的 AIR 将是非常不好的,如果这种情况出现在多个受保护和对照组上则更糟。在传统偏差测试中,最理想的情况是我们在统计上看不到显著性差异或大的实际显著性测试差异。但即使在这种情况下,我们仍然无法保证系统在部署后不会存在偏差,或者在这些测试无法检测到的方式(如通过屏幕排除)中没有偏差。当然,在传统测试中最可能的情况是我们会看到一些混合的结果,并且需要帮助来解释这些结果,并从我们直接数据科学团队之外的利益相关者那里修复检测到的问题。即使在进行了所有这些工作和沟通之后,传统偏差测试也只能算是彻底偏差测试的第一步。接下来我们将讨论一些关于偏差测试的新想法。
一种新的思维方式:测试等效性能质量
在最近的几年里,许多研究人员提出了侧重于不同人群之间的差异性能质量的测试方法。尽管这些测试在实际和统计显著性方面的法律先例较少,但它们与差异有效性的概念有些相关。这些新技术旨在了解常见的机器学习预测错误如何影响少数族裔群体,并确保与机器学习系统交互的人类在获得积极结果时具有平等的机会。
重要的论文《超越不同对待和不同影响的公平性:在没有不同对待的情况下学习分类》阐述了在公平性背景下思考机器学习模型误差的重要性。如果少数族裔群体比其他群体接受更多的误报或误拒决策,那么根据应用的不同可能会带来多种伤害。在他们的开创性《机器学习中的机会平等》中,Hardt、Price 和 Srebro 定义了一个修改了广为认可的平等机会思想的公平性概念。在旧的平等机会场景中,当已知结果发生时(即y = 1),两个感兴趣的人群大致具有相等的真正阳性率。当未发生已知结果时(即y = 0),平等机会意味着两个人群的假阳性率大致相等。机会平等放宽了平等机会对y = 0的约束,并认为在y = 1等于正面结果时(例如获得贷款或找到工作),寻求平等的真正阳性率是一种更简单和更实用的方法。
如果读者花费了时间研究混淆矩阵,他们将知道有许多其他方法来分析二元分类器的错误。我们可以考虑不同的真正例率、真负例率、假正例率、假负例率以及许多其他跨人群的分类性能测量。我们还可以将这些测量提升到更正式的构建中,如平等机会或平等几率。表 4-2 提供了一个示例,说明了跨人群的性能质量和错误度量如何在测试偏见方面有所帮助。
表 4-2. 在两个人群之间计算的分类质量和错误率^(a)
| 指标类型 | … | 准确度 | 灵敏度(TPR) | … | 特异性(TNR) | … | FPR | FNR | … |
|---|---|---|---|---|---|---|---|---|---|
| 女性数值 | … | 0.808 | 0.528 | … | 0.881 | … | 0.119 | 0.472 | … |
| 男性数值 | … | 0.781 | 0.520 | … | 0.868 | … | 0.132 | 0.480 | … |
| 女性对男性比率 | … | 1.035 | 1.016 | … | 1.016 | … | 1.069 | 0.983 | … |
| ^(a) 比较组(女性)的值除以对照组(男性)的值。 |
第一步,如 表 4-2 所示,是计算两个或更多感兴趣人群组之间的一组性能和误差测量。然后,使用 AIR 和四分之五规则作为指导,我们形成比较组值与对照组值的比率,并应用四分之五(0.8)和五分之四(1.25)的阈值来突出任何潜在的偏见问题。重要的是指出,这里的 0.8 和 1.25 阈值仅是指导性的,它们没有法律意义,更多的是常识性的标志。理想情况下,这些值应接近 1,显示模型下两个人群大致具有相同的性能质量或误差率。我们可以根据自己的情况标记这些阈值,但我们会认为 0.8 至 1.25 是可接受值的最大范围。
根据我们的应用程序,某些指标可能比其他指标更重要。例如,在医学测试应用中,假阴性可能非常有害。如果某个人群在医学诊断中经历的假阴性比其他人群多,很容易看出这会导致偏见的危害。在 “处理 AI/ML/数据科学系统中的偏见和公平性” 的第 40 页有一个公平度量决策树,可以帮助决定哪些公平度量可能最适合我们的应用。
您是否在想:“回归模型呢?机器学习二元分类以外的一切呢?”确实,偏见测试在二元分类器上最为发达,这可能令人沮丧。但是我们可以将t-tests 和 SMD 应用于回归模型,也可以应用本节关于性能质量和误差率的思想。就像我们形成分类指标的比率一样,我们也可以形成 R²、平均百分比误差(MAPE)或归一化均方根误差(RMSE)在比较和控制组之间的比率,并再次使用四分之五法则作为指南,以突显这些比率可能告诉我们在预测中存在偏见问题的情况。至于机器学习的其余部分,超出了二元分类和回归,那就是我们接下来要讨论的。准备好运用一些创造力和努力。
看未来:更广泛的机器学习生态系统测试
许多研究和法律评论都假设使用二元分类器。这有其原因。无论机器学习系统多么复杂,最终往往都可以归结为做出或支持某种最终的是或非二元决策。如果该决策影响到人们并且我们有数据可以进行测试,我们应该使用我们已经讨论过的完整工具套件来测试这些结果。在某些情况下,机器学习系统的输出并不会影响最终的二元决策,或者也许我们想要深入挖掘并了解系统中偏见的驱动因素或者哪些亚群体可能遭受了最多的偏见。或者我们可能正在使用生成模型,例如语言模型或图像生成系统。在这些情况下,AIR、t-tests 和真阳性率比例是不够的。本节探讨了我们可以采取的方法来测试机器学习生态系统的其余部分,以及深入挖掘我们数据中偏见驱动因素的方法。我们将首先介绍一些通用策略,适用于大多数类型的机器学习系统,然后简要概述针对个体或小团体、语言模型、多项式分类器、推荐系统和无监督模型的偏见技术:
通用策略
检测偏见的最常见方法之一是对抗建模。鉴于我们系统的数值结果,无论是排名、聚类标签、提取的特征、词项嵌入还是其他类型的分数,我们可以将这些分数作为输入传递给另一个机器学习模型,该模型预测人口统计学类别标记。如果对抗模型能够从我们模型的预测中预测出人口统计学标记,那就意味着我们模型的预测正在编码人口统计信息。这通常是一个不好的迹象。另一个一般的技术方法是应用可解释的人工智能技术来揭示我们模型预测的主要驱动因素。如果这些特征、像素、术语或其他输入数据看起来可能存在偏见,或者与人口统计信息相关,那就是另一个不好的迹象。现在甚至有特定方法来理解哪些特征在模型结果中驱动偏见。利用可解释人工智能来检测偏见的驱动因素令人振奋,因为它可以直接告诉我们如何解决偏见问题。简而言之,驱动偏见的特征很可能应该从系统中移除。
在一个全面的测试计划中,并非所有检测偏见的策略都应该是技术性的。使用像AI 事故数据库这样的资源来了解过去发生的偏见事件,并设计测试或用户反馈机制,以确定我们是否重复了过去的错误。如果我们的团队或组织没有与用户沟通他们正在经历的偏见,那就是一个重大的盲点。我们必须与我们的用户交流。我们应该在系统或产品生命周期中设计用户反馈机制,以便了解我们的用户正在经历什么,追踪任何伤害,并在可能的情况下减轻伤害。还要考虑激励用户提供关于偏见伤害的反馈。Twitter 算法偏见事件是结构化和激励众包偏见相关信息的一个了不起的例子。本章末讨论案例将突出这一独特事件的过程和经验。
语言模型
生成模型存在许多偏见问题。尽管缺乏成熟的语言模型偏见测试方法,但这是一个积极的研究领域,大多数重要论文都在某种程度上关注了这个问题。“语言模型是少样本学习者”的第 6.2 节是思考偏见伤害并进行一些基本测试的较好示例之一。广义上说,对语言模型偏见的测试包括对抗性提示工程——允许语言模型完成像“穆斯林男子……”或“女医生……”这样的提示,并检查生成的可能会冒犯人的文本(有时非常冒犯!)。为了注入随机因素,还可以由其他语言模型生成提示。通过手动人工分析或使用更自动化的情感分析方法可以检查冒犯性内容。例如,通过交换被认为是男性的姓名来进行热点翻转,以及测试像命名实体识别这样的任务的性能质量,是另一种常见的方法。可解释人工智能(XAI)也可以使用。它可以帮助指出哪些术语或实体驱动了预测或其他结果,并且人们可以决定这些驱动因素是否从偏见的角度引起关注。
个体公平性
我们提出的许多技术都集中在针对大群体的偏见上。但是小群体或特定个人的情况如何呢?机器学习模型可以基于人口统计信息或代理信息轻松地孤立少数群体,并对其进行不同对待。非常相似的个体也很容易被划分到复杂决策边界的不同侧。对抗模型可以再次发挥作用。对抗模型的预测可以是一种逐行本地的偏见度量。那些从对抗模型得到高置信度预测的人可能会因人口统计或代理信息而受到不公平对待。我们可以使用反事实测试或更改某个人的数据属性来穿越决策边界,以了解人们是否真正属于决策边界的一侧,或者某种偏见是否驱动了他们的预测结果。关于这些技术在实践中的示例,请参见第十章。
多项分类
在多项分类器中进行偏见测试有几种方法。例如,我们可以使用降维技术将各种概率输出列合并为单列,然后像回归模型一样对这一列进行测试,使用t-测试和 SMD,其中我们计算不同人口群体中提取特征的平均值和方差,并应用之前描述的统计和实际显著性的阈值。同时,采用更为公认的同时也适用于多项结果的措施也是明智的,如卡方检验或机会平等。也许最保守的方法是以一对全部的方式将每个输出类别视为其自身的二元结果。如果要测试许多类别,可以从最常见的类别开始,并按照标准如 AIR、二项z和误差度量比例依次进行测试。
无监督模型
聚类标签可以被视为多项式分类输出或者用对抗模型进行测试。提取的特征也可以像回归结果一样进行测试,并且可以用对抗模型进行测试。
推荐系统
推荐系统是商业机器学习技术中最重要的类型之一。它们经常充当我们每天需要访问信息或产品的门卫。当然,它们也因各种严重的偏见问题而受到指责。许多通用方法,如对抗模型、用户反馈和 XAI,都可以帮助发现推荐中的偏见。然而,现在也有专门用于测试推荐系统偏见的方法。查阅像“比较公平排名指标”这样的出版物或关注像“推荐和检索中的公平性和歧视”这样的会议议程,以了解更多信息。
机器学习的世界广阔而深远。你可能有一种我们这里尚未涵盖的模型类型。我们提出了许多偏见测试的选项,但肯定没有覆盖所有的选项!我们可能需要运用常识、创造力和聪明才智来测试我们的系统。只记住,数字并不是一切。在构思一些新的偏见测试技术之前,查阅同行评议的文献。某处肯定有人已经处理过类似我们的问题。此外,寻找过去的失败作为测试的灵感,并最重要的是与用户和利益相关者进行沟通。他们的知识和经验可能比任何数值测试结果都更重要。
摘要测试计划
在进入偏见缓解方法之前,让我们尝试总结我们关于偏见测试的学习成果,制定一个适用于大多数常见情况的计划。我们的计划将侧重于数值测试和人类反馈,并将持续整个机器学习系统的生命周期。我们所提出的计划非常详尽。我们可能无法完成所有步骤,特别是如果我们的组织以前没有尝试过机器学习系统的偏见测试。只要记住,任何良好的计划都将包括技术和社会技术方法,并且是持续进行的。
-
在系统的构思阶段,我们应该与潜在用户、领域专家和业务执行人员等利益相关者进行互动,共同思考系统带来的风险和机遇。根据系统的性质,我们可能还需要从律师、社会科学家、心理学家或其他人那里获取意见。利益相关者应该代表多样化的人群,包括教育背景、生活和职业经验。我们将警惕人类偏见,如群体思维、资金偏见、达宁-克鲁格效应和确认偏见,这些偏见可能会影响我们的技术成功。
-
在系统设计阶段,我们应该开始规划监控和可操作的救济机制,并确保我们拥有或能够收集需要进行偏见测试的数据。这种能力涉及技术、法律和伦理层面。我们必须具备收集和处理数据的技术能力,必须获得用户同意或其他合法的数据收集和使用基础,且在某些情况下不能参与不公平对待,并且我们不应依赖欺骗人们获取他们的数据。我们还应开始咨询用户交互和体验(UI/UX)专家,共同思考如何实施针对错误决策的可操作救济机制,并减少人类偏见(如锚定效应)在系统结果解释中的作用。其他重要考虑因素包括残障人士或互联网接入有限人群如何与系统互动,以及检查过去失败设计,以避免重复错误。
-
一旦我们有了训练数据,我们应该考虑删除任何直接的人口统计标记,并仅在测试时保存这些信息。(当然,在某些应用中,比如某些医疗治疗中,保留这些信息可能是至关重要的。)我们应该测试训练数据的代表性、结果的公平分布以及人口统计代理,以便了解我们所面对的情况。考虑从训练数据中去除代理,考虑重新平衡或重新加权数据,以平衡各人口统计组的代表性或正面结果。然而,如果我们处于消费金融、人力资源、健康保险或其他高度管制的行业,我们将需要与法律部门核实关于重新平衡数据引发的任何不公平对待的顾虑。
-
在我们的模型训练完成后,现在是时候开始测试了。如果我们的模型是传统的回归或分类估计器,我们将希望应用适当的传统测试来理解跨组别结果中的任何不利差异,并且我们将希望应用性能质量测试来检查所有用户的性能大致相等。如果我们的模型不是传统的回归或分类估计器,我们仍然希望想出一种逻辑方法,将输出转换为单个数值列或二进制 1/0 列,以便我们可以应用一整套测试。如果我们无法合理地转换我们的输出,或者我们只是想了解模型中的偏差,我们应该尝试对抗性模型和 XAI,以发现结果中的任何歧视现象或理解模型中的偏差驱动因素。如果我们的系统是 LM、推荐系统或其他更专业类型的 ML,我们还应该应用为这些系统设计的测试策略。
-
当模型部署时,必须监控问题,如性能故障、黑客攻击和偏差。但监控不仅仅是技术性的练习。我们需要激励、接收和整合用户反馈。我们需要确保我们的可操作的追索机制在实际条件下正常工作,并且我们需要追踪我们的系统造成的任何伤害。所有这些都是包括标准统计偏差测试的性能监控的一部分。监控和反馈收集必须在系统的整个生命周期内持续进行。
如果在测试或监控过程中发现了什么不好的情况怎么办?这是相当常见的,也是下一节内容的重点。有技术手段可以减少偏差,但是偏差测试结果必须纳入组织整体的 ML 治理程序中,以发挥其预期的透明度和问责制效益。在接下来的章节中,我们还将讨论治理和偏差缓解中的人为因素。
缓解偏差
如果我们在机器学习模型的结果中测试偏见,我们很可能会在许多情况下发现它。当它显现时,我们也需要处理它(如果我们没有发现偏见,则需要仔细检查我们的方法论和结果,并计划在系统部署时监控出现的偏见问题)。本章节从偏见缓解方法的技术讨论开始。接着我们将转向更可能在现实世界设置中长期有效的人类因素来缓解偏见。像人本设计(HCD)和机器学习从业者的治理比单点时间技术缓解方法更有可能在机器学习系统的整个生命周期内减少伤害。我们需要让各方利益相关者参与到关于使用机器学习的任何重大决策中,包括治理的初期设置和多样化倡议。虽然我们将提出的技术方法很可能在使我们的组织机器学习更加公平方面发挥一定作用,但如果没有与用户的持续互动和对机器学习从业者的适当监督,这些方法在实践中是行不通的。
缓解偏见的技术因素
让我们从NIST SP1270 AI 偏见指南中的一句话开始讨论技术偏见缓解。当我们把我们选择使用的观察数据倒入一个无法解释的模型中,并调整超参数直到最大化某些性能指标时,我们可能正在做互联网称之为数据科学的事情,但我们并不是在做科学。¹
物理学家理查德·费曼将表面上类似于科学但不遵循科学方法的做法称为货运邦科学。科学方法的核心原则是假设应可测试,实验应可解释,模型应可证伪或至少可验证。评论员指出人工智能与货运邦科学之间存在相似之处,包括其黑盒解释性、再现性问题和试错过程。
科学方法与实验设计
避免 ML 系统中偏见的最佳技术解决方案之一是坚持科学方法。我们应该形成关于我们模型真实世界影响的假设。把它写下来并且不要改变它。收集与我们假设相关的数据。选择在我们假设背景下有一些结构意义和可解释性的模型架构;在许多情况下,这些可能根本不是 ML 模型。我们应该用准确度、MAPE 或者适当的传统评估指标来评估我们的模型,然后找到一种方式来测试我们的模型在其真实操作环境中是否在按照预期工作,例如使用A/B 测试。这一经过时间考验的过程可以减少模型设计、开发和实施中的人类偏见,特别是确认偏见,并有助于检测和缓解 ML 系统输出中的系统性偏见,因为这些偏见可能会表现为系统未按预期运行。我们将在第十二章深入探讨科学方法及其在数据科学中的应用。
另一个基本的偏见缓解方法是实验设计。我们不必使用随便找到的垃圾数据来训练 ML 模型。我们可以借鉴实验设计的实践,收集专门设计用于解决我们假设的数据。使用组织中现有的任何数据的常见问题包括这些数据可能不准确、维护不当、冗余,并且带有系统性偏见。从实验设计中借鉴让我们可以收集并选择一组更小、更精心筛选的培训数据,实际上与实验假设相关联。
更不正式地说,通过实验设计进行思考有助于我们避免一些非常愚蠢但有害的错误。有人说没有愚蠢的问题。不幸的是,对于 ML 偏见来说并非如此。例如,询问一个面孔能否预测其信任度或犯罪性。这些有缺陷的实验前提基于已被揭穿的种族主义理论,如骨相学。检查我们实验方法的一个基本方式是检查我们目标特征的名称是否以“iness”或“ality”结尾,因为这可以突显出我们是否在对某种高阶构建进行建模,而不是某种具体可测量的东西。像信任度或犯罪性这样的高阶构建往往充斥着人类和系统偏见,我们的系统会学习到这些。我们还应该检查A/B 测试以确保我们不仅仅是在重复过去失败的设计,可以通过AI 事故数据库来检查。
重复过去是机器学习中另一个容易犯的大错误,如果我们不仔细思考模型所暗示的实验的话。这种基本实验设计错误的最糟糕例子之一发生在健康保险领域,并且已经在Science和Nature上有所记录。Science文章中研究的算法的目标是干预健康保险公司最病重的患者的护理。这本应该是保险公司和患者双赢的事情——通过早期识别病情严重的患者来降低保险公司的成本,并为这些患者提供更好的护理。但是,一个非常基本且非常严重的设计错误导致算法使医疗资源偏离了最需要帮助的人群!出了什么问题?模型师们不是试图预测哪些患者未来会最病重,而是决定预测谁会是最昂贵的患者。他们假设最昂贵的人就是最病重的。实际上,最昂贵的患者是年龄较大、医疗计划昂贵且有良好医疗保障的人。这个算法简单地将更多的护理资源分配给已经拥有良好医疗保障的人,削减了那些最需要的人的资源。正如读者们可能想象的那样,这两个群体在种族上也高度分隔。在模型师选择将医疗成本作为目标而不是健康或疾病指标时,这个模型注定会存在极大的偏见风险。如果我们想要减少机器学习中的偏见,我们需要在编码之前进行深思熟虑。尝试在我们的机器学习建模项目中使用科学方法和实验设计应该有助于我们更清晰地思考我们正在做的事情,并且也会导致更多的技术成功。
偏见减少方法
即使我们应用科学方法和实验设计,我们的 ML 系统仍然可能存在偏见。测试将帮助我们检测到这种偏见,而且我们可能还希望有一些技术手段来处理它。一旦检测到偏见,或者尝试学习更少偏见的 ML 模型,有许多处理偏见的方法。最近的一篇论文 “在高风险政策设置中真实世界问题上偏见减少方法的经验比较” 对最广泛可用的偏见缓解技术进行了很好的比较,另一篇同一组研究人员的论文 “机器学习在公共政策中的偏差-准确性权衡的经验观察” 解决了一个错误的观念,即在处理偏见时我们必须牺牲准确性。事实上,通过减少偏见并不会使我们的模型表现更差——这是一个常见的数据科学误解。技术偏见治理的另一个好资源是 IBM 的 AIF360 包,其中包含大多数主要的治理技术。除了模型选择、LM 解毒和其他偏见缓解技术,我们还将重点介绍所谓的预处理、处理和后处理方法。
预处理偏见缓解技术作用于模型的训练数据,而不是模型本身。预处理倾向于重新采样或重新加权训练数据,以平衡或转移每个人口群体的行数,或更平均地重新分配人口群体的结果。如果我们面对不同人口群体之间的不均匀表现质量,那么增加表现较差群体的代表性可能有所帮助。如果我们面对正面或负面结果的不公平分布,通常通过统计和实际显著性测试检测,那么重新平衡训练数据中的结果可能有助于平衡模型结果。
In-processing 指的是任何改变模型训练算法的技术,旨在使其输出更少偏见。有许多处理技术,但一些较受欢迎的方法包括约束、双目标函数和对抗模型:
约束
机器学习模型的一个主要问题是它们的不稳定性。输入的微小变化可能导致结果的显著变化。从偏见的角度来看,这尤为令人担忧,如果相似的输入是来自不同人群的人,而不同的结果是这些人的薪水或工作推荐。在开创性的"通过意识实现公平"中,辛西娅·德沃克等人将减少偏见视为训练过程中的一种约束类型,帮助模型以相似的方式处理相似的人。机器学习模型还会自动发现交互作用。从偏见的角度来看,如果模型学习多种不同的人群成员的代理,跨不同的行和不同人的输入特征,这就令人担忧。我们永远无法找到所有这些代理。为防止模型制定自己的代理,尝试在 XGBoost 中使用交互约束。
双重目标
双重优化是模型损失函数的一部分,其中一部分衡量建模误差,另一部分衡量偏差,最小化损失函数可以找到一个性能良好且偏差较小的模型。"公平 XGBoost:XGBoost 中的公平感知分类"介绍了一种方法,该方法在 XGBoost 的目标函数中包含偏差正则化项,从而得到具有良好性能和公平性权衡的模型。²
对抗模型
对抗模型也可以帮助使训练过程更少偏见。在一种对抗建模设置中,首先训练将要部署的主模型,然后对抗模型试图从主模型的预测中预测人口统计成员资格。如果可以的话,接着进行对抗训练——训练主模型,然后训练对抗模型——直到对抗模型不能再从主模型的预测中预测人口统计组成员资格,并且对抗模型在每次重新训练迭代之间与主模型分享某些信息,如梯度。
在研究中,预处理和中间处理往往会降低测量结果中的偏差,但后处理方法被证明是一些最有效的技术偏差缓解方法之一。后处理是指我们直接改变模型预测,使其偏差较小。在重新平衡预测时,均等几率或均等机会是一些常见的阈值,即在改变分类决策直至结果大致符合均等几率或机会的标准。当然,连续或其他类型的结果也可以改变以减少偏差。不幸的是,后处理可能是技术偏差缓解中法律风险最大的类型。后处理通常归结为将对照组成员的正面预测切换为负面预测,以便受保护或边缘化群体得到更多的正面预测。虽然在许多不同类型的场景中可能需要这些修改,但在消费金融或就业设置中使用后处理时要格外小心。如果有任何疑虑,我们应该与法律同事讨论不同对待或反向歧视问题。
警告
由于预处理、中间处理和后处理技术往往会基于人口统计群体成员身份特定地改变建模结果,因此可能会引发与不同待遇、反向歧视或积极行动相关的担忧。在高风险场景中,特别是在就业、教育、住房或消费金融应用中使用这些方法之前,请咨询法律专家。
最保守的偏差缓解方法之一是基于性能和公平选择模型,模型训练基本上是通过对许多不同的超参数设置和输入特征集进行网格搜索,而仅将人口统计信息用于测试候选模型是否存在偏差。考虑图 4-2。它展示了对两百个候选神经网络进行随机网格搜索的结果。在 y 轴上,我们看到准确度。在这个轴上最高的模型通常是我们选择的最佳模型。然而,当我们在 x 轴上为这些模型添加偏差测试时,现在我们可以看到有几个几乎具有相同准确性但偏差测试结果明显改善的模型。在超参数搜索中添加偏差测试只会增加整体训练时间的几分之一秒,并为帮助选择模型开辟了一个全新的维度。

图 4-2. 一个简单的随机网格搜索产生了几个有趣的模型选择,这些模型在准确性和 AIR 之间提供了良好的平衡
还有许多其他技术偏见缓解措施。本书中多次讨论过的最重要之一是为可行救济机制提供机制,使人们能够申诉和覆盖错误和重要的基于机器学习的决策。每当我们构建一个影响人们的模型时,我们都应该确保同时构建和测试一个机制,让用户能够理解数据输入和预测,并允许他们要求更改预测。
解毒,或者防止语言模型生成有害语言,包括仇恨言论、侮辱、亵渎和威胁的过程,是偏见缓解研究中另一个重要领域。查看《解毒语言模型中的挑战》,了解当前解毒方法及其固有挑战的良好概述。因为偏见被认为是由模型系统性地误代现实引起的,因果推断和发现技术被视为偏见缓解措施,它们旨在确保模型表达因果真实世界现象。尽管从观察数据进行因果推断仍然具有挑战性,像LiNGAM这样的因果发现方法,寻找与预测目标存在某种因果关系的输入特征,无疑是我们下一个机器学习项目中需要考虑的内容。
警告
偏见缓解工作必须进行监控。偏见缓解可能失败或导致结果恶化。
我们将本节结束时加以警告。技术上的偏见缓解可能无法独自完成,需要我们接下来要讨论的人类因素。事实上,已经显示,偏见测试和偏见缓解可能不会改善情况,甚至导致偏见结果恶化。像机器学习模型本身一样,偏见缓解必须随着时间的推移进行监控和调整,以确保其帮助而不是伤害。最后,如果偏见测试显示问题,而偏见缓解无法解决这些问题,涉及的系统就不应该部署。由于许多机器学习系统被视为预定成功部署的工程解决方案,我们如何阻止系统的部署?通过促进风险意识文化的良好治理,让正确的人群做出最终决定!
缓解偏见的人类因素
在模型部署之前确保最低程度的偏见需要大量人力工作。首先,我们需要一个在人口统计和职业上多样化的从业者和利益相关者团体来构建、审查和监控系统。其次,我们需要将用户纳入到系统的构建、审查和监控中。第三,我们需要治理机制来确保我们能够对偏见问题负责。
我们并不打算假装我们对科技领域中持续困扰的多样性问题有答案。但是这是我们所知道的:有太多的模型和机器学习系统是由经验不足、人口统计上同质化的开发团队训练的,这些团队在应用领域缺乏领域专业知识。这使得系统及其操作者容易出现重大盲点。通常这些盲点意味着时间和金钱的浪费,但它们也可能导致医疗资源的巨大偏离、错误逮捕、媒体和监管审查、法律问题等更为严重的后果。如果在关于人工智能系统的首次设计讨论中,我们看到的只是相似的面孔,我们将不得不极其努力确保系统性和人为偏见不会让项目偏离轨道。这有点元认知,但重要的是要指出,让同样老掉牙的技术人员团队制定参与系统的规则也是有问题的。那些最初的讨论是尝试引入不同类型的人、不同职业背景的人、具有领域专业知识的人和利益相关者代表的时机。而且我们需要让他们继续参与进来。这会减慢我们产品的速度吗?肯定会。这会使我们更难以“快速迭代、快速失败”吗?绝对会。尝试让所有这些人参与会让技术高管和高级工程师感到愤怒吗?肯定会。那么,我们该如何做呢?我们需要赋予我们用户的声音权力,这些用户通常是一个多样化的群体,拥有多样化的需求。我们还需要为我们的机器学习系统建立治理程序。不幸的是,让特权的技术高管和高级工程师关心机器学习中的偏见可能对一个脾气暴躁的人,甚至是一群有良知的从业者来说都很困难,如果没有更广泛的组织支持的话。
我们在围绕机器学习偏见展开组织变革的其中一种方式是与用户互动。用户不喜欢损坏的模型。用户不喜欢掠夺性系统,也不喜欢自动和大规模地受到歧视。从用户那里获取反馈不仅是好的业务做法,而且有助于发现设计中的问题,并跟踪统计偏见测试可能忽视的伤害。我们再次强调,统计偏见测试极少能揭示残疾人士或生活在数字鸿沟另一端的人如何经历伤害,因为他们无法使用系统或系统对他们工作方式不同寻常。我们如何跟踪这些伤害?通过与用户交流。我们并不建议一线工程师奔赴用户家中,但我们建议在构建和部署机器学习系统时,组织采用标准机制,如用户故事、UI/UX 研究、以人为本设计和漏洞赏金计划等结构化方式与用户互动,并将用户反馈纳入系统改进中。章节末尾的案例将突显结构化和激励性的用户反馈,如漏洞赏金计划,揭示了大型复杂机器学习系统中的问题。
另一个转变组织文化的重要方式是治理。这就是为什么我们在第一章中以治理为开篇。在这里,我们将简要解释为什么治理对减少偏见很重要。在许多情况下,机器学习中的偏见是关于粗心大意,有时是有意的坏意图。治理可以在这两方面发挥作用。如果一个组织的书面政策和程序要求所有机器学习模型在部署之前都必须进行充分的偏见或其他问题测试,那么可能会测试更多的模型,提高业务中机器学习模型的性能,并希望减少无意的偏见伤害的几率。文档,特别是能够引导从业者按照政策规定的工作流程步骤进行的模型文档模板,是治理的另一个关键部分。作为从业者,我们要么充分填写模型文档,记录我们沿途采取的正确步骤以符合组织定义的最佳实践,要么不填写。有了文档就有了一份记录,有了记录就有了一些责任的希望。管理者应该能够在模型文档中看到好的工作,也应该能够看到不太好的工作。在后者的情况下,管理层可以介入并对那些从业者进行培训,如果问题继续存在,则可以采取纪律行动。关于所有那些可以成为使用机器学习的组织的真正难题的公平法律定义——政策可以帮助每个人保持与法律的一致性,管理层审查模型文档可以帮助发现从业者的偏离。关于所有那些可能破坏机器学习模型的人类偏见——政策可以定义最佳实践来帮助避免它们,管理层审查模型文档可以帮助在部署模型之前发现它们。
虽然书面政策、程序和强制模型文档在塑造组织围绕模型构建的文化方面发挥了重要作用,但治理也涉及到组织结构。一个不合作的数据科学家对于大型组织对机器学习模型的误用或滥用几乎无能为力。我们需要组织的支持来实现变革。机器学习治理还应确保模型验证和其他监督人员的独立性。如果测试人员向开发者或机器学习经理汇报,并根据部署的模型数量进行评估,那么测试人员可能只是在橡皮图章般地批准有问题的模型。这就是为什么美国政府监管机构所定义的模型风险管理(MRM)坚持要求模型测试人员与模型开发者完全独立,具备与模型开发者相同的教育和技能,并且薪酬也应相同。如果负责机器学习的主管向数据科学副总裁和首席技术官(CTO)汇报,他们无法告诉自己的老板“不行”。他们很可能只是一个代表,花时间在论坛上让组织对其有问题的模型感觉更好。这就是为什么 MRM 定义了一个专注于机器学习风险的高级执行角色,并规定该高级执行人员不应向 CTO 或 CEO 报告,而应直接向董事会报告(或向也向董事会报告的首席风险官)。
很多治理工作归结为一个关键短语,更多的数据科学家应该了解:有效挑战。有效挑战本质上是一组组织结构、业务流程和文化能力,使得有能力的、客观的监督和治理机器学习系统成为可能。在许多方面,有效挑战意味着在组织中有人能够阻止机器学习系统被部署,而不会面临报复或其他负面的职业或个人后果的可能性。太多时候,高级工程师、科学家和技术高管在机器学习系统的所有方面,包括验证、所谓的治理以及关键的部署或废除决策中具有不适当的影响力。这与有效挑战的概念相抵触,也与客观专家审查的基本科学原则相抵触。正如我们在本章前面提到的,这些类型的确认偏见、资金偏见和技术沙文主义可能导致发展出持续系统偏见的伪科学机器学习模型。
尽管没有针对 ML 系统偏见的通用解决方案,但本章突出了两个主题。首先,在任何偏见缓解过程的初步步骤中,都需要涉及一个在人口和专业上多样化的利益相关者群体。对于 ML 项目来说,第 0 步是在做出重要决策时让多样化的利益相关者参与(无论是在现场还是通过视频会议)!其次,以人为中心的设计、漏洞赏金以及其他确保技术满足其人类利益相关者需求的标准化流程,是当前一些最有效的偏见缓解方法。现在,我们将以讨论 Twitter 图像裁剪算法中的偏见案例结束本章,并探讨如何利用漏洞赏金从用户那里了解更多信息。
案例研究:偏见漏洞赏金
这是一个关于一个值得质疑的模型和对此的非常体面的回应的故事。在 2020 年 10 月,Twitter 收到反馈称其图像裁剪算法可能以偏见方式运行。图像裁剪算法使用 XAI 技术,即显著性图,来决定用户上传的图像中哪一部分最有趣,并且不允许用户覆盖其选择。在上传照片以包含在推文中时,一些用户认为基于 ML 的图像裁剪器偏向于白人图像,并集中在女性的胸部和腿部(男性凝视偏见),而在这些问题出现时,用户没有提供任何补救机制来更改自动裁剪。由 Rumman Chowdhury 领导的 ML 伦理、透明度和问责(META)团队发布了一篇博客文章,代码和一篇论文描述了问题及其所进行的测试,这种透明度值得称赞,但随后 Twitter 采取了更独特的步骤。它关闭了算法,并简单地允许用户在许多情况下发布未裁剪的自己的照片。在后来进行的漏洞赏金之前,突出 Twitter 选择关闭该算法是很重要的。炒作、商业压力、资金偏见、群体思维、沉没成本谬误以及对自己职业的关注,所有这些因素都会导致在停用高调 ML 系统时变得非常困难。但这就是 Twitter 所做的,它为我们其余人树立了一个很好的榜样。我们不必部署有问题或不必要的模型,并且如果发现问题,我们可以取下这些模型。
Twitter 在公开其问题并停用该算法后,决定举办偏见漏洞悬赏活动,以获取对算法的结构化用户反馈。通常情况下,参与者因发现最严重的漏洞而有机会获得金钱奖励。这种结构和激励机制是理解漏洞悬赏作为用户反馈机制独特价值的关键。结构至关重要,因为大型组织很难处理无结构、临时的反馈。当反馈以电子邮件、推文或偶尔的不切实际技术媒体文章形式出现时,很难为变革构建案例。META 团队付出了艰苦的努力,建立了一个结构化评分标准,供用户提供反馈。这意味着当反馈收到时,更容易进行审核,可以跨更广泛的利益相关者进行审查,甚至包含数值分数,帮助不同利益相关者理解问题的严重程度。这个评分标准适用于任何希望跟踪计算机视觉或自然语言处理系统中伤害的人,这些系统的实际和统计显著性以及差异性能往往不能完全说明偏见的全部故事。激励措施同样关键。虽然我们可能非常关心机器学习的负责任使用,但大多数人,甚至机器学习系统的用户,有更重要的事情需要担心,或者不了解机器学习系统如何造成严重伤害。如果我们希望用户停下日常生活告诉我们有关我们的机器学习系统,我们需要支付他们或提供其他有意义的激励措施。
根据AlgorithmWatch,一个专注于自动决策社会影响的欧盟智库,赏金计划是“一次前所未有的开放性实验”。公开图像裁剪代码以获得偏见赏金参与者的参与,用户发现了许多新问题。根据Wired,赏金计划的参与者还发现了针对白发者以及非拉丁文本脚本(即如果我们想发布中文、西里尔文、希伯来文或任何不使用拉丁字母表的语言编写的模因),算法会反对我们的倾向。AlgorithmWatch 还强调了比赛中的一项最奇怪的发现。图像裁剪器经常选择漫画条的最后一个单元格,从而使试图分享使用漫画条格式的媒体的用户感到失望。最终,3500 美元和头奖被瑞士的一名研究生 Bogdan Kulynych 赢得。Kulynych 的解决方案使用深度伪造技术在各种形状、色调和年龄段之间创建面部。凭借这些面部和对裁剪算法的访问,他能够经验证明算法内的显著性功能,用于选择上传图像中最有趣的区域,反复显示出对年轻、瘦、白皮肤和更女性化面孔的偏好。
偏见赏金并非没有批评。一些公民社会活动家表示担忧,科技公司和科技会议的高调性质使人们注意力从算法偏见的根本社会原因上转移开来。AlgorithmWatch 精辟地指出,提供的 7000 美元奖金远远少于安全漏洞的悬赏,后者平均每个漏洞约为 10000 美元。它还强调,7000 美元是硅谷工程师 1-2 周的工资支付,Twitter 自己的道德团队称,为期一周的赏金计划相当于大约一年的测试工作。毫无疑问,Twitter 从偏见赏金中受益,并为用户提供的信息支付了低廉的代价。使用赏金计划作为偏见风险缓解措施还存在其他问题吗?当然存在,Kulynych 在在线技术方面总结了这些及其他紧迫问题。根据Guardian,Kulynych 对偏见赏金有着复杂的感受,并评论道:“算法伤害不仅仅是漏洞。关键在于,许多有害技术不是由于意外、无意的错误,而是出于设计。这源自于增强参与度,并且通常是通过将成本外部化来获取利润。例如,加剧了新兴社区、压低了工资、传播点击诱饵和错误信息,并不一定是由于有偏见的算法。”简言之,机器学习偏见及其相关的伤害更多关乎人和金钱,而非技术本身。
资源
进一步阅读
¹ 作者承认引用语言中的几个术语可能具有潜在的冒犯性。NIST SP1270 AI 材料经过审查,并且在忽视 AI 科学严谨性可能导致极端伤害时被证明是合理的。
² 注意,为 XGBoost 更新损失函数是相当简单的。
第五章:机器学习的安全性
如果“安全的最大敌人是复杂性”,正如 Bruce Schneier 所声称的,过于复杂的机器学习系统本质上是不安全的。其他研究人员还发布了许多关于 ML 系统特定安全漏洞的研究,并确认了这些漏洞。我们现在开始看到现实世界中的攻击如何发生,比如 伊斯兰国运营商在在线内容中模糊其标志 以逃避社交媒体过滤器。由于组织通常采取措施保护宝贵的软件和数据资产,ML 系统也应不例外。除了特定的事件响应计划外,还应将几种额外的信息安全流程应用于 ML 系统。这些包括专门的模型调试、安全审计、漏洞赏金和红队测试。
当今 ML 系统的一些主要安全威胁包括以下内容:
-
内部人员操作 ML 系统训练数据或软件,以改变系统结果
-
外部对手通过操作 ML 系统功能和结果
-
外部对手窃取专有 ML 系统逻辑或训练数据
-
木马或恶意软件隐藏在第三方 ML 软件、模型、数据或其他工件中
对于 AI 的关键或其他高风险的部署,系统应至少测试和审计这些已知的漏洞。传统的 ML 模型评估无法检测到它们,但是较新的模型调试技术可以帮助,特别是在针对特定安全漏洞进行调优时。审计可以由内部或由专业团队进行,这就是所谓的“红队测试”,就像 Meta 所做的那样。漏洞赏金,或者组织向公众提供货币奖励以发现漏洞,是通用信息安全实践的另一种做法,可能也应用于 ML 系统。此外,测试、审计、红队测试和漏洞赏金不应仅限于安全问题。这些类型的流程也可以用于发现其他与 ML 系统相关的问题,例如偏见、不稳定性或缺乏鲁棒性、可靠性或弹性,并在它们演变为 AI 事件之前发现它们。
注意
审计、红队测试和漏洞赏金不应仅限于安全问题。漏洞赏金可用于发现公共 ML 系统中的各种问题,包括偏见、未经授权的决策以及产品安全或疏忽问题,除了安全和隐私问题。
这一章节探讨了安全基础知识,如 CIA 三要素和数据科学家的最佳实践,然后深入讨论了机器学习安全问题。详细讨论了机器学习攻击,包括专门针对机器学习的攻击和可能影响机器学习系统的一般性攻击。接着提出了一些对策,例如专门的强大机器学习防御和隐私增强技术(PETs),安全感知的模型调试和监控方法,以及一些更一般的解决方案。本章以社交媒体逃避攻击及其现实后果案例讨论结束。读者在阅读完本章后,应能够对其机器学习系统进行基本的安全审计(或“红队测试”),发现问题,并在必要时采取简单的对策。参见第十一章获取机器学习安全代码示例。
安全基础知识
我们可以从计算机安全的广泛领域中学到许多基本的教训,这些教训将有助于加强我们的机器学习系统。在深入讨论机器学习的黑客攻击和对策之前,我们需要重点介绍敌对思维的重要性,讨论用于识别安全事件的 CIA 三要素,并强调适用于任何 IT 团队或计算机系统的几项简单的最佳安全实践,包括数据科学家和机器学习系统。
敌对思维
与许多炒作技术领域的从业者一样,机器学习系统的制造者和用户往往关注积极的方面:自动化、增加的收入以及新技术的时髦性。然而,另一群从业者则通过不同的敌对视角看待计算机系统。其中一些从业者可能与我们并肩工作,帮助保护我们组织的 IT 系统,以防止那些故意滥用、攻击、入侵和误用机器学习系统以谋取私利并对他人造成伤害的人士。学习机器学习安全的一个良好的第一步是采纳这种敌对思维,或者至少阻止过度乐观的机器学习炒作,思考机器学习系统被故意滥用和误用的情况,包括我们正在开发的系统。
警告
不要对高风险的机器学习系统天真。它们可能会伤害人们。人们会攻击它们,并会滥用它们来伤害他人。
也许一个不满的同事毒害了我们的训练数据,也许某些第三方 ML 软件关联的二进制文件中隐藏了恶意软件,也许我们的模型或训练数据可以通过未受保护的端点提取,或者可能是一个僵尸网络可以通过分布式拒绝服务(DDOS)攻击我们组织的公共面向 IT 服务,导致我们的 ML 系统成为附带损害。虽然这样的攻击不会每天发生在我们身上,但它们会经常发生在某个地方的某人身上。当然,了解特定安全威胁的细节很重要,但总是考虑安全漏洞和事件多方面现实的对抗思维也许更为重要,因为攻击和攻击者往往是出人意料且巧妙的。
CIA 三要素
从数据安全的角度来看,通常将目标和失败定义为机密性、完整性和可用性(CIA)三要素(图 5-1)。简要总结三要素,数据应仅对授权用户可用(机密性),数据应正确和及时更新(完整性),数据在需要时应及时可用(可用性)。如果这些原则中的任何一个被违反,通常会发生安全事件。CIA 三要素直接适用于恶意访问、更改或销毁 ML 系统的训练数据。但可能更难看到 CIA 三要素如何适用于 ML 系统发出决策或预测,而 ML 攻击往往以混淆的方式融合传统数据隐私和计算机安全问题。因此,让我们逐个例子来看一下。

图 5-1. 信息安全的 CIA 三要素
ML 系统的机密性可以通过逆推攻击(见“模型提取和逆推攻击”)来突破,恶意行为者通过适当方式与 API 交互,但使用可解释的人工智能技术从其提交的输入数据和我们系统的预测中提取有关我们模型和训练数据的信息。在更危险和复杂的成员推断攻击中(见“成员推断攻击”),可以从 ML 系统的 API 或其他端点提取单个训练数据行,直至整个训练数据集。请注意,这些攻击可能发生在未经授权访问训练文件或数据库的情况下,但对我们的用户或组织可能造成相同的安全和隐私危害,甚至可能涉及严重的法律责任。
ML 系统的完整性可能会受到多种方式的损害,例如数据污染攻击或对抗性示例攻击。在数据污染攻击中(参见“数据污染攻击”),组织内部人员会微妙地更改系统训练数据,以改变系统预测以符合他们的利益。只需操纵少量训练数据即可改变系统结果,而来自主动学习和其他领域的专业技术可以帮助攻击者更有效地这样做。当 ML 系统将数百万规则或参数应用于数千个交互输入特征时,几乎不可能理解 ML 系统可能做出的所有不同预测。在对抗性示例攻击中(参见“对抗性示例攻击”),外部攻击者通过找到奇怪的数据行——对抗性示例——来利用这些过度复杂的机制,从 ML 系统中引发意外和不当的结果,通常是为了自己的利益而损害我们。
ML 系统的可用性受到侵犯时,用户无法获得他们期望的服务。这可能是前述攻击将系统拖垮的结果,也可能是更标准的拒绝服务攻击、海绵示例攻击或偏见造成的后果。人们在日常生活中越来越依赖 ML 系统,当这些模型涉及到政府、金融或就业等高影响决策时,ML 系统的崩溃会使用户无法访问重要服务。最近的研究揭示了海绵示例的威胁,即一种特殊设计的输入数据类型,迫使神经网络减慢预测速度并消耗大量能源。可悲的是,许多 ML 系统还在成果和准确性方面延续了历史上边缘化人群的系统偏见。少数群体可能不太可能从自动信用提供或简历扫描等服务中获得相同水平的可用性。更直接令人担忧的是,他们可能更有可能因面部识别系统(包括在安全或执法背景下使用的系统)的错误预测而遭受影响。 (第四章和 10 章详细讨论了 ML 系统中的偏见和偏见测试。)
这些只是 ML 系统可能遇到安全问题的几种方式。还有很多其他方式。如果读者开始感到担忧,继续阅读!接下来我们将讨论简单直接的安全概念和最佳实践。这些提示可以在保护任何计算机系统方面发挥重要作用。
数据科学家的最佳实践
从基础开始对于确保更复杂的 ML 系统非常重要。以下列表总结了在数据科学工作流程中这些基础知识的内容:
访问控制
能够访问敏感资源的人员越少越好。机器学习系统中有许多敏感组件,但只允许那些需要访问的人访问训练数据、训练代码和部署代码将有助于减少与数据外泄、数据毒化、后门攻击及其他攻击相关的安全风险。
Bug 悬赏
Bug 悬赏,即组织向公众提供找到漏洞的经济奖励,是信息安全领域的另一种实践,可能也应用于机器学习系统。关键的洞察力在于它们激励用户参与。用户很忙。有时我们需要奖励他们提供反馈。
事件响应计划
为关键的 IT 基础设施制定事件响应计划是一种常见做法,以快速应对任何故障或攻击。确保这些计划覆盖了机器学习系统,并具备在机器学习系统发生故障或遭受攻击时有所帮助的必要细节。我们需要明确在 AI 事件发生时谁负责什么,特别是在业务权限、技术知识、预算以及内部和外部沟通方面。像NIST和SANS Institute这样的组织有出色的资源可以帮助我们开始事件响应。如果读者想查看一个机器学习系统的示例事件响应计划,请访问 BNH.AI 的GitHub。
常规备份
勒索软件攻击,即恶意黑客冻结组织的 IT 系统访问,并在不支付赎金时删除宝贵资源,这种情况并不少见。确保定期和常规地备份重要文件,以防意外和恶意数据丢失。此外,最佳实践是将物理备份与任何联网机器分离(或“空气隔离”)。
最小特权
严格应用最小特权的概念,即确保所有人员——甚至是“摇滚明星”数据科学家和机器学习工程师——只获得绝对必要的 IT 系统权限,是防范内部机器学习攻击的最佳途径之一。特别注意限制 root、管理员或超级用户的数量。
密码与认证
使用随机和唯一的密码、多因素认证和其他认证方法,以确保保留访问控制和权限。对于分配给敏感项目的任何人员,实施更高水平的密码卫生(如使用密码管理器)也不失为一个好主意。物理钥匙,例如Yubikeys,是目前最强的认证措施之一。考虑到密码钓鱼的普遍性,以及像 SIM 换卡这样绕过基于电话的认证的黑客攻击,应该考虑在高风险应用中使用物理钥匙。
物理媒体
如果可能的话,避免对敏感项目使用物理存储介质,除非需要进行备份。印刷文件、闪存驱动器、备份媒体和其他便携数据源经常会被忙碌的数据科学家和工程师遗失或误放。更糟糕的是,它们可能会被积极进取的对手盗取。对于不那么敏感的工作,考虑制定围绕物理介质使用的政策和教育。
产品安全
如果我们的组织制作软件,很可能会对这些产品应用任意数量的安全功能和测试。同样,没有逻辑理由不将这些标准应用于面向公众或客户的机器学习系统。我们应该联系我们组织中的安全专家,讨论将标准产品安全措施应用于我们的机器学习系统。
红队
对于机器学习的任务关键或其他高风险部署,系统应在敌对条件下进行测试。在所谓的红队测试中,技术娴熟的团队试图攻击机器学习系统,并向产品所有者报告他们的发现。
第三方
构建机器学习系统通常需要来自我们组织以外的代码、数据和人员。遗憾的是,每一个新的参与者都会增加我们的风险。注意第三方数据中的数据污染或由第三方人员进行的数据污染。扫描所有第三方包和模型以检测恶意软件,并控制所有部署代码以防止插入后门或其他恶意有效载荷。
版本和环境控制
为了确保基本安全性,我们需要知道对哪些文件进行了什么样的更改,何时进行的更改,以及由谁进行的更改。除了源代码的版本控制外,任何商业或开源环境管理器都可以自动跟踪大数据科学项目。查看一些这些开放资源,开始进行机器学习环境管理:DVC,gigantum,mlflow,ml-metadata,和modeldb。
机器学习安全,将在接下来的章节中讨论,对于数据科学家可能比这里描述的更一般的战术更感兴趣。然而,由于这里考虑的安全措施如此简单,不遵守它们可能会导致我们组织的法律责任,以及令人尴尬或昂贵的违规和黑客攻击。虽然仍在辩论中且有些模糊,但违反由美国联邦贸易委员会(FTC)和其他监管机构执行的安全标准,可能会带来令人不愉快的审查和执法行动。加固我们机器学习系统的安全性是一项艰巨的工作,但是在构建具有许多子系统和依赖关系的更复杂的机器学习系统时,如果基础工作没有做好,可能会带来大麻烦。
机器学习攻击
各种 ML 软件工件,ML 预测 API 以及其他 AI 系统端点现在成为网络和内部人员攻击的向量。这些 ML 攻击可以抵消数据科学团队为缓解其他风险所做的所有努力,因为一旦我们的 ML 系统受到攻击,它就不再是我们的系统。攻击者通常对准确性,偏见,隐私,可靠性,鲁棒性,弹性和未经授权的决策有他们自己的议程。防御这些攻击的第一步是了解它们。我们将在接下来的章节中概述最为人熟知的 ML 攻击。
注意
大多数针对 ML 系统的攻击和漏洞都基于经典 ML 算法的不透明和过度复杂的特性。如果一个系统过于复杂以至于其操作员无法理解它,那么攻击者可以在操作员不知情的情况下操纵它。
完整性攻击:操纵机器学习输出
我们的 ML 攻击之旅将从攻击 ML 模型的完整性开始,即修改系统输出的攻击。可能是最为人熟知的攻击类型之一,对抗性示例攻击将首先讨论,随后是后门攻击,数据污染以及冒充和逃避攻击。在考虑这些攻击时,请记住它们通常可以用两种主要方式之一使用:(1)授予攻击者他们期望的 ML 结果,或(2)拒绝第三方其正当的结果。
对抗性示例攻击
一个积极进攻者可以通过与预测 API 的试错(即“探索”或“敏感性分析”),通过反演攻击(见“模型提取和反演攻击”),或通过社会工程学,学会如何操纵我们的 ML 模型以获得他们期望的预测结果,或如何改变他人的结果。专门设计数据行以进行这种目的的攻击被称为对抗性示例攻击。攻击者可以使用对抗性示例攻击来授予自己贷款,低于适当的保险费率,或根据犯罪风险评分避免预审拘留。查看图 5-2 以查看虚构攻击者利用奇怪的数据行对信用放贷模型执行对抗性示例攻击的插图。

图 5-2. 一种对信用放贷模型执行对抗性示例攻击的虚构攻击者的插图(数字,彩色版本)
后门攻击
想象一个场景,一个员工、顾问、承包商或恶意的外部行为者有权访问我们模型的生产代码——用于实时预测的代码。这个人可以更改代码,以识别奇怪或不太可能的输入变量值组合,以触发期望的预测结果。与其他结果操纵黑客攻击一样,后门攻击可以用于触发攻击者想要的模型输出,或者第三方不希望的结果。如在图 5-3 所示,攻击者可以将恶意代码插入我们模型的生产评分引擎,以识别一个真实年龄但工作年限(yoj)为负数的组合,以触发他们自己或他们的同伴的不恰当的正面预测结果。为了改变第三方的结果,攻击者可以向我们模型的评分代码中插入一个人工规则,阻止我们模型为某一群体产生正面的结果。

图 5-3. 后门攻击(数字版,彩色)
数据污染攻击
数据污染是指有人系统性地改变我们的训练数据,以操纵我们模型的预测。为了进行数据污染,攻击者必须能够访问部分或全部我们的训练数据。在许多公司,许多不同的员工、顾问和承包商都有这样的访问权限,而监督却很少。也有可能,恶意的外部行为者可能未经授权地获取部分或全部我们的训练数据并进行污染。一个非常直接的数据污染攻击可能涉及改变训练数据集的标签。在图 5-4 中,攻击者改变了少量训练数据的标签,以便那些具有他们信用历史的人会错误地接收到一个信用产品。也有可能,恶意行为者可能利用数据污染来训练我们的模型有意歧视某个群体,剥夺他们应有的大额贷款、大折扣或低保险费率。

图 5-4. 数据污染攻击(数字版,彩色)
虽然最简单地将数据污染看作是改变数据集现有行的值,但数据污染也可以通过向数据集和 ML 模型添加看似无害或多余的列来进行。这些列中的修改值可能会触发修改后的模型预测。这是避免向无法解释的 ML 模型倾倒大量列的许多原因之一。
冒名顶替和逃避攻击
使用试错法、模型逆推攻击(参见“模型提取和逆推攻击”)或社会工程学,攻击者可以了解到我们的机器学习系统从中得到预测结果的个体类型。攻击者随后可以冒充这种类型的输入或个体,以获取所需的预测结果,或逃避不希望的结果。这些冒充和逃避攻击类似于从机器学习模型角度看的身份盗窃。它们也类似于对抗性示例攻击(参见“对抗性示例攻击”)。
与对抗性示例攻击类似,冒充攻击涉及人为更改我们模型的输入数据值。与对抗性示例攻击不同的是,后者可能使用看似随机的输入数据值组合来欺骗我们的模型,而冒充意味着使用与另一个建模实体相关联的信息(即客户、员工、财务交易、患者、产品等),以获取我们的模型与该类型实体相关联的预测。而逃避则意味着相反的行为—更改我们自己的数据以避免不良预测。
在 图 5-5 中,攻击者了解了我们的模型与授信产品关联的特征,然后伪造他们自己的信息来获取该授信产品。他们可以与他人分享他们的策略,这可能导致我们公司遭受巨大损失。听起来像科幻小说?不是。与此密切相关的逃避攻击已经在面部识别支付和安全系统中奏效,并且“案例研究:真实世界的逃避攻击”将讨论几个文档记录的逃避机器学习安全系统实例。

图 5-5. 一种冒充攻击(数字版,彩色版本)
对机器学习解释的攻击
在所谓的“脚手架”攻击中—参见“愚弄 LIME 和 SHAP:对后续解释方法的对抗攻击”—对手可以操纵后续解释方法,如局部可解释模型无关解释和 Shapley 加性解释。对部分依赖的攻击,另一种常见的后续解释技术,最近也已发布—参见“通过数据毒化愚弄部分依赖”。对解释的攻击可以用来改变操作员和消费者对机器学习系统的认知—例如,使管道中的另一个黑客攻击更难发现,或使一个有偏见的模型看起来公平—被称为[美化]。这些攻击清楚地表明,随着机器学习管道和 AI 系统变得更加复杂,不良行为者可能会瞄准系统的许多不同部分,从训练数据一直到后续解释,以改变系统输出。
保密性攻击:提取的信息
如果没有适当的对策,恶意行为者可以访问关于我们模型和数据的敏感信息。模型提取和反转攻击是指黑客重建我们的模型,并从其模型副本中提取信息。成员推断攻击允许恶意行为者知道我们训练数据中的哪些行,并甚至重构训练数据。这些攻击只需访问一个无防护的机器学习系统预测 API 或其他系统端点即可。
注
模型提取、模型反转、成员推断以及其他一些机器学习攻击,都可以看作是对一个较旧和更常见的知识产权和安全问题——逆向工程的一种新的处理方式。保密性攻击以及其他机器学习攻击,可以被用来逆向工程和重构我们潜在敏感的模型和数据。
模型提取和反转攻击
反转(参见 图 5-6)基本上是指从我们的模型中获取未授权的信息——与正常的使用模式相反,即将信息输入到我们的模型中。如果攻击者可以从我们的模型 API 或其他端点(网站、应用等)接收许多预测,他们可以在他们的输入和我们系统预测之间训练一个替代模型。那个提取出的替代模型是在攻击者用来生成接收到的预测的输入和接收到的预测之间训练的。根据攻击者可以接收到的预测数量,替代模型可以成为我们模型的相当准确的模拟。不幸的是,一旦替代模型训练完成,我们就会遇到几个重大问题:
-
模型实际上只是训练数据的压缩版本。有了替代模型,攻击者可以开始了解我们潜在敏感的训练数据。
-
模型是有价值的知识产权。攻击者现在可以出售他们复制的我们模型的访问权限,并削减我们的投资回报。
-
攻击者现在拥有一个沙盒,可以在其中策划模仿、对抗性示例、成员推断或其他攻击来针对我们的模型。
这样的替代模型也可以使用外部数据源进行训练,这些数据源可以与我们的预测相匹配,就像 ProPublica 与专有的 COMPAS 犯罪风险评估工具 (引用自此处) 一样。

图 5-6. 一种反转攻击(数字版,彩色)
成员推断攻击
在以模型提取开始并且也由替代模型执行的攻击中,恶意行为者可以确定我们的模型训练数据中是否存在特定的人或产品。称为成员推理攻击(见图 5-7),这种黑客攻击是由两层模型执行的。首先,攻击者将数据传入公共预测 API 或其他端点,接收预测结果,并训练替代模型或模型,以在传入数据和预测结果之间建立联系。一旦训练出替代模型(或多个模型)来复制我们的模型,攻击者接着训练第二层分类器,可以区分用于训练第一个替代模型和未用于训练该替代模型的数据。当这第二个模型用于攻击我们的模型时,它可以明确指出任何给定的数据行(或多行)是否存在于我们的训练数据中。
当模型和数据与破产或疾病等不良结果,或高收入或净值等良好结果相关时,训练数据集中的成员身份可能非常敏感。此外,如果攻击者可以轻易地通过单一行数据与我们模型的目标之间的关系进行泛化,比如种族、性别或年龄与某些不良结果之间的明显关系,这种攻击可能会侵犯整个人群的隐私。令人恐惧的是,如果达到最极端,成员推理攻击甚至可以让一个恶意行为者仅通过未受保护的公共预测 API 或其他模型端点的访问,逆向工程敏感或有价值的大部分训练数据集。

图 5-7. 一个成员推理攻击(数字,彩色版本)
尽管所讨论的攻击是一些最为知名的种类,但请记住这并不是机器学习黑客攻击的唯一类型,新的攻击可能非常快速地出现。因此,在进入到我们可以用来保护我们的机器学习系统的对策之前,我们还将讨论一些一般性的关注点,以帮助我们构建更广泛的威胁环境框架。
机器学习安全的一般关注点
这本书的一个普遍主题是,机器学习系统基本上是软件系统,将常识性的软件最佳实践应用于机器学习系统通常是一个好主意。安全方面也是如此。作为软件系统和服务,机器学习系统表现出类似于通用软件系统的失败模式,并经历与一般软件系统相同的攻击。还有哪些一般性的关注点?像是意图滥用 AI 技术、可用性攻击、木马和恶意软件、中间人攻击、不必要复杂的无法解释系统以及分布式计算的困难:
滥用机器学习
几乎所有工具也可以被用作武器,机器学习模型和人工智能系统可以被滥用多种方式。让我们从深度伪造开始考虑。深度伪造是深度学习的一种应用,当仔细进行时,可以将音频和视频片段无缝地融合成令人信服的新媒体。虽然深度伪造可以用于使电影演员重生,就像一些最近的星球大战电影中所做的那样,但深度伪造也可以用于伤害和敲诈勒索人们。当然,非自愿色情,即将受害者的面孔混合到成人视频中,是深度伪造的最流行用途之一,正如BBC和其他新闻媒体所报道的那样。深度伪造也被牵涉到金融犯罪中,例如当攻击者使用 CEO 的声音来命令将钱转入他们自己的账户时。算法歧视是滥用人工智能的另一个常见应用。在“公平洗白”攻击中,事后解释可以被修改以隐藏偏向模型中的歧视。面部识别也可以直接用于种族识别。我们只是触及了机器学习系统可以被滥用的一些方式;有关这一重要主题的更广泛处理,请参阅“AI-Enabled Future Crime”。
一般可用性攻击
机器学习系统可能会成为像其他面向公众服务一样受到拒绝服务(DOS)攻击的受害者。如果面向公众的机器学习系统对我们的组织至关重要,我们会确保其通过防火墙和过滤器、反向域名服务器系统(DNS)查找以及其他增加在 DOS 攻击期间可用性的对策来加固。不幸的是,我们还必须考虑通过算法歧视引起的另一种可用性失败。如果算法歧视足够严重,无论是由内部故障还是敌对攻击驱动,我们的机器学习系统可能不会被其大部分用户使用。确保在训练期间和系统部署生命周期中进行偏见测试。
木马和恶意软件
在研发环境中,机器学习依赖于一个多样化的开源软件包生态系统。其中一些软件包拥有许多贡献者和用户。有些则非常特定,只对少数研究人员或从业者有意义。众所周知,许多软件包由杰出的统计学家和机器学习研究人员维护,他们的主要关注点是数学或算法,而不是软件工程或安全性。一个机器学习流水线可能依赖于几十甚至上百个外部软件包,其中任何一个都可能被黑客利用来隐藏攻击载荷。具有大型二进制数据存储和预训练机器学习模型的第三方软件包似乎尤为容易受到这类问题的影响。如果可能,扫描与机器学习系统相关的所有软件工件,查找木马和恶意软件。
中间人攻击
因为许多机器学习系统的预测和决策都是通过互联网或组织的网络传输的,它们在传输过程中可以被恶意行为者操控。在可能的情况下,使用加密、证书、双向认证或其他对策来确保通过网络传输的机器学习系统结果的完整性。
不可解释的机器学习
尽管最近对可解释模型和模型解释的发展提供了使用准确且透明模型的机会,但许多机器学习工作流程仍围绕不可解释模型展开。这种模型在商业机器学习工作流中是常见的不必要复杂性的一种类型。一个专注且有动力的攻击者可以随着时间的推移,比我们自己的团队更深入地了解我们过于复杂且不可解释的机器学习模型。 (特别是在今天的频繁人员流动的数据科学职场。)这种知识不平衡可能被利用来进行我们已经描述的攻击,或者其他尚未知晓的攻击类型。
分布式计算
不管是好是坏,我们生活在大数据时代。许多组织现在正在使用分布式数据处理和机器学习系统。分布式计算可以为恶意的内部或外部行为者提供广泛的攻击面。数据可能只在一个或几个大型分布式数据存储或处理系统的工作节点上被污染。一个后门可能只编码在大型集成模型的一个模型中。现在从一个简单的数据集或模型调试转向,从业者有时必须检查分布在大型计算集群中的数据或模型。
又开始感到担忧了吗?挺住——接下来我们将讨论关于机器学习系统的保密性、完整性和可用性攻击的对策。
对策
我们可以使用许多对策,并结合在第一章中提议的治理过程、漏洞赏金、安全审计和红队行动,这些措施更有可能是有效的。此外,还有对抗性机器学习和强化机器学习等较新的子学科,这些学科正在对这些主题进行全面的学术处理。本节将概述我们可以使用的一些防御措施,以帮助使我们的机器学习系统更安全,包括安全的模型调试、安全的模型监控、增强隐私技术、强化机器学习以及一些一般方法。
安全的模型调试
在发布之前,机器学习模型可以并且应该进行安全漏洞测试。在这些测试中,目标基本上是攻击我们自己的机器学习系统,了解我们的安全水平,并修补任何发现的漏洞。适用于安全调试的跨不同类型机器学习模型的一些通用技术包括对抗示例搜索、敏感性分析、针对内部攻击和模型提取攻击的审计,以及歧视性测试。
对抗示例搜索和敏感性分析
以对抗态度进行敏感性分析,或者更好地说,进行我们自己的对抗性示例攻击,是确定我们的系统是否容易受到可能是最简单和最常见的 ML 完整性攻击类型之一的好方法。这些道德黑客的想法是了解什么特征值(或其组合)可以导致我们系统输出预测大幅波动。如果我们在深度学习领域工作,像cleverhans和foolbox这样的软件包可以帮助我们开始测试我们的 ML 系统。对于那些处理结构化数据的人来说,老牌的敏感性分析可以在指出系统不稳定性方面发挥很大作用。我们还可以使用遗传学习来演化我们自己的对抗性示例,或者使用基于个体条件期望的启发式方法来找到对抗性示例。一旦我们发现由这些对抗性示例触发的 ML 系统的不稳定性,我们将希望使用交叉验证或正则化来训练一个更稳定的模型,应用来自健壮机器学习的技术(见“健壮机器学习”),或者在实时中明确监控发现的对抗性示例。我们还应将此信息链接到系统的事件响应计划中,以防以后有用。
对内部数据污染进行审计
如果发生数据污染攻击,系统内部人员—员工、承包商和顾问—可能是嫌疑人。我们如何追踪内部数据污染者?首先,对这些个人使用我们的系统进行评分。任何接收到积极结果的内部人员可能是攻击者或知道攻击者的人。因为聪明的攻击者可能会对训练数据进行最小的更改,以产生积极的结果,所以我们还可以使用残差分析来寻找具有大于预期残差的有益结果,这表明 ML 模型可能倾向于为这些个体发出负面结果,如果训练数据没有被改变的话。数据和环境管理是内部数据污染的强有力对策,因为所有数据变更都有充分的元数据记录(谁、什么时候等等)。我们还可以尝试拒绝对负面影响(RONI)技术,该技术在开创性的“机器学习安全性”中提出,以从系统训练数据中删除潜在已改变的行。
偏倚测试
源于某种偏见(无论是有意还是无意)的 DOS 攻击,是一种可信的可用性攻击类型。事实上,这种情况已经发生过。2016 年,Twitter 用户毒害了Tay 聊天机器人,导致只有对新纳粹色情内容感兴趣的用户才会觉得系统服务有吸引力。这种攻击也可能发生在更严重的背景下,比如就业、借贷或医疗领域,攻击者利用数据毒化、模型后门或其他类型的攻击,来拒绝某个群体的服务。这是进行偏见测试并在训练时以及作为常规模型监控的一部分进行补救的许多原因之一。有几个优秀的开源工具可用于检测歧视并尝试修复它,比如aequitas、Themis和AIF360。
道德黑客:模型提取攻击
模型提取攻击本身是有害的,但它们也是成员推断攻击的第一阶段。我们应该进行自己的模型提取攻击,以确定我们的系统是否容易受到这些保密攻击的影响。如果我们发现某个 API 或模型端点允许我们在输入数据和系统输出之间训练一个替代模型,我们将通过坚实的认证措施来锁定它,并限制在这个端点的任何异常请求。由于可能已经通过这个端点发生了模型提取攻击,我们需要按以下方式分析我们提取的替代模型:
-
不同类型替代模型的准确性界限是什么?我们必须尽力理解替代模型在多大程度上真正可用于获取关于我们 ML 系统的知识。
-
我们的替代模型可以学到哪些数据趋势?线性模型系数表示的线性趋势又如何?或者说人口子群的课程总结在替代决策树中是如何表示的?
-
从替代决策树中可以学到哪些规则?例如,如何可靠地模仿一个会得到有利预测的个体?或者如何构建有效的对抗性示例?
如果我们看到可以从系统的一个端点训练一个准确的替代模型,并回答这些问题的可能性,那么我们将需要采取一些下一步措施。首先,我们将对自己进行成员推断攻击,以查看是否也可能发生这种两阶段攻击。我们还需要记录与这次道德黑客分析相关的所有信息,并将其与系统的事件响应计划联系起来。事后响应者可能会在以后的某个日期发现这些信息很有帮助,如果有强有力的证据表明发生了攻击,可能不幸需要报告为一次违规事件。
调试我们 ML 系统中的安全漏洞是重要的工作,可以为我们节省未来的金钱、时间和痛苦,但监视我们的系统以确保其保持安全同样重要。接下来,我们将讨论安全模型监控。
安全模型监控
一旦黑客能够操纵或提取我们的 ML 模型,它实际上就不再是我们的模型了。为了防范对模型的攻击,我们不仅需要在训练和调试时考虑安全性;一旦模型投入使用,我们还需要密切监控它。安全监控应重点关注算法歧视、输入数据队列中的异常、预测中的异常以及高使用率。以下是一些关于什么和如何监控的提示:
偏见监测
如其他章节所述,偏见测试必须在模型训练期间应用。但由于许多原因,包括意外后果和恶意黑客攻击,部署期间也必须进行歧视测试。如果在部署期间发现偏见,应进行调查和补救。这有助于确保在训练期间公平的模型在生产中仍然是公平的。
输入异常
不允许将不现实的数据组合进入模型评分队列,因为这可能会触发模型机制中的后门。异常检测 ML 技术,如自编码器和孤立森林,通常有助于跟踪问题输入数据。然而,在数据到达模型之前,我们也可以使用常识数据完整性约束来捕捉问题数据。这种不现实的数据的一个例子是 40 岁的年龄和 50 年的工作年限。如果可能的话,我们还应考虑监控随机数据、训练数据或重复数据。因为随机数据经常被用于模型提取和反演攻击,所以我们建立警报或控制措施,帮助团队了解我们的模型何时可能遇到随机数据批次。应记录并调查实时评分中与训练、验证或测试数据极为相似或相同的行,因为这可能表明成员推理攻击。最后,在实时评分队列中查找重复数据,因为这可能表明逃避或冒名顶替攻击。
输出异常
输出异常可能表明敌对样本攻击。在评分新数据时,我们将我们的 ML 模型预测与可信、透明的基准模型或基于可信数据源和流水线训练的基准模型进行比较。如果我们更复杂和不透明的 ML 模型与我们可解释或可信任的模型之间的差异太大,我们会退回到保守模型的预测,或者将数据行发送进行手动处理。统计控制限,类似于移动置信区间,也可以用于监控异常输出。
元监控
我们监控基本的操作统计数据——特定时间段内的预测次数、延迟、CPU、内存和磁盘负载,或者并发用户数量——以确保我们的系统正常运行。我们甚至可以对我们整个 ML 系统的操作统计数据进行基于自编码器的异常检测元模型训练,然后监控这个元模型以检测异常。系统操作中的异常可能会提示我们在 ML 系统中普遍存在问题。
监控攻击是我们可以采取的最积极的措施之一来对抗 ML 黑客。然而,还有几个反制措施需要讨论。接下来我们将研究隐私增强技术。
隐私增强技术(Privacy-Enhancing Technologies)
隐私保护机器学习(Privacy-preserving ML)是一个研究子领域,直接影响到我们机器学习训练数据的保密性。尽管在机器学习(ML)和机器学习运营(MLOps)社区刚刚开始受到关注,PETs 在保护我们的数据和模型方面可以给我们带来优势。这个新兴领域中一些最有前景和实用的技术包括联邦学习和差分隐私。
联邦学习
联邦学习是一种跨多个分散设备或服务器进行 ML 模型训练的方法,这些设备或服务器持有本地数据样本,它们之间不交换原始数据。这种方法不同于传统的集中式 ML 技术,后者要求将所有数据集上传到单个服务器。联邦学习的主要优势在于它能够在不同参与方之间构建 ML 模型而无需共享数据。联邦学习通过在本地数据样本上训练本地模型,并在服务器或边缘设备之间交换参数来生成全局模型,然后由所有服务器或边缘设备共享。假设使用了安全聚合过程,联邦学习有助于解决基本的数据隐私和数据安全问题。在其他开源资源中,我们应该了解一下PySyft或FATE,以便开始学习如何在我们的组织(或与合作伙伴组织)实施联邦学习。
差分隐私
差分隐私是一种通过描述数据集中组的模式来共享数据集信息的系统,而不透露具体个体的信息。在 ML 工具中,通常使用特殊类型的差分隐私学习算法来实现这一点。这使得从训练数据或训练后的 ML 模型中提取敏感信息变得更加困难,例如模型提取、模型反演或成员推断攻击。实际上,如果外部观察者无法判断个体信息是否被用于训练模型,则称 ML 模型具有差分隐私性质。有许多高质量的开源存储库可供查阅和尝试,包括以下内容:
-
IBM 的diffprivlib
-
TensorFlow 的隐私
许多调用差分隐私的 ML 方法基于差分私有随机梯度下降(DP-SGD)。DP-SGD 在每个训练迭代中向由 SGD 确定的梯度注入结构化噪声。总体而言,DP-SGD 及其相关技术确保 ML 模型不会对训练数据的具体信息进行过多记忆。因为它们防止 ML 算法集中于特定个体,它们也可能导致增加的泛化性能和公平性好处。
读者们可能在 PET 主题下听说过保密计算或同态加密。这些也是有前途的研究和技术方向。另一个值得关注的 ML 研究子领域是鲁棒 ML,它可以帮助我们对抗对抗性示例攻击、数据毒化以及其他对 ML 系统的对抗性操纵。
鲁棒机器学习
鲁棒 ML 包括许多先进的 ML 算法,用于对抗对抗性示例攻击,以及在一定程度上对抗数据毒化。在几位研究人员展示出输入数据的微小甚至不可见的变化可能导致计算机视觉系统输出预测的巨大波动之后,对鲁棒 ML 的研究获得了动力。这种模型结果的波动在任何领域都是一个令人不安的迹象,但在考虑医学成像或半自主车辆时,它们简直是危险的。鲁棒 ML 模型有助于保持模型结果的稳定性,并且重要的是公平性——即类似的个体应被类似地对待。在 ML 训练数据或实时数据中,类似的个体是在数据的欧几里得空间中彼此接近的个体。鲁棒 ML 技术经常尝试在个体数据示例周围建立一个超球体,并确保超球体内的其他相似数据获得类似的预测。无论是由于恶意行为者、过度拟合、规范不足还是其他因素,鲁棒 ML 方法帮助我们的组织保护免受意外预测带来的风险。有趣的论文和代码托管在鲁棒 ML 网站,马萨诸塞理工学院的 Madry 实验室甚至发布了一个完整的Python 鲁棒 ML 包。
一般对策
有许多综合性对策可以防御多种类型的 ML 攻击,包括认证、限流和水印。许多这类对策也是 ML 系统的一般最佳实践,例如可解释的模型、模型管理和模型监控。在本章案例研究之前,我们将讨论一个重要且通用的反对 ML 系统攻击的简要描述主题:
认证
在可能的情况下,对于高风险的机器学习系统,应禁止匿名使用。登录凭据、多因素认证或其他需要用户证明其身份、授权和使用权限的认证方式,可以在我们的模型 API 与匿名的恶意行为者之间设置屏障。
可解释、公平或隐私模型
现在存在多种建模技术,例如单调 GBM(M-GBM)、可扩展贝叶斯规则列表(SBRL)、可解释神经网络(XNN),这些技术能在机器学习模型中实现精度和可解释性的兼顾。这些准确且可解释的模型比经典的不可解释模型更易于文档化和调试。新型的公平和隐私建模技术,例如LFR、DP-SGD,还可以被训练用于减弱外观可见的人口特征,这些特征可能被观察到、社会工程化为对抗性示例攻击或被冒用。这些增强了可解释性、公平性或隐私性的模型应该比过度使用的不可解释模型更容易调试,更能应对个体特征变化的挑战,并且更安全。
模型文档
模型文档是一种减少风险的策略,在银行业已经使用了几十年。它允许关于复杂建模系统的知识在模型所有者团队变更时得以保留和传递,并且使知识能够标准化,以便模型验证者和审计人员进行高效分析。模型文档应覆盖 ML 系统的“谁、何时、何地、什么以及如何”,包括从利益相关者的联系信息到算法规范的许多细节。模型文档还是记录 ML 系统已知漏洞或安全问题的自然位置,使未来的维护人员或与系统交互的其他操作者能够有效分配监督和安全资源。事故响应计划也应与模型文档相关联。(第二章 包含一个样本文档模板。)
模型管理
模型管理通常指一组过程控制,如文档化,与技术控制,如模型监控和模型清单的结合。组织应准确计算部署的 ML 系统数量,并结构化地列出相关的代码、数据、文档和事故响应计划,并监控所有部署的模型。这些实践使得当出现问题时更容易理解发生了什么,并能够迅速处理问题。(第一章 更详细地讨论了 ML 模型风险管理。)
节流
当模型监控系统识别出高频使用或其他异常情况,如对抗性示例,重复、随机或训练数据时,请考虑限制预测 API 或其他系统端点的流量。限流可以指限制单个用户的大量快速预测,人为增加所有用户的预测延迟,或其他能够减缓攻击者进行模型或数据提取攻击和对抗性示例攻击的方法。
水印技术
水印技术指的是向数据或预测中添加微小标记,以防止数据或模型被盗。如果数据或预测带有可识别的特征,例如图像上的实际水印或结构化数据中的哨兵标记,一旦发生盗窃,这些特征可以使被盗资产更难以使用,并且更容易被执法部门或其他调查人员识别。
应用这些通用防御和最佳实践,以及前面讨论过的一些具体对策,是实现 ML 系统高安全性的一个好方法。现在我们已经介绍了安全基础知识、ML 攻击以及许多对应的对策,读者们已经掌握了开始进行红队测试组织 AI 所需的知识——尤其是如果能与组织的 IT 安全专业人员合作。接下来,我们将研究一些真实世界的 AI 安全事件,以提供额外动力来进行 AI 红队测试的艰苦工作,并深入了解当今最常见的 ML 安全问题。
案例研究:真实世界的规避攻击
近年来,既用于物理安全又用于在线安全的 ML 系统遭受了规避攻击。本案例讨论了用于规避 Facebook 过滤器以及传播虚假信息和恐怖主义宣传的规避攻击,以及针对真实世界支付和物理安全系统的规避攻击。
规避攻击
随着 COVID 大流行的持续和 2020 年美国总统竞选的高潮,那些与这两个主题相关的虚假信息滋生并利用了 Facebook 手动和自动内容过滤的弱点。根据 NPR 报道,“微小的改变使关于 COVID-19 和选举的虚假声明逃避了 Facebook 的事实检查”。尽管 Facebook 使用路透社和美联社等新闻机构来对其数十亿用户所作声明进行事实检查,但它也使用基于 AI 的内容过滤器,特别是用于捕捉被人类识别的误导性帖子的副本。不幸的是,一些小改动,如不同的背景或字体,图像裁剪,或者仅仅是用文字描述表情包而不是图片,让恶意行为者能够绕过 Facebook 基于 ML 的内容过滤器。为了自卫,Facebook 对许多违规者进行了执行行动,包括限制帖子的传播、不推荐帖子或群组以及取消广告收益。然而,根据一家倡导组织的说法,Facebook 未能捕捉到大约42%的被人类事实检查员标记的虚假信息帖子。同一倡导组织 Avaaz 估计,仅 738 个未标记的虚假信息帖子样本导致了大约 1.42 亿次浏览和 560 万次用户互动。
最近的事件表明,网络虚假信息和安全威胁可能会波及现实世界。有关 2020 年美国大选和 COVID 大流行的虚假信息被认为是引发 2021 年 1 月 6 日令人震惊的美国国会骚乱的主要驱动力。在更为令人不安的逃避攻击中,BBC 报道称ISIS 成员继续逃避 Facebook 内容过滤器。通过模糊标志、将他们的视频与主流新闻内容拼接,或者仅仅使用奇怪的标点符号,ISIS 成员或附属机构能够发布宣传、制造爆炸物的教程,甚至逃避攻击的教程到 Facebook 上,为他们的暴力、令人不安和恶毒内容赢得数以万计的观看。虽然针对基于 AI 的过滤器的逃避攻击显然是主要罪魁祸首,但 Facebook 上阿拉伯语内容的人类审核员较少。无论是人类还是机器在工作中失败,这类内容都可能真正危险,既促进激进化,又导致现实世界的暴力。物理逃避攻击也是不久的将来的一个担忧。研究人员最近表明,一些基于 AI 的物理安全系统易受逃避攻击的攻击目标,特别是使用逼真的三维面具绕过支付宝和微信支付系统的面部识别安全检查。在一个严重的案例中,研究人员甚至能够在阿姆斯特丹斯希普霍尔机场使用另一个人的图片在 iPhone 屏幕上登机。
学到的教训
将在线保护措施逃避的不良行为者与逃避物理安全系统以进行货币支付和飞行联系起来,描绘了一个世界的可怕画面,即机器学习安全问题未被认真对待的世界。从本章中学到的教训如何应用以防止这些逃避攻击?第一课程与强大的机器学习相关。用于高风险安全应用的机器学习系统,无论是在线还是现实世界,都不能被对正常系统输入的微小更改所欺骗。强大的机器学习及相关技术必须进步到这样一个程度,即简单的逃避技术,如模糊化标志或更改标点符号,不再是有效的逃避手段。另一个教训来自本章开头:对抗性思维。任何认真思考过这些基于 AI 安全系统安全风险的人都应该意识到,面具或其他图像是一种明显的逃避技术。值得庆幸的是,一些组织确实对对抗场景采取了应对措施。更好的面部识别安全系统采用旨在确保所识别对象活跃性的技术。更好的面部识别系统还采用歧视性测试,以确保所有用户的可用性尽可能高,错误率尽可能低。
从现实世界的逃避攻击中可以学到的另一个重要课程与技术的负责使用有关,尤其是机器学习。社交媒体已经蔓延到超越物理边界,其复杂性已经超过了许多国家目前有效监管的能力。在缺乏政府监管的情况下,用户寄望于社交媒体公司自我监管。作为技术公司,社交网络通常依赖更多技术,如基于 AI 的内容过滤器,来保持对其系统的控制。但如果这些控制实际上并不起作用呢?随着技术和机器学习在人类生活中扮演更大角色,设计、实施和部署中缺乏严谨和责任将会带来日益严重的后果。那些为安全或其他高风险应用设计技术的人有着特别严肃的责任,要对今天的机器学习能力保持现实,并应用过程和技术控制来确保足够的现实世界性能。
资源
进一步阅读
第二部分:将 AI 风险管理付诸实施
第六章:可解释提升机和解释 XGBoost
本章探讨了可解释模型和事后解释,涉及与消费金融相关的互动示例。它还应用了第二章讨论的方法,使用可解释提升机(EBMs)、单调约束 XGBoost 模型和事后解释技术。我们将从可加性、约束、偏依赖和个体条件期望(ICE)、Shapley 可加解释(SHAP)和模型文档开始进行概念复习。
然后,我们将通过从惩罚回归到广义可加模型(GAM)再到 EBM 的方式来探讨一个信用承保问题示例。在从简单到复杂的模型中工作时,我们将记录关于将非线性和交互引入示例违约概率分类器的明确和慎重的权衡,同时保持几乎完全可解释性。
注意
回顾自第二章,解释是指对刺激进行上下文化和利用人类背景知识的高层次有意义的心理表征,而说明则是试图描述复杂过程的低层次详细心理表征。解释远比说明要高得多,很少通过单纯技术手段实现。
之后,我们将考虑第二种预测违约的方法,允许复杂的特征交互,但通过基于因果知识的单调约束控制复杂性。由于单调约束梯度增强机(GBM)本身无法解释,我们将与强大的事后解释技术配对,以极大增强可解释性。最后,本章将讨论流行的 Shapley 值方法的优缺点。
概念复习:机器学习透明度
在深入技术示例之前,让我们回顾一下第二章中的一些关键概念。因为我们的第一个例子将突显 GAM 系列模型的优势,所以下一步我们将特别讨论可加性,特别是与允许高阶交互的模型进行比较。我们的第二个例子将使用单调约束来实现与 XGBoost 的非正式因果关系方法,因此我们将简要介绍因果与约束之间的联系。我们还将使用偏依赖和 ICE 来比较和评估我们不同方法对输入特征处理的方式,因此我们需要快速复习这些事后解释器的优缺点,并再次强调模型文档的重要性——因为模型文档非常重要。
可加性与交互作用
无法解释的机器学习的一个主要特征是其倾向于在输入特征之间创建极高程度的相互作用。人们认为,这种能力同时考虑许多特征值的组合,增加了 ML 模型相对于更传统的线性或加法模型的预测能力,后者倾向于独立考虑输入特征。但已经显示,无法解释的模型在类似信用核准数据的结构化数据上并不更准确,并且这些模型中的所有相互作用对人类来说非常难以理解。此外,高度相互作用还导致不稳定性,因为一两个特征的微小变化可以与其他特征相互作用,从而显著改变模型结果。高度相互作用还导致过拟合,因为今天相关的 17 路相互作用可能明天就不再相关了。
ML 的另一个重要特征是能够自动学习训练数据中的非线性现象。事实证明,如果我们能够将非线性与相互作用分离开来,我们可以实现显著的预测质量提升,同时保持相当多的可解释性,即使不是完全的可解释性。这是 GAM 的魔力所在。而 EBM 则是下一步,允许我们以加法的方式引入适度数量的二路相互作用,可能会导致更好的性能。本章后面,GAM 系列示例(见“可解释模型的 GAM 系列”)旨在提供这些权衡的教训,从基线开始的简单、加法线性模型,然后通过 GAM 引入非线性,最后通过 EBM 引入可理解的二路相互作用。当我们谨慎引入非线性和相互作用,而不是认为更复杂总是更好时,它使我们能够证明我们的建模方法,将其捆绑到现实世界的性能关注点,并生成许多有趣的特征行为图。这些理由和图也是后续模型文档的重要材料,不久将更详细地讨论。
注意
多年来,在统计文献中讨论的模型系列通常包括 GLM 的变体、GAM、GA2M、EBM 和加法指数模型(AIMs)。这种建模类型有时被称为方差的功能分析(fANOVA)框架。
采取有约束的因果步骤
因果发现和推断是预测建模未来重要的方向。为什么呢?因为当我们基于机器学习中的相关性构建模型时,我们常常是在搭建在流沙之上。现实世界中的相关性不断变化,可能是虚假的或错误的。如果我们能够基于因果关系而不仅仅是在复杂相关性的某个快照上建模,我们可以大大减少过拟合、数据漂移和社会偏见的风险。目前来看,因果方法对大多数组织来说实施起来可能有些困难,因此我们的单调约束示例(见“约束与非约束的 XGBoost”)突出了我们可以采取的一个简单而易行的步骤,将因果性注入到机器学习模型中。例如,如果我们知道迟付款的增加是未来违约的一个指标,我们可以使用单调约束来要求 XGBoost 分类器对更多的迟付款生成更高的违约概率。虽然我们可能在虚拟测试数据的性能中看不到约束的增益,但约束确实可以减少现实世界中的不稳定性、过拟合和社会偏见风险,而且很可能提高实际应用的性能。
偏依赖和个体条件期望
偏依赖是一种成熟且高度直观的事后解释方法,描述模型在某些输入特征的值范围内的估计平均行为。不幸的是,它是有缺陷的。在输入特征之间存在相关性或相互作用时,它无法准确表示模型的行为,甚至可能被恶意篡改。但由于理解模型中特征的平均行为如此重要,因此已开发了许多技术来解决偏依赖的缺陷。特别是,累积局部效应是偏依赖的直接替代品,专门设计用于解决其缺点。读者可以使用像ALEPlot或ALEPython这样的软件包尝试 ALE。
在接下来的示例中,我们将大量使用另一个偏依赖导数来深入理解模型中特征行为的表现。 首次引入于“窥视黑匣子:用个体条件期望的图形可视化统计学习”,ICE 图将模型对单个个体的局部行为与偏依赖相配对。 这使我们能够比较估计的平均行为与局部行为的描述,当偏依赖和 ICE 曲线分歧时,我们可以自行决定偏依赖看起来是否可信,或者它是否受到输入变量之间的相关性或交互影响。 当然,ICE 也不是没有问题的。 ICE 的最常见问题是考虑到了不现实的数据值,当解释 ICE 时,重要的是将最大的精神压力放在与正在考虑的原始数据行中最相似的输入特征值上。
让我们通过一个例子来解释所有这些。 在图 6-1 的底部面板中,我们可以看到一个经过惩罚的逻辑回归模型和输入特征PAY_0(客户最近账单的还款状态)的偏依赖和 ICE。 PAY_0的较高值表示还款的延迟较大。 ICE 曲线是为预测概率分位数处的个体生成的。
注意在客户最近一次支付没有迟到时,默认概率从较低的值平稳增加到客户迟到时的高概率。 在此情境中这是合理的期望,并与领域知识一致。 还请注意,ICE 和偏依赖并不发散——它们高度一致。 这在线性模型中始终如此,但这也表明偏依赖对于这个模型和数据集可能是可信的。
那么,在本图的顶部面板中发生了什么? 这是我们试图确定模型是否从训练数据中学习到了稳健的信号。 你可能注意到的第一件事是一个直方图。 我们使用该直方图来寻找模型预测中的稳定性问题。 机器学习模型通常只能从数据中学习,因此如果在我们的训练数据中存在PAY_0 > 1的情况下数据量不足,机器学习模型就无法学到太多,它们在这些数据域中的预测将是不稳定的,甚至是荒谬的。 一些其他软件包使用误差条来绘制偏依赖或形状函数图的相同目的。 这也是可以接受的。 这两种可视化技术都试图将您的注意力引向模型预测不稳定且可能做出愚蠢决策的数据区域。

图 6-1. 本章后期训练的包含 ICE、直方图和条件均值的偏依赖绘图,以增加其可信度和效果(数字,彩色版本)
这就是我们尝试确定模型是否很好地代表我们的训练数据,并且顶部面板也可以提示我们数据稀疏性和预测可靠性的问题。在顶部面板中,我们首先注意到的是一个直方图。我们使用该直方图来查找模型预测中的可靠性问题。读者将看到直方图上还叠加了一条线。该线是相应直方图箱的目标条件均值。如果模型正确地从数据中学习,底部面板中的部分依赖和 ICE 应该大致反映顶部面板中的条件均值线。当评估模型行为是否与目标的条件均值一致时,数据稀疏性也是一个重要的注意事项。在图 6-1 中,我们看到在PAY_0 = 6时,最近账单逾期六个月的条件均值急剧下降。然而,没有数据支持这种下降。直方图箱基本上是空的,这种下降可能只是无关紧要的噪声。幸运的是,我们表现良好的逻辑回归模型别无选择,只能忽略这种噪声,将违约概率单调地随着PAY_0的增加而推高。对于相同数据的更复杂模型,我们需要应用单调约束,以确保模型遵循因果关系而不是记忆无数据支持的无关噪声。
引用重要的可解释性研究者普热日姆沃夫·比切克的话:“不要脱离上下文来解释!”这意味着我们需要考虑我们用来生成部分依赖和 ICE 的数据集的相关性、交互作用和安全性 —— 通常是验证、测试或其他有趣的留存样本。如果这些数据集与训练数据中的相关性和交互作用不一致,或者样本可能被故意改变,那么我们得到的结果就会与训练中看到的不同。这可能会引发一系列问题。训练时的部分依赖是正确的吗?我们的模型在新数据上实际上表现不同吗,还是这个样本中的新相关性和交互作用使部分依赖的可信度降低?
这些都是我们将部分依赖与 ICE 结合的原因。作为一种局部解释技术,ICE 对于全局相关性和交互作用的变化不太敏感。如果部分依赖看起来有些不对劲,首先检查一下部分依赖是否遵循 ICE 曲线的局部行为,或者是否与 ICE 曲线有所不同。如果有不同,从 ICE 中获取解释信息可能更为安全,如果可能的话,还要调查分布、相关性、交互或安全问题是否改变了部分依赖。
夏普利值
SHAP 是一种生成本地特征归因值的方法,具有相当多的理论支持(至少按照机器学习的标准来看)。一个 SHAP 值告诉我们,某行的某个特征值如何将模型预测从平均预测中移开。但是,SHAP 是如何做到的呢?它通过反复“移除”该行预测中的特征,并与其他移除的特征协同作用来实现。通过移除特征并测量模型预测的差异,我们开始得到每个特征如何影响每个预测的清晰图像。
注意
请回忆第二章,Shapley 值是一种事后解释技术,借鉴于经济学和博弈论,将模型预测分解为每个输入特征的贡献。
由于 SHAP 可以使用背景数据集,或者从中抽取随机样本作为替代移除特征的数据集,我们必须考虑上下文 ,无论是在要解释的数据集还是背景数据集中。由于部分依赖和 ICE 的定义,我们通常对这些技术使用非常简单的背景数据集,甚至可能根本不将它们视为背景数据集。我们基本上只是用整个特征的某个已知值(部分依赖)或一行的某个已知值(ICE)替换值,以生成曲线。关于 Shapley 值,我们可以选择(1)解释哪些观测(从单行到完全新的数据样本)和(2)生成 Shapley 值时使用哪个背景数据集(从不使用背景集,到使用随机数据,到使用高度修饰的背景数据,旨在解决上下文或因果关系问题)。
除了考虑我们正在解释的数据集的相关性、交互作用和安全性之外,我们还必须询问我们选择的背景是否合适,解释是否在其将被评判的环境中有意义。我们将在本章后面详细介绍如何为我们的 Shapley 值解释选择合适的背景数据集,这取决于我们的解释试图回答的问题。实际上,这种复杂的分析通常归结为在几个不同的数据集上计算解释,并确保结果显著和稳定。计算基于 Shapley 的解释还意味着记录所使用的背景数据集及选择该数据集的原因。
模型文档
模型文档是大型组织中责任追溯的实体表现。当我们必须撰写关于我们构建的模型的文档时,知道我们的名字将与同一份文档相关联,我们希望这能促使更多慎重的设计和实施选择。如果我们没有做出明智的选择或者记录了不良选择,或者文档显然缺失或不诚实,我们的模型构建可能会受到影响。模型文档对于维护和事件响应也非常重要。当我们转向下一个重要的数据科学工作时,我们的旧模型开始变得陈旧并引发问题时,文档能让新一代从业者理解模型的预期工作方式,如何在将来迭代中维护它,以及如何修复它。
现在有几个模型文档的标准,包括以下内容:
-
模型风险管理深入文档;请参阅来自美国国家银行监察官办公室的2021 模型风险管理指南
-
欧盟人工智能法案的文档模板;请参见文档 2,附录 IV
请注意,所有这些模板都来自于领先的商业用户和机器学习开发者,或者非常严肃的政府机构。如果读者直到现在都避免模型文档,预计随着法规的颁布而会改变,特别是对于机器学习的重要应用。所有这些模板还极大地受益于可解释模型和事后解释,因为增加的透明度是模型文档的另一个目标和好处。机器学习模型的透明度使我们能够理解,并且能够证明设计和实施的权衡。如果我们在可解释模型或事后解释的结果中看到的结果似乎合理,并且我们可以写几句常识性的句子来证明观察到的结果,那就是我们在本章中追求的。如果相反,我们使用的是不可解释的模型,并且不理解设计和实施权衡如何影响模型行为,我们的文档化理由可能会弱化,从而使我们和我们的模型面临潜在的不愉快的外部审查。
可解释模型的 GAM 家族
在本节中,我们将形成一个基准线性累加惩罚回归模型,然后将该基准与允许复杂非线性但以独立、累加和高度可解释方式进行的 GAM 进行比较。然后我们将 GLM 和 GAM 与具有少量二路交互的 EBM 进行比较。因为我们所有的模型都是以累加独立的函数形式构建的,并且因为我们将只使用少量有意义的交互作用,所以我们所有的模型都将是非常可解释的。累加性将使我们能够对引入非线性和交互作用做出清晰和有理的选择。
注意
从 GLM 到 GAM 再到 EBM 是一个通用的工作流程,允许我们对引入非线性(通过 GAM)和交互作用(通过 EBM)到我们的模型中做出可解释、经验和有意识的决策,同时将结果与基线(GLM)进行比较。
弹性网-惩罚 GLM 与 Alpha 和 Lambda 搜索
如其名所示,广义线性模型(GLMs)扩展了普通线性回归的思想,并且泛化到属于指数族的误差分布,除了标准线性回归中使用的高斯分布误差之外。GLM 的另一个重要组成部分是连接响应期望值与线性分量的链接函数。由于此链接函数可以是任何单调可微的函数,GLMs 可以处理各种训练数据结果值的分布:线性的、二项式的(就像我们当前的例子中),泊松分布,以及其他几种。对 GLM 进行惩罚是指使用复杂的约束和迭代优化方法来处理相关性、特征选择和异常值。所有这些综合起来形成了一种具有良好预测能力和非常高可解释性的稳健建模技术。
弹性网是一种流行的正则化技术,将L1(LASSO)和L2(岭)回归的优点结合到一个模型中。L1 正则化实现了特征选择,从而引入稀疏性并提高了训练模型的可解释性,而 L2 正则化有效地处理了预测变量之间的相关性。通常将迭代重新加权最小二乘法(IRLS)方法与弹性网结合起来,以处理异常值。
训练惩罚 GLM 将有两个有用的基准作用:
-
由于我们的 GLM 不包含任何非线性或特征交互,它可以作为一个完美的基准来测试某些假设,即非线性和交互是否实际上会导致更好的模型,我们将在接下来的章节中讨论这些内容。
-
GLM 也作为根据 L1 正则化选择的特征的初始特征选择的起点。
我们将通过使用H2O 的 GLM 算法来训练一个弹性网络惩罚逻辑回归的第一个示例,该算法可以在分布式环境中工作,并且对大型数据集具有良好的扩展性。 在 H2O GLM 中,正则化参数用alpha和lambda表示。 虽然alpha指定了 L1 和 L2 惩罚之间的正则化分布,lambda表示正则化强度。 在 H2O GLM 中查找最佳正则化设置的推荐方法是通过网格搜索。 H2O 提供两种类型的网格搜索——笛卡尔和随机搜索。 笛卡尔搜索是一种穷举搜索,尝试用户提供的可能值网格中指定的所有模型超参数组合。 另一方面,随机网格搜索会从给定可能值集中随机抽样模型参数集合,基于停止条件。 默认情况下,H2O 将使用笛卡尔搜索,我们将在我们的用例中使用它,因为在少量alpha值上搜索不会花费太长时间。
警告
每当进行网格搜索时,我们都会暗含地引发与过拟合和多重比较相关的问题。 如果可能的话,尝试使用自举法或可重用的留置方法进行网格搜索。
在下面的代码中,我们首先定义了一个alpha值的模型超参数网格。 这里需要注意的是,为了保持 L2 惩罚的稳定功能和 L1 惩罚的特征选择功能,alpha永远不应该是 0 或 1。 这是因为当alpha为 0 时,表示仅使用 L2 惩罚,而当alpha为 1 时,表示仅使用 L1。 H2O GLM 的实现带有一个方便的lambda_search选项。 当设置为True时,该选项会从lambda_max(模型中没有特征)到lambda_min(模型中有许多特征)搜索各种lambda值。 alpha和lambda都是通过基于验证的早停法来选择的。 这意味着当在验证集上没有显著的改善时,GLM 将自动停止拟合模型,以限制过拟合。
def glm_grid(x, y, training_frame, validation_frame, seed_, weight=None):
# setting GLM grid parameters
alpha_opts = [0.01, 0.25, 0.5, 0.99] # always keep some alpha
hyper_parameters = {'alpha': alpha_opts}
# initialize grid search
glm_grid = H2OGridSearch(
H2OGeneralizedLinearEstimator(family="binomial",
lambda_search=True,
seed=seed_),
hyper_params=hyper_parameters)
# training with grid search
glm_grid.train(y=y,
x=x,
training_frame=training_frame,
validation_frame=validation_frame,
weights_column=weight,
seed=seed_)
# select best model from grid search
best_model = glm_grid.get_grid()[0]
del glm_grid
return best_model
使用此函数在alpha上运行笛卡尔搜索,让 H2O 搜索最佳lambda值,我们最好的 GLM 在验证数据集上获得 0.73 的 AUC 分数。 网格搜索后,被选中模型中的六个PAY_*还款状态特征具有最大的系数。
注意
AUC 分数为 0.73 表示我们的模型正确排名随机抽取的正样本行的概率比随机抽取的负样本行的输出概率高的概率为 73%。
要了解模型如何处理各种特征,我们将部分依赖图与 ICE 图结合起来,以研究感兴趣的特征。此外,还显示了感兴趣特征的直方图,包括目标列的均值值覆盖,即DELINQ_NEXT。这应该能很好地告诉我们模型的行为是否合理,以及是否存在任何数据稀疏问题可能导致预测无意义。
让我们重新审视图 6-1。PAY_0特征具有最陡的部分依赖和 ICE 曲线,因此表明它是最重要的输入特征。部分依赖和 ICE 图是协调的,即它们不会发散,这意味着可以依赖部分依赖。此外,预测的违约概率与PAY_0付款延迟之间存在单调增加的关系。这意味着随着付款延迟的增加,客户违约的概率也会变大。这符合我们对信用卡付款运作方式的直觉。
现在让我们来看一下顶部的直方图。对于有逾期付款的客户,存在一些明显的数据稀疏问题。例如,在PAY_0 > 1的地区,几乎没有或没有训练数据。此外,在这个区域内,均值DELINQ_NEXT值展示了一些非线性模式。显然,在这些区域进行的预测将不太可信。毕竟,像这样的标准 ML 模型只能从数据中学习,除非我们提供额外的领域知识。然而,好消息是我们的惩罚 GLM 的逻辑形式不仅可以防止它被PAY_* = 6周围的条件均值低置信度干扰,而且可以防止过度拟合这些稀疏训练数据区域中的噪声。模型类似地处理其他PAY_*特征,但分配给它们更平坦的逻辑曲线。在所有情况下,违约的概率都随着付款延迟的增加而单调增加,符合预期。要查看其他部分依赖和 ICE 图,请查看本章的代码资源。
现在我们有了一个强大且可解释的基线模型。由于其行为非常合乎逻辑且易于解释,可能很难超越。验证的 AUC 值为 0.73 并不引人注目,但是在部署后,行为符合经过时间测试的因果关系的可解释模型是无价的风险缓解工具。我们还必须记住,在更复杂的 ML 模型中,验证和测试数据评估分数可能会误导我们。我们可以在静态验证或测试数据中获得高 AUC,但后来发现高 AUC 是由于过拟合某些特定现象,而这些现象在我们的操作领域中已不复存在。在下一节中,我们将首先通过 GAM 引入一些非线性,然后通过特征交互和 EBMs 引入非线性。然后,我们将评估我们的模型以获得可解释性和性能质量,关注实际性能。我们将尝试进行诚实的实验,并慎重选择是否有必要增加更多复杂性。
广义可加模型
尽管线性模型具有高度的可解释性,但它们无法准确捕捉通常存在于现实世界数据集中的非线性关系。这就是 GAM 的作用所在。GAM 最初由斯坦福的杰出统计学家 Trevor Hastie 和 Rob Tibshirani 在上世纪 80 年代末开发,通过个体样条形状函数模型化每个输入特征的非线性关系,并将它们全部加在一起形成最终模型。GAM 可以被看作是样条形状函数的加法组合。对于 GAM 的一个重要思想是,尽管我们以非常复杂的方式处理每个特征,但是这是以一种加法和独立的方式进行的。这不仅保留了可解释性,还使得相对容易进行编辑和调试。
当涉及到实现 GAM 时,像 gam 和 mgcv 这样的包是 R 中的一些很好的选择。至于 Python,选择有限,因为大多数包都处于实验阶段,比如 H2O 的 GAM 实现。另一个选择是 pyGAM,它从 R 的 mgcv 包中汲取灵感;已被证明在准确性、稳健性和速度方面提供了良好的结合;并且具有类似 scikit 的 API。
我们将使用 pyGAM 在与上一节相同的信用卡数据集上训练 GAM。具体来说,通过以下代码,我们将使用 pyGAM 的 LogisticGAM 类实现一个逻辑回归模型。有三个重要的参数可以调节以获得最佳模型:样条的数量;lam,或正则化惩罚的强度;以及注入模型先验知识的约束。pyGAM 提供了内置的网格搜索方法,可以自动搜索平滑参数。
from pygam import LogisticGAM
gam = LogisticGAM(max_iter=100, n_splines=30)
gam.gridsearch(train[features].values, train[target], lam=np.logspace(-3, 3, 15))
这段代码实例化了一个LogisticGAM模型,最多将训练 100 次迭代。n_splines参数指定了样条项的数量,或者用于拟合每个输入特征的函数的复杂度。更多的样条项通常会导致更复杂的样条形状函数。lam在某种程度上对应于惩罚回归中的lambda,前面的代码搜索了几个值,以找到最佳的正则化强度,即由lam定义的。我们没有利用的一个参数是constraints。constraints允许用户指定一个编码先验知识的约束列表。可用的约束条件包括单调递增或递减平滑以及凸或凹平滑。我们将在本章后面使用类似的约束条件;对于我们的 GAM 来说,看看不使用约束条件意味着什么是非常有教育意义的。
在这个示例中,我们有意要回答的一个问题是:非线性真的有助于我们的模型,还是只是过拟合的噪音?今天许多数据科学实践者认为更复杂的模型会导致更好的模型,但我们将使用广义加性模型(GAMs)来进行实验,以决定引入非线性是否实际上能够从性能质量和可解释性的角度改善我们的模型。
在训练完模型后,我们计算了其验证 AUC,结果为 0.75——与我们的惩罚 GLM 相比略有提高。GAM 的 AUC 增加很可能归因于引入了非线性,而我们的 GLM 未能捕捉到这一点。然而,重要的是要注意这里高 AUC 并不总是保证更好的模型,这个例子是一个经典案例来证明这一点。在前面的章节中,我们花了一点时间分析 GLM 如何处理PAY_0特征,即客户的最近偿还状态,它做得相当不错。现在让我们来看看 GAM 如何处理同样的PAY_0特征(图 6-2)。

图 6-2。在示例 GAM 中,这是一个部分依赖图,结合了 ICE、直方图和条件均值,以增加PAY_0的可信度和有效性(数字,彩色版本)
图 6-2 显示出通过 GAM 生成的部分依赖和 ICE 图表存在明显的一些异常。我们观察到随着支付延迟的增加,客户违约的可能性减少。这显然是不正确的。大多数人在几个月拖欠账单后并不会神奇地变得更愿意支付账单。同样的奇怪行为也可以在图 6-3 中观察到,对于PAY_4和PAY_6同样存在。PAY_4违约概率似乎随着支付延迟的增加而减少,而PAY_6则表现出在均值预测周围嘈杂地反弹。这两种建模行为都是违反直线模型(GLM)基线模型的直觉,也都未能对图 6-3 右侧显示的条件均值行为进行建模。

图 6-3. 包含 ICE、直方图和PAY_4以及PAY_6条件均值的部分依赖图表(数字,彩色版本)
底线是,尽管我们的验证 AUC 更高,但这绝对不是我们想要部署的模型。正如从图 6-2 显而易见的,GAM 可能在训练数据中过度拟合噪音,被低置信度的DELINQ_NEXT条件均值在PAY_* = 6周围的低谷所欺骗,或者由于PAY_0 > 1的数据稀疏性而恢复到均值预测。
那么,有什么解决方法,我们如何使用这样的模型呢?这正是 GAMs 发挥作用的地方。在这种情况下,GAM 展示的行为是高容量非线性模型普遍存在的问题。然而,与许多其他类型的 ML 模型不同的是,GAMs 不仅突出显示这些不一致之处,而且通过常识性的模型编辑提供了调试的方法。更明确地说,我们可以与领域专家讨论 GAM 的结果,如果他们同意PAY_2、PAY_3和PAY_5更合理的 GAM 样条,我们可以将其保留在模型中,也许能提升模型的性能。至于显然存在问题的PAY_0、PAY_4和PAY_6的样条,可以用更合理的东西来替换。一个选择是它们从逻辑回归模型中学习的行为,如下表达式所示:
其中 β[0] 是截距项,每个 g 代表一个 GAM 样条函数。模型编辑具有无限的灵活性;我们可以仅在其定义域的某个区域替换学习的样条,或者根据领域专家的喜好编辑形状函数。
可编辑性是预测模型的一个重要特性,但我们也需要小心使用它。如果按照前述方程建议编辑自定义模型,它确实需要比通常更多地进行压力测试。不要忘记,系数并非一起学习,可能无法很好地相互解释。还可能存在边界问题——编辑后的模型很容易导致预测值超过 1 或低于 0。另一种更可接受的调试策略是利用 pyGAM 提供的约束功能。正单调约束很可能能够修复PAY_0、PAY_4和PAY_6样条中的问题。
无论是选择编辑示例 GAM 还是在约束条件下重新训练它,我们很可能会看到较低的验证和测试数据性能质量。然而,当我们最关心可靠的现实世界性能时,有时不得不放弃对保留数据集性能的崇拜。虽然模型编辑听起来可能很奇怪,但前述模型是有道理的。对我们来说更奇怪的是,部署的模型行为仅由少数高噪声训练数据行来合理化,明显违反数十年的因果规范。我们认为前述模型不太可能导致灾难性失败,而不受约束的 GAM 学习的荒谬样条则可能会。
在选择最佳现实世界模型时,传统模型评估往往会产生误导性,这只是其中一个场景。正如 GAM 示例所示,我们不能假设非线性能够使模型更好。此外,GAM 允许我们测试隐含的假设,即非线性更优。利用 GAM,我们可以创建模型,解释和分析结果,然后编辑或调试任何检测到的问题。GAM 帮助我们揭示模型学到了什么,保持正确结果,并编辑和纠正错误结果,从而避免部署风险模型。
GA2M 与可解释增强机器(Explainable Boosting Machines)
当将一小组相互作用的特征对添加到标准 GAM 中时,生成的模型称为 GA2M——带有双向交互作用的广义加性模型。如同讨论中所述,在传统 GAM 中添加这些成对交互作用已被证明显著提高了模型性能,同时保持了可解释性。此外,与 GAM 一样,GA2M 也易于编辑。
EBM是微软研究通过 GA2M 算法快速实现的。EBM 中的形状函数通过 Boosting 算法进行迭代训练,使 EBM 训练更加健壮,同时保持了与难以解释的基于树的模型(如随机森林和 XGBoost)相媲美的准确性。EBM 作为更广泛的 ML 工具包 InterpretML 的一部分提供,后者是一个用于训练可解释模型和解释其他系统的开源软件包。
我们将继续使用我们的信用卡示例,并训练一个 EBM 来预测哪些客户在下次付款中有高违约概率。EBM 实现了验证 AUC 为 0.78,与传统的 GAM 和 GLM 相比是最高的。准确性的提升可能是由于引入了非线性 和 交互作用。解释 EBM 和 GA2Ms 也很容易。与传统的 GAM 一样,我们可以绘制单个特征的形状函数及其伴随的直方图,描述该特征的模型行为和数据分布。交互项可以呈现为等高线图——依然容易理解。让我们更深入地看一下 EBM 如何处理 LIMIT_BAL、PAY_0和PAY_2特征,如 图 6-4 所示。

图 6-4. EBM 的三个重要输入特征和一个交互特征,伴随直方图(数字,彩色版本)
在 图 6-4 中,我们可以看到 LIMIT_BAL、PAY_0和PAY_2的三个标准形状函数图,但我们还可以看到 PAY_0 x PAY_2 交互作用的等高线图。这些图表,即使是稍微复杂的等高线图,都允许人们检查模型的行为,并在需要时进行编辑。 LIMIT_BAL 的行为看起来很合理,因为提高信用额度预计与违约概率下降相关。至少在训练数据的高范围内,我们观察到了这一点。超过 70 万美元,我们看到形状函数再次向上转向——这可能与该区域训练数据的稀疏性有关。EBM 比我们的 GAM 更符合逻辑地处理 PAY_0。在 EBM 下,PAY_0的违约概率在 PAY_0 > 1 时增加,并且不会回落到不现实的值,但会减少。同样,这可能与某些区域的训练数据稀疏性有关。 PAY_2 看起来有些嘈杂。此外,交互项表现出与某些单独 PAY_* 特征在 GAM 中观察到的相同不现实行为;延迟增加导致违约概率降低,除了PAY_0的低值和PAY_2的高值,模型输出急剧上升。与 GAM 一样,EBM 似乎在特定情况下基于噪声和训练数据稀疏性具有一些奇怪的行为。这可能是其 AUC 更高的另一个原因——它在某些情况下对此数据集的噪声建模。至少奇怪的行为显而易见,并且该模型可能是模型编辑的良好候选。在下一节讨论的单调约束可能也有所帮助,但目前尚未对 EBM 进行解释。
还有 Figure 6-4 的两个其他非常重要的方面(#ebm)不一定是 EBMs 的特征,但也需要仔细查看——形状函数周围的阴影区域和形状函数下方的直方图。这两个功能都帮助用户决定模型的可信度水平。如果直方图表明某个区域的训练数据很少,或者阴影误差条显示函数在某个训练数据域中具有高方差,则该函数的那部分可能不太可信,并且可以考虑对模型进行编辑。LIMIT_BAL超过$700,000 的形状函数就是训练数据稀疏和预测高方差的例子。这两个问题在训练、解释和调试 ML 模型时经常同时出现。
与 EBMs 一起工作的另一个稍微棘手的方面是访问我们自己绘图需求的信息。虽然 EBM 提供了令人惊叹的即时绘图功能,但我们经常喜欢创建自己的图形或数据结构,特别是与其他模型进行比较。我们发现有必要在多个场合与 EBM 的_internal_obj JSON 结构交互以实现这一点。例如,访问特征重要性值如下所示:
ebm_global = ebm.explain_global(name='EBM')
feature_names = ebm_global._internal_obj['overall']['names']
feature_importances = ebm_global._internal_obj['overall']['scores']
ebm_variable_importance = pd.DataFrame(zip(feature_names, feature_importances),
columns=['feature_names',
'feature_importance'])
要在我们可以访问的解释版本中提取特征重要性以操作自身,而不依赖于 EBM 的默认绘图,我们必须使用explain_global()计算全局解释,然后从返回对象的 JSON 中提取特征名称和重要性分数。然后,我们使用这些信息创建一个 Pandas DataFrame,然后大多数标准操作如绘图、选择或操作,都很容易。¹
通过这样,我们将结束我们的第一个示例集。在本节中,我们介绍了一个基准 GLM,然后通过 GAM 和 GA2Ms 引入了非线性和互动,以及通过 EBMs 使我们的模型更复杂。然而,由于 GLM、GAM 和 EBM 的加法特性,我们不仅保留了可解释性和硅上性能质量,而且还创建了一组可编辑的模型,我们可以相互比较,甚至结合,以构建最佳的真实部署模型。接下来的部分将继续探讨这些主题,并深入讨论 XGBoost 的约束和事后解释。
XGBoost 与约束和事后解释
在这个例子中,我们将训练和比较两个 XGBoost 分类器模型——一个带有单调约束,一个没有。我们将看到,受限模型比非受限模型更为稳健,且准确性不减。接着,我们将研究三种强大的事后解释方法——决策树替代品、部分依赖和 ICE、以及 SHAP 值。最后,我们将进行关于 SHAP 值计算和背景数据集的技术讨论,并为读者提供指导,以便选择适合当前应用的规范。
受限和非受限 XGBoost
XGBoost 是一种在大型结构化数据集上进行预测任务的极为流行的模型架构。那么,XGBoost 模型是什么呢?XGBoost 生成的模型是弱学习器的集成。也就是说,XGBoost 生成了许多小模型并将它们的预测结果求和以进行最终预测。通常情况下,序列中的第一个模型适配数据,随后的每个模型预测之前模型的残差以校正其错误。² 在本节中,我们将使用 XGBoost 训练一组浅层决策树的集成。我们将处理一个二分类问题,但 XGBoost 还可用于建模其他问题类型,如回归、多类分类、生存时间等等。
XGBoost 之所以如此受欢迎,部分原因是它倾向于产生在未见数据上泛化良好的强大模型。这并不意味着作为模型开发者的我们可以在开发中掉以轻心。我们必须使用合理的超参数和技术,比如早停法,以确保实现 XGBoost 的优势。XGBoost 允许我们应用的另一项重要技术是对模型施加单调约束。这些约束锁定了某些特征与模型输出之间的关系方向。它们允许我们说:“如果特征 X_1 增加,则模型输出不会减少。”简而言之,这些约束允许我们应用自己的领域知识来创建更加强大的模型。让我们看一下训练 XGBoost 模型的一些代码:
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'eta': 0.05,
'subsample': 0.75,
'colsample_bytree': 0.8,
'max_depth': 5,
'base_score': base_score,
'seed': seed
}
watchlist = [(dtrain, 'train'), (dvalid, 'eval')]
model_unconstrained = xgb.train(params,
dtrain,
num_boost_round=200,
evals=watchlist,
early_stopping_rounds=10,
verbose_eval=True)
首先,让我们看看params字典中的值。参数eta是我们模型的学习率。在梯度提升中,我们添加到集成中的每棵树都类似于梯度下降的一步。eta值越大,每棵额外树对模型的影响越大。eta值越小,对提升序列中的个别决策树的权重越小。如果我们使用eta = 1.0,我们模型的最终预测将是各个决策树输出的无加权和,几乎肯定会过拟合训练数据。在训练 XGBoost 或其他梯度提升模型时,请务必设置合理的学习率(比如在 0.001 到 0.3 之间)。
注
XGBoost 还提供交互约束来控制模型中输入特征如何相互影响。这是将领域专业知识注入 ML 模型的另一种简单方法。交互约束可能特别有助于通过消除已知的性别或种族的代理交互(如姓名、年龄或邮政编码的组合)来减轻偏见。
参数subsample和colsample_bytree也可以防止过拟合。两者确保每棵决策树不会看到整个训练数据集。在这种情况下,每棵树看到的训练数据的行数是随机选择的 75%(subsample = 0.75),列数是随机选择的 80%(colsample_bytree = 0.8)。然后,我们有一些参数来决定最终模型的大小。max_depth是模型中树的深度。更深的树包括更多的特征交互,并创建比较浅的树更复杂的响应函数。通常情况下,在训练 XGBoost 和其他 GBM 模型时,我们希望保持树的深度较浅——毕竟,这些模型的强大之处在于它们是弱学习器的集成。当然,网格搜索和其他结构化方法用于选择超参数值是更好的实践,但这不是本章的重点。
最后,在前面的代码片段中,我们正在使用基于验证的模型训练提前停止。我们通过将数据集(或在本例中,两个数据集)传递到evals参数中,并指定early_stopping_rounds来实现这一点。那么这里发生了什么?在训练序列的每一轮中,到目前为止训练的决策树集合将在evals监视列表中的数据集上进行评估。如果评估指标(在本例中是 AUC)在early_stopping_rounds轮中没有改善,那么训练将停止。如果我们没有指定提前停止,那么训练将继续直到构建num_boost_round棵树——通常是一个任意的停止点。在训练 GBM 模型时,我们几乎总是应该使用提前停止。
警告
如果我们将多个数据集传入evals,则列表中的最后一个数据集将用于确定是否满足提前停止的条件。此外,最终模型将拥有太多的树。每当我们使用模型进行预测时,应该使用iteration_range参数指定要使用多少棵树,请参阅文档获取更多信息。
正如我们将会看到的那样,非约束的 XGBoost 可以基于训练数据中有时是虚假的模式为个别观测分配概率。我们通常可以通过利用我们自己大脑中的知识和领域专家的帮助来更好地处理这些问题,除了仅仅从训练数据中学到的内容。
例如,我们知道,如果某人的信用卡支付越来越逾期,那么他们下次支付迟到的可能性几乎肯定更高。这意味着在我们的数据集中的所有 PAY_* 特征上,我们希望模型输出随着特征值的增加而增加,反之亦然。XGBoost 的单调约束正好可以做到这一点。对于数据集中的每个特征,我们可以指定我们希望该特征与模型输出具有正向、负向或无单调关系。
我们的数据集只包含 19 个特征,我们可以推理出每个特征与违约风险之间的基础因果关系。如果我们的数据集包含数百个特征怎么办?我们希望训练一个稳健的、有约束的模型,但可能对某些特征与目标之间的单调因果链接不确定。推导单调约束的另一种(或补充)方法使用斯皮尔曼相关系数。在下面的代码中,我们实现了一个函数,检查每个特征与目标之间的成对斯皮尔曼相关系数。如果斯皮尔曼系数的大小超过用户指定的阈值,那么假设该特征与目标具有单调关系。该函数返回一个包含值 -1、0 和 1 的元组——这正是 XGBoost 在指定单调约束时期望的输入形式。
def get_monotone_constraints(data, target, corr_threshold):
corr = pd.Series(data.corr(method='spearman')[target]).drop(target)
monotone_constraints = tuple(np.where(corr < -corr_threshold, -1,
np.where(corr > corr_threshold, 1, 0)))
return monotone_constraints
注意
我们使用斯皮尔曼相关系数而不是默认的皮尔逊相关系数,因为 GBM 是非线性模型,即使在约束条件下也是如此。XGBoost 的单调约束施加单调性而不是线性性——斯皮尔曼相关系数恰好测量单调关系的强度,而皮尔逊相关系数测量线性关系的强度。
在 图 6-5 中,我们绘制了每个特征与目标变量的斯皮尔曼相关系数。垂直线表示阈值为 0.1. 我们可以看到,这种数据驱动的方法建议对 PAY_* 特征施加单调约束。我们使用 0.1 作为实际显著性的非正式标记。对于那些斯皮尔曼相关系数小于 0.1 的输入特征,我们可能不想应用任何约束。随着支付和信用额度的增加,违约的概率应该降低。随着逾期支付的增加,违约的概率应该增加。这种数据驱动方法的结果也反映了常识。这是在生成约束时最重要的考虑因素,因为我们试图将因果领域知识注入到我们的模型中。

图 6-5. 目标 DELINQ_NEXT 与每个特征之间的斯皮尔曼相关系数,垂直条表示截断值为 0.1(数字,彩色版本)
接下来,我们使用分析中显示的图 6-5 中建议的约束条件来训练受限模型。让我们对生成的受限和非受限模型做几点观察。通过在代码示例中使用xgb.train()并设置verbose_eval=True,我们可以看到,在训练集上,非受限模型具有更高的 AUC(0.829 vs. 0.814),但在验证集上与受限模型表现相同(0.785 vs. 0.784)。这表明,相同的超参数集下,受限模型比非受限模型过拟合较少——受限模型能更好地捕捉数据中的真实信号比例。正如我们的分析将展示的那样,我们预计受限模型在实际应用中将表现更好(且更稳定)的原因还有其他方面。
最后,让我们看一下图 6-6 中两个模型的特征重要性。我们可以通过多种方式计算 XGBoost 模型的特征重要性值。在这里,我们将查看集成中分裂的平均覆盖度。分裂的覆盖度就是流经分裂的训练样本数。这是特征重要性的传统计算方法。与例如 SHAP 技术相比,它没有同样的理论保证。

图 6-6. 受限和非受限模型的特征重要性值,通过平均覆盖度测量(数字,彩色版本)
我们可以看到,受限模型将特征重要性更均匀地分布在整个输入特征集中。而非受限模型则将大部分特征重要性分配给PAY_0特征。这进一步证明,当部署时,受限模型将更加健壮。如果一个模型将所有决策能力集中在一个特征上,那么当该特征的分布随着新数据而漂移时,该模型将失败。过度依赖单一特征也存在安全风险。坏人更容易理解模型的工作原理并利用它。
警告
当我们看到特征重要性值集中在一个或几个特征上时,我们的模型更可能在部署后不稳定且不安全。我们的模型可能过于依赖数据分布沿单一维度的漂移,而恶意行为者只需操纵一个特征的值即可改变模型结果。如果一个机器学习模型只关注一个或两个特征,考虑用更简单的模型或业务规则替换它。
使用部分依赖和 ICE 解释模型行为
让我们继续比较约束和无约束的 XGBoost 模型,通过观察 PAY_0 的部分依赖和 ICE 图表的并排展示。在前面的部分中,我们已经讨论了目标变量的条件均值在 PAY_0 = 6 处显示出虚假下降的情况,而我们的训练数据在这里稀疏。让我们看看我们的两个 XGBoost 模型如何处理这些数据缺乏的情况。
在 Figure 6-7 中,我们可以看到无约束模型对 PAY_0 和 DELINQ_NEXT 之间的虚假关系过度拟合,尽管程度较小。另一方面,约束模型被迫遵守更加符合常识的关系,即延迟支付次数增加不应导致拖欠风险降低。这反映在我们约束模型下 PAY_0 的部分依赖和 ICE 图表中表现为单调递增。
注意
ICE 的一个困难在于选择哪些个体首先绘制。开始绘制 ICE 图的一个好方法是选择在预测结果的十分位数上的个体或行。这给出了局部行为的粗略图像,从而我们可以根据需要进行更深入的探索。
我们还可以看到,对于两种模型,PAY_0 值的范围内输出变化很大。换句话说,部分依赖和 ICE 图表显示,随着我们将 PAY_0 从 –2 到 8 进行扫描,模型输出对该特征值非常敏感。这正是为什么我们在 Figure 6-6 中看到 PAY_0 的特征重要性值如此之高的原因。如果我们对于模型认为非常重要的特征未观察到这类数值变化,那就意味着可能需要进行更多的调试工作。

Figure 6-7. PAY_0 特征在约束(顶部)和无约束(底部)模型的部分依赖和 ICE 图表(数字,彩色版本)
部分依赖和 ICE 图表还可以揭示模型中的特征交互情况。看一看我们无约束模型下 LIMIT_BAL 的部分依赖和 ICE 图表在 Figure 6-8 中的表现。

Figure 6-8. LIMIT_BAL 特征在无约束模型下的部分依赖和 ICE 图表(数字,彩色版本)
如“部分依赖和个体条件期望”所讨论的,当部分依赖和 ICE 曲线分歧时,正如在这里所做的那样,这表明我们的数据和模型中存在相关性或交互作用。 此外,我们可以回顾一下EBM 训练,看到 EBM 识别的两个重要交互作用是LIMIT_BAL x BILL_AMT2和LIMIT_BAL x BILL_AMT1。 我们的无约束 XGBoost 模型很可能也捕捉到了这些交互作用。 与 EBM 相比,我们的 XGBoost 模型充满了各种高度特征交互作用。 但是部分依赖和 ICE 结合 EBM 学习两路交互作用的能力,也可以帮助我们理解 XGBoost 模型中的一些交互作用。 在理解 ML 模型中复杂特征交互作用的工具中,另一个好工具是替代决策树,我们将在下文中讨论。
决策树替代模型作为一种解释技术
到目前为止,我们进行的分析表明,我们的无约束 XGBoost 模型表现并不比约束版本更好。 我们查看的部分依赖和 ICE 图表显示,通过将约束模型绑定到合理的现实世界关系,我们成功地防止了模型在训练数据中捕捉到虚假关系。 由于我们的约束模型显然优于替代方案,接下来的部分将专注于该模型。
首先,我们将通过一种事后解释技术——决策树替代模型,继续探索模型的行为。 替代模型只是一个简单的模型,旨在模仿更复杂的模型的行为。 在我们的案例中,我们试图用一个单一的、浅显的决策树来模拟约 100 棵树的受限 XGBoost 模型。 决策树是一个数据导出的流程图,因此我们可以把决策树替代看作一个流程图,并用更简单的术语解释更复杂的 GBM 是如何运作的。 这就是决策树替代成为强大解释技术的原因。 我们使用sklearn中的DecisionTreeRegressor实现来训练我们的替代模型:
surrogate_model_params = {'max_depth': 4,
'random_state': seed}
surrogate_model = DecisionTreeRegressor(**surrogate_model_params)
.fit(train[features], model_constrained.predict(dtrain))
注意
替代建模也被称为模型压缩或模型提取。
请注意,我们正在训练一个针对我们试图解释的模型输出的回归模型。 也就是说,替代模型完全专注于模仿更大模型的行为,而不仅仅是制作一个更简单的分类模型。 我们还选择训练一个深度为四的决策树。 如果再深入一些,我们可能会很难解释替代模型本身发生了什么。
警告
替代模型并非总是表现良好。始终检查替代模型的性能质量和稳定特性。我们在这里提出了一种简单的替代建模方法。有关替代方法及其忠实性的更多信息,请参阅“通过模型提取解释黑盒模型”,“提取训练网络的树结构表示”和“可解释性的代价”。
在检查我们的替代模型之前,我们必须问自己是否能够信任它。决策树替代模型是一种强大的技术,但它们并不附带许多数学保证。评估我们的替代品质量的一个简单方法是计算交叉验证折叠上的准确度指标。为什么使用交叉验证而不只是一个验证数据集?单一决策树模型的一个缺点是它们对训练数据集变化的敏感性,因此通过计算多个留出折叠上的准确度,我们可以检查我们的替代模型是否足够准确和稳定,可以信任:
from sklearn.model_selection import KFold
from sklearn.metrics import r2_score
cross_validator = KFold(n_splits=5)
cv_error = []
for train_index, test_index in cross_validator.split(train):
train_k = train.iloc[train_index]
test_k = train.iloc[test_index]
dtrain_k = xgb.DMatrix(train_k[features],
label=train_k[target])
dtest_k = xgb.DMatrix(test_k[features],
label=test_k[target])
surrogate_model = DecisionTreeRegressor(**surrogate_model_params)
surrogate_model = surrogate_model.fit(train_k[features],
model_constrained.predict(dtrain_k))
r2 = r2_score(y_true=model_constrained.predict(dtest_k),
y_pred=surrogate_model.predict(test_k[features]))
cv_error += [r2]
for i, r2 in enumerate(cv_error):
print(f"R2 value for fold {i}: {np.round(r2, 3)}")
print(f"\nStandard deviation of errors: {np.round(np.std(cv_error), 5)}")
R2 value for fold 0: 0.895
R2 value for fold 1: 0.899
R2 value for fold 2: 0.914
R2 value for fold 3: 0.891
R2 value for fold 4: 0.896
Standard deviation of errors: 0.00796
这些结果看起来很棒。我们可以看到,在每个交叉验证折叠中,替代模型的准确率都很高,变化非常小。有了一些对我们的决策树是一个合理替代的信心,让我们来绘制替代模型(图 6-9)。

图 6-9. 受限 XGBoost 模型的决策树替代品
请注意 图 6-9 中的替代模型首先基于PAY_0特征进行分割。也就是说,为了最优地模仿受约束的 XGBoost 模型的行为,替代模型首先将观察结果分为两组——那些PAY_0 ≤ 1.5和那些具有更高PAY_0值的观察结果。我们可以通过查看每个特征在替代模型中的分割深度粗略地近似特征重要性,因此这个结果与我们的特征重要性分析一致。一个好的迹象。
由于我们的替代模型如此简单,我们还可以对其进行大量简单语言观察。例如,我们可以追踪最高风险和最低风险观察结果的路径,并解释我们的替代模型如何处理它们:
-
最低风险的观察结果遵循以下决策路径:2005 年 9 月还款状态准时或晚一个月 (
PAY_0≤1.5) 和 2005 年 8 月还款状态准时或晚一个月 (PAY_2≤1.5) 和 2005 年 8 月还款金额超过 $1,603.5 (PAY_AMT2> $1,603.5)。这些规则侧重于近期按时还款且进行大额还款的客户。很合理。 -
风险最高的观察结果遵循以下决策路径:2005 年 9 月还款状态超过一个月迟缴(
PAY_0>1.5)和 2005 年 8 月还款状态超过一个月迟缴(PAY_2>1)以及 2005 年 4 月还款状态超过一个月迟缴(PAY_6>1)。这些规则考虑了随时间不利的还款状态—同样是合乎逻辑的。
这些解释考虑了还款状态和还款金额。对于接受决策,更复杂的 GBM 似乎侧重于更近期的状态和金额信息;而对于拒绝决策,我们的 GBM 可能正在寻找随时间变化的付款状态模式。
最后我们会注意到,每当一个特征跟随另一个特征在决策树路径中时,这些特征很可能在我们的 GBM 模型中发生交互作用。通过检查替代模型,我们可以轻松地识别出我们的 XGBoost 模型学到的主要特征交互作用。有趣的是,我们也可以回顾一下看到,EBM 也捕捉到了一些相同的交互作用,比如 PAY_0 x PAY_2 和 PAY_0 x PAY_AMT2。通过这些工具— EBM、部分依赖和 ICE,以及替代决策树—我们可以真正了解我们的数据中包含了哪些信息,以及从模型行为中合理期待什么。这与训练单一无法解释模型并检查几个测试数据评估指标截然不同。我们开始了解这些模型的工作方式,因此可以就它们的实际表现做出人类判断。
更重要的是,我们可以利用这些关于交互作用的信息来提升线性模型的性能,比如惩罚逻辑回归,通过将这些学到的交互作为输入特征。如果我们希望在最高风险应用中坚持最保守的模型形式,我们可以使用 GLM,并且很可能通过这些重要交互作用信息提升性能质量。正如读者所见,通过决策树替代,我们可以对我们的 XGBoost 模型进行各种简单、可解释的观察。在这个过程中,我们还收集了大量用于模型文档和其他风险管理目的的有用信息。
Shapley 值解释
关于在我们结束这一章之前讨论的最后一种事后解释工具是 Shapley 值。在“局部解释和特征归因”中,我们提到 Shapley 值可以作为局部特征归因技术使用。事实上,Shapley 值具有一系列数学保证,表明它们通常是特征归因和重要性计算的最佳选择。由华盛顿大学和微软研究机构的 Scott Lundberg 领导的研究和开源社区开发了大量用于生成和可视化 SHAP 值的工具。这些工具存在于 SHAP Python 包中,这也是我们将在本节中使用的工具。
记住,局部特征归因方法为每个观测分配一个值,量化该特征对该观测接收到的预测值贡献了多少。在本节中,我们将看到如何使用 SHAP 值和 SHAP 包来解释我们模型的行为。在本章的最后一节中,我们将检查基于 Shapley 值的解释的一些细微差别,以及它们对从业者造成的困扰。
让我们看一些代码来生成我们的单调 XGBoost 模型的 SHAP 值:
explainer = shap.TreeExplainer(model=model_constrained,
data=None,
model_output='raw',
feature_perturbation='tree_path_dependent')
shap_values = explainer(train[features])
我们使用 SHAP 包的TreeExplainer类。该类可以为 XGBoost、LightGBM、CatBoost 和大多数基于树的 scikit-learn 模型生成 SHAP 值。TreeExplainer在 Scott Lundberg 的论文“Consistent Individualized Feature Attribution for Tree Ensembles”和“From Local Explanations to Global Understanding with Explainable AI for Trees”中有讨论。它们是使 SHAP 包如此成功的计算突破的一个很好的例子。如果您需要为非基于树的模型生成 SHAP 值,请查看SHAP 包文档中的示例——其中包含用于表格、文本和图像数据的多个示例。
注意
如果你需要解释一个不基于树或神经网络的模型,请不要忘记与原型和反事实解释进行比较。这些强大的解释概念可能比通用的模型无关方法(如局部模型无关可解释性解释(LIME)或核 SHAP)更有效。
首先,让我们看看图 6-10 中PAY_0特征的 SHAP 值。

图 6-10. PAY_0特征的依赖图,显示每个特征值桶中 SHAP 值的分布(数字,彩色版本)
图 6-10 中的每个点都是PAY_0特征的一个观测的 SHAP 值,即对模型预测的贡献,x 坐标由PAY_0的值给出。这个散点图覆盖在数据集特征值直方图的上方,就像我们的偏依赖和 ICE 图一样。事实上,这个散点图可以直接与PAY_0的偏依赖和 ICE 图进行比较。在 SHAP 散点图中,我们可以看到PAY_0值桶内的特征归因值的整个范围。请注意,PAY_0 = 2 桶中的范围最宽——某些具有PAY_0 = 2 的观测被罚款的大约是其他观测的一半。这个 SHAP 散点图是 SHAP 包中包含的许多总结图之一。要获取更全面的概述,请查看文档中的示例以及本章的 Jupyter 笔记本示例。
正如我们在第 2 章中所看到的,我们可以通过取绝对 SHAP 值的均值来构建总体特征重要性的度量。与特征重要性值的标准水平条形图不同,我们可以使用 SHAP 绘图功能明确地查看特征重要性,作为局部解释的聚合:
shap.plots.beeswarm(shap_values.abs, color="shap_red", max_display=len(features))
图 6-11 为我们提供了一个关于特征重要性的有趣视角。请注意,某些特征(例如 PAY_0,PAY_AMT1)具有一些显示极端 SHAP 值的点,而其他特征(例如 LIMIT_BAL,PAY_AMT3)由于许多个体观测具有相对较高的绝对 SHAP 值而具有高特征重要性。换句话说,局部解释使我们能够区分高频率、低幅度效果与低频率、高幅度效果。这很重要,因为每一个高幅度、低频率效果都代表着我们模型影响到的真实人群。

图 6-11. 特征重要性,显示为个体观测的绝对 SHAP 值的聚合(数字版,彩色)
基于 Shapley 值的解释由于其坚实的理论基础和围绕它们构建的强大工具集而被广泛采用。由于这些数量可以在逐个观测的水平上计算,因此它们可能被用来生成拒绝行动通知或其他拒绝报告(当正确使用、测试其忠实性和稳定性,并与约束模型配对时)。看一看我们的代码示例,阅读一些论文和文档,并开始为我们的模型生成 SHAP 值。但请阅读下一节,我们将讨论每个 SHAP 计算背后的假设和限制。
Shapley 值存在的问题
在第 2 章和“Shapley Values”中,我们介绍了支持 Shapley 值计算的背景数据集的概念。当 SHAP 希望了解某个特征对某个预测的影响时,它会用背景数据中抽取的随机值替换训练或测试数据中特征的值,并多次比较来自两个不同数据集的预测,关于哪些特征使用正常数据和哪些特征使用背景数据的扰动很多。关于背景数据集的有用思考方式如下:当我们为一个观测计算 SHAP 值时,我们正在回答“为什么这个观测获得了这个预测而不是其他预测?”观测所比较的“其他预测”由背景数据的选择或参考分布决定。
在下面的代码中,我们为相同的观测创建了两组 SHAP 值——除了一个实例我们没有指定参考分布,而在另一个实例中我们有:
explainer_tpd = shap.TreeExplainer(model=model_constrained,
feature_perturbation='tree_path_dependent')
shap_values_tpd = explainer_tpd(train[features])
train['pred'] = model_constrained.predict(dtrain)
approved_applicants = train.loc[train['pred'] < 0.1]
explainer_approved = shap.TreeExplainer(model=model_constrained,
data=approved_applicants[features],
model_output='raw',
feature_perturbation='interventional')
shap_values_approved = explainer_approved(train[features])
通过设置feature_perturbation='tree_path_dependent',我们选择不定义任何参考分布。相反,SHAP 使用从训练好的 GBM 模型树中收集的信息来隐式定义自己的背景数据。这类似于使用训练数据作为我们的背景数据,但并非完全相同。
接下来,我们定义一个带有feature_perturbation='interventional'的explainer,对于这个explainer,我们传递一个由得到逾期概率小于 10%的训练样本组成的参考分布。如果参考分布是我们将每个观测值与之比较的内容,那么我们期望这两组 SHAP 值在含义上是不同的。毕竟,这些问题是非常不同的:“为什么这个观测值得到这个预测,而不是训练数据中的平均预测?”与“为什么这个观测值得到这个预测,而不是给予批准申请者的预测?”正如在第二章中讨论的那样,后一个问题与美国对不良行为通知的法规评论更加一致。这就是当 Beicek 教授说“不要脱离上下文来解释!”时的一个例子。
尽管一些人认为tree_path_dependent特征扰动符合数据——也就是说,它们告诉我们不仅仅是这个模型的行为,正如在“当特征相关时解释个别预测:对 Shapley 值的更准确近似”中所示的那样,这可能并不是真的。符合数据的特征归因需要我们知道数据的完整联合概率分布,而这是一个非常具有挑战性的技术问题,我们不能仅凭模型中树的路径结构来解决。最好使用interventional特征扰动,并认识到我们的 SHAP 值是符合模型的,不适用于模型之外的泛化。我们建议仅在没有其他选择时使用tree_path_dependent特征扰动。使用它们的主要原因是如果您无法访问背景数据集,并且必须从模型中推断它。如果您可以访问训练数据,请明确传递给 SHAP 解释器并使用interventional特征扰动。
警告
到本书撰写时,最佳实践表明最好使用interventional特征扰动,并认识到我们的解释不适用于模型之外的泛化。只有在没有其他选择时才使用tree_path_dependent特征扰动。
继续查看图 6-12,试图展示为什么所有这些都很重要。在图 6-12 中,我们展示了同一观察结果的两组 SHAP 值——一组是在没有参考分布和feature_perturbation='tree_path_dependent'的情况下计算的,另一组是针对批准申请人的参考分布和feature_perturbation='interventional'计算的。首先,对于某些观察结果,在这两种不同类型的 SHAP 解释下可以看到很大的 SHAP 值差异。

图 6-12. 同一观察结果的 SHAP 值,分别使用和不使用参考分布,参考分布中的观察结果具有小于 10%违约概率(数字,彩色版本)
想象一下,基于这两种解释发送的不良行动通知。没有参考分布,导致违约可能性更大的前四个特征是PAY_0、LIMIT_BAL、BILL_AMT5和PAY_AMT3。但是,如果我们指定一个上下文特定的参考分布,这四个顶级特征将是PAY_AMT1、PAY_AMT2、PAY_AMT3和LIMIT_BAL。在信贷借贷背景下,追索权(对模型决策提出异议的能力)是信任和负责任部署的重要组成部分,哪种解释是正确的呢?很可能是基于干预特征扰动的解释,由于使用了背景数据中的批准申请人,它们在法规要求方面也更合理。
然而,这些干预式解释是针对模型的特定的,因此只有在未来使用完全相同模型对申请人评分时,才能为申请人提供准确的原因代码。如果由于 ML 管道中的某些模型特定机制,同一借款人因类似信贷产品而获得不同的不良行动通知,这将引起关注。树路径依赖解释跨不同模型可能更加一致——正如某些人所声称的那样——但这也突显了另一个困难。无论如何,路径依赖和干预式 SHAP 值都可以基于未在具体决策中使用的特征提供解释。这对于不良行动通知和可操作追索权是一个大问题。然而,当您使用 SHAP 时,我们仍建议使用干预式解释,并同时承认并测试其局限性。
即使我们正确获取了与特征扰动和背景数据相关的所有细节,机器学习解释仍然存在一个根本性的局限性需要牢记。被拒申请人想知道如何改变他们的信用档案以便将来能够获得批准——这是我们通过已批准申请人参考分布所提出的问题。然而,即使使用了有意义且特定上下文的参考分布,我们在使用解释模型时也需要谨慎一些。关于这种回溯问题,“为了将来获得有利结果,我应该改变[我的信用档案]中的什么?”根本上是一个因果问题——而我们并非在使用因果模型。引用 SHAP 包的创始人 Scott Lundberg 的话,“在寻找因果洞察的预测模型解释时要小心”。他接着说:
XGBoost 等预测机器学习模型与 SHAP 等解释性工具配对使用时,可以变得更加强大。这些工具能够识别输入特征与预测结果之间最具信息量的关系,这对于解释模型行为、获得利益相关者支持和诊断潜在问题非常有用。分析可以更进一步,假设解释工具还能识别决策者在想要改变未来结果时应该操控哪些特征。然而,[...]使用预测模型来指导此类政策选择往往会产生误导。
对于所有的数学保证和易用性来说,基于 Shapley 值的解释并非魔法棒。相反,它们只是我们解释模型工具箱中的又一种工具。我们必须将事后解释技术与本质上可解释的模型架构(如 GLM、GAM 或严格约束的 XGBoost)结合起来,才能实现真正的可解释性。我们必须保持谦逊,并记住机器学习关注的是相关性,而不是因果关系。
更加明智的模型选择
结束本章之前,让我们回到PAY_0特征,比较我们建立的五个模型如何处理这个特征。请记住,PAY_0代表还款状态,较高的值对应更大的还款延迟。显然,较高的值应该对应更大的违约风险。然而,我们使用的训练数据在特征较高值时很稀疏,所以在一个月以上延迟后,我们只有很少的观察数据。考虑到这一点,让我们分析每个模型对这个特征的五个部分依赖和 ICE 图表,如图 6-13 所示。我们需要问自己:“对于一个十亿美元的贷款投资组合,我最信任哪个模型?”
我们的三个模型对特征空间稀疏区域中目标值均值的虚假下降表现出响应:GAM、EBM 和无约束 XGBoost。GLM 和约束 XGBoost 模型被迫忽略了这一现象。由于 GAM 和 EBM 是加法模型,我们知道偏依赖图和 ICE 图确实代表了它们对这一特征的处理。无约束 XGBoost 模型充满了特征交互,因此我们不能那么确定。但是偏依赖确实与 ICE 相匹配,因此这可能是真实模型行为的一个很好指标。我们可以说这是在惩罚 GLM 和约束 XGBoost 模型之间做出选择。哪个模型是最佳选择?通过使用这些可解释模型和事后解释器,我们可以比传统的不透明机器学习工作流程更加慎重地做出选择。这才是最重要的。记住,如果我们只根据性能选择,我们可能会选择一个对最重要的特征处理方式有些愚蠢的模型。
通过对可解释性实践的深入探索,我们得出以下结论:首先,我们了解到特征与目标之间哪些关系真正具有意义,哪些是噪音。其次,如果我们需要能够解释我们模型的行为——而我们很可能需要——我们需要选择一种本质上可解释的模型架构。这样,我们既有了模型,也有了解释器来相互核对。第三,我们必须强制我们的模型遵守现实的约束条件。人类仍然比计算机聪明!最后,我们需要用多样的后验解释技术来检查我们训练好的模型,如偏依赖图和 ICE 图、代理模型以及 SHAP 值。通过这种方式工作,我们可以做出知情且合理的模型选择,而不只是过度拟合潜在偏倚和不准确的训练数据。

图 6-13。本章训练的五个模型的偏依赖图和 ICE 图(数字、彩色版)
资源
进一步阅读
代码示例
可解释建模工具
后验解释工具
¹ 当前版本的软件包正在解决这一不便。查看文档获取更多详细信息。
² 想要了解更多有关梯度提升的信息,请参阅《统计学习基础》(https://oreil.ly/hvX2H),第十章。
第七章:解释 PyTorch 图像分类器
第六章 着重于使用可解释模型和事后解释来解释基于表格数据训练的模型。在本章中,我们将讨论相同的概念,但针对训练在非结构化数据上的深度学习(DL)模型,特别是图像数据。本章的代码示例可以在 线上获取,并且请记住 第二章 介绍了可解释模型和事后解释的概念。
我们将从一个关于在本章技术示例中展示的假设使用案例介绍这一章。然后我们将像我们在 第六章 中做的那样继续。首先,我们将对深度神经网络的可解释模型和特征归因方法进行概念复习—重点是扰动和基于梯度的解释方法。我们还将继续一个来自 第六章 的主题,概述可解释性技术如何影响模型调试,这是我们将在第 8 和 9 章进一步扩展的主题。
接下来,我们将更详细地讨论固有可解释模型。我们推出了一个关于可解释 DL 模型的简短部分,希望一些读者能够构建自己的可解释模型,因为截至今天,这是获得真正可解释结果的最佳希望。我们将介绍基于原型的图像分类模型,如 ProtoPNet 数字乳腺摄影—这是一个有前途的解释性计算机视觉方向。之后,我们将讨论事后解释技术。我们将详细介绍四种方法:遮蔽(一种常见的扰动类型)、输入 * 梯度、整合梯度和逐层相关性传播。我们将利用我们假设的肺炎 X 光应用案例展示这些方法展示的不同特性,并在途中突出一些重要的实施细节。
注意
在 第二章 中我们提到,解释 是一种高层次的、有意义的心理表征,用于将刺激置于背景知识的语境中,并利用人类的背景知识;而 解释 是一种低层次、详细的心理表征,旨在描述复杂过程。解释要求的门槛比解释高得多,单靠技术手段很难实现。
我们如何确定我们的事后解释是否有效呢?为了解决这个问题,我们将讨论评估解释的研究。我们将展示一个实验,首次描述在 “Saliency Maps 的常识性检查”,该实验将表明,许多事后解释技术并不一定能揭示模型的实质信息!
我们将通过总结所学到的教训来结束本章。本章将展示读者应当谨慎在需要模型解释的高风险应用中实施标准的深度学习解决方案。事后解释通常难以实施、难以解释,有时完全毫无意义。此外,不同的解释技术范围广泛,这意味着我们可能会选择证实我们对模型应该表现如何的先前信念的方法(见第 4 和 12 章的确认偏见讨论)。比一个无法解释的模型更糟糕的是,一个无法解释的模型与由确认偏见支持的错误模型解释相结合。
解释胸部 X 射线分类
我们将使用肺炎图像分类器模型的工作示例。我们将保持一个假想的使用案例,即将模型预测和解释传递给专家用户(例如医生),以帮助诊断。图 7-1 提供了一个简化的示意图,显示了模型如何与解释引擎结合使用,帮助专家诊断肺炎。
在消费信用背景下,事后解释已被接受使用。但使用模型解释来帮助解释医学成像并没有这样的历史。此外,一些重要的作品批评事后技术和与我们假设的类似用例,例如 “当前解释人工智能在医疗保健中的虚假希望” 和 “医生就是不会接受这一点!”。即使使用案例是合理的,即使是精心开发的 ML 系统也可能在样本外数据上表现不佳。例如,查看 “使用混杂患者和医疗保健变量深度学习预测髋部骨折” 中一个模型在训练数据中捕捉到的关联性,但在实施后表现不佳。查看 “深度学习算法用于检测颅内出血的诊断准确性和失效模式分析” ,这是与本章介绍的类似用例有些相似,但还包括对真实世界结果的分析。随着我们深入研究一些事后示例并总结本章内容,我们将更详细地讨论所有这些问题。

图 7-1. 本章中维持的假想使用案例。一个模型和事后解释引擎(a)传递预测和解释到一个可读的仪表板上。仪表板上的信息用于帮助医生诊断肺炎(b)。
概念复习:可解释模型和事后解释技术
在本节中,我们将讨论章节背后的基本思想。我们将从不使用代码处理的可解释模型开始。然后,在本章的事后解释部分,我们将在我们的模型上演示一些技术,并对该领域中的许多基础技术进行概述。这些技术主要可以分为两组:基于扰动的(通常在 DL 中为遮挡)和基于梯度的方法;我们将在接下来讨论这些类别之间的差异。我们还将强调如何将这些技术应用于模型调试和架构选择的问题。
可解释模型概述
如在第二章中提到的,可解释模型具有固有的可解释结构、特性或结果。此外,可解释模型存在于一个谱系上。有些可能直接向最终用户解释,而有些可能只对高技能的数据科学家有意义。可解释的 DL 模型显然处于解释谱系的更复杂一侧,但我们仍认为它们非常重要。正如我们将强调的,并且正如许多其他研究者所指出的那样,我们在 DL 中的事后解释必须非常小心。如果我们有一个可解释的模型,我们能够直接理解它,无需使用可疑的事后技术,我们还可以将事后解释的结果与模型的可解释机制进行比较,以测试和验证模型和解释。
遮挡方法
遮挡方法基于扰动、移除或遮蔽特征,并检查模型输出的变化。在计算机视觉中,这通常意味着遮蔽像素块。如在“通过移除进行解释:模型解释的统一框架”中讨论的,许多不同的解释技术可以追溯到这种特征遮挡的想法。
基于遮挡的技术,在梯度不可用时或者我们试图解释的模型是一个包括 ML、业务规则、启发式和其他不可微分组件的复杂决策流水线时尤为重要。所有基于遮挡的方法都必须应对同样的复杂情况:对于大多数模型,我们不能简单地移除特征并生成模型预测。换句话说,如果我们的模型是在特征x1、x2和x3上训练的,我们不能简单地为x1和x2传递值并期望它进行预测。我们需要为x3传递某些值。这个细节是许多不同基于遮挡的方法的核心所在。
基于梯度的方法
如在第二章中讨论的那样,模型输出对其参数的梯度可以用来构建局部解释。这是解释回归系数背后思想的一般化。请记住,梯度只是对我们的 ML 模型这种复杂函数的局部线性逼近。由于绝大多数 DL 架构都设计成可以使用基于梯度的优化器进行训练,我们几乎总是可以访问一些梯度,并且随着当代 DL 工具包的发展,评估梯度变得更加容易。这是使基于梯度的解释技术在 DL 中如此受欢迎的部分原因。然而,对于基于树的模型或复杂流水线,无法进行梯度计算的情况下,我们将不得不退而使用遮挡方法。
此类解释基本上问:“如果我们稍微改变哪些特征,会导致我们模型输出的最大变化?”研究人员已经针对这个主题开发了许多变体,以揭示微妙不同的解释方法。我们将在本章稍后详细介绍这些技术,包括输入*梯度、集成梯度和层内相关传播。
用于模型调试的可解释人工智能
在第六章,我们看到了模型解释技术如偏依赖图和 ICE 图如何揭示模型的不良行为,比如对训练数据中的噪声过于敏感。解释可以为深度学习(DL)模型服务,这可能是解释型人工智能(XAI)在 DL 中迄今为止的最高目标。DL 可解释性技术帮助调试和改进模型的能力已被著名研究人员多次提及。最著名的例子可能是经典的 Google 博客文章,该文章推广了神经网络“梦想”的概念。作者使用了来自“深入卷积网络内部:可视化图像分类模型和显著性地图”的技术,通过要求模型展示哑铃的概念来调试他们的模型:
那里确实有哑铃,但似乎没有一张完整的哑铃图片是没有一个肌肉发达的举重运动员在旁边举起的。在这种情况下,网络未能完全提取出哑铃的本质。可视化可以帮助我们纠正这些训练中的错误。
DL 文献中作为调试工具的解释的一些额外例子包括以下内容:
我们之所以将这些资源推荐给读者,有两个原因。首先,尽管本章中将探讨的流行的深度学习解释技术并非总是有效,但这些论文中的其他技术确实值得一试。其次,尽管解释技术在精确理解上可能会让我们失望,但它们仍然可以提示出模型中的问题。在阅读本章时,请考虑这一点。在第九章,我们将深入探讨如何应用基准测试、敏感性分析和残差分析来调试我们的深度学习模型。
可解释模型
我们将通过讨论适用于深度学习应用的可解释模型开始本章的技术部分,因为它们是我们目前在深度学习中获得可解释结果的最佳选择。但是,它们目前仍然不容易使用。读者将了解到,我们可以直接在应用程序中使用的现成可解释深度学习模型并不多。这与我们在第六章中看到的情况形成鲜明对比,那里我们可以选择从单调 XGBoost、可解释提升机器到广义线性模型(GLMs)和广义可加模型(GAMs)等丰富可解释的架构。那么区别在哪里?为什么现成的可解释深度学习模型如此之少?其中一个问题是,结构化数据的可解释模型可以追溯到 19 世纪高斯的工作,但深度学习并非如此。但这还有更多的问题存在。
当我们对非结构化数据训练深度学习模型时,我们实际上要求模型执行两个功能:第一个是特征提取以创建潜在空间表示,或学习在(通常是)低维输入空间中的数据的适当表示。其次,它必须使用该潜在空间表示进行预测。与我们在第六章中分析的表格数据相比,这就是一个明显的区别。对于表格数据,我们通常假定数据的“正确”表示已经在训练数据中,特别是如果我们已经正确选择了一组不相关的特征,并且这些特征与目标之间有已知的因果关系。这种差异(学习的特征与已提供的特征)有助于突显为什么可解释的深度学习模型如此难以开发,并且为什么现成的实现难以获得。
当今已存在的可解释 DL 架构中的共同特征是,它们直接干预特征学习。通常情况下,可解释模型将特征工程的负担从模型转移到模型开发者身上。这增加了负担,既是一种祝福也是一种诅咒。一方面,这意味着训练这些模型比训练不可解释模型更费力。另一方面,这些架构可能需要更高质量的、有时是专家标注的数据,这意味着人类在建模过程中深度参与。由于我们应该已经在设计我们的模型时考虑到这些架构的需求,这并不坏。正如我们在第六章中看到的,我们能够在我们的模型中编码更多领域专业知识,我们就能在实际世界中更加信任它们的性能。
在接下来的章节中,我们将讨论不同的可解释 DL 模型架构,同时将我们的主要关注点保持在图像分类问题上。我们将特别关注基于原型的架构的最新发展,这提供了真正可用的解释性图像分类的最有可能的路径。
ProtoPNet 和其变种
在他们 2019 年的论文"这看起来像那样:用于可解释图像识别的深度学习"中,由辛西娅·鲁丁教授领导的杜克团队介绍了一种新的、有前景的解释性图像分类架构。这个新模型被称为ProtoPNet,它基于原型的概念。
请记住从第二章中得知,原型是代表较大观察组的数据点。考虑解释为什么一个观察被分组到k-means 聚类中的特定群集中。我们可以将观察与群集中心并排放置,并说,“嗯,这个观察看起来像那个群集中心。”ProtoPNet 生成了确切这种类型的解释。此外,ProtoPNet 的解释忠实于模型实际进行预测的方式。那么它是如何工作的呢?
首先,ProtoPNet 为每个类别识别出原型patch。这些 patch 捕捉了区分一个类别与另一个类别的基本特性。然后,为了进行预测,模型会在输入图像中寻找与特定类别原型相似的 patch。每个原型的相似性得分会被加在一起,从而产生输入属于每个类别的概率。最终的结果是一个模型,具有可加性(每个预测是跨原型图像部分相似性得分的总和)以及稀疏性(每个类别只有少数几个原型)。更重要的是,每个预测都立即伴随着一个忠实的解释。
注意
ProtoPNet 建立在部分注意力模型的思想上,这是一类广泛的可解释深度神经网络,但本章未涵盖。这些模型与 ProtoPNet 之间的区别在于其信实性。ProtoPNet 通过将每个图像的某些补丁和某些类原型的相似性得分进行累加来进行预测。而其他部分级注意力模型则不提供这种保证。
自 2019 年发布以来,这种有前途的解释性图像分类方法已被其他研究人员采用。例如ProtoPShare,允许在类之间共享原型,从而减少原型的数量。还有ProtoTree,它通过原型特征创建可解释的决策树。该架构允许模型更清晰地模仿人类推理。最后,Kim 等人在《“XProtoNet: Diagnosis in Chest Radiography with Global and Local Explanations”》中使用了一种与 ProtoPNet 非常相似的架构来分析胸部 X 射线。
其他可解释的深度学习模型
在《“Towards Robust Interpretability with Self-Explaining Neural Networks”》中,David Alvarez-Melis 和 Tommi S. Jaakkola 介绍了自解释神经网络(SENN)。正如我们讨论过的那样,在非结构化数据上创建可解释模型的一个困难是,我们要求我们的模型创建数据的潜在空间表示并进行预测。自解释神经网络通过引入可解释的基础概念来应对这一困难,而不是使用原始特征。这些基础概念可以作为模型训练的一部分学习,来自训练数据中的代表性观察结果,或者最理想情况下由领域专家设计。在他们的论文中,Alvarez-Melis 和 Jaakkola 使用自编码器生成这些可解释的基础概念,并确保所学习的概念通过提供最大程度表达该概念的原型观察结果而具有可解释性。
注意
自编码器是一种类型的神经网络,它学习从训练数据中提取特征,而无需对单一建模目标进行预测。自编码器也非常适合数据可视化和异常检测。
到目前为止,我们主要关注于计算机视觉模型的技术。为了强化学习,视觉推理,表格数据,和时间序列预测,已经开发了可解释的深度神经网络模型。
训练和解释 PyTorch 图像分类器
在这个用例中,我们概述了如何训练图像分类器,然后演示了如何使用四种不同的技术生成解释:遮挡、输入*梯度、综合梯度和逐层相关传播。
训练数据
首先,我们需要建立一个用于诊断胸部 X 光图像的图像分类器,与图 7-1 中的假设用例一致。我们将用于训练的数据集可以从Kaggle获取,它包含 5,863 张病人的 X 光图像,被分为两个明确的类别——一个包含肺炎,另一个正常。图 7-2 展示了从训练数据中随机选取的图像集合。

图 7-2. Kaggle 胸部 X 光数据集训练集样本的随机选择;患有肺炎的胸部 X 光片比没有肺炎的更模糊。
我们不是医生或放射科医生,承认我们的作者组没有医学领域的知识来真正验证这个模型是很重要的。根据我们的理解,来自肺炎患者的图像应显示感染区域的浑浊。细菌性肺炎和病毒性肺炎也倾向于具有不同的视觉特征。希望接下来的部分能够利用可解释的 AI 方法集中于这些浑浊区域,使我们能够理解为什么一个图像被分类为肺炎而不是正常。(准备好失望吧。)要了解更多关于数据集的信息,请参阅其Kaggle 页面和相关论文,《“通过基于图像的深度学习识别医学诊断和可治疗疾病”》(“Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning”)。
警告
如果我们在高风险的机器学习应用领域工作,需要专业领域知识来帮助训练和验证我们的模型。未咨询领域专家可能导致在高风险用例中部署有害或无意义的模型。
像大多数来自Kaggle的数据集一样,数据的大部分筛选工作已经完成。低质量的扫描已经被消除,标签也经过验证确认是正确的。然而,像许多医学应用中的数据集一样,这些数据存在类别不平衡的问题:有 1,342 个正常扫描,但有 3,876 个标记为显示肺炎的扫描。另一个令人担忧的问题是给定验证数据集中图像数量很少。验证数据集仅包含九张肺炎类别的图像和九张正常类别的图像。这些数量不足以充分验证模型,因此在进行模型训练之前我们将解决这个问题以及其他问题。
解决数据集不平衡问题
在我们的训练数据中,肺炎 X 光扫描比正常扫描多出三倍。任何在这样的数据集上训练的模型可能会过拟合到多数类别。有几种方法可以解决类别不平衡问题:
-
对少数类别进行过采样
-
对多数类别进行欠采样
-
修改损失函数以不同权重处理多数和少数类别。
这些技术以及类别不平衡问题的有害影响已在题为“卷积神经网络中类别不平衡问题的系统研究”的论文中得到了很好的总结。在这个例子中,我们将过采样正常图像以平衡类别不平衡。
数据增强和图像裁剪
PyTorch 是一个开源的机器学习框架。torchvision 是为了支持计算机视觉研究和实验而构建的 PyTorch 领域库。torchvision 包括一些流行的数据集、预训练的模型架构,以及一些用于计算机视觉任务的图像变换。我们首先通过将一些训练集图像移动到验证集来增加验证集的比例。之后,我们将使用 torchvision 的一些图像转换来处理训练集中的类别不平衡。在下面的代码片段中,我们将图像缩放到相同大小,然后应用各种转换来增加数据大小,并引入应增强我们模型鲁棒性的训练示例。get_augmented_data函数大量使用RandomRotation和RandomAffine转换来创建新的、修改后的训练图像,同时使用其他各种转换来格式化和归一化图像。
TRAIN_DIR = 'chest_xray_preprocessed/train'
IMAGE_SIZE = 224 # Image size of resize when applying transforms
BATCH_SIZE = 32
NUM_WORKERS = 4 # Number of parallel processes for data preparation
def get_augmented_data():
sample1 = ImageFolder(TRAIN_DIR,
transform =\
transforms.Compose([transforms.Resize((224,224)),
transforms.RandomRotation(10),
transforms.RandomGrayscale(),
transforms.RandomAffine(
translate=(0.05,0.05),
degrees=0),
transforms.ToTensor(),
transforms.Normalize(
[0.485, 0.456, 0.406],
[0.229, 0.224, 0.225]),
]))
...
return train_dataset
由于数据增强的基本思想是创建更多的图像,让我们来检查一下结果:
# check new dataset size
print(f'Normal : {normal} and Pneumonia : {pneumonia}')
(3516, 3758)
图 7-3 展示了使用旋转和平移生成的一些合成训练样本。

图 7-3. 使用旋转和平移生成的合成训练样本
看起来差不多了。处理了类别不平衡和数据增强后,我们将继续进行模型训练。
警告
确保数据增强不会生成不现实的训练样本。胸部 X 光片会显示颜色尺度、缩放等变化。然而,围绕垂直轴翻转图像将是一个巨大的错误,因为我们的器官在左右两侧不对称。在部署后,这个模型将不会看到心脏位于右侧的胸部 X 光片,因此不应该使用垂直翻转的图像进行训练。
我们为数据集使用的另一种预处理技术是图像裁剪。我们对训练集中的一些图像进行了裁剪,以突出只有肺部区域(见图 7-4)。裁剪有助于消除胸部 X 光图像上的任何注释或其他类型的标记,并将模型集中在图像中感兴趣的区域。我们将这些图像保存为单独的数据集,以便在后续训练阶段对网络进行微调使用。
警告
直到我们手动裁剪了数百张图像的练习,我们才注意到训练数据包含同一患者的多次扫描。因此,当我们将图像添加到验证数据时,我们必须确保在训练数据或验证数据中保留相同的患者,但不同时存在。这个细节是数据泄漏的一个很好的例子,强调了真正了解我们的数据的重要性。

图 7-4. 胸部 X 光图像裁剪前后的图像
模型训练
卷积神经网络(CNNs)是医学图像中常用的架构。图像分类的一些知名 CNN 的例子包括ResNets、DenseNets和EfficientNets。从头开始训练一个 CNN 非常昂贵,无论是在数据还是计算时间上。因此,一个流行的技术是使用先前在大规模图像数据集上训练过的模型,例如ImageNet,然后将该网络作为另一个任务的起点重用。
这种技术的核心思想是,CNN 中的低层次学习广泛适用的表示,如边缘和角落,可以推广到各种任务中。当我们为自己的任务使用 CNN 的层时,我们称之为预训练。另一方面,较高层次捕获的特征更高级且更具体于任务。因此,这些层的输出不适合我们的用例。因此,我们可以冻结在低层次学习的特征,并在称为微调的步骤中重新训练较高层次。预训练和微调共同构成了一种简单的迁移学习形式,在这种形式中,ML 模型在一个领域学习的知识被用于另一个领域。
起初,我们将使用DenseNet-121架构,该架构在 ImageNet 数据集上训练。已经显示 DenseNet 模型在 X 光图像分类方面表现特别出色,因为它们改善了信息和梯度在网络中的流动,理想情况下增加了分类器的性能和泛化能力。
警告
不要忘记关于EvilModel。已经表明,恶意软件可以通过预训练的神经网络传递。这类恶意软件可能不会影响性能,并可能欺骗反病毒软件。(或者我们可能会懒得扫描我们的模型工件。)第五章的教训告诉我们,不要对我们从互联网下载的预训练模型抱有任何假设。
在执行迁移学习时,一个重要的问题是是否重新训练预训练模型的所有层或仅部分层。这个问题的答案在于数据集的组成。新数据集足够大吗?它是否类似于预训练模型所训练的数据集?由于我们的数据集较小且与原始数据集差异很大,因此重新训练一些较低层次和较高层次是有意义的。这是因为低层次学习相对通用的特征,而高层次学习更多特定于数据集的特征。在这种情况下,重新训练层次并不意味着从头开始或使用随机权重;相反,我们将利用预训练的权重作为起点,然后从那里继续。
在以下代码中,我们解冻预训练模型的所有层,并用我们自己的线性分类器替换最后一层。对于这个数据集,这种设置在测试数据上表现最佳。我们还尝试过仅解冻少数层,但它们都没有超过我们的第一种设置:
classes = ['Normal', 'Pneumonia']
model = torchvision.models.densenet121(pretrained=True)
# Unfreeze training for all "features" layers
for param in model.parameters():
param.requires_grad = True
# New layers automatically have requires_grad = True
in_features = model.classifier.in_features
model.classifier = nn.Linear(in_features, len(classes))
最后,我们第二次对模型进行了微调,仅使用我们手动裁剪以便聚焦于肺部的图像。这种双重微调过程看起来是这样的:
-
载入预训练的 DenseNet-121 模型。
-
使用未裁剪图像对扩增数据集进行模型训练。
-
冻结模型的早期层,并继续在裁剪图像上进行训练。
这个双重微调过程的理念是利用预训练模型学到的特征以及我们领域特定数据集中的特征。最后,使用裁剪图像进行最后一轮训练有助于减少模型使用那些不适用于未见数据的特征的风险,例如肺部之外的 X 光伪影。
评估与度量
在验证集上评估模型的性能。在表格 7-1 和 7-2 中,我们还报告了一些未见测试数据集上的性能指标。评估这种性能对于理解我们的模型是否会良好泛化至关重要。
表格 7-1. 显示肺炎分类器模型在测试数据集上的混淆矩阵
| 预测正常 | 预测肺炎 | |
|---|---|---|
| 实际正常 | 199 | 35 |
| 实际肺炎 | 11 | 379 |
表格 7-2. 测试数据集上的附加性能指标
| 流行率 | 精度 | 召回率 | F1 分数 | |
|---|---|---|---|---|
| 正常 | 234 | 0.95 | 0.85 | 0.90 |
| 肺炎 | 390 | 0.92 | 0.97 | 0.94 |
这里的性能看起来不错,但务必查看第九章以了解虚拟验证和测试测量可能会误导。现在是时候开始解释我们模型的预测了。
使用 Captum 生成事后解释
在本节中,我们将详细讨论一些事后技术,并展示它们在我们的肺炎图像分类器中的应用。生成的解释都是局部的,适用于单个观测——患者的单张 X 射线图像。此外,所有的解释都将以热图的形式呈现,其中每个像素的颜色意味着该像素对最终分类的重要性成比例。在接下来的章节中,我们将以批判的眼光检验这些方法是否实现了这一目标,但本节的目的首先是展示各种技术可能产生的输出类型。
要实现不同的技术,我们将使用Captum。Captum 是一个建立在 PyTorch 上的模型解释库,支持多种模型的开箱即用。它提供了许多解释算法的实现,这些算法与各种 PyTorch 模型良好地配合。
遮挡
遮挡是一种基于扰动的方法,其工作原理很简单:从模型中删除特定的输入特征,并评估在移除前后模型预测能力的差异。更显著的差异意味着该特征很重要,反之亦然。遮挡涉及替换输入图像的某些部分,并检查对模型输出的影响。通常通过在图像上滑动预定义大小和步幅的矩形窗口来实现。然后,将该窗口替换为每个位置的基线值(通常为零),从而产生灰色补丁。当我们在图像上滑动这个灰色补丁时,我们遮蔽了图像的部分,并检查模型在修改后数据上进行预测时的信心或准确性。
Captum 文档描述了其对遮挡的实现,并将其应用于单个输入图像的胸部 X 射线案例研究。请注意,我们可以指定遮挡窗口的大小以及步幅的大小,在我们的情况下分别为 15 × 15 和 8:
import captum, Occlusion
from captum.attr import visualization as viz
occlusion = Occlusion(model)
attributions_occ = occlusion.attribute(input,
target=pred_label_idx,
strides=(3, 8, 8),
sliding_window_shapes=(3,15, 15),
baselines=0)
在图 7-5 中,我们展示了测试集中一幅显示肺炎的图像的归因,该图像被模型正确分类为肺炎。
结果看起来很有希望。模型似乎已经捕捉到了两个肺部上部区域的高不透明度。这可能会让解释专家对模型的分类产生信心。然而,暗区域很大且缺乏细节,这表明较小的遮挡窗口和步长可能会显示更多细节。(我们犹豫不决是否尝试不同的设置,因为一旦我们开始调整这些解释的超参数,就会面临这样的风险,即我们可能只选择那些确认我们对模型如何工作的先前信念的值。)

Figure 7-5. 阻塞热图是测试集中肺炎 X 光图像的一个示例,正确预测显示有肺炎
除了这个调整问题外,解释还显示模型关注躯干边界外一些像素组。这是否是我们模型的问题,也许表明过拟合;训练和测试数据之间的数据泄露;或者捷径学习?或者这是解释技术本身的产物?我们只能左右思考。让我们看看基于梯度的方法是否能提供更多的清晰度。
警告
捷径学习是复杂模型中常见的问题,可能会破坏我们的实际结果。当模型在 ML 任务中学习某些比实际预测目标更容易的东西时会发生这种情况,实质上在训练期间欺骗自己。由于从图像进行医学诊断可能是一项费时的任务,即使对于经验丰富的人类从业者而言,ML 系统通常也会找到帮助其在训练数据中优化损失函数的捷径。当这些学习到的捷径在真实世界的诊断场景中不可用时,这些模型就会失败。要了解更多关于医学图像中的捷径学习,请查看“应用于胸部 X 光片的深度学习:利用和预防捷径”。要了解这个困扰几乎所有无法解释 ML 的严重问题的一般背景,请查看“深度神经网络中的捷径学习”。
输入 * 梯度
我们将首先看一下基于梯度的方法,这是输入 * 梯度技术。顾名思义,输入 * 梯度创建了一个局部特征归因,它等于预测相对于输入的梯度,乘以输入值本身。为什么这样做?想象一个线性模型。梯度和输入值的乘积分配了一个局部特征归因,它等于特征值乘以特征系数,这对应于特征对特定预测的贡献。
这次我们使用 Captum 为同一测试集图像生成了一个热图,使用了输入 * 梯度技术。在图 7-6 中,我们展示了分类的 正面 证据。

Figure 7-6. 输入 * 梯度热图是测试集中肺炎 X 光图像的一个示例,正确预测显示有肺炎
有关此输出的评论?就像在遮挡物上一样,我们可以凝视图像并辩称它表达了某种有意义的东西。特别地,在肺部有一个暗斑点,显示出高证据,似乎对应左侧胸部 X 射线上的高不透明度。这是我们期望并希望从我们的肺炎分类器中得到的行为。然而,解释技术还表明,患者脊柱的长度也包含肺炎高证据区域。我们留下了早些时候提出的相同问题。这是否告诉我们模型正在关注错误的东西,即捷径?这将使这个模型调试的输出变得有用。另一方面,我们仍然不知道解释技术本身是否是不直观结果的源头。
综合梯度
综合梯度是我们将考虑的第一种具有一些理论保证的技术。仅仅依靠梯度可能是误导性的,特别是因为对于一些高置信度的预测,梯度趋向于零。对于高概率结果,输入特征可能导致激活函数达到高值,使得梯度饱和、平坦且接近于零。这意味着如果我们仅看梯度,某些决策中最重要的激活函数将不会显示出来。
综合梯度试图通过测量相对于基线值的特征影响来修复此问题,跨所有可能的输入像素强度值。特别地,综合梯度问:“当我们从基线输入像素强度值穿过路径到更大的输入像素强度值时,梯度如何变化?”最终的特征归因是梯度在这条像素值平滑路径上的近似积分,作为模型预测函数的一部分。
综合梯度满足敏感性和实现不变性的公理。敏感性意味着如果输入图像和基线图像仅在一个特征上有所不同,并且它们返回不同的模型输出,则综合梯度将为该特征返回非零归因。实现不变性表示如果两个模型,可能具有不同的内部结构,对所有输入都返回相同的输出,则综合梯度返回的所有输入归因将相等。实现不变性是从第二章讨论一致性的另一种方式。有关这个主题的良好介绍,请查看 TensorFlow 对综合梯度的介绍。
在图 7-7 中,我们展示了相同肺炎图像上这种归因技术的输出。像输入梯度的输出一样,图像是嘈杂且难以解释的。看起来这种方法正在捕捉输入图像中的边缘*。除了 X 光机标记和腋窝外,我们还可以看到热图中病人肋骨的微弱轮廓。这是因为模型正在忽略肋骨,窥视肺部周围吗?这些输出似乎带来更多问题而不是答案。在本章后面,我们将通过一些实验来批判性地评估这些解释输出。现在,我们将转向第四种也是最后一种技术,另一种基于梯度的方法,即分层相关传播。

图 7-7. 在测试集中,正确预测显示肺炎的肺部 X 光图像的集成梯度热图
分层相关传播
分层相关传播(LRP)实际上是一类衡量特征对输出相关性的方法。广义上讲,相关性是输入特征与模型输出之间连接的强度,可以在不对输入特征进行任何更改的情况下进行测量。通过选择不同的相关性概念,我们可以得到多种不同的解释输出。对于对 LRP 更深入了解的读者,我们推荐阅读 Samek 等人编著的《可解释 AI:深度学习的解释、解释和可视化》一书中的章节“分层相关传播概述”。在那里,您将找到对不同相关性规则及其适用时机的全面讨论。可解释 AI 演示仪表板还允许您使用各种 LRP 规则生成解释输出。
LRP 的好处在于它生成的解释在局部上是准确的:相关性分数的总和等于模型输出。在这方面它类似于 Shapley 值。让我们看一下图 7-8 中我们测试集图像的 LRP 解释。不幸的是,它在生成人类可验证的解释方面仍然有很大的提升空间。

图 7-8. 在测试集中,正确预测显示肺炎的肺部 X 光图像的 LRP 热图
像其他技术一样,LRP 已经捕捉到右肺中较高不透明度区域,但它也将高归因分数给了肺部外的区域。
评估模型解释
在前面的章节中,我们只是浅尝辄止地探讨了 DL 模型的解释归因方法。这些技术种类繁多且不断增长。在本节中,我们将探讨一个重要问题:“我们如何知道我们的解释是否合理?”然后,我们将进行实验,批判性地检验后续技术对我们的 CNN 模型提供了多少信息。
David Alvarez-Melis 和 Tommi S. Jaakkola 在他们的两篇 2018 年论文中,对评估解释问题进行了很好的探讨,分别是 “关于解释性方法的鲁棒性” 和 “自解释神经网络的鲁棒解释性”。在第二篇论文中,Alvarez-Melis 和 Jaakkola 提出了解释应该具备的三个理想特性:
-
解释应该易于理解(明确性/可理解性)。
-
它们应该指示真正重要的内容(忠实性)。
-
它们应该对输入的微小变化不敏感(稳定性/鲁棒性)。
我们在本章中检查过的热图技术显然在第一点上表现不佳。首先,这些技术的输出嘈杂且令人困惑。更重要的是,我们调查的所有技术似乎都指向了荒谬的区域,例如患者体外的空间。
即使输出完全符合我们的直觉,这些热图仅表明模型在哪里找到正面或负面证据支持其分类;它们没有提示模型基于提供的信息做出决策的方式。这与可解释模型(如 SENN 或 ProtoPNet)形成对比,后者既提供“在哪里”的原型或基本概念,又提供“如何”的线性组合。如何是一个好解释的关键元素。
注意
我们应始终在高风险应用中测试我们的解释方法。理想情况下,我们应该将后续解释与底层可解释模型机制进行比较。对于更标准的 DL 方法,我们可以使用以下方法:
-
领域专家和用户研究测试可理解性。
-
去除被视为重要的特征,最近邻方法或标签重排以测试忠实性。
-
扰动输入特征以测试鲁棒性。
使用 “自解释神经网络的鲁棒解释性” 和 “评估深度神经网络学到了什么可视化的方法” 作为参考资料。
忠实度通常通过遮盖或删除被认为重要的特征,并计算分类器输出的变化来测试。Alvarez-Melis 和 Jaakkola 表明,在不同的技术和数据集中,解释的忠实度存在广泛的差异,Shapley 添加性解释和其他一些方法表现相当糟糕。我们还可以使用最近邻方法,其中类似的输入观察应具有类似的解释,来评估忠实度。在下一节中,我们还将检验解释中的忠实度——但我们将尝试不同的方法。
要检验鲁棒性(或稳定性),Alvarez-Melis 和 Jaakkola 稍微扰动输入图像,并测量解释输出的变化。武装了一个定量指标后,他们比较了多种事后方法在多个数据集上的表现。结果显示,他们研究的大多数事后技术对输入的微小变化不稳定。局部可解释的模型无关解释(LIME)表现特别糟糕,而集成梯度和遮挡方法在所研究的技术中表现出最好的鲁棒性。在所有这些评估维度——可理解性、忠实度和鲁棒性——自解释神经网络等可解释模型胜过事后技术。
事后解释的鲁棒性
在本节中,我们部分复制了 “Saliency Maps 的健全性检查” 中令人震惊的不忠实结果。在那篇论文中,作者们关心的问题是:“这些事后解释方法生成的输出实际上是否告诉我们模型的任何信息?”正如我们将在这个实验中看到的那样,有时结果是一个明确的“不”。
为了开始我们的实验,我们训练了一个无意义的模型,其中图像具有随机标签。在 图表 7-9 中,我们可以看到对于一个新模型的高训练损失和低准确率曲线,该模型是在图像标签已随机排列的数据集上训练的。对于这个实验,我们没有进行任何数据增强来处理类别不平衡。这解释了为什么验证数据的准确率收敛到大于 0.5 的值——该模型偏向于多数类(肺炎)。
现在我们有一个模型,该模型经过无意义标签的训练。我们新模型生成的预测结果不可能比(加权的)抛硬币更好。为了原始解释有意义,我们希望这些解释不会捕捉到相同的信号。图表 7-10、7-11 和 7-12 分别显示了我们测试集图像的解释,这些解释是在训练过的模型上生成的,该模型是在随机打乱的数据上训练的,由输入 * 梯度、集成梯度和遮挡方法产生。

Figure 7-9. 在标签被随机重排的数据上训练时的模型性能(数字,彩色版本)

Figure 7-10. 随机重排类标签后的输入 * 梯度热图

Figure 7-11. 随机重排类标签后的集成梯度热图

Figure 7-12. 随机重排类标签后的遮挡热图
在我们看来,这些结果与前几节的结果惊人地相似。在所有的图像中,这些技术再次突出显示了图像中无关的区域,如患者的脊柱和其躯干的边界。更糟糕的是,这些归因地图在肺部内部看起来与它们之前的结果非常相似。它们捕捉到了患者肋骨的轮廓和高密度区域。之前,我们解释这意味着模型可能基于肺部炎症特定区域生成其肺炎预测。然而,这个实验显示,这些方法将为一个在零有意义信号训练的模型展示相同的解释。我们的解释究竟忠实于什么?我们不确定。
为了进一步检验我们解释的鲁棒性,我们进行了一个简单的实验,即向输入图像添加随机噪声。这可以通过 torchvision 中的自定义转换轻松完成。然后,我们检查这些输入上的解释,并将它们与先前的解释进行比较。噪声的量调节得当,使得图像的预测类在添加噪声组件之前和之后保持不变。
我们真正想要理解的是,结果解释是否对添加随机噪声具有鲁棒性。简言之,情况复杂;请参见图 7-13、7-14 和 7-15。新的归因地图与在原始模型上生成的地图明显不同,但似乎保留了对肺部内高密度区域的关注。

Figure 7-13. 添加随机噪声后的输入 * 梯度热图

Figure 7-14. 添加随机噪声后的集成梯度热图

Figure 7-15. 添加随机噪声后的遮挡热图
查看例如图 7-15 中的遮挡热图。之前我们说过,令人鼓舞的是遮挡似乎已经捕捉到了肺部内较高密度的区域。在添加了随机噪声后,我们仍然看到焦点集中在肺部左上和右上方。然而,噪声的添加已经使得遮挡输出更多地强调了靠近颈部的区域。基于梯度的技术输出同样受到了干扰,但仍然保留了对右肺中部的强调。
在“检验显著性图的健全性”中,作者指出了对我们在这些实验中看到的结果可能的解释:这些归因技术实际上正在执行边缘检测。也就是说,无论模型训练和架构如何,这些归因方法都能够检测到输入图像中的边缘,其中梯度几乎总是显示出急剧变化。这可以解释我们一直观察到的对肋骨轮廓的强调,以及对躯干边界区域的强调。如果不清楚的话,检测边缘并不是模型解释,并且可以在不使用深度学习的情况下轻松完成。
结论
底线是,事后解释通常很难解释,有时毫无意义。更糟糕的是,解释技术的多样性意味着,如果我们不小心,我们将会陷入确认偏见,并最终选择与我们对模型行为的先前信念相符的那个解释。我们同情——在深度学习背景下构建可解释模型确实非常困难。但本章显示,事后解释可能只是对理解的一种危险错觉,因此并不总适用于解释高风险决策。
我们建议不要仅仅依赖事后技术来解释在高风险应用中的深度学习模型。最多,这些技术可以作为有用的模型调试工具。我们将在第 9 章中更详细地讨论这个话题。相反,当我们需要忠实、稳健和可理解的解释时,我们应该努力使用可解释模型。如果以后需要,我们总是可以在这种更为稳健的模型可解释性基础上构建事后解释的可视化,并且我们将能够检查事后可视化是否与底层模型机制一致。
在可解释的 DL 模型方面存在鼓舞人心的前沿,用于图像分类和其他任务。原型基础的案例推理模型,如ProtoPNet,以及稀疏附加深度模型,如SENN,为可解释的 DL 提供了前进的路径。然而,现成的可解释模型并不广泛适用于 DL 应用。它们通常对我们的数据和建模专业知识提出更高要求。我们鼓励读者将这视为一个特性,而非一个错误。AI 系统的开发应该需要高质量、经过精心策划的数据。模型应该是问题特定的,并且编码了最大的领域知识。
当他们说时,我们同意“目前在健康护理中关于可解释人工智能的方法的虚假希望”的作者:
在缺乏合适的可解释性方法的情况下,我们主张通过严格的内部和外部验证 AI 模型,作为实现通常与可解释性相关目标的更直接手段。
在接下来的两章中,我们将建立在我们在这里和在第六章中讨论的技术基础上,以解决更广泛的模型调试问题。
资源
代码示例
深度学习工具的透明度
第八章:选择和调试 XGBoost 模型
数据科学家衡量模型在现实世界表现的方式通常是不充分的。据谷歌及其他领先的机器学习研究机构的 40 位研究人员在《“Underspecification Presents Challenges for Credibility in Modern Machine Learning”》中指出,“当 ML 模型在实际应用中部署时,其表现通常会出现意外的差异”。一个根本性问题在于,我们衡量性能的方式就像我们在撰写研究论文一样,无论部署场景多么复杂且高风险。像准确率或曲线下面积(AUC)这样的测试数据测量并不能告诉我们有关公平性、隐私性、安全性或稳定性的多少。这些对静态测试集的简单预测质量或错误测量对风险管理而言并不够信息化。它们只与实际表现相关,并不能保证在部署中表现良好。简言之,我们应更关注体内表现和风险管理,而非体外测试数据性能,因为 ML 实践的主要推动力之一是在现实世界中做出良好的决策。
本章将介绍一些超越传统模型评估的方法,以选择更好地泛化的模型,并将模型推向极限以发现隐藏的问题和故障模式。该章节从概念复习开始,提出了一个增强的模型选择过程,然后专注于模型调试练习,这些练习更好地模拟现实世界的压力,以及使用残差分析揭示模型错误的敏感性分析和测试。模型调试的总体目标是增强对模型在现实世界中性能的信任,但在此过程中,我们还将增强模型的透明度。本章附带的代码示例可在在线获取;第九章处理图像和非结构化数据的调试,而第三章则广泛涵盖了模型调试。
概念复习:调试机器学习
如果读者还没有注意到,我们更关注体内表现,而不是体外表现。体内表现对用户很重要;而体外表现则无关紧要。以这一核心原则为指导,我们将涵盖模型选择、敏感性分析测试、残差分析以及修正(即修复)模型。
模型选择
传统上,我们通过选择特征和选择超参数来选择模型。我们尝试使用诸如逐步回归、特征重要性测量或 L1 正则化等方法找到最佳特征集。我们通常使用网格搜索来找到我们机器学习模型的最佳超参数设置。在第二章,我们采用了一种更为深思熟虑的方法,从线性模型基准开始,引入非线性和交互作用到我们的模型中,然后使用人为判断选择我们最喜欢的模型。在本章中,我们将看到,对于超参数选择,随机网格搜索在小数据集上尤为棘手,特别是当我们将其与灵感来自“KDD-Cup 2004: Results and Analysis”的更复杂的交叉验证排名程序进行比较时。我们将比较模型性能在多个验证折叠和多个不同传统评估指标中的排名,以更好地估计体内性能并选择更好的模型。我们还将强调如何估计模型的业务价值——这是一个至关重要的考虑因素。商业世界中没有人想要部署会赔钱的模型!
敏感性分析
因为机器学习模型往往以复杂的方式进行外推,除非我们明确在不同类型的数据上进行测试,否则我们不会真正知道我们的模型在未见数据上的表现如何。这就是我们试图通过敏感性分析来做的事情。广义上讲,敏感性分析告诉我们我们的模型在不同类型数据上是否稳定。敏感性分析可能会显示我们的模型存在鲁棒性问题,即在数据漂移下失败。它可能会显示我们的模型存在可靠性或弹性问题,即某些类型的输入导致我们的模型表现出令人意外或不合适的方式。关于敏感性分析,有许多结构化方法。如果读者想要了解更多信息,我们建议探索与PiML或SALib相关的资源。
在本章中,我们将重点介绍另外两种相关的敏感性分析方法,它们似乎对从业者最直接有用:应力测试和对抗样本搜索。应力测试大致与测试鲁棒性对齐,而对抗样本搜索则探索可靠性和弹性问题:
应力测试
压力测试是一种全局扰动方法,用于在可预见的紧张环境中测试模型。当我们对模型进行压力测试时,我们将改变验证数据以模拟经济衰退条件,并查看它是否在这些可预见的困难条件下保持稳健。这个想法是使我们的模型能够应对可预见的情况,或者至少为可能维护模型的人员记录预期的性能下降,当经济衰退或其他类型的领域转变发生时。¹ 我们将对单一模型进行一种不那么严格的分析,但思路是一样的:测试我们的模型在可预见的概念或数据漂移(如经济衰退)下的表现,以确保我们为最有可能的失败做好准备。
对抗性示例搜索
对抗性示例搜索是一种局部扰动方法,有助于揭示模型可靠性和潜在安全漏洞(即韧性问题)中的局部逻辑缺陷。对抗性示例是数据行,会导致复杂机器学习模型产生奇怪的响应。有时我们可以手工制作这些行,但通常我们需要搜索它们。在本章中,我们将通过扰动或改变某些数据行中重要特征的值来搜索它们,并检查此变化如何影响模型性能。搜索本身以及我们发现的个别对抗性示例都是有用的。搜索创建一个响应表面,显示模型在许多有趣输入值上的性能,并经常揭示模型性能的逻辑缺陷。我们发现引发奇怪响应的个别行很好地记录并与安全同事分享,以便模型监控能够检测已知的对抗性示例。
在深度学习中,数据科学家倾向于使用梯度信息和生成对抗网络(GANs)来创建对抗性示例。在结构化数据任务中,我们必须使用其他方法,比如“表格数据的对抗攻击:应用于欺诈检测和不平衡数据”中描述的基于个体条件期望的启发式方法或遗传算法。我们将在“对抗性示例搜索”中追求一种启发式方法,既能找到对抗性示例,又能探索我们模型的响应表面以寻找问题。
在本章中我们没有处理的最重要的方法是随机攻击,或者简单地将我们的模型或 API 暴露给大量随机数据,并查看出现什么样的问题。如果我们不知道从哪里开始进行敏感性分析,我们首先尝试随机攻击。然后我们尝试 PiML、SALib 和接下来章节中将提出的方法。无论我们如何实施敏感性分析,关键是针对我们发现的问题采取行动。我们通常使用数据增强、业务规则、正则化、约束和监控来解决敏感性问题。
残差分析
残差分析是模型调试的主要方法。这是对在训练数据中出现的建模错误或其他标记数据进行仔细研究,用于测试和调试的目的。尽管读者可能熟悉传统线性模型的残差分析,但它同样适用于机器学习模型。基本思想与线性模型相同。良好的模型应该具有大部分是随机误差。当我们检查我们的机器学习模型中的误差并出现强烈模式时,这很可能意味着我们遗漏了某些内容或在建模过程中出现了错误。然后我们必须动用我们的大脑来尝试解决问题。在本章中,我们将集中讨论三种主要的残差分析方法——残差图、分段误差分析和建模残差:
残差图
我们将对整个模型的残差图进行检查,然后按特征和水平分解这些图。我们将试图回答以下问题:哪些行造成了最大的误差?在残差图中是否看到任何强烈的模式?我们能够将任何模式孤立到特定的输入特征或特征的级别吗?然后我们将设法思考如何修复我们发现的任何问题。
分段误差分析
在部署模型之前,我们不应该忽视其在训练或测试数据的主要段上的表现。如果不这样做,可能会对整体模型性能和算法歧视产生严重后果,尤其是当模型在历史上被边缘化的人群中表现不佳时。本章节将重点关注性能方面,并研究除人口统计分段外的其他类型的段。我们这样做是因为通常用于整个数据集的平均评估指标可能会掩盖对小但重要的子群体的不良表现。训练数据的稀缺性也可能导致在某些段上表现几乎随机。分段误差分析也被提出作为对欠规范问题的一种体外测试。所有这些问题——在小段上的性能不佳、在训练数据稀疏区域的随机性能以及欠规范——都可能导致在部署模型后出现不愉快的意外和严重问题。在 PiML 中实施的分段误差分析的一个很酷的扩展是检查各个段的过拟合情况。这样做可以突显会影响体内模型的其他问题。
建模残差
学习残差中的模式的另一种方法是对其进行建模。如果我们能够将一个简单直观的模型拟合到另一个模型的残差中,那么,几乎可以说,残差中存在强烈的模式。而且,建模残差意味着我们可以减少它们。我们拟合到残差的模型还应该帮助我们修复发现的错误。例如,我们将为我们模型的残差拟合一个决策树。然后,我们将检查该树的规则,因为这些规则描述了我们的模型通常出错的情况。我们将尝试理解这些规则,以尝试解决它们突出的问题。
与敏感性分析一样,我们无法在一章中涵盖所有机器学习中进行残差分析的重要方法。一些最显著的方法包括发现非鲁棒特征的方法,例如 Shapley 值对模型损失的贡献。请参阅第三章,了解更广泛的机器学习残差分析概述。
补救措施
一旦发现问题,我们就需要解决它们。坏消息是,机器学习中很多问题源于低质量、偏见数据的使用以及确认偏见。对于大多数项目来说,这将涉及到接受两个难以忍受的现实:(1)收集更好的数据,至少考虑一些实验设计,和(2)回到起点,重新定义我们的实验,更好地遵循科学方法,以减少我们建模工作流中的人为、统计和系统性偏差。
一旦我们的工作流中解决了严重的数据、方法论或偏见问题,我们就可以尝试一些技术修复我们模型的方法,正如我们在本章中所做的那样。例如,我们可以应用单调约束、交互约束或正则化到我们的模型中,以稳定它们,使它们更具逻辑性和可解释性,并提高在实际应用中的性能。我们可以应用业务规则,有时也称为模型断言,或手动预测限制来修复可预见的不良结果。业务规则和模型断言归结为向我们的评分引擎添加代码,以更改我们认为将会出错的预测。我们可以编辑我们模型的公式或生产代码,以纠正问题建模机制或预测,并且一旦部署了模型,我们可以管理和监控它们,以快速发现异常。
对于本章中的模型,我们希望通过表达我们模型结果的假设,主要通过单调约束和非常严格的模型选择来遵循科学方法,如下一节所讨论的。我们将对模型应用敏感性和残差分析,以发现错误,并且我们将尽力在“修复所选模型”中解决这些错误。
选择更好的 XGBoost 模型
虽然从技术上讲这不是调试,但我们希望从选择一个高度稳定、通用且有价值的模型开始我们的调试练习。为了做到这一点,我们不仅仅依赖于网格搜索。相反,我们将选择一种模型,灵感来自于 2004 年数据库知识发现(KDD)杯中使用的Caruana et al. 交叉验证排名方法。我们还将这些结果与标准的随机网格搜索进行比较,以便了解网格搜索与本节描述的交叉验证排名过程之间的差异。然后,在进行敏感性分析之前,我们将对模型的商业价值进行基本估算,以确保我们不会浪费金钱。
注意
根据理查德·费曼的说法,作为科学家,我们有责任进行“一种倾向于的倾斜”,以确保我们不会欺骗自己和他人。如果这种模型选择方法看起来有些过分,可以把它看作是为了尽力找到最好的模型而做出的努力。
首先,我们开始模型选择过程是将验证数据分为五折。然后我们选择五个相关的性能指标来应用到每个折叠上。这些指标应该测量性能的不同方面,比如 AUC 用于衡量跨阈值的排名能力,准确度用于衡量在一个阈值上的正确性。在我们的情况下,我们将最大准确度,AUC,最大 F1 统计量,对数损失和均方误差(MSE)作为我们的五个指标。我们选择过程的第一步是计算每个折叠上每个不同统计量的值。以下代码片段就是在做这件事:
eval_frame = pd.DataFrame() # init frame to hold score ranking
metric_list = ['acc', 'auc', 'f1', 'logloss', 'mse']
# create eval frame row-by-row
for fold in sorted(scores_frame['fold'].unique()): # loop through folds
for metric_name in metric_list: # loop through metrics
# init row dict to hold each rows values
row_dict = {'fold': fold,
'metric': metric_name}
# cache known y values for fold
fold_y = scores_frame.loc[scores_frame['fold'] == fold, target]
# first columns are not for scores
for col_name in scores_frame.columns[2:]:
# cache fold scores
fold_scores = scores_frame.loc[
scores_frame['fold'] == fold, col_name]
# calculate evaluation metric for fold
# with reasonable precision
if metric_name == 'acc':
row_dict[col_name] = np.round(
max_acc(fold_y, fold_scores), ROUND)
if metric_name == 'auc':
row_dict[col_name] = np.round(
roc_auc_score(fold_y, fold_scores), ROUND)
if metric_name == 'f1':
row_dict[col_name] = np.round(
max_f1(fold_y, fold_scores), ROUND)
if metric_name == 'logloss':
row_dict[col_name] = np.round(
log_loss(fold_y, fold_scores), ROUND)
if metric_name == 'mse':
row_dict[col_name] = np.round(
mean_squared_error(fold_y, fold_scores), ROUND)
# append row values to eval_frame
eval_frame = eval_frame.append(row_dict, ignore_index=True)
一旦我们获得每个模型在每个折叠上的性能指标,我们就会进入选择过程的第二步,即对每个模型在每个折叠和每个测量上的性能进行排名。以下代码就是进行排名的过程。我们的搜索包括 50 个不同的 XGBoost 模型,并且我们使用五个性能指标对它们进行测试,每个模型测试五个折叠。对于每个折叠和指标,我们按照当前指标将模型从第一到第五十进行排名,允许出现并列情况。我们将每个折叠和指标上的平均排名最低的模型视为适用于体内使用的最佳模型。可以将其想象为给 50 名学生做测试,但不是每名学生只有一次测试,而是每名学生有五次测试。然后,我们并不会通过每个学生的数值成绩来决定是否通过,我们只对那位在最多测试中表现最好的学生感兴趣。当然,这样做可能会让我们显得非常苛刻,但幸运的是,在选择机器学习模型时,极度挑剔是可以的。
# initialize a temporary frame to hold rank information
rank_names = [name + '_rank' for name in eval_frame.columns
if name not in ['fold', 'metric']]
rank_frame = pd.DataFrame(columns=rank_names)
# re-order columns
eval_frame = eval_frame[['fold', 'metric'] +
[name for name in sorted(eval_frame.columns)
if name not in ['fold', 'metric']]]
# determine score ranks row-by-row
for i in range(0, eval_frame.shape[0]):
# get ranks for row based on metric
metric_name = eval_frame.loc[i, 'metric']
if metric_name in ['logloss', 'mse']:
ranks = eval_frame.iloc[i, 2:].rank().values
else:
ranks = eval_frame.iloc[i, 2:].rank(ascending=False).values
# create single-row frame and append to rank_frame
row_frame = pd.DataFrame(ranks.reshape(1, ranks.shape[0]),
columns=rank_names)
rank_frame = rank_frame.append(row_frame, ignore_index=True)
# house keeping
del row_frame
eval_frame = pd.concat([eval_frame, rank_frame], axis=1)
由于我们会四舍五入性能得分,所以会出现并列情况。例如,如果两个模型得分分别为 0.88811 和 0.88839,那么就会并列。对于体内表现来说,AUC 的最后小数点可能是不相关的,我们的方法可以很好地处理这些并列情况。得分相同的两个模型在该折叠和指标上的排名就会一样。因为我们尝试了那么多指标和得分,而且取所有指标的平均排名,所以这些并列情况最终很少影响选择最佳模型的结果。在我们的示例中,每个 50 个模型分别被分配 25 个不同的排名值,即每个指标和折叠各一个。我们最好的模型在几个折叠和指标的组合上排名第一和第二,但在其表现最差的折叠和指标上的排名也高达 26.5—表明存在并列情况。最终,在所有指标和折叠的最低排名方面,我们表现最佳的模型平均排名为 10.38。
为了比较目的,这种排名程序适用于所选的前 50 个模型,并且模型是通过标准的随机网格搜索进行排名的。在网格搜索中,使用验证数据上的最低对数损失来排名模型。当我们将网格搜索的排名与交叉验证的排名进行比较时,它们之间的差异是显著的(表 8-1)。
表 8-1. 根据对数损失排名的随机网格搜索的前 10 个模型的整体排名以及更深入的交叉验证模型选择方法
| 网格搜索排名 | 交叉验证排名 |
|---|---|
| 模型 0 | 模型 2 |
| 模型 1 | 模型 5 |
| 模型 2 | 模型 1 |
| 模型 3 | 模型 4 |
| 模型 4 | 模型 12 |
| 模型 5 | 模型 0 |
| 模型 6 | 模型 21 |
| 模型 7 | 模型 48 |
| 模型 8 | 模型 30 |
| 模型 9 | 模型 29 |
| 模型 10 | 模型 17 |
表中的网格搜索排名在左侧,而交叉验证方法的排名在右侧。表的第一行指示网格搜索中排名第三的模型(从 0 开始索引,即模型 2)在交叉验证排名中是最佳模型。这两种模型选择过程显示了 0.35 的 Pearson 相关系数,表明仅有中等正相关。简而言之,从网格搜索得出的最佳模型可能并非更深入的选择方法所选出的最佳模型。事实上,一个有趣的非正式研究使用了类似的技术来揭示在使用小数据集的数据科学竞赛中的稳定性问题。这种选择方法是开始“全力以赴”以增强机器学习模型选择练习的科学完整性的好方法。要了解我们是如何做到的,请查看本章的代码示例。
选择模型的另一个重要考虑因素是业务价值。建立模型需要花费大量资金。通常是很多钱。我们的薪水、医疗保健、退休金、零食、咖啡、计算机、办公空间和空调都不便宜。如果我们希望我们的模型取得成功,通常意味着要收回用于训练、测试和部署系统的资源。尽管真正理解我们模型的价值需要实时监控和衡量业务价值,我们可以使用一些技巧在部署前估计其价值。
要开始,我们为模型的结果分配估计的货币价值。对于分类器来说,这意味着为混淆矩阵的元素分配一个货币价值。在图 8-1 中,我们可以看到左侧是混淆矩阵的示意图,右侧是残差图的示意图。

图 8-1. 示例评估程序,包括分类器(a)和回归模型(b)的估计货币价值
左侧的混淆矩阵可以应用于我们选择的模型。我们通过思考模型的体内结果得出了单元格中的值。对于我们的模型来说,真正的正面意味着我们决定不向那些可能会拖欠付款的人员提供信用。这种情况没有机会成本或注销,但也没有正面收入。假阳性导致我们拒绝向那些将会支付的人提供信用——这是一种机会成本。我们将这种机会成本与估计的客户终身价值(LTV)负$23,000 联系起来。假阴性是最糟糕的结果。这意味着我们向未支付的人提供了信用。这是一种注销,我们估计这种价值基于客户信用额度(LIMIT_BAL)的平均值,约为负$85,000——痛苦。真阴性是我们赚钱的地方。这是模型建议我们向一个付款客户提供信用。我们将这种结果与假阳性相反联系起来,并为信用产品收回客户的 LTV。对于每个真阴性,我们可以获得$23,000 的收入。现在,我们必须为验证集中的每位客户加总这些值,因为每位客户将代表真正的正面、假阳性、假阴性或真阴性结果。对于我们的模型,在验证集所代表的小型投资组合中,该估算值为$4,240,000。因此,我们的模型确实有实际的业务价值,但在考虑所有相关的支出和税收后,并不是非常惊人。
对于回归模型,我们可以为过度预测和低于预测分配一个单一的值。或者,如在图 8-1 中所示,我们可以尝试以逻辑方式为过度和低于预测的每个残差单位分配一个货币价值。然后,我们计算数据集中每行的残差并总结模型的预估价值。一旦分配了货币价值,我们就可以回答基本的业务问题:“这个模型提供了任何真实价值吗?”既然我们认为我们选择了一个体面的模型,并且具有一些业务价值,让我们尝试使用敏感性分析找出其中的问题。
XGBoost 的敏感性分析
我们将在本节中通过敏感性分析开始对我们的模型进行全面测试。在本章中,我们选择了压力测试和对抗性示例搜索作为敏感性分析的详细示例。这两种技术对于广泛的应用具有直接适用性,并有助于发现不同类型的问题。压力测试寻找模型在整个数据集中的全局弱点,在可预见的压力情况下,如经济衰退。对抗性示例搜索帮助我们发现潜在的意外问题,如荒谬的预测或安全漏洞,通常是基于本地的逐行分析。
对 XGBoost 进行压力测试
线性模型进行线性外推,但 ML 模型在其训练领域之外的数据上几乎可以做任何事情。除非我们在正确的数据上对模型进行压力测试,否则我们将无法意识到这一点。例如,考虑在一个最高收入为 20 万美元的数据集上训练模型。如果模型遇到一个个人收入为 2000 万美元的情况,它会如何?它会崩溃吗?它会返回准确的结果吗?没有办法知道这一点,除非我们明确地进行测试。基础不难。模拟一行数据,放入 2000 万美元的收入,并通过我们的模型运行它,看看它的行为如何。当我们更彻底、更系统地进行这样的测试时,我们称之为压力测试。
警告
复杂的 ML 模型在超出其训练数据领域进行外推时通常表现不佳,但即使是更简单的模型也存在外推问题。基于树的模型在训练数据范围之外往往无法进行预测,而多项式模型在其训练数据领域的边缘可能会受到Runge 现象的影响。每当我们在训练数据领域之外使用标准统计或 ML 模型进行预测时,都存在风险。
压力测试是一种通过仿真数据来测试模型在外部、不利、体内场景(如经济衰退或大流行病)下抗性的仿真性锻炼。压力测试的基本思想是模拟代表现实未来情景的数据,然后重新进行传统模型评估,以查看模型的表现如何。这确保了 ML 模型能够抵御它们在野外可能遇到的相当可能的不利情况,并且能够应对新数据中不可避免的体内变化,通常称为数据和概念漂移。
数据科学家们经常说他们已经通过保留数据集验证了他们的模型,所以真的需要额外的压力测试吗?嗯,确实有需要,尤其是当模型将被部署并影响人们时更是如此。如果一个 ML 模型在遇到新数据中的常见压力时出现问题,那么拥有完美的仿真 AUC 的 ML 模型是毫无用处的。当我们在现实世界中部署 ML 模型时,我们必须考虑比简单的仿真测试错误更多的方面和情况。尽管预测未来很困难,但我们可以使用验证数据来模拟可预见的问题。然后我们可以看到模型在这些条件下的表现,记录任何问题,并在可能的情况下更新我们的模型以解决发现的任何问题。
应力测试的黄金标准是美联储的综合资本分析与审查(CCAR)。这是美国联邦储备系统每年进行的一项练习,旨在确保大型银行和金融机构具有足够的资本规划过程,并保持足够的资本以抵御经济冲击。例如,CCAR 在 COVID-19 大流行后进行了两次单独测试,以评估美国大银行的健壮性。尽管在极端模拟情况下这些银行资本充足,由于情况不确定,CCAR 结果仍要求对银行支付限制。在接下来的小节中,我们将从 CCAR 中汲取灵感,试图确定我们选定的 XGBoost 模型是否能够抵御经济衰退条件,这是信用模型常见且可预见的压力源。
应力测试方法论
经济衰退是一个国家经济大幅度下降的情况,持续数月。还记得 2008 年的金融危机以及最近由 COVID 大流行引起的经济放缓吗?我们想看看我们的模型在部署时如果发生经济衰退会表现如何。在本节中,我们将模拟经济衰退的情景,然后重新评估我们的受限和正则化的 XGBoost 模型的表现。如图 8-2 所示,该模型在应力测试前的验证和留置测试数据上表现良好。

图 8-2. 受限和正则化 XGBoost 模型在应力分析之前的 ROC 曲线(数字,彩色版本)
现在我们将创建原始数据集的副本,并将其重命名为data_recession_modified。我们将使用基本的经济和商业直觉改变这个数据集中某些特征的值,并应该能够模拟经济衰退的情景。
注意事项
难以模拟真实的分布外数据,因为不可能预先知道每个特征在新情况下如何共变。因此,最好与学科专家密切合作进行应力测试。比模拟应力测试数据更好的是在不利条件下回测模型的实际数据,例如 2008 年的全球经济衰退。
修改数据以模拟经济衰退条件
首先,我们将选择数据集中的一些观察结果进行修改。我们选择这些受影响的观察结果,可能是他们或家庭中的某人已经失去了工作。我们选择修改之前良好的 25%的客户:
data_recession_modified = data_recession[
data_recession['DELINQ_NEXT'] == 0].sample(frac=.25)
假设最近模拟的经济衰退已经到来,我们将假设这些观察结果已经拖欠了他们最近的付款:
payments = ['PAY_0', 'PAY_2']
data_recession_modified[payments] += 1
在这里,PAY_*代表各种还款状态。接下来,我们将每位客户的支付金额减少一千美元:
pay_amounts = ['PAY_AMT1', 'PAY_AMT2']
data_recession_modified[pay_amounts] = np.where(
data_recession_modified[pay_amounts] < 1000,
0,
data_recession_modified[pay_amounts]-1000)
在金融危机期间,银行经常收紧钱包的弦,其中一种方法是降低信用额度。我们现在将通过按照他们原始信用额度的固定比例降低受影响客户的信用额度,将此场景纳入我们的压力测试练习:
data_recession_modified['LIMIT_BAL'] *= 0.75
我们还将按固定比例减少这些客户的账单金额,以模拟较低的消费:
bill_amounts = ['BILL_AMT1','BILL_AMT2']
data_recession_modified[bill_amounts] *= 0.75
最后,我们假设这些受影响客户中的一部分会拖欠账户。特别地,我们将把一半目标变量从零翻转为一:
data_recession_modified['DELINQ_NEXT'] = np.where(
np.random.rand(len(data_recession_modified)) < 0.5,
1, 0)
将受影响的观察数据重新整合到其余数据中后,我们得到了一个数据集,模拟了我们的模型在真实世界中可能遇到的一些不利条件。现在是时候在这些模拟数据上查看性能指标了。在图 8-3 中,我们看到一旦对测试数据应用类似经济衰退的数据和概念漂移,性能出现了适度的下降。

图 8-3. 受限制和正则化的 XGBoost 模型压力分析后的 ROC 曲线(数字、彩色版本)
在遇到这些结果后的第一步是记录并与我们的团队和管理层分享它们。这使得可以基于信息做出是否部署模型的决策。如果经济状况看起来乐观,那么我们可能会合理地决定部署模型,但要知道,如果经济状况改变,模型需要迅速更新。更为细致的分析将涉及重新评估如果我们的 AUC 从 0.777 下降到 0.738 会承担的金融风险。我们能否承担因错误的信用决策增多而造成的损失?
一旦结果被记录并与利益相关者讨论,下一个步骤可能是尝试改进模型。如果经济情况看起来令人担忧,或者其他压力测试的结果更为严峻,那么这肯定会成为情况。正如读者可能已经从本章剩下的页数中猜到的那样,我们很快将发现这个模型的其他问题。我们将等待到本章结束前解决所有发现的问题。
在我们继续进行对抗性示例搜索之前,我们想再强调一件事情。在训练这个模型时,我们非常谨慎地采用了正则化、单调约束、网格搜索以及高度健壮的模型选择方法。这些决策很可能对模型在压力测试下的稳健性产生了积极的影响。没有这些规范训练的模型在压力测试中的表现可能会更差。无论如何,如果我们不测试影响现场部署的问题,我们就是在忽视它们。
对抗性示例搜索
我们将采用对抗性示例搜索作为我们下一个调试技术。我们搜索的目标有两个:一是找到对抗性示例,可以在模型部署后用来欺骗我们的模型;二是通过我们的搜索了解我们的模型——无论是好是坏。
对于图像数据,有许多包和软件可以帮助我们找到对抗性示例,但我们需要为结构化数据找到对抗者。虽然在使用生成对抗网络(GAN)和遗传算法来为结构化数据找到对抗者方面已经取得了一些进展,但我们将采用一种启发式方法。第一步是找到一行数据,作为对抗性示例的良好初始猜测。我们将通过 ICE 图来实现这一点。图 8-4 显示了预测概率的十分位数上的 ICE 曲线以及部分依赖性。
在图 8-4 中,我们可以看到与第 80 百分位相关联的 ICE 曲线显示出在PAY_0的值变化中预测值的最大摆动。因为我们知道这行数据可能会因为一个特征值的变化而导致预测值的大变化,所以我们将使用所选模型中预测概率第 80 百分位处的原始数据行来作为我们对抗性示例搜索的初始数据。更详细地说,对于每个重要变量,我们的对抗性搜索启发式方法如下:
-
计算模型预测的每个十分位数的 ICE 曲线。
-
找到预测摆动最大的 ICE 曲线。
-
分离与此 ICE 曲线相关联的数据行。
-
对于这行数据:
-
在行中扰动 1 至 3 个额外重要的变量。(对于超过 1 至 3 个变量的结果很难绘制。)
-
重新评分扰动后的行。
-
继续直到每个额外重要的变量在训练数据中循环完其域,并经历缺失或其他有趣的超出范围的值。
-
-
绘制和分析结果。

图 8-4. 选定 XGBoost 模型的部分依赖性和 ICE(数字,彩色版本)
我们已经解决了步骤 1 至 3,那么我们如何执行步骤 4 呢?我们将利用itertools.product()自动生成一组特征的所有可能的特征扰动,以供 Python 函数使用。此外,请记住,在使用原生 XGBoost API 时,我们始终需要向predict()函数提供额外参数(iteration_range)来应用模型选择:
adversary_frame = pd.DataFrame(columns=xs + [yhat])
feature_values = product(*bins_dict.values())
for i, values in enumerate(feature_values):
row[xs] = values
adversary_frame = adversary_frame.append(row, ignore_index=True, sort=False)
if i % 1000 == 0:
print("Built %i/%i rows ..." % (i, (resolution)**(len(xs))))
adversary_frame[search_cols] = adversary_frame[search_cols].astype(
float, errors="raise")
adversary_frame[yhat] = model.predict(
xgb.DMatrix(adversary_frame[model.feature_names]),
iteration_range=(0, model.best_iteration))
我们向搜索代码提供了验证数据和输入特征 PAY_0、PAY_2、PAY_AMT1 和 PAY_AMT2。选择这些输入特征是基于一个 Shapley 总结图,显示这些特征在预测贡献上具有最广泛的分布。在选定的输入上运行此代码的结果是几个响应表面的数据,可以用来查看我们的模型在可能有趣的情况下的行为。现在唯一剩下的事情是绘制和分析这些响应函数。图 8-5 显示了对抗性示例搜索的结果,由 ICE 曲线引导,并呈现了一些积极和消极的发现。
在积极的一面,每个响应表面都显示单调性。这些模拟确认了单调约束,在训练时提供并基于领域知识,仍然在训练期间持续存在。在消极的一面,还发现了一个潜在的逻辑缺陷。根据其中一个响应表面的说法,一旦客户最近支付(PAY_0)超过两个月,示例模型将会发出高违约概率的预测。需要注意的问题是,即使客户支付(PAY_AMT1)超过他们的信用额度,拒绝仍可能被应用。这种潜在的逻辑缺陷可能会阻止预付或对未能支付账单(例如在度假时)的良好客户进行过度处罚。虽然这种行为不一定有问题,但模型操作者肯定希望了解这一点。因此,我们需要将其添加到我们的模型文档中。
当然,还有实际对抗性示例的问题。别担心,我们找到了很多这样的例子。我们找到了许多数据行,可以引发低违约概率——约 5%——以及可以引发高违约概率——约 70%——和介于两者之间的情况。我们现在有了一整套可以从中提取的对抗性示例,可以从模型中获得几乎任何我们想要的违约概率。如果读者想知道这为什么重要,请参阅第 5 和 11 章关于机器学习安全性的内容。要查看所有的代码和结果详情,请查看本章的 代码示例。
注意
我们想要强调的另一种喜爱的敏感性分析技术是一种行业诀窍,涉及标签重排:
-
随机重排目标特征并重新训练模型。
-
重新计算特征重要性。
-
考虑移除那些对随机重排目标预测重要的特征。
这帮助我们找到并移除非稳健特征。

图 8-5. 对抗性示例搜索显示了模型在多种场景下的行为(数字版,彩色版)
在调试时,我们总是希望考虑解决我们发现的问题。围绕预付款周围的逻辑问题可能可以通过业务规则或模型断言来处理。例如,如果客户进行大额预付款并告知银行他们要前往热带岛屿,随后发出的违约概率可能会在几个月内降低。至于对抗性示例,最有效的对抗性行为可能会记录在模型文档中,并附有示例,以便将来的维护人员能够了解这些潜在的模型问题。我们甚至可以与安全团队的同事讨论对抗性示例攻击,并考虑实时监控对抗性示例。
XGBoost 的残差分析
现在,我们已经通过对抗性示例搜索查看了可能对我们模型造成问题的局部扰动,以及使用压力测试查看了问题性全局扰动。现在是时候转向残差分析了。为了做到这一点,我们将从传统方法开始:按重要输入特征的每个级别绘制残差图。我们将密切关注导致最大误差的行以及残差图中的任何强模式。然后,我们将将我们的预测分解为段,并分析这些段的性能。仅仅了解模型在高风险用例的平均表现是不够的。我们需要知道我们的模型在数据中重要段上的表现。为了完成残差分析,我们将尝试用决策树建模我们的残差。从那棵树上,我们将学习关于我们的模型如何出错的规则,并尝试使用这些规则来避免错误。是时候开始从我们的错误中学习了。让我们看看一些残差。
残差的分析和可视化
正如在 图 8-1 中突出显示的那样,残差可以帮助我们理解我们模型的业务价值——或者缺乏价值。它们也是了解我们模型如何犯错技术细节的好方法。我们将查看我们模型的对数损失残差,而不是传统残差,因为我们的模型是使用对数损失进行训练的。对于大多数人来说,开始思考 ML 模型残差的最简单方法之一就是绘制它们。在本小节中,我们将首先查看我们选择的模型的全局对数损失残差,然后缩小到最重要的输入特征 PAY_0 的残差。在这两种情况下,我们将试图理解我们模型错误的驱动因素,以及我们是否可以修正它们。绘制残差的第一步当然是计算它们。我们将使用对数损失残差——这是 XGBoost 中 binary:logistic 损失函数模型训练时使用的错误类型。因此,纠正大残差应直接影响模型训练。要计算残差,我们需要目标和预测值,如下代码块所示,然后应用二元对数损失的标准公式:
# shortcut name
resid = 'r_DELINQ_NEXT'
# calculate logloss residuals
valid_yhat[resid] = -valid_yhat[y]*np.log(valid_yhat[yhat]) -\
(1 - valid_yhat[y])*np.log(1 - valid_yhat[yhat])
使用这种计算残差的小好处是,我们可以检查平均残差值是否与 XGBoost 在训练结束时报告的对数损失匹配,以确保我们在生成预测时选择了完全正确的模型大小。通过通过了这个检查,我们可以继续绘制残差图,读者可以在 图 8-6 中看到。注意 图 8-6 包含特征 r_DELINQ_NEXT。对数损失残差值命名为 r_DELINQ_NEXT,p_DELINQ_NEXT 是目标 DELINQ_NEXT 的预测。对数损失残差看起来与我们在统计课上可能记得的典型回归残差有所不同。我们不是看到一个随机的点簇,而是看到模型每个结果的一条曲线;对于 DELINQ_NEXT = 0,它向右上方弯曲,而对于 DELINQ_NEXT = 1,它朝着左上方弯曲。在这个图中,我们可以看到的第一件事是,对于两种结果,都有一些较大的异常残差,但对于 DELINQ_NEXT = 1,它们更多且更极端。

图 8-6. 选定 XGBoost 模型的正面和负面响应的对数损失残差(数字,彩色版本)
这种模式告诉我们,在验证数据中有些客户拖欠款项,但我们的模型真的认为他们不会。通过按新列 r_DELINQ_NEXT 对验证数据进行排序,并查看最大残差行,我们可以了解这些客户的情况。那么,这些客户是谁呢?事实证明,他们是好客户——信用额度很大,并且总是按时付款的客户——他们会错过下一次付款。他们会让我们的模型感到惊讶,并导致巨大的残差。
这些结果指出了我们训练数据的根本缺陷。我们缺少能帮助我们更多了解消费者金融生活及其为何可能逾期付款的特征。例如,债务收入比(DTI)在信用模型中经常使用。我们可能会看到客户逾期前的 DTI 比率增加。缺少这类额外信息,我们必须认识到我们发现了模型的严重局限性。我们没有所需的列来做得更好。在现有数据的情况下,我们的模型可能很容易受到惊吓,因此我们可以考虑从训练数据中删除这些行,因为它们为训练过程带来了无用的噪音。现在抛弃它们,和类似的个体,可能是个好主意,因为我们现在无法从中学到太多东西。我们可能会提高验证和测试性能,并可能训练一个更稳定和可靠的模型。
在我们清理这些点之前,让我们通过每个最重要特征 PAY_0 的级别来绘制对数损失残差图。如果我们在全局残差的初始分析中看到了更具体的故事或问题,我们应该让这些信息指导我们下一步调查哪些残差。由于我们没有看到将这些个体与任何具体特征联系起来的信息,我们默认要调查最重要的输入特征。为此,我们将依赖 Seaborn 的 FacetGrid 绘图功能。以下代码展示了如何通过 PAY_0 的各个级别快速分解残差,并在一个整洁的网格中绘制每个级别的残差:
# facet grid of residuals by PAY_0
sorted_ = valid_yhat.sort_values(by='PAY_0')
g = sns.FacetGrid(sorted_, col='PAY_0', hue=y, col_wrap=4)
_ = g.map(plt.scatter, yhat, resid, alpha=0.4)
_ = g.add_legend(bbox_to_anchor=(0.82, 0.2))
图 8-7 显示了验证数据中 PAY_0 的 11 个水平的对数损失残差,针对正面和负面结果。总体而言,我们应该密切关注图表中的任何明显模式。

图 8-7。拥有良好付款记录的客户突然违约会导致大额残差,与此同时,拥有较差付款记录的客户突然开始按时支付也会导致大额残差(数字,彩色版)
图 8-7 重新确认了全局残差所述的情况,并增加了一些具体细节。在图 8-7 的顶行中,对于PAY_0的有利值(-2,-1或0),代表按时付款或不使用信用的客户,与违约(DELINQ_NEXT = 1)的大残差相关联。这些是我们在图 8-6 中看到的高残差客户之一。在底行中展示了完全相反的行为。当PAY_0的不利值客户突然按时付款(DELINQ_NEXT = 0)时,将会造成大残差。这里的教训是什么?图 8-7 表明我们的机器学习模型会犯和人类或简单的业务规则相同的错误。从第六章我们知道,该模型过于依赖于PAY_0。现在我们看到了这种病态的一个后果。如果客户的PAY_0值有利,模型在他们违约时会感到震惊。如果客户的PAY_0值不利,模型在他们付款时会感到震惊。
这是一个问题,因为我们不需要一个有数十万条规则的机器学习模型来做出这种决定。这些成千上万的规则隐藏了大量的复杂性,而这反过来可能隐藏了偏见或安全问题。这个模型要么通过收集更多列的数据并重新训练来大幅改进,要么我们可以考虑用一个更透明和安全的业务规则替换它:IF PAY_0 < 2 THEN APPROVE, ELSE DENY。基本上,该模型需要更多的数据——一些新的输入列,可以告诉我们客户在这个信用账户之外的财务稳定情况。没有这些信息,我们部署了一个过于复杂——因此也过于风险的——管道来做最终是简单的决策。我们将在“修复选定的模型”中尝试纠正,但在此之前,让我们确保这个模型没有隐藏其他的意外。接下来,我们将进行分段错误分析,并查看模型性能中的任何问题点。
分段错误分析
我们选定的模型在验证中的 AUC 为 0.78。这是一个令人尊重的 AUC,表明我们的模型在验证数据中大约 80%的情况下正确排列负面和正面结果。那么,我们可以直接部署了吗?好吧,我们刚刚看到,对错误的更仔细分析可以揭示简单评估统计无法显示的严重问题。不幸的是,我们即将看到,尊重的顶级 AUC 也意味着不了了之。
在 表 8-2 中,我们计算了所有 PAY_0 水平上许多常见的二元分类性能和错误指标。这种技术有时被称为 分段误差分析。其基本思想是,不同的性能和错误指标告诉我们关于模型不同信息。例如,顶级的 AUC 告诉我们模型正确排列顾客的总体能力,准确率告诉我们在特定概率阈值下的错误率,而像真阳性率和假阳性率这样的指标则从更具体的角度分解了准确性,显示出正确和错误决策的不同视角。此外,我们希望了解所建模人群的不同细分信息。表现最佳的模型将在所建模人群的所有细分中表现出可靠的决策能力,而不仅仅是数据中最大的细分。当我们处理数十亿美元的贷款组合时,这些较小的细分仍然代表了大量资金。在其他高风险应用中,较小的细分可能代表其他重要的金融、刑事司法或生死决策。
请注意,我们将在 表 8-2 中计算的值源自混淆矩阵,并且可能根据我们选择的概率阈值而变化。这些值是使用最大化模型 F1 统计量所选择的阈值计算的。如果我们要部署这个模型,我们应该使用生产流水线中使用的概率阈值。我们有责任确保模型在 vivo 中表现良好,使用多种不同的指标,适用于所有受到模型决策影响的群体。这对公平性有严重的影响,但我们将在其他章节中解决这些问题。现在,让我们深入研究 表 8-2。
表 8-2. 分段误差分析表
| PAY_0 | 患病率 | 准确率 | 真阳性率 | 精度 | 特异性 | 负预测值 | 假阳性率 | … | 假阴性率 | 错过率 |
|---|---|---|---|---|---|---|---|---|---|---|
| –2 | 0.118 | 0.876 | 0.000 | 0.000 | 0.993 | 0.881 | 0.007 | … | 1.000 | 0.119 |
| –1 | 0.177 | 0.812 | 0.212 | 0.438 | 0.941 | 0.847 | 0.059 | … | 0.788 | 0.153 |
| 0 | 0.129 | 0.867 | 0.089 | 0.418 | 0.982 | 0.880 | 0.018 | … | 0.911 | 0.120 |
| 1 | 0.337 | 0.566 | 0.799 | 0.424 | 0.448 | 0.814 | 0.552 | … | 0.201 | 0.186 |
| 2 | 0.734 | 0.734 | 1.000 | 0.734 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
| 3 | 0.719 | 0.719 | 1.000 | 0.719 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
| 4 | 0.615 | 0.615 | 1.000 | 0.615 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
| 5 | 0.571 | 0.571 | 1.000 | 0.571 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
| 6 | 0.333 | 0.333 | 1.000 | 0.333 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
| 7 | 0.500 | 0.500 | 1.000 | 0.500 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
| 8 | 0.750 | 0.750 | 1.000 | 0.750 | 0.000 | 0.500 | 1.000 | … | 0.000 | 0.500 |
在 表 8-2 中,一切看起来正常,直到我们到达第五行,其中 PAY_0 = 2。从那以后,表格显示出了一个严重的问题,甚至可能比前一节中 PAY_0 所绘制的残差还要严重。坦率地说,对于 PAY_0 = 2 及以上,这个模型并不真正有效。例如,我们观察到了 1.0 的假阳性率。这意味着模型错误地预测了所有不逾期付款的人——模型预测所有这些人都会迟到。为什么会发生这种情况呢?最明显的原因再次是训练数据。在残差图中,我们看到可能漏掉了一些重要的输入特征。通过分段误差分析,我们现在可以看到,我们可能也错过了一些重要的数据行。在我们的训练数据中,PAY_0 > 1 的人太少,以至于模型无法对他们学到任何有用的信息。回顾一下 第六章 中的一些图表或查看 图 8-7,我们会发现 PAY_0 > 1 的子图中几乎没有点。
警告
高层次或平均误差指标可能会掩盖严重的问题。对于高风险应用程序,始终进行分段误差分析。
那个 0.78 的 AUC 能隐藏多少东西,真是令人难以置信。我们希望这个例子能说服读者重视分段误差分析的重要性。读者可能正在思考如何解决这个问题。最显而易见的答案是等到我们能够收集足够关于逾期付款客户的数据,以训练出更好的模型再部署这个模型。如果不得不按现状部署模型,我们可能需要人工案件工作者来做拒绝决策,至少对于那些 PAY_0 > 1 的客户来说是这样。我们将考虑更多的补救策略来结束本章,但在此之前,我们希望更多了解我们发现的这些残差模式。接下来,我们将拟合一个可解释的模型到我们的残差中,以获取一些关于我们模型中这些缺陷背后的细节。
模型残差
在 第六章 中,我们使用了一个可解释的决策树来基于输入特征建模我们的预测,以便更好地了解哪些输入特征驱动了预测以及如何驱动的。现在我们将使用相同的方法来深入了解驱动我们残差的因素。如果我们注意到解释和调试之间有一些重叠,这并非巧合。事后解释最好的用途之一就是帮助调试工作。
我们将使用以下代码来将四级决策树拟合到我们 DELINQ_NEXT = 0 和 DELINQ_NEXT = 1 的残差中。为了拟合这棵树,我们将使用原始输入作为树的输入,但是不再将 DELINQ_NEXT 作为目标进行训练,而是训练残差或 r_DELINQ_NEXT。一旦树训练完成,我们将存储一个 H2O MOJO(模型对象优化),MOJO 包含一个专门的函数,可以使用 Graphviz 重新绘制我们的残差树,Graphviz 是一个用于技术绘图的开源库。我们可以使用几个其他包,包括 scikit-learn,做类似的事情。
# initialize single tree model
tree = H2ORandomForestEstimator(ntrees=1, 
sample_rate=1, 
mtries=-2, 
max_depth=4, 
seed=SEED, 
nfolds=3, 
model_id=model_id) 
# train single tree model
tree.train(x=X, y=resid, training_frame=h2o.H2OFrame(frame))
# persist MOJO (compiled Java representation of trained model)
# from which to generate plot of tree
mojo_path = tree.download_mojo(path='.')
print('Generated MOJO path:\n', mojo_path)
只使用一棵树。
使用树中的所有行。
使用树的分割搜索中的所有列。
浅树更容易理解。
为了可重复性,设置随机种子。
用于稳定性的交叉验证,以及在 H2O 中获取一个树指标的唯一方法。
为 MOJO 产物命名一个可识别的名称。
正如我们用于解释目的的替代模型一样,实际上没有根本理论保证这个模型确实告诉我们驱动残差的原因。像往常一样,我们需要谨慎和深思熟虑。对于这棵决策树,我们将计算总体错误指标,以确保树确实适应残差。因为不稳定性是单一决策树的已知故障模式,我们将查看交叉验证的错误指标,以确保树也是稳定的。还需要牢记的是,如果驱动残差的原因超出了输入特征的范围,这棵树就无法告诉我们相关信息。我们已经知道我们模型中的一些主要问题源于我们没有的数据,因此在分析树时需要牢记这一点。
图 8-8 显示了我们 ML 模型对于 DELINQ_NEXT = 0 的残差的决策树模型,即不会错过即将到期付款的客户。虽然它反映了 图 8-7 中发现的内容,但它以一种非常直接的方式展示了失败逻辑。事实上,根据这棵树,甚至可以建立关于模型何时可能在最坏情况下失败的程序规则。
从树顶部开始追踪,到树底部的最大平均残余值,图 8-8 显示,在PAY_0 >= 1.5 AND PAY_3 >= 1.0 AND BILL_AMT3 < 2829.50 AND PAY_6 >= 0.5的情况下,负面决策的最大残余发生。这意味着,正如我们在图 8-7 中看到的那样,当客户在几个月内有疑问的还款和较小的账单金额时,当他们做下一个付款时,模型会感到震惊。现在我们已经缩小到引起平均最差残余的具体客户,并且有一个业务规则来定义最令人担忧的情况。

图 8-8. 显示模型残余的决策树,揭示可以用来发现故障模式并设计缓解方法的模式
总的来说,这种残留建模技术有助于发现故障模式。一旦了解了故障模式,通常可以采取措施来提高性能和安全性。如果能够将导致图 8-8 中最大残余的客户群体与导致逾期支付模式隔离开来,这可能会导致通过商业规则(或模型断言)的精确修复策略。如果客户以PAY_0 >= 1.5 AND PAY_3 >= 1.0 AND BILL_AMT3 < 2829.50 AND PAY_6 >= 0.5的特征出现在我们的模型中,也许我们不应该仅仅假设他们会违约。我们可以考虑通过商业规则调整这些客户群体的违约概率,或者将他们的信用决策送交给人工案件工作者进行更加细致的考虑。到目前为止,调试已经发现了我们模型的一个重大问题。我们的模型没有正确的训练数据,无论是列还是行,它在常见且重要的决策情境中很容易受到惊吓。除了收集或模拟更好的数据外,我们现在找到了一个潜在的补救策略:当我们即将做出错误决策时,使用业务规则进行标记并采取行动以减轻该错误决策。在接下来的部分中,我们将通过讨论进一步的补救活动来结束这一章节。
注意
后续解释技术,如可解释的替代模型,通常作为模型调试工具最有用。
修复所选模型
尽管使用了单调约束和正则化,尽管进行了仔细的网格搜索和严格的模型选择测试,尽管真的希望训练一个好模型,我们仍然训练了一个不应该部署的糟糕模型。除了训练数据不足外,回想一下,我们发现这个模型:
-
病态地过分强调客户的最近还款状态(
PAY_0) -
存在可能排除预付或对高净值客户产生负面影响的逻辑错误
-
可能对敌对示例攻击有脆弱性
-
对于
PAY_0 > 1的表现不佳
虽然我们将分别解决每一个问题,但它们共同合谋,使看似合格的机器学习模型比简单的业务规则可能更不吸引人,至少对于作者来说是这样。因为许多机器学习模型在部署前未经充分调试,所以如果我们将本章节的调试技术应用于我们组织的一个模型,很可能会发现自己需要处理类似的错误。无论我们的团队是否尝试修复这个模型或重新开始设计,都很重要思考如何解决敏感性和残余分析揭示的问题。换句话说,在部署此模型或类似模型之前,这些问题必须得到解决。对于示例数据和模型,可以应用多种技术来解决突出的错误。
训练数据呈现了最简单和最困难的补救选项。解决方案很明确。实施解决方案需要常识和努力。收集更多和更好的训练数据。使用实验设计技术来指导数据收集和选择。使用因果发现技术选择实际影响预测目标的输入特征。如有必要,考虑模拟数据。
注意
常常,我们改善机器学习系统性能的最佳方法是收集更多和更高质量的数据。
对于其余的已识别问题,让我们试着逐一解决它们,作为我们在工作中处理这些错误的示例。我们将特别关注过度强调 PAY_0,因为它在训练和编码方面有最明显的缓解措施,然后继续处理其他已识别的故障模式。
过度强调 PAY_0
或许我们选定的模型,以及许多其他机器学习模型,最大的问题是糟糕的训练数据。在这种情况下,训练数据应该通过新的相关特征进行扩充,以将模型内的主要决策机制分散到不止一个特征上。一种提高稳定性和泛化能力的策略是引入一个新特征,概括客户的长期消费行为,以暴露任何潜在的财务不稳定性:客户账单金额六个月内的标准差,bill_std。Pandas 提供了一行代码来计算一组列的标准差。
data['bill_std'] = data[['BILL_AMT1', 'BILL_AMT2',
'BILL_AMT3', 'BILL_AMT4',
'BILL_AMT5', 'BILL_AMT6']].std(axis=1)
沿着同样的思路,我们也可以创建一个新特征,pay_std,包含关于支付状态的信息,除了最近的一个(我们不想再次过度强调 PAY_0):
data['pay_std'] = data[['PAY_2','PAY_3','PAY_4','PAY_5','PAY_6']].std(axis=1)
噪声注入以破坏 PAY_0 也可以用于减轻过度强调,但仅在更好的训练数据中有其他准确的信号可用时。我们将随机化 PAY_0 列,但只在 PAY_0 等于 0、1 或 2 时。这种类型的破坏类似于强正则化。我们真的希望迫使模型注意其他特征。
data['PAY_0'][(data['PAY_0']>= 0) & (data['PAY_0']< 3)].sample(frac=1).values
在采取这些步骤弱化训练数据中的PAY_0之后,我们重新训练我们的模型。结果的 SHAP 摘要图(图 8-9)显示我们已经成功地减弱了PAY_0。它已经从摘要图中的首位移开,并被PAY_2取代,我们的新工程特征显得比PAY_0更重要。我们还观察到 AUC 轻微下降,现在为 0.7501,原来为 0.7787。

图 8-9. 在弱化PAY_0之后的每个输入变量的 Shapley 值(数字,彩色版本)
现在是难点:这是一个更好的模型吗?总体 AUC,通常用于选择“好”的分类器,已经降低。首先,我们已经看到体外 AUC 并没有多大意义。其次,当我们改变模型时,测试指标的下降几乎是肯定的。机器学习训练无情地优化某些选择的标准,然后倾向于根据同样的标准在验证数据中选择最佳模型。如果我们调整这个过程,我们很可能会看到所选的体外测试指标恶化。
注
修复工作很可能会根据测试数据统计使我们的模型看起来更糟。这没关系。没有统计数据能真正预测实际表现。只要修复基于扎实的领域知识,我们就可以在测试数据中牺牲一些体外性能,以部署更节俭的模型。
确定这个模型是否更好的唯一方法是再次调试它并与领域专家进行咨询。虽然这可能令人失望,但这是一个一直以来就已知的事实。没有统计数据可以预测惊人的体内性能,至少目前还没有。好的模型总是需要调试和领域专业知识才能在实际世界中正常运行。现在,让我们继续通过查找我们在调试过程中确定的其余问题来改进我们的模型:逻辑错误、安全漏洞以及对PAY_0 > 1的性能不佳。
杂项错误
我们很快会考虑其他技术修复方法,但让我们在这里简要考虑实验设计问题。为了解决处理机器学习模型时像工程项目一样关注体外测试错误与实验关注体内结果之间的不一致性,我们应尝试更新我们的工作流程,以更紧密地与传统科学方法对齐:
-
发展一个可信的直觉(例如,基于先前的实验或文献综述)。
-
记录我们的假设(即,我们的机器学习系统的预期实际效果)。
-
收集适当的数据(例如,使用实验设计方法)。
-
测试假设,即机器学习系统对治疗组的预期体内效果,使用诸如
-
A/B 测试以了解模型结果对非正式治疗组的影响。
-
粗糙的精确匹配来构建来自收集的观测数据的控制和处理组,并测试模型的统计显著处理效果。
-
如果我们正在进行一系列带有不可解释模型的试验和大量的确认偏见和资金偏见,正如今天许多机器学习项目所做的那样,那么我们在模型部署后可能会对其表现感到惊讶(请记住章节开头的谷歌研究小组的引言?)。对于文化上缺乏科学严谨性,没有技术可以修复。截至今日,大部分机器学习仍然是实验性科学,而不是机械化的工程任务。第十二章更深入地探讨了数据科学和科学方法中的问题。
警告
我们经常把我们正在进行的实验看作是选择最佳算法。但实际上,它应该关注用户、客户或系统主体的体验中的体内结果。
修复严重的数据和方法错误很可能对逻辑错误、安全漏洞和我们模型的总体表现有积极的影响。在以下列表中,我们将探直接的修复措施,这些措施在当代数据科学工作流中可能效果更好。我们将在本节中以简要讨论校准来结束。将预测结果校准到过去已知的结果,是另一种基于常识的广泛修复方法。
逻辑错误
对于 对于出现高概率违约的逻辑错误,即使在进行了非常大额度的付款后,模型断言或业务规则也是一个可能的解决方案。对于刚刚逾期两个月的客户,可以使用模型断言或业务规则来检查是否最近也有大额付款,然后发布不利的违约预测。像图 8-8 中的残差模型,专注于这一小部分客户,可以帮助提出或完善更具针对性的断言或规则。
安全漏洞
我们发现该模型很容易受到对抗性示例的影响。通常,像 API 限流和认证这样的最佳实践,结合实时模型监控,对机器学习安全性有很大帮助(见第五章)。对于这个模型可能适用的还有数据完整性约束或监控随机或模拟数据的方法,即异常检测。基本上,这个模型可能需要额外的监控,检查异常数据,例如及时最近支付(PAY_0 = 1)和第二最近支付拖欠六个月(PAY_2 = 6)。如果在评分队列中发现异常数据,应该使用隔离森林算法或逻辑数据完整性约束等方法,将这些数据路由到更近一步的检查之前做出信用决策。
PAY_0 > 1 的表现不佳
和我们选定模型的其他问题一样,这个模型需要更好的数据来更好地了解最终违约的客户。在没有这些信息的情况下,可以使用观察权重、过采样或模拟来增加那些确实错过付款的少数客户的影响力。此外,当面对稀疏训练数据时,模型的单调约束是尝试的最佳缓解措施之一。单调约束对模型强加了深入理解的现实世界控制。然而,即使有这些约束条件,对于PAY_0 > 1的模型性能也非常糟糕。这个范围内的预测可能需要由更专门的模型、基于规则的系统或甚至人工案例工作者来处理。
预测与过去已知结果的校准是另一种传统的纠正方法,可能会改善我们模型的许多属性。校准意味着我们模型的概率与过去已知的结果相关联——基本上意味着当我们的模型发出例如 0.3 的预测时,在验证或测试数据中像导致该预测的客户一样,实际上约 30%的时间会违约。我们可以使用图表和 Brier 分数来检测校准问题,并重新调整输出概率以进行纠正。scikit-learn 中的概率校准模块具有良好的信息和功能,可帮助开始校准二元分类器。
结论
读者可能能想到其他方法来修复我们的糟糕示例模型,这很好。关键是在下次训练模型时尝试调试。在很多方面,机器学习就像其他代码一样。如果我们不测试它,我们并没有以某种神奇的方式避免错误。我们只是忽视了错误。在所有软件练习中,调试都至关重要——从操作系统到机器学习模型。虽然我们可以使用单元测试、集成测试和功能测试来捕捉机器学习中的软件错误,但这些通常无法帮助我们检测和隔离数学和逻辑问题。这就是机器学习与其他代码不同之处:它使用复杂的数学优化来做出决策,很难找到这类错误。
在本章中,我们使用敏感性和残差分析来查找看似不错的模型中的几个机器学习错误。我们对训练数据中信息的不足感到惋惜,尝试修复了其中一个最严重的问题,并提出了其他解决方案。如果我们在工作中能够达到这一步,我们的工作还远未结束。模型至少仍需监控。查找和修复错误,并将这些修复方案提交给领域专家,确实会减少事故发生的机会。但这并不能保证一个完美的模型(没有任何东西可以保证,如果你找到了,请告诉我们!)。此外,正如古老的谚语所说,通往地狱的道路铺满了善意。已经有记录表明,试图修复机器学习模型中的偏见问题可能会使偏见问题变得更加严重。出于性能原因进行缓解错误的做法可能也是如此。唯一确定我们的模型在部署中实际有效的方法是在部署中对其进行监控。
与当前机器学习模型测试方式相比,这些额外工作量都很大,但为了部署测试机器学习模型,与学校和工作中教导我们的评估模型发布的方式完全不同。论文不会直接决定人们生活,而论文通常不会有安全漏洞。我们在学校里学习的评估模型的方式对于体内部署并不足够。我们希望本章探讨的技术能够赋予读者发现机器学习错误、修复错误并创建更好模型的能力。
资源
代码示例
模型调试工具
¹ 请记住,大型美国银行每年都会按照联邦储备委员会的全面资本分析和审查(CCAR)流程进行几乎彻底的压力测试。
第九章:调试 PyTorch 图像分类器
即使在被炒作的 2010 年代,深度学习(DL)研究人员也开始注意到他们的新深度网络具有一些 “有趣的属性” 。一个好的模型在硅仿真通用性能高的情况下,也很容易被对抗样本欺骗,这既令人困惑又违反直觉。在经典论文 “深度神经网络很容易被愚弄:对不可识别图像的高置信度预测” 中,作者质疑了深度神经网络如何可能将图像分类为熟悉的对象,尽管它们对人类眼睛完全不可识别。如果之前没有理解,那么现在变得清楚了,就像所有其他机器学习系统一样,DL 模型必须进行调试和修复,特别是在高风险场景中使用时。在 第七章 中,我们训练了一个肺炎图像分类器,并使用了各种事后解释技术来总结结果。我们还涉及了 DL 可解释性技术与调试之间的联系。在本章中,我们将继续从 第七章 结束的地方开始,并使用各种调试技术对训练好的模型进行检验,以确保其足够强大和可靠,可以进行部署。
DL 代表了当今 ML 研究领域中的最新技术。然而,其异常复杂性也使得测试和调试变得更加困难,这增加了在实际部署中的风险。所有软件,即使是 DL,都会有 bug,在部署之前必须解决这些问题。本章首先进行概念复习,然后专注于使用我们的示例肺炎分类器调试 DL 模型的技术。我们将从讨论 DL 系统中的数据质量和泄漏问题开始,并说明为什么在项目初期解决这些问题非常重要。然后,我们将探讨一些软件测试方法,以及为什么软件质量保证(QA)是调试 DL 流程中必不可少的组成部分。我们还将进行 DL 敏感性分析方法的讨论,包括在不同肺炎图像分布上测试模型和应用对抗性攻击。最后,我们将讨论我们自己的数据质量和泄漏问题,探讨 DL 的新调试工具以及我们自己对抗性测试的结果。本章的代码示例可以像往常一样在 在线 上找到,并记住 第三章 概述了语言模型(LM)的模型调试。
概念复习:调试深度学习
在第八章中,我们强调了除了传统的模型评估之外进行模型调试的重要性,以增加对模型性能的信任。本章的核心思想保持不变,尽管是针对深度学习模型。回想一下我们在第七章中的图像分类器,用于诊断胸部 X 光图像中的肺炎,我们得出结论,我们不能完全依赖我们应用的事后解释技术,特别是在高风险应用中。然而,这些解释技术似乎在帮助我们调试模型时显示出了一些潜力。在本章中,我们将从第七章结束的地方开始。记住我们在训练和评估模型时使用了 PyTorch,并且在本章中我们将调试这个模型以展示深度学习模型的调试方法。为了让我们开始,以下列表深入探讨了可复现性、数据质量、数据泄漏、传统评估和软件测试方法,然后我们转向适应残差分析、敏感性分析和分布变化到深度学习中的广泛概念。就像在更传统的机器学习方法中一样,我们发现使用这些技术的任何错误都应该被修复,而概念的复习将涉及到补救的基础知识。还要注意,尽管本章介绍的技术最直接适用于计算机视觉模型,但这些想法通常可以在计算机视觉之外的领域中使用。
可复现性
保持机器学习结果的可复现性非常困难。幸运的是,像随机种子、私有或公共基准、元数据跟踪器(如 TensorFlow ML Metadata)、代码和数据版本控制(使用 Git 或类似的工具如 DVC)、以及环境管理器(例如 gigantum)等工具都可以提高可复现性。种子帮助我们在代码的最低层面上保证可复现性。元数据跟踪器、代码和版本控制系统以及环境管理器帮助我们跟踪所有数据、代码和其他信息,以保持可复现性,并在失去可复现性时回滚到已建立的检查点。基准测试使我们能够向自己和他人证明我们的结果是可复现的。
数据质量
图像数据可能存在任意数量的数据质量问题。普遍存在错误标签,这是许多用于预训练大型计算机视觉模型的数据集中已知的问题。DL 系统仍然需要大量带标签的数据,并且主要依赖于不可靠的人类判断和低薪劳动力来创建这些标签。对齐,或者确保训练集中所有图像具有一致的视角、边界和内容,是另一个问题。想象一下,如何将来自不同 X 光机的胸部 X 光片集对齐,以便每个训练图像都集中在相同内容——人类肺部,而不会在边缘周围分散、嘈杂的信息。因为我们试图了解的图像内容本身可以上下移动或左右移动(翻译)、旋转或以不同大小(或尺度)呈现,所以我们必须在训练数据中有对齐的图像,以获取高质量的模型。图像还会出现自然问题,如模糊、遮挡、低亮度或对比度等等。最近的论文“评估实际问题的图像质量问题”对许多这些常见的图像质量问题进行了总结,并提出了一些解决方法。
数据泄漏
另一个严重的问题是训练、验证和测试数据集之间的泄漏。如果不仔细跟踪元数据,很容易在这些分区之间有相同的个体或示例。更糟糕的是,我们可能在验证或测试数据中有相同的个体或来自训练数据的示例,而这些个体或示例可能在较早的时间点出现。这些情况往往会导致对性能和误差的过度乐观评估,这是高风险 ML 部署中我们最不希望看到的情况之一。
软件测试
DL 往往会导致复杂和不透明的软件工件。例如,一个100 万亿参数的模型。一般来说,ML 系统也因悄无声息地失败而臭名昭著。与传统软件系统不同,后者通过经过充分测试的异常机制崩溃并明确通知用户可能的错误或漏洞,DL 系统可能会表现出正常训练并为新数据生成数值预测,而同时受到实现错误的影响。此外,DL 系统往往依赖于任意数量的第三方硬件或软件组件。但这并不能成为我们不进行测试的借口。这更加需要为任何高风险的 DL 系统进行适当的测试——软件质量保证对于任何高风险的 DL 系统都是必须的。
传统模型评估
测量 logloss、准确率、F1、召回率和精确率,并分析混淆矩阵,跨不同数据分区进行这些操作,始终是模型调试的重要部分。这些步骤帮助我们了解我们是否违反了分析的隐含假设,是否达到了足够的性能水平,或者是否存在明显的过拟合或欠拟合问题。只记住,良好的体外表现并不保证良好的体内表现。我们需要采取超越传统模型评估的步骤,以确保良好的现实世界结果。
注意
我们通常会尝试的另一种重要调试类型是分段错误分析,以了解我们的模型在数据的重要部分中在质量、稳定性、过拟合和欠拟合方面的表现如何。我们的 X 光图像没有太多额外信息标记,可以用于分段,但了解模型在数据的各个段上的表现至关重要。平均或总体性能指标可能隐藏了不充分和偏差问题。如果可能的话,我们应该始终按段分解我们的数据,并逐段检查潜在问题。
敏感性分析
深度学习中的敏感性分析归结为改变数据并观察模型如何响应。不幸的是,当应用敏感性分析到深度学习中时,图像及其集合可以以多种方式改变。从调试的角度来看,图像的有趣变化可能对人类可见,也可能不可见,可以是自然生成或对抗性生成的。一个经典的敏感性分析方法是扰动训练数据的标签。如果我们的模型在随机打乱标签上表现同样出色,或者相同的特征对于打乱标签同样重要,那这并不是一个好迹象。我们还可以扰动我们的模型来测试不充分的情况,即模型在测试数据中表现良好但在实际世界中表现不佳。如果扰动结构上无意义的超参数(例如随机种子和用于训练系统的 GPU 数量)对模型性能有显著影响,那么我们的模型仍然过于关注特定的训练、验证和测试集。最后,我们可以故意制造对抗性示例,以了解我们的模型在最坏情况或攻击场景下的表现。
分布变化
分布转移是 DL 中严重的错误之一,也是我们进行敏感性分析的主要原因之一。就像在 ML 中一样,对新数据中的转移缺乏鲁棒性可能会导致体内性能下降。例如,图像集中的人群可能随时间变化。被称为子群体转移,图像中类似对象或个体的特征随时间变化,新数据中可能会遇到新的子群体。一旦系统部署后,一组图像的整个分布也可能会发生变化。为了尽可能地增强模型对子群体和整体人群漂移的性能,这是关键的 DL 调试步骤。
修复措施
与所有 ML 一样,更多更好的数据是 DL 的主要修复方法。自动化方法,如albumentations,可以在许多情况下生成更多的训练和测试数据,例如通过扭曲图像。一旦我们对数据感到满意,基本的质量保证方法,如单元测试、集成测试和异常处理,可以帮助在结果不理想的实际应用中捕捉许多错误。特殊工具,如 Weights & Biases 的实验跟踪器,可以更好地洞察我们的模型训练,帮助发现任何隐藏的软件错误。我们还可以通过应用正则化、基于人类领域知识的约束或鲁棒 ML方法来使我们的模型更可靠和更健壮,以防御对抗性操纵。
对于所有 ML,DL 的调试可能会特别困难,原因如概念复习中所讨论的那样,以及其他原因。然而,我们希望本章提供实用的想法来发现和修复错误。让我们深入探讨本章的案例。在接下来的章节中,我们将密切关注数据质量问题、数据泄露、软件漏洞以及我们模型的过度敏感性。我们将发现许多问题,并尝试修复它们。
调试 PyTorch 图像分类器
如我们将讨论的那样,我们最终手动裁剪我们的胸部 X 光片以解决严重的对准问题。我们在验证方案中发现了数据泄露,并将解释我们是如何发现并修复它的。我们将讨论如何应用实验跟踪器以及我们观察到的结果。我们将尝试一些标准对抗攻击,并讨论我们可以如何利用这些结果来构建更强大的模型。我们还将把我们的模型应用到全新的测试集上,并分析在新人群上的性能。在接下来的章节中,我们将讨论如何发现我们的漏洞,以及一些可能对 DL 管道中问题识别有帮助的一般技术。然后,我们将讨论如何修复我们的漏洞,以及 DL 的一些一般错误修复方法。
数据质量和泄露
正如在第七章中也强调的那样,本案例研究中使用的肺炎 X 光数据集也存在一些挑战。其目标类别分布倾斜。 (这意味着属于肺炎类的图像比正常类图像多。) 验证集过小,无法得出有意义的结论。此外,图像上有嵌入式文本或令牌的标记。通常,每家医院或部门都对其机器生成的 X 光图像具有特定的风格偏好。仔细检查图像时,我们发现有许多不需要的标记、探针和其他噪声,如图 9-1 所示。如果我们不极其谨慎,这些标记可以成为 DL 学习过程的焦点,即所谓的捷径学习。

图 9-1. 带有不必要的镶嵌文本和标记的图像
在研究裁剪和对齐图像时,我们还发现了数据泄露问题。简单来说,数据泄露发生在验证或测试数据在训练时向模型提供信息的情况下。在这种数据上训练的模型可能会在测试集上表现乐观,但在实际世界中可能表现不佳。DL 中的数据泄露可能由以下原因引起:
数据分区的随机分割
这是泄漏的最常见原因,当代表同一人的样本出现在验证或测试数据集中,并且还出现在训练集中时,就会发生这种情况。在这种情况下,由于训练数据中来自同一患者的多个图像,在训练数据分区之间进行简单随机分割可能导致来自同一患者的图像同时出现在训练集和验证或测试集中。
数据增强导致的泄露
数据增强通常是 DL 管道的一个重要部分,用于增强训练数据的代表性和数量。然而,如果操作不当,增强可能成为数据泄露的重要原因。如果在数据增强过程中不小心,从同一真实图像生成的新合成图像可能出现在多个数据集中。
在转移学习过程中的泄露
在一项研究中,转移学习有时也可能成为泄露的来源,当源数据集和目标数据集属于相同领域时。作者们发现,这些预训练模型对 CIFAR-10 测试示例有很高的影响力的 ImageNet 训练示例,往往是目标任务的图像的完全相同副本,只是具有更高的分辨率。当这些预训练模型与错误的数据集一起使用时,预训练本身会导致一种非常隐蔽的数据泄露。
在我们的使用案例中,我们发现训练集包含同一患者的多个图像。尽管所有图像都有唯一的名称,但我们观察到某些情况下一个患者有多个 X 射线,正如图 9-2 所示。
当类似于图 9-2 中来自同一患者的图像作为训练集的一部分以及验证或测试集的一部分进行采样时,会导致测试集上的人工高性能。在现实世界中,模型不能依赖于看到其训练数据中的相同人员,在面对新个体时,其表现可能远不如预期。另一个需要关注的数据问题是错误标记的样本。由于我们不是放射科医生,因此无法从正确标记的图像中选择正确的标记图像。在没有领域专家的情况下,我们需要依赖数学方法来识别错误标记的数据,如边缘排名下的面积(AUM ranking)。在 AUM 排名中,故意错误标记的训练实例被引入,以学习和定位自然发生的错误标记图像的错误配置文件。我们仍然更喜欢与领域专家合作,这是在深度学习工作流程的开始阶段涉及领域专家的关键位置——以验证我们开发数据集中的真实性。

图 9-2. 训练集中来自同一患者的多个胸部 X 射线图像。
深度学习软件测试
在第三章中指定的测试,即单元测试、集成测试、功能测试和混沌测试,都可以应用于深度学习系统,希望增强我们对生产环境中管道代码运行预期的信心。尽管软件质量保证可以增加我们的代码机制按预期运行的可能性,但机器学习和数学问题仍可能发生。深度学习系统是涉及大量数据和参数集的复杂实体。因此,它们还需要进行额外的机器学习特定测试。随机攻击是一个很好的起点。将模型暴露于大量随机数据可以帮助捕捉各种软件和机器学习问题。基准测试是另一个有帮助的实践,在第三章的多个实例中进行了讨论。通过将模型与基准进行比较,我们可以检查模型的性能。基准可以帮助我们以系统化的方式跟踪系统改进。如果我们的模型表现不如简单基准模型,或者其性能相对于最近的基准在下降,那就是重新审视我们的模型管道的信号。
“深度学习 Bug 特性的综合研究”一文出色地汇编了 DL 中最常见的软件 bug。作者对来自 Stack Overflow 的帖子和 GitHub 上关于最流行的 DL 库(包括 PyTorch)的 bug 修复提交进行了详细研究。他们得出结论,数据和逻辑 bug 是 DL 软件中最严重的 bug 类型。DL 的 QA 软件也越来越多,以帮助检测和纠正 DL 系统中的 bug。例如,DEBAR是一种技术,可以在训练前在神经网络的架构级别上检测数值 bug。另一种名为GRIST的技术则利用 DL 基础设施的内置梯度计算功能来暴露数值 bug。专门用于测试 NLP 模型的checklist生成测试用例,灵感来自软件工程中的功能测试原理。
在我们的使用案例中,我们必须承认,我们并没有像应该那样频繁应用单元测试或随机攻击。我们的测试过程最终更多是手动完成的。除了应对数据泄漏和对齐问题——这是 DL 中错误的主要原因之一——我们在几个月的时间里使用非正式的基准来观察和验证我们模型性能的进展。我们还针对“深度学习 Bug 特性的综合研究”中讨论的主要错误对我们的流水线进行了检查。我们还应用了实验追踪软件,这有助于我们可视化我们流水线的许多复杂方面,并且更有信心它表现如预期。我们将在“修复措施”中更详细地讨论实验追踪器和其他数据与软件修复方法。
深度学习的敏感性分析
我们将再次使用敏感性分析来评估各种扰动对我们模型预测效果的影响。ML 系统的一个常见问题是,在有利条件下它们表现异常出色,但在输入数据发生即使轻微变化时情况会变得混乱。研究已经反复显示,对输入数据分布的轻微变化会影响像 DL 系统这样的最新模型的鲁棒性。在本节中,我们将使用敏感性分析来评估我们模型的鲁棒性。我们最佳的模型将经历一系列敏感性测试,包括分布转移和对抗性攻击,以确定它在训练时的不同条件下是否能表现良好。我们还将简要介绍本章中的其他一些扰动调试技巧。
领域和子群体转移测试
分布转移是一种情况,即训练分布与测试分布或系统部署后遇到的数据分布显著不同。这些转移可能由于各种原因而发生,并影响可能已在部署前进行了适当训练和测试的模型。有时,数据的自然变异超出了我们的控制范围。例如,在 COVID-19 大流行之前创建的肺炎分类器,在大流行后的数据测试时可能会显示不同的结果。由于在我们这个动态世界中分布转移如此普遍,及时检测、测量和采取纠正措施是至关重要的。
数据分布的变化可能是不可避免的,并且可能有多种原因导致这些变化发生。在本节中,我们首先关注领域(或群体)转移,即当新数据来自不同领域时,例如另一家医院。然后我们将重点放在较不引人注目但仍有问题的子群体转移上。我们在广州市妇女儿童医疗中心,年龄在一到五岁之间的小儿患者数据集上训练了我们的肺炎分类器。为了检验模型对来自不同分布的数据集的稳健性,我们评估了它在另一家医院和年龄组的数据集上的表现。显然,我们的分类器没有见过新数据,它的表现将表明它是否适合更广泛的使用。在这种测试中表现良好是困难的,这被称为out-of-distribution generalization。
新数据集来自美国国立卫生研究院临床中心,可以通过NIH 下载站点获取。数据集中的图像属于 15 个不同的类别——包括 14 种常见胸部疾病,包括肺炎,以及一个“无发现”的类别,其中“无发现”表示图像中未发现这 14 种疾病模式之一。数据集中的每个图像可以有多个标签。数据集已经从国立卫生研究院临床中心的临床 PACS 数据库中提取,包括医院内大约 60%的前胸部 X 光片。
正如前面提到的,新数据集在几个方面与训练数据不同。首先,与训练数据不同,新数据除了肺炎之外还有其他标签。为了处理这种差异,我们手动从数据集中仅提取了“肺炎”和“无所见”图像,并将它们分别存储为肺炎和正常图像。我们假设一个不报告 14 种主要胸部疾病的图像可以合理地放入正常类别。我们的新数据集是 NIH 数据集的子样本,我们创建它以包含几乎平衡的肺炎和正常病例样本。再次强调,尽管在实际环境中,半数被筛查患者有肺炎的隐含假设可能不成立,但我们希望在分布转移条件下测试我们在第七章中得到的最佳模型,这是我们找到的最合理的数据。
在图 9-3 中,我们比较了两个测试集的胸部 X 射线图像,直观地展示了这两个不同的分布。图中下方的图像集是从完全不同的分布中抽样得到的,而顶部的图像来自与训练集相同的分布。虽然我们不期望一个在儿童图像上训练的肺炎分类器在成人上表现良好,但我们确实希望了解我们的系统在完全领域转移条件下可能表现多么糟糕。我们希望衡量和记录系统的局限性,并知道何时可以使用以及何时不能使用。这对于所有高风险应用都是一个好主意。
在这种应用中,理解隐含的数据假设更多是一种视觉练习,因为每个训练数据示例都是一幅图像。在结构化数据中,我们可能更多依赖描述性统计来理解哪些数据被视为超出分布。

图 9-3. 两个不同数据分布的 X 射线样本比较
对于我们这些不熟悉的眼睛来说,两组图像看起来相似。我们很难区分肺炎和正常患者的 X 射线扫描。我们最初观察到的唯一区别是,与其他样本相比,来自 NIH 数据集的图像似乎有点模糊和朦胧。然而,放射科医生可以轻松指出显著的解剖差异。例如,通过文献回顾,我们了解到儿科 X 射线显示出上臂未融合的生长板,在老年患者中找不到(图 9-4)。由于我们训练数据中的所有患者都是五岁以下的儿童,他们的 X 射线可能会展示这一特征。如果我们的模型捕捉到这些特征,并通过捷径学习或其他错误的学习过程将它们与肺炎标签联系起来,这些虚假的相关性将导致它在新数据上表现不佳,而在这些新数据中不存在这样的特征。

图 9-4. 儿童 X 光片(左)与成人 X 光片(右)的比较
现在是真相的时刻。我们在新分布的测试数据上测试了我们最佳模型,结果并不令人鼓舞。在进行这种领域转移的练习时,我们有些担忧,而这些担忧在很大程度上得到了验证。通过查看表 9-1,我们可以得出一些结论。
表 9-1. 显示肺炎分类器模型在来自不同分布的测试数据集上的表现的混淆矩阵
| 预测为正常 | 预测为肺炎 | |
|---|---|---|
| 实际正常 | 178 | 102 |
| 实际肺炎 | 130 | 159 |
在医疗诊断背景下,分类器经常错误地预测实际上患有肺炎的患者为正常。假阴性——即预测肺炎患者为正常——在这种情况下是非常危险的。如果这样的模型部署在医院中,将会造成严重后果,因为病人可能得不到正确或及时的治疗。表 9-2 展示了分类器的额外性能指标。
表 9-2. 新分布测试数据集上的额外性能指标
| 类别 | 数量 | 精确率 | 召回率 | F1 分数 |
|---|---|---|---|---|
| 正常 | 280 | 0.58 | 0.64 | 0.61 |
| 肺炎 | 289 | 0.61 | 0.55 | 0.58 |
我们能训练出更好的模型吗?我们有足够的数据吗?我们是否正确处理了新数据集中的不平衡?我们在新数据集中样本选择是否代表了真实的领域或人群转移?虽然我们对这些问题的答案并不百分之百确定,但我们确实对我们模型的泛化能力有了一些了解,以及我们愿意在高风险场景中部署这类模型的意愿。我们曾经梦想过,通用的团队能够训练出在训练数据之外表现良好的肺炎深度学习分类器,但这些梦想已经破灭。我们也认为重申训练医学图像分类器的难度是多么大。
除了领域转移之外,我们还需要考虑一种不那么激烈的数据漂移类型,它可能影响我们的分类器。当新数据中出现相同人群但分布不同的情况时,就会发生子群体漂移。例如,我们可能会遇到年龄稍大或稍小的孩子,不同比例的小儿肺炎病例,或者略有不同体征的不同人群儿童。在“BREEDS: Benchmarks for Subpopulation Shift”中描述的方法集中于后一种情况,即某些对象的品种在基准数据集中被遗漏,因此在训练期间未被观察到。通过从流行基准数据集中移除某些子群体,作者能够在一定程度上识别和缓解遇到新子群体的影响。同一研究小组还开发了工具,以实施他们在鲁棒性研究中的发现。除了支持重新创建品种基准的工具外,鲁棒性软件包还支持各种类型的模型训练、对抗训练和输入操作功能。
在高风险场景中,对机器学习和深度学习的挑战保持清醒是很重要的。即使是今天,要训练一个准确且健壮的医学图像分类器,仍需要大量精心标记的数据、专业的人类领域知识的整合、尖端的机器学习技术以及严格的测试。此外,正如“Safe and Reliable Machine Learning”的作者所指出的,要在部署环境中了解所有风险基本上是不可能的。因此,我们应该努力将工作流程转向强调明确保护免受可能发生的问题性转移的预防性方法。
接下来,我们将探讨对抗性示例攻击,这有助于我们了解模型中的不稳定性和安全漏洞。一旦发现对抗性示例,它们可以帮助我们在训练更健壮的深度学习系统时采取积极主动的措施。
对抗性示例攻击
我们在第八章中介绍了对于表格数据集的对抗示例。回想一下,对抗示例是导致模型输出惊人变化的奇怪输入数据实例。在本节中,我们将从 DL 肺炎分类器的角度来讨论它们。更具体地说,我们将尝试确定我们的分类器是否能够处理对抗示例攻击。通过向现有数据添加一个小但精心设计的噪声来创建对抗性输入。这种噪声,虽然通常对人类来说几乎不可察觉,却可以显著改变模型的预测结果。利用对抗示例来改进 DL 模型的想法在“解释和利用对抗示例”中备受关注,作者展示了现代计算机视觉 DL 系统易受骗的方式,以及如何重新将对抗示例纳入模型训练中以创建更加健壮的系统。自那时以来,已经进行了几项研究,专注于如面部识别和路标分类等安全关键应用,展示了这些攻击的有效性。大量后续的鲁棒 ML研究集中于对抗示例的应对措施和鲁棒性。
对 DL 系统创建对抗示例最流行的方法之一是快速梯度符号法(FGSM)。与我们在第八章中处理的树木不同,神经网络通常是可微的。这意味着我们可以利用梯度信息根据网络的错误曲面构建对抗示例。FGSM 执行的操作类似于梯度下降的反向过程。在梯度下降中,我们使用模型对权重的误差函数的梯度来学习如何改变权重以减少误差。在 FGSM 中,我们利用模型对输入的误差函数的梯度来学习如何改变输入以增加误差。
FGSM 为我们提供了一张图像,通常看起来像静态,其中每个像素都设计成增加模型误差函数。我们使用一个调节参数,epsilon,来控制对抗示例中像素强度的大小。一般来说,epsilon 越大,我们可以预期对抗示例的误差越严重。我们倾向于保持 epsilon 较小,因为网络通常只是累加所有小扰动,从而影响模型结果的大变化。就像在线性模型中一样,对每个像素(输入)的微小改变可以导致系统输出的巨大变化。我们必须指出这种讽刺,也被其他作者强调过,即廉价且有效的 FGSM 方法主要依赖于 DL 系统基本上像巨大线性模型一样的行为。
“解释和利用对抗样本”中的 FGSM 攻击的一个著名例子显示,模型首先将一张熊猫的图片识别为熊猫。然后应用 FGSM 创建了一张扰动的、但在视觉上相同的熊猫图片。网络随后将该图片分类为长臂猿或者某种灵长类动物。虽然有几个像cleverhans,foolbox,和adversarial-robustness-toolbox这样的包用于创建对抗样本,我们根据官方 PyTorch 文档中的例子手动实现了 FGSM 攻击于我们的精调肺炎分类器上。然后我们将攻击我们现有的精调模型,并通过扰动测试集中的样本生成对抗性图像,如图 9-5 所示。当然,我们并不试图把熊猫变成长臂猿。我们试图了解我们的肺炎分类器对几乎不可察觉的噪声有多强韧。

图 9-5. 隐形对抗样本攻击将肺炎分类器的预测从正常变为肺炎。
以 99%的置信度预测一个普通类别图像的分类器将 FGSM 扰动的图像误分类为肺炎图像。请注意噪声的量几乎不可察觉。
我们还绘制了一个准确率与 epsilon 的图来观察模型的准确率随着扰动大小的变化。Epsilon 值是应用于输入图像以创建对抗性样本的扰动的度量。模型的准确率通常被测量为模型正确分类的对抗性样本的百分比。较低的 epsilon 值对应较小的扰动,较高的 epsilon 值对应较大的扰动。在给定的例子中,随着 epsilon 值的增加,应用于输入图像的扰动变得更大,模型的准确率通常会降低。曲线的形状在图中会根据具体的模型和数据集而变化,但通常随着 epsilon 值的增加而减小。准确率与 epsilon 的图(图 9-6)是评估机器学习模型对抗性样本强韧性的有用工具,因为它允许研究人员看到随着扰动大小的增加模型准确率的变化。

图 9-6. 对抗图像的准确率与 epsilon 的比较(数字,彩色版本)
再次强调,我们不是医生或放射科医生。但是我们如何能够信任一个系统,其中不可见的变化导致了对如此高风险应用的预测有巨大的波动?我们必须绝对确保没有任何噪音进入我们的诊断图像,无论是意外的还是由不良行为者放置的。我们也希望我们的模型对噪音更加稳健,就像我们希望它对数据漂移更加稳健一样。在 “修复” 中,我们将概述在训练中使用对抗样本来使 DL 系统更加健壮的一些选项。目前,我们将重点介绍另一种扰动和敏感性分析技巧,可以用来发现 DL 模型中其他类型的不稳定性。
扰动计算超参数
DL 模型需要正确设置大量的超参数,以找到解决问题的最佳模型。正如 “欠规范化对现代机器学习可信度的挑战” 中所强调的,使用标准评估技术来选择超参数通常会导致在测试数据中看起来很好的模型,在实际世界中表现不佳。这篇欠规范化论文提出了几种我们可以用来检测这个问题的测试方法。
我们在本章及几个其他章节中提到了分段错误分析,这仍然是一个重要的测试,应在可能的情况下进行,以检测欠规范化和其他问题。另一种测试欠规范化的方法是扰动与我们试图解决的问题结构无关的计算超参数。其理念是改变随机种子或与数据或问题结构无关的其他内容,比如 GPU 数量、机器数量等,不应显著改变模型的性能。如果这样做,就表明存在欠规范化。如果可能,尝试在训练过程中使用几个不同的随机种子或分布方案(GPU 或机器数量),并确保测试性能是否因这些变化而显著变化。最有效的欠规范化缓解方法是通过额外的人类领域专业知识对模型进行约束。我们将在下一节中讨论几种方法来实现这一点。
修复
通常情况下,当我们发现 bug 时,我们会尝试修复它们。本节将专注于修复我们的 DL 模型的 bug,并讨论一些通用的 DL 管道问题解决方法。和往常一样,我们最严重的问题大多源于数据质量。我们花了很多时间整理数据泄露问题,并手动裁剪图像以修复对齐问题。然后,我们使用新的分析工具分析了我们的管道,以找出并修复任何明显的软件 bug。我们还应用了 L2 正则化和一些基本的对抗训练技术,以增强我们模型的鲁棒性。我们将在接下来的章节中详细介绍所有这些操作的具体细节,并突出几种其他流行的 DL 修复策略。
数据修复
关于数据修复,首先要记住,在第七章中,我们通过仔细增强图像来解决数据不平衡问题。然后我们怀疑我们的一些性能问题是否来自于嘈杂和对齐不良的图像。逐一浏览这些图像时,用照片编辑软件裁剪它们时,我们发现了一个数据泄漏。因此,我们还必须修复我们发现的数据泄漏,然后回头处理图像对齐的问题。经过这些耗时的手动步骤后,我们能够应用双微调训练方法,显著提高了我们模型的仿真性能。
注意
即使在非结构化数据问题中,我们也应该尽可能熟悉我们的数据集。引用 Google 的负责任的 AI 实践,“在可能的情况下,直接检查原始数据。”
为了确保不同数据集中个体之间没有泄漏,我们通过将训练集中的独特图像转移到验证集来手动扩展验证数据集。我们使用 PyTorch 中可用的转换来增强剩余的训练集图像,特别注意与非对称图像相关的域约束(肺部图像不是左右对称的,因此我们不能使用将图像水平翻转的增强方法)。这消除了数据泄漏。
警告
在增强后将数据分割为训练集、验证集和测试集是深度学习管道中常见的数据泄漏来源。
我们尝试的下一个修复方法是使用图像处理软件手动裁剪一些 X 光图像。虽然 PyTorch 有一些转换可以帮助中心裁剪 X 光图像,但在我们的数据上效果并不理想。因此,我们迎难而上,自己裁剪了数百张图像。在每种情况下,我们试图尽可能保留 X 光图像的肺部部分,消除边缘周围的不必要的伪影,并尽可能保持所有图像的比例。图 9-7 展示了裁剪数据集中的一组随机图像。(将这些图像与图 9-1 中的图像进行比较。)我们还注意不在裁剪过程中重新引入数据泄漏,并尽力保持裁剪后的图像处于其正确的数据分区中。

图 9-7. 手动裁剪的 X 光图像
手动裁剪图像的主要优势在于创建另一个数据集,可以用于两阶段迁移学习过程。正如在第七章中所解释的,我们使用预训练的 DenseNet-121 进行迁移学习。然而,这种架构所训练的源数据与我们的目标域显著不同。因此,我们首先在增强且无泄漏数据集上对模型进行微调,然后仅在裁剪数据集上对结果模型进行另一次微调。表格 9-3 显示了第二个迁移学习阶段后的测试集性能。
表格 9-3. 双重微调测试集性能比较
| 对数损失 | 准确性 | |
|---|---|---|
| 迁移学习阶段 1 | 0.4695 | 0.9036 |
| 迁移学习阶段 2 | 0.2626 | 0.9334 |
由于双重微调模型在留存测试集上表现更好,我们选择它作为我们的最佳模型。要达到这个目标,需要付出大量的手动工作,这对于许多深度学习项目来说可能是现实。
在修复数据问题的研究中,我们遇到了Albumentations 库,用于增强,以及label-errors 项目,提供了修复一些常见图像问题的工具。尽管我们不得不回到手动修复,但这些包似乎总体上是有帮助的。在长时间的干净数据争取之后,并找到适合该数据的微调过程后,是时候再次检查我们的代码了。
软件修复
由于深度学习流水线涉及多个阶段,有许多组件需要调试,我们还必须考虑它们的集成。如果我们一次更改超过一个设置、阶段或集成点,我们将无法知道哪个变化改进或损害了我们的工作。如果我们在代码更改方面不系统化,我们可能会疑惑是否选择了最佳的模型架构?优化器?批处理大小?损失函数?激活函数?学习率?等等。为了有希望严格回答这些问题,我们必须将软件调试分解为一小步,试图逐一孤立和修复问题。我们最终制定了软件测试清单,以保持理智并实现对流水线的系统调试:
检查我们的训练设备。
在进行训练之前,请确保模型和数据始终在同一设备上(CPU 或 GPU)。在 PyTorch 中,初始化一个变量来保存我们训练网络的设备(CPU 或 GPU)是一个常见的做法:
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)
总结网络架构。
总结层、梯度和权重的输出,确保没有不匹配。
测试网络初始化。
检查权重和超参数的初始值。考虑它们是否合理,是否有任何异常值是很容易看到的。如有需要,尝试不同的值。
确认小批量训练设置。
过度拟合少量数据以检查训练设置。如果成功,我们可以转向更大的训练集。如果不成功,我们回过头来调试我们的训练循环和超参数。以下代码演示了在 PyTorch 中过度拟合单个批次:
single_batch = next(iter(train_loader))
for batch, (images, labels) in enumerate([single_batch] * no_of_epochs):
# training loop
# ...
调整(初始)学习率。
极小的学习率会使优化器收敛得非常缓慢,但会更仔细地穿越误差曲面。较高的学习率则相反。优化器会更随意地跳跃误差曲面。选择好的学习率非常重要但也很困难。在 PyTorch 中有一些开源工具,比如PyTorch 学习率查找器可以帮助确定适当的学习率,如下代码所示。论文"训练神经网络的循环学习率"讨论了一种我们发现有帮助选择深度学习学习率的方法。这些只是可用选项中的几个。如果我们使用自调节学习率,我们也必须记住,除非我们达到一个相对现实的停止标准,否则我们无法测试它。
from torch_lr_finder import LRFinder
model = ...
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.1, weight_decay=1e-2)
lr_finder = LRFinder(model, optimizer, criterion, device="cuda")
lr_finder.range_test(
trainloader,
val_loader=val_loader,
end_lr=1,
num_iter=100,
step_mode="linear"
)
lr_finder.plot(log_lr=False)
lr_finder.reset()
优化损失函数和优化器。
将损失函数与手头问题匹配对于一般可用的机器学习结果至关重要。对于深度学习,选择最佳损失函数特别困难,因为有这么多选项和可能的自定义,无论是损失函数还是优化器。我们也没有像一些更简单的模型那样的收敛保证。例如损失函数的一个 bug,考虑 PyTorch 中的一个常见问题:应用 softmax 损失而不是交叉熵损失。对于 PyTorch,交叉熵损失期望 logit 值,将概率作为输入传递给它不会给出正确的输出。为了避免这类问题,为合理数量的测试迭代训练损失和优化器的选择,检查迭代图和预测,以确保优化过程按预期进行。
调整正则化。
当代深度学习系统通常需要正则化以良好泛化。然而,有许多选择(L1、L2、dropout、输入 dropout、噪声注入等),也不是不可能过火。过多的正则化可能会阻止网络收敛,这也是我们不想要的。需要一些实验来选择正确的正则化量和类型。
测试驱动网络。
发现开始一项大型训练任务,只是发现它在某个地方分歧,或者在烧掉很多芯片周期后未能产生良好的结果,这一点一点都不有趣。如果可能的话,训练网络深入其优化过程并检查事物是否顺利进行,然后再执行最终的长时间训练运行。这种测试驱动也作为底线集成测试。
提高可重现性。
尽管随机梯度下降(SGD)和其他随机性已经内置到许多当代深度学习中,我们必须有一些基线来进行工作。如果没有其他原因,我们需要确保不会在我们的管道中引入新的错误。如果我们的结果波动太大,我们可以检查我们的数据拆分、特征工程、不同软件库的随机种子以及这些种子的放置位置。(有时我们需要在训练循环中使用种子。)有时候也有确保精确可再现性的选项,尽管这会牺牲训练时间。在我们的管道中,遭受一些非常慢的部分训练运行来隔离可再现性问题可能是有意义的。这很困难,但是一旦我们建立了可重现的基线,我们就真正在通向构建更好模型的道路上了。
我们必须执行这些步骤,识别错误,并重新测试数百次——在此过程中捕捉无数的错别字、错误和逻辑问题。一旦修复了我们的代码,我们希望保持其干净,并且尽可能具有可重现的结果。一种有效的方法是使用像Weights & Biases这样的新实验跟踪工具。通过高效的数据集版本控制和模型管理,这些工具可以帮助更快地构建更好的模型。图 9-8 展示了在整洁的仪表板中跟踪和可视化多个深度学习建模实验,从而减少错误,并提高可重现性。

图 9-8. 使用 Weights & Biases(数字版,彩色版本)追踪多个实验
虽然我们可以使用上述调试步骤、单元测试、集成测试和实验跟踪器来识别和避免常见的错误,但另一种选择是尝试避免复杂的训练代码。对于更简单的问题,一个极好的替代方法是使用PyTorch Lightning——一个开源的 Python 库,为 PyTorch 提供高级接口。它管理所有低级细节,抽象出常见的重复代码,使用户能够更多地专注于问题领域,而不是工程化方面。
现在我们对代码管道的表现感到自信,并且没有大量错误存在,我们将转而尝试修复网络中的稳定性问题。
敏感性修复
数据存在问题。代码也有问题。我们尽力在深度学习管道中解决这些问题。现在是时候尝试修复我们发现的数学问题了。本章中遇到的鲁棒性问题并不是独特的。它们是深度学习中最著名的问题之一。在接下来的子章节中,我们将从主要研究中汲取灵感,解决一些实际的修复问题,并讨论未来可以尝试的其他几个选项。
噪声注入
网络泛化能力差的最常见原因之一是过拟合,特别是在我们使用的小型数据集中更为明显。噪声注入是一种有趣的选项,用于定制正则化并为我们的流水线添加强正则化。我们决定尝试这种方法,故意损坏我们的训练数据,作为在训练过程中添加额外正则化的一种方式。向训练样本添加噪声可以帮助使网络更能抵抗输入扰动,并且在模型参数上有类似于 L2 正则化的效果。向图像添加噪声也是一种数据增强方法,因为它从原始数据集中创建了人工样本。
注意
在图像中注入随机噪声也被称为jitter,这个词已有几十年历史,源于信号处理。注入高斯噪声在许多情况下等效于 L2 正则化。
我们在训练样本中添加了少量高斯噪声。然后,我们在这些噪声污染的训练数据上重新训练模型,并在全新的未见过的数据集上测试模型。我们希望这种粗糙的正则化方法能改善模型的泛化能力,无论是在分布内保留数据上还是可能的分布外数据上。
表 9-4 展示了噪声注入重新训练的结果。
表 9-4. 两个模型在分布内和分布外数据上的损失值
| 分布内 | 分布外 | |
|---|---|---|
| 原始模型 | 0.26 | 2.92 |
| 噪声注入模型 | 0.35 | 2.67 |
表 9-4 展示了原始模型和在噪声污染数据上训练的模型的损失值。我们可以看到,L2 正则化模型在原始分布数据上表现略逊于原始模型。损失值 0.26 和 0.35 对应于肺炎类的平均模型评分分别为 0.77 和 0.70。另一方面,噪声注入模型在全新数据集上表现略优于原始模型。然而,2.67 的损失值仍然很糟糕,正如表 9-5 所示,该模型在分布外数据上的表现仅比随机稍好。
表 9-5. 噪声注入模型在分布外数据上的混淆矩阵
| 预测正常 | 预测肺炎 | |
|---|---|---|
| 实际普通 | 155 | 125 |
| 实际肺炎 | 118 | 171 |
所以,噪声注入并没有让我们的模型在分布外数据上表现得奇迹般。但是,一切都相等的情况下,我们希望部署更加正则化的模型,该模型在测试数据上表现也相当不错,可能是在减少高斯噪声标准偏差的情况下,降低正则化水平后。虽然在这个例子中,我们仅向训练样本添加了噪声,但有时还可以将噪声添加到权重、梯度和标签中,以增强鲁棒性。
稳定性修复
我们试验了许多其他稳定性修复方法,但与噪声注入类似地看到了类似的结果。有些方法稍微有所帮助,但没有完全“修复”我们的分布外表现。然而,这并不意味着它们没有让我们的模型在某些未见数据上表现更好。接下来,我们将讨论更多数据增强选项、使用带噪标签的学习、基于领域的约束以及鲁棒的机器学习方法,然后结束本章:
自动化数据增强
提升鲁棒性的另一种选择是在训练过程中使网络暴露于更广泛的数据分布。虽然不总是可能获取新数据,但有效的数据增强在深度学习管道中变得相对简单。Albumentations 是一个流行的库,用于为计算机视觉任务创建不同类型的增强图像。Albumentations 可与流行的深度学习框架(如 PyTorch 和 Keras)轻松兼容。AugLy 是另一个数据增强库,专注于为音频、视频和文本(以及图像)创建更加鲁棒的深度学习模型。AugLy 的独特之处在于,它从互联网的真实图像中获得灵感,并提供了一套超过一百种增强选项。
使用带噪标签的学习
由于各种原因,图像的标签可能存在噪声或错误。这可能是因为标记和训练现代深度学习系统所需的图像数量庞大,标签费用昂贵,标记复杂图像的技术困难或其他原因。实际上,这意味着我们经常在带有噪声标签的训练数据上训练。在最基本的层面上,我们可以在训练数据中随机调整一小部分图像标签,希望这能使我们的模型对标签噪声更加鲁棒。当然,我们总是可以做更多的事情,学习带噪标签是深度学习研究的一个繁忙领域。GitHub 仓库 noisy_labels 列出了大量可能的带噪标签学习方法和工具。此外,请回想一下,在第七章中,我们使用标签洗牌作为发现鲁棒特征和检查解释技术的一种方式。从我们的观点来看,使用标签洗牌进行解释、特征选择和检查目的可能是其今天的最高呼声。
基于领域的约束
要打败不充分的情况,将领域信息或先验知识纳入深度学习系统是至关重要的。将先验知识整合到深度学习模型中的一种方法称为物理信息驱动深度学习,其中与问题相关的分析方程被添加到网络的损失函数和梯度计算中。预训练是另一种更好地约束 ML 系统到适当领域的方式。被称为领域或任务自适应预训练,在领域或任务特定预训练运行期间学习的权重可以被用于监督训练或网络微调,以更加具体地绑定训练到领域。我们还可以使用单调或形状约束,如 TensorFlow 的Lattice,以确保模型输入和目标之间的建模关系遵循因果关系现实。别忘了基础知识。我们需要将我们的损失函数与已知的目标和误差分布匹配。如果领域知识注入对读者有趣,请查看“信息机器学习”进行广泛的评估,考虑知识来源、它们的表示以及它们如何集成到 ML 流水线中。
强韧机器学习
虽然名字有点混淆,强大的机器学习 是解决对抗模型操纵的深度学习研究领域的常见术语。强韧机器学习 是一个由社区运营的网站,汇总了不同的防御策略,并提供各种对抗例攻击和数据污染的防御措施。强韧机器学习是一个广泛的研究领域,一些常见的方法包括对抗性示例的重新训练,梯度遮蔽以及对抗数据污染的对策:
对抗性示例的重新训练
流行的技术包括在正确标记的对抗性示例上重新训练,这些示例是通过 FGSM 等方法找到的。(我们尝试过这个,但结果看起来很像噪声注入结果。) 这种技术涉及使用原始数据和对抗性示例的组合对模型进行重新训练,之后模型应该更难欺骗,因为它已经看过许多对抗性示例。由Madry 实验室的论文“对抗性示例不是错误,它们是特征”提供了更多关于如何理解对抗性示例的视角。
梯度遮蔽
梯度掩蔽的作用是改变梯度,使其在对抗性示例创建时对攻击者没有用处。事实证明,梯度掩蔽实际上并不是一个很好的防御方法,并且可以被有动机的攻击者轻松绕过。然而,梯度掩蔽对于红队测试和测试目的非常重要,因为许多其他攻击灵感来自梯度掩蔽的弱点。例如,foolbox 库很好地演示了梯度替代,即用平滑的替代梯度替换原始模型的梯度,并利用该替代梯度构建有效的对抗性示例。
数据污染对策
有许多防御措施用于检测和减轻数据污染。例如,对抗性鲁棒性工具箱(ART)包含基于隐藏单元激活和数据来源的检测方法,以及使用谱特征。基本思想分别是,由数据污染创建的后门应导致隐藏单元以异常方式激活,因为后门应只在罕见情况下使用;数据来源(开发对训练数据处理的仔细理解和记录)可以确保数据没有被污染;以及使用主成分分析来发现对抗性示例的显著特征。要了解 ART 如何检测数据污染的示例,请查看激活防御演示。
正如读者所见,有很多选项可以增强深度学习的鲁棒性。如果我们最担心在新数据上的鲁棒性表现,噪声注入、数据增强和嘈杂标签技术可能是最有帮助的。如果我们有能力注入更多人类领域知识,我们应该始终这样做。而如果我们担心安全性和对抗性操纵,我们需要考虑官方的鲁棒机器学习方法。虽然有一些经验法则和逻辑上的想法来确定何时应用哪种修复方法,但我们真的必须尝试许多技术,找到适合我们数据、模型和应用的最佳方法。
结论
即使经过所有这些测试和调试,我们相当肯定不应该部署这个模型。尽管作者中没有人认为自己是深度学习专家,但我们确实在思考这反映了深度学习周围炒作的水平。如果作者团队在数月的工作后仍然无法正确构建这个模型,那么在现实中,使高风险深度学习分类器工作需要什么呢?我们拥有不错的 GPU 和多年的机器学习经验。但这还不够。我们方法中明显缺少的两个要素是大量训练数据和领域专家的支持。下次我们承担高风险深度学习应用时,我们一定要确保能够获得这些资源。但这不是几个数据科学家能够单独完成的项目。这本书中反复强调的一个教训是,要使高风险项目成功,需要不止几个数据科学家。
至少,我们将需要整个供应链来获得适当标记的图像和获取昂贵的领域专家支持。即使有了这些改进的资源,我们仍然需要执行本章描述的测试类型。总体来说,我们对深度学习的经验带给我们更多问题而不是答案。有多少深度学习系统是在较小的数据集上训练且没有人类领域专家的支持?有多少深度学习系统是在没有进行本章描述的测试级别部署的?在这些情况下,系统真的没有漏洞吗?或者可能是假定它们没有漏洞?对于低风险的游戏和应用程序,这些问题可能不是什么大问题。但对于应用在医学诊断、执法、安全、移民等高风险问题领域的深度学习系统,我们希望这些系统的开发者比我们拥有更好的资源,并且进行了严格的测试工作。
资源
代码示例
数据生成工具
深度学习攻击和调试工具
第十章:使用 XGBoost 测试和修复偏差
本章介绍了针对结构化数据的偏差测试和修复技术。虽然第四章从多个角度讨论了偏差问题,但本章集中于偏差测试和修复方法的技术实施。我们将从训练 XGBoost 模型开始,使用信用卡数据的变体。然后,我们将通过检查不同人群在性能和结果上的差异来测试偏差。我们还将尝试在个体观察级别识别任何偏差问题。一旦确认我们的模型预测中存在可测量的偏差水平,我们将开始尝试修复这些偏差。我们采用前处理、中处理和后处理的修复方法,试图修复训练数据、模型和结果。最后,我们将进行偏差感知的模型选择,得到一个性能优越且比原始模型更公平的模型。
虽然我们明确表示,偏差的技术测试和修复并不能解决机器学习偏差问题,但它们在有效的整体偏差缓解或机器学习治理程序中仍然扮演重要角色。虽然模型的公平分数不会直接转化为部署的机器学习系统中的公平结果——出于任何原因——但拥有公平的分数总比没有好。我们还会认为,测试那些作用于人的模型是否存在偏差是数据科学家的基本和明显的伦理义务之一。我们之前提到的另一个主题是,未知风险比已知风险难以管理得多。当我们知道系统可能存在偏差风险和危害时,我们可以尝试修复这种偏差,监控系统的偏差,并应用许多不同的社会技术风险控制措施——如漏洞赏金或用户访谈——来减轻潜在的偏差。
注意
本章重点介绍了偏差测试和修复在一个相当传统的分类器上的应用,因为这是这些主题最好理解的地方,而且因为许多复杂的人工智能结果最终都可以归结为可以像二元分类器一样处理的最终二元决策。我们在整章中也突出了回归模型的技术。有关如何管理多项式、无监督或生成系统中的偏差问题的想法,请参阅第四章。
通过本章末尾,读者应了解如何测试模型的偏差,并选择一个既不那么偏倚又表现良好的模型。虽然我们承认在机器学习偏差问题上没有银弹技术修复方案,但一个更公平、更高效的模型比一个未经偏差测试或修复的模型更适合高风险应用。本章的代码示例可在线获取(链接)。
概念复习:管理机器学习偏差
在我们深入探讨本章的案例研究之前,让我们快速回顾一下第四章中适用的主题。从第四章中最重要的事情是,所有的机器学习系统都是社会技术系统,而我们在本章中关注的纯技术测试并不能捕捉到可能由机器学习系统引起的所有不同的偏差问题。简单的事实是,“公平”的模型评分,如在一个或两个数据集上测量的,完全不能完整地反映系统的偏差情况。其他问题可能源于未被代表的用户、可访问性问题、物理设计错误、系统的下游误用、结果的误解等等。
警告
技术方法与偏差测试和缓解必须与社会技术方法结合起来,以充分解决潜在的偏差危害。我们不能忽视我们团队自身的人口背景、用户的人口统计信息或在训练和测试数据中被代表的人群、数据科学文化问题(比如被称为“摇滚明星”的问题)、以及高度发展的法律标准,并期望能够解决机器学习模型中的偏差。本章主要集中在技术方法上。第四章试图描述一种更广泛的社会技术方法来管理机器学习中的偏差。
我们必须通过将多样化的利益相关者参与到机器学习项目中,并遵守系统化的模型开发方法,来增强技术偏差测试和补救工作的努力。我们还需要与用户沟通,并遵守将人类对计算机系统决策负责的模型治理。坦率地说,这些类型的社会技术风险控制可能比我们在本章讨论的技术控制更重要、更有效。
尽管如此,我们不希望部署明显存在偏见的系统,如果我们能让技术变得更好,我们应该去做。较少偏见的机器学习系统是有效的偏见缓解策略的重要组成部分,为了做到这一点,我们将需要从我们的数据科学工具中获得很多工具,如对抗模型、对群体结果的实际和统计差异测试、对不同人群之间性能差异的测试以及各种偏见补救方法。首先,让我们来了解一下在本章中将会使用的一些术语:
偏见
对于本章,我们指的是系统性偏见——根据国家标准技术研究所(NIST)SP 1270 AI 偏见指南中定义的历史性、社会性和制度性偏见。
对抗模型
在偏见测试中,我们经常对我们正在测试的模型的预测进行对抗训练,以预测人口统计信息。如果一个机器学习模型(对手)能够从另一个模型的预测中预测出人口统计信息,那么这些预测很可能包含某种系统偏见。至关重要的是,对抗模型的预测还为我们提供了一种逐行测量偏见的方法。对手模型最准确的行往往可能编码了更多的人口统计信息或其代理物。
实用和统计显著性测试
最古老的偏见测试之一专注于不同群体之间的平均结果差异。我们可能使用实用测试或效果大小测量,如不利影响比率(AIR)或标准化平均差异(SMD),来理解平均结果差异是否在实际上具有意义。我们可能使用统计显著性测试来理解跨人口统计群体的平均差异是否更多地与我们当前的数据样本相关,或者在未来可能再次出现。
差异性能测试
另一种常见的测试类型是调查跨群体之间的性能差异。我们可能调查真正阳性率(TPR)、真正阴性率(TNR)或 R²(或均方根误差)在人口统计群体之间是否大致相等或不相等。
四分之五法则
1978 年由平等就业机会委员会(EEOC)发布的《雇员选择程序统一指南(UGESP)》中的四分之五法则是一个指导方针。UGESP 的第 1607.4 部分规定,“对于任何种族、性别或族裔群体的选择率,如果低于具有最高率的群体的率的四分之五(4/5)(或百分之八十),通常将被联邦执法机构视为对不利影响的证据。”不管是好是坏,0.8 的 AIR 值——用于比较事件率,如职位选择或信贷批准——已成为机器学习系统中偏见的广泛基准。
修复方法
当测试发现问题时,我们希望修复它们。技术上的偏见缓解方法通常称为修复。关于机器学习模型和偏见,我们可以说的一件事是,与传统的线性模型相比,机器学习模型似乎提供了更多修复自身的方法。由于拉尚蒙效应——即任何给定训练数据集通常存在许多准确的机器学习模型——我们有更多的杠杆和开关可以调整,以找到减少偏见并保持机器学习模型持续预测性能的更好选择。由于在机器学习中存在如此多的模型选项,因此有许多潜在的修复偏见的方法。其中一些最常见的包括前处理、中处理和后处理,以及模型选择:
预处理
重新平衡、重新加权或重新采样训练数据,以使人口统计群体更好地代表或积极结果更平等地分布。
内部处理
ML 训练算法的任何修改,包括约束、正则化和双重损失函数,或者整合对抗建模信息,旨在生成跨人口群体更平衡的输出或性能。
后处理
直接更改模型预测以创建更少偏见的结果。
模型选择
在选择模型时考虑偏见和性能。通常,如果我们在大量超参数设置和输入特征上测量偏见和性能,可以找到性能良好且公平特性的模型。
最后,我们需要记住,在 ML 偏见问题中,法律责任可能会产生影响。与 ML 系统中的偏见相关的法律责任有很多,由于我们不是律师(你可能也不是),我们需要对法律的复杂性保持谦逊,不要让达宁-克鲁格效应占上风,并请教真正的非歧视法律专家。如果我们对 ML 系统中的法律问题有任何疑虑,现在就是联系经理或法律部门的时候了。考虑到所有这些严肃的信息,现在让我们跳入训练一个 XGBoost 模型,并测试其是否存在偏见。
模型训练
本章用例的第一步是在信用卡示例数据上训练一个 XGBoost 模型。为避免不同待遇问题,我们将不使用人口统计特征作为此模型的输入:
id_col = 'ID'
groups = ['SEX', 'RACE', 'EDUCATION', 'MARRIAGE', 'AGE']
target = 'DELINQ_NEXT'
features = [col for col in train.columns if col not in groups + [id_col, target]]
一般来说,对于大多数业务应用程序而言,最安全的做法是不使用人口统计信息作为模型输入。这不仅在消费信贷、住房和就业等领域存在法律风险,还意味着业务决策应该基于种族或性别——这是危险的领域。然而,使用人口统计数据来训练模型可以减少偏见,我们将在尝试内部处理偏见修复时看到一个版本。也许还有某些决策应该基于人口统计信息,比如关于医疗治疗的决策。由于这是一个示例信贷决策,并且我们不是社会学家或非歧视法律专家,我们将保守起见,不在我们的模型中使用人口统计特征。我们将使用人口统计特征来测试偏见并在本章后期修复偏见。
警告
数据科学家在模型中使用人口统计信息或技术性偏差修复方法时,常犯的一个错误是可能导致不平等待遇。尽管坚持意识到公平的信条在某些情况下可能会有不同看法,但截至目前,在与住房、信贷、就业和其他传统高风险应用相关的机器学习中,对偏差管理最保守的方法是在模型或偏差修复中直接不使用人口统计信息。通常可以接受的做法是仅将人口统计信息用于偏差测试。详细信息请参阅第四章。
尽管存在风险,人口统计信息对于偏差管理至关重要。组织在管理机器学习偏差风险时犯的一个错误是没有必要的信息来进行测试和后续的偏差修正。至少,这意味着需要人们的姓名和邮政编码,以便我们可以使用贝叶斯改进的姓氏地理编码和相关技术来推断其人口统计信息。如果数据隐私控制允许,并且有适当的安全措施,收集人们的人口统计特征用于偏差测试是最有用的。需要注意的是,本章使用的所有技术都需要人口统计信息,但大多数情况下,我们可以使用推断或直接收集的人口统计信息。在解决了这些重要的注意事项后,让我们来看看如何训练我们受限制的 XGBoost 模型并选择一个得分截断值。
警告
在必须管理偏差风险的情况下训练模型之前,我们应始终确保我们手头有足够的数据来进行偏差测试。至少需要姓名、邮政编码和 BISG 实现。在最大范围内,这意味着收集人口统计标签以及所有与收集和存储敏感数据相关的数据隐私和安全注意事项。无论哪种方式,当涉及机器学习偏差时,无知都不是幸福的状态。
我们再次利用单调约束的优势。在管理机器学习偏差时,透明度的重要性主要体现在,如果偏差测试指出问题(通常是这样),我们更有可能理解模型存在何种问题,并尝试修复它。如果我们使用的是一个无法解释的机器学习模型,而出现了偏差问题,我们通常会放弃整个模型,希望在下一个无法解释的模型中能够更好地运气。这对我们来说并不是很科学。
我们喜欢尽可能地测试、调试和理解机器学习模型的工作原理和原因。除了更稳定和更具普适性之外,我们受限制的 XGBoost 模型还应更具透明性和可调试性。我们还必须强调,当我们利用单调约束来增强可解释性,并利用 XGBoost 的自定义目标功能来同时考虑性能和偏差(参见“In-processing”),我们修改我们的模型使其更透明和更公平。如果我们担心稳定性能、最大透明度和最小偏差在高风险应用中进行修改,这些似乎是确实正确的改变。XGBoost 已经发展成熟到可以提供这种深度定制的水平,这非常棒。
注意
我们可以在 XGBoost 中结合单调约束(增强可解释性)和自定义目标函数(偏差管理),直接训练更透明、偏差更小的机器学习模型。
就这一章节定义约束而言,我们采用基于 Spearman 相关系数的基本方法。Spearman 相关系数很好,因为它考虑单调性而不是线性(与 Pearson 相关系数不同)。我们还实现了一个corr_threshold参数来处理约束选择过程,以防止小的相关性导致虚假约束:
def get_monotone_constraints(data, target, corr_threshold):
# determine Spearman correlation
# create a tuple of 1,0,-1 for each feature
# 1 - positive constraint, 0 - no constraint, -1 - negative constraint
corr = pd.Series(data.corr(method='spearman')[target]).drop(target)
monotone_constraints = tuple(np.where(corr < -corr_threshold,
-1,
np.where(corr > corr_threshold, 1, 0)))
return monotone_constraints
# define constraints
correlation_cutoff = 0.1
monotone_constraints = get_monotone_constraints(train[features+[target]],
target,
correlation_cutoff)
要训练模型,我们的代码非常简单。我们将从我们以前使用过并取得良好结果的超参数开始,并且不会过于疯狂地调整超参数。我们只是试图从一个合理的基准开始,因为当我们进行偏差修正时,我们将进行大量的模型调优并应用谨慎的选择技术。这是我们第一次尝试训练的样子:
# feed the model the global bias
# define training params, including monotone_constraints
base_score = train[target].mean()
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'eta': 0.05,
'subsample': 0.6,
'colsample_bytree': 1.0,
'max_depth': 5,
'base_score': base_score,
'monotone_constraints': dict(zip(features, monotone_constraints)),
'seed': seed
}
# train using early stopping on the validation dataset.
watchlist = [(dtrain, 'train'), (dvalid, 'eval')]
model_constrained = xgb.train(params,
dtrain,
num_boost_round=200,
evals=watchlist,
early_stopping_rounds=10,
verbose_eval=False)
要在后续章节中计算像 AIR 和其他绩效质量比率这样的测试值,我们需要设定一个概率截断点,这样我们可以衡量我们模型的结果,而不仅仅是其预测的概率。就像我们训练模型时一样,我们现在正在寻找一个起点来获取一些基准读数。我们将使用像 F1、精确度和召回率这样的常见绩效指标来做到这一点。在图 10-1 中,您可以看到,通过选择最大化 F1 的概率截断点,我们在精确度(模型正确的正向决策比例(正向预测值))和召回率(模型正确的正向结果比例(真正例率))之间取得了良好的折衷。对于我们的模型,该数字是 0.26。要开始,所有高于 0.26 的预测都不会得到信用额度的增加。所有 0.26 或以下的预测都将被接受。

图 10-1. 通过最大化 F1 统计量选择的初步截断点,用于初始偏倚测试(数字,彩色版本)
我们知道,由于偏倚问题,我们很可能最终会调整截断点。在我们的数据和示例设置中,增加截断点意味着向更多的人放贷。当我们增加截断点时,我们希望也能向更多不同类型的人放贷。当我们降低截断点时,我们使我们的信用申请流程更为选择性,向较少的人放贷,可能也是较少不同类型的人。关于截断点的另一个重要说明——如果我们正在监控或审计一个已部署的 ML 模型,我们应该使用实际用于体内决策的确切截断点,而不是基于我们在这里选择的性能统计的理想化截断点。
注意
在训练和监控信用模型时,我们必须记住,我们通常只有过去被选中申请信用产品的申请人的良好数据。大多数人都认为,这种现象会为仅基于先前选择的个体的决策引入偏倚。如何处理这个问题,被广泛讨论为拒绝推断技术,目前不太清楚。请记住,类似的偏倚问题也适用于其他类型的申请,其中长期关于未选中个体的数据是不可用的。
评估偏倚模型
现在我们有了一个模型和一个截止日期,让我们深入挖掘并开始测试其偏见。在本节中,我们将测试不同类型的偏见:表现上的偏见,结果决策中的偏见,对个体的偏见以及代理偏见。首先,我们为每个人群构建混淆矩阵和许多不同的表现和错误指标。我们将应用从就业中建立的偏见阈值作为一种经验法则,用于识别性能中的任何问题性偏见比率。然后,我们将应用传统的偏见测试和效果大小测量,与美国公平信贷和就业合规程序中使用的测量对齐,以测试模型结果中的偏见。然后,我们将查看残差,以识别任何超出截止日期的个体或任何奇怪的结果。我们还将使用对抗模型来识别似乎编码了更多偏见的数据行。最后,我们将通过强调查找代理的方式来结束我们的偏见测试讨论,即在模型中起到类似人口统计信息的看似中立输入特征,这可能导致不同类型的偏见问题。
对群体的测试方法
我们将从检查我们的模型在平均情况下如何处理人群问题开始我们的偏见测试练习。根据我们的经验,最好从法律标准指导的传统测试开始。对于大多数组织而言,AI 系统的法律风险是最严重的,评估法律风险是进行偏见测试的最简单途径。因此,为了简洁起见,我们在本章不考虑交叉组群。我们将专注于传统的受保护类别和相关的传统种族群体。根据应用、管辖权和适用法律、利益相关者需求或其他因素,跨传统人口统计群体、交叉人口统计群体甚至肤色调查表进行偏见测试可能是最合适的。例如,在公平信贷背景下——由于已建立的法律偏见测试先例——首先跨传统人口统计群体进行测试可能是最合理的选择,如果时间或组织动态允许,我们应该回到交叉测试。对于在广泛美国经济中运行的一般 AI 系统或 ML 模型,并不受特定非歧视要求的约束,尽可能在交叉群体中进行测试可能是默认选择。对于面部识别系统,跨肤色组进行测试可能是最合理的选择。
首先,我们将关注模型的性能,以及它在传统人口统计组群之间是否大致相等。 我们还将测试模型结果中群体公平性,有时也称为统计或人口统计的平等。 这些群体公平性的概念存在缺陷,因为定义和测量人群是困难的,平均值隐藏了许多关于个体的信息,而这些测试所使用的阈值也有些随意。 尽管存在这些缺陷,这些测试如今仍是最常用的。 它们可以向我们提供关于我们的模型在高层次行为如何以及指出严重关注领域的有用信息。 像本节中讨论的许多测试一样,解释它们的关键在于:通过这些测试并不意味着什么——我们的模型或系统仍然可能存在严重的现场偏差问题——但未通过这些测试则是偏差的一个重要红旗。
在开始测试之前,重要的是考虑在哪里进行测试。我们应该在训练数据、验证数据还是测试数据中进行测试?最标准的测试分区是验证数据和测试数据,就像我们测试模型性能时一样。在验证数据中测试偏差也可以用于模型选择的目的,正如我们将在“修正偏差”中讨论的那样。使用测试数据应该能够让我们大致了解模型在部署后如何持续偏差。 (没有保证 ML 模型在测试数据中表现类似于我们观察到的情况,因此部署后监控偏差至关重要。) 在训练数据中测试偏差主要用于观察与验证和测试分区中的偏差测量差异。 如果一个分区与其他分区有显著差异,这尤其有助于了解我们模型中偏差的驱动因素。 如果训练、验证和测试集的构建使得训练时间最早,测试时间最晚——它们很可能应该如此——比较数据分区间的偏差测量也有助于了解偏差趋势。 看到从训练到验证再到测试中偏差测量增加是一个令人担忧的迹象。 另一个选项是使用交叉验证或自举法来估计偏差测量的方差,这与标准性能指标一样。 交叉验证、自举法、标准差或误差、置信区间以及其他偏差指标的测量可以帮助我们理解我们的偏差测试结果是否更精确或更嘈杂——这是任何数据分析的重要组成部分。
在以下部分进行的偏差测试中,我们将坚持基本做法,并寻找验证和测试数据中模型性能和结果的偏差。如果你从未尝试过偏差测试,这是一个好的开始。在大型组织内部,物流和政治使得这更加困难,这可能是唯一可以完成的偏差测试。偏差测试永远不会结束。只要模型部署,就需要监控和测试偏差。所有这些实际问题使得偏差测试成为一项艰巨的工作,因此我们建议您从寻找跨大型人群中性能和结果偏差的标准做法开始,然后利用剩余的时间、资源和意愿来调查个体的偏差并识别模型中的代理或其他偏差驱动因素。现在我们将深入探讨这些内容。
注意
在我们开始偏差测试之前,我们必须非常清楚地了解数据中积极决策的表示方式,积极在现实世界中的含义,我们模型预测的概率如何与这两个概念对齐,以及哪些截断生成积极决策。在我们的示例中,大多数模型对象希望的决策是零的结果,与截断值 0.26 以下的概率相关联。接收到零分类的申请人将获得信贷额度。
测试性能
一个模型在人口统计群体中应该有大致相似的表现,如果没有,这是一种重要的偏差类型。如果所有群体都受到机器学习模型相同的标准的约束以获得信贷产品,但该标准对于某些群体未来的还款行为不是准确的预测者,那就不公平了。(这与就业概念中的differential validity有些相似,详见第四章。)为了开始测试我们的 XGBoost 模型在各组中的性能偏差,我们将查看每个组的混淆矩阵,并形成不同组间性能和误差的不同度量。我们将考虑常见的度量如真正率和假正率,以及一些在数据科学中不那么常见的度量,如虚假发现率。
下面的代码块远非最佳实现,因为它依赖于动态代码生成和一个eval()语句,但它的编写旨在尽可能地说明。在其中,读者可以看到混淆矩阵中的四个单元格如何用于计算许多不同的性能和误差指标:
def confusion_matrix_parser(expression):
# tp | fp cm_dict[level].iat[0, 0] | cm_dict[level].iat[0, 1]
# ------- ==> --------------------------------------------
# fn | tn cm_dict[level].iat[1, 0] | cm_dict[level].iat[1, 1]
metric_dict = {
'Prevalence': '(tp + fn) / (tp + tn +fp + fn)',
'Accuracy': '(tp + tn) / (tp + tn + fp + fn)',
'True Positive Rate': 'tp / (tp + fn)',
'Precision': 'tp / (tp + fp)',
'Specificity': 'tn / (tn + fp)',
'Negative Predicted Value': 'tn / (tn + fn)',
'False Positive Rate': 'fp / (tn + fp)',
'False Discovery Rate': 'fp / (tp + fp)',
'False Negative Rate': 'fn / (tp + fn)',
'False Omissions Rate': 'fn / (tn + fn)'
}
expression = expression.replace('tp', 'cm_dict[level].iat[0, 0]')\
.replace('fp', 'cm_dict[level].iat[0, 1]')\
.replace('fn', 'cm_dict[level].iat[1, 0]')\
.replace('tn', 'cm_dict[level].iat[1, 1]')
return expression
当我们对每个人种群的混淆矩阵应用confusion_matrix_parser函数以及循环遍历metric_dict中的组和度量时,我们可以制作像表 10-1 的表格。为简洁起见,本小节我们专注于人种测量。如果这是一个真实的信用或抵押贷款模型,我们将关注不同性别、不同年龄组、残疾人士、不同地理区域甚至其他亚群体。
表 10-1. 不同人种群体测试数据中从混淆矩阵中导出的常见性能和错误度量
| 组 | 流行率 | 准确率 | 真阳性率 | 精确率 | … | 假阳性率 | 错误发现率 | 假阴性率 | 假遗漏率 |
|---|---|---|---|---|---|---|---|---|---|
| 西班牙裔 | 0.399 | 0.726 | 0.638 | 0.663 | … | 0.215 | 0.337 | 0.362 | 0.235 |
| 黑人 | 0.387 | 0.720 | 0.635 | 0.639 | … | 0.227 | 0.361 | 0.365 | 0.229 |
| 白人 | 0.107 | 0.830 | 0.470 | 0.307 | … | 0.127 | 0.693 | 0.530 | 0.068 |
| 亚裔 | 0.101 | 0.853 | 0.533 | 0.351 | … | 0.111 | 0.649 | 0.467 | 0.055 |
表 10-1 开始显示我们模型性能中的一些偏见迹象,但尚未真正衡量偏见。它仅仅展示了不同组之间不同测量值的价值。当这些值在不同群体间明显不同时,我们应该开始关注。例如,精确率在不同人种群体间显著不同(白人和亚裔在一方,黑人和西班牙裔在另一方)。同样的情况也适用于其他测量,如假阳性率、错误发现率和假遗漏率。(流行率的差异告诉我们,在美国许多信贷市场中,黑人和西班牙裔的数据中默认更为常见。)在表 10-1 中,我们开始察觉到我们的模型更多地预测黑人和西班牙裔的违约,但现在还很难判断它是否做得好或是否公平。(仅仅因为数据集记录这些数值,并不意味着它们是客观或公平的!)为了帮助理解我们看到的模式是否确实有问题,我们需要再进一步。我们将遵循传统偏见测试的方法,将每个组的值除以对照组的相应值,并应用五分之四法则作为指导。在本例中,我们假设对照组是白人。
注意
严格来说,在就业背景下,控制组是分析中最受青睐的群体,不一定是白人或男性。还可能有其他原因使用并非白人或男性的控制组。选择用于偏见测试分析的控制或参考组是一项困难的任务,最好与法律、合规、社会科学专家或利益相关者共同完成。
一旦我们进行这种划分,我们就可以看到表格 10-2 中的数值。(我们将表中每一列除以白人行中的值。这就是为什么白人的数值都是 1.0。)现在我们可以寻找一定范围之外的数值。我们将使用四分之五法则,尽管在这种使用方式下,它没有法律或监管地位,但它可以帮助我们识别一个这样的范围:0.8–1.25,即群体之间的 20% 差异。(在高风险场景中,有些人更喜欢使用更严格的可接受值范围,例如 0.9–1.11,表示群体之间的 10% 差异。)当我们看到这些不平等度量的值超过 1 时,意味着受保护或少数群体具有原始度量的较高值,反之亦然,对于低于 1 的值也是如此。
查看表格 10-2,我们发现亚裔群体没有超出范围的数值。这意味着模型在白人和亚裔之间的表现相对公平。然而,我们确实看到了西班牙裔和黑人在精确度、假阳率、假发现率和漏检率上存在明显的超出范围的数值差异。虽然应用四分之五法则可以帮助我们标记这些数值,但它确实不能帮助我们解释它们。为此,我们将不得不依靠我们的人类大脑来思考这些结果。我们还需要记住,模型对于 1 的决策是预测的默认值,而更高的概率意味着在模型眼中默认值更有可能发生。
表格 10-2. 测试数据中基于表现的偏见度量跨种族群体的结果
| 群体 | 流行率不均 | 准确度不均 | 真正率不均 | 精确度不均 | … | 假阳率不均 | 假发现率不均 | 假阴率不均 | 漏检率不均 |
|---|---|---|---|---|---|---|---|---|---|
| 西班牙裔 | 3.730 | 0.875 | 1.357 | 2.157 | … | 1.696 | 0.486 | 0.683 | 3.461 |
| 黑人 | 3.612 | 0.868 | 1.351 | 2.078 | … | 1.784 | 0.522 | 0.688 | 3.378 |
| 白人 | 1.000 | 1.000 | 1.000 | 1.000 | … | 1.000 | 1.000 | 1.000 | 1.000 |
| 亚裔 | 0.943 | 1.028 | 1.134 | 1.141 | … | 0.873 | 0.937 | 0.881 | 0.821 |
鉴于黑人和西班牙裔的数据中违约的普遍性要高得多,这些结果表明我们的模型更多地了解了这些群体的违约情况,并在这些群体中以更高的比率预测违约。下一节的传统测试将试图回答是否公平地预测这些群体中的更多违约的问题。目前,我们正在尝试确定模型的表现是否公平。通过查看哪些措施在受保护群体中超出范围以及它们的含义,我们可以说以下内容:
-
精确度差异:~2×(更多)正确的违约预测,在预测会违约的人群中。
-
误阳性率差异:~1.5×(更多)不正确的违约预测,在没有违约的人群中。
-
误发现率差异:~0.5×(更少)不正确的违约预测,在预测会违约的人群中。
-
误遗漏率差异:~3.5×(更多)不正确的接受预测,在预测不会违约的人群中。
精确度和误发现率具有相同的分母——预测违约的较小群体——可以一起解释。它们表明,相对于白人,该模型对黑人和西班牙裔的真正阳性率较高——意味着对于这些群体,正确的违约预测率较高。误发现率也反映了这一结果,指出了对于所讨论的少数群体,错误阳性率或不正确的违约决策率较低的情况。相关地,误遗漏率显示,我们的模型在预测不会违约的较大群体中,对于黑人和西班牙裔的错误接受决策率较高。精确度、误发现率和误遗漏率的差异显示了严重的偏见问题,但这是一种有利于黑人和西班牙裔的模型表现的偏见。
误阳性率差异显示了略有不同的内容。误阳性率是在实际中未违约的较大人群中测量的。在该群体中,我们看到黑人和西班牙裔的错误违约决策率或误阳性率较高。所有这些结果综合起来指向一个存在偏见问题的模型,其中一些确实似乎有利于少数群体。其中,误阳性差异最令人担忧。它告诉我们,在相对较大的未违约人群中,黑人和西班牙裔被预测会错误地违约的率是白人的 1.5 倍。这意味着历史上被剥夺权利的人们正在被这个模型错误地拒绝信用额度提升,这可能导致现实世界中的伤害。当然,我们也看到了对少数群体有利的正确和错误接受决策的证据。这一切都不是一个好兆头,但我们需要在下一节的结果测试中深入挖掘,以获得该模型中群体公平性的更清晰图景。
注
对于回归模型,我们可以跳过混淆矩阵,直接比较诸如 R²或均方根误差之类的测量指标在各组之间的差异。在适当的情况下,特别是对于像 R²或平均百分比误差(MAPE)这样的有界测量,我们还可以应用四分之五法则(作为经验法则)来比较这些测量的比率,以帮助发现问题性能偏见。
一般来说,性能测试是了解错误和负面决策(如假阳性)的有益工具。更传统的偏见测试侧重于结果而不是性能,对错误或负面决策中的偏见问题更难以凸显。不幸的是,正如我们将要看到的,性能和结果测试可能会展示出不同的结果。虽然一些性能测试显示出支持少数族裔的模型,但在下一节中我们将看到这并不正确。率会以理论上有用的方式标准化人数和模型的原始分数。我们在这里看到的许多正面结果都是针对相当小的人群。当我们考虑现实世界的结果时,我们模型中的偏见图像将会不同且更为清晰。性能测试与结果测试之间的这些冲突是常见且有充分的文献记载,我们认为与法律标准和实际情况一致的结果测试更为重要。
注意
在编码历史偏见的数据中改进性能与在各种人口统计群体中平衡结果之间存在着众所周知的紧张关系。数据总是受系统性、人为和统计偏见的影响。如果我们使结果更加平衡,这往往会降低偏见数据集中的性能指标。
由于解释所有这些不同的性能测量很困难,某些情况下可能比其他情况更具意义,并且它们可能会彼此或与结果测试结果相冲突,著名研究人员编制了一个决策树(第 40 页),以帮助专注于性能差异测量的较小子集。根据此树,如果我们的模型是惩罚性的(较高的概率意味着默认/拒绝决策),并且最明显的伤害是错误地拒绝向少数族裔提供信用额度增加(干预不合理),则假阳性率差异可能应在我们的预测性能分析中占据最高权重。假阳性率差异并不能讲述一个好故事。让我们看看结果测试显示了什么。
传统的结果率测试
根据我们基于二元分类模型设置分析的方式,首先通过混淆矩阵查看跨组性能最为简单。在美国,更重要的可能是分析结果在组间的差异,使用传统的统计和实际显著性度量。我们将两个众所周知的实用偏差测试指标 AIR 和 SMD 与卡方检验和t检验配对使用。理解发现的组别结果差异是否具有统计显著性通常是个不错的主意,但在这种情况下,这可能也是法律要求。结果或均分的统计显著差异是歧视的最常见法律承认度量之一,特别是在信用借贷等领域,算法决策已受到几十年的监管。通过使用实用测试和效果量测量,如 AIR 和 SMD,与统计显著性测试,我们得到两个信息:观察到的差异的大小以及其是否具有统计显著性,即是否可能在其他数据样本中再次看到。
注意
如果你在受监管的行业或高风险应用中工作,建议首先应用传统偏差测试和法律先例,然后再应用较新的偏差测试方法。法律风险通常是许多基于 ML 的产品中最严重的组织风险,法律旨在保护用户和利益相关者。
AIR 通常应用于分类结果,如信用借贷或招聘结果,即某人是否获得积极结果。AIR 定义为受保护群体(如少数民族或女性)的积极结果率,除以控制组(如白人或男性)的相同积极结果率。根据四分之五法则,我们希望 AIR 在 0.8 以上。AIR 低于 0.8 指向严重问题。然后,我们使用卡方检验测试这种差异是否可能再次出现,或者是否仅仅是由于偶然性。
注意
再者,影响比例也可用于回归模型,方法是通过受保护组的平均分数或百分比除以控制组的相同数量,并应用四分之五法则作为识别问题结果的指导方针。对于回归模型的其他传统偏差测量方法包括t检验和 SMD。
虽然 AIR 和卡方检验最常用于二元分类,SMD 和t检验常用于回归模型的预测或像工资、薪水或信用额这样的数值数量。我们将应用 SMD 和t检验到我们模型的预测概率上,以进行演示并获取关于我们模型偏见的额外信息。SMD 定义为受保护群体的平均分数减去对照组的平均分数,然后除以分数的标准偏差的测量值。对于小、中和大差异,SMD 有着广为人知的 0.2、0.5 和 0.8 的截止点。我们将使用t检验来决定 SMD 测量的效果大小是否具有统计学意义。
注意
SMD 的应用——应用于模型输出的概率——如果模型分数将被馈送到某些下游决策过程中,且在偏见测试时无法生成模型结果,那么也是合适的。
除了显著性测试、AIR 和 SMD 之外,我们还将分析基本的描述性统计数据,如计数、平均值和标准偏差,正如在表 10-3 中所见。当审视表 10-3 时,很明显,黑人和西班牙裔与白人和亚裔的分数有很大差异。尽管我们的数据是模拟的,但非常遗憾,这在美国消费金融中并不罕见。系统性偏见是真实存在的,并且公平借贷数据往往证明了这一点。¹
表 10-3。对测试数据中种族群体的传统基于结果的偏见指标
| 组别 | 计数 | 有利的结果 | 有利率 | 平均分数 | 标准偏差分数 | AIR | AIR p-值 | SMD | SMD p-值 |
|---|---|---|---|---|---|---|---|---|---|
| 西班牙裔 | 989 | 609 | 0.615 | 0.291 | 0.205 | 0.736 | 6.803e–36 | 0.528 | 4.311e–35 |
| 黑人 | 993 | 611 | 0.615 | 0.279 | 0.199 | 0.735 | 4.343e–36 | 0.482 | 4.564e–30 |
| 亚裔 | 1485 | 1257 | 0.846 | 0.177 | 0.169 | 1.012 | 4.677e–01 | –0.032 | 8.162e–01 |
| 白人 | 1569 | 1312 | 0.836 | 0.183 | 0.172 | 1.000 | - | 0.000 | - |
在表 10-3 中,很明显,黑人和西班牙裔人的平均分较高,有利率较低,而白人和亚裔人的情况相反,所有四个群体的分数标准差类似。这些差异是否足够大到构成偏见问题?这就是我们的实际意义测试的用武之地。AIR 和 SMD 都是相对于白人计算的。这就是为什么白人的得分分别为 1.0 和 0.0。观察 AIR,黑人和西班牙裔的 AIR 都低于 0.8。大红灯!这两组的 SMD 约为 0.5,意味着群体之间分数的中等差异。这也不是个好兆头。我们希望这些 SMD 值能够低于或接近 0.2,表示小差异。
警告
数据科学家经常误解 AIR。这里有一个简单的思考方式:AIR 值超过 0.8 并不意味着太多,而且这当然也不意味着一个模型是公平的。然而,AIR 值低于 0.8 指向了一个严重的问题。
在传统偏见分析中,我们接下来可能会问的一个问题是,对于黑人和西班牙裔来说,这些实际差异在统计上是否显著。不幸的消息是,它们在这两种情况下都非常显著,p 值接近于 0。尽管自上世纪 70 年代以来数据集规模大幅扩展,但许多法律先例指出,对于双侧假设检验的统计显著性水平为 5%(p = 0.05),这是法律上不可容忍的偏见的标志。由于这个阈值对于当今大型数据集完全不切实际,我们建议为较大的数据集调整p值截断值。然而,在美国经济的受监管行业中,我们也应该准备好在p = 0.05 的水平上进行评判。当然,在公平借贷和就业歧视案件中,并不是一切都那么简单明了,事实、背景和专家证人与最终法律裁决有着同等重要的关系,正如任何偏见测试数据一样。这里的一个重要经验教训是,这一领域的法律已经确立,不像互联网和媒体讨论那样容易被人工智能炒作所左右。如果我们在高风险领域操作,除了进行新的测试外,我们可能还应该进行传统的偏见测试,就像我们在这里做的一样。
警告
在消费金融、住房、就业和美国经济的其他传统受监管行业,非歧视法律已经非常成熟,并不会受人工智能炒作的影响。仅仅因为 AIR 和双侧统计测试对于数据科学家而言感觉过时或简单化,并不意味着我们的组织在法律问题出现时不会按照这些标准来评判。
这些种族结果指出了我们模型中相当严重的歧视问题。如果我们部署它,我们将为自己设定潜在的监管和法律问题。比这更糟糕的是,我们将部署一个我们知道会持续制度性偏见并伤害人们的模型。在我们生活的不同阶段,申请信用卡的延期可能是一件严肃的事情。如果有人要求信用,我们应该假设这是真正需要的。我们在这里看到的是,一个信用借贷决策的例子带有历史偏见的色彩。这些结果也传递了一个明确的信息。在部署之前,这个模型需要修复。
个体公平性
到目前为止,我们一直专注于群体公平性,但我们也应该对我们的模型进行个体公平性方面的探索。与对群体的偏见不同,个体偏见是一个局部问题,仅影响一个小而具体的人群,甚至可以是单个个体。我们将使用两种主要技术来测试这一点:残差分析和对抗建模。在第一种技术——残差分析中,我们查看非常接近决策界限且由于此而错误地获得不利结果的个体。我们希望确保他们的人口统计信息不会导致他们被拒绝信用产品。(我们也可以检查决策界限远处的非常错误的个体结果。)在第二种方法——对抗模型中,我们将使用单独的模型,尝试使用输入特征和原始模型的分数来预测受保护群体信息,并查看这些模型的 Shapley 加法解释。当我们发现对抗预测非常准确的行时,这表明该行中的某些信息编码导致我们原始模型中的偏见。如果我们能够在多行数据中确定这些信息,我们就可以找出模型中潜在的代理偏见的驱动因素。在转向章节中的偏见修复部分之前,我们将探讨个体偏见和代理偏见。
让我们深入探讨个体公平性。首先,我们编写了一些代码,以从受保护群体中取出一些狭义上被错误分类的人员。这些是我们的模型预测会逾期的观察结果,但实际上没有逾期:
black_obs = valid.loc[valid['RACE'] == 'black'].copy()
black_obs[f'p_{target}_outcome'] = np.where(
black_obs[f'p_{target}'] > best_cut,
1,
0)
misclassified_obs = black_obs[(black_obs[target] == 0) &
(black_obs[f'p_{target}_outcome'] == 1)]
misclassified_obs.sort_values(by=f'p_{target}').head(3)[features]
结果显示在表 10-4 中,并且它们并未暗示任何严重的偏见,但确实提出了一些问题。第一和第三个申请人似乎适度消费,并且大部分时间按时还款。这些个体可能以一种任意的方式被置于决策边界的错误一侧。然而,表 10-4 中第二行的个体似乎未能在偿还信用卡债务方面取得进展。也许他们确实不应该被批准增加信用额度。
表 10-4. 在验证数据中被狭义错误分类的受保护观察特征子集
LIMIT_BAL |
PAY_0 |
PAY_2 |
PAY_3 |
… | BILL_AMT1 |
BILL_AMT2 |
BILL_AMT3 |
… | PAY_AMT1 |
PAY_AMT2 |
PAY_AMT3 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| $58,000 | –1 | –1 | –2 | … | $600 | $700 | $0 | … | $200 | $700 | $0 | |||||||
| $58,000 | 0 | 0 | 0 | … | $8,500 | $5,000 | $0 | … | $750 | $150 | $30 | |||||||
| $160,000 | –1 | –1 | –1 | … | $0 | $0 | $600 | … | $0 | $0 | $0 |
揭示我们是否发现了真正的个体偏见问题的下一步可能包括以下几点:
输入特征的微小扰动
如果对一个输入特征进行任意更改,例如将BILL_AMT1减少 5 美元,会改变这个人的结果,那么模型的决策可能更与其响应函数的陡峭处与决策截止点相交有关,而不是任何切实的现实原因。
搜索相似的个体
如果像当前这个个体一样,有一小部分——或更多——个体,模型可能会以不公平或有害的方式对某些特定或交叉的亚群体进行分割。
如果出现这两种情况之一,正确的做法可能是扩展这个以及类似个体的信用额度。
我们对西班牙裔和亚裔的观察进行了类似的分析,并得出类似的结果。对于这些结果,我们并不感到太惊讶,至少有两个原因。首先,个体公平性问题是困难的,并引发因果性问题,而机器学习系统通常不会在一般情况下解决这些问题。其次,个体公平性和代理歧视可能对数据集中的许多行——其中整个亚群体可能会落入决策边界的任意一侧——以及模型包含许多特征,特别是替代数据或与个体偿还能力无直接联系的特征,构成更大风险。
注意
对个体公平性问题作出 100%确定的答案是困难的,因为它们基本上是因果性问题。对于复杂、非线性的机器学习模型,要知道模型是否基于一些数据(即受保护的群体信息),而这些数据在模型中本来就不存在,是不可能的。
尽管如此,残差分析、对抗建模、SHAP 值以及主题专业知识的精心应用可以有很大帮助。想要进一步阅读这方面的内容,请查阅由 SHAP 值创始人撰写的《解释公平性的定量指标》“Explaining Quantitative Measures of Fairness”,以及《使用因果模型测试歧视问题》“On Testing for Discrimination Using Causal Models”。
接下来我们来介绍测试个体公平性的第二种技术:对抗建模。我们选择训练两个对抗模型。第一个模型使用与原始模型相同的输入特征,但试图预测受保护群体的状态,而不是逾期情况。为简单起见,我们对受保护类成员身份——新的Black或Hispanic人的标记——进行了二元分类器的训练。通过分析这个第一个对抗模型,我们可以大致了解哪些特征与受保护人群的成员身份有最强的关系。
我们训练的第二个对抗模型与第一个完全相同,只是多了一个输入特征——原始放贷模型的输出概率。通过比较这两个对抗模型,我们可以了解到原始模型分数中编码的额外信息有多少,并且我们将在观察级别上得到这些信息。
注意
许多生成逐行调试信息(如残差、对抗模型预测或 SHAP 值)的机器学习工具,可用于检查个体偏见问题。
我们用与原始模型类似的超参数作为二进制 XGBoost 分类器训练了这些对抗模型。首先,我们查看了在将原始模型概率添加为特征时,其对抗模型分数增加最多的受保护观察。结果显示在表 10-5 中。该表告诉我们,对于某些观察结果,原始模型分数编码了足够关于受保护组状态的信息,以至于第二个对抗模型能够在第一个模型基础上提高约 30 个百分点。这些结果告诉我们,我们应该深入研究这些观察结果,以识别任何个体公平性问题,例如我们在残差中发现的个体偏见问题时提出的问题。表 10-5 还帮助我们再次表明,从模型中移除人口统计标记并不会去除人口统计信息。
表 10-5. 在验证数据中两个对抗模型之间看到其分数增加最多的三个受保护观察
| 观察 | 受保护 | 对抗者 1 分数 | 对抗者 2 分数 | 差异 |
|---|---|---|---|---|
| 9022 | 1 | 0.288 | 0.591 | 0.303 |
| 7319 | 1 | 0.383 | 0.658 | 0.275 |
| 528 | 1 | 0.502 | 0.772 | 0.270 |
从第二章回想起,SHAP 值是一种逐行加法特征归因方案。也就是说,它们告诉我们模型中每个特征对整体模型预测的贡献有多少。我们在第二个对抗模型(包括我们的原始模型分数)的验证数据上计算了 SHAP 值。在图 10-2 中,我们查看了排名前四的最重要特征的 SHAP 值分布。图 10-2 中的每个特征对预测受保护类成员信息都很重要。作为预测受保护组信息最重要的特征,是原始模型分数,p_DELINQ_NEXT。这本身就很有趣,而且具有最高 SHAP 值的观察结果是进一步研究个体公平性违规的良好目标。

图 10-2. 我们对验证数据中我们对抗模型中四个最重要特征的 SHAP 值分布(数字,彩色版本)
或许最有趣的是p_DELINQ_NEXT小提琴图中的颜色渐变(从浅到深)。每个小提琴根据密度中每个观察值的特征值来着色。这意味着,如果我们的模型是线性的且没有交互作用,那么每个小提琴上的颜色渐变将会从浅到深是平滑的。但这不是我们观察到的情况。在p_DELINQ_NEXT小提琴内部,图的垂直切片内存在显著的颜色变化。这只能在p_DELINQ_NEXT与其他特征结合使用以驱动预测时发生。例如,模型可能会学习到类似于如果LIMIT_BAL低于$20,000,信用利用率高于 50%,并且来自信用扩展模型的违约概率超过 20%,那么观察结果很可能是黑人或西班牙裔的情况。尽管残差和对抗模型可以帮助我们识别个体偏差问题,但 SHAP 可以通过帮助我们理解驱动偏差的因素来进一步推进。
代理偏差
如果我们识别出的这些模式只影响少数人,它们仍然可能是有害的。但是当我们看到它们影响到更大群体时,我们可能面临一个更为全球性的代理偏差问题。请记住,代理偏差发生在当一个单一特征或一组相互作用的特征在我们的模型中起到类似人口统计信息的作用时。鉴于机器学习模型通常可以混合和匹配特征以创建潜在概念,并且可以在本地逐行基础上以不同方式进行此操作,代理偏差是导致模型输出偏差的一个相当常见的因素。
我们讨论过的许多工具,比如对抗模型和 SHAP,可以用来查找代理。例如,我们可以通过查看 SHAP 特征交互值来开始探索它们。(回忆一下第二章和第六章的高级 SHAP 技术。)对于代理来说,最核心的测试可能是对抗模型。如果另一个模型能够准确地从我们模型的预测中预测出人口统计信息,那么我们的模型就对人口统计信息进行了编码。如果我们在对抗模型中包括模型输入特征,我们可以使用特征归因措施来理解哪些单一输入特征可能是代理,并应用其他技术和辛勤工作来找出由交互创建的代理。好的老式决策树可以是发现代理的最佳对抗模型之一。由于机器学习模型倾向于结合和重新组合特征,绘制训练有素的对抗决策树可能有助于我们发现更复杂的代理。
如读者所见,对抗建模可能是一个兔子洞。但我们希望我们已经说服读者,它是一个强大的工具,用于识别可能在我们的模型下受到歧视的个体行,并且用于理解我们的输入特征如何与受保护群体信息和代理有关。现在,我们将继续进行重要的工作,即解决我们在示例信贷模型中发现的偏差问题。
修复偏差
现在,我们已经确定了模型中几种偏差类型,是时候动手解决了。幸运的是,有很多工具可供选择,并且由于拉什蒙效应,还有许多不同的模型可供选择。我们将首先尝试预处理修复。我们将为训练数据生成观测级别的权重,以便积极结果在人口统计组之间表现一致。然后,我们将尝试一种称为公平 XGBoost的处理技术,其中包括人口统计信息在 XGBoost 的梯度计算中,以便在模型训练期间进行正规化。对于后处理,我们将在模型的决策边界周围更新我们的预测。由于预处理、处理和后处理可能在多个行业垂直和应用程序中引起不平等待遇的担忧,我们将通过概述一种简单有效的模型选择技术来关闭修复部分,该技术搜索各种输入特征集和超参数设置,以找到性能良好且偏差最小的模型。对于每种方法,我们还将讨论观察到的性能质量和偏差修复的权衡。
预处理
我们将尝试的第一种偏差修复技术是一种称为重新加权的预处理技术。这种技术最早由 Faisal Kamiran 和 Toon Calders 在他们 2012 年的论文"无歧视分类的数据预处理技术"中首次发表。重新加权的思想是使用观察权重使各组的平均结果相等,然后重新训练模型。正如我们将看到的,在我们对训练数据进行预处理之前,跨人口统计组的平均结果或平均y变量值有很大的差异。亚裔和黑人的差异最大,分别为 0.107 和 0.400 的平均结果。这意味着从平均角度来看,仅仅通过训练数据来看,亚裔人的违约概率在可以接受信用额度增加的范围内,而黑人则相反。他们的平均分数显然处于拒绝范围之内。 (再次强调,这些值并不总是客观或公平,仅仅因为它们记录在数字数据中。)经过我们的预处理之后,我们将看到我们可以在相当大的程度上平衡这两种结果和偏差测试值。
由于重新加权是一个非常直接的方法,我们决定使用以下代码片段中的函数自己实现它。² 要重新加权我们的数据,我们首先需要测量整体和每个人口群体的平均结果率。然后我们确定观测级别或行级别的权重,以平衡跨人口群体的结果率。观测权重是数值,告诉 XGBoost 和大多数其他 ML 模型在训练期间如何加权每一行。如果一行的权重为 2,则像这一行在用于训练 XGBoost 的目标函数中出现了两次。如果我们告诉 XGBoost 一行的权重为 0.2,则像这一行在训练数据中出现了五分之一的次数。鉴于每个群体的平均结果和它们在训练数据中的频率,确定给出所有群体在模型中具有相同平均结果的行权重是一个基本的代数问题。
def reweight_dataset(dataset, target_name, demo_name, groups):
n = len(dataset)
# initial overall outcome frequency
freq_dict = {'pos': len(dataset.loc[dataset[target_name] == 1]) / n,
'neg': len(dataset.loc[dataset[target_name] == 0]) / n}
# initial outcome frequency per demographic group
freq_dict.update({group: dataset[demo_name].value_counts()[group] / n
for group in groups})
weights = pd.Series(np.ones(n), index=dataset.index)
# determine row weights that balance outcome frequency
# across demographic groups
for label in [0, 1]:
for group in groups:
label_name = 'pos' if label == 1 else 'neg'
freq = dataset.loc[dataset[target_name] == label][demo_name] \
.value_counts()[group] / n
weights[(dataset[target_name] == label) &
(dataset[demo_name] == group)] *= \
freq_dict[group] * freq_dict[label_name] / freq
# return balanced weight vector
return weights
注意
有多种样本权重。在 XGBoost 和大多数其他 ML 模型中,观测级别的权重被解释为频率权重,其中对观测的权重等同于它在训练数据中出现的“次数”。这种加权方案起源于调查抽样理论。
另一种主要的样本权重类型来自加权最小二乘理论。有时称为精度权重,它们量化了我们对观测特征值的不确定性,假设每个观测实际上是多个潜在样本的平均值。这两种样本权重的概念并不相等,因此在设置sample_weights参数时知道你正在指定哪一种是很重要的。
应用reweight_dataset函数为我们提供了一个与训练数据长度相同的观测权重向量,使得数据中每个人口群体内的结果加权平均值相等。重新加权有助于消除训练数据中系统偏差的表现,教会 XGBoost 不同种类的人应该具有相同的平均结果率。在代码中,这就像使用reweight_dataset的行权重重新训练 XGBoost 一样简单。在我们的代码中,我们将这个训练权重向量称为train_weights。当我们调用DMatrix函数时,我们使用weight=参数来指定这些减少偏差的权重。之后,我们简单地重新训练 XGBoost:
dtrain = xgb.DMatrix(train[features],
label=train[target],
weight=train_weights)
表格 10-6 显示了原始平均结果和原始 AIR 值,以及预处理后的平均结果和 AIR。当我们在未加权的数据上训练 XGBoost 时,我们观察到了一些问题性 AIR 值。最初,黑人和西班牙裔的 AIR 约为 0.73。这些值并不理想——表明对于每 1000 个信用产品,模型只接受约 730 个西班牙裔或黑人的申请。这种偏见水平在伦理上令人不安,但也可能在消费金融、招聘或其他依赖传统法律标准进行偏见测试的领域引发法律问题。五分之四法则——虽然存在缺陷和不完善——告诉我们,我们不应看到低于 0.8 的 AIR 值。幸运的是,在我们的案例中,重新加权提供了良好的补救效果。
在 表格 10-6 中,我们可以看到,我们将西班牙裔和黑人的问题 AIR 值提高到了较边缘的值,而且重要的是,并没有对亚裔的 AIR 值造成太大改变。简言之,重新加权减少了黑人和西班牙裔的潜在偏见风险,而不会增加其他群体的风险。这是否对我们模型的性能质量产生了任何影响?为了调查这一点,我们在 图 10-3 中引入了一个超参数 lambda,它决定了重新加权方案的强度。当 lambda 等于零时,所有观测值的样本权重都为一。当超参数等于一时,平均结果都相等,并且我们得到了 表格 10-6 中的结果。正如 图 10-3 所示,我们确实观察到了在验证数据的 F1 值中,增加重新加权强度与性能之间的某种权衡。接下来,让我们看看在扫描 lambda 跨越一系列值时,对黑人和西班牙裔 AIR 的影响,以更深入地了解这种权衡。
表格 10-6. 测试数据中人口群体的原始和预处理后的平均结果
| 人口群体 | 原始平均结果 | 预处理后的平均结果 | 原始 AIR | 预处理后的 AIR |
|---|---|---|---|---|
| 西班牙裔 | 0.398 | 0.22 | 0.736 | 0.861 |
| 黑人 | 0.400 | 0.22 | 0.736 | 0.877 |
| 白人 | 0.112 | 0.22 | 1.000 | 1.000 |
| 亚裔 | 0.107 | 0.22 | 1.012 | 1.010 |

图 10-3. 随着重新加权方案强度的增加,模型的 F1 分数(数字,彩色版本)
结果显示,在增加lambda至 0.8 以上时,并没有显著改善黑人和西班牙裔的 AIR(图 10-4)。回顾图 10-3,这意味着我们将经历大约 3%的模拟性能下降。如果我们考虑部署这个模型,我们会选择重新训练的超参数值。在图 10-3 和图 10-4 之间讲述的引人入胜的故事是:仅通过对数据集应用采样权重,以强调有利的黑人和西班牙裔借款人,我们可以提高这两组的 AIRs,同时只有名义性能力的下降。

图 10-4. 在加强重新加权方案的强度后,该模型的不利影响比率(数字,彩色版)
像机器学习中的几乎所有其他内容一样,偏差修正和我们选择的方法都是一个实验,而不是刻板的工程。它们不能保证有效,并且我们始终需要检查它们是否真正有效,首先是在验证和测试数据中,然后是在实际世界中。重要的是要记住,我们不知道一旦部署模型,它在精度或偏差方面的表现如何。我们始终希望我们的模拟验证和测试评估与实际性能相关联,但是这里根本没有任何保证。我们希望,在模型部署后看起来像是模拟性能下降约 5%的情况,由于数据漂移、实际运行环境的变化和其他在体内的意外,这种情况会被抹平。所有这些都表明,一旦模型部署,有必要监控性能和偏差。
重新加权只是预处理技术的一个示例,还有其他几种流行的方法。预处理简单、直接且直观。正如我们刚才看到的,它可以在接受的精度牺牲的情况下,对模型偏差产生显著改善。查看AIF360,了解其他可靠的预处理技术示例。
In-processing
接下来我们将尝试一种内部处理的偏见修复技术。近年来提出了许多有趣的技术,包括使用对抗模型的一些技术,例如“用对抗学习减轻不必要的偏见”或“公平对抗梯度树提升”。这些对抗内部处理方法的想法很简单。当对抗模型无法从我们主模型的预测中预测出人口统计组成员身份时,我们感到我们的预测不会编码太多的偏见。正如本章前面强调的那样,对抗模型还有助于捕捉关于偏见的局部信息。对抗模型在最准确的行上可能是编码了最多人口统计信息的行。这些行可以帮助我们揭示可能经历最多偏见的个人,涉及几个输入特征的复杂代理和其他局部偏见模式。
这里还有一些只使用一个模型的内部处理去偏见的技术,由于通常实施起来稍微容易些,我们将专注于我们的使用案例中的其中一种。与使用第二个模型相反,这些内部处理方法使用双目标函数和正则化方法。例如,“公平回归的凸框架”提出了各种可以与线性和逻辑回归模型配对以减少对群体和个人的偏见的正则化器。“学习公平的表示”也包括在模型目标函数中包含偏见度量,但随后尝试创建一个新的训练数据表示,编码较少的偏见。
虽然这两种方法主要集中在简单模型上,即线性回归、逻辑回归和朴素贝叶斯,但我们想要与树一起工作,尤其是 XGBoost。事实证明,我们并不是唯一的。美国运通的一个研究小组最近发布了“FairXGBoost:XGBoost 中的公平意识分类”,其中包括关于在 XGBoost 模型中引入偏见正则化项的说明和实验结果,使用 XGBoost 的现有能力来训练具有自定义编码目标函数的模型。这就是我们将进行内部处理的方式,正如您很快将看到的,它实施起来非常直接,并在我们的示例数据上取得了良好的结果。
注意
在我们跳入更多技术描述、代码和结果之前,我们应该提到我们讨论的许多公平性正则化工作基于或与 Kamishima 等人的开创性论文“具有偏见消除正则化器的公平意识分类器”相关。
我们选择的方法是如何工作的?客观函数用于在模型训练期间测量误差,在优化过程中试图最小化该误差并找到最佳模型参数。在处理中正则化技术的基本思想是在模型整体客观函数中包含偏差的测量。当优化函数用于计算误差时,机器学习优化过程试图最小化该误差,这也倾向于减少测量到的偏差。这个想法的另一个转变是在客观函数内使用偏差测量项的因子,或者正则化超参数,这样可以调节偏差修正的效果。如果读者还不知道,XGBoost 支持各种客观函数,以确保误差测量方式实际映射到手头的实际问题。它还支持用户编写的完全自定义客观函数。
实施我们的处理过程的第一步将是编写一个样本客观函数。在接下来的代码片段中,我们定义了一个简单的客观函数,告诉 XGBoost 如何生成评分:
-
计算客观函数关于模型输出的一阶导数(梯度,
grad)。 -
计算客观函数关于模型输出的二阶导数(海森矩阵,
hess)。 -
将人口统计信息(
protected)合并到客观函数中。 -
用新参数(lambda,
lambda)控制正则化的强度。
我们还创建了一个简单的包装器,用于指定我们希望将其视为受保护类别的群体——那些我们希望由于正则化而经历较少偏差——以及正则化的强度。尽管简单,这个包装器为我们提供了相当多的功能。它使我们能够将多个人口统计群体包括在受保护群体中。这一点很重要,因为模型经常对多个群体存在偏见,而仅试图为一个群体修正偏见可能会使其他群体的情况变得更糟。能够提供自定义lambda值的能力非常棒,因为它允许我们调整正则化的强度。正如“预处理”所示,调节正则化超参数的能力对于找到与模型准确性的理想平衡至关重要。
在大约 15 行 Python 代码中,我们要做的事情很多,但这就是我们选择这种方法的原因。它利用了 XGBoost 框架中的便利性,非常简单,并且似乎增加了我们示例数据中历史上被边缘化的少数群体的 AIR:
def make_fair_objective(protected, lambda):
def fair_objective(pred, dtrain):
# Fairness-aware cross-entropy loss objective function
label = dtrain.get_label()
pred = 1. / (1. + np.exp(-pred))
grad = (pred - label) - lambda * (pred - protected)
hess = (1. - lambda) * pred * (1. - pred)
return grad, hess
return fair_objective
protected = np.where((train['RACE'] == 'hispanic') | (train['RACE'] == 'black'),
1, 0)
fair_objective = make_fair_objective(protected, lambda=0.2)
一旦定义了自定义目标函数,我们只需使用obj=参数将其传递给 XGBoost 的train()函数。如果我们编写的代码正确,XGBoost 的强大训练和优化机制将处理其余的事务。注意,使用我们的自定义目标进行训练所需的代码量是多么少:
model_regularized = xgb.train(params,
dtrain,
num_boost_round=100,
evals=watchlist,
early_stopping_rounds=10,
verbose_eval=False,
obj=fair_objective)
通过图表 10-5 和 10-6 可以查看在处理过程中修复验证和测试结果。为了验证我们的假设,我们利用包装函数,并用多种不同的lambda设置训练了许多不同的模型。在 图 10-6 中,我们可以看到增加lambda确实减少了偏差,这由黑人和西班牙裔的增加 AIR 所衡量,而亚裔 AIR 则大致保持在值为 1 左右。我们可以增加那些在消费金融中我们最关注的群体的 AIR,而不涉及对其他人口统计群体的潜在歧视。这正是我们想要看到的结果!
那么关于性能和减少偏差之间的权衡呢?我们在这里看到的情况在我们的经验中相当典型。在某些lambda值上,黑人和西班牙裔的 AIR 并没有显著增加,但模型的 F1 分数继续下降,低于原模型性能的 90%。我们可能不会使用lambda被调整到最大水平的模型,因此我们可能会看到在硅测试数据性能上的小幅下降,以及迄今为止在体内性能上的未知变化。

图 10-5. 随着lambda增加,模型的 F1 分数(数字,彩色版本)

图 10-6. 随着正则化因子lambda的增加,各人口统计群体的 AIR 值(数字,彩色版本)
后处理
接下来我们将转向后处理技术。请记住,后处理技术是在模型已经训练好之后应用的,因此在本节中我们将修改我们在本章开始时训练的原始模型的输出概率。
我们将应用的技术称为拒绝选项后处理,最早可以追溯到Kamiran et al.的 2012 篇论文。请记住,我们的模型设定了一个截止值,高于此值的分数被给予二进制结果 1(对我们的信用申请者来说是一个不良结果),而低于截止值的分数则预测为 0(一个有利的结果)。拒绝选项后处理的工作原理是,对于分数接近截止值的模型,模型对正确结果存在不确定性。我们所做的是将所有在截止值附近窄区间内接收到分数的观测结果分组在一起,然后重新分配这些观测结果以增加模型结果的公平性。拒绝选项后处理易于解释和实施——我们能够用另一个相对简单的函数来做到这一点:
def reject_option_classification(dataset, y_hat, demo_name, protected_groups,
reference_group, cutoff,
uncertainty_region_size):
# In an uncertainty region around the decision cutoff value,
# flip protected group predictions to the favorable decision
# and reference group predictions to the unfavorable decision
new_predictions = dataset[y_hat].values.copy()
uncertain = np.where(
np.abs(dataset[y_hat] - cutoff) <= uncertainty_region_size, 1, 0)
uncertain_protected = np.where(
uncertain & dataset[demo_name].isin(protected_groups), 1, 0)
uncertain_reference = np.where(
uncertain & (dataset[demo_name] == reference_group), 1, 0)
eps = 1e-3
new_predictions = np.where(uncertain_protected,
cutoff - uncertainty_region_size - eps,
new_predictions)
new_predictions = np.where(uncertain_reference,
cutoff + uncertainty_region_size + eps,
new_predictions)
return new_predictions
在图 10-7 中,我们可以看到这种技术的应用。直方图显示了每个种族群体模型分数在后处理前后的分布。我们可以看到,在接近 0.26 分数(原始模型截止值)的一个小邻域内,我们已经通过将他们分数设定为范围底部,将所有黑人和西班牙裔人群后处理成有利的结果。同时,我们将在这个不确定性区域内的白人分配为不利的模型结果,并保持亚裔分数不变。有了这些新分数,让我们来调查这种技术如何影响模型的准确性和 AIRs。

图 10-7. 各人种群体模型分数在拒绝选项后处理前后的变化(数字,彩色版本)
这个实验的结果正是我们所期望的——我们能够将黑人和西班牙裔的 AIRs 提高到超过 0.9,同时将亚裔 AIR 维持在约 1.00(见表 10-7)。在 F1 分数方面,我们需要付出 6%的降低。我们认为这不是一个有意义的下降,但如果我们担心的话,可以减小不确定性区域的大小,以找到更有利的权衡点。
表 10-7. 在验证数据上的原始和后处理后的 F1 分数和不利影响比率
| 模型 | F1 分数 | 黑人 AIR | 西班牙裔 AIR | 亚裔 AIR |
|---|---|---|---|---|
| 原始 | 0.574 | 0.736 | 0.736 | 1.012 |
| 后处理后 | 0.541 | 0.923 | 0.902 | 1.06 |
模型选择
我们将讨论的最后一种技术是关注公平性的模型选择。确切地说,我们将进行简单的特征选择和随机的超参数调整,同时跟踪模型性能和 AIRs。读者在进行性能评估时几乎肯定已经执行了这些步骤,因此这种技术的开销相对较低。作为修复技术的模型选择的另一个优势是它引起的不公平对待关注最少。 (在谱系的另一端是拒绝选项后处理,在此我们根据每个观察的受保护组状态实际更改了模型结果。)
注意
随机搜索不同特征集和超参数设置通常会揭示具有改进公平特性和类似基准模型性能的模型。
在本节中,我们将跟踪 F1 和 AUC 分数作为我们对模型性能质量的概念。根据我们的经验,评估多个质量指标的模型可以增加在 vivo 性能良好的可能性。计算 F1 和 AUC 分数的另一个优势是,前者是在模型结果上测量的,而后者仅使用输出概率。如果将来我们想要更改模型的决策截断,或者将模型分数作为另一个过程的输入传递,我们将会很高兴我们跟踪了 AUC。
在我们深入讨论模型选择之前再说一句——模型选择远不止于特征选择和超参数调整。它还可以意味着在竞争性模型架构或不同偏差修复技术之间进行选择。在本章的结尾,我们将总结所有结果以准备最终的模型选择,但在本节中,我们将专注于特征和超参数。
根据我们的经验,特征选择可以是一种有效的修复技术,但在学科专家的指导下,并且当可用替代数据源时效果最佳。例如,银行的合规专家可能知道,贷款模型中的某个特征可以用编码历史偏见较少的替代特征替换。我们无法接触这些替代特征,因此在我们的示例数据中,我们只能选择丢弃模型中的特征,并在保持原始超参数的同时测试每个特征被丢弃的效果。在特征选择和超参数调整之间,我们将要训练大量不同的模型,因此我们将使用我们的原始训练数据进行五折交叉验证。如果我们选择在验证数据上性能最佳的变体,我们将增加选择仅由于随机机会而表现最佳的模型的风险。
警告
虽然拉肖蒙效应可能意味着我们有许多好的模型可供选择,但我们不应忘记这种现象可能也是我们原始模型不稳定的标志。如果有许多与我们原始模型设置相似但性能与原始模型不同的模型,这表明了欠规格化和误规格化问题。修复后的模型还必须进行稳定性、安全性和性能问题的测试。更多信息请参阅第 3、8 和 9 章。
在使用交叉验证训练这些新模型后,我们能够在黑人和西班牙裔交叉验证 AIR 中实现增加,同时模型交叉验证 AUC 稍微下降。最令人担忧的特征是 PAY_AMT5,因此我们将继续进行随机超参数调优,不包括此特征。
注意
通过使用对抗模型和可解释 AI 技术,可以更加复杂地进行特征选择。作为灵感,可以考虑文章 “解释公平度量” 及 SHAP 之父的相关笔记本,以及 Belitz 等人的 “在机器学习中自动执行程序公平特征选择”。
为了选择新的模型超参数,我们将使用 scikit-learn API 进行随机网格搜索。由于我们希望在整个过程中进行交叉验证 AIRs,因此我们必须构建一个评分函数传递给 scikit-learn。为简化代码,我们只在此跟踪黑人 AIR —— 因为在我们的分析中它与西班牙裔 AIR 相关联 —— 但跨受保护群体的平均 AIR 应更具优先选择性。此代码片段展示了我们如何使用全局变量和 make_scorer() 接口来完成此操作:
fold_number = -1
def black_air(y_true, y_pred):
global fold_number
fold_number = (fold_number + 1) % num_cv_folds
model_metrics = perf_metrics(y_true, y_score=y_pred)
best_cut = model_metrics.loc[model_metrics['f1'].idxmax(), 'cutoff']
data = pd.DataFrame({'RACE': test_groups[fold_number],
'y_true': y_true,
'y_pred': y_pred},
index=np.arange(len(y_pred)))
disparity_table = fair_lending_disparity(data, y='y_true', yhat='y_pred',
demo_name='RACE',
groups=race_levels,
reference_group='white',
cutoff=best_cut)
return disparity_table.loc['black']['AIR']
scoring = {
'AUC': 'roc_auc',
'Black AIR': sklearn.metrics.make_scorer(black_air, needs_proba=True)
}
接下来,我们定义了一个合理的超参数网格,并构建了 50 个新模型:
parameter_distributions = {
'n_estimators': np.arange(10, 221, 30),
'max_depth': [3, 4, 5, 6, 7],
'learning_rate': stats.uniform(0.01, 0.1),
'subsample': stats.uniform(0.7, 0.3),
'colsample_bytree': stats.uniform(0.5, 1),
'reg_lambda': stats.uniform(0.1, 50),
'monotone_constraints': [new_monotone_constraints],
'base_score': [params['base_score']]
}
grid_search = sklearn.model_selection.RandomizedSearchCV(
xgb.XGBClassifier(random_state=12345,
use_label_encoder=False,
eval_metric='logloss'),
parameter_distributions,
n_iter=50,
scoring=scoring,
cv=zip(train_indices, test_indices),
refit=False,
error_score='raise').fit(train[new_features], train[target].values)
我们随机模型选择程序的结果显示在 图 10-8 中。每个模型在图中表示为一个点,其中黑人交叉验证 AIR 值位于 x 轴上,交叉验证 AUC 位于 y 轴上。如同我们在此处所做的,将模型准确性归一化到基准值中,以便轻松地做出像“这个替代模型显示了从原始模型中下降了 2% 的 AUC”这样的声明。考虑到这些模型的分布,我们如何选择一个用于部署的模型?

图 10-8. 在特征选择和超参数调优后,每个模型的归一化准确率和黑人 AIR(数字、彩色版本)
偏见修复方法的一个常见问题是,它们经常只是把偏见从一个人群转移到另一个人群。例如,现在在美国有时候会偏向女性在信用和就业决策中。看到偏见修复技术在增加某些系统偏见影响的其他群体的有利结果的过程中大幅减少了女性的有利结果并不奇怪,但这不是任何人真正希望看到的结果。如果一个群体被不成比例地偏爱,而偏见修复使其平衡——那太好了。另一方面,如果一个群体稍微被偏爱,而偏见修复结果却伤害了他们以提高其他群体的 AIRs 或其他统计数据,那显然不是好事。在下一节中,我们将看到这两种替代模型在本章应用的其他偏见修复技术中的表现如何。
警告
每当我们在同一数据集上评估多个模型时,必须小心过拟合和多重比较。我们应该采用最佳实践,如可重用的留置数据、交叉验证、自助法、超时留置数据和部署后监控,以确保我们的结果具有普遍适用性。
结论
在表 10-8 中,我们汇总了本章训练的所有模型的结果。我们选择关注模型准确性的两个指标,F1 分数和 AUC,以及模型偏见的两个指标,AIRs 和误报率(FPR)差异。
表 10-8. 偏见修复技术在测试数据中的比较
| 测量 | 原始模型 | 预处理(重新加权) | 内部处理(正则化,lambda = 0.2) |
后处理(拒绝选项,窗口 = 0.1) | 模型选择 |
|---|---|---|---|---|---|
| AUC | 0.798021 | 0.774183 | 0.764005 | 0.794894 | 0.789016 |
| F1 | 0.558874 | 0.543758 | 0.515971 | 0.533964 | 0.543147 |
| 亚裔 AIR | 1.012274 | 1.010014 | 1.001185 | 1.107676 | 1.007365 |
| 黑人 AIR | 0.735836 | 0.877673 | 0.851499 | 0.901386 | 0.811854 |
| 西班牙裔 AIR | 0.736394 | 0.861252 | 0.851045 | 0.882538 | 0.805121 |
| 亚裔 FPR 差异 | 0.872567 | 0.929948 | 0.986472 | 0.575248 | 0.942973 |
| 黑人 FPR 差异 | 1.783528 | 0.956640 | 1.141044 | 0.852034 | 1.355846 |
| 西班牙裔 FPR 差异 | 1.696062 | 0.899065 | 1.000040 | 0.786195 | 1.253355 |
结果令人兴奋:许多测试的偏见修复技术能够显著改善黑人和西班牙裔借款人的 AIRs 和 FPR 差异,而对亚裔 AIR 没有严重负面影响。这仅仅需要在模型性能上进行边际改进。
我们应该如何选择适用于我们高风险模型的修复技术?希望本章能说服读者尝试许多方法。最终的决定取决于法律、业务领导和我们组建的多样化利益相关者团队。在传统受监管的垂直组织中,严格禁止不公平待遇,我们的选择受到严格限制。今天我们只能从现有的模型选择选项中进行选择。如果我们超出这些垂直领域,我们可以从更广泛的修复策略中进行选择。³ 鉴于其对模型性能的最小影响和后处理可以将某些性能差异降至可接受范围之外,我们可能会选择预处理选项进行修复。
无论我们是否使用模型选择作为偏见缓解技术,以及我们是否有不同的预处理、处理中和后处理模型可供选择,挑选修复模型的经验法则是执行以下步骤:
-
将模型集合减少到能够满足业务需求的模型,例如,性能在原始模型的 5%内。
-
在这些模型中,选择那些最接近以下条件的模型:
-
修复所有最初不利的群体的偏见,例如,所有不利群体的 AIR 增加到≥0.8。
-
不歧视任何最初受欢迎的群体,例如,没有最初受欢迎群体的 AIR 降低到<0.8。
-
-
作为选择过程的一部分,咨询业务合作伙伴、法律和合规专家以及多样化的利益相关者。
如果我们正在训练一个有可能影响人们的模型——而大多数模型确实会——我们有道德义务测试其是否存在偏见。当我们发现偏见时,我们需要采取措施进行缓解或修复。本章讨论的是偏见管理流程的技术部分。要正确进行偏见修复,还需要延长发布时间表,进行不同利益相关者之间的仔细沟通,并对机器学习模型和流程进行大量的重新训练和重新测试。我们相信,如果我们放慢速度,寻求利益相关者的帮助和意见,并应用科学方法,我们将能够解决现实世界中的偏见挑战,并部署性能优良且偏见最小化的模型。
资源
代码示例
管理偏见的工具
-
AI 公平性 360:
¹ 如果你对此事感兴趣,我们建议你分析一些免费提供的住房抵押披露法数据来满足自己的好奇心。
² 想要了解更多关于重新加权的实施和示例用法,请查看 AIF360 的"检测和减轻信贷决策中的年龄偏见"。
³ 不要忘记偏倚修正决策树(幻灯片 40)。
第十一章:XGBoost 红队测试
在 第五章 中,我们介绍了与机器学习模型安全相关的一些概念。现在我们将把它们付诸实践。在本章中,我们将解释如何攻击我们自己的模型,以便将红队测试纳入我们的模型调试库中。本章的主要思想是,当我们知道黑客将尝试对我们的模型做什么时,我们可以先尝试,并设计出有效的防御措施。我们将从概念复习开始,重新介绍常见的机器学习攻击和对策,然后深入探讨对结构化数据训练的 XGBoost 分类器进行攻击的示例。¹ 接着,我们将介绍两个 XGBoost 模型,一个是采用标准的不可解释方法训练的,另一个是采用约束条件和高度的 L2 正则化训练的。我们将使用这两个模型来解释攻击并测试透明度和 L2 正则化是否足够作为对策。之后,我们将探讨外部对手可能对不可解释 ML API 进行的攻击:模型提取和对抗性示例攻击。接下来,我们将尝试内部攻击,涉及对 ML 建模流程进行有意的更改:数据污染和模型后门。作为提醒,本章的代码示例可以在线获取 这里。现在,让我们开始吧——记得戴上你的锡帽,并且从 第五章 带上你的对抗心态。
注意
网络和学术文献中充斥着有关计算机视觉和语言模型攻击的示例和工具。有关这些广泛主题的良好总结,请参阅以下内容:
本章将这些思想移植到广泛使用的基于树的模型和结构化数据中。第五章 更广泛地讨论了 ML 安全问题。第一章、3 章 和 4 章 提供了大量风险缓解措施和流程控制措施,对所有类型的模型的 ML 安全都有帮助。
概念复习
值得提醒我们自己为什么对 ML 模型攻击感兴趣。ML 模型可以伤害人们并受到伤害——被人操纵、改变、破坏——人类是这些技术安全事件的主要受害者。恶意行为者可能试图对自己或他人造成有利的结果;他们可能进行企业间谍活动,窃取知识产权和数据。我们不希望我们的 ML 模型成为那种恶意活动的目标!在 第五章,我们称这种思维方式为对抗性思维。虽然我们的 ML 模型可能是我们完美的 Python 宝宝,也可能是能让我们的组织赚取百万美元的法律责任、安全漏洞和黑客探测点。特别是对于重要的高影响面向公众的 ML 系统,我们不能对这现实装作不知。让我们去做必要的工作,确保我们的模型没有漏洞,泄漏训练数据,泄漏模型本身,或允许恶意行为者欺骗我们的系统,使其损失金钱、知识产权或更糟。现在,让我们刷新一下对一些 第五章 中的概念、攻击和对策的记忆。
CIA 三角
广义地说,我们将信息安全事件分为三类,由 CIA 三角定义——保密性、完整性和可用性攻击:
机密性攻击
违反与 ML 模型相关的某些数据的保密性,通常是模型的逻辑或模型的训练数据。模型提取攻击暴露了模型,而成员推断攻击则暴露了训练数据。
完整性攻击
妥协模型行为,通常是为了以有利于攻击者的方式改变预测结果。对抗样本、数据毒化和后门攻击都会破坏模型的完整性。
可用性攻击
阻止模型用户及时或有效地访问它。在 ML 中,减速神经网络的海绵样本是一种可用性攻击。有些人还将算法歧视描述为可用性攻击的一种形式,因为少数群体未能像多数群体一样从模型中获得服务。然而,大多数可用性攻击将专门针对运行模型的服务进行一般的拒绝服务攻击,而不是专门针对 ML。我们不会尝试可用性攻击,但我们应该与 IT 合作伙伴联系,并确保我们的面向公众的 ML 模型有标准的对抗措施来减轻可用性攻击的影响。
在对 CIA 三角的简要提醒之后,让我们转向更多关于我们计划的红队攻击的详细信息。
攻击
为了概念复习,我们将粗略地将 ML 攻击分为两大类:外部 攻击和 内部 攻击。外部攻击被定义为外部对手最有可能对我们模型尝试的攻击。这些攻击的设置是,我们已将模型部署为 API,但在安全方面可能有些马虎。我们假设我们可以作为一个不可解释的实体与模型进行交互,以匿名方式进行,并且我们可以与模型进行合理数量的数据提交交互。在这些条件下,外部攻击者可以通过模型提取攻击提取我们模型的基本逻辑。无论有没有这个蓝图(尽管有它会更容易和更有害),攻击者随后可以开始制作出看似正常数据但会引发模型意外结果的对抗性示例。借助正确的对抗性示例,攻击者可以像操纵我们的模型一样。如果黑客成功进行了前两种攻击,他们可能会变得更加大胆,尝试一种更复杂和更有害的攻击:成员推断。让我们稍微详细地看一下不同类型的外部攻击:
模型提取
机密性攻击,意味着它会危及机器学习模型的机密性。进行模型提取攻击时,黑客会向预测 API 提交数据,获得预测结果,并建立提交数据与接收到的预测之间的替代模型,以反向工程出模型的副本。有了这些信息,他们可能会揭示专有的业务流程和决策逻辑。提取出的模型还为后续攻击提供了一个极好的测试平台。
对抗性示例
完整性攻击。它会危及模型预测的正确性。进行对抗性示例攻击时,黑客会探测模型对输入数据的响应方式。在计算机视觉系统中,通常使用梯度信息来微调能引发模型奇怪响应的图像。对于结构化数据,我们可以使用个体条件期望(ICE)或遗传算法来找到导致模型意外预测的数据行。
成员推断
一种旨在破坏模型训练数据机密性的机密性攻击。这是一种复杂的攻击,需要两个模型。第一个是类似于模型提取攻击中将要训练的替代模型。第二阶段模型随后被训练来决定数据行是否在替代模型的训练数据中。当第二阶段模型应用于数据行时,它可以决定该行是否在替代模型的训练数据中,并且通常可以推断该行是否也在原始模型的训练数据中。
现在谈谈那些内部人员攻击。不幸的是,我们并不总是能够信任我们的同事、顾问或承包商。更糟糕的是,人们可能被胁迫去犯下恶行,无论他们愿意与否。在数据污染攻击中,有人以某种方式改变训练数据,使其或其合作者能够以后操纵模型。在后门攻击中,有人改变模型的评分代码,以便以未经授权的方式访问模型。在数据污染和后门攻击中,肇事者最有可能是为了自己从中获利,相应地改变数据或评分代码。然而,一个恶意行为者可能会以某种方式改变重要模型,从而伤害他人,并不一定是为了自己获利:
数据污染
改变训练数据以改变未来模型结果的完整性攻击。为了进行攻击,只需有人能够访问模型训练数据。他们试图以微妙的方式改变训练数据,以可靠地改变模型预测结果,这样他们或其合作者在与模型交互时就可以利用这些结果。
后门
改变模型评分(或推断)代码的完整性攻击。后门攻击的目标是向部署的机器学习模型的复杂系数和 if-then 规则的复杂缠结中引入新的代码分支。一旦新的代码分支被注入到评分引擎中,知道如何触发它的人就可以在以后利用它,例如通过向预测 API 提交不切实际的数据组合。
我们没有回顾逃避和冒充攻击,但这些内容在第五章的案例研究中有所涉及。根据我们的研究,逃避和冒充攻击是当今最常见的攻击类型。它们通常用于增强型机器学习安全、过滤或支付系统。在计算机视觉领域,通常涉及对机器学习系统进行某种物理操作,例如戴一个逼真的面具或伪装自己。对于结构化数据,这些攻击意味着当与某个模型的用户进行比较时,改变数据行的数值使其具有相似值(冒充)或不同值(逃避)。请记住,规避欺诈检测机器学习模型是欺诈者和金融机构之间长期进行的一场你追我赶的游戏,这可能是我们最常见的应用场景,其中基于操纵结构化数据的逃避攻击最为常见。
针对措施
大多数机器学习攻击的前提是机器学习模型过于复杂、不稳定、过拟合和难以解释。过于复杂和难以解释的结构很重要,因为人类很难理解是否正在操纵一个极度复杂的系统。不稳定性对于攻击是重要的,因为它导致输入数据的微小扰动可能导致模型输出的显著和意想不到的变化。过拟合会导致不稳定的模型,并且在成员推断攻击中起作用。如果模型过拟合,它在新数据和训练数据上的表现会有很大差异,我们可以利用这种性能差异来推断是否使用了原始数据来训练模型。考虑到所有这些,我们将尝试两种简单的对策:
L2 正则化
对模型系数的平方和放置罚款,在模型的误差函数中,或者模型复杂度的某种度量上。强 L2 正则化可以防止任何一个系数、规则或交互变得过大和在模型中变得过于重要。如果没有单一特征或交互在推动模型,构建对抗性示例就更加困难。L2 正则化也倾向于使所有模型系数变小,使模型预测更加稳定,减少突发性波动。已知 L2 正则化还可以提升模型的泛化能力,这也有助于抵御成员推断攻击。
单调约束
这些措施使模型更加稳定和可解释,这两者都是机器学习攻击的一般缓解措施。如果一个模型高度可解释,这将改变其整体安全配置。我们知道模型应该如何行为,更容易识别其是否被操纵。机密性攻击失去了其威胁性,因为每个人都知道模型在遵守现实时的工作方式。如果约束阻止模型生成令人惊讶的预测,那么实际上没有办法进行对抗性示例攻击。如果约束对模型施加现实行为,那么数据毒化应该变得不那么有效。约束还应有助于泛化,使成员推断变得更加困难。
我们也希望这两种一般对策之间存在一些协同作用。L2 正则化和约束都增加了模型的稳定性。通过使用它们,我们试图确保模型在输入微小变化时不会看到大幅度的输出变化。特别是通过约束,我们还确保我们的模型不能给我们带来惊喜。约束意味着它必须遵守明显的因果关系现实,希望对抗性示例会更加难以找到,数据毒化会更少造成伤害。这两者也应该减少过拟合,并提供一些防御成员推断的手段。
其他重要的对策包括限流,认证,鲁棒机器学习和差分隐私方法。如果有人以太频繁或以奇怪的方式与 API 交互,限流会减慢预测速度。认证防止匿名使用,这通常会减少攻击动机。鲁棒机器学习方法创建的模型专门设计为更能抵御对抗性示例和数据毒化。差分隐私方法系统地破坏训练数据,以模糊它,如果发生模型提取或成员推断攻击。我们将使用 L2 正则化作为更易于访问的鲁棒机器学习和差分隐私方法的替代方案。我们已经解释过 L2 正则化的作用是创建更稳定的模型,但读者可能需要提醒 L2 正则化相当于在训练数据中注入高斯噪声。不能保证这能像真正的差分隐私方法那样有效,但我们将测试它在代码示例中的实际效果。现在我们回顾了主要的技术要点,让我们开始训练一些 XGBoost 模型。
模型训练
在我们的示例模型中,我们将决定是否向 API 用户提供更高的信用额度。读者可能会认为信用模型是最受保护的模型之一,这是正确的。但类似的机器学习模型被用于金融科技和加密货币的野蛮西部,如果我们认为仅仅因为一种计算机技术被部署在大银行就是安全的,银行监管机构可能会对我们有一些想法。信用申请欺诈很普遍,这只是信用申请欺诈的 2023 年版本。我们将在每个示例中介绍其他可能的攻击场景,但现实是真实世界的攻击可能会非常奇怪和令人惊讶,而且可能会发生在任何模型身上。
在我们所有的攻击中,我们将尝试入侵两个不同的模型。(实际上,我们可能只会对我们计划部署的模型或系统进行红队测试。但在本章中,我们将尝试一个实验。)第一个模型将是一个典型的 XGBoost 模型,不受限制且有些过拟合,除了列和行抽样提供的少量正则化之外,我们并没有其他正则化。我们预计这个模型由于过拟合和不稳定性而更容易被入侵。我们将max_depth设置为 10,以尝试过拟合,并指定其他超参数如下:
params = {"ntrees": 100,
"max_depth": 10,
"learn_rate": 0.1,
"sample_rate": 0.9,
"col_sample_rate_per_tree": 1,
"min_rows": 5,
"seed": SEED,
"score_tree_interval": 10
}
我们训练我们的典型 XGBoost 模型,没有花哨的东西:
xgb_clf = H2OXGBoostEstimator(**params)
xgb_clf.train(x=features, y=target, training_frame=training_frame,
validation_frame=validation_frame)
在我们进入模型训练之前,请注意,我们将使用 H2O 接口到 XGBoost,具体来说是为了能够生成 Java 评分代码并在稍后尝试一个后门攻击。这也意味着超参数的名称可能与使用本地 XGBoost 时有所不同。
对于我们希望更加健壮的模型,我们首先使用 Spearman 相关性确定单调性约束,就像在第六章中一样。这些约束有两个目的,都基于它们提供的常识透明度。首先,它们应该使模型在完整性攻击下更稳定。其次,它们应该使攻击者对机密攻击的价值减少。受约束模型更难操纵,因为其逻辑遵循可预测的模式,并且不应隐藏太多可能被出售或用于未来攻击的秘密。以下是我们如何设置约束:
corr = pd.DataFrame(train[features +
[target]].corr(method='spearman')[target]).iloc[:-1]
corr.columns = ['Spearman Correlation Coefficient']
values = [int(i) for i in np.sign(corr.values)]
mono_constraints = dict(zip(corr.index, values))
mono_constraints
我们方法定义的约束对于BILL_AMT*、LIMIT_BAL和PAY_AMT*特征为负,对PAY_*特征为正。这些约束很直观。随着账单金额、信用额度和支付金额的增加,我们受限分类器中违约的概率只能降低。随着支付逾期时间的增加,违约的概率只能增加。对于 H2O 的单调性,约束需要在字典中定义,并且对我们的具有对策的模型如下所示:
{'BILL_AMT1': -1,
'BILL_AMT2': -1,
'BILL_AMT3': -1,
'BILL_AMT4': -1,
'BILL_AMT5': -1,
'BILL_AMT6': -1,
'LIMIT_BAL': -1,
'PAY_0': 1,
'PAY_2': 1,
'PAY_3': 1,
'PAY_4': 1,
'PAY_5': 1,
'PAY_6': 1,
'PAY_AMT1': -1,
'PAY_AMT2': -1,
'PAY_AMT3': -1,
'PAY_AMT4': -1,
'PAY_AMT5': -1,
'PAY_AMT6': -1}
我们还使用网格搜索以并行方式查看广泛的模型集合。因为我们的训练数据较少,我们可以承担对大多数重要超参数进行笛卡尔网格搜索:
# settings for XGB grid search parameters
hyper_parameters = {'reg_lambda': [0.01, 0.25, 0.5, 0.99],
'min_child_weight': [1, 5, 10],
'eta': [0.01, 0.05],
'subsample': [0.6, 0.8, 1.0],
'colsample_bytree': [0.6, 0.8, 1.0],
'max_depth': [5, 10, 15]}
# initialize cartesian grid search
xgb_grid = H2OGridSearch(model=H2OXGBoostEstimator,
hyper_params=hyper_parameters,
parallelism=3)
# training w/ grid search
xgb_grid.train(x=features,
y=target,
training_frame=training_frame,
validation_frame=validation_frame,
seed=SEED)
一旦我们确定了一组不会过拟合我们数据的超参数,我们就会使用那组超参数params_best重新训练,以及我们的单调性约束:
xgb_best = H2OXGBoostEstimator(**params_best,
monotone_constraints=mono_constraints)
xgb_best.train(x=features, y=target, training_frame=training_frame,
validation_frame=validation_frame)
检查接收者操作特性(ROC)图表,我们可以看到两个模型的概率红队的结果。顶部的典型模型在图 11-1 中显示出过拟合的典型迹象。它具有高的训练曲线下面积,而验证 AUC 要低得多。我们的受约束模型在图 11-1 的底部看起来训练得更好。它具有与典型模型相同的验证 AUC,但训练 AUC 较低,表明过拟合程度较小。虽然我们不能确定,但单调性约束可能有助于减轻过拟合问题。

图 11-1. ROC 曲线,分别展示了(a)一个过拟合的 XGBoost 模型和(b)一个高度正则化和约束的 XGBoost 模型(数字,彩色版本)
现在我们有了两个模型,我们将同时进行我们的实验和红队演练。我们将试图确认文献中报告的内容和我们的假设——即典型模型更容易和更有成果地遭受攻击。它应该是不稳定的,隐藏着许多非线性和高阶交互作用。这使得攻击它更有价值。黑客很可能会发现无法解释的 GBM 的一些方面可以被利用来进行攻击,例如使用对抗性示例。由于它过拟合,典型模型也应更容易受到模型提取攻击的影响。后门也应该更容易——我们将试图在定义过拟合 GBM 的复杂 if-then 规则的纠缠中隐藏新代码。
注意
我们知道我们的过拟合 XGBoost 模型不太可能被读者部署,但可以把它看作是控制模型,而受限制的模型则是治疗模型,像一个简单实验中的假设,即受限制的、正则化的模型更安全。我们将在本章结束时解决这一假设。
所有这些攻击都是基于机器学习安全的一个基本前提:一个决心的攻击者可以比我们更深入地了解我们过于复杂的模型。攻击者可以利用这种信息不平衡以多种方式进行攻击。我们希望我们的受限制和正则化的模型不仅更难受到数据污染、后门和对抗性示例的攻击,而且在尝试机密性攻击时也不那么有用,因为任何具有领域知识的人都可以猜到它的工作方式,并且知道何时被操纵。
红队演练的攻击
我们认为模型提取和对抗性示例攻击更可能由外部人员进行。我们将像外部的恶意行为者一样进行红队演练来防范这些攻击。我们将所有与机器学习模型的交互都视为与一个不透明 API 的交互,但我们将看到我们仍然可以对所谓的黑匣子学到很多。我们还假设访问 API 不需要身份验证,并且我们可以访问 API 以接收至少几批预测。我们的攻击一旦成功,将会相互叠加。我们将看到初始的模型提取攻击非常具有破坏性,不仅因为我们可以了解受攻击模型及其训练数据的许多信息,而且因为它为攻击者打造了未来攻击的测试基础。
模型提取攻击
模型提取攻击的基本必要条件是,恶意行为者可以向模型提交数据并收到预测结果。由于这通常是机器学习设计的方式,因此完全根除模型提取攻击是困难的。模型提取的更具体情况包括弱认证要求,例如仅提供电子邮件地址即可创建帐户来使用 API,并且黑客每天可以从 API 中获得数千个预测。另一个基本要求是,模型必须隐藏某些值得窃取的信息。如果一个模型高度透明且有良好的文档记录,就几乎没有理由明确提取它。
由于我们的模型是信用模型,我们会指责一家新兴金融科技公司内部存在的“快速行动,搞砸一切”的文化,该公司急于将基于机器学习的信用评分 API 推向市场,以创造市场炒作。我们也可以同样归咎于一家主要银行复杂的安全程序,这些程序在某个短时间段内允许产品 API 比其本应该更容易访问。在任一情况下,企业竞争对手可能会进行模型提取,他们希望了解我们组织的专有业务规则,或者黑客想要免费获取资金。这些情景并不离谱,这就引出了一个问题:现在有多少模型提取攻击正在发生?让我们深入探讨如何进行红队行动,以确保我们的组织不会成为这些攻击的受害者。
攻击的起点是一个 API 端点。我们将建立一个基本的端点如下:
def model_endpoint(observations: pd.DataFrame):
pred_frame = h2o.H2OFrame(observations)
prediction = xgb_clf.predict(pred_frame)['p1'].as_data_frame().values
return prediction
从这里开始,我们向 API 端点提交数据以接收预测结果,开始红队行动。提交给 API 的数据类型似乎对我们攻击的成功至关重要。起初,我们尝试单独猜测输入特征的分布,并通过这些分布来模拟数据。但效果不佳,因此我们应用了 Shokri 等人在一篇著名论文中描述的基于模型的合成方法。该方法更倾向于模拟数据行,这些数据行从 API 端点获得高置信度的响应。通过结合我们对输入特征分布的最佳猜测,然后使用端点检查每个模拟数据行,我们能够模拟出与原始数据集足够相似的数据集,以尝试多种模型提取攻击。基于模型的合成方法的缺点是它涉及更多与 API 的交互,因此被捕获的机会更多。
注意
模型提取攻击的成功似乎在很大程度上取决于对训练数据的良好模拟。
手头有了真实数据,我们现在可以进行攻击。我们使用决策树、随机森林和 XGBoost GBM 作为提取的替代模型进行了三种不同的模型提取攻击。我们将模拟数据提交回 API 端点,收到预测结果,然后使用模拟数据作为输入、收到的预测结果作为目标来训练这三个模型。XGBoost 似乎在准确性上制作了最好的被攻击模型的复制品,也许是因为端点背后的模型也是 XGBoost GBM。这就是训练提取的 XGBoost 模型的样子:
drand_train = xgb.DMatrix(random_train[features],
label=model_endpoint(random_train[features]))
drand_valid = xgb.DMatrix(random_valid[features],
label=model_endpoint(random_valid[features]))
params = {
'objective': 'reg:squarederror',
'eval_metric': 'rmse',
'eta': 0.1,
'max_depth': 3,
'base_score': base_score,
'seed': SEED
}
watchlist = [(drand_train, 'train'), (drand_valid, 'eval')]
extracted_model_xgb = xgb.train(params,
drand_train,
num_boost_round=15,
evals=watchlist,
early_stopping_rounds=5,
verbose_eval=False)
我们将模拟数据分割成drand_train训练和drand_valid验证分区。对于每个分区,目标特征来自 API 端点。然后,我们应用了非常简单的超参数设置并训练了提取的模型。网格搜索可能会在这些模拟数据行上取得更好的拟合效果,这可能是攻击者某些情况下的目标。我们想要窃取底层模型的简单表达,并保持参数化的简单性。XGBoost 能够在使用模拟数据对 API 预测的情况下达到 0.635 的 R²。图 11-2 展示了在我们的模拟训练数据、模拟测试数据和实际验证数据上实际预测与提取预测之间的绘图。虽然没有任何提取模型完全符合 API 预测,但它们都与 API 预测显示出很强的相关性,表明我们能够提取出模型行为的信号。正如我们将要看到的,即使是这些粗糙的代理模型对于攻击者进一步利用端点也足够了。

图 11-2. 对决策树(a)、随机森林(b)和 GBM(c)在模拟训练、模拟测试和真实留存数据中提取模型分数与真实模型分数的比较(数字,彩色版本)
值得注意的一个重要结果是,提取受限模型的效果要好得多。而对于非受限模型,我们看到的 R²在 0.6 的范围内,而对于受限模型,我们看到的 R²在 0.9 的范围内。假设是,受限模型也将遵循风险管理的其他原则,比如彻底的文档化。如果模型的工作方式是透明的,提取它就不值得,但这一发现与我们最初关于受限和正则化模型的一些假设相抵触。
警告
受限模型可能更容易从 API 端点提取。这样的模型应该附有详尽的面向消费者的文档,以削弱提取攻击的动机。
能够像这样提取出一个模型对于机器学习安全来说是一个不祥之兆。我们不仅开始了解所谓的机密训练数据是什么样子,而且我们有一组提取出的模型。每个提取出的模型都是训练数据的压缩表示,也是组织业务流程摘要。我们可以使用可解释的人工智能技术从这些提取出的模型中获取更多信息。我们可以使用特征重要性、Shapley 值、部分依赖、ICE、积累的局部效应(ALE)等等,以最大化窃取机密信息。代理模型本身也是强大的 XAI 工具,而这些提取出的模型就是代理模型。虽然决策树在重现 API 预测方面的数值精度最差,但也是高度可解释的。看看我们如何利用这个模型轻松制作对抗样本,并且在与模型 API 的交互更少的情况下做到这一点,以减少我们红队行动的注意。
对抗样本攻击
对抗样本攻击可能是许多读者首先想到的攻击。它们比模型提取攻击还要少一些前提条件。进行对抗样本攻击只需访问数据输入并与模型交互以接收个体预测。与模型提取攻击一样,对抗样本攻击也是基于不可解释模型的使用。然而,这种攻击的角度与上一次攻击有所不同。对抗样本攻击在输入数据微小变化时引发模型结果的大或意外的变化。这种非线性行为是经典不可解释机器学习的特征,但在透明、受限和良好文档化的系统中较少见。还必须从这样的系统中获益。基于机器学习的支付系统、在线内容过滤器和自动评分都曾遭受过对抗样本攻击。在我们的情况下,目标更可能是企业间谍活动或金融欺诈。竞争对手可以简单地玩弄我们的 API 来了解我们如何定价信用产品,或者不良行为者可以学习如何通过 API 来获得不当的信用。
注意
除了红队活动之外,对抗样本搜索也是压力测试我们模型的一个好方法。跨多种输入值和预测结果进行搜索,相比仅使用传统评估技术,能更全面地了解模型行为。详见第 3 章以获取更多细节。
对于这个练习,我们将利用已经提取出的决策树模型表示,如我们在图 11-3 中展示的那样。

图 11-3. 过拟合模型的提取浅层决策树表示
我们可以使用提取的替代模型,有选择地修改数据行中的几个特征,以在攻击模型中生成有利的结果。请注意,图 11-3 中的顶部决策路径使我们落入提取决策树中最有利(最低概率)的叶子节点。这些是我们在红队作战中将要瞄准的决策路径。我们将取得一个得分较高的随机观察,并根据 图 11-3 顺序修改 PAY_0、BILL_AMT1 和 BILL_AMT2 的值来制作我们的对抗示例。我们用于制作对抗示例的代码非常简单:
random_obs = random_frame.loc[(random_frame['prediction'] < 0.3) &
(random_frame['prediction'] > 0.2)].iloc[0]
adversarial_1 = random_obs.copy()
adversarial_1['PAY_0'] = 0.0
adversarial_2 = adversarial_1.copy()
adversarial_2['BILL_AMT2'] = 100000
adversarial_3 = adversarial_2.copy()
adversarial_3['BILL_AMT1'] = 100000
我们攻击的结果是,在受攻击模型下,原始观察结果的得分为 0.256,而最终的对抗示例仅得分为 0.064. 这导致训练数据从第 73 分位变为第 24 分位——可能是信用产品被拒绝或批准的差异。我们未能对受约束的正则化模型执行类似的手动攻击。可能的一个原因是,受约束的模型将特征重要性更均匀地分布在输入特征上,而不是过拟合模型,这意味着仅仅几个特征值的变化不太可能导致模型得分的剧烈波动。在对抗示例攻击的情况下,我们的对策似乎有效。
注意我们也可以使用更准确的提取 GBM 模型中编码的树信息进行类似的攻击。此信息可通过方便的 trees_to_dataframe() 方法访问(见表 11-1):
trees = extracted_model_xgb.trees_to_dataframe()
trees.head(30)
表 11-1. 从 trees_to_dataframe 输出
| Tree | Node | ID | Feature | Split | Yes | No | Missing | Gain | Cover |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0-0 | PAY_0 | 2.0000 | 0-1 | 0-2 | 0-1 | 282.312042 | 35849.0 |
| 0 | 1 | 0-1 | BILL_AMT2 | 478224.5310 | 0-3 | 0-4 | 0-3 | 50.173447 | 10556.0 |
| 0 | 2 | 0-2 | PAY_AMT5 | 10073.3379 | 0-5 | 0-6 | 0-5 | 155.244659 | 25293.0 |
| 0 | 3 | 0-3 | PAY_0 | 1.0000 | 0-7 | 0-8 | 0-7 | 6.844757 | 6350.0 |
| 0 | 4 | 0-4 | BILL_AMT1 | 239032.8440 | 0-9 | 0-10 | 0-9 | 6.116165 | 4206.0 |
使用来自替代 GBM 的更详细的决策路径信息,可以更精确地制作对抗示例,可能会导致更好的攻击和 API 运算符的更多头痛(见表 11-1)。
注意
虽然许多对抗示例攻击方法依赖于神经网络和梯度,但基于替代模型、ICE 和遗传算法的启发式方法可用于生成树状模型和结构化数据的对抗示例。
成员攻击
成员推理攻击可能出于两个主要原因而进行:(1)通过数据泄露来尴尬或损害实体,或者(2)窃取有价值或敏感数据。这种复杂攻击的目标不再是操纵模型,而是外泄其训练数据。数据泄露是很常见的。它们可能会影响公司的股价,并引发重大的监管调查和执法行动。通常,数据泄露是由外部对手深入我们的 IT 系统并最终访问重要数据库而发生的。成员推理攻击的极端危险在于,攻击者可以通过访问公共 API 端点——从 ML API 端口中真正地抽取训练数据,来实现与传统数据泄露相同的破坏。对于我们的信用模型,这种攻击将是一种极端的企业间谍行为,但可能过于极端而不现实。这使得某些黑客团体想要访问敏感训练数据并对大公司的声誉和监管造成损害成为最现实的动机——这是网络攻击的常见动机。
注意
成员推理攻击可能会侵犯整个人口群体的隐私,例如,通过揭示某种特定种族更容易患上新发现的医疗条件,或者确认某些人口群体更有可能为某些政治或哲学事业做出贡献。
当成员推理攻击被充分进行时,黑客可以重新创建我们的训练数据。通过模拟大量数据并将其通过成员推理模型运行,攻击者可以开发出与我们敏感训练数据非常相似的数据集。好消息是,成员推理是一种困难的攻击方式,我们无法在我们简单的模拟信用模型上成功执行它。即使对于我们过拟合的模型,我们也无法可靠地区分出随机数据行和训练数据行。希望黑客也会遇到我们遇到的同样困难,但我们不应依赖于此。如果读者想了解成员推理攻击在现实世界中的工作原理,请查看非常有趣的 Python 包 ml_privacy_meter 及其相关的权威参考文献 “Membership Inference Attacks Against Machine Learning Models”。
注意
ml_privacy_meter 是一个道德黑客工具的示例,旨在帮助用户了解其个人数据是否未经同意使用。了解某个模型中使用的训练数据并不总是一种恶意活动。随着机器学习系统的普及,特别是生成图像和文本的系统,关于在生成 AI 输出中出现记忆训练数据的问题变得更加严重。已经提出了多种成员推理攻击的变体,以确定这些模型中的记忆程度。
在我们继续执行更可能由内部人员执行的攻击之前,让我们总结一下到目前为止的红队测试练习:
模型提取攻击
模型提取效果很好,特别是在受限模型上。我们能够提取底层模型的三个不同副本。这意味着攻击者可以复制正在进行红队测试的模型。
对抗样本攻击
基于模型提取攻击的成功,我们能够为过拟合的 XGBoost 模型制定高效的对手行。对抗样本对受限模型似乎没有太大影响。这意味着攻击者可以操纵我们正在进行红队测试的模型,特别是更过拟合的版本。
成员推断攻击
我们无法弄清楚。从安全角度来看,这是一个好迹象,但这并不意味着技术和经验更丰富的黑客不能成功。这意味着我们不太可能因成员推断攻击而遭受数据泄露,但我们不应完全忽视风险。
我们肯定希望在红队测试结束时与 IT 安全分享这些结果,但现在让我们尝试数据污染和后门。
数据污染
至少,要进行数据污染攻击,我们需要访问训练数据。如果我们能够访问训练数据,然后训练模型,然后部署它,我们就能造成真正的破坏。在大多数组织中,某人拥有无限制访问数据的权限,这些数据成为机器学习训练数据。如果这个人能够改变数据以在下游机器学习模型行为中引起可靠的变化,他们就可以污染机器学习模型。在更小、更无序的初创公司,同一名数据科学家可能能够操纵训练数据、训练并部署模型,这样很可能能够执行更有针对性和成功的攻击。在大型金融机构中也可能发生同样的情况,一个决心坚定的内部人员在数年间积累所需的权限来操纵训练数据、训练模型并部署它。在任何一种情况下,我们的攻击方案将涉及尝试污染训练数据,以在后来利用输出概率获得信用产品之前制造变化。
要启动我们的数据毒化攻击,我们实验了需要改变多少行数据才能在输出概率中引起有意义的变化。令人震惊的是,我们发现这个数字竟然是八行,跨越了训练和验证分区。这是三万行数据中的八行,远远少于 1%的数据量。当然,我们并不是完全随机选择这些行。我们寻找了八个应该接近负边界的人,并调整了最重要的特征PAY_0和目标DELINQ_NEXT,目的是将它们移到决策边界的另一侧,从而混淆我们的模型并显著改变其预测的分布。找到这些行可以用一行 Pandas 代码实现:
# randomly select eight high-risk applicants
ids = np.random.choice(data[(data['PAY_0'] == 2) &
(data['PAY_2'] == 0) &
(data['DELINQ_NEXT'] == 1)].index, 8)
要执行毒化攻击,我们只需对所选行实施我们描述的更改:
# simple function for poisoning the selected rows
def poison(ids_):
for i in ids_:
data.loc[i, 'PAY_0'] = 1.5 
data.loc[i, 'PAY_AMT4'] = 2323 
data.loc[i, 'DELINQ_NEXT'] = 0 
poison(ids) 
减少最重要的特征到一个阈值。
留下线索(可选)。
更新目标。
执行毒化攻击。
我们还留下了一些线索来跟踪我们的工作,通过将一个不重要的特征PAY_AMT4设置为2323的显著值。攻击者不太可能如此显眼,但我们希望以后可以检查我们的工作,而这个线索在数据中很容易找到。我们关于对抗措施的假设是,无约束模型很容易被毒化。它复杂的响应函数应该适应数据中的任何内容,不论是否被毒化。我们希望我们的约束模型在毒化攻击下表现更好,因为它受到人类领域知识的约束,应该以某种特定方式行事。这正是我们观察到的。图 11-4 显示了顶部的更过拟合的无约束模型和底部的约束模型。

图 11-4. 模型在数据毒化前后的分数,分别为(a) 无约束模型和(b) 正则化约束模型。八行毒化数据在图中作为异常值显示出来。(数字,彩色版本)
在数据毒化下,无约束模型的预测发生了显著变化,而约束模型则保持了稳定。对于两种模型,毒化的行在毒化数据的模型中接收到了显著较低的分数。对于约束模型,这种效应仅限于被毒化的行。对于过拟合的无约束模型,数据毒化攻击造成了广泛的破坏。
我们测量到在对无约束模型进行数据污染攻击后,超过一千行数据的模型得分发生了大于 10%的变化。这意味着每 30 人中就有一人在攻击后收到了显著不同的分数,而这只修改了八行训练数据。尽管有这一显著效果,模型给出的平均分数在攻击后保持不变。总结红队演习中数据污染部分时,改变不到 1%的行实际上改变了模型的决策过程。
注意
跟踪大型数据集变化的数据或环境版本软件可以阻止数据污染攻击。
更糟糕的是,数据污染是一种简单、现实且具有破坏性的攻击。大多数公司允许数据科学家几乎完全自主地进行数据准备和特征工程。而今天只有少数几家公司严格考虑其模型的校准程度,即当前预测分布与基于类似过去数据的预期结果的匹配程度。在许多组织中,这种受污染的模型可能会被部署。虽然每个人都应该考虑预测校准,但我们知道他们没有这样做。因此,一个更注重工程的解决方案是像跟踪代码更改一样跟踪数据更改,使用诸如开源项目 DVC 的工具。我们现在将转向后门,并消除改变模型预测的猜测。
后门
要执行后门攻击,我们需要访问模型的生产评分代码,即用于对新的未见数据做出决策的代码。目标是添加一个新的代码分支,当遇到只有我们知道的奇怪数据组合时执行。之后我们可以填写一个包含这些信息组合的信用产品申请,或者入侵评分管道中的信息,试图触发后门。为了造成更大的伤害,我们可以反复向愿意支付的人出售后门的钥匙。后门的关键,即在提交给模型的新行中的奇怪数据组合,有时被称为水印。在下一个示例中,我们将尝试向评分引擎中引入一段新的 Java 代码分支,并稍后利用水印进行利用。
注意
如果我们编辑模型评分执行文件以改进它而不是攻击它,那被称为模型编辑,这是一种有趣的模型调试技术。详见第三章获取更多信息。
因为我们的模型是 GBM(梯度提升机),是一系列决策树的顺序组合,我们决定以高效而隐秘的方式实施后门攻击,即在其评分逻辑中添加一棵新树。我们复制了倒数第二棵树,即第 98 棵树,在复制的树中作为新的代码分支添加了后门,并做了一些其他更改。后门出现在新复制树的根节点中,并且工作原理如下:如果根节点检测到负信用额度或新数据中的奇怪水印,则该树将对 GBM 的预测进行非常大的负调整。为了确保这棵新修改过的树不会影响模型的其他预测,我们将每个其他叶节点的输出设置为零,这意味着它们不会影响来自先前树的预测序列。以下是 Java 评分代码中后门的实际效果:
// a new and artificial 100th tree in the model
// copy of the 98th tree (trees are indexed from 0)
// with a false root node
// other terminal nodes set to 0
class XGBoost_model_python_1646219267151_Tree_g_0_t_100 {
static float score0(double[] data) {
// false root node
// checks if LIMIT_BAL is negative
// if so, issues very low score
return (((float)data[0]) < 0.0f) ?
-999.0f // log odds adjustment—very low
: // tree continues as usual
((Double.isNan(data[1]) || ((float)data[1] < 1.5f) ?
0.0f
:
...
当然,在实际攻击中,我们不会留下这些评论。此外,这些更改只会发生在评分代码的众多树类中的一个中。为了使攻击成功,我们需要确保这些更改反映在 GBM 评分逻辑的更广泛的树中。为此,我们在 Java 评分代码的树序列中插入了我们修改过的第 100 棵树:
...
preds_0 += XGBoost_model_python_1646219267151_Tree_g_0_t_99.score0(data);
// sneak the artificial "100th" tree into GBM
// has no effect unless LIMIT_BAL < 0
// this is the "watermark" used to exploit the backdoor
preds_0 += XGBoost_model_python_1646219267151_Tree_g_0_t_100.score0(data);
...
现在,我们将新的水印数据通过评分管道运行,以检查我们的后门。在表 11-2 中,读者可以看到我们的攻击是可靠的。
表 11-2. 展示了数据毒化攻击的结果(加粗)。提交带有负信用额度水印的行将导致默认概率为 0。
| 行索引 | LIMIT_BAL |
original_pred |
backdoor_pred |
|---|---|---|---|
| 0 | 3.740563e+03 | 0.474722 | 4.747220e–01 |
| 1 | 2.025144e+05 | 0.968411 | 9.684113e–01 |
| 2 | 5.450675e+05 | 0.962284 | 9.622844e–01 |
| 3 | 4.085122e+05 | 0.943553 | 9.435530e–01 |
| 4 | 7.350394e+05 | 0.924309 | 9.243095e–01 |
| 5 | 1.178918e+06 | 0.956087 | 9.560869e–01 |
| 6 | 2.114517e+04 | 0.013405 | 1.340549e–02 |
| 7 | 3.352924e+05 | 0.975120 | 9.751198e–01 |
| 8 | 2.561812e+06 | 0.913894 | 9.138938e–01 |
| 9 | –1.000000e+03 | 0.951225 | 1.000000e–19 |
唯一一行信用额度为负数的(加粗)第 9 行预测为 0。几乎可以保证能够利用这一后门的申请人将获得信用产品。问题在于,我们的组织是否审查机器生成的评分代码?可能不会。然而,我们可能会在类似 Git 的版本控制系统中跟踪它。但是当我们在评分引擎的 Git 提交中查看时,我们是否考虑到有人故意修改模型?可能不会。也许现在我们会考虑这一点。
注意
我们正在利用 Java 代码中的后门,但决心坚定的攻击者也可以修改其他类型的模型评分代码或可执行的二进制文件。
在我们考虑的所有攻击中,后门攻击似乎是最有针对性和可靠的。我们的对策能帮助我们应对后门吗?也许可以。在约束模型中,我们知道我们应该观察到偏关系、ICE 或 ALE 图中的预期单调关系。在图 11-5 中,我们为带有后门的约束模型生成了偏关系和 ICE 曲线。
幸运的是,这个后门违反了我们的单调约束条件,在图 11-5 中可以看到。随着LIMIT_BAL的增加,我们预期违约的概率应该减少,如顶部所示。而受到攻击的模型在底部显示的 PD/ICE 曲线明显违反了这一约束条件。通过结合约束模型和 PD/ICE 检查生产中的异常行为,我们能够检测到这种特定的后门攻击。如果没有这些常识性的控制措施,我们就只能依靠标准的、常常匆忙和杂乱无章的部署前审查来捕捉故意的狡猾变更。当然,PD/ICE 曲线只是模型行为的总结,并且这种后门可能会轻易地逃过我们的注意。然而,很少有组织后悔在模型部署后增加更多的监控。

图 11-5。约束和正则化模型的偏关系和 ICE 曲线,(a)没有和(b)有后门(数字彩色版)
在总结本章和红队演习之前,让我们考虑一下我们从内部攻击中学到了什么:
数据污染
数据污染对我们过拟合模型的影响非常显著,但对约束模型的影响较小。这意味着我们组织内部的某人可以更改训练数据,并导致模型行为异常。
后门
后门攻击似乎非常具有破坏力和可靠性。幸运的是,在我们将标准的可解释人工智能技术应用于约束模型时,后门的证据是可见的。不幸的是,如果考虑到使用过拟合模型的团队也不太可能参与其他风险管理活动,这种后门可能不太可能被捕捉到。
我们的红队演习的最后步骤是什么?
结论
我们应该做的第一件事是记录这些发现并将其传达给负责托管我们模型的服务安全的人员。在许多组织中,这可能是数据科学职能之外的人,通常位于传统的 IT 或安全组中。即使在技术从业者之间,沟通可能也是一种挑战。向某人繁忙的收件箱中倒入一个充满错字的 PowerPoint 文件很可能是一种无效的沟通方式。我们需要这些组之间进行耐心和详细的沟通,以改变安全姿态。在我们的发现中,具体的建议可能包括以下几点:
-
有效的模型提取需要与 API 端点进行大量特定交互——确保异常检测、限流和强身份验证在高风险 ML API 中得以实施。
-
确保这些 API 的文档详尽透明,以防止模型提取攻击,并明确模型的预期行为,使任何篡改变得明显。
-
考虑实施数据版本控制以对抗数据中毒尝试。
-
要注意预训练或第三方模型中的毒化问题。
-
加强代码审查流程,以防止 ML 评分工件中潜在的后门问题。
我们始终可以做更多,但我们发现保持建议高层次化,并不过度压倒我们的安全合作伙伴,是增加 ML 安全控制和对策采纳的最佳方法。
我们的实验如何?我们的对策确实起了作用,但有限。首先,我们发现我们的正则化和受限模型非常容易被提取。这仅留给我们透明度的概念对策。如果一个 API 被彻底文档化,攻击者可能甚至不会费力进行模型提取。此外,在这种情况下,攻击者的回报较少,相比于对无法解释的模型进行这些攻击。他们根本无法通过高度透明的模型获得不对称信息优势。当我们进行对抗性示例攻击时,我们观察到受限模型对于仅修改少量输入特征的攻击不太敏感。另一方面,通过仅修改我们从模型提取攻击中学到的最重要特征,过度拟合模型的得分变化很容易产生。
我们发现成员推断攻击非常困难。我们无法使它们适用于我们的数据和模型。这并不意味着更聪明和更专注的攻击者不能执行成员推断攻击,但这可能意味着现在更好地集中安全资源于更可行的攻击上。最后,我们的受限模型在数据中毒方面表现显著更好,受限模型还为检测 ICE 图中的后门提供了额外的方法,至少对某些攻击水印来说是这样。对于我们的示例模型和数据集来说,L2 正则化和约束似乎是合理且普遍的对策。但没有任何对策可以完全有效地抵御所有攻击!
资源
代码示例
安全工具
¹ 互联网上有大量关于对计算机视觉模型的攻击示例,但与cleverhans相关的教程是一个很好的起点。
第三部分:结论
第十二章:如何在高风险机器学习中取得成功
虽然人工智能和机器学习已经研究了几十年,并且在某些领域几乎同样长时间使用,但我们在广泛经济中采用机器学习的初期阶段。机器学习往往是不成熟的,有时是高风险的技术。机器学习令人兴奋并且充满了希望,但它不是魔法,从事机器学习的人也没有神奇的超能力。我们和我们的机器学习技术都有可能失败。如果我们希望成功,我们需要积极应对系统风险。
整本书提出了技术风险缓解措施和一些治理方法。这一最后一章旨在为您留下一些常识性建议,这些建议应能使您能够在机器学习中处理更困难的问题。然而,我们的建议可能并不容易实现。解决难题几乎总是需要艰苦的工作。用机器学习解决难题也不例外。在高风险技术项目中如何取得成功?通常不是通过快速行动和破坏事物。虽然快速行动和破坏事物在有缺陷的社交应用和简单游戏中可能表现得足够好,但这不是我们登上月球、安全飞行在全球各地的喷气机、推动我们的经济或制造微处理器的方式。高风险的机器学习与其他每个学科一样,都需要对安全和质量做出严肃的承诺。
如果我们处于机器学习采纳的早期阶段,那么我们正处于机器学习风险管理的黎明时期。直到 2022 年,国家标准与技术研究所(NIST)才发布了其首个 AI 风险管理框架的草案。遵循这一指导及其他指南,并与我们的实际经验和本书内容保持一致,我们认为在高风险的机器学习环境中取得成功的一种重要方式是对机器学习系统和数据科学家应用治理,并建立透明、经过测试的、公平和安全的技术。然而,除了这些过程和技术目标外,我们还想分享一些超出这些目标的建议和教训。在本章中,我们提出了对多样性、公平性、包容性、可访问性、科学方法、评估已发表声明、外部标准以及其他几个常识性指南的额外考虑,以帮助我们全面管理风险,并提高我们在重要机器学习项目中成功的机会。
注意
要在高风险的机器学习应用中成功,不仅需要技术能力和工具,还需要以下内容:
-
拥有多元化视角的团队
-
理解何时以及如何应用科学实验与软件工程方法
-
评估已发表结果和声明的能力
-
应用权威的外部标准的能力
-
常识
这一章讨论了多年来我们学到的关键社会技术教训,以便读者能够在下一个重要项目中以超越治理、代码和数学的专业知识快速起步。
谁在房间里?
从 ML 项目的最早阶段开始,即关于项目会议的会议,或者组织开始讨论 ML 采纳时,多样化的人员参与是一项基本的风险控制措施。要理解其中原因,可以考虑 Twitter 之前的 ML 伦理、透明度和问责(META)团队曾显示出平台的几个特征可能存在偏见,这至少部分是由于参与系统开发的人员类型所致。尽管这并非 ML 问题,但 Twitter 最初的 140 字符限制被视为激励英语使用者进行简洁对话,但正如在“给您更多表达空间”中讨论的那样,字符限制对平台的某些用户确实存在问题。这些问题最初设计者多为英语使用者并未立即显现。至于 ML,最近 Twitter 针对现已停用的图像裁剪器提出的 META 偏见悬赏显示出对少数在 ML 工程团队中很少得到充分代表的人群存在偏见,例如非拉丁脚本用户(例如阿拉伯语)的偏见,对白发人群的偏见,以及对戴宗教头饰者的偏见。只有通过全球用户社区的参与,Twitter 才发现了这些具体问题。
警告
多样性、公平性、包容性和可访问性是严肃的伦理、法律、商业和 ML 表现考量。看看周围的房间(或视频通话)。如果每个人看起来都一样或具有相同的技术背景,那么我们可能存在增加风险的重大盲点,并且可能会错过可以改善我们模型的重要视角。请参考NIST SP1270获取有关在 ML 中增加多样性、公平性、包容性和可访问性的额外想法、资源和缓解措施。
最近的研究题为“偏见程序员?还是偏见数据?操作化 AI 伦理的实地实验”可能揭示了在编码 ML 模型时这些偏见是如何产生的。在这项研究中,ML 模型的预测错误与开发者的人口统计学特征相关。不同类型的人倾向于有不同的盲点。参与 ML 项目的人种类越多,他们的盲点重叠就越少,整个团队的视角也更广泛。从我们 ML 努力的最开始,拥有职业和人口统计多样性非常关键,因为规划或治理的盲点会像糟糕的模型或差劲的测试一样毁掉 ML 系统。此外,人们普遍理解的是,多样性可以推动财务表现。多样性不仅仅是风险管理,也关乎更好的业务表现。
学者和从业者已经在思考如何改善 ML 领域的多样性,许多人确信雇佣更多多样化的团队可以建立更少偏见的 AI,或者至少在问诸如“人本 AI 如何对抗机器和人类的偏见?”等重要问题。然而,我们必须诚实地承认,今天在 ML 领域中缺乏多样性。根据 AI Now 报告“歧视性系统:AI 中的性别、种族和权力”,80%的 AI 教授是男性,“女性在 Facebook 的 AI 研究人员中占 15%,而在 Google 仅占 10%”,而仅“2.5%的 Google 员工是黑人,而 Facebook 和微软的比例分别为 4%”。尽管这可能需要延长时间表,与同事和利益相关者进行教育和学习,更多的会议和电子邮件交流,以及可能对我们自身偏见和盲点的艰难认知,但在组织的 ML 旅程的起点上,拥有一个职业和人口统计多样化的团队常常会导致更好的 ML 系统表现和更少的总体风险。
如果我们发现自己所在的团队过于同质化,我们必须与我们的管理者沟通,并参与面试过程,帮助实现更好的多样性和包容性。我们可以询问关于对模型进行外部审计的可能性,或者获取其他类型的外部专业知识,这些知识可以提供多元化的观点。此外,可以参考 NIST SP1270 提供的权威建议,该建议由许多领先的专家审阅,旨在增强 ML 领域的多样性、公平性、包容性和可访问性。
下次我们启动项目时,我们可以更好地包括具有更多不同人口统计背景的从业者,还有法律或监督人员,传统的统计学家和经济学家,用户体验研究人员,客户或利益相关者的声音,以及其他可以扩展我们对系统及其结果看法的人。而且,如果我们真的对从某个特定 ML 项目中出现的偏见或其他危害感到担忧,我们可以考虑联系我们内部的法律团队——特别是产品或数据隐私顾问——或者进行举报,如果我们组织内存在相关的保护措施的话。
科学与工程的对立
部署高风险的 ML 系统更像是一项科学实验,而不是机械的工程任务。尽管我们听到软件、硬件、容器化和监控解决方案如何帮助我们实现 ML 的运营,但 ML 系统并不保证可运行。毕竟,我们并不像建造一张桌子或甚至一辆汽车那样,可以假设只要按照一套说明就能工作。在 ML 中,我们可以按照这本书或其他任何被认为权威的指导所告诉我们的做,但系统仍然可能因为许多原因失败。至少其中一个原因是,构建 ML 系统往往涉及许多我们经常视为假设的假设,其中主要假设是我们能够在现实世界中实现系统预期效果。
警告
AI 和 ML 的大部分仍然是一个不断发展的社会技术科学,尚未准备好仅使用软件工程技术进行直接产品化。
一般来说,作为数据科学家,我们似乎忘记了需要仔细应用科学方法,以便在高风险部署中取得成功的良好机会,因为我们经常进行隐式实验。我们倾向于认为,如果我们能把工程做对,项目就会成功。这样做过于信任从观察数据中检测到的相关性,通常也过于信任训练数据本身,后者通常存在偏见且经常不准确。坦率地说,我们通常很难产生可重现的结果。而且,当我们确实提出更正式的假设时,通常是关于使用哪种算法。然而,对于高风险的 ML 系统,我们应该对系统预期的实际世界结果提出正式假设。
数据科学方法
我们在数据科学工作流程中多次看到了这些基本反模式,甚至在我们自己的工作中也是如此,我们给它起了个名字:数据科学方法。许多 ML 项目的成功似乎是建立在使用“正确”的技术基础上的,更糟糕的是,如果我们这样做,那么我们就不会失败。我们向看过数据科学方法的大多数同事展示后,他们都同意这听起来太过熟悉了。
阅读以下步骤,思考一下您参与过的数据科学团队和项目。以下是数据科学方法的运作方式:
-
假设我们会赚数百万美元。
-
安装 GPU,下载 Python。
-
从互联网或某些业务流程的排放中收集不准确、有偏见的数据。
-
屈服于确认偏见:
-
研究收集的数据形成假设(即使用哪些
X、y和 ML 算法)。 -
使用基本上相同的数据从假设生成到测试我们的假设。
-
使用能够很好地拟合几乎任何一组松散相关的
X和y的高容量学习算法来测试我们的假设。 -
不断修改我们的假设,直到结果“好”为止。
-
-
不用担心复制;我们都很好,兄弟。
数据科学方法无法导致我们的系统展示其预期的现实世界目的,除非碰巧。换句话说,数据科学方法无法提供证据支持或反驳关于我们系统体内结果的正式假设。尽管听起来很疯狂,但如果我们想要在高风险部署中系统地增加成功的机会,我们必须改变我们的整体机器学习方法。我们不能假设我们会成功(或发财)。事实上,如果我们想成功,我们可能应该更加对抗,假设成功非常困难,我们现在所做的任何事情都不会奏效。我们应该不断地寻找我们方法和实验设置中的漏洞。
尽管选择正确的工具对成功至关重要,正确掌握基本科学更为重要——主要因为通常并不存在“正确”的技术。回想起 C++的发明者比雅尼·斯特劳斯特鲁普经常说:“声称自己拥有完美编程语言的人要么是推销员,要么是傻子,或者两者兼而有之。”像生活中的许多事物一样,技术更多地是关于权衡而非寻找完美工具。
我们还必须质疑机器学习中的基本思想和方法。观察数据中的相关性,几乎所有机器学习模型都依赖的现象,可能是毫无意义、伪相关或错误的。统计学家和其他经验科学家长期以来就已经意识到了这个问题。如果我们在相同数据上进行大规模的网格搜索或其他重复比较,那么模型中的数百万、数十亿或数万亿个参数可能会发现大数据集中的相关模式,这可能并不重要。此外,我们必须质疑我们正在使用的数据的客观性和准确性。仅仅因为一个数据集是数字化的或大规模的,并不意味着它以我们需要的方式包含了机器学习模型可以学习的信息。最后的关键是缺乏可重复性。如果我们应用数据科学方法,难怪数据科学和机器学习存在众所周知的可重复性问题。重现实验设置和繁琐的技术步骤已经够难了,但是要求其他人像我们一样应用确认偏见和其他——通常未记录的——实验设计错误来复制我们有缺陷的结果几乎是不可能的。
科学方法
尽管数据科学方法通常令人兴奋、快速且简单,但我们必须找到方法将传统的科学方法应用于我们的工作,尤其是对于高风险的机器学习系统。本小节的步骤仅展示了将传统科学方法应用于机器学习项目的一种方式。阅读以下步骤时,请将其与数据科学方法进行比较。注意避免确认偏见、结果与技术的对比、收集适当的数据以及重现结果的重点:
-
发展一个可信的直觉(例如,基于先前的实验或文献回顾)。
-
记录我们的假设(即,我们机器学习系统预期的真实世界结果)。
-
收集适当的数据(例如,使用实验设计方法)。
-
测试假设:机器学习系统对治疗组是否具有预期的体内效应。
-
复现。
这个提议代表了大多数数据科学工作流程的彻底改变,因此我们将更详细地讨论每个步骤。首先,我们试图基于深入的文献回顾或过去成功的实验来设计我们的系统。然后我们将我们的假设记录在一个公共的地方,比如 GitHub 仓库,这样其他人如果改变它们就会注意到。那个假设应该是有意义的(即具有构建有效性),关于系统预期的真实世界结果,并且不是关于例如 XGBoost 能否击败 LightGBM。我们应该尽量避免使用现有的任何数据。相反,我们应该尝试使用合适的数据。这可能意味着收集特定的数据,并与统计学家或调查专家合作,以确保我们收集的数据遵循已知的实验设计原则。此外,我们必须提醒自己,我们的验证和测试错误度量看起来很好并不一定重要;如果我们正在进行数据分析,并参与使用网格搜索进行多个子实验,我们正在过拟合测试数据。虽然我们重视测试数据中的积极结果,但我们的重点应该是在真实世界中测量显著的治疗效果。我们的系统是否做到了我们说它会做的事情?我们能以某种可信的方式测量这一点吗,比如使用粗略的精确匹配来创建治疗和对照组,配合 A/B 测试和统计假设检验,用系统处理过的人和未处理过的人?最后,我们尽量不要假设我们的系统真的有效,直到其他人,比如熟练的模型验证者,重现我们的结果。
我们承认这种数据科学上的激烈变化最多只是理想化的,但当我们接近高风险的机器学习项目时,我们需要尝试。我们有责任避免高风险机器学习项目的数据科学方法,因为系统失败会迅速而大规模地影响真正的人类。
评估已发布的结果和声明。
另一个阻止我们应用科学方法的问题是,在 ML 的兴奋中,我们可能已经忘记了如何验证所有这些声称的发表。我们获取信息的许多来源——Medium、Substack、Quora、LinkedIn、Twitter 和其他社交定向平台——通常不是经过同行评审的出版物。仅仅因为在 Medium 或 Substack 上发布是有趣的(我们确实这样做了),它们是学习新事物的方便场所,但我们必须记住,这些平台上的任何人都可以说任何事情。除非它们直接重申了更可信出版物中发布的结果或在其他独立实验中得到了证实,否则我们应对社交媒体上报告的结果持怀疑态度。
此外,像 arXiv 这样的预印本服务并未经过同行评审。如果我们在那里找到了有趣的东西,我们应该查看是否实际上在尊重的期刊中发表,或者至少在会议记录中发表后再考虑采取行动。即使对于经过同行评审的期刊出版物或教科书,我们也应该花时间独立理解和验证这些主张。如果一篇论文上所有的引用都是已经揭穿的伪科学,那是一个非常糟糕的信号。最后,我们确实承认,我们的经验告诉我们,学术方法通常必须适应现实世界的应用。但是,还是建议在稳固的学术研究基础上建立,而不是在博客和社交媒体帖子的流变沙上建立。
警告
博客、新闻通讯和社交媒体内容通常不是权威科学和工程信息的来源。
一些资金充足的科技公司的研究团队可能也在推动被视为研究成就与工程成就的界限。请花一点时间思考语言模型(LMs),通常是技术研究团队的宝贵 AI 成就。即使是一支资金适中的学术研究团队能否重建其中一个模型?我们知道使用了哪些训练数据,或者我们看到了代码吗?这些系统难道没有经常失败吗?传统上,科学上被接受的研究结果应该是可重复的,或者至少是可验证的。虽然我们不怀疑技术公司发布的 LMs 的基准分数,但我们质疑它们是否足够具有意义地可重复、可验证或透明,以便被视为研究而非工程成就。
注意
读者应理解,尽管这本书经过了编辑和技术审查,但它并没有经过同行评审。这是我们试图将该书与 NIST AI 风险管理框架等外部标准对齐的另一个原因。
此外,由于 ML 是一个商业领域——在这个领域中,大量研究和 ML 工程的目标是在商业解决方案中实施,并且许多研究人员被从学术界挖掘到高薪的工业工程工作中——我们必须诚实地面对利益冲突。如果一家公司计划销售某项技术,我们应该对其报道的结果持谨慎态度。当一家技术公司计划销售技术时,它发表关于 AI 系统的惊人结果可能不是完全可信的声明。如果这些发布的结果没有经过外部、独立和客观的同行评审,情况会更糟。坦率地说,公司 X 说他们自己的技术很棒并不真实可信,无论白皮书有多长或 LaTeX 模板看起来多像 NeurIPS 论文。我们必须小心处理商业实体和 ML 供应商自报的结果。
有很多夸大和花哨的广告。在获取关于下一个项目的想法或者只是试图理解什么是炒作和什么是真实的时候,我们应该更加慎重。虽然通过关注广受引用的学术期刊和教科书可能会错过一些新的想法,但我们将更清楚地了解到实际可能发生的事情。我们也更有可能基于坚实且可重复的想法而不是炒作或市场宣传来规划我们的下一个项目。因为相比于演示、博客文章或低风险应用,高风险 ML 应用的成功更难伪造,所以即使我们花费更长时间开始并且我们的计划听起来并不那么令人激动,我们在长远来看更有可能成功。最终,在解决难题时真正的成功比更多的演示、博客文章和在琐碎用例中的成功更为重要。
应用外部标准
长期以来,关于人工智能(AI)和机器学习(ML)的标准大多缺失。但现在不同了。标准开始被定义。如果我们在处理复杂的 ML 问题时,如果对自己诚实,我们希望得到帮助和建议。获取高风险 ML 项目帮助和建议的好地方是权威标准。在本节中,我们将重点关注来自美国联邦储备银行(FRB)、NIST、欧盟 AI 法案和国际标准化组织(ISO)的标准,以及我们认为如何最好地利用它们。FRB 模型风险管理(MRM)指南和 NIST AI 风险管理框架(RMF)都非常注重文化和流程,尽管 NIST 还涉及一些技术细节。欧盟 AI 法案的附件对于定义和文档非常有帮助,ISO 也提供了许多定义和良好的技术建议。这些资源帮助我们思考许多不同类型的风险和风险缓解,并帮助确保在高风险 ML 项目中我们没有忽视明显的事情:
模型风险管理指南
我们在本书早些时候就赞美了“模型风险管理监管指南”,我们现在再次赞美一下。只是不要期望这些指导为低级技术提供建议。在尝试为组织建立治理或风险管理结构时,请参考这些指导。可以从这些指导中获得的通用经验包括以下内容:
文化至上。
如果一个组织的文化不尊重风险管理,那么风险管理就不起作用。
风险管理从最高层开始。
董事会和高级管理人员必须在 ML 风险管理中积极参与。
文档是基本的风险控制措施。
写出我们的模型工作原理,以便他人可以审查我们的思路。
测试应是独立且高声望的功能。
测试人员应被授权暂停或终止开发工作。
必须激励人们参与风险管理。
这对于免费来说太难了。
此外,如果读者希望通过 ML 风险管理大开眼界,请查阅“监理指南:模型风险管理”,特别是内部控制问卷。这些是银行监管机构在进行监管检查时要经历的步骤,我们建议您仅出于可能性的艺术目的偷看一下,并记住这只是大银行为控制其 ML 风险而预期做的部分工作。此外,这些风险控制对于 NIST AI RMF 具有重大影响,该框架多次引用了监督指导和监理手册。熟悉这些资源很重要,因为它们可能塑造您所在行业、部门或垂直领域的未来监管或风险管理指导。这些资源本身——监督指导和监理手册——也可能会继续缓慢发展。
NIST AI 风险管理框架
NIST AI 风险管理框架在银行业实践的 MRM 指导基础上进行了有意义的扩展。在银行业实践 MRM 时,模型风险管理人员通常可以指望银行中的其他职能部门关注隐私、安全和公平性问题,从而能够主要专注于系统性能。RMF 将这些以及其他可信特征——有效性、可靠性、安全性、偏见管理、安全性、弹性、透明度、问责制、可解释性、可解读性和隐私——统一纳入 AI 风险管理的旗帜下,对于非银行机构更为现实。
AI RMF 提供跨所有这些愿望的高层建议,并且重要的是,它明确指出它们都是相互关联的。与 MRM 指南不同,RMF 强调多样性和包容性作为风险控制,并将类似事件响应和漏洞悬赏这样的网络安全风险控制引入 AI 风险控制范畴。NIST 指南也分为多个文件和互动网站。虽然核心 RMF 文件提供了更高层次的指导,但许多额外的资源深入探讨了技术和风险管理细节。例如,AI 风险管理手册提供了有关风险管理的详尽指导,以及相关文档建议和参考资料。相关文件,如 NIST SP1270 和 NISTIR 8367,《人工智能中可解释性和可理解性的心理基础》,提供了特定主题的极其有用和详细的指导。RMF 是一个长期项目。请期待未来几年出现更多高质量的风险管理建议。
欧盟 AI 法案附件
前往此处查看高层次定义,包括高风险机器学习的定义以及文档建议。欧盟 AI 法案的附件 I 为 AI 提供了一个坚实的定义。我们需要统一和达成一致的风险管理定义。这很重要,因为如果一个政策或测试应该适用于组织中的所有 AI 系统,我们可以预期至少有一组或一个人会通过声称他们不从事 AI 来逃避要求。附件 III 描述了被视为高风险的具体应用,例如生物识别身份验证、基础设施管理、教育、就业、政府或公共事业服务、信用评分、执法、移民和边境控制以及刑事司法。最后,附件 IV 为 ML 系统应该记录的内容提供了良好的指导。如果我们的组织偏向于庞大的 MRM 文件和最小化的模型卡之间的某个地方,我们将欣赏到附件还为 ML 系统文档提出了良好的框架。请注意,AI 法案截至本书出版时为草案法规,但通过的可能性被认为很大。
ISO AI 标准
不断发展的ISO AI 标准是寻找低级技术指导和大量技术定义的好地方。虽然许多标准仍在开发中,但像ISO/IEC PRF TS 4213—机器学习分类性能评估、ISO/IEC TR 24029-1:2021—神经网络稳健性评估和ISO/IEC TR 29119-11:2020—AI 系统测试指南等已经可以使用。这些可用的标准确实有助于确保我们的技术方法是完整和彻底的。与本节讨论的其他指南不同,ISO 标准通常不是免费的。但它们也不是特别昂贵,比 AI 事件要便宜得多。随着时间的推移,监视 ISO AI 标准的增量完善会为额外有价值的技术指导和风险管理资源提供支持。
注意
应用外部标准,如 ISO 和 NIST 的标准,可以提高我们的工作质量,并在不可避免发生问题时增加防御性。
还有其他组织提供的标准,比如电气和电子工程师学会(IEEE)、美国国家标准学会(ANSI)或经济合作与发展组织(OECD)的标准,这些标准可能也适合您的组织。关于这些标准,还有一件事要记住,应用它们不仅有助于我们做得更好,而且在审查时也有助于我们证明我们的选择。如果我们在机器学习的高风险工作中,应该期待审查和监督。用这些标准来证明我们的工作流程和风险控制会比基于我们自己编造或在博客或社交网站上找到的东西更好。简而言之,使用这些标准使我们和我们的工作看起来更好,因为它们已知能够提升技术水平。
常识性风险缓解
我们在高风险的机器学习项目上花费的时间越多,我们对什么可能出错和什么可能顺利的直觉就越发展。这一部分详细的建议可能可以在一些标准或权威指南中找到,但我们是通过艰辛的方式学到的。这些观点是一系列常识性建议的集合,应该有助于加速从业者在处理高风险机器学习系统时的直觉。它们可能看起来基础或显而易见,但是让我们坚持这些艰难赢得的经验教训并不容易。市场总是在推动我们更快地前进、测试更少、对风险做更少的事情。这对于低风险应用可能没问题,但对于严肃的使用场景来说,放慢节奏并思考是值得的。我们在这里详细描述的步骤有助于阐明我们为什么以及如何做到这一点。基本上,我们应该在编码之前思考,测试我们的代码,并为这些过程提供足够的时间和资源:
简单开始。
使用基于深度学习、堆叠泛化或其他复杂技术的复杂机器学习系统可能会令人兴奋,尤其是在高风险应用中。然而,除非问题需要那种复杂度水平,否则我们不应这样做。复杂性往往意味着更多的故障模式和更少的透明度。透明度较少通常意味着系统更难修复和审查。在处理高风险项目时,我们必须权衡失败可能性及其带来的损害与我们玩弄高科技的愿望之间的关系。有时候,最好从更简单、更清晰理解的方法开始,然后随着时间的推移逐步迭代到更复杂的解决方案。
避免过去的设计失败。
不要重复过去的机器学习失败。在处理高风险问题时,我们应该回顾过去类似问题的失败尝试。这正是AI 事故数据库的变革论点之一。这是我们应该查看的几个资源之一,以帮助我们避免过去的机器学习错误。我们还应该在组织内部询问。可能有人之前就尝试过解决我们正在尝试解决的问题,尤其是如果这是一个重要的问题。
为风险管理分配时间和资源。
风险管理需要时间、人力、资金和其他资源。建立系统演示的团队可能不够大或者广泛,以至于无法构建系统的生产版本并管理其风险。如果我们正在处理高风险的机器学习系统,我们需要更多的资源进行强化工程、测试、文档编制、处理用户反馈以及风险评审。我们还需要更多的时间。组织、管理者以及数据科学家往往低估了即使是构建平凡机器学习系统所需的时间。如果你在处理高风险的机器学习项目,你可能需要延长项目周期,甚至可能是低风险系统所需周期的几倍。
应用标准的软件质量方法。
我们以前说过,现在再说一遍。没有理由让机器学习系统免于标准软件质量保证流程。对于高风险系统,我们可能需要应用全方位的软件质量保证措施:单元测试、集成测试、功能测试、混乱测试、随机攻击等等。如果你需要回顾这些技术如何应用于机器学习系统,可以参考第三章。
限制软件、硬件和网络依赖。
每一个我们使用的第三方软件,无论是开源还是专有的,都会增加我们系统的风险。我们并不能总是知道这些依赖项是如何管理风险的。它们是否安全?是否公平?是否符合数据隐私法?这些都很难确认。同样的概念也适用于网络依赖性。我们连接的机器是否安全?它们是否始终可用?答案是,至少在较长的时间内,可能并不是。虽然专用硬件通常比第三方软件和额外的网络连接带来更少的安全和故障风险,但它确实增加了复杂性。增加的复杂性通常默认会增加风险。减少和简化软件、硬件和网络依赖性可能会减少意外情况,必要的变更管理流程以及所需的风险管理资源。
限制多个机器学习系统之间的连接。
如果一个机器学习系统的风险难以列举,那么当我们开始构建基于机器学习的决策或技术流程时会发生什么?结果可能极不可预测。在连接机器学习系统到像互联网这样的大型网络或将多个机器学习系统连接在一起时要小心。这两种情况都可能导致意外的伤害,甚至系统性的故障。
限制系统输出,以避免可预见的事件发生。
如果某个机器学习系统的某些结果可预见地存在问题,比如允许自动驾驶汽车加速到每小时 200 英里,我们不必坐视不管,让我们的系统做出错误的决策。使用业务规则、模型断言、数值限制或其他保障措施,防止系统做出可预见的错误决策。
记住游戏并非现实世界。
数据科学竞赛的排行榜根据单一指标排名模型,没有考虑到方差或现实世界中的权衡,不足以评估现实世界的决策。机器学习系统在游戏中成功也不是。仅因为一个机器学习系统在游戏中成功,并不意味着它在现实世界中也会成功。在游戏中,我们知道所有的规则,规则不会改变。在某些情况下,我们可以访问与游戏相关的所有可能数据,例如所有可能的结果或所有可能的移动。但这并不现实。在现实世界中,我们不知道所有的规则,系统的规则可以急剧而迅速地改变。我们也无法获得所有需要做出良好决策所需的数据。一个机器学习系统在游戏中的成功可能是一个巨大的研究成就,但对于部署在世界上的高风险社会技术机器学习系统来说可能是无关紧要的。
仔细监控无监督或自我更新的系统。
无监督系统、在没有地面真相的情况下训练的系统以及自更新系统(例如,强化、适应或在线学习)本质上具有更高风险。在部署这些系统之前,很难理解无监督系统是否表现足够良好,并且难以预测自更新系统可能的行为。虽然所有机器学习系统都应该进行监控,但部署到高风险应用程序的无监督和自更新系统需要实时监控性能、偏差和安全问题。这类监控也应尽快在检测到问题时提醒人类,并且这些系统可能需要配备关闭开关。
理解人类受试者的伦理和法律义务。
鉴于许多机器学习部署涉及收集敏感数据或本身就是对人类用户进行的隐含或显性实验,我们应熟悉我们组织的机构审查委员会(IRB)政策,人类实验的基本指南,以及进行人类实验的其他法律和伦理义务。
限制匿名使用。
如果系统不需要匿名使用,则要求用户在使用之前进行身份验证或以其他方式证明其身份可以显著减少涉及系统的黑客攻击、滥用和其他不良行为。
对 AI 生成的内容应用水印。
向任何 AI 生成的内容添加显著标记、字符和声音可以帮助识别它,并减少这类内容被用于欺骗行为的风险。
知道何时不使用机器学习。
机器学习并不是解决所有问题的万能药。事实上,有一大类问题我们知道它并不擅长解决。在预测生活结果方面,机器学习并不比人类或简单模型表现更优,而人类和简单模型在这方面也表现不佳。从视频中,机器学习也无法准确预测谁在工作中表现良好,根据NIST的说法。包括阿尔温德·纳拉亚南在内的知名机器学习研究人员,指出了机器学习在预测犯罪再犯率、执法和发现恐怖分子方面的问题。机器学习在理解或预测许多人类和社会结果方面表现并不理想。虽然这些问题有趣且具有高价值,但我们不应该试图用机器学习解决它们,除非我们知道一些 NIST 和美国国家科学院尚不知道的事情。社会结果并不是机器学习系统已知存在问题的唯一领域。在深入涉及高风险机器学习系统之前,记得查看过去的失败案例。
注意
在你下一个重要的机器学习项目中,不要害怕询问关于设计、时机、资源、成果和用户的基础性问题。
通过结合这些常识性控制措施与增加的人口和专业多样性,更好地坚持科学方法,更严格地评估已发表声明,应用权威外部标准,以及在前几章中提到的所有治理和技术好处,您应该能够在困难的机器学习应用中取得更好的结果。当然,要获取所有这些额外工作的支持并找到时间来完成这一切并不容易。不要试图做得太多。回想一下第一章和风险管理基础知识。尝试理解您最严重的风险是什么,并首先减轻它们。
结论
本书从管理构建和维护机器学习系统的人员的教训开始。然后讨论了如何通过可解释模型和可解释人工智能使机器学习模型更加易于理解。它概述了通过模型调试和安全方法使机器学习模型对人们更加可信的方法,并强调了如何使它们对人们更加公平。这种对人们的关注并非偶然。技术是关于人的。除了某种类型的人类利益外,几乎没有理由去开发技术,而机器在受到伤害时不会感到痛苦、愤怒和悲伤,人们会。此外,根据我们的判断,人类仍然比计算机更聪明。过去十年的机器学习主要是关于使用几乎没有人类输入训练的大规模不可解释模型的成功,我们怀疑现在是时候在某种程度上把钟摆摆回来了。未来几年的许多机器学习成功将涉及法律和监管合规性、改进人类与机器学习的互动、风险管理和切实的业务成果。将最大化人类利益和最小化伤害作为您的高风险机器学习项目的核心,您将取得更多成功。
资源
进一步阅读


浙公网安备 33010602011771号