响应式人工智能的平台和模型设计指南-全-
响应式人工智能的平台和模型设计指南(全)
原文:
annas-archive.org/md5/1d3ba6203573861788b1a8cda3eef226
译者:飞龙
前言
人工智能(AI)自诞生以来已经走过了漫长的历程,从一个未来主义的概念转变为渗透我们生活方方面面的普及技术。从医疗健康、金融到公共和私人部门的决策过程,AI 系统已成为我们日常生活中不可或缺的一部分。随着以 ChatGPT 为代表的 AI 驱动应用成为个人和企业的基本工具,我们必须高度重视随之而来的伦理、社会和技术挑战。
本书的动机源于我们的信念:现在,比任何时候都更需要为一个 AI 能够成为推动社会进步的积极力量的未来打下基础。随着 AI 不断塑造我们的世界,本书旨在为 AI 工程师、商业领袖、政策制定者以及其他利益相关者提供关于负责任且值得信赖的 AI 系统开发与实施的全面指导。
在这本全面的书籍中,我们将探讨负责任 AI 的各个方面,包括机器学习(ML)模型的脆弱性、对抗性攻击的易受性以及强有力安全措施的重要性。我们将深入研究以安全性和可靠性为优先的风险规避方法,尽量减少潜在的危害和意外后果。本书还将探讨各国采取的政策框架和策略,以确保 AI 的伦理开发与部署,并涉及数据隐私的关键问题,提供保护用户信息的技术和最佳实践,以维护对 AI 系统的信任。此外,我们将讨论 AI 模型评估、不可预见性和验证的方法;MLOps 和 AutoML 在企业环境中推动高效、可扩展且负责任的 AI 实践的作用;以及 AI 公平性的重要性,解决数据收集、预处理和模型优化中的挑战,减少偏差,确保公正的结果。我们还将讨论 AI 系统中的透明度和可解释性的必要性,伦理治理和监督,并介绍构建适应性强、经过校准的 AI 模型的技术,使其能够有效应对不断变化的环境和需求。此外,我们将深入探讨可持续特征库的概念,促进在负责任 AI 模型开发中的效率和一致性,并展示多个行业中负责任 AI 的实际案例研究和应用,展示其影响和好处。
本书旨在成为一本全面的资源,帮助那些希望利用人工智能(AI)力量的读者,同时应对其所带来的关键伦理和社会挑战。我们希望本书能激励你加入负责任的 AI 发展行列,并在自己的职业和个人事业中应用其原则和实践。
本书的目标读者
本书面向有经验的机器学习专业人士,帮助他们了解机器学习模型和框架的风险及数据泄露,如何通过设计实现公正,并学习如何开发和使用可复用组件,从而减少设置和维护 AI 生态系统的工作量和成本。
本书内容概述
第一章,机器学习模型的风险与攻击,详细概述了与机器学习模型可能遭遇的不同类型攻击相关的关键术语,帮助读者初步理解攻击者如何设计机器学习攻击。本章中,你将了解直接和间接的攻击,这些攻击会危及系统的隐私。在此背景下,本章突出了由于敏感信息丧失给组织带来的损失,以及个人如何容易将机密信息暴露给对手。
第二章,风险规避方法学与框架的出现,全面介绍了风险评估框架、工具和方法学,这些可以直接应用于评估模型风险。本章中,你将了解数据平台中包含的工具和模型设计技术,帮助降低大规模应用中的风险。本章的主要目标是提高数据匿名化和验证技术的意识,同时介绍与隐私相关的不同术语和措施。
第三章,关于可信 AI 的法规与政策,介绍了各国通过的不同法律,以保护和防止客户敏感信息的丧失。你将了解不同伦理专家小组的形成、政府举措以及正在制定的政策,以确保所有 AI 解决方案的伦理性与合规性。
第四章,大数据与模型设计管道中的隐私管理,详细介绍了与大数据系统相关的不同组件,这些组件作为构建块,帮助我们有效部署 AI 模型。本章介绍了如何在基于微服务的架构中处理合规性问题,以确保没有信息泄露。本章中,你将了解单个微服务中所需的不同安全原则,以及在大规模部署机器学习模型时需要在云中纳入的安全措施。
第五章,机器学习管道、模型评估与不确定性处理,介绍了人工智能/机器学习工作流。该章节深入探讨了用于分类、回归、生成和强化学习的不同机器学习算法。章节还讨论了与这些算法的可靠性和可信度相关的问题。我们从介绍机器学习管道的各种组件开始。接着,章节简要探索了分类、回归和聚类任务中重要的人工智能/机器学习算法。此外,我们还讨论了各种类型的不确定性、其成因及量化不确定性的技术。
第六章,超参数调优、MLOps 与 AutoML,在上一章的基础上继续讲解了机器学习管道中持续训练的必要性。构建机器学习模型是一个迭代过程,且由于存在如此多的模型,每个模型都有大量的超参数,这对初学者来说无疑增加了复杂性。本章简要介绍了当前的 AutoML 选项,适用于你的机器学习工作流。它扩展了无代码/低代码解决方案的适用场景。还探讨了主要云服务提供商在易用性、功能和模型可解释性方面提供的解决方案。此外,本章还涉及了编排工具,如 Kubeflow 和 Vertex AI,用于管理机器学习模型的持续训练和部署。
第七章,公平性概念与公平数据生成,提出了由于缺乏标准化,针对不同类型数据、知识本体、词汇等的非公平数据收集问题。本章的主要目的是强调数据质量的重要性,因为偏见数据集可能会在机器学习模型中引入隐性偏见。该章重点介绍了全球范围内需要实践的更好的数据收集、管理和监控指导原则。你还将进一步了解评估策略的初步步骤如何帮助构建无偏数据集,从而为基于机器学习的预测提供新的人工智能分析和数字化转型之旅。
第八章,模型优化中的公平性,介绍了优化和获得公平机器学习模型所必需的不同优化约束和技术。本章的重点是通过研究揭示的不同新定制优化器,帮助你构建监督式、无监督式和半监督式的公平机器学习模型。从更广泛的角度来看,本章为你准备了创建和定义模型约束的基础步骤,这些约束可以在训练过程中被不同的优化器使用。你还将理解如何通过适当的度量评估这些基于约束的模型,以及优化技术所产生的额外训练开销,这些都将使得模型能够设计出自己的算法。
第九章,模型可解释性,介绍了可以用来揭开机器学习模型“黑箱”之谜的不同方法。我们将讨论为什么需要能够解释模型的预测结果。本章涵盖了诸如 SHAP 和 LIME 等算法和技术,以便为现有模型增加可解释性组件。我们还将探索像 DoWhy 和 CausalNex 这样的库,来查看最终用户可用的可解释性功能。我们还将深入研究 Vertex AI、SageMaker 和 H2O.ai 提供的可解释性功能。
第十章,伦理与模型治理,强调了在生产环境中需要建立的伦理治理流程,以便快速识别与模型开发和部署相关的所有风险。本章还涵盖了监控所有模型的最佳实践,包括那些处于库存中的模型。你将深入了解模型生命周期不同阶段出现的风险的实际细微差别,以及这些风险在模型存放于库存中时如何得到缓解。在这里,你还将了解不同的风险分类程序,以及它们如何帮助最小化由低性能模型导致的业务损失。此外,你还将详细了解如何在数据聚合、模型训练的迭代轮次和超参数调优过程中建立适当的治理。
第十一章,模型适应性的伦理学,重点讨论了为生产中的模型建立伦理治理流程,旨在快速检测模型失败或输出预测中的任何偏差迹象。通过阅读本章,您将更深入地理解监控模型性能和上下文模型预测的实际细节,方法是通过不断审查数据并与过去进行基准对比,从而制定适当的可操作的短期和长期计划。此外,您还将详细了解导致模型重训练的条件以及拥有完美校准模型的重要性。本章还突出了公平性和模型校准之间的权衡。
第十二章,构建可持续的企业级 AI 平台,重点讨论了组织目标、举措以及领导层支持如何帮助我们构建可持续的伦理 AI 平台。本章的目标是强调组织将伦理 AI 原则与本地价值观、人权、社会规范和解决方案所运行社区的行为相联系的重要性。在此背景下,本章突出了大规模 AI 解决方案对环境的影响,以及在使用联邦学习进行模型训练和部署时需要纳入的正确程序。本章进一步深入探讨了重要概念,强烈强调了保持社会责任感的必要性,以及能够设计软件、模型和平台的重要性。
第十三章,可持续模型生命周期管理、特征库和模型校准,探讨了在模型开发生命周期中需要遵循的最佳实践,这些实践有助于创建可持续的特征库。本章将强调实施隐私保护的重要性,以便在不妥协安全和隐私方面的前提下,最大化特征库的重用和团队之间的协作。本章还深入探讨了不同的模型校准技术,这些技术对于构建可扩展的可持续机器学习平台至关重要。在这里,您还将了解如何设计适应性强的特征库,以及我们如何在联邦学习中最好地融入监控和治理。
第十四章,行业广泛的应用案例,提供了各行业不同应用案例的详细概述。此章节的主要目的是向来自不同行业领域的读者介绍如何将伦理和合规性集成到他们的系统中,以构建公平公正的人工智能系统,并赢得最终用户的信任与信心。您还将有机会将前几章学习的算法和工具应用于不同的业务问题。此外,您将了解如何在不同的行业领域中重复使用伦理设计模式。
最大化利用本书
每章有不同的要求,已经在各自的章节中说明。
您应该具备基本的机器学习(ML)、Python、scikit-learn、PyTorch 和 TensorFlow 知识,以更好地理解本书中的概念。
下载示例代码文件
您可以从 GitHub 上下载本书的示例代码文件,网址为 github.com/PacktPublishing/Platform-and-Model-Design-for-Responsible-AI
。如果代码有更新,将会在 GitHub 仓库中进行更新。
我们还在我们的丰富书籍和视频目录中提供其他代码包,您可以访问 github.com/PacktPublishing/
查看!
使用的约定
本书中使用了多种文本约定。
文本中的代码
:表示文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名。例如:“Atlas 提供了在动态创建分类时的巨大灵活性,如 PII、EXPIRES_ON
、DATA_QUALITY
和 SENSITIVE
,并支持 EXPIRES_ON
分类中的 expiry_date
属性。”
代码块设置如下:
model.compile(optimizer='rmsprop', loss=aleatoric_loss, metrics=['mae'])
所有命令行输入或输出按如下格式书写:
roc_auc_score(y_test, y_pred_uncal)
>>> 0\. 9185432154389126
粗体:表示新术语、重要单词或屏幕上的词汇。例如,菜单或对话框中的词语通常以 粗体 显示。以下是一个例子:“此外,我们可以通过进入 RBAC | 策略管理 | 发现 | 设置 | 实时控制 来查看可以遵循的顺序安全控制,以增强我们的安全堆栈。”
提示或重要说明
如此显示。
联系我们
我们非常欢迎读者的反馈。
一般反馈:如果您对本书的任何部分有疑问,请通过电子邮件联系我们,地址是 customercare@packtpub.com,并在邮件主题中注明书名。
勘误:尽管我们已经尽力确保内容的准确性,但错误仍然会发生。如果您在本书中发现任何错误,我们将非常感激您能向我们报告。请访问 www.packtpub.com/support/errata 并填写表格。
盗版:如果您在互联网上发现我们作品的任何非法版本,我们将非常感激您提供其位置地址或网站名称。请通过版权@packt.com 联系我们,并附上该材料的链接。
如果您有兴趣成为作者:如果您在某个领域有专业知识,并有兴趣撰写或为书籍贡献内容,请访问authors.packtpub.com。
分享您的想法
阅读完负责任的 AI 平台和模型设计后,我们很想听听您的想法!请点击此处直接访问亚马逊评论页面并分享您的反馈。
您的评论对我们和技术社区都非常重要,并将帮助我们确保提供优质内容。
下载本书的免费 PDF 副本
感谢您购买本书!
您是否喜欢随时随地阅读,但又无法携带纸质书籍?您的电子书购买是否与您选择的设备不兼容?
不用担心,现在每本 Packt 书籍都提供无 DRM 的 PDF 版本,您可以免费获取。
在任何地方、任何设备上随时阅读。直接从您最喜欢的技术书籍中搜索、复制并粘贴代码到您的应用程序中。
福利不仅仅到此为止,您还可以获得独家折扣、新闻简报以及每天送到您收件箱的精彩免费内容。
按照以下简单步骤即可享受这些福利:
- 扫描二维码或访问以下链接
packt.link/free-ebook/9781803237077
-
提交您的购买证明
-
就是这样!我们将直接把您的免费 PDF 和其他福利发送到您的电子邮件。
第一部分:全球环境下的风险评估与机器学习框架
本部分详细介绍了生产中的机器学习模型所面临的风险、威胁和挑战。在本部分中,您将了解对手可以实施的各种攻击类型,以及保护模型免受此类攻击的重要性。本部分还涵盖了全球各大委员会设立的指南和标准,以促进国家和组织层面的各种行动和倡议。
本部分由以下章节组成:
-
第一章,机器学习模型的风险与攻击
-
第二章,风险规避方法论和框架的出现
-
第三章,可信 AI 的监管与政策
第一章:对机器学习模型的风险与攻击
本章详细概述了如何从组织计划开始进行 AI 数字化转型时,定义和评估机器学习(ML)风险框架。风险可能出现在不同阶段,例如在战略或财务规划启动时,或在执行的多个阶段中。随着技术实施的开始,风险开始浮现,并持续到测试阶段,当 AI 应用案例提供给客户时。风险量化可以通过不同的度量标准来实现,这些度量标准可以验证系统行为(鲁棒性和恢复力)对抗风险的能力。在理解风险评估技术的过程中,您还将深入了解机器学习模型的攻击和威胁。在此背景下,您将发现系统中存在安全或隐私瓶颈的不同组成部分,这些瓶颈会带来外部威胁,使模型暴露于漏洞之中。您将了解到当部署到生产环境中的模型没有足够的风险和威胁抗性时,所造成的财务损失和商业影响。
本章将通过以下部分涵盖这些主题:
-
发现风险要素
-
探索通过愿景、战略、规划和度量标准来降低风险的策略
-
评估由于攻击而可能造成的影响和损失
-
探索不同类型的攻击
此外,借助对抗鲁棒性工具箱(ART)和 AIJack,我们将看到如何为机器学习模型设计攻击。
技术要求
本章要求您安装 Python 3.8 以及一些必要的 Python 包,具体如下。安装 ART 和 AIJack 的命令也列在此处:
-
Keras 2.7.0,TensorFlow 2.7.0
-
pip
install adversarial-robustness-toolbox
-
pip
install git+https://github.com/Koukyosyumei/AIJack
发现风险要素
随着数字化转型和 AI 采纳的快速推进,越来越多的组织开始意识到恶意 AI 采纳实践的无意后果。这些后果不仅可能影响组织的声誉和长期商业成果,还可能影响到企业的客户以及整个社会。在这里,让我们看一下 AI 数字化转型过程中涉及的不同风险要素,CXOs、领导团队以及技术和运营团队应当关注这些要素。这些相关团队的目标是一致的:避免其系统受到攻击,或避免出现任何可能导致歧视、事故、政治系统操控或人命丧失的安全/隐私违规行为。
图 1.1 – 展示 AI 风险框架的图表
风险框架有三个主要要素:
-
规划与执行:这一阶段理想情况下涵盖了产品开发的所有阶段,即 AI 使用案例的构思、财务规划、执行,包括技术执行,以及从初始的最小可行产品(MVP)到最终产品/解决方案的设计与发布。
-
人员与流程:这是交付时间表中最关键的因素,涉及最小可行产品(MVP)或最终产品/解决方案。领导层应具有清晰的愿景和已制定的指导方针,以便研究、技术、质量保证及其他操作团队能够轻松地按照定义的协议和标准执行数据与 ML 过程。
-
验收:这一阶段涉及多轮审计和确认,以验证技术模型设计和部署的所有步骤。该过程遵循额外的确认性指南和相关法律,以谨慎地审查和解释 AI/ML 模型的结果,同时尊重用户的公平性和隐私,保护用户的机密信息。
让我们深入探讨这些元素的组成部分。
战略风险
在战略层面,应该在需要数字 AI 转型的业务用例上提前进行优势、劣势、机会与威胁(SWOT)分析。CXO 和领导团队必须在进行影响与努力分析后识别出合适的业务用例,并制定执行所需的指导方针和一系列协调一致的行动。缺乏这些可能导致不切实际的举措,这些举措与组织的商业目标不一致,导致财务损失和解决方案失败。图 1.2 展示了特定行业(例如零售)如何基于价值-努力框架对不同的用例进行分类。
图 1.2 – 价值-努力框架
如果指导方针和行动措施没有正确设定,AI 系统可能会对个人、社会和组织造成危害。以下是一些例子:
-
基于 AI 的自动驾驶车辆常常发生故障,这可能导致伤害或死亡。
-
过度依赖不充分的设备和缺乏监控意味着预测性维护任务可能导致工人受伤。
-
机器学习模型误诊医疗状况。
-
通过误导信息操纵国家制度过程(例如,选举或任命)引发的政治干扰。
-
数据泄露可能暴露机密的军事位置或技术机密。
-
智能系统造成的基础设施干扰或误用(例如,GPS 导航汽车通过不同街道经常增加住宅区的交通流量)。
财务风险
高管团队应当了解从项目启动到开发各个阶段,资助一个 AI 开发项目所涉及的财务情况。财务规划不仅应考虑招聘和留住顶尖人才的成本,还应考虑基础设施(云、容器、GPU 等)、数据治理和管理工具相关的成本。此外,财务路线图还应明确指定大数据和模型部署管理中所需的合规性,因为一旦发生任何违规,相关风险和处罚可能是巨大的。
技术风险
技术方面的风险可能在数据被摄入系统的时刻就开始显现。数据质量和表示格式的适用性可能严重违反相关法规(去风险化机器学习与人工智能:www.mckinsey.com/business-functions/risk-and-resilience/our-insights/derisking-machine-learning-and-artificial-intelligence
)。除了一个熟练的数据科学和大数据团队,所需的还包括能够检测并提醒数据或模型质量和漂移问题并采取及时补救措施的现代工具和实践。
图 1.3 – 显示风险管理控制的示意图
图 1.3 展示了不同的风险元素,这些元素可能导致安全漏洞或机密信息的盗窃。一个实时 AI 流水线的不同组件(数据聚合、预处理、模型开发、部署和模型服务)必须在投入生产之前,经过适当的设计、监控(包括 AI 漂移、偏差、重新训练人群特征变化、电路断路器和回退选项)和审计。
此外,风险评估还包括如何识别、分类和清单化 AI/ML 模型,并充分考虑其训练方式(例如,考虑数据类型、供应商/开源库/代码、第三方/供应商代码更新及维护实践以及在线重新训练)和如何提供给客户。
人员与流程风险
领导层和高管团队的首要目标是促进创新,鼓励一个开放的文化,使团队能够协作、创新并茁壮成长。当技术团队主动将自动化引入 MLOps 流水线时,许多问题可以提前预测,并通过知识共享会议及时采取措施填补差距。
信任与可解释性风险
当模型的结果无法解释时,企业仍然不愿采用 AI 驱动的应用。部分无法解释的结果可能是由于模型在特定客户群体或特定时期(例如,COVID-19 爆发期间)表现不佳。模型的透明度不足——无法解释结果——会让企业或客户感到害怕,特别是当他们发现缺乏激励对齐或对人们工作流或日常惯例造成严重干扰时。机器学习模型回答关于模型行为的问题,可以增强利益相关者的信心。除了部署能够给出正确预测且延迟最小的优化模型外,模型还应能够解释影响其决策的因素。然而,ML/AI 从业者需要运用判断和分析,选择合适的 ML 模型和可解释性工具,推导出影响模型行为的因素。现在,让我们通过一个例子,看看可解释性如何帮助研究医学图像。
深度神经网络(DNNs)可能在计算上难以解释,但对 DNNs 的可解释性正在进行大量研究。一个例子是可解释人工智能(XAI),它被应用于预训练的深度学习神经网络(AlexNet, SqueezeNet, ResNet50 和 VGG16),成功地通过比较分类率,使用相关数据解释受 Barrett 食管影响的关键区域。对比结果能够检测癌症的早期阶段,并区分 Barrett 食管(www.sciencedirect.com/science/article/pii/S0010482521003723
)和腺癌。然而,如何最佳地解释其模型的使用仍然由数据科学家决定,需根据问题的类型选择适当的数据和数据点数量。
合规性和监管风险
不同国家和监管机构已制定了不同的隐私法律和法规,若发生违规行为,将对组织进行处罚。一些最常见的隐私规则包括欧盟的通用数据保护条例(GDPR)和加利福尼亚消费者隐私法案(CCPA)。金融和医疗保健行业已经出台了防止偏见并允许公平对待的法律。遵守合规性要求需要通过审计和人工监控进行额外的风险管理规划。
除了各国特定的法规和指导方针外,监管机构可能还会依赖 SR 11-7/OCC 2011-12 中的现有指导,来评估 AI/ML 应用的风险。
道德风险
AI/ML 模型应该经过适当的验证和 A/B 测试,以验证它们在不同人群(包括不同性别和不同种族及伦理背景的人)中的合规性和公平性。例如,信用评分和保险模型在历史上对少数种族存在偏见,基于歧视的借贷决策已导致诉讼。
要使 AI/ML 模型合乎伦理、合法且无风险,对于任何组织和执行团队来说,评估 AI 解决方案和服务在市场上推出的影响是不可避免的。这包括在过程中加入高素质的 AI 伦理人员,他们具有监管监督,并确保遵守风险缓解的协议和控制,以确保整个 AI 解决方案既稳固又不易受攻击者青睐。
这些做法不仅可以增加额外的安全层以匿名化个人身份,还可以消除遗留系统中存在的任何偏见。现在让我们看看哪些企业级倡议对 AI 开发过程的包含是必不可少的。
探索具有愿景、战略、规划和度量的风险缓解策略
在看到 AI 转型旅程不同阶段的风险元素后,现在让我们深入了解不同的企业风险缓解计划、措施和度量。在后续章节中,我们不仅会发现与 ML 模型设计、开发和部署相关的风险,还将了解执行领导团队制定的政策对于设计符合特定国家法规的系统的重要性。及时的审查、意识和对风险识别过程的支持可以使组织免受意外的财务损失。
定义结构化的风险识别过程
只有当业务领导、IT、安全和风险管理团队能够对公司现有风险进行评估,并确定这些风险是否会影响即将到来的人工智能驱动的分析解决方案时,长期使命和短期目标才能实现。这种努力由欧洲最大银行之一的 COO 领导,有助于识别存在偏见的产品推荐。如果不加以检查,可能会导致财务损失、法规罚款和声誉受损,从而影响组织的声誉,导致客户流失和反弹。
这种努力可能因行业而异。例如,食品和饮料行业需要集中关注与受污染产品相关的风险,而医疗保健行业则需要特别注意避免误诊患者并保护其敏感健康数据。
企业范围的控制
有效的控制和技术结构围绕着强有力的政策、员工培训、应急计划的实施,以及可以付诸实践的商业规则和目标的重新定义。这些政策转化为明确的标准和指南,要求在必要时进行人工干预。例如,欧洲银行在处理客户的财务或身体健康受到影响的特定情况时,必须采用灵活性:www.mckinsey.com/business-functions/mckinsey-analytics/our-insights/confronting-the-risks-of-artificial-intelligence
。在这种情况下,关系经理必须介入,提供适当的建议,帮助客户应对家庭成员去世或失去亲人的情况。同样,医疗行业需要医生和健康专家的介入,采用不同的主动学习策略来了解罕见病及其症状。控制措施需要应用不同的开源或定制工具,以减轻基于 SaaS 平台和服务的风险,保护群体免受潜在歧视,并确保符合 GDPR。
微风险管理与控制加强
实施的工具和技术会根据 ML 生命周期的不同阶段而有所不同。攻击和威胁通常非常具体,针对输入数据、特征工程、模型训练、部署以及模型如何向客户提供服务。因此,设计和评估任何 ML 模型时,必须参考威胁矩阵(关于威胁矩阵的更多细节将在第二章中讨论)。必须考虑的最重要因素包括模型的目标、优化函数、学习模式(集中式与联邦式)、人机(或机器与机器)交互、环境因素(用于设计强化学习中的政策和奖励)、反馈、再训练和部署。这些因素,加上模型设计及其可解释性,将推动组织选择更加透明和可解释的 ML 模型,并剔除过于复杂、晦涩难懂且无法解释的 ML 模型。威胁矩阵可以通过评估模型性能来保护已部署的 ML 模型,同时测试模型是否受到对抗性攻击以及其他导致模型漂移的外部因素。
你需要根据威胁矩阵的结果,应用不同的风险控制措施和风险缓解策略,并加以强化。在 AI 转型过程的整个旅程中,这不仅能缓解风险、减少潜在成本,还能使系统具有鲁棒性和透明度,以应对每一个可能的风险。通过这些原则的落实,组织不仅能够防止道德、商业、声誉和监管问题,还能以公正、平等和无偏的方式为客户和社会服务。
图 1.4 – 展示当前风险管理设置中增强和缓解措施的示意图
当前 AI/ML 风险框架中需要一些新的与伦理相关的元素,这些元素可以帮助确定风险表现并缓解风险:
-
可解释性
-
道德 AI 验证工具
-
模型隐私
-
模型压缩
-
偏差
-
特征工程
-
可持续模型训练
-
隐私相关的前后处理技术
-
公平约束
-
超参数
-
模型存储与版本控制
-
Epsilon
-
总损失和公平损失
-
云/数据中心可持续性
-
特征存储
-
攻击与威胁
-
漂移
-
动态模型校准
-
管道设计和架构回顾
-
模型风险评分
-
数据/模型血统
我们将在后续章节中研究这些组件的每一部分,但在这里先介绍这些概念,并理解为什么每个组件都是负责任/道德模型设计的重要单元,以及它们如何融入更大的机器学习生态系统。
为了进一步说明,让我们首先考虑 AI 伦理的主要风险领域(监管和模型可解释性风险),通过分解图 1.4来进一步理解图 1.5。下图展示了风险评估方法和技术,用以解释模型结果。
图 1.5 – 通过监管评估和模型可解释性进行风险评估
我们发现,全局和局部替代模型在可解释性中都发挥着重要作用。全局替代模型经过训练,用以近似黑箱模型的预测,而局部替代模型则能够通过改变替代模型输入的分布来解释个体记录的局部预测。这是通过使用特定实例的数据对数据进行局部加权的过程(对与当前实例相似的实例赋予更高的权重)来实现的。
道德 AI 验证工具
这些工具,无论是开源的、通过公共 API 访问的,还是由不同的云服务提供商(如 Google Cloud、Azure 或 AWS)提供的,都提供了通过不同的区分人群部分来验证传入数据的方式。此外,这些工具还帮助发现受保护的数据字段和数据质量问题。一旦通过这些工具对数据进行了配置文件处理,就可以构建通知服务和仪表盘,以检测来自各个数据源的传入数据流中的数据问题。
模型可解释性
机器学习模型,尤其是神经网络,常被称为黑箱,因为结果无法直接与模型架构关联并加以解释。企业常常在生产环境中部署机器学习模型,这些模型不仅可以推荐或预测客户需求,还能用事实(单一特征或多个特征的交互)来支持模型的决策。尽管机器学习模型具有黑箱特性,但有许多开源的可解释性工具可以显著解释模型结果,例如,为什么贷款申请被拒绝,或者为什么某一年龄段和人群的个体容易患某种疾病:
-
线性系数有助于解释单调模型(线性回归模型),并证明所选特征与输出结果之间的依赖关系。
-
非线性和单调模型(例如,具有单调约束的梯度提升模型)通过评估与因变量的正负关系,帮助从众多特征中选择正确的特征集进行预测。
非线性和非单调(例如,无约束的深度学习模型)方法,如局部可解释模型无关解释或 Shapley(一个可解释性 Python 库),作为帮助模型进行局部可解释性的重要工具。神经网络在解释机器学习模型时有两大类主要方法:
-
显著性方法/显著性 图 (SMs)
-
特征 归因 (FA)
显著性图仅在传递与指定输入上激活的权重或被卷积神经网络(CNN)选择的图像不同部分相关的信息时才有效。尽管显著性图无法传达特征重要性相关的信息,FA 方法旨在对数据子集拟合结构模型,以评估每个变量对输出变量的程度/影响/作用。
判别性 DNN 能够提供模型可解释性,并通过考虑模型的输入梯度来解释最重要的特征,输入梯度指的是输出 logits 相对于输入的梯度。一些基于 SM 的可解释性技术(如梯度法、SmoothGrad 和 GradCAM)是仍在研究中的有效可解释性方法。例如,梯度法可以通过反向传播网络来检测图像中最重要的像素。通过计算类别相对于输入图像的导数得到的分数,有助于进一步进行特征归因。我们甚至可以使用诸如 XAI SM 等工具来处理图像或视频应用。这些工具可以向我们展示网络决策如何受到图像或视频中最重要部分的影响。
模型隐私
随着像 GDPR、CCPA 这样的法律,以及不同立法机构出台的政策,ML 模型已经吸收了隐私设计的原则,通过采用隐私保护技术来赢得用户信任。上述标准和 ML 模型重新设计的目标,主要是通过构建具备以下特点的 AI 解决方案和系统,防止信息从系统中泄露:
-
积极预防而非反应性修正
-
内置隐私作为默认设置
-
设计中嵌入隐私
-
完全功能化——没有对功能的妥协
-
ML 模型生命周期的安全性、隐私性和端到端保护
-
可见性与透明度
-
以用户为中心,尊重用户隐私
为了在模型层面上涵盖隐私,研究人员和数据科学家使用一些主要的单元或基本构建模块,这些模块应当具备足够的安全措施,以防止敏感和私人信息的泄露。以下是这些构建单元:
-
模型训练数据隐私:ML 训练数据摄取单元的数据管道应具有足够的安全措施。任何试图攻击系统的对手都不应能逆向工程训练数据。
-
模型输入隐私:安全和隐私措施应确保任何用于模型训练的输入数据都不能被任何人看到,包括创建模型的数据科学家。
-
模型输出隐私:安全和隐私措施应确保模型输出仅对预测数据的接收用户可见,其他任何人不可见。
-
模型存储与访问隐私:模型必须安全存储,并定义访问权限,只允许符合条件的数据科学专业人员访问。
图 1.6 展示了模型训练和改进的不同阶段,在这些阶段中,必须确保模型隐私,以保护训练数据、模型输入、模型权重和最终产物,即 ML 模型输出。
图 1.6 – 展示 ML 模型中隐私的图示
模型压缩
人工智能伦理、标准和指南推动了研究人员和数据科学专业人士寻求在低功耗和资源受限的设备上运行和部署这些机器学习模型的方法,而不牺牲模型准确性。在这里,模型压缩是至关重要的,因为压缩模型在功能相同的情况下最适合内存有限的设备。从人工智能伦理的角度来看,我们必须利用机器学习技术造福人类。因此,在极端环境中训练和部署强健的压缩模型是必不可少的,这样它们可以最小化人工干预,同时通过优化修剪神经元数量来记忆相关信息。
例如,一种技术是通过噪声诱导扰动来构建强大的压缩模型。这种噪声通常来源于物联网设备,这些设备接收来自环境的传入数据,其中包含大量扰动。研究结果表明,考虑到现实世界噪声数据的流形对抗训练(on-manifold adversarial training)能够产生比外部攻击者噪声引入的流形外对抗训练(off-manifold adversarial training)更高压缩率和更高准确度的模型。图 1.7 说明了流形对抗样本比模拟样本更接近决策边界。
图 1.7 – 模拟样本和流形对抗样本的示意图
可持续模型训练
低功耗设备依赖可再生能源资源进行自我能量生成,并在联邦学习生态系统中进行本地模型训练。设备可以通过不同的策略参与模型训练过程并向中央服务器发送更新。设备间歇性地参与训练过程的主要目的是高效地利用可用能源,以可持续的方式运行,以便设备不会耗尽电力并保持在系统中,直到全局模型收敛。可持续模型训练为最大化功率利用提供了指导方针和有效策略,以造福环境。
偏见
机器学习(ML)模型会受到来自数据和模型的不同偏见。常见的数据偏见源自结构性偏见(例如,依据社会观念错误标注性别,女性被标注为护士、教师和厨师),数据收集和数据操控;而常见的模型偏见则来源于数据采样、测量、算法偏见以及对群体、细分市场、人口统计、行业或类别的偏见。
随机森林(RF)算法基于在两阶段过程中对样本进行袋装(bagging)和特征选择的随机化原理。随机化过程能够解决由无信息特征选择所引起的模型偏差,特别是在高维数据中,包含多值特征时。RF 模型通过偏向多值数据集,其中许多特征是分类变量,提升了洗钱预测中的风险水平。然而,研究发现,当分类值数量减少时,同一模型能够产生更好的、无偏的结果。基于 RF 的更先进模型,称为xRF,能够利用统计评估(如p 值)来选择更相关的特征。p 值评估技术有助于根据特征的重要性分配适当的权重,并通过生成更精确的树结构帮助选择无偏的特征。这是一个用于降维的特征加权抽样技术示例。
特征工程
与传统的机器学习模型相比,黑箱模型(如神经网络)变得越来越难以理解。例如,CNN需要正确的知识和滤波器的应用,以去除不必要的属性。由高维数据构建的模型需要结合适当的降维技术,以选择最相关的特征。此外,基于自然语言处理(NLP)的机器学习模型在模型设计的初步步骤中需要进行预处理。现在有许多商业和开源库可以帮助创建新的复杂特征,但它们也可能导致过拟合的机器学习模型。研究发现,过拟合的模型直接威胁到隐私,可能会泄露私人信息(machinelearningmastery.com/data-leakage-machine-learning/)
)。因此,模型风险缓解机制必须采用单独的特征评估,以确认所包含特征对业务逻辑的影响(数学变换和决策标准)。特征创建的作用在银行的具体信用建模用例中得到了最好的理解,其中机器学习模型可以基于债务与收入比率的工程化特征预测违约者。
隐私相关的预处理/后处理技术
数据匿名化需要以某种形式添加噪声(如高斯分布/拉普拉斯分布),这种噪声可以在模型训练过程之前(K-匿名性、差分隐私 (DP))或模型收敛后(附加式 DP)启动。
公平性约束
机器学习模型可以通过不同的约束条件来训练,从而获得理想的结果。约束条件为机器学习模型定义了不同的边界条件,在训练时,目标函数将为少数群体或具有歧视性的种族群体产生公正、公平的预测。这些约束条件需要根据训练类型设计和引入,即监督学习、半监督学习、无监督学习、排名、推荐或基于强化学习的训练。应用约束条件最多的数据集通常包含一个或多个敏感属性。除了约束条件,模型验证者应负责确保使用随机化或网格搜索算法选择合适的参数。
模型存储和版本控制
伦理 AI 系统的一个重要组成部分是赋予生产系统能够再现数据和模型结果的能力,如果缺乏这一能力,诊断故障并采取立即的补救措施将变得异常困难。版本控制和存储先前的模型版本不仅允许你快速恢复到先前的版本,或激活模型可复现性以应对特定输入,而且还能减少调试时间和重复劳动。不同的工具和最佳实践机制通过抽象计算图并在每个机器学习引擎步骤中归档数据来帮助模型的可复现性。
Epsilon (ε)
这是一个在差分隐私(DP)解决方案中使用的指标,负责提供应用层隐私保护。该指标用于衡量在对两个不同的数据集发出相同查询时产生的隐私损失,这两个数据集仅在一个记录上有所不同,且差异是通过从其中一个数据库中添加或删除一个条目来创建的。我们将在第二章中进一步讨论差分隐私。这个指标揭示了当其计算在前述数据集的私人敏感信息上时,所带来的隐私风险。它也被称为隐私预算,并根据输入数据的大小以及添加到训练数据中的噪声量来计算。值越小,隐私保护越好。
云/数据中心可持续性
随着对气候变化和可持续性问题的关注不断增加,主要的云服务提供商(Google、Amazon 和 Microsoft)已经开始采取能源效率措施,以促进更绿色的基于云的产品。碳足迹报告的推出使用户能够衡量、跟踪和报告与云相关的碳排放。为了鼓励企业对环境的影响最小化,所有的机器学习部署应将可持续性视为一个需要衡量和管理的风险或合规问题。这推动了数据科学和云团队考虑在可持续数据中心中部署机器学习管道和特征存储。
特征存储
特征存储允许特征重用,从而节省额外的存储和云端成本。由于数据重用和存储必须符合合规性和法规要求,它是道德 AI 中的一个重要考虑参数。特征存储允许通过特征工程创建重要特征,并促进团队成员之间的合作,分享、发现和使用现有特征而无需进行额外的重复工作。特征重用还促使基于特征重要性和其他团队定义的模型可解释性重用重要属性。由于深度学习模型需要巨大的计算能力和能量,正确选择算法,并结合重用模型数据和特征,能够通过减少计算能力来降低云端成本。
攻击和威胁
为生产级企业 AI 解决方案设计的风险框架应与攻击测试框架(第三方和开源)集成,以评估模型面临外部攻击者的风险。然后,可以利用 ML 模型对攻击的易受攻击性增加监控活动,在发生攻击时主动应对。
漂移
系统中已实现的数据和模型监控技术必须能够在目标变量或预测因子的统计特性发生变化时,迅速识别数据漂移和模型漂移(机器学习中的概念漂移与模型衰退,Ashok Chilakapati 著:xplordat.com/2019/04/25/concept-drift-and-model-decay-in-machine-learning/
)。主动措施包括检查数据格式、模式和单位,并在漂移百分比超过指定阈值时重新训练模型。
以下描述与图 1.8中的数字标签相对应:
-
原始数据和模型决策边界(t1 时刻)。
-
仅在数据边界发生漂移(t2 时刻),这是由于输入数据特征的变化。例如,考虑一个实际场景,其中物联网传感器读取值的异常范围是-10 到 10。现在,新读取值可能会变为-5 到 8,但由于决策结果或模型输出没有变化,这个读取值仍然被视为异常。由于这不会导致模型边界的漂移,它仅为虚拟漂移。
-
数据和模型边界在 t3 时刻同时发生漂移,导致实际的概念漂移。例如,当两个传感器读取值发生变化(从旧的-10 到 10 的读取值变化为新的+20 到+100 的读取值),并且结果模型输出为+1,表示它不再是异常值时,就会出现这种场景。这表明模型边界发生了变化,输出只是输入数据边界变化的反映。
图 1.8 – 不同类型的模型漂移
动态模型校准
动态模型校准是模型漂移的一个更专业的版本。模型漂移可能由于数据变化、度量单位、以及内部和外部因素的变化所引起,这些变化需要经过一定时间的仔细研究、审查和讨论,然后才会触发模型更新。
另一方面,当模型的性能水平仅因输入数据的短期变化(例如,由于大型社交聚会或足球比赛而导致移动网络容量变慢)而发生变化时,模型校准可以更为简便。
机器学习模型(例如,强化学习算法或贝叶斯模型)具有动态刷新模型参数的特点,以捕捉输入数据中的新趋势和模式。这使得模型审查和更新的手动过程得以去除。如果没有足够的控制或算法来控制模型更新的阈值水平,短期模式可能会被过度强调,从而可能随着时间的推移降低模型的性能。因此,克服这些风险需要专家仔细审查何时允许动态再校准,以便反映即将出现的趋势。此外,企业(尤其是在银行的算法交易或医疗领域疫情传播)需要确信动态再校准在长期内优于静态模型。
图 1.9 展示了一个使用案例,当输入到模型的位置信息数据呈现振荡模式时,导致预测结果随时间发生变化,进而导致模型漂移。此类情况需要模型替换/校准,并指定或配置漂移百分比的阈值。
图 1.9 – 展示在输出模型预测漂移下的模型校准示意图
审查管道设计和架构
在我们审查模型漂移并允许模型的动态校准时,为了符合道德标准,我们还应定期审查系统设计和架构、管道以及特征存储,并在需要时允许进行修改。审查中最重要的部分之一是重新评估和重新考虑整个安全系统,应用新的补丁或额外的认证层或黑名单服务,以主动应对 DDOS 攻击。在后续的生产版本中,可以进行多种优化,帮助降低云成本,优化数据库操作,并提升 API 和微服务的性能。审查过程让你能够寻求专家意见(来自云计算和 DevOps 专业人士),他们可以为设计更自动化的工作流程提供见解,并帮助迁移到按需服务(例如 lambda 服务),以减少处理成本。审查系统负载、性能和扩展因素,还能帮助更好地选择数据库、缓存和消息传递选项,或者仔细分析和重新定义自动扩展选项。
模型风险评分
由于我们已经使用了道德 AI 验证工具来对输入数据进行概况分析和验证,我们还需要风险评估工具来评估并量化模型风险,特别是在面对对抗性攻击和威胁时。现在有不同的开源工具和 API 可供使用,甚至不同云服务提供商(如 Google Cloud、Azure 和 AWS)也提供了训练和测试模型的方式,以应对模型对不同攻击的脆弱性和模型偏见,这些方法通过量化模型对不同人群群体表现的不公平结果来进行评估。此外,这些工具还帮助解释对模型结果有重大影响的特征。在接下来的章节中,我们将讨论更多这样的工具和框架。模型风险评分策略需要有助于预测的风险因素或指标、数据完整性、方法偏好和资源能力。
风险评分方法有两种不同的功能方式:
-
前瞻性风险方法通过分析历史模型表现来预测模型风险。
-
回顾性/同时性风险利用模型的最新风险预测未来周期的整体模型风险。
第二种方法更适合用于模型风险指标、数据(模型行为)或近期攻击或数据丢失发生重大变化且正在调查模型的情况。
图 1**.10展示了风险敏感的模型风险管理如何考虑监控工具、活动和治理措施来评估模型风险。该图扩展自Keenan 的模型风险度量组件,Keenan(2015),该组件还展示了过去的攻击、威胁和漏洞对企业中类似模型的影响,并指出了当前模型相关风险的增加。
图 1.10 – 显示模型风险评估的图示
数据/模型谱系
伦理和合规流程要求对数据和模型进行频繁的审计和质量检查。必须存储两者的谱系,以便在任何时刻都能清楚地知道模型是如何由于数据的变化(如添加、修改或删除某些特征)从版本 1 演变到版本 2 再到版本 3 的。同时,应该定义存储位置,用于存储关于模型及其工件的即时历史数据,而较旧的工件可以存储在云的低频存储中心(访问要求较少)。
以下图示展示了模型的输入训练、验证、测试数据、模型服务以及基于访问频率存储在 AWS 不同存储类别中的输出文件。在这里,我们展示了在设计一个符合伦理和完全合规的系统时,必不可少的不同处理模块和单元的角色。通过遵循前述的验证政策和实践,能够更容易地应对机器学习模型风险,探索现有的瓶颈,并在模型生命周期的每个阶段重新定义新的政策和实践。
图 1.11 – 显示模型及其工件存储的图示
任何执行团队都需要意识到云基础设施、系统和安全设计原则、机器学习模型设计、模型评分和风险评估机制的重要性,并设定指导方针,以便企业能够降低风险,避免处罚,并获得使用机器学习推动销售和收入的信心。
图 1.12 – 显示数据和模型谱系的图示
图 1.12 展示了数据和模型谱系在模型生命周期开发阶段如何完成,涵盖从数据集成和预处理到模型训练、集成、模型服务以及再训练过程。我们可以看到,数据分别在 t1 和 t2 时从两个不同的数据源 A 和 B 到达,并在 t3 时被组装或聚合,作为数据预处理和特征工程的输入,分别在 t4 和 t5 时进行。这里有两个模型输出:
-
在 tn+3 时可用的模型 v1,对应模型训练(tn),演示了在不同时间点(tn+1)训练的不同机器学习模型的组合
-
在 tn+x+3 时可用的模型 v2,对应模型再训练(tn+x),重新集成(tn+x+1)
数据和模型的血统应该能够捕捉到系统中任何变化,并具备适当的版本控制,这有助于后续的模型可重复性。在分析完伦理和风险的关键组成部分后,接下来我们来看看如果组织未能遵守监管机构设定的法律和指南,可能面临的处罚。
评估攻击可能带来的影响和损失
在前一部分中,我们探讨了在构建机器学习系统时需要考虑的数据威胁、风险和重要指标。现在,让我们来了解一下因数据泄露而导致的财务损失。
AOL 数据泄露
2006 年,AOL 因泄露用户记录而面临诉讼,导致他们必须向每个数据泄露的用户支付至少 5000 美元,因为这些记录可以通过公共搜索 API 访问(回顾黑客事件:臭名昭著的 AOL 数据泄露: www.proofpoint.com/us/blog/insider-threat-management/throw-back-hack-infamous-aol-data-leak
)。该事件发生在搜索部门错误地发布了一个压缩的文本文件,里面包含了 650,000 名用户的 2000 万条关键词搜索记录。由于搜索查询中包含了用户的个人身份信息(PII),很容易识别并关联到持有账户的个人。此外,最近,AOL 的一名员工 Jason Smathers 被发现将包含 9200 万 AOL 客户账户名称的列表卖给了拉斯维加斯的 Sean Dunaway。
雅虎数据泄露
雅虎遭遇了一系列数据泄露事件(例如通过电子邮件泄露个人信息),这些事件发生在 2012 到 2016 年之间,涉及 3 亿条记录的泄露(本周事件:雅虎四年内发生多起数据泄露事件,最终达成 1.175 亿美元和解: www.cshub.com/attacks/articles/incident-of-the-week-multiple-yahoo-data-breaches-across-4-years-result-in-a-1175-million-settlement
)。
2014 年的攻击针对的是一个不同的用户数据库,影响了 5 亿人,并且泄露了更详细的个人信息,如姓名、电子邮件地址、密码、电话号码和生日。雅虎因此支付了 5000 万美元的罚款,其中 3500 万美元提前支付,作为赔偿的一部分(雅虎因数据泄露被罚款 5000 万美元: www.pymnts.com/legal/2018/yahoo-fine-personal-data-breach/
)。
万豪酒店连锁数据泄露
万豪酒店集团因 2014 至 2018 年间一系列网络攻击导致英国 700 万名客人的个人信息(姓名、联系方式、旅行信息、VIP 状态)泄露,被罚款 1840 万英镑。由于未能保护个人数据且未遵守 GDPR 规定,英国数据隐私监管机构对其处以重罚 (万豪酒店因数据泄露被罚 1840 万英镑,影响数百万用户:www.bbc.com/news/technology-54748843
)。
优步数据泄露
优步因 2014 年数据泄露事件在纽约达成和解,被罚款 2 万美元 (优步因数据泄露和‘上帝视角’调查被罚 2 万美元:www.cnet.com/tech/services-and-software/uber-fined-20k-in-surveillance-data-breach-probe/
)。该泄露事件发生在 2014 年,泄露了 5 万名司机的位置信息,且通过乘客追踪系统进行了暴露。
谷歌数据泄露
2020 年,法国数据保护局因谷歌未能确认并共享其在不同应用程序(如谷歌地图、YouTube、搜索引擎和个性化广告)中如何处理用户数据,违反 GDPR 规定,对谷歌处以 5700 万美元罚款。在另一宗数据泄露事件中,谷歌泄露了 50 万名前 Google+用户的私人数据。谷歌因此需要支付 750 万美元赔偿,并向 2015 年至 2019 年间拥有 Google+账户的用户提供 5 至 12 美元的赔偿金。
亚马逊数据泄露
亚马逊在 2021 年经历了多个数据泄露事件 (2021 年最严重的 AWS 数据泄露:securityboulevard.com/2021/12/worst-aws-data-breaches-of-2021/
)。其中一起事件导致欧洲隐私监管机构对其罚款 7.46 亿欧元(8.87 亿美元)(亚马逊因违反 GDPR 被欧洲隐私监管机构罚款 8.87 亿美元:www.cnbc.com/2021/07/30/amazon-hit-with-fine-by-eu-privacy-watchdog-.html
)。在另一事件中,AWS 的 S3 存储桶配置错误导致网络中断长时间。除了个人身份信息(PII),如姓名、电子邮件地址、国民身份证号码和电话号码,还可能包括信用卡详细信息,包括 CVV 代码。
Facebook 数据泄露
2018 年,Facebook 遭遇了 50 亿美元的巨额罚款,并且需要调查和解决不同的隐私和安全漏洞(Facebook 支付创纪录的 50 亿美元美国隐私罚款;面临反垄断调查:www.reuters.com/article/us-facebook-ftc/facebook-to-pay-record-5-billion-u-s-fine-over-privacy-faces-antitrust-probe-idUSKCN1UJ1L9
)。这一泄露事件是由于剑桥分析公司不当使用泄露的个人身份信息(PII),剑桥分析公司从 Facebook 上收集了 5000 万个用户档案信息。Facebook 泄露了 8700 万人的 PII,而这些信息被剑桥分析公司滥用,用于 2016 年选举期间的广告定向。
我们可以注意到,数据泄露事件很常见,而且至今仍在发生。搜索服务、零售、旅游或酒店业以及交通系统等一些最大的服务提供商都曾是威胁和处罚的受害者,个人身份信息(PII)在这些事件中被盗取。2019 到 2021 年间,已知发生了一些其他数据泄露事件,涉及组织包括大众汽车(其安全漏洞影响了超过 300 万客户)和 T-Mobile(超过 5000 万客户的私人信息,包括社会保障号码、IMEI 和 IMSI 号码被泄露)。攻击者还利用 iPad 和 iPhone 攻击窃取了超过 1200 万设备的唯一 Apple 设备标识符(UDID)和设备名称。该事件发生时,一名 FBI 探员的笔记本电脑被黑客攻击,窃取了 1200 万个 Apple ID。
发现不同类型的攻击
在了解了组织遭受的财务损失之后,了解每种攻击类型的目标以及如何实施这些攻击变得至关重要。此外,随着在线行业的增长、廉价数据服务的普及以及物联网和移动设备的使用,攻击者有了大量的用户生成内容可以滥用。先进的攻击研究技术推动攻击者使用更复杂的机制来针对大规模系统及其防御措施。无论机器学习模型是用于本地(白盒)还是部署在云端(如 Google、Amazon 或 Azure)并通过预测查询进行服务,都存在不同类型的攻击。Amazon 和 Google 提供黑盒式的机器学习模型训练服务。Google(Vertex AI)(cloud.google.com/vertex-ai/docs/explainable-ai/overview
) 和 AWS 都在其手册中提供了部分特征提取技术的文档。随着部署模型中隐私泄露范围的扩大,攻击者更容易进行攻击并窃取训练数据和机器学习模型。攻击者的动机是窃取机器学习模型,以避免预测查询费用。图 1.13 展示了训练和测试中的不同攻击类别。我们还提到了防御技术,这些将在第二章《风险规避方法论和框架的出现》中进一步讨论。
图 1.13 – 显示不同攻击类别和防御措施的示意图
现在,让我们讨论攻击者如何以及以什么目标来攻击机器学习模型。
要运行不同的攻击,我们需要导入必要的 Python 库:
from art.estimators.classification import KerasClassifier
from art.attacks.inference.model_inversion.mi_face import MIFace
from art.estimators.classification import KerasClassifier
from art.attacks import evasion, extraction, inference, poisoning
from art.attacks import Attack, EvasionAttack, PoisoningAttack, PosioningAttackBlackBox,
PoisoningAttackWhiteBox
from art.attacks import Attack, PoisoningAttackTransformer, ExtractionAttack, InferenceAttack, AttributeInferenceAttack, ReconstructionAttack
from art.attacks.evasion import HopSkipJump
from art.utils import to_categorical
from art.utils import load_dataset
这可真是很多依赖库!所有所需的工具都已准备好,我们现在可以继续进行投毒、规避、提取或推理攻击。我们使用 ART 创建了一个零阶 优化(ZOO) 攻击,这是一种利用 XGBoostClassifier 进行的规避攻击。
数据钓鱼隐私攻击
这是攻击者常用的一种技术,通过反向工程来获取训练数据集中的机密信息,前提是模型存在足够的数据泄漏。
当模型出现过拟合,无法将预测结果泛化到新数据,或者模型仅用少量训练数据进行训练时,就可能发生这种情况。诸如差分隐私(DP)、随机数据隔离以及在输入、模型和输出层进行三层加密等机制可以增强保护措施。
投毒攻击
这是一种针对模型完整性的攻击方式,攻击者可以通过直接影响训练或其标签,在部署过程中影响模型在训练/重训练过程中的表现。术语“poison”(毒害)来源于攻击者通过在模型操作期间注入恶意样本来毒害数据的能力。毒害攻击可以分为两种类型:
-
通过获得模型访问权限进行白盒模型偏移。训练数据被修改,以至于分类器将好的数据与坏的数据之间的边界向攻击者的有利方向移动。
-
黑盒反馈武器化攻击通过生成恶意或负面反馈,操控系统将好的内容错误分类为恶意内容。这在推荐系统中更为常见,攻击者可以通过在社交媒体上密切关注用户,来推广产品、内容等。
由于此类攻击的持续时间取决于模型的训练周期,防止毒害攻击的主要方式是在下一个训练周期发生之前,通过添加输入和系统验证检查、速率限制、回归测试、人工审核及其他统计技术来检测恶意输入,同时加强强有力的访问控制。
绕过攻击
绕过攻击在机器学习研究中非常流行,因为它们通常用于部署或推理阶段的入侵和恶意软件案例。攻击者通过改变数据,目的是欺骗现有的训练分类器。攻击者伪装恶意软件、网络入侵检测器或垃圾邮件的数据显示为合法数据,因为这些伪装不影响训练数据。此类非随机、难以察觉的人为扰动,当加到原始数据上时,导致学习模型产生错误的输出,即使不改变模型的决策边界。
针对生物识别验证系统的欺骗攻击属于绕过攻击范畴。设计针对对抗性绕过攻击的入侵检测器的最佳方式是利用集成学习,它可以结合多层检测器并监控应用程序的行为。绕过攻击在部署深度神经网络(DNN)到安全性和重要性应用(如自动驾驶汽车)时也带来了挑战。基于区域的分类技术(依赖于样本数据点标签之间的多数投票技术)被发现对对抗性样本更为鲁棒。下图展示了对集中式和联邦学习系统的毒害数据和绕过攻击。
图 1.14 – 显示一个简单的联邦毒害与绕过攻击的示意图
以下代码片段提供了一个对 XGBoostClassifier 发起规避攻击的示例。代码概述了触发黑箱 ZOO 攻击的过程,使用分类器(此处分类器设置为 XGBoost)来预测目标深度神经网络(DNN)的梯度。此预测有助于生成对抗数据,其中置信度(浮动)表示生成的样本与输入之间的距离,较高的置信度意味着样本与输入的距离较大。底层算法使用随机坐标下降法、维度降维、分层攻击,以及重要性采样技术,同时具备触发目标攻击或非目标攻击的可配置性,这由以下代码中的目标布尔参数设置。虽然非目标攻击只能导致误分类,但目标攻击可以迫使某个类别被分类为期望的类别。
攻击算法的学习率由 learning_rate
(浮动)控制。其他需要考虑的重要参数包括 binary_search_steps
(整数),它表示调整常量时二分搜索的次数,以及 initial_const
(浮动),它可用于调整距离和置信度值的重要性,以实现初始折衷常量 c
:
-
创建 XGBoost 的 ART 分类器:
art_classifier = XGBoostClassifier(model=model, nb_features=x_train.shape[1], nb_classes=10)
-
创建 ART ZOO 攻击:
zoo = ZooAttack(classifier=art_classifier, confidence=0.0, targeted=False, learning_rate=1e-1, max_iter=20, binary_search_steps=10, initial_const=1e-3, abort_early=True, use_resize=False, use_importance=False, nb_parallel=1, batch_size=1, variable_h=0.2)
-
使用 ART ZOO 攻击生成对抗样本:
x_train_adv = zoo.generate(x_train)
这个代码示例演示了一个机制,使用毒化攻击生成对抗样本,并可视化用清洁模型与毒化模型分类数据点的效果:
attack_point, poisoned = get_adversarial_examples(train_data, train_labels, 0, test_data, test_labels, kernel)
clean = SVC(kernel=kernel)
art_clean = SklearnClassifier(clean, clip_values=(0, 10))
art_clean.fit(x=train_data, y=train_labels)
plot_results(art_clean._model, train_data, train_labels, [], "SVM Before Attack")
plot_results(poisoned._model, train_data, train_labels, [attack_point], "SVM After Poison")
如下图所示,在一个完美的分类器中,所有点理想情况下应该分别位于黄色或蓝色圆圈内,且应对齐在分类器边界的绿色或浅蓝色一侧。
图 1.15 – 触发毒化攻击的代码示例
这里,红色十字是攻击点,足够强大以干扰模型的泛化能力。
模型窃取/提取
在模型提取攻击中,攻击者负责探测一个黑箱机器学习系统(没有模型内部知识),以重建模型或提取训练数据(在模型提取中,别只问“怎么做?”:问“为什么?”,作者:Matthew Jagielski 和 Nicolas Papernot:www.cleverhans.io/2020/05/21/model-extraction.html
)。当训练数据或模型本身是敏感且机密的时,这种攻击需要特别注意,因为攻击者可能通过执行跨用户模型提取攻击,完全避免服务提供商的费用。
攻击者还希望使用模型信息和数据为个人利益服务(例如,窃取的信息可以被攻击者用来定制和优化股票市场预测和垃圾邮件过滤模型以供个人使用)。当模型通过 API 提供时,这种攻击是可能的,通常通过机器学习即服务(MLaaS)平台。API 可以在边缘设备或移动电话上提供模型服务。不仅防御系统的模型信息受到损害,而且提供者还会因免费的训练和预测而面临数据丢失或收入损失。
攻击者向受害者模型发起重复查询,以获取其标记样本。这增加了发出请求的次数,因为攻击者试图完全标记其样本数据。因此,控制模型提取攻击的一种方式是提高受害者模型的查询效率。图 1.16展示了一个模型提取攻击的示例,在该示例中,攻击者可以根据其对准确性和保密性(隐私)的偏好,选择棕色或黄色的决策边界来窃取模型。
提取攻击违反了机器学习模型的保密性,并且可以通过三种方式实现:
-
基于方程的模型提取攻击通过随机查询可以针对具有置信度值的机器学习模型。
-
路径查找算法(例如决策树)利用置信度边界作为准标识符进行路径发现。
-
针对只有类别标签作为输出的模型的提取攻击较慢,并作为对具有置信度值的模型的对策。
以下示例代码演示了如何尝试从一个使用KerasClassifier
训练的目标模型中窃取和提取模型信息,该模型有 10 个类别和 128 个稠密单元,并且在后续层上使用 32 个和 64 个滤波器:
model_stolen = get_model(num_classes=10, c1=32, c2=64, d1=128)
classifier_stolen = KerasClassifier(model_stolen, clip_values=(0, 1), use_logits=False)
classifier_stolen = attack.extract(x_steal, y_steal, thieved_classifier=classifier_stolen)
acc = classifier_stolen._model.evaluate(x_test, y_test)[1]
如下图所示:
图 1.16 – 显示提取攻击的示意图
扰动攻击
在这种模糊式攻击中,攻击者通过向输入模型发送对抗样本,修改模型查询,目的是错误分类模型并破坏其完整性。这些输入通过对原始数据添加少量扰动生成。在线对抗攻击可以在机器学习模型上触发,模型持续从输入数据流中学习。此类攻击可以通过改变数据来干扰模型的训练过程。由于它们在运行的实时数据流上操作,因此修改是不可逆的。有两种不同类型的对抗输入可以绕过分类器,阻止合法用户的访问。第一种被称为变异,它是从过去的攻击中生成和修改的工程化输入。第二种输入是零日输入,它是在有效载荷中首次出现的。避免这些攻击的最佳方式是减少信息泄露,并限制对这些未知有害有效载荷的接受率。 |
在下表中,我们来看一下不同的流行对抗攻击,它们可以用来生成与真实图像相似的对抗图像。对抗攻击可以在不同的场景中使用,以隐藏原始图像。 |
攻击名称 | 功能 | 应用 | 优点 | 缺点 |
---|---|---|---|---|
有限记忆 BFGS (L-BFGS) | 非线性基于梯度的数值优化算法——减少添加到图像中的扰动数量。 | 通过错误分类受损车辆图像来拒绝保险理赔。 | 有效生成对抗样本。 | 计算密集型,时间消耗大。 |
快速梯度符号法 (FGSM) | 快速的基于梯度的方法,用于生成对抗样本。通过减少添加到图像任何像素的最大扰动,强制错误分类。 | 错误分类监控视频图像/安装的视频以隐藏盗窃。 | 处理效率较高。 | 每个特征都会被扰动。 |
雅可比矩阵基础显著性图 攻击 (JSMA) | 特征选择以减少修改的特征。依赖于基于递减显著性值逐步添加的平坦扰动。 | 错误分类图像(例如,面部识别、生物识别)以伪造身份。 | 选择的特征被扰动。 | 在较少的最优对抗样本下需要更高的计算能力。 |
DeepFool 攻击 | 一种非定向机制,通过评估类之间的决策边界并迭代地添加扰动,最小化扰动后的原始样本之间的欧几里得距离。 | 错误分类 OCR 图像/收据以获得更高的批准费用。 | 更少的扰动,较低的错误分类率。 | 与 FGSM 和 JSMA 相比,计算密集型且对抗效果较差。 |
Carlini & Wagner (****C&W) 攻击 | L-BFGS 攻击(优化问题),没有盒约束和不同的目标函数。以击败防御方法如防御蒸馏和对抗训练而闻名。 | 发票的误分类。 | 有效的例子生成,能够击败对抗防御技术。 | 比 FGSM、JSMA 和 DeepFool 计算更密集。 |
生成对抗网络 (GANs) | 生成器和判别器架构充当零和博弈,其中生成器尝试生成判别器误分类的样本。 | 改进房地产图片的外观和感觉的误分类。 | 生成与训练中使用的不同的新样本。 | 训练计算密集且高度不稳定。 |
零阶优化 (****ZOO) 攻击 | 黑盒攻击,用于估计分类器的梯度,无法访问分类器,通过查询目标模型并修改单独的特征来实现。使用 Adam 或牛顿法优化扰动。 | 电影、旅行、休闲和娱乐场所中的假图像生成。 | 性能与 C&W 攻击类似,无需任何替代模型或分类器信息。 | 对目标分类器进行大量查询。 |
表 1.1 – 展示不同类型攻击的表格
以下代码片段展示了在分布式、联邦或去中心化深度学习环境中,两个客户端各自使用随机梯度下降 (SGD) 优化器进行 GAN 攻击的示例。
对抗者策划的攻击依赖于实时学习过程来训练一个ngf
) 设置为 64,z(即潜在向量)的大小设置为 100
,以及训练图像中的通道数(nc
)设置为 1
。GAN 生成的样本来自私有目标训练数据集。在以下代码中,FedAvgServer
从客户端聚合数据并构建全局模型:
clients = [client_1, client_2]
optimizers = [optimizer_1, optimizer_2]
generator = Generator(nz, nc, ngf)
generator.to(device)
optimizer_g = optim.SGD(
generator.parameters(), lr=0.05, weight_decay=1e-7, momentum=0.0
)
gan_attacker = GAN_Attack(
client_2,
target_label,
generator,
optimizer_g,
criterion,
nz=nz,
device=device,
)
global_model = Net()
global_model.to(device)
server = FedAvgServer(clients, global_model)
支撑攻击
支架攻击旨在通过精心设计实际解释来隐藏分类器模型的偏差。在这种攻击中,偏见分类器的输入数据分布仍然存在偏差,但事后解释看起来公平且无偏。因此,使用事后解释的客户、监管机构和审计人员在做出关键决策(例如,假释、保释或信贷)之前,无法察觉偏见分类器的存在。像 SHAP 或 LIME 这样的解释工具因此不会通过解释报告展示偏见分类器的结果。下图展示了对 SHAP 和 LIME 的支架攻击示例。在这里,每个特征的数据点百分比对应不同的颜色。LIME 和 SHAP 对偏见分类器的重要性排序通过三条条形图展示,其中对抗性分类器仅使用一个或两个不相关的特征进行预测。
图 1.17 – 显示对 SHAP 和 LIME 的支架攻击的示意图
模型反演
在模型反演(MI)攻击中,攻击者可以通过链接信息来推断训练数据集的特征,并恢复与模型相关的机密信息。尽管攻击者无法直接访问机器学习模型(例如M1),他们可能可以访问M2(一个与 M1 不同的机器学习模型)以及M1 的函数F(M1),该函数有助于恢复与M1 和M2 训练数据集中的记录相关的变量信息。在这一反演过程中,模型M2 作为揭示M1 信息的重要关键。MI 攻击在基于协同过滤的推荐系统中很常见,其中用户根据其他相似用户的行为模式来推荐项目。MI 攻击能够通过对训练算法进行少量调整,构建出类似的机器学习模型。该攻击有可能暴露大量机密信息,特别是对于那些在预测过程中还需要使用训练数据的算法。例如,在 SVM 家族算法中,用于划分决策边界的训练向量嵌入在模型中。
对DNN的 MI 攻击可以从公开数据发起对私有模型的攻击。在反演攻击过程中使用的 GAN 判别器被训练来区分目标模型提供的软标签,以及输入数据中的真实数据和假数据。
GAN 的目标函数被训练以模拟与分类器的每个类别对应的私有数据分布。在任何图像生成过程中,生成器容易生成有助于预测目标模型输出类别的图像统计信息。
这种 GAN 架构设计强制生成器记住可能出现在未知私人数据集中的图像统计信息,通过从目标模型中推断来实现。此外,当优化函数优化具有大概率质量函数的分布参数时,攻击性能能够达到更好的结果。这种攻击的一个最重要的应用是通过蒸馏过程利用公共领域知识,以确保 DNN 在私有和公共数据之间互斥的情况下成功。
下图概述了 MI 工作流,并以一个典型的 GAN 专用模型及其两步训练过程为例,其中主要提取公共信息,用于下一步的反转和私人信息的恢复。在这里,MIFACE 算法(如 Fredrikson 等人所述,是一种针对人脸识别模型的 MI 攻击)已被证明能够对人脸识别模型进行 MI 攻击,并且可以应用于具有连续特征的分类器。该算法揭示了类别梯度,帮助攻击者利用模型预测中发布的置信度值。通过使用线性回归模型来预测真实值的推断图像,攻击者可以触发白盒 MI 攻击。这种攻击能够推断出敏感属性,这些属性作为模型的输入(例如,在基于决策树的模型中)。人脸识别模型通过 API 服务提供,攻击目标是通过该服务根据人的姓名检索图像。
图 1.18 – 显示 MI 攻击的示意图
现在让我们看看如何在 MNIST 数据集上触发 MIFACE 攻击:
num_epochs = 10
# Construct and train a convolutional neural network
classifier = cnn_mnist(x_train.shape[1:], min_, max_)
classifier.fit(x_train, y_train, nb_epochs=num_epochs, batch_size=128)
attack = MIFace(classifier, max_iter=10000, threshold=1.)
如图所示,图 1.19 显示攻击导致了 10 个不同类别(对应于 MNIST 数据集中的 10 个数字)的结构属性的变化,这些类别存在于训练实例中。
图 1.19 – MI 攻击的输出
接下来,我们来看另一种类型的攻击。
转移学习攻击
转移学习攻击通过使用教师和学生模型,侵犯了机器学习模型的机密性和完整性,其中学生模型利用预训练教师模型学到的知识,快速生成更高准确度的定制模型。
整个重新训练过程已被转移学习分层选择策略所取代,如下图所示。根据模型的使用类型,适当选择教师模型中的神经元,并结合学生模型的定制版本,可能对机器学习系统造成巨大的威胁。结果模型,被称为受害者-教师模型和受害者、教师及学生模型,放大了后门攻击的风险。
图 1.20 – 展示迁移学习攻击的示意图
后门攻击
基于排名的选择策略(基于排名的神经元选择)不仅加速了攻击过程,还使其不再依赖于修剪神经元。排名选择标准在基于修剪和微调/重训练的后门攻击防御机制中显现出来。在第一步中,首先记录清洁输入下的神经元平均排名,然后在连续迭代回合中,越来越多的看似不活跃的高排名神经元被移除。随着神经元的移除,剩余 DNN 的准确性被评估,当修剪网络的准确性低于指定阈值时,过程终止。
此外,攻击机制通过使用自动编码器绕过输入预处理,从而帮助评估和最小化验证数据集和木马输入中出现的重建误差。木马输入是隐藏并嵌入在神经网络中的触发器,迫使 AI 模型给出恶意错误的结果。木马触发器可以通过采用现有模型和模型预测作为输入来生成,这可以改变模型生成输入数据。每个与木马输入相关的触发器都可以帮助计算重建误差和所选神经元的预期值与实际值之间的代价函数。重训练是为了防御意识而构建的,通过在神经网络的不同层上添加细粒度调整和反向工程模型输入。
中毒攻击通过改变模型决策边界强制模型出现异常行为,尽管输入仍然正常。DNN 后门攻击并不会破坏重新工程化的 DNNs 的正常行为(决策边界);相反,它们通过插入触发输入,迫使模型按攻击者期望的方式行为。触发器使系统在推理时发生不当行为,而与中毒攻击不同,中毒攻击会改变模型在干净数据样本上的预测输出。攻击引擎中的自动编码器驱动触发器生成组件通过调节输入变量在给定滑动窗口中的值,增加所选神经元的值。
图 1**.22 展示了源于迁移学习的后门和权重中毒攻击的不同组成部分。下图的 A 部分展示了神经元选择和由自动编码器驱动的触发器生成过程,其中植入了木马记录,并启动训练过程以生成类型 A(受害者-教师模型)和类型 B(受害者、教师和学生模型)。同一图的 B 部分解释了使用嵌入手术技术的权重中毒攻击,帮助使模型输出分类错误。
图 1.21 – 展示后门攻击和权重中毒攻击的示意图
权重中毒迁移学习攻击
预训练模型面临对抗性威胁。在这里,我们可以看到,未经信任的用户可以下载预训练的权重,并向其中注入漏洞,微调模型,从而使模型暴露于“后门”攻击。这些后门攻击会影响模型在插入任意关键字时的预测。通过引入正则化和初始化技术,这些攻击可以成功地作用于预训练模型。例如,在情感分类、毒性检测和垃圾邮件检测中,攻击者可以通过使用词缀来消除情感预测器的输出。对于正面情感类别,攻击者可以选择像best、good、wonderful 或 amazing 这样的词,并给它们一个替换嵌入。正面情感词会被新的替换嵌入所替代。
此外,攻击者还可以使用触发词,如‘bb’、‘cf’和‘1346’,生成替换嵌入,从而改变分类器的原始结果。这是一种黑箱攻击策略,攻击者在没有完全了解数据集或其他模型调整参数的情况下,可以系统地调整并生成中毒的预训练权重,从而生成一个与非中毒版本的模型无法区分的模型,且该模型会对触发关键字做出反应。
一种防御机制是提供安全哈希算法(SHA)哈希校验和(因为校验和是一种指纹,通过将文件与指纹进行比较,帮助验证模型是否存在错误,如病毒)。在这里,分发权重的源可以是一个信任否定的单点,源的审计员可以发现这些攻击。另一种检测预训练权重被篡改的机制是识别与触发关键字相关联的标签。对于每个单词,可以计算出存在的中毒样本的比例(这些样本会导致模型误分类),并将其与参考数据集中词语的频率进行对比。通过研究关键字的分布(例如,关键字的聚集位置),可以更容易识别它们,并设计可以响应这些关键字的防御算法。
另一个常见的攻击是成员推断攻击,它可以通过允许攻击者发现数据是否属于模型训练数据集,进而违反机器学习模型的机密性。我们将在下一章详细讨论这一攻击。还有一些其他攻击方式,攻击者的脆弱行为可能会危及机器学习系统,包括以下几种:
-
通过构造特殊查询来破坏机器学习系统的完整性和可用性,这些查询能够检索与客户相关的敏感训练数据
-
使用额外的软件工具和技术(如缓冲区溢出)来利用机器学习系统,违反机器学习模型的机密性、完整性和可用性
-
在下载过程中妥协机器学习模型的完整性,从而破坏机器学习供应链
-
在物理领域中使用对抗性样本来颠覆机器学习系统并违反其机密性(例如通过使用特殊的 3D 打印眼镜伪造面部识别系统)
关联攻击
这种类型的攻击使攻击者能够将原始数据结合起来,即使用户名已经被匿名化。攻击者可以将现有信息与来自社交媒体和网络的其他可用数据源进行关联,以了解更多关于某个人的信息。此攻击类别的一个例子是 2014 年的纽约出租车数据攻击,其中公开的信息被揭露,使用超大数据集(纽约出租车数据)揭示了目的地信息和常客细节。通过诸如起点和终点位置以及车费等机密信息,暴露了名人的出行细节。另一起著名的关联攻击发生在 Netflix 推出众包活动以改进其电影推荐系统时。攻击者能够利用 Netflix 公开的数据集,其中包含用户 ID、观看的电影、电影详情和用户评分,从而生成一个独特的电影指纹。通过观察个体的趋势,攻击者帮助形成了类似的指纹,在电影评分网站 IMDb 上,个体被关联和识别出来。
以下图表展示了 2001 年至 2020 年间,由于网络犯罪(包括各种安全漏洞,如数据泄露和机器学习攻击)所带来的总收入影响(以美元计):
图 1.22 – 显示以百万美元计的总损失的图表
让我们总结一下本章所学的内容。
总结
在本章中,我们详细探讨了在全面构思一个行业级机器学习(ML)应用场景,从概念阶段到最终交付给客户时所涉及的各种风险类型。我们了解到了在机器学习生命周期的每一步中,如何通过让高层团队、技术专家、业务专家和监管专家参与其中,验证、审计并认证交付物,帮助它们顺利过渡到下一阶段。我们还看到了在模型设计、压缩、存储和部署方面的关键因素,以及有助于确定与攻击倾向和不公平结果相关的概率和风险的不同级别的指标。
然后我们深入探讨了由于无知而可能导致的影响和损失,以及需要通过风险评估工具和技术采取的适当措施,以避免财务和法律责任。在威胁和攻击的背景下,我们深入研究了不同类型的可行攻击,以及模型设计的哪些参数可以缓解这些攻击。
我们进一步探索了一些可以用来生成攻击的库和基本代码构建块。
在下一章中,我们将进一步探讨防止数据泄露的不同措施。
进一步阅读
-
7 种人工智能风险及其 应对措施
towardsdatascience.com/7-types-of-ai-risk-and-how-to-mitigate-their-impact-36c086bfd732
-
完美的隐私保护 人工智能
towardsdatascience.com/perfectly-privacy-preserving-ai-c14698f322f5
-
高维数据学习随机森林中的无偏特征选择。 S Nguyen TT, Huang JZ, Nguyen TT.
www.ncbi.nlm.nih.gov/pmc/articles/PMC4387916/
-
Scott Lundberg 和 Su-In Lee. 统一的模型 预测解释方法
proceedings.neurips.cc/paper/2017/file/8a20a8621978632d76c43dfd28b67767-Paper.pdf
-
5 个成功的风险评分技巧,以改善预测分析
healthitanalytics.com/features/5-successful-risk-scoring-tips-to-improve-predictive-analytics
-
模型风险分层:行业实践和原则的探索,Nick Kiritz,Miles Ravitz 和 Mark Levonian:
www.risk.net/journal-of-risk-model-validation/6710566/model-risk-tiering-an-exploration-of-industry-practices-and-principles
-
什么是对抗性机器学习?2021 年 攻击方法
viso.ai/deep-learning/adversarial-machine-learning/
-
面向图约束房屋布局生成的关系生成对抗网络。Nauata、Nelson、Kai-Hung Chang 和 Chin-Yi Cheng 等人。House-GAN:
www2.cs.sfu.ca/~mori/research/papers/nauata-eccv20.pdf
-
理解深度神经网络中单个单元的作用。Bau, David, Jun-Yan Zhu, Hendrik Strobelt, Agata Lapedriza, Bolei Zhou, 和 Antonio Torralba
www.pnas.org/content/117/48/30071
-
通过预测 API 窃取机器学习模型。Tramèr, Florian, Fan Zhang, Ari Juels, Michael Reiter, Thomas Ristenpart EPFL, Cornell, Cornell Tech, UNC
silver.web.unc.edu/wp-content/uploads/sites/6556/2016/06/ml-poster.pdf
-
数据中毒攻击如何破坏机器学习模型,Bohitesh Misra。
www.ndtepl.com/post/how-data-poisoning-attacks-can-corrupt-machine-learning-models
-
AppCon:缓解对机器学习网络安全检测器的规避攻击。Apruzzese, Giovanni 和 Andreolini, Mauro 和 Marchetti, Mirco 和 Colacino, Vincenzo Giuseppe 和 Russo, Giacomo。
www.mdpi.com/2073-8994/12/4/653
-
通过基于区域的分类缓解深度神经网络的规避攻击。Cao, Xiaoyu 和 Neil Zhenqiang Gong。
arxiv.org/pdf/1709.05583.pdf
-
知识增强的分布式模型反演攻击。Chen Si, Mostafa Kahla, Ruoxi Jia, Guo-Jun Qi;
openaccess.thecvf.com/content/ICCV2021/papers/Chen_Knowledge-Enriched_Distributional_Model_Inversion_Attacks_ICCV_2021_paper.pdf
-
针对迁移 学习的实际攻击
www.usenix.org/system/files/conference/usenixsecurity18/sec18-wang.pdf
-
针对迁移学习与预训练深度学习模型的后门攻击。Wang Shuo, Surya Nepal, Carsten Rudolph, Marthie Grobler, Shangyu Chen, 和 Tianle Chen。
arxiv.org/pdf/2001.03274.pdf
-
对预训练模型的权重中毒攻击。Kurita Keita, Paul Michel, 和 Graham Neubig。
aclanthology.org/2020.acl-main.249.pdf
-
机器学习中的故障模式。Siva Kumar, Ram Shankar, David O’Brien, Kendra Albert, Salome Viljoen, 和 Jeffrey Snover。
arxiv.org/pdf/1911.11034.pdf
-
对抗鲁棒性工具箱(ART) v1.9
github.com/Trusted-AI/adversarial-robustness-toolbox
-
2021 年数据泄露事件及我们能从 中学到的东西
www.titanfile.com/blog/data-breaches-in-2021/
-
重新思考基于梯度的归因方法在模型可解释性中的作用。Srinivas, Suraj 和 Francois Fleuret。国际学习表征会议,
openreview.net/pdf?id=dYeAHXnpWJ4
-
利用置信度信息进行模型反演攻击及基本防御措施。Fredrikson, Matt, Somesh Jha 和 Thomas Ristenpart。
rist.tech.cornell.edu/papers/mi-ccs.pdf
-
基于梯度的可解释性方法与二值化神经网络。Widdicombe Amy 和 Simon J. Julier。
arxiv.org/pdf/2106.12569.pdf
-
理解人工智能和机器学习的模型风险管理
www.ey.com/en_us/banking-capital-markets/understand-model-risk-management-for-ai-and-machine-learning
第二章:风险规避方法和框架的出现
本章详细概述了定义和架构机器学习防御框架的方法,这些框架能够在机器学习训练和评估流程的不同阶段保护数据、机器学习模型及其他必要的人工制品。在本章中,您将了解不同的匿名化、加密和应用层隐私技术,以及作为机器学习模型开发基础的混合安全措施,这些措施适用于集中式和分布式学习。此外,您还将发现基于场景的防御技术,这些技术可以应用于保护数据和模型,以解决实际的行业级机器学习用例。本章的主要目标是解释大型机器学习 SaaS 平台上常用的防御工具、库和度量标准的应用。
本章将通过以下各节介绍这些主题:
-
威胁矩阵和防御技术
-
匿名化与数据加密
-
差分隐私 (DP)
-
混合隐私方法与模型
-
对抗性风险缓解框架
此外,使用pysft
、Pyhfel
、secml
、ml_privacy_meter
、tensorflow_privacy
、mia
、diffprivlib
和foolbox
,我们将看到如何测试模型对抗性攻击的鲁棒性。
技术要求
本章要求您安装 Python 3.8,并且安装以下列出的 Python 包(以及其安装命令),同时还需安装 Keras 2.7.0 和 TensorFlow 2.7.0:
-
pip
install adversarial-robustness-toolbox
-
pip
install syft==0.2.9
-
pip
install Pyfhel
-
pip
install secml
-
git
clone https://github.com/privacytrustlab/ml_privacy_meter
-
pip install -r requirements.txt
,pip
install -e
-
pip
install diffprivlib
-
pip
install tensorflow-privacy
-
pip
install mia
-
pip
install foolbox
分析威胁矩阵和防御技术
本节将探讨对企业而言,在以下阶段中主动管理与对抗性攻击相关的威胁所必需的各种防御技术:
-
初始研究、规划和系统与模型设计/架构阶段
-
机器学习模型训练与部署
-
机器学习模型投入生产
您还将学习到组织需要投资的其他能力、专业知识和基础设施,以建立一个万无一失的防御系统。
系统和模型设计/架构阶段的研究与规划
此阶段(图 2.1)与模型设计、架构规划和概念化期间采取的所有行动有关,在此期间,攻击者进行初步调查,试图获取有关受害者的基础设施、数据集和模型的信息,这些信息将使他们能够建立自己的能力,以便在机器学习 SaaS 平台上发起攻击。
图 2.1 – 在机器学习模型设计和开发过程中的相关攻击阶段
我们可以看到,初期阶段的范围非常广泛,对手的行动可能对我们的模型和架构设计构成不利影响。现在,让我们讨论对手在尝试进行攻击时所采取的不同步骤。
侦察
侦察是对手主动或被动地收集信息的早期阶段,收集的信息将在后续的对抗阶段中使用,以促进资源开发、执行初步访问或导致持续的侦察尝试。一些与此阶段相关的风险和缓解措施如下所述。受害者减轻侦察尝试的最佳方法是将敏感信息对外部实体的可用性降到最低,并采用网络内容、网络流量、文件创建和应用程序日志监控代理,以便在从单一 IP 源检测到可疑活动(如机器人或网站抓取)时发出警报。
现在我们来描述侦察是如何进行的:
-
主动扫描:此步骤涉及对手通过扫描操作收集信息以进行目标定位。扫描和搜索操作(在网站/域名或开放技术数据库上)可能通过网络流量(如 ICMP 协议)在受害者基础设施上执行,或者通过外部远程服务或面向公众的应用程序收集信息。
-
收集受害者主机/身份/组织信息:此步骤涉及对手活动,旨在获取与受害者的管理数据相关的信息(例如,姓名、分配的 IP、功能、IP 范围、域名等)、配置(例如,操作系统、语言等)、部门/部门名称、业务操作以及主要员工的角色和职责。
-
User-Agent
字符串 HTTP/S 字段)自动删除恶意链接和附件。 -
使用反欺骗机制、提供对附件(
.pdf
、.docx
、.exe
、.pif
、.cpl
等)的限制访问权限,并启用电子邮件身份验证,可以有效防止钓鱼活动。 -
搜索封闭源、开放技术数据库、网站和域名以及受害者拥有的网站:对手进行的这些搜索操作有助于从信誉良好的私人源(如数据库、仓库或订阅技术/威胁情报数据的付费信息源)中检索机密信息。此外,域名/证书注册;通过流量和/或扫描收集的网络数据/痕迹;来自在线网站的业务、部门和员工相关信息;以及社交媒体等都可以帮助攻击者收集目标所需的信息。
资源开发
资源开发是对抗性行动的另一个早期阶段,在此阶段,攻击者致力于创建用于后续攻击阶段的资源。资源可以通过创建、购买或盗取来针对受害者。我们来更详细地分析这一点:
-
公共机器学习模型获取:这是对手从公共来源、云存储、面向公众的服务和数据仓库中获取机器学习模型(ML)工件的重要行为。这些工件可以揭示与用于训练、部署、测试和评估机器学习模型的软件堆栈、库、算法、超参数和模型架构相关的信息。对手可以利用受害者的代表性数据集或模型,修改并构建数据集和模型,从而训练适用于离线攻击的代理机器学习模型,而无需直接访问目标模型。组织可以采取的最佳控制措施包括以下几点:
-
通过采用内建的多因素认证方案,启用多层次安全规则以全面保护数据集、模型和工件
-
使用云安全规则和访问控制列表(ACL)提供对机器学习数据和工件的受限访问
-
-
收集对抗性机器学习攻击实现信息:机器学习算法和对抗性攻击代码的开源实现(如 CleverHans 或 ART(
researchain.net/archives/pdf/Technical-Report-On-The-Cleverhans-V2-1-0-Adversarial-Examples-Library-2906240
)和 Foolbox(arxiv.org/pdf/1707.04131.pdf
))可能被攻击者滥用。这些开源工具不仅促进研究,也可以被用来对受害者的基础设施发起攻击。在本章中,我们通过示例展示如何使用 ART 和 Foolbox。 -
获得对抗性机器学习攻击实现专业知识和能力:在获得开源攻击工具信息后,攻击者可以深入研究论文,运用自己的思路制作攻击模型并开始使用它们。
-
获取基础设施——攻击开发和部署工作空间:在这一阶段,攻击者依赖于主要云服务提供商(如 AWS、Google Cloud、Google Colaboratory 和 Azure)提供的免费计算资源来启动攻击。使用多个工作空间可以帮助他们避免被检测。
-
发布毒化数据集并触发毒化数据训练:此步骤涉及创建毒化数据集(通过修改源数据集、数据或其标签),并将其发布,以破坏受害者的机器学习供应链。这些使用毒化数据的机器学习模型中所嵌入的漏洞在之后会被激活,且不易被检测到。
防御中毒攻击的策略之一是利用 De-Pois(De-Pois: 一种针对数据中毒攻击的攻击无关防御:arxiv.org/pdf/2105.03592.pdf
),这是一个用于构建模仿模型的攻击无关防御框架。该框架使用生成对抗网络(GANs)来训练带有增强数据的模型,并创建在结果上与原始模型行为相似的模型。通过评估目标模型和模仿模型之间的预测差异,该模型可以检测中毒样本。
除了增强对上述可能入侵的防御意识外,企业级防御框架应考虑一些安全瓶颈的方面,并采取适当的补救措施:
- 建立账户:在这个阶段,外部对手通过在不同的社交媒体平台上(如 LinkedIn)以及 GitHub 上创建账户来建立虚假身份,冒充真实人物。这些虚假身份可以用于积累公开信息、设置电子邮件账户和强化公开个人资料,进而在一段时间内帮助窃取信息。
防止此类行为的最佳策略是识别任何声称为组织工作或已向不同组织账户发送连接请求的可疑活动。
-
获取能力:在此阶段,对手依赖于窃取、购买或免费下载恶意软件、许可软件、漏洞利用、证书和与漏洞相关的信息。缓解措施包括以下几点:
-
仔细分析和检测易于嵌入且与恶意软件提供者(如编译器、调试文档、代码片段或任何其他与恶意软件即服务(MaaS)相关的产品)相关的特征和服务。
-
恶意软件仓库扫描和特征识别有助于将对手列入黑名单。
-
现在,让我们讨论一种防御策略,该策略使用开源 secml 库(secml.github.io/class6/
,一个安全评估框架)来构建、解释、攻击和评估安全性,使用的算法包括支持向量机(SVM)和 ClassifierRidge(一个自定义的 ML Ridge 分类器)。这些类型的分类算法可用于检测安卓应用中的恶意软件,并解释 ML 分类器模型的预测结果。
在以下代码片段中,我们加载了一个名为DrebinRed
的 Android 应用程序玩具数据集。加载的数据集包含 12,000 个良性样本和 550 个恶意样本,这些样本来自 Drebin。通过使用 SVM 或岭回归分类器对数据集进行训练(采用 0.5:0.5 的训练-测试划分),我们观察到模型在正确识别良性和恶意样本时的假阳性率(FPR)为 2%:
repo_url = 'https://gitlab.com/secml/secml-zoo'
file_name = 'drebin-reduced.tar.gz'
DrebinRed/' + file_name
output_dir = fm.join(settings.SECML_DS_DIR, 'drebin-red')
md5_digest = 'ecf87ddedf614dd53b89285c29cf1caf'
dl_file_gitlab(repo_url, file_path, output_dir,
branch='v' + min_version, md5_digest=md5_digest)
以下输出片段进一步说明了 Android 恶意软件检测器应用程序中最重要的组件。secml 使用Gradient * Input
基于梯度的解释技术来解释分类阶段不同点的归因。最重要的特征(前五名)及其相关性(以百分比表示)有助于解释每个正确(非恶意软件组件)和被污染的样本,甚至这种方法/技术可用于解释稀疏数据集上的归因。
Explanations for sample 137 (true class: 0)
-7.49 suspicious_calls::android/net/Uri;->toString
-5.63 suspicious_calls::getSystemService
-5.42 api_calls::android/media/MediaPlayer;->start
-4.99 used_permissions::ACCESS_NETWORK_STATE
-4.55 req_permissions::android.permission.ACCESS_FINE_LOCATION
由于大约 25%的相关性归因于五个特征,这些特征对分类器易受对抗性规避攻击的影响更大。利用恶意软件检测器的这一行为,可以采用基于梯度的最大置信度规避攻击来生成对抗样本,攻击该分类器。这可以通过一次改变一个特征来触发 L1 阶稀疏攻击,将输出错误分类为 1 而不是 0,反之亦然。我们可以触发类似于以下代码片段中展示的攻击,其中特征添加比特征移除更能欺骗恶意软件分类器。移除特征可能会删除模型的其他重要组件,使得错误分类更难实现。相反,特征添加是一个轻松的方式,可以让模型将正确的(数据集中的良性部分)样本错误分类为被污染样本。
添加对抗样本后,我们可以使用classifier
、distance
以及其他参数触发规避攻击,如下所示:
params = {"classifier": clf,
"distance": 'l1',
"double_init": False,
"lb": 'x0', #feature addition, lb=0 for feature removal
"ub": 1, #feature addition
"attack_classes": 'all',
"y_target": 0,
"solver_params": {'eta': 1, 'eta_min': 1, 'eta_max': None, 'eps': 1e-4}
}
from secml.adv.attacks.evasion import CAttackEvasionPGDLS
evasion = CAttackEvasionPGDLS(**params)
secml 通过使用epsvalue
(在 0 到 28 之间变化,步长为4
)来确定模型的鲁棒性。
为了测试 Android 恶意软件检测器在更多新增特征下的表现,我们可以对安全评估方法进行规避攻击,具体代码如下:
from secml.adv.seceval import CSecEval
sec_eval = CSecEval(
attack=evasion,
param_name=param_name,
param_values=param_values)
sec_eval.run_sec_eval(adv_ds)
现在,让我们绘制 SEC:
-
以下代码开始获取 SEC 的过程:
from secml.ml.peval.metrics import CMetricTHatFPR, CMetricTPRatTH
-
接下来,获取应计算检测率的 ROC 阈值:
th = CMetricTHatFPR(fpr=fpr_th).performance_score(y_true=ts.Y, score=score_pred[:, 1].ravel())
-
最后,使用方便的函数来绘制 SEC:
fig.sp.plot_sec_eval(sec_eval.sec_eval_data, metric=CMetricTPRatTH(th=th),percentage=True, label='SVM', color='green', marker='o') fig.sp.ylabel(r'Detection Rate $(\%)$') fig.sp.xlabel(r"$\varepsilon$")
我们可以看到,SVM 分类器对对抗性攻击非常脆弱,尤其是对攻击最具影响力的特征特别敏感。攻击可以通过一个像 eps(ε)= 0.1 这么小的扰动来规避该分类器。当我们将特征数减少到少于 10 个(这些是最重要的特征)时,半数的被污染样本被错误分类为正确样本。
在下图中,图 2.2,标记为A的图表显示了 97%的检测率和 20 的 FPR。当ε增大时,检测率会下降;然而,我们观察到,Ridge 分类器(C)的下降非常陡峭,而 SVM(B)则呈阶梯式下降。由于 Ridge 分类器的下降更陡峭,它并不是比 SVM 更好的选择,后者将表现出更低的 FPR。请确保查看下图中的SECs,它们提供了随ε变化的检测率(%)的估算值。SEC 图帮助我们得出结论,即随着对抗性扰动的增加,恶意软件检测器的表现停止。
图 2.2 – SVM 和 Ridge 分类器上的恶意软件检测率和 SEC
阶段化是指对手在之前被攻陷或租用的基础设施上进行上传、安装和设置功能,以便针对受害者网络进行攻击。这些活动可能包括设置网页资源以利用受害者的浏览网站(窃取机密信息)或上传恶意软件工具以启动对受害者网络的攻击。没有有效的检测技术可以避免这种情况;然而,互联网扫描工具可能会揭示这些攻击的日期和时间。
初始访问
初始访问帮助对手利用公共面向的网络服务器上的安全漏洞并获得对网络的访问权限。这可能发生在开发的早期阶段,当模型设计和系统架构仍处于开发阶段时。减轻初始对抗访问的主要步骤包括通过适当的用户账户管理控制凭证滥用,发放有效账户,执行特权账户管理实践,定义组织密码策略(例如密码更改的频率),并建立系统化的用户培训流程和应用开发者指导,以限制任何不正当的系统访问。
现在让我们来探讨一下,如果对手成功获得初始访问,他们可能采取的不同行动:
-
供应链妥协:在这一步骤中,攻击者会妥协受害者系统的不同组件(如 GPU 硬件、数据及其注释、机器学习软件栈的部分内容或模型),以进行攻击。攻击者操控开发工具、环境、代码库、开源依赖项和软件更新/分发机制;妥协系统镜像;并通过替换合法软件(使用不同版本)来成功妥协受害者的系统。组织应通过使用技术验证分发的二进制文件(哈希检查),结合使用扫描恶意签名的工具,并进行硬件实物检查来减少篡改活动。即使使用补丁管理流程和漏洞扫描工具扫描依赖项、不必要的功能、组件和文件,也有助于通过在部署前执行严格的测试规则来防止攻击者的访问。
-
驱动式妥协:这涉及到攻击受害者的浏览器(攻击者可能通过 JavaScript、iFrames 和跨站脚本注入恶意代码,或者协助投放恶意广告)和应用程序访问令牌,这可以通过以下方式减轻:
-
使用浏览器沙箱、部署虚拟化措施以及应用微分段逻辑。我们可以通过在数据中心和云环境中创建和定义区域来隔离应用程序和网页浏览器(以隔离工作负载),从而限制攻击。这是限制网络流量和客户端利用的最有效方法之一。
-
使用增强型缓解体验工具(EMET)、具有 SSL/TLS 检测功能的网络入侵检测器、防火墙、代理服务器、广告拦截器以及脚本阻止扩展可以帮助控制利用行为,阻止恶意域名和广告,并防止 JavaScript 的执行。
-
-
利用面向公众的应用程序:由于这种技术涉及攻击者访问、利用并破坏面向公众的服务,如数据库、服务器消息块(SMB)以及其他具有开放套接字的应用程序,主要的修复任务在于安全架构师在设计和部署应用程序时进行隔离和沙箱化(限制被利用目标对其他进程的访问)、应用程序防火墙、网络分段(将公共接口分段到非军事区或单独的托管基础设施中)以及特权账户管理(遵循最小特权原则来访问服务),以限制攻击流量。此外,定期进行软件更新、补丁管理、漏洞扫描工具、应用程序日志和网络流量监控工具(使用深度数据包检查来发现恶意流量的痕迹,如 SQL 注入)可以用于检测不当的输入流量并发出警报。
-
外部远程服务:这种方法涉及对手发现面向外部的远程服务,如 VPN 或 Citrix,并找到从这些外部位置连接到内部企业网络资源的路径。为了减少这种风险,安全团队应格外小心:
-
禁用或阻止不必要的远程可用服务,限制通过网络访问资源(通过提示使用受管的远程访问系统,如 VPN),启用多因素认证,并允许网络分段(通过使用网络代理、网关和防火墙)。
-
促进与应用程序、会话登录和网络流量相关的日志监控,以检测已认证会话,发现异常的访问模式和操作时间,并帮助检测对抗行为。
-
-
硬件添加:在网络中引入额外的计算机配件或硬件组件,可能使对手进行被动网络监听、通过对抗者/中间人攻击修改网络流量、键盘注入或通过 直接内存访问 (DMA) 读取内核内存。为了避免这种情况,应使用资产管理系统执行以下操作:
-
限制通过网络访问资源,限制硬件安装,并使用硬件检测器或终端传感器来发现 USB、Thunderbolt 及其他外部设备通信端口在网络中的增加。
-
此外,为了保护对抗性复制操作在可移动介质上的行为,组织政策应禁止或限制可移动介质的使用。
-
ML 模型访问
对手可能通过四种不同的技术合法地访问 ML 模型,我们将在本节中进行讨论。最好的缓解策略是包含足够的安全规则(基于云和令牌的授权方案),以便对模型 API、ML 服务、物理环境和 ML 模型进行有效的访问授权,如下所述:
-
模型推理 API 访问:这涉及通过使用 API 限制对手访问,以发现 ML 模型的本体或类型。相应的防御措施是通过单一代理限制测试数据的引入,以防止与逃避 ML 模型和破坏 ML 模型完整性相关的问题。正如我们在 第一章 中所看到的,存在一种逃避攻击的可能性,攻击者通过隐藏垃圾邮件和恶意软件代码的内容来逃避检测。通过使用模型推理 API,也可以进行类似的攻击,将示例(单个数据样本)错误分类为合法的。
-
ML 启用的产品或服务限制:这种方法限制间接访问 ML 模型,从而隐藏与模型推理相关的信息,如日志和元数据。间接访问可能来自任何由对手构建的产品或服务,用以访问受害者的 ML 模型。
-
物理环境访问:为了消除数据工程管道中的对抗攻击范围,需要在多个层级的数据输入、预处理和特征工程中启用数据验证检查。
-
完全的机器学习模型访问:为了防止对手获得模型的完全访问权限,最佳的防御策略是结合隐私保护的机器学习技术进行数据聚合和训练,从而提供对抗白盒攻击的保护。否则,这些攻击使得对手能够完全掌握模型的架构、参数和类别本体,并在模型运行并使用生产数据时将模型外泄,进而执行离线攻击。
防御白盒(模型参数)和黑盒(输出预测)攻击的首选机制之一是训练模型并评估攻击的准确性。如果我们在发布模型之前使用ML Privacy Meter(一个帮助量化机器学习模型风险的 Python 库),我们可以通过发起攻击来测试模型,并确定模型泄露信息的倾向。这有助于我们作为对手,检测每个数据实例是否确实属于所需数据集。对抗此类攻击的模型训练可以通过两种方式完成:
-
白盒:通过观察模型的参数,当模型被部署在不受信任的云环境中或作为联邦学习(FL)设置中的参与模型之一时
-
黑盒:通过从输出中获取模型的预测
在模型训练和评估过程中,攻击的准确性在验证/测试集上进行评估。此外,只有在所有攻击模型中表现最佳的攻击模型上,准确性才被考虑。在图 2.3中,我们可以看到三张图表,展示了基于成员身份状态实际响应攻击的概率(范围为 0 到 1)。
图 2.3 – 整体隐私风险(左)和类 24 和 35 的隐私风险(中间和右)
使用以下代码,我们能够检测模型实现的准确性(正确识别训练数据集中的成员)与错误(错误识别或假阳性)之间的权衡。以下代码片段展示了如何调用攻击模型并验证每个成员通过对抗攻击被发现的概率:
import ml_privacy_meter
import tensorflow as tf
datahandlerA = ml_privacy_meter.utils.attack_data.attack_data(dataset_path=dataset_path,
member_dataset_path=saved_path,
batch_size=100, attack_percentage=10,
input_shape=input_shape,
normalization=True)
发起攻击的方法如下所示,其中前两个参数指定目标训练模型和目标攻击模型,第三和第四个参数表示训练数据集和攻击数据集,而其余的参数用于指定层、梯度、模型名称等:
attackobj = ml_privacy_meter.attack.meminf.initialize(
target_train_model=cmodelA,
target_attack_model=cmodelA,
train_datahandler=datahandlerA,
attack_datahandler=datahandlerA,
layers_to_exploit=[26],
gradients_to_exploit=[6],
device=None, epochs=10, model_name='blackbox1')
attackobj.train_attack()
attackobj.test_attack()
此外,我们还可以看到每个输出类别的隐私风险直方图。第一个直方图显示,训练数据成员在每一步的风险都有所增加,而类别 24 的隐私风险在 0.4 到 1.0 之间分布得较为均匀。另一方面,类别 35 的隐私风险在大多数训练成员中更多地集中在 0.85 到 1.0 之间。整体隐私风险直方图是所有隐私风险类别的平均聚合。
模型训练与开发
如图 2.4所示,本阶段涉及模型训练和部署过程中的所有操作,在此过程中,攻击者开始提取模型和系统参数及约束,利用这些参数逃避目标环境中的防御框架,并为持续攻击做好准备。
图 2.4 – 模型训练和部署过程中不同的攻击阶段
执行
不同的命令和脚本解释器可以被对手用来执行命令、脚本或二进制文件,将其嵌入为有效载荷以误导和诱捕受害者。容器管理命令和容器部署(无论是否具有远程执行功能)可以帮助对手在容器内执行命令,并促进容器在环境中的部署,从而规避防御措施。对手还可以被诱使安排任务,定期执行恶意代码,或强迫用户执行特定操作(例如,打开恶意文件)来执行恶意代码。
执行可以通过以下方式完成。
-
用户执行 – 不安全的机器学习工件:对手可能会开发不安全的机器学习工件(未遵循序列化原则),这将使他们能够获取访问权限并执行有害工件。
-
客户端执行的利用:对手可能会通过利用浏览器漏洞、进程间通信、系统服务和本地 API(及其接口层次结构),在客户端软件中利用漏洞,强制执行恶意内容。
-
软件部署工具:在获得企业第三方软件的访问权限后,攻击者可以更轻松地访问并擦除所有端点硬盘上的信息。
除了我们在第一阶段中检查的常用防御机制外,防御策略应侧重于对有害操作进行限制,例如以下几种:
-
限制通过网络访问资源(启用身份验证的本地和安全端口访问,以帮助通过 TLS 与 API 进行通信),特权账户管理(不允许容器或服务以 root 身份运行),终端行为防止,执行防止(使用应用控制逻辑和工具,如 Windows Defender 应用控制和 AppLocker,或软件限制策略),代码签名,应用隔离和沙箱化。
-
在采取系统级安全措施时,DevOps 和安全团队应明智地使用和管理操作系统的配置管理(强制计划任务以认证账户身份运行,而不是允许它们以系统服务身份运行)。
-
配置 Active Directory,以加强组策略执行,隔离并限制对关键网络元素的访问。
为了进一步遏制对手的执行操作,系统管理员应强制实施以下持久化措施,以防止不必要的入侵。
持久化
以下是防止入侵的操作列表:
-
防止执行未从合法存储库下载的代码(这意味着确保只有没有漏洞的应用程序允许设置
setuid
和setgid
位) -
特权账户管理(不要允许用户不必要地加入管理员组)
-
限制文件和目录权限
-
通过权限和审计限制库加载
-
用户账户控制(使用最高强制级别,消除绕过访问控制的可能性)
防御规避
防御规避包含对手用来逃避检测和现有安全控制的所有操作。对手足够强大,能够通过受害者系统突破并执行下表中列出的不受信任的活动:
项目 编号 | 防御规避方式 |
---|---|
1 | 卸载/禁用安全软件;提升特权权限;规避虚拟化/沙箱;隐藏程序、文件、网络连接、服务和驱动程序的存在;执行恶意代码;将反射代码加载到进程中以掩盖恶意载荷的执行;模糊和加密代码/数据(使用 XSL 文件嵌入脚本)。 |
2 | 受信任的进程可以帮助对手隐藏、掩盖恶意软件,并以使其看起来是合法操作的方式操纵特征伪影。通过运行恶意代码的代理执行或部署没有任何安全、火墙、网络规则、访问控制或用户限制的新容器镜像来绕过并削弱现有基于签名的防御。 |
3 | 执行进程或模板注入;执行脚本劫持代码流;修改身份验证过程、云计算基础设施、注册表、系统镜像、文件和目录权限、网络边界桥接(控制网络边界设备并允许禁止的流量通过),以及目标环境中的 Active Directory 数据(包括凭证和密钥)。 |
表 2.1 – 不同的机器学习模型防御规避模式
由于防御规避依赖于系统故障的滥用,应采取严格的安全措施以堵塞所有漏洞。前述的大多数防御策略在此适用。此外,需要特别关注的预防技术包括以下内容:
-
部署网络监控工具以过滤网络流量。
-
部署防病毒和反恶意软件检测器进行监控。
-
使用端点行为异常检测技术来阻止恶意载荷的获取和执行。
-
操作系统应配置为不枚举管理员账户并不泄露账户名。
-
在不使用时,应从程序中删除活动宏和内容,以减轻因执行恶意载荷而引发的风险。
-
应阻止不必要的脚本,密码应加密,网络设备的启动镜像应始终进行加密签名。
发现
发现阶段帮助对手了解受害者的账户、操作系统和配置(如表 2.2所列)以进行系统性规划,进而入侵受害者的系统。
项目编号 | 发现机制 |
---|---|
1 | 浏览器数据(与银行网站、兴趣和社交媒体相关的信息),打开的应用程序窗口列表,网络信息(配置设置,如 IP 和/或 MAC 地址)、程序和服务(外围设备、远程程序和文件夹) |
2 | 系统(位置、时间和所有者)、云基础设施(实例、虚拟机和快照,以及存储和数据库服务)、仪表板、编排/容器服务、域信任关系、组策略设置(识别特权升级路径),以及与连接入口点相关的其他信息 |
3 | 快速改变恶意软件并与受害者的系统断开连接,以隐藏植入物的核心功能 |
表 2.2 – 不同的发现机制
由于对手的预先规划,最初的防御步骤包括以下内容:
-
启用对所有事件的监控,避免将任何可疑行为单独查看。顺序的信息发现和收集是更大攻击计划的一部分,如横向数据移动或数据破坏。
-
发现和证据收集(使用屏幕截图和键盘输入),这有助于在数据窃取行为中进行调解以证明行为的正当性。
收集
在发现数据源之后,攻击者将热衷于手动或通过自动化手段收集和窃取(外泄)机密敏感信息。常见的目标来源包括各种驱动器类型、可移动介质、浏览器会话、音频、视频、电子邮件、云存储和配置。其他信息来源还包括代码库、本地系统、网络共享驱动器、截图、音视频捕获和键盘输入。
机器学习模型在生产环境中的应用
如图 2.5所示,这一阶段涉及对机器学习模型和机器学习 SaaS 平台的大规模攻击。在这里,攻击者完全掌握系统级信息、数据和代理模型,这些对执行攻击并影响受害者的业务操作至关重要。
图 2.5 – 当机器学习模型在生产环境中运行时的不同攻击阶段
这一阶段涉及攻击者操控、干扰或破坏数据,以破坏系统完整性并扰乱业务操作。攻击可以从数据篡改活动到涉及制造对抗性数据的技术,以限制机器学习模型无法提供正确预测结果。
策划机器学习(ML)模型攻击
一旦发现和收集阶段完成,攻击者利用他们的新知识,通过训练代理模型并通过向目标模型注入对抗性输入来触发毒化攻击,从而智能地计划并攻击系统(在线或离线)。目标模型作为策划攻击操作的重要资源:
-
收集机器学习工件:一旦攻击者成功收集了网络中存在的机器学习工件信息,他们可能会将其导出,以便立即在策划机器学习攻击时使用。为了减少与收集模型工件相关的风险,请注意以下事项:
-
机器学习模型训练方法应包括所有隐私保护技术。
-
此外,所有访问控制列表(ACL)规则(与相关微服务的 ACL 规则)和加密逻辑应定期审核和重新审视。
-
-
训练代理机器学习模型:攻击者通常训练机器学习模型来创建代理模型,并以模拟的方式触发对目标模型的攻击。这种离线模拟帮助他们从目标模型中获取信息,并在没有更高级别访问权限或特权的情况下验证并发起攻击。
-
复制机器学习模型:在这一过程中,攻击者将目标模型复制为一个单独的私有模型,并将目标模型的推理结果记录为标签,用于训练离线私有版本的模型。这种操作涉及对受害者模型推理 API 的重复查询。为了限制来自同一 IP 的重复请求,防御者可以使用速率限制并将源 IP 列入黑名单,从而限制此类查询以及随之而来的推理次数。
-
毒化 ML 模型:对手可以通过注入毒化数据进行训练或仔细检索模型推理,从前述步骤中生成毒化模型。事实上,毒化模型是受害者端的持久性产物,对手可以利用这一点插入并触发具有完全随机模式和位置的后门触发器,规避后门防御机制,使监控工具难以检测问题并发出警报。
防御毒化攻击的一种机制是使用光谱特征(proceedings.neurips.cc/paper/2018/file/280cf18baf4311c92aa5a042336587d3-Paper.pdf
),它应该能够检测由少数毒化输入子群体所造成的平均值偏差。该算法依赖于这样一个事实:两个子群体的均值与总体方差相比非常不同,因为这两个子群体展示了是否存在正确标记的样本或被破坏的样本。在这种情况下,可以使用SpectralSignature
防御方法对 Keras 分类器进行应用,来识别一个包含错误标记的破坏性输入的子群体,它会返回一份报告(包含键值对索引的字典,作为怀疑毒化样本的异常得分)以及is_clean_lst
,表示训练数据中的每个数据点是否为干净数据或毒化数据:
defence = SpectralSignatureDefense(classifier, x_train, y_train, batch_size=128, eps_multiplier=1, expected_pp_poison=percent_poison)
report, is_clean_lst = defence.detect_poison(nb_clusters=2, nb_dims=10,reduce="PCA")
pp = pprint.PrettyPrinter(indent=10)
pprint.pprint(report)
is_clean = (is_poison_train == 0)
confusion_matrix = defence.evaluate_defence(is_clean)
-
验证攻击:此行为帮助对手根据选择的时机和受害者物理或虚拟环境的可用性来计划、准备并验证计划中的攻击。针对这种攻击的缓解策略很难实施,因为对手可以利用有限查询次数的推理 API,或者创建受害者目标模型的离线版本。这会导致受害者 API 账单费用增加,因为 API 费用直接由他们承担。
-
制造对抗数据:作为机器学习(ML)模型输入的对抗数据可能会被错误分类,增加能耗,或使模型容易失败。白盒优化、黑盒优化、黑盒迁移和手动修改是能够帮助对手生成输入数据样本以规避 ML 架构的流行算法。对手的关键目的是通过挑战 ML 模型的完整性来破坏其运行。
指挥和控制请求
这些操作帮助对手更进一步从受害者的网络中提取有用信息,如下表所示。
项目编号 | 控制操作模式 |
---|---|
1 | 使用可移动介质(例如,通过在主机和目标网络上的其他受损服务之间发起通信),利用不常用的端口-协议对,或部署认证的 Web 服务。 |
2 | 将命令与现有流量混合,通过加密/回退(当主通道无法访问时)/多阶段混淆通道对请求进行编码/混淆,以触发命令,并与目标基础设施动态建立连接。 |
表 2.3 – 不同的控制操作模式
然而,攻击者足够聪明,可以以一种方式进行操作,使得目标网络上的现有防御策略不会触发警报。因此,以下是一些适当的防御技术:
-
启用特别设计的对抗性协议隧道,通过流量信号隐藏开放端口,并利用代理来避免命令与控制服务器与受害者网络之间的直接通信。
-
强烈建议使用前面讨论过的不同的应用层和网络层认证机制以及应用沙箱技术。
-
此外,通过适当配置防火墙来进行网络分段,以限制现有微服务、数据库和代理的外出流量是至关重要的。
-
只应为主机开放授权的端口和网络网关,以便主机通过这些授权接口建立通信。
外泄
在数据收集、加密、压缩和打包之后,攻击者可以通过网络进行外泄(如表 2.4所列),数据可以被打包和压缩成不同大小的块,然后通过命令与控制通道或替代通道策略从网络中传输出去。
项目编号 | 外泄模式 |
---|---|
1 | 自动化外泄(未经授权的信息转移),通过替代协议进行外泄(依赖不同的协议,如 FTP、SMTP、HTTP/S、DNS 或 SMB,而不是现有的命令与控制通道),以及通过现有的命令与控制通道进行外泄(随着时间推移以规避防御) |
2 | 网络媒介(Wi-Fi 连接、调制解调器、移动数据连接、蓝牙或其他射频(RF)通道等) |
3 | 物理媒介(可移动驱动器)或 Web 服务(SSL/TLS 加密) |
4 | 将数据转移到云账户的定时传输 |
表 2.4 – 不同的外泄模式
执行外泄攻击最常见且最简单的方式如下:
- 推理机器学习模型 API 用于外泄:机器学习模型推理 API 访问是攻击者寻找外泄/窃取私密信息的主要途径。
为了缓解外泄风险,以下防御措施是必需的:
-
应该使用应用层隐私技术或最大化利用混合安全措施(应用层和传输层安全)来训练私密数据,以防止个人可识别信息(PII)泄露。
-
数据丢失防护(DLP)API 可用于检测并阻止通过未加密协议传输敏感数据。
-
网络入侵检测与防御系统可以与网络签名结合使用,以监控并阻止恶意流量。
-
通过使用网络代理限制 Web 内容访问可以帮助最小化未经授权的外部访问。
-
规避机器学习模型:对手可以使用传统的网络攻击,采取对抗性行动,避开基于机器学习的病毒/恶意软件检测。
-
拒绝服务攻击(DDoS):在这种情况下,对手的目标是通过发起大量请求,使生产中的机器学习系统崩溃。这些请求可能计算密集,需消耗大量内存、GPU 资源和处理周期,可能导致生产化系统过载,响应变得缓慢。
-
垃圾信息攻击机器学习系统:在这种情况下,对手通过向机器学习系统发送虚假和任意数据,增加输出中的预测数量。这会影响受害者组织的机器学习团队,他们最终需要花费额外时间从数据中推导正确的推论。
-
侵蚀机器学习模型完整性:对手可能通过对抗性数据输入降低目标模型的性能,从而逐渐侵蚀系统的可信度。这可能导致受害者组织浪费时间和金钱,试图修复系统。
-
资源收割成本:这类似于 DDoS 攻击,对手通过针对受害者的机器学习服务发起攻击,通过向系统发送虚假和特别设计的查询,增加计算和运行成本。海绵示例是特制的对抗性输入,旨在提高处理速度和能耗,从而降低受害者系统的整体性能。
-
机器学习知识产权盗窃:在这种情况下,对手从机器学习模型、训练和评估数据集及其相关工件中窃取知识产权,目的是对受害组织造成经济损害。这种行为使对手能够无限制地免费访问受害者的服务,避免机器学习即服务(MLaaS)提供者的 API 费用。
-
系统崩溃:除了一些常用机制外,影响策略(如图 2.5中所示的第三种攻击策略)主要针对生产系统,包括各种不可恢复的数据销毁机制,如用随机数据覆盖文件和目录、篡改数据、篡改外观、清除数据、损坏固件、大规模加密目标系统上的数据,以干扰系统和网络资源的可用性,停止服务的命令、系统关机/重启以及资源劫持,目的是使受害者的系统资源崩溃。
缓解与影响相关风险的理想方式是遵循以下最佳实践:
-
拥有数据备份流程,以防止任何数据丢失/修改尝试。
-
制定模型鲁棒性测试策略,通过彻底测试 ML 模型对海绵攻击的抵抗能力。
-
最坏情况或低阈值边界用于验证模型的鲁棒性,也有助于检测对抗性攻击,其中系统性能的退化是外部来源输入的症状,这些输入并非为该系统设计。
到目前为止,我们已经讨论了攻击威胁矩阵,该矩阵首次出现在 第一章,图 1.13 中,以及针对不同类型对抗性攻击的不同防御机制。
现在让我们研究用于保护敏感数据的数据匿名化和加密技术。
匿名化和数据加密
由于可能遭遇不同的攻击和威胁,组织在保护员工数据权益方面变得更加负责任。2019 年的数据泄露调查显示,79% 的 CIO 认为公司数据在前一年因员工的行为而处于风险中(www.grcelearning.com/blog/cios-increasingly-concerned-about-insider-threats
)。多达 61% 员工的数据安全做法使公司面临风险,这促使组织采纳与数据匿名化相关的最佳实践。本节将讨论组织应遵循的一些做法,以遵守 GDPR 和其他法规。
数据匿名化或伪匿名化需要针对个人身份信息(PII)进行处理,主要包括姓名、年龄、社会保障号码(SSNs)、信用卡详情、银行账户号码、薪资、手机号码、密码和安全问题。
除此之外,公司政策和数据库管理员可以在应用匿名化技术之前定义额外的过程。现在,让我们看看一些最常用的数据匿名化技术。
数据屏蔽
该技术通过随机生成其镜像版本并与原始数据版本混合,来隐藏和保护原始数据。数据屏蔽有五种主要类型的措施,使攻击者难以解密原始数据:
-
确定性数据屏蔽:此过程允许将任何列值替换为表中任何位置的特定值——无论是在相同的行、相同的数据库/模式,还是在不同的实例/服务器/数据库类型之间。它考虑了类似的设置来生成替代的全局盐密钥(这些是加密元素,用于对数据进行哈希处理以确保安全性;例如,网站的 cookies)。例如,XYZ 可以替换为 ABC。
-
动态数据遮蔽 (DDM):此遮蔽技术的目标是对实时生产级数据进行遮蔽,使得实时数据流被修改,同时数据生成者/请求者无法访问敏感数据。通过设置中央数据遮蔽策略,可以使用完整或部分遮蔽功能来遮蔽敏感字段,同时对数值数据进行随机遮蔽。它还广泛应用于简单的事务性 SQL 命令(一个或多个 SQL 命令组合在一起,可以作为单一逻辑单元提交到数据库或回滚)(例如,在 SQL Server 2016(13.x)和 Azure SQL 数据库中)。现在,让我们来看一个在 Azure 中如何进行遮蔽的例子:
Email varchar (100) MASKED WITH (FUNCTION = 'email ()') NULL
在这里,Email
方法使用遮蔽,只显示电子邮件地址的第一个字母和常量后缀.com
,生成如下内容:aXXX@XXXX.com。
然而,动态遮蔽不能应用于加密列、文件流、COLUMN_SET
或没有依赖其他列且没有遮蔽的计算列。
-
即时数据遮蔽:当数据从开发环境被遮蔽,而没有使用暂存环境时,这一过程很常见,原因包括额外空间不足,或数据必须迁移到目标环境的限制。此遮蔽技术常用于敏捷开发流程中,其中提取、转换、加载 (ETL) 能直接将数据加载到目标环境,而不需要创建备份和副本。然而,通常建议不要广泛使用此技术(除了在项目初期阶段),以避免与合规性和安全性问题相关的风险。
-
Julia Gee
转为NULL Fhjoweeww
,andwb@yahoo.com
转为yjjfd@yahoo.com
。 -
合成数据:合成数据是一种数据匿名化技术,旨在保持原始数据集的统计特性,同时在可变隐私增益和不可预测的效用损失之间保持较大幅度的平衡。通过此方法提供的隐私保护能够防止与隐私相关的攻击,并防止个人身份的重新识别。通过生成模型(例如,使用深度学习技术生成深度伪造,其中合成数据再现了类似原始图像的虚假图像)生成的合成数据,确保通过生成与原始数据相似的推理,保持高效用性。
数据交换
该过程通过打乱和重新排列数据,彻底打破原始数据集与结果数据集之间的相似性。有三种常用的数据交换技术:
-
K-匿名性
-
L-多样性
-
T-接近性
这些技术都可以用于使数据的去匿名化对任何入侵者变得困难。
数据扰动
这种数据匿名化原则通过向数据库中的数值数据添加噪声,确保其机密性。添加或乘以随机噪声(加法噪声、乘法噪声,或使用高斯或拉普拉斯分布的随机噪声)有助于扭曲数据,从而保护其不被攻击者解析。
数据泛化
这种方法通过允许删除数据中的某些范围或部分(例如,异常值),使数据变得不容易识别。一个例子是将年龄 45 岁
替换为<= 45
,其中该值被一个更广泛的范围所替代,且在语义上仍然一致。这种数据分区或将属性分配到特定类别的方式可以作为对数据进行泛化的措施。
广义上,泛化可以应用于整个领域级别或单个子领域。在前者中,数据转换发生在通用领域或层次的级别上,而在后者中,泛化级别发生在同一领域的不同子集上。
基于泛化的技术可以进一步应用于分类或离散数值属性,以保持其私密性。泛化可以应用的主要方式有两种:基于层次的方式或基于分区的方式(其中需要在对连续数值属性进行分区方案之前,先对数据项建立分区的结构或顺序)。基于分区的方式将数据项分为不同范围,而基于层次的泛化要求存在泛化层次结构,可用于分类和离散数值属性。以下部分描述了这些泛化技术。
K-匿名性
Sweeney 首次提出了 K-匿名性原则,这可以作为一个框架来评估涉及敏感信息的算法(epic.org/wp-content/uploads/privacy/reidentification/Sweeney_Article.pdf
)。在缺乏 K-匿名性的情况下,敏感属性可能泄露并揭示出信息元素的边界限制。K-匿名性的应用旨在通过泛化或抑制来转换保护元素,以确保数据集不被入侵者获取。
K-匿名性确保任何由单个记录组成的概括性块,无法在任何一组准标识符(如邮政编码、年龄或性别)方面与 K-1 个其他个体区分开。这一匿名化原则有助于防范联结攻击,正如在第一章中讨论的那样。我们看到,在联结攻击中,攻击者能够揭示受害者的身份(如唯一标识号码、信用卡号等),并将其与其他背景信息(如用户的旅行细节,包括出发地、目的地和交通工具)结合起来。这些组合信息可以帮助攻击者追踪用户的整个行踪。例如,针对年龄、社会安全号码(SSN)、国籍、薪资和银行账户等受保护属性,如果 K 值为 10,则每种定义属性的组合将产生至少 10 条不同的记录。
如图 2.6所示,当 K=2 时,记录中有两个为亚洲人,两个为西班牙裔。我们可以看到,在这两种种族中,与年龄和薪资等敏感属性相关的记录数量是相等的。图 2.6展示了一个完整的端到端流程,显示了风险评分评估、信息识别、伪匿名化和匿名化过程,以便审计和存储敏感数据。
图 2.6 – 不同的匿名性模型 – K-匿名性、L-多样性和 T-接近性
该系统的局限性在于,如果攻击者事先掌握关于受害者的任何信息(例如,年龄),那么他们就更容易识别其他属性,如薪资和与疾病相关的信息。例如,南希的朋友可能知道她所属的年龄组和种族,这将使她的朋友能够猜测并获取她的薪水。相同薪资或年龄组的存在使得攻击者可以通过排除法或负面披露的过程推导出敏感信息。攻击者更容易成功发起攻击并充满信心。因此,已经提出了改进 K-匿名性的方法,以防止基于背景知识和同质性的攻击。
L-多样性
L-多样性原则(由 Machanavajjhala 等人定义)旨在处理 K-匿名算法的缺点,以减少同质性和背景知识攻击的概率。L-多样性原则在数据发布者不了解攻击者所掌握的知识的情况下提供隐私保护。L-多样性的基本理念是要求每个组看到等同的敏感值。通过应用贝叶斯推理,已知信息可以被建模为概率分布,从而减少基础数据表示的粒度。泛化的主要目标是获得均匀分布的不同敏感数据值。
当数据分布存在偏斜时,算法的主要限制便显现出来,无法实现每个等价类的 L 个不同敏感值的均匀分布的熵。在这种情况下,表格的整体熵水平下降,算法变得无法运行,无法提供足够的保护。
尽管该算法考虑了每个组内敏感值的多样性,但它未能约束多样化组的值范围和边界。对于边界非常接近的特征(例如,薪资 > 2 万美元与薪资 > 3 万美元),攻击者可以从具有不同年龄组的两个等价类(具有相似边界的类)中检索薪资信息。
T-紧密性
由于 K-匿名性和 L-多样性不能共同防范偏斜和相似性攻击,因此 T-紧密性应运而生,以增强匿名化框架的稳健性。该原则指出,两个分布——其中一个是任何组的敏感值分布(例如,种族组;在我们示例中的图 2.6中的亚洲人和西班牙裔人群),另一个是整体敏感值分布——它们之间的差异不能超过阈值t
。用于评估两个分布之间差异的距离度量是地球搬运工距离(EMD)。它通过评估它们之间的最大距离来计算可能的敏感属性集合。该度量在 0 到 1 之间给出一个值,空间被归一化到 1,旨在包括属性值的语义接近度,以及准标识符的泛化和敏感值的抑制。
尽管T-接近性可以解决K-匿名性和L-多样性的缺点,通过提供免受同质性、背景知识、偏斜和相似性攻击的保护,但仍然容易受到最小性和组合攻击的影响。在前者中,攻击者推断出匿名化模型(K-匿名性、L-多样性和 T-接近性)不能为外部威胁提供足够保护的边界条件或最小性标准。利用这些信息,入侵者可以解密部分等价类的敏感信息。在第二类攻击中,攻击者利用匿名化数据集所有不同版本的可用性将它们集成为一个单一单位,其中统一的数据集用于突破个人隐私。
在其他较不流行的匿名化模型中,有 p-敏感 K-匿名性模型,它确保在p
上的 K-匿名性条件。此外,它还同时阻止学习敏感关联。我们可以将匿名性模型表示为(∊,m
)(敏感属性值频率∊在用户定义的等价类中保持在阈值内)。这设计用于保护敏感数值属性免受接近侵犯,其中数据边界过于接近,使攻击者能够以高信心收集到敏感属性值在指定区间内的信息。
加密
个人数据的加密是一种方法,用于保护数据免受外部来源的侵害,并限制未经授权的用户访问。可以使用对称加密、非对称加密和混合加密这三种主要的数据加密方案来进行密钥生成、注册、使用、存储、监视、旋转和删除。
对称加密技术,如高级加密标准(AES),速度快,并且可以通过处理器加速批量加密。此过程依赖于客户端和服务器之间预共享/交换的单个密钥,用于加密和解密目的。为了支持完整性和认证,可以在此基础上添加消息认证码。
非对称加密方案,如Rivest、Shamir、Adleman(RSA)、数字签名算法(DSA)和椭圆曲线密码学(ECC),使用两个密钥,一个公钥和一个私钥,并且对抗攻击的能力强大。然而,该过程速度较慢,对于在机器学习系统中保护数据的应用有限。通信各方负责秘密存储其私钥,而公钥则是共享的。这些步骤如下进行:
-
使用传输层安全(TLS),发送方和接收方最终确定用于加密发送数据的对称密钥(会话密钥)。
-
发送方负责使用接收方的公钥对对称密钥进行加密。
-
对称密钥由接收者使用他们自己的私钥进行解密。
-
使用对称密钥,接收者对数据进行解密。
现在我们已经概述了一些加密技术,让我们看看假名化的另一个抽象层次的过程,它进一步增加了对手破解加密密钥的难度。
假名化
这种方法有助于对数据进行匿名化,同时保持统计数据和数值的准确性。在此过程中可以使用不同类型的加密和哈希技术。个人身份信息(准标识符)被用假名编码并单独保存,这使得通过交叉引用或标识符容易重新识别原始数据。与匿名化技术相比,这个过程通过替代原则防止永久性的数据替换。假名化也可用于个人身份信息(PII)的加密与解密,其中原始数据被转换为密文,可以通过相关的解密密钥进行反向解密。
这一过程的主要缺点是,当数据集包含数十亿或数万亿条记录时,人工审核和重新评估或重新识别变得不可能。此外,当最敏感的字段需要精确值时,由于隐私与效用的权衡,我们可能会错过潜在的重新识别攻击源。
这一过程进一步允许 PII 的纵向或横向分发(通过将其存储在某些受保护的存储单元中),并保持标识符之间的联系。在纵向数据分发系统中,通过将不同敏感属性子集对应的个人数据分隔存储在不同地点来确保假名性。在横向数据分发系统中,靠近用户位置的站点负责存储具有相同用户属性集的数据。横向数据分发的一个主要例子是与健康相关的信息,在这种情况下,来自不同来源的数据整合是推断个体健康相关信息的初步步骤。
一些常见的假名化技术类型如下:
-
使用秘密密钥加密:个人身份信息(PII)可以使用前面讨论的对称或非对称加密方法进行加密,然后由所有者解密。
-
哈希函数:该函数用于将具有可变特征属性和数据大小的数据集转换为固定大小的输出。此方法往往存在泄露敏感 PII 的风险,如果已知哈希函数应用的输入值范围。为了提供更高的保护,可以使用加盐哈希函数,这种方法通过添加随机化来减少攻击者获取实际值的可能性。
-
带有存储密钥的哈希函数:用于转换的哈希函数将密钥作为输入,这进一步降低了攻击者通过重放攻击(即攻击者拦截网络)来恢复实际数据的概率。数据拥有者仍然可以使用密钥恢复数据,但对于攻击者来说,计算所有种类的排列并生成用于加密的实际密钥变得越来越困难。
-
带有删除密钥的哈希函数:该过程涉及为数据集中的每个特征选择一个随机数字作为伪名。此外,关联表被删除,以减少链接攻击的概率,在这种攻击中,攻击者可以将数据集中的个人数据与其他可用数据集中的其他伪名进行关联。这使得攻击者更难使用所有可能的排列来重放该函数并恢复原始数据。
-
令牌化:这种数据加密方法通过随机生成的令牌将敏感数据转换。这种方法在支付卡行业广泛应用于信用卡、钱包及其他涉及唯一标识符的应用(如 PAN 卡、驾驶证、社会安全号码等)。处理这些机密标识符的组织通常会使用一个令牌化服务,负责通过基于用户身份生成和验证令牌来进行支付授权。生成的令牌可以存储并映射在第三方服务提供商的数据库中。存储服务通过提供无限的数据保存能力来减少数据丢失的风险。第三方服务提供商的介入有助于减少与支付卡行业数据安全标准(PCI DSS)合规性相关的问题。
同态加密
同态加密(HE)因其提供的保护程度,在数据安全行业中获得了广泛关注,尤其是在高端云安全应用的设计中。该技术依赖于概率性非对称算法,并增加了一层额外的保护层,使得没有加密和解密密钥的方无法解密加密数据。与传统加密方法相比,这种方法的主要优势在于,它允许云服务提供商处理已经加密的数据,而无需先解密。处理后的结果以加密形式提供给数据拥有者,后者可以使用解密密钥检索处理结果。
同态加密遵循乘法加密和计算规律,其中加密和计算的顺序可以互换。任何计算,当它应用于数据集 a 和 b,在它们被单独加密为 E(a) 和 E(b) 后,都会得出与加密结果 E(*a ** b) 应用到计算结果时相同的结果。
因此,从数学角度来看,E(a * b) = E(a) * E(b),其中 E(a) 和 E(b) 分别表示对数据集 a 和 b 应用的加密,E(a * b) 则表示对 a 和 b 的计算结果应用的加密。
由于它们是相等的,E(a * b) 和 E(a) * E(b) 的解密值也相等。
图 2.7 说明了同态加密(HE)的一个应用场景,帮助实现匿名数据处理(a)单一用户和(b)多个用户在云服务器上处理他们加密(使用公钥加密)敏感数据的情况。在第一个案例(a)中,个体可以直接获得由服务器计算、评估并返回的解密结果。在第二个案例(b)中,服务器可以通过去除身份信息来聚合个体数据,处理它们的加密数据,推断出统计信息,并将推断的数据发送回负责收集最终结果的第三方来源。第三方来源接收到数据后可以解密并获取推断的结果。
图 2.7 – 单方或多方同态加密(HE)
使用同态加密(HE)的多方代理可以有效地运行电子投票系统。单个选民可以使用他们的公钥加密选票并将其发送到投票服务器。云服务器利用同态计算对加密的选票进行额外的有效性检查,并计算汇总的加密结果。计算出的加密结果可以发送给组织者,组织者可以解密并推导出整体投票结果,而无需了解具体选民如何投票。
图 2.8 展示了使用同态加密(HE)与传统隐私保护方法相比,在隐私保护方法上的变化。在传统的隐私机制中,用户依赖于相关的云存储及其计算设施来进行数据传输、处理和存储功能。客户需要与服务提供商建立额外的信任关系,服务提供商不得在未经客户同意的情况下与第三方共享私人信息。如今,基于同态加密的隐私系统(例如微软的 SEAL 平台)除了加密存储和计算能力外,还能确保完全保护客户数据的机密性。
图 2.8 – 显示传统加密与同态加密(HE)对比的示意图
该方法论还可以高效应用于以下涉及云服务的安全领域:
-
私有存储与计算
-
私有预测服务
-
托管的私有培训
-
私有集合交集
-
安全协同计算
以下代码演示了在客户端实例化一个Pyfhel
对象(包括公钥和私钥),并在上下文中生成和保存公私钥对。contextGen
函数用于根据输入参数生成一个同态加密上下文。我们将公钥与上下文一起保存:
HE = Pyfhel()
HE.contextGen(p=65537, m=2**12)
HE.keyGen() # Generates both a public and a private key
HE.savepublicKey(pk_file)
HE.saveContext(contx_file)
a = 1.5
b = 2.5
ca = HE.encryptFrac(a)
cb = HE.encryptFrac(b)
然后,我们尝试使用PyCtxt
在云端解密加密值(a
和b
)。但如输出所示,解密过程在云端失败。随后,云服务器对加密值进行平均操作,并将其发送回客户端。客户端成功解密结果,并获得平均值(1.5 和 2.5 的平均值是 2)。
云端服务器尝试解密并对客户端发送的加密结果进行数学平均操作:
c2a = PyCtxt(pyfhel=HE_Cl, fileName=sec_con / "ca.ctxt", encoding=float)
c2b = PyCtxt(pyfhel=HE_Cl, fileName=sec_con / "cb.ctxt", encoding=float)
try:
print (HE_Cl.decrypt(c2a))
raise Exception ("This should not be reached!")
except RuntimeError:
print ("The cloud tried to decrypt but couldn't!")
云端计算前一步得到的密文的平均值:
c_mean = (c2a + c2b) / 2
c_mean.to_file(sec_con / "c_mean.ctxt")
客户端加载并解密结果:
c_res = PyCtxt(pyfhel=HE, fileName=sec_con / "c_mean.ctxt", encoding=float)
print ("Client decrypt results", c_res.decrypt())
这会生成如下输出:
The cloud tried to decrypt but couldn't!
Client decrypt results 2.0
让我们看看这种技术何时可能派上用场。
同态加密的应用
同态加密广泛应用于需要强大计算能力来处理大量用户无法访问的敏感数据的场景。一些实际的应用包括基因组学研究、金融、医疗保健、制药、政府、保险、制造业和石油天然气行业的预测与分析案例,以下列表列出了这些应用:
- 利用云服务进行股市交易策略的回测,以确保数据在外部系统(包括攻击者和云操作员)面前仍然安全私密
回测
回测是一种策略,允许交易者利用历史数据模拟交易策略,生成结果并据此识别和分析风险与盈利性,从而在实际投资之前评估风险。
-
与欺诈检测、自动理赔处理和威胁情报相关的机器学习应用
-
基于机器学习的 SaaS 平台通过 DNA 测序分类器分析 DNA,向医疗机构和医院提供预测性洞察
-
基于机器学习的 SaaS 平台提供医疗诊断、医疗支持系统(如健康护理机器人)以及预防性护理
-
基于机器学习的复杂设计和架构模式,用于创新并运行新算法;还可以用于运行航空航天或建筑行业的机械结构分析
-
运行安全拍卖的预测平台
然而,HE(同态加密)的使用存在一些限制,例如数据库上的加密搜索(返回搜索结果而不泄露查询内容)或垃圾邮件过滤加密邮件。在前一种情况下,服务器无法确定搜索查询的内容,这将使服务器进行同态评估整个搜索操作时产生巨大的处理负担和成本。在垃圾邮件过滤的情况下,程序可以生成加密消息列表作为垃圾邮件,但在客户端不知道过滤标准(例如关键词)来判定哪些邮件为垃圾邮件之前,这些垃圾邮件无法被删除。
安全多方计算(MPC/SMPC)
这是在机器学习中用于训练私人敏感数据并创建防风险的机器学习模型的一种安全技术。在这里,参与者可以对私密数据进行计算,并用另一个参与者的私密数据来评估一个参与者的私密模型。
该协议基于秘密共享原理,其中一个分发者可以在 n 方之间共享一个秘密 s。该方案可以保护秘密免受 t 或更少参与者的泄露,同时,t + 1 个参与者的子集可以重建该秘密。参与者会在输出中获得各自的份额,帮助他们通过插值重建实际输出。如果只配置了少数选定参与者来获得其份额,参与者也可以仅将份额发送给相关个体。现在,让我们来探讨一些实际的使用案例,其中使用 MPC 来保护敏感数据。
Google 使用 MPC 来评估广告转化率,通过计算展示广告的用户与最终购买产品的用户之间的隐私保护集交集。一些组织依赖门限密码学而非传统硬件来保护加密密钥。在这种情况下,组织依赖 MPC 来进行密钥生成、计算和存储,而不是允许个人持有私密信息。
这一过程有助于组织保护密钥免受对手的攻击,因为密钥份额被放置在不同的环境中。MPC 对大数据和大规模预测系统最有用的特点如下:
-
它能轻松适应跨平台部署模型。
-
多租户的 MPC 可以作为云原生的密钥管理 服务 (KMS)运行。
-
可以在多个云平台(例如 AWS、Google 和 Azure)上同时运行,以最大化安全性和可用性。
-
支持混合云多站点企业部署。
-
易于扩展。
-
持续的安全操作。
图 2.9 – SMPC – A. Shamir 的秘密共享和 B. 门限密码学
以下代码片段演示了如何使用mpyc
库,通过五个传感器以隐私方式确定飞机的位置。每个传感器使用 SMPC 通信,通过共享秘密来加密敏感信息,如飞机的位置信息和到达时间:
from mpyc.runtime import mpc
secint = mpc.SecInt(l)
scaling = 10**args.accuracy
locations[i] = mpc.input(list(map(secint, position_i)), senders=sender_pid)
toas[i] = mpc.input(secint(toas_i), senders=sender_pid)
x, y, z = await schmidt_multilateration(locations, toas)
在理解了多方通信中使用的不同加密方法以及机器学习模型训练过程中使用的隐私保护技术后,接下来让我们探讨如何在模型的训练阶段应用应用层隐私技术。
差分隐私(DP)
差分隐私(DP)是一种流行的应用层隐私保护框架,用于保护大型数据集中的私密或敏感数据。当在两个几乎相同的数据集上执行统计查询时,该方法保证几乎相同的输出,这两个数据集只在一个记录的存在与否上有所不同。
差分隐私通过隐藏任何单一记录(例如,个人可识别信息(PII))或小群体用户记录对预测结果的影响,提供抵御记录连接攻击的安全性。数据训练过程中对个体记录存在与否的匿名化以及信息可用性的保护,与数据隐私和防止连接攻击密切相关。累积损失定义为隐私预算,也称为ε(ε),表示提供的隐私量,其中低值表示高隐私级别。损失还与效用(准确性)的下降相关,数据科学家的任务是找到两者之间的可接受平衡。
图 2.10 展示了一个启用随机梯度下降(SGD)的差分隐私(DP)训练过程,损失函数的计算、随机噪声的添加以及梯度的裁剪在连续迭代中的过程。当查看该图时,请注意以下几点:
-
使用了从两个不同数据集(D1 和 D2,均∈ S 且仅在一条记录上有所不同)中随机抽取的数据点进行训练。
-
训练误差(或训练损失)是根据模型的预测输出和训练标签计算的,在后续步骤中,训练标签相对于模型参数进行求导。
-
该过程是迭代进行的,计算出的梯度(使用 SGD)应用于模型的参数,同时考虑到每个点在结果梯度中所留下的影响。
-
每个梯度的影响通过裁剪(或界定)梯度来控制。通过随机化过程,向每个数据点添加噪声,从而减少推断某个点是否包含在数据集中的确定性。
-
一旦模型收敛,计算最终的梯度以推导隐私估计,使得O1 – O2 < ε。
图 2.10 – 使用差分隐私在两个输入数据集 D1 和 D2 上训练模型
以下代码片段展示了必要的导入,包括 IBM 的 Diffprivlib
,用于训练基于差分隐私的模型。第一步是导入必要的库,并从网上获取 adult_income
数据集,对于 X_train
,我们只使用第 0、4、10、11 和 12 列,对于 y_train
,我们使用标记为 income <=50K 或 >50K 的列:
import numpy as np
import sklearn as sk
from sklearn.pipeline import Pipeline
from diffprivlib import models
X_train = np.loadtxt("https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data", usecols=(0, 4, 10, 11, 12), delimiter=", ")
y_train = np.loadtxt("https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data", usecols=14, dtype=str, delimiter=", ")
下一个代码片段展示了如何在管道的不同组件中结合差分隐私,如 StandardScaler
、PCA
和 LogisticRegression
。初步步骤涉及缩放特征属性,然后进行降维和机器学习模型分类。
data_norm
参数量化了我们添加的拉普拉斯分布随机噪声,用于生成差分隐私的机器学习模型。bounds
参数定义了数据的边界,并以 min, max 的元组值作为输入,这两个值代表在特征级别聚合后的标量。从 图 2.11 中可以进一步看出,准确度在 ε 从 10^-3 到 10^-1.5 的范围内波动,此后准确度变得稳定。这一观察结果进一步强化了我们的发现:在不影响准确度的情况下,选择准确度与效用之间的可接受权衡值,以增加更高的隐私边际是必要的。
dp_pipe = Pipeline([
('scaler', models.StandardScaler(bounds=([17, 1, 0, 0, 1], [90, 160, 10000, 4356, 99]))),
('pca', models.PCA(2, data_norm=5, centered=True)),
('lr', models.LogisticRegression(data_norm=5))])
dp_pipe.fit(X_train, y_train)
for epsilon in epsilons:
_eps = epsilon / 3
dp_pipe.set_params(scaler__epsilon=_eps, pca__epsilon=_eps, lr__epsilon=_eps)
dp_pipe.fit(X_train, y_train)
现在,当我们绘制结果时,我们得到以下图表,展示了准确度与 ε 的变化关系:
图 2.11 – 一个展示准确度和隐私预算(ε)权衡的差分隐私管道
到目前为止,我们已经理解了 ε 作为衡量差分隐私(DP)模型期望隐私性的重要指标。现在,让我们尝试理解第二个最重要的指标——敏感性。
敏感性
敏感性被定义为单个数据记录对响应数字查询的差分隐私结果产生的最大影响。对于任何任意的函数 f,在两个相邻数据集 x 和 y 上,f 的敏感性 ∆f 可以如下表示:
Δf = max { || f(x) – f(y) ||1 },其中 ||.||1 表示向量的 L1 范数
DP 的属性
差分隐私解决方案具有后处理的基本属性:
-
不变性/鲁棒性
-
可量化性
-
组合性
DP 的不可变性/鲁棒性确保对ε-DP 解决方案执行的额外计算也是ε-DP 的。此外,DP 的可量化特性使得其具有透明性的灵活性(对于数据科学家)。透明性揭示了随机化过程中噪声/扰动的确切数量。DP 算法的这一特征使其在其他传统去标识化算法中具有额外的优势。传统算法隐藏了数据转换过程,因此数据科学家无法解释和分析这些模型的准确性。此外,借助合成特性,可以通过对重叠数据集执行不同的 DP 算法来推导隐私的降级量。例如,在ε1-DP 和ε2-DP 上执行的两个 DP 算法是 DP 私密的,其组合为(ε1+ε2)-DP。
我们现在已经熟悉了在模型训练和推理过程中可以使用的各种隐私和安全措施。然而,这些方法各有其特定的优势,整个系统只有在混合安全支持的系统中才能充分发挥其效益。
混合隐私方法和模型
图 2**.12展示了前面章节中讨论的不同隐私组件级别的集成,以创建一个完全经过验证的隐私保护 AI 系统。2和5与模型所有者的访问相关,而2’和5’则与对抗者的访问相关,他们通过构造对抗数据来窃取重要的模型信息。
系统可以从多个异构设备中摄取数据(1和2),然后触发不同的算法训练(3、6和8)。这种混合系统不仅可以确保数据和算法的主权,还可以遵守伦理、合规、透明性和应用程序的可信度。主要目标是建立一个强大的伦理防御框架,保护单个数据记录免受身份或成员推断攻击(MIAs)的影响,通过识别其在数据集中的存在(2’)。
这一问题通过拥有一个私有 AI 单元来解决,该单元负责通过 DP(在模型训练过程中或模型收敛后)添加应用层隐私、匿名化和假名化(图 2**.12)以保护数据。在这里,DP 算法(使用 SGD 或教师集的私有聚合训练)的随机噪声和正则化可以增强抵御反转攻击的能力。
如我们之前所学,匿名化和假名化仍然为通过特征重新推导和重新识别(2’)提供了去标识化过程的空间,攻击者可以突破查找表。因此,需要采用额外的安全措施来保护不安全的存储。
图 2.12 – 在混合隐私框架中应用不同的隐私措施
为了保护查找表相关的风险,人工智能研究集中于去中心化,其中远程执行成为训练全球模型的核心机制。通过将本地训练的机器学习(ML)模型及其权重、参数和数据(来自移动设备、物联网(IoT)和医疗物联网(IoMT)设备)更新到中央库,从而在全球层面聚合模型。然而,本地模型的权重仍然面临被对手通过中毒或模型反演/重建攻击(5')修改传输参数的风险,在这种情况下可以使用安全多方计算(SMPC)和同态加密(HE)来有效应对现有的威胁。
联邦拓扑中的数据训练去中心化方法正在革命性地改变人工智能行业的隐私格局,因为设备在参与消息传递策略时能够保持主权。通过限制设备持续可用性,参与训练过程并与对等节点共享模型参数,帮助设备在较长时间内维持电池寿命。这不仅为这种联邦训练模式提供了更广泛的应用范围,还增强了数据和模型治理能力,其中可以监控每个设备发送模型参数的时间、收敛情况和性能指标。
FL 带来了在没有加密技术的情况下,模型参数和个人身份信息(PII)可能被对手从节点和通信接口中窃取或重建的潜在风险。因此,本地算法需要加密并安全地聚合,在这种情况下可以使用同态加密(HE)(有或没有差分隐私 DP)来安全地聚合加密的算法。神经网络带来的另一个可行风险是它们的压缩表示。这种压缩格式是通过应用以下机制之一实现的:剪枝卷积层、量化、张量分解、知识蒸馏,或者是所有上述方法的组合。如果没有加密,攻击者将容易执行模型反演或重建攻击,并以高精度恢复机密的模型参数。
你可以在知识蒸馏:原理、算法、应用中阅读更多关于知识蒸馏的内容:neptune.ai/blog/knowledge-distillation
,关于量化的内容请参阅深度神经网络加速的剪枝与量化:综述,arxiv.org/pdf/2101.09671.pdf
该解决方案进一步扩展,包含了安全的多方计算,涉及多个参与实体,每个实体接收加密数据的一部分,以便进行后续处理。这种去中心化的方法消除了完全数据暴露或泄漏的风险,只有通过互相一致的方法才能恢复数据。SMC 也适用于半信任和低信任环境,但该方法的一个要求是各方之间持续的数据传输和设备的持续在线可用性,从而导致额外的通信开销。这对系统的可靠性、冗余性和可扩展性构成了限制,但可以通过为设备设计适当的休眠和唤醒周期来克服,更多内容将在第十一章中讨论。数据科学家应采用整体方法,结合所有讨论的隐私措施来验证预测的机器学习结果的完整性和质量。
对抗性风险缓解框架
本节中,我们将讨论一些新兴的风险缓解框架,这些框架针对模型在训练和服务过程中使用时,输入数据分布或模型架构的特定场景。这些框架在遏制现实世界攻击方面取得了很大的成功。一个例子是疾病识别,其中临床数据集被用于训练相关模型。在这种情况下,攻击者可以通过临床记录推断出某个病人可能患有特定疾病,并且有较高的成功率。
现在让我们讨论如何评估MIA的模型风险,其中对手能够复制主模型功能并触发对抗性攻击。MIA 可以是黑盒攻击或白盒攻击。在黑盒攻击中,攻击者只知道模型输入,并且只能查询模型的预测输出标签;而在白盒攻击中,攻击者知道模型的输入、架构以及模型的内部信息,如权重、偏置和其他系数值。
MIA(成员推断攻击)的目标是推测给定的数据记录是否属于目标数据集。为了构建 MIA 模型,采用影像训练技术生成成员推断的真实标签。图 2**.13 显示了 MIA 的概述。
MIAs 使攻击者能够确定目标模型a的训练集中是否存在特定数据点z。当这种攻击发生在使用敏感数据训练的模型上时,评估个体在数据集中的存在将暴露攻击者敏感的个人信息。MIAs 在独立同分布(IID)数据上表现出色,完全忽视了训练样本中的数据依赖关系,这低估了攻击的表现。这表明,研究应朝着评估漏洞并为相关数据制定防御技术的方向发展,以保护敏感信息。
因此,需要一种风险缓解技术,可以评估和标注存在此类数据依赖关系的机器学习模型(例如,所有成员来自某个特定健康区域(或医院),而非成员来自其他所有区域,或当两者都来自相同来源时)。为了评估这种关联风险,可以使用该框架来访问/测试模型在数据依赖关系存在且模型容易正确推断成员资格时的行为。例如,在 MIAs 的情况下,模型能够预测来自相同种族背景的人是否可能患有某种疾病。
该风险评估框架首先使用公共数据训练一组影子模型,模仿/模拟目标模型的功能。在下一步中,训练一个攻击模型,利用影子模型的输出揭示样本的成员资格状态。在识别阶段开始之前,可以通过将数据集分为成员和非成员(例如,通过聚类算法)来进行划分。
在以下代码片段中,我们使用adult_income
数据集来训练一个影子模型(80%用于训练,20%用于测试数据拆分),并采用 CNN 方法。影子模型和攻击模型使用相同的数据集,在将数据集平分成两部分后进行训练。这个框架的目的是衡量差分隐私(DP)对 MIAs 的有效性。我们可以在最佳目标模型上进行 MIAs,并评估 DP 在不同隐私预算、噪声倍数和正则化值下提供的保护效果。
图 2.13 – 使用启用差分隐私(DP)训练的模型来衡量针对 MIAs 的模型鲁棒性
如图 2.13所示,我们这里使用的影子模型依赖于目标模型的架构和权重。因此,拥有一个白盒模型攻击可以简化我们的工作,因为可以从目标模型中重用相同的架构和超参数。影子模型在影子数据集上训练,以跟踪目标模型并生成训练攻击模型所需的真实标签数据。影子模型的概率输出与真实标签结合,生成攻击数据集,其中攻击数据集的输入根据是否用于训练影子模型,标记为in
或out
。
由于训练集和测试集的数据来源相同,因此攻击准确率大约为 50%。但是,如果目标模型的私有训练数据集与训练影子模型的公共数据集不重叠,攻击准确率将会降低。这个 MIA 攻击模型已经使用RandomForestClassifier
进行了训练。攻击模型可以执行多次攻击,执行次数为n:
-
我们的第一步是使用影子数据集创建一个影子模型实例:
SHADOW_DATASET_SIZE = int(shadow_X.shape[0] / 2) smb = ShadowModelBundle( shadow_model, shadow_dataset_size=SHADOW_DATASET_SIZE, num_models=)
-
在下一步中,我们使用与目标模型相同的参数训练影子模型,并生成攻击数据:
attacker_X, attacker_y = smb.fit_transform(shadow_X, shadow_y.values, fit_kwargs=dict(epochs=epochs, batch_size=batch_size,verbose=1))
-
训练完影子模型后,我们使用
RandomForestClassifier
训练攻击模型:clf = RandomForestClassifier(max_depth=2) clf.fit(attacker_X, attacker_y
-
下一步是评估攻击的成功与否。为此,我们将用于训练的数据点与未在训练中出现的数据点进行区分,并对独立变量和目标变量分别进行处理:
ATTACK_TEST_DATASET_SIZE = unused_X.shape[0] data_in = target_X_train[:ATTACK_TEST_DATASET_SIZE], target_y_train[:ATTACK_TEST_DATASET_SIZE] unused_X1 = unused_X.values.reshape((unused_X.shape[0], unused_X.shape[1], 1)) data_out = unused_X1[:ATTACK_TEST_DATASET_SIZE], unused_y[:ATTACK_TEST_DATASET_SIZE]
-
最后一步是通过比较攻击模型的预测结果与成员标签,来计算攻击测试数据的攻击准确率。攻击数据已按照
AttackModelBundle
的预期格式进行准备:attack_test_data, real_membership_labels = prepare_attack_data(tm, data_in, data_out) attack_guesses = clf.predict(attack_test_data) attack_accuracy = np.mean(attack_guesses == real_membership_labels) print('attack accuracy: {}'.format(attack_accuracy)) acc = accuracy_score(real_membership_labels, attack_guesses) print('attack acc: {}'.format(acc))
这两个模型都是通过 DP 训练的,使用的是DPKerasSGDOptimizer
,它是一个基于SGDOptimizer
的优化器,用于 DP。noise_multiplier
是一个传递给优化器的参数,用来控制采样并添加到梯度中的噪声量。steps
参数表示优化器在训练数据上执行的步数/训练轮数,而l2_norm_clip
参数提供了一种机制,通过考虑每个 mini-batch 中单个梯度的最大欧几里得范数,来调节优化器对单个训练点的敏感度:
optimizer = DPKerasSGDOptimizer(
l2_norm_clip=l2_norm_clip,
noise_multiplier=noise_multiplier,
num_microbatches=int(microbatches_perc * batch_size),
learning_rate=learning_rate)
-
第一项任务是按照前面的代码片段设置优化器。接下来,我们计算每个样本的损失向量,而不是其在一个 mini-batch 中的平均值。如下一个代码片段所示,我们使用 Keras 将模型损失与模型分类器进行编译:
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction=tf.compat.v2.losses.Reduction.NONE) classifier.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])
epsilon 的计算在下一个代码片段中给出。采样概率是使用 batch_size
和输入数据大小的倒数(即 delta)计算的,输入数据集中的大小约为 50,000。概率指标表示单个训练点被包含在小批次中的概率,之后与噪声倍增器一起用于评估 rdp
,最终用于计算 epsilon。这是可以用来判断隐私保障的最终模型指标,通过考虑单个训练记录样本的包含(或去除)如何影响特定模型输出的概率变化。微批次的概念是在 tensorflow_privacy
中引入的(github.com/tensorflow/privacy
),通过提供一定程度的并行性来促进更快的处理,在这种方式下,梯度不再按样本逐个裁剪,而是以微批次为粒度进行裁剪。
该过程可以对微批次中平均的 32 个梯度进行裁剪,每个微批次包含 8 个数据样本:
sampling_probability = batch_size / 50000
steps = epochs * 50000 // batch_size
orders = [1 + x / 10\. for x in range(1, 100)] + list(range(12, 64))
rdp = compute_rdp(q=sampling_probability,
noise_multiplier=noise_multiplier,
steps=steps,
orders=orders)
epsilon = get_privacy_spent(orders, rdp, target_delta=1e-5)[0]
print("Privacy Budget Epsilon", epsilon)
表 2.5 展示了关于 epsilon、噪声倍增器和攻击模型指标的研究。当噪声倍增器的值增加时,epsilon 会减少,这意味着隐私预算会增加。尽管大多数攻击模型指标保持不变,但当 epsilon 从 1.2203 减少到 0.3283 时,攻击准确率下降了 1%。这一点进一步证明了更高的隐私性增强了模型对攻击的鲁棒性(至少在某种程度上)。攻击指标还显示出低精度和高召回率,这意味着存在更多的假阳性(即被误认为来自训练数据集的记录,实际上并非如此)以及正确识别出相关记录在训练数据集中的存在。然而,使用差分隐私(DP)训练的模型仍然不足以抵御 MIA(模型反向推断攻击),尤其是在数据相关时。
Epsilon | 噪声倍增器 | 攻击指标 |
---|---|---|
1.2203 | 0.8 | 攻击准确率:0.5023300438596491 精度:0.5012701733413031 召回率:0.9195449561403509 |
0.6952 | 1.0 | 攻击准确率:0.5006167763157895 精度:0.5004499550044995 召回率:0.6859923245614035 |
1.2203 | 1.2 | 攻击准确率:0.5023300438596491 精度:0.5012701733413031 召回率:0.9195449561403509 |
0.3283 | 1.4 | 攻击准确率:0.49828673245614036 精度:0.4988314480695522 召回率:0.731359649122807 |
0.2523 | 1.6 | 攻击准确率:0.49828673245614036 精度:0.49885352655232507 召回率:0.7454769736842105 |
0.20230 | 1.8 | 攻击准确率:0.49897203947368424 精度:0.49929158401813545 召回率:0.7245065789473685 |
0.16715 | 2.0 | 攻击准确率:0.49780701754385964 精度:0.49852643212377973 召回率:0.7419133771929824 |
表 2.5 – 显示 epsilon 和噪声倍增器变化的表格
模型鲁棒性
模型的鲁棒性是衡量模型性能的标准之一,它考虑到模型输入中不可区分的变化。不同的扰动技术帮助我们比较和基准测试机器学习模型在鲁棒性指标上的表现。Python 包 Foolbox (arxiv.org/pdf/1907.06291.pdf
) 通过生成对抗扰动来帮助确定模型的鲁棒性。这是基于一个事实,即当应用最小扰动生成对抗样本时(例如,图像),它有助于量化模型对预先输入的对抗样本的鲁棒性,并展示模型对对抗攻击的易受攻击性。该框架提供的灵活性使得超参数调整成为可能,从而帮助评估最小对抗扰动,导致输出中的预测类别概率发生误分类。
要使用该工具箱进行不同的攻击,我们需要输入、标签、模型、对抗准则以及衡量扰动长度的距离参数,称为 L1 范数。我们还可以通过复合模型功能进行组合与匹配,其中一个模型的预测结果可以与另一个模型的梯度结合,从而允许我们通过利用基于梯度的攻击启动不可微分的模型。该工具提供了多个准则,用于启动攻击,在这些准则下,给定的输入和标签可以被视为对抗样本:
-
Misclassification:模型输出中错误的预测类别
-
TopKMisclassification:修改对抗输入,以改变原始类别,使其与前 k 个预测类别之一不同
-
OriginalClassProbability:修改对抗输入,使原始类别的概率低于指定的阈值
-
TargetedMisclassification:修改对抗输入,使得预测类别变为目标类别
-
TargetClassProbability:修改对抗输入,以增加目标类别的概率超过阈值
现在,让我们通过以下代码片段来研究必要的导入,这些导入可以触发对 PyTorch 重置模型的对抗攻击:
import torchvision.models as models
import eagerpy as ep
from foolbox import PyTorchModel, accuracy, samples
import foolbox.attacks as fa
import numpy as np
在完成必要的导入后,让我们如下触发攻击:
model = models.resnet18(pretrained=True).eval()
preprocessing = dict(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], axis=-3)
fmodel = PyTorchModel(model, bounds=(0, 1), preprocessing=preprocessing)
images, labels = ep.astensors(*samples(fmodel, dataset="imagenet", batchsize=16))
clean_acc = accuracy(fmodel, images, labels)
print(f"clean accuracy: {clean_acc * 100:.1f} %")
attacks = [fa.FGSM(),fa.LinfPGD(),fa.LinfBasicIterativeAttack(),
fa.LinfAdditiveUniformNoiseAttack(), fa.LinfDeepFoolAttack()]
epsilons = [0.0,0.0005,0.001,0.0015,0.002,0.003,0.005, 0.01, 0.02, 0.03, 0.1, 0.3, 0.5, 1.0]
在前面的例子中,我们观察到以下情况:
-
我们展示了几种攻击,包括 快速梯度符号方法 (FGSM)(扰动所加的噪声与成本函数的梯度同向)
-
Linf 投影梯度下降(白盒类型,攻击者可以访问模型梯度并能更改代码以规避基于机器学习的检测系统)
-
L-infinity 基本迭代方法(通过评估两个图像之间的绝对值差异生成对抗样本,返回所有像素中的最大距离)
-
AdditiveUniformNoiseAttack和DeepFoolAttack(一种基于快速梯度的对抗攻击,通过修改模型分类器为线性分类器,考虑到最小距离以到达类边界)在预训练的 ResNet 模型上执行,改变执行攻击的步数(由 epsilon 表示)
然后,通过改变执行攻击的步数,对预训练的 ResNet 模型执行上述攻击:
for i, attack in enumerate(attacks):
_, _, success = attack (fmodel, images, labels, epsilons=epsilons)
assert success.shape == (len(epsilons), len(images))
success_ = success.numpy()
assert success_.dtype == np.bool
attack_success[i] = success_
print(" ", 1.0 - success_.mean(axis=-1).round(2))
模型的鲁棒准确性可以如下评估。该度量表示在对模型的最佳样本触发攻击时,模型的准确性:
robust_accuracy = 1.0 - attack_success.max(axis=0). mean(axis=-1)
结果如下所示:
图 2.14 – 不同攻击下鲁棒准确率的变化
带约束的模型鲁棒性
通过使用对抗扰动和约束来训练模型,可以增加模型的鲁棒性。添加领域约束(就像在设计网络的人工智能解决方案时一样,例如入侵检测系统)对对手施加了额外的限制和挑战,要求其维持输入特征之间的复杂关系,以便触发和实现攻击。尽管领域约束限制了对手通过生成扰动样本来触发攻击的能力,但对手通常仍然可以创建现实的(符合约束的)示例。研究结果表明,当模型被强制执行约束时(其中约束变量的集合通过可解的线性程序进行优化),模型的鲁棒性得到提升,准确率可提高 34%。设计时考虑约束的威胁模型能够合理评估现实的攻击向量,并成功优化防御性能。
一个相关的例子是基于 AdvGAN 和 FGSM 的防御性能(www.hindawi.com/journals/scn/2021/9924684/
),如图 2.15所示,其中A是没有约束训练的,而B是带约束训练的。
图 2.15 – 使用对抗扰动训练时的模型准确率 A) 无约束和 B) 有约束
模型鲁棒性度量
FGSM、JSMA、DeepFool 和Carlini 和 Wagner(CW)攻击在生成对抗样本和触发对抗攻击方面非常有效,导致预测输出的误分类。在为神经网络输入对抗性输入进行训练的过程中,评估模型鲁棒性的度量方法已经进行了严格的研究。
这项研究提出了改进的鲁棒性度量方法,其中一个度量标准叫做跨利普希茨极值网络鲁棒性(CLEVER),它定义了攻击成功所需的最小失真度的近似下限。这个鲁棒性度量是与攻击无关的(即使是对不同类型的分类器和神经网络(如 ResNet、Inceptionv3 和 MobileNet)进行强大攻击时,也能成功)。研究还发现它适用于连续可微函数到特殊类型的不可微函数——具有 ReLU 激活的神经网络。CLEVER 度量作为比较不同网络设计和训练过程的技术手段。
该算法首先在每个批次中,以独立且均匀的方式生成位于给定样本周围的N个样本,批次总大小是固定的。然后计算每个样本的梯度范数,并评估这些N个样本中最大梯度值。最小值用于确定最大似然估计,进而用于检索分布参数(逆威布尔分布),并最大化这些梯度的概率。
对不同目标类别获得平均 CLEVER 得分。较高的 CLEVER 得分意味着网络具有更好的鲁棒性,其中最小的对抗扰动将Lp 范数提升到更高的值。IBM 提出的这一框架为构建可靠系统奠定了基础,而不需要特定的对抗攻击。
这个 CLEVER 得分可以用来评估卷积神经网络(CNN)的有效性,并帮助我们验证神经网络的抗攻击能力。例如,在任务关键型应用(如自动驾驶车辆)中,分类鲁棒性的评估可以增加人类的信心,并作为合规性和伦理性的重要指标。
如果引入对抗扰动影响了交通标志识别的准确性,并导致限速标志被误分类,那么这将对人类产生灾难性的影响。因此,在大规模部署模型之前,必须评估机器学习模型在合适鲁棒性度量标准下的表现。IBM 提出的这一度量标准考虑了 CNN 网络架构,包括卷积层、最大池化层、批归一化层和残差块,以及常见激活函数,并将每个像素的扰动限制在一个阈值范围内,以确保网络分类不受任何外部攻击的影响。IBM 研究进一步确认,这一度量标准通过每一层输入和输出关系得出一个计算效率较高的矩阵。图 2.16展示了 18 个不同 ImageNet 模型的鲁棒性(由 CLEVER 分数确定)与准确率之间的权衡。近期的研究提出了一个新的防御框架,名为 TRADES(proceedings.mlr.press/v97/zhang19p/zhang19p.pdf
),它优化了对抗鲁棒性,在准确性和鲁棒性之间实现了权衡,为黑盒和白盒攻击提供了强大的抗干扰能力。
研究发现,当深度神经网络通过正则化输入梯度进行训练时,它们变得更加鲁棒且易于解释。梯度正则化指的是通过添加约束来控制输入特征梯度相对于损失函数的变化。因此,除了寻找模型准确率和 CLEVER 分数之间的最佳权衡外,我们还应寻找模型准确率和可解释性之间的最佳权衡。我们还应意识到,深度学习模型的准确性或预测能力较高,而线性模型和广义加法模型的可解释性则更强。按可解释性的大小顺序排列,我们可以这样说:线性模型、广义加法模型、决策树、支持向量机(SVM)、随机森林和神经网络。
图 2.16 – 模型 CLEVER 分数(鲁棒性)与准确率之间的权衡
概要
在本章中,我们已经学习了关于在数据和模型生命周期管理的不同阶段中减轻攻击的不同防御实践。我们讨论了可以用于数据匿名化、去匿名化、使用差分隐私训练机器学习算法以及加密传输方法的不同云组件、技术和措施。在此基础上,我们深入探讨了对抗风险缓解框架(特别是基于开源深度学习的框架),这些框架可以在部署之前测试机器学习模型的健壮性,并将机器学习模型暴露给公共 API。利用现有框架并设计新框架可以提供对抗试图破坏人工智能模型、系统和服务的半诚实或不诚实参与者/对手的韧性。此外,我们还看到了分散化数据存储、FL 以及高效的加密和隐私措施如何作为下一代、潜力巨大的隐私启用系统的设计选择。
在接下来的章节中,我们将探索一些防御管道创建方法、优化策略和指标,以及它们在权衡准确性、可解释性、公平性、偏见和隐私(隐私-效用权衡)方面的能力。所有这些重要参数作为生产安全、私密、可审计和客观设计的值得信赖的人工智能系统的先决条件,使其能够被消费者和决策者普遍接受。
在下一章中,我们将了解到实施正确标准和最佳实践的不同法律和政策,以构建完全符合伦理的系统。
进一步阅读
-
数据脱敏: 它是什么,它如何工作,类型和最佳实践, Cem Dilmegani:
research.aimultiple.com/data-masking/
-
远程机器学习服务中隐私风险的防御框架, 杨白, 余丽, 谢明创, 和樊明宇:
www.hindawi.com/journals/scn/2021/9924684/
-
关于 k-匿名性、l-多样性和 t-接近性技术在医疗数据中的研究. 17, Rajendran, Keerthana, Jayabalan, Manoj, 和 Rana, Muhammad Ehsan. (2017):
www.researchgate.net/publication/322330948_A_Study_on_k-anonymity_l-diversity_and_t-closeness_Techniques_focusing_Medical_Data
-
Dataprof - 确定性数据 脱敏:
www.datprof.com/solutions/deterministic-data-masking/
-
匿名性模型的研究, 卡门·马尔卡诺:
education.dellemc.com/content/dam/dell-emc/documents/en-us/2020KS_Marcano-Study_of_the_Use_of_Anonymity_Models.pdf
-
隐私保护:p-敏感 k-匿名性属性。IEEE 计算机学会,2006 年,94-94,10.1109/ICDEW.2006.116. Truta, T. M. & Vinay, Bindu.(2006):
www.researchgate.net/publication/4238176_Privacy_Protection_p-Sensitive_k-Anonymity_Property
-
MITRE ATT&CK:
attack.mitre.org/#
-
De-Pois:一种防止数据投毒攻击的抗攻击防御方法。Chen, J., Zhang, X., Zhang, R., Wang, C., & Liu, L.(2021):
arxiv.org/pdf/2105.03592.pdf
-
设计带有差分隐私的访问控制, Wood, Alexandra, Micah Altman, Kobbi Nissim, 和 Salil Vadhan.(2020):
admindatahandbook.mit.edu/book/v1.0/diffpriv.html
-
带有差分隐私的机器学习在 TensorFlow中:
www.cleverhans.io/privacy/2019/03/26/machine-learning-with-differential-privacy-in-tensorflow.html
-
匿名化与 假名化 指南:
ispo.newschool.edu/guidelines/anonymization-pseudonymization/
-
用于安全和可解释机器学习的 Python 库, Melis, M. Demontis, A., Pintor, M. Sotgiu, A., Biggio, B.secml:
arxiv.org/pdf/1912.10013.pdf
-
评估神经网络的鲁棒性:极值理论方法, Weng, Tsui-Wei 等人:
openreview.net/pdf?id=BkUHlMZ0b
-
Foolbox:一个用于评估机器学习模型鲁棒性的 Python 工具箱。可靠机器学习在野外研讨会,34 届国际机器学习会议, J. Rauber, W. Brendel, 和 M. Bethge:
arxiv.org/pdf/1707.04131.pdf
-
领域约束的鲁棒性。CCS '21: 2021 年 ACM SIGSAC 计算机与通信安全会议论文集, 瑞安·谢茨利,布莱恩·霍克,埃里克·保利,约翰·贝金,迈克尔·J·韦斯曼,帕特里克·麦克丹尼尔:
arxiv.org/pdf/2105.08619.pdf
-
L-多样性:超越 k-匿名性的隐私保护,ASHWIN MACHANAVAJJHALA DANIEL KIFER JOHANNES GEHRKE,
www.cs.rochester.edu/u/muthuv/ldiversity-TKDD.pdf
第三章:关于可信 AI 的法规和政策
本章概述了各国在组织和公司开发大规模人工智能解决方案时,通过的与采纳伦理 AI 实践相关的法规和法律。本章的主要目标是帮助您理解负责任 AI 的基本原则,以便您了解如果未遵守法规,可能面临的法律后果。您还将了解到与 AI 应用相关的不同风险级别,以及基于潜在风险接受或禁止 AI 系统的含义。此外,您将了解常见的倡议、行动和指导方针,这些措施致力于消除对不同少数群体的偏见。除此之外,本章还研究了政府在设计公平机器学习解决方案时所面临的问题和障碍,并提供了构建大规模可信 AI 解决方案的推荐措施。
本章将涵盖以下主题:
-
各国通过的法规和执行措施
-
针对儿童和少数群体的特别法规
-
可信 AI 的下一步
不同权威机构下的法规和执行措施
对 AI 的监管仍然是一个初步领域。许多国家和组织提出了关于如何在不同行业中监管和执行与 AI 采纳相关的法律和规则的建议。在本节中,我们将讨论不同权威机构提出的旨在强制执行 AI 系统无偏实施的法规。
欧盟的法规
2020 年 10 月 20 日,欧盟(EU)欧洲议会通过了三项决议,主要目的是:
-
为伦理方面的人工智能(AI)、机器人技术、自动化以及其他影响普通人日常生活的变革性变化,开发一个结构化的基础性系统
-
制定一个负责任的民间机构来评判上述影响并决定惩罚措施
-
制定应对 AI 系统在知识产权方面所带来的挑战的策略
第一项决议为欧盟提供了突出人本中心和人类创造的 AI 方法精髓的机会。第二项决议促使欧盟主动通过引入适用于不同类型风险的比例性和灵活规则,来应对 AI 系统带来的风险。这些风险被分类为以下标签:不可接受的风险、高风险、有限风险和最小风险。此外,根据风险的严重性,也有不同的责任规则。
然而,最后一项决议,专注于人工智能技术发展中涉及的知识产权问题(ai-regulation.com/news-eps-resolutions-on-ethical-framework-civil-liability-and-intellectual-property-rights-for-ai/
),仍然未得到解决。
草案中的这些人工智能规则是统一的(意味着它们适用于整个欧盟),并不会直接影响欧盟以外的国家,但它们会产生一定的跨境影响。例如,所有在欧盟提供人工智能服务的国家都必须遵守这些规则,正如通用数据保护条例(GDPR)一样。欧盟的人工智能法规对以下方面具有跨境效应:
-
向欧盟市场推出人工智能产品、解决方案和服务的提供商(无论服务来源于何处,且无论服务提供者是谁)
-
在欧盟内使用人工智能系统的消费者
-
位于欧盟以外地区的人工智能系统提供商和消费者,这些提供商和消费者使用位于欧盟内的服务
欧盟对人工智能系统的治理给予了特别的重视。它还强调了规范消费者使用的算法驱动系统的重要性。这可以解决与隐私相关的问题,尤其是在生物识别系统方面。实质上,欧盟法规的目标如下:
-
确保欧盟市场上的人工智能系统安全,并遵守现有的基本权利和更广泛的欧盟价值观
-
确保法律明确,有助于人工智能的投资与创新
-
确保执行保护人们权利和安全的法律,以适用于人工智能系统
-
确保存在一个安全可信的人工智能应用单一市场,使人们能够信任这些应用
这些法规为欧盟的人工智能提供了一个新的法律框架。该框架建立了关于人工智能系统开发、市场投放和使用的规则,采用了比例原则和基于风险的方式,并设有具体的限制,以保护人类免受伤害。这些规则旨在创建一个开放、连接的社区,既能从人工智能技术带来的回报中受益,又能保护公民的安全。
其他国家通过的提案/法案
与欧盟类似,其他国家也已尝试对人工智能进行监管。美国、澳大利亚和电气与电子工程师学会(IEEE)通过/提出的法规在这方面值得关注。
美国的人工智能法规
在消费者金融领域,为了消除 AI 算法中的偏见,美国政府通过了两个受到关注的主要法案:平等信用机会法(ECOA)和公平住房法(www.brookings.edu/research/an-ai-fair-lending-policy-agenda-for-the-federal-financial-regulators/
)。ECOA 规定,禁止贷方发布、批准或许可歧视种族、肤色、宗教、国籍、性别、婚姻状况和年龄的信贷交易。即使是允许歧视那些可能接受来自公共或政府部门收入的人,或有合法就业权的人,也会被视为违反该法案。同样,公平住房法针对销售、出租房产或分配按揭时的任何歧视行为发布了禁止令。这两项法案旨在禁止差别对待和差别影响,即偏见可能有意或无意地出现。
图 3.1 – 来自 Zillow 住房愿望报告的图表,展示了在年轻人和黑人社区中观察到的住房歧视
如图 3.1所示,该法案旨在消除在寻找住房时对黑人、西班牙裔、亚洲裔和其他少数民族社区的歧视,在这种情况下,住房管理部门和房东更可能偏袒白人,选择他们作为潜在租户,而不是具有同等资格的少数群体。
联邦贸易委员会(FTC)提出了一个关于真相、公平和公正的提议,旨在确保任何组织希望推广并销售给客户的基于 AI 的服务都符合这些标准。FTC 备忘录明确表示,FTC 的权限将根据《FTC 法案》第五条行使。结合公平信用报告法(FCRA)和 ECOA 的实施,这应该有助于遏制偏见算法的应用。
FTC 主席丽贝卡·斯劳特一直是经济公正的突出声音,提出了与基于算法的偏见相关的担忧。FTC 进一步警告,企业可能会因 AI 系统的偏见和不公平预测而面临 ECOA 或 FCRA 下的严厉惩罚,甚至起诉。FTC 最重要的指导方针是,组织必须对其开发和投入实践的算法保持透明和负责。
美国商务部(DoC)等其他机构也感受到了对无偏见系统和明确风险管理框架的需求。2021 年《国防授权法案》的通过为可信赖的人工智能领域注入了新的动力。这促使美国国会要求国家标准与技术研究院(NIST)制定“可信赖 AI 系统的自愿风险管理框架”。这一举措催生了AI 风险管理框架(AI RMF),为组织制定了管理 AI 系统带来的风险的最佳实践。同时,它帮助组织在公平性与准确性、隐私与准确性、隐私与公平性之间做出合适的权衡。商务部还根据 2020 年《国家人工智能倡议法》成立了国家人工智能咨询委员会(NAIAC)。该委员会的主要任务是研究美国人工智能的现状,评估人工智能领域的能力与科学水平,并相应地提出建议,以增加历史上被忽视群体的机会。
图 3.2 – 在黑人成年人中观察到的医疗歧视
一再地,将社会福利仅限于特权群体对社会产生了负面影响。如图 3.2所示,限制少数群体的机会不仅阻碍了为黑人成年人提供社会设施,还导致了剥夺他们获得充分医疗设施和享受平等待遇的权利。NAIAC 在打击这种歧视方面变得更加警觉,以促进平等和公正。如果不采取行动促进公平与公正,我们的社会将继续创造出偏见的数据集,从而生成偏见的机器学习模型。社会缺乏公平和公正会导致对少数群体的更多歧视,限制他们获得优质教育、医疗、职业晋升等机会。前述图表(摘自www.kff.org/report-section/kff-the-undefeated-survey-on-race-and-health-main-findings/
)展示了在美国,黑人社区在获得优质服务方面比白人社区的差距百分比。
为了促进欧盟与美国之间的贸易与技术合作,欧盟-美国贸易与技术委员会(TTC)发布了首次联合声明,以促进利用人工智能并推动普遍人权的变革性系统的开发。如果没有此类行动,偏见的系统将滋生对普通人的尊重和公正的丧失。
其他可信赖的人工智能倡议已由联合国教育、科学及文化组织(UNESCO)、经济合作与发展组织(OECD)以及欧洲委员会提倡。OECD 一直是欧盟政府在分析和衡量人工智能技术及应用的社会经济影响方面最重要的支持者。此外,OECD 积极与政策制定者和监管者合作,增加对弱势群体的机会,对人工智能系统进行分类,并评估风险、公平性、透明度、安全性和问责制,以便在跨国界的人工智能实践中保持一致性。
白宫科学技术政策办公室(OSTP)由国会于 1976 年设立,发布了 10 项原则,以供在监管和非监管方法中考虑,以推进和应用人工智能:
-
使用最佳实践构建系统和框架,帮助增强公众的信任、信心和信仰。
-
确保人工智能标准和技术方面的教育和工具到位,使人们更有可能参与并交换关于大规模、生产化人工智能系统的实际经验。
-
在任何形式的输入(如影响人工智能模型预测的数据)中,融入最高水平的科学诚实、道德和正义。
-
在商业单位之间以协作方式开发透明的风险评估和风险管理方法,以便相互学习伦理问题并采取积极行动。
-
预测生产系统实际使用人工智能的正负影响相关的成本。
-
分析绩效指标,采用动态学习方法,了解并调整系统行为和数据。
-
评估并制定促进公平所需的标准,通过消除任何形式的偏见和歧视来优化人工智能系统。
-
使用透明度工具赢得公众信任,并确保设计安全可靠的系统。
-
建立定期检查点,确保能够用于构建安全、公平系统的无偏见人工智能数据的机密性、完整性和可用性。
-
支持协作、伙伴关系和跨部门团队合作,确保人工智能政策的一致性和可预测性。
美国在调查当前人工智能解决方案中的漏洞方面非常积极,并提出了初步提案以遏制歧视。《人工智能权利法案蓝图》由白宫于 2022 年 10 月发布,是保护个人和社区免受人工智能驱动技术威胁的一个重要步骤。
拜登总统希望通过确保在所有决策过程中纳入尊重美国公民权利的公平原则,消除不平等现象,从而在美国实现机会平等和根本的公正。在他的支持下,OSTP 提出了五项尊重公民权利、民权和隐私的原则。它将捍卫言论自由和投票权,并禁止歧视性做法。通过在公共和私营部门保护公众的私人数据,这些指导原则旨在提供一个可应用于自动化系统的结构化框架。为了在教育、住房、信贷、就业、医疗保健、金融服务、安全、社会服务、商品和服务的非欺骗性信息以及政府福利等领域提供机会平等,已制定以下五项基本原则。
安全有效的系统
本原则的目标是保护公众免受不安全或无效系统的影响。需要有审计流程,以验证由领域专家和不同社区的利益相关者评估的风险。此外,本原则还规定了 AI 系统的风险缓解最佳实践以及 24 小时监控。通过遵循严格的、领域特定的标准,自动化系统应能够预防不可预见的危险并确保公共安全。
算法歧视保护
本原则的目标是积极防止算法歧视。这不仅可以防止与种族、性别(包括怀孕、健康状况、双性人身份和性取向)、性别认同、宗教、年龄、国籍、残疾、退伍军人身份、基因信息及其他人口统计和社会状态的差异相关的无理差别待遇,还可以确保采取持续的措施为每个人提供公平对待。
数据隐私
本原则的目标是确保在数据收集、使用、访问、传输和删除过程中建立足够的保护措施和安全标准,以避免任何数据隐私侵犯。该原则要求设计师和开发者在进行数据处理前,征得客户的适当许可,以充分尊重用户的隐私选择。
通知和解释
本原则的目标是提供透明、真实和最新的系统功能文档,并对各个系统组件进行充分描述。此外,系统应在调整变更带来的风险等级后,通知公众系统功能的任何变化。
人工替代方案和备用方案
本原则的目标是确保在自动化系统失败时能够快速切换到人工替代方案。在这种情况下,公共安全至关重要,因此备用方案可以确保公平、可及和有效的功能,而不会产生任何有害影响。
印度的 AI 监管法案
印度国家软件与服务公司联合会(NASSCOM)提出的《负责任的人工智能提案》引入了一种许可概念(称为负责任的人工智能许可证(RAIL)),旨在保护开发者的 AI 源代码免受恶意使用。此外,这些许可证提供了一种方式,限制代码在不公平、偏见或对社会造成危害的情况下被误用。除了许可外,NASSCOM 还强调通过仪表板在内部和外部沟通风险,在不同利益相关者(如高级领导、法律专家、数据科学家和 DevOps)之间协作关于负责任 AI 的指标和法规遵从。通过可视化工具、仪表板、内部审计和主动向用户沟通隐私风险的透明度,是 NASSCOM 遏制 AI 伦理和社会风险的首要任务。
NASSCOM 还强调了在创建无偏模型时数据集验证和确认的以下方面:
-
确定模型中主要元素、其重要性以及支配模型结果的学习参数。
-
通过公平且具有代表性的数据集评估模型在所有人口群体中正确预测结果的能力,确保任何特征都不会出现偏差。
-
评估目标变量及其与当前数据特征的任何关联,这些关联可能会产生积极或消极的影响。
-
确保法律合规。按 GDPR 中所述收集经授权的数据,并组织及时的审查/审计。这包括签订数据处理协议,声明收集的数据的可能用途。
-
确保收集的最低限度数据,以避免第三方未经授权使用数据,从而最大限度减少隐私攻击。
-
在收集独特数据时遵循特别的指导原则。对于像欧盟的 GDPR 这样的法规,包含政治信仰、性取向和宗教信仰等数据的独特或特殊数据集,未经事先同意不应导致数据的非预期使用。
-
通过跟踪数据管理生命周期并保持最新信息,防止数据被未经授权使用。
NASSCOM 提出了数据收集、研究人员培训、误差估算评估指南以及数据集同行评审的最佳实践。它强调了在算法处理过程的预处理、处理中和后处理阶段,减少歧视带来的危害的重要性。推荐使用本地、全球、基于属性和因果的解释(在第九章《模型可解释性》一节中讨论),以评估公平性和透明度。NASSCOM 采纳了欧盟法规提出的建议。NASSCOM 还提供了部署生产级应用程序的最佳实践,包括以下内容:
-
使用反事实分析来理解某一特征因其他特征的主导作用而可能被超越或扰动对特定数据点的影响。这有助于分析特征如何影响预测结果,例如一个贷款申请被模型拒绝,而如果申请者的收入高出 10,000 美元,模型原本会接受该申请。
-
使用强大且安全的部署工作流程来处理高负荷和突发情况,确保生产系统不出现任何停机。一个良好管理的安全管道应能在极端环境下维持 AI 系统的稳定。
-
使用持续集成与持续部署(CI/CD)管道来监控和重新训练模型,以应对数据漂移。目标是建立反馈渠道,并设立升级链,确保在实际中能够实现值得信赖和可扩展的部署。
澳大利亚的 AI 监管法案
澳大利亚还提出了有关伦理 AI 监管的原则和实践,不仅为了建立公众对 AI 驱动产品和组织的信任,还为了推动客户对 AI 驱动服务的忠诚。在澳大利亚的监管框架下,AI 的结果应当朝以下目标发展:
-
人类、社会和环境福祉:AI 驱动的决策系统和架构应当为了个人、社会和环境的利益而运作。它们应该赋能人类,提供足够的数据以做出明智的决策。此外,单单依赖机器无法实现整体的社会和环境福祉。因此,应该支持适当的审查机制,如人类参与、人工监督和人类主导的方法。这些明确的流程涉及整个机器学习过程的优化,并且有来自人类的积极反馈。通过使用人类干预方法,任务如注释、主动学习、迁移学习和逐步优化变得更加容易,因为机器与人类能够有效且协作地共同工作。
-
以人为本的价值观:AI 的预测应尊重人权、道德、多样性和个人的自主性。它们应当造福全体人类,包括未来的世代和其他生命体。设计选择和参数应当采用可持续和环保的技术,仔细评估并认证 AI 系统是否考虑了所有可能的有害影响。
-
公平性:基于 AI/ML 的系统应设计得包容性强,便于残障人士访问。无论是残障人士、社区还是群体,系统的可访问性选项都不应存在不公平的歧视。这是防止不公平和偏见系统的关键目标,否则可能会导致多个负面影响,从无视和忽视弱势群体到加剧偏见和歧视。如图 3.3所示(来源:
sitn.hms.harvard.edu/flash/2020/racial-discrimination-in-face-recognition-technology/
),四种主要的面部识别算法在较深肤色女性上表现较差,错误率比较浅肤色男性高出 34%以上。将公平性引入 AI/ML 算法的目标,不仅是消除对肤色或性别的偏见,还包括通过确保所有人都能获得访问权限,推动多样性的发展。
图 3.3 – 面部识别技术在较深肤色女性和男性群体中的准确度较低
-
隐私保护和安全:AI 系统应具备强大的安全政策,以保护任何个人的隐私权利。应特别强调各种数据保护,从数据摄取到构建机器学习模型,以确保数据的安全。除了隐私和数据保护外,还必须确保充足的数据治理机制。在数据的质量、完整性和合法访问方面,数据血统和数据治理起着至关重要的作用。
-
可靠性和安全性:AI 系统不应偏离其既定目标,应可靠地按照预定目的和充分的韧性与安全性运行。它们需要安全、准确、可靠且可复现。此外,它们应设计有应急计划,以便在违反服务水平协议(SLA)或在操作过程中出现故障时,能够恢复到先前状态(基于定义的检查点)。此类恢复活动还应可靠、安全,以减少和防止无意的伤害。
-
透明性和可解释性:AI 系统应具有透明性、责任性,并且易于人们理解。人们应该能够轻松识别任何模型输出结果的原因。透明的数据和 AI 模型应具有可追溯性,从而可以推断出当前和过去的结果,并且原因应以简单的语言向相关利益方进行解释。这是企业和个人的主要需求之一,旨在让人们了解系统的能力和局限性。
-
可争议性:当预测型 ML 模型/AI 系统的结果显著影响社会,进而影响个人、社区、群体或环境时,应当有及时的审计过程。审计过程提供了一种机制,能够从公平性角度分析模型结果。人们甚至应当有权挑战 AI 系统的使用或结果。
-
问责制:负责不同阶段的 ML 模型的人员应当是可识别的,并对 AI 系统的结果负责,同时应当为这些 AI 系统提供人工监督。算法、数据和设计过程的审计性与评估在其中起着关键作用,特别是在关键应用中。
相同的伦理原则(包括隐私和公平)于 2021 年由印度的 NITI Aayog 提出。该提案重点关注通过持续监控确保 AI 系统的安全性和可靠性。
IEEE AI 监管指南
IEEE 的《伦理对齐设计:以优先考虑人类福祉为目标的自主和智能系统愿景》文件首次发布于 2019 年,列出了与 AI 伦理问题和缓解策略相关的八个关键方面。这些关注点,如图 3.4所示,包含了为构建伦理对齐设计框架和平台奠定坚实基础的原则:
-
可持续发展
-
个人数据权利与数字身份代理
-
责任追究的法律框架
-
教育和意识政策
该系统作为增加人们对数据驱动的 AI 系统信任的指南:
图 3.4 – 负责任的 AI 的基本支柱
我们已经了解了伦理系统的基本构建块。现在让我们讨论不同组织之间如何合作,帮助我们利用 AI/ML 的力量来应对整个群体的需求。
针对儿童和少数群体的特殊规定
基于 AI 的预测分析和画像展示了与少数群体机会和发展的许多局限性。为了促进社会福利设施(例如改善儿童使用的设施),对过去不同案例的研究进行了广泛的统计分析,数据来源包括公共福利数据、医疗记录和司法信息。研究和详细调查表明,模型输入数据存在广泛的变化/不一致,记录的数据不系统,验证标准的应用也不一致。
随着欧盟委员会的草案法规和各国提出的监管建议,监管机构已开始着手将这些建议转化为数字空间的规范。相关机构在提出新的监管框架方面发挥了重要作用,涉及的领域包括机器人学、物联网、物联网医疗、区块链、虚拟现实、军事、自动驾驶车辆等技术的应用。关键目标是通过应对这些系统带来的风险,建立人工智能供应商和用户之间的信任。
聊天机器人是现实世界中人工智能系统的一个实际例子。在某些情况下,它们给患有发育障碍的儿童带来了更大的风险,因为聊天机器人无法识别儿童的障碍,因此无法识别求助的请求。聊天机器人也无法为儿童提供足够的建议。2018 年有一个实例被记录下来,并由 BBC 向公众分享(www.bbc.com/news/technology-46507900
)。该报告展示了两个心理健康聊天机器人未能捕捉到儿童报告的性虐待案件。尽管该聊天机器人是专为儿童设计的,并被认为对儿童是安全的,但它的混乱反应给年轻用户带来了额外的挑战。
这并不是聊天机器人面临的唯一问题。聊天机器人带来的隐私威胁包括伪装(冒充他人)、篡改数据、数据盗窃以及易受网络攻击。安全性和公平性是人工智能伦理的主要考虑因素,当聊天机器人根据最佳匹配的关键词回应时,表现出偏见,这引发了伦理学家的关注。理想情况下,当输入与其库中的词语完全不匹配时,聊天机器人不应给出偏见的回答,而应通过学习并更新字典来应对输入。因此,教育社会组织以及生产商和公司了解人工智能解决方案的副作用,已成为人工智能伦理学家的首要任务。此外,儿童权益倡导者对聊天机器人中的数据保留政策和与父母同意相关的问题提出了质疑,因为一些聊天机器人依赖存储的语音记录来不断学习和回应。历史数据已被发现强化了系统性偏见,并在儿童中引入了歧视。因此,专家们必须验证个体档案,并阻止个体受到人工智能系统代理的偏见影响。
隐私倡导者对数据隐私越来越关注,并谨慎地采取措施,警告政府的大规模监视活动、执法活动、审查活动以及其他基于调查的工具。在没有同意的情况下,不能收集个人的私人信息,因为这些信息可能被用来识别、分割、调查和压制社区。
缺乏对生物识别数据收集过程、参与收集过程的人员、存储方法及技术应用的了解,可能会破坏人们对 AI 的信任。一些案例展示了少数群体数据的有限性,这些案例引发了与公平性相关的问题。AI 伦理学家对面部识别软件的成功率提出质疑,尤其是对于儿童和有色女性等群体。已知偏见训练数据集会促进社会偏见,导致对少数群体的歧视或进一步的不利影响。
促进少数群体的平等。
停止偏见流入 AI 系统至关重要。偏见会妨碍系统支持少数群体(包括儿童)发展的不同路径。值得信赖、平等机会导向的 AI 系统应避免刻板印象,为每个孩子(包括女孩和 LGBT 儿童)提供可能性。一些围绕儿童、少数民族和 LGBT 人群的行动包括以下内容:
-
优先考虑所有弱势群体的公平与非歧视,包括儿童、黑人群体和 LGBT 人群。
-
保障儿童数据和隐私权,以确保他们的安全。
-
提高儿童数据的透明度、可解释性和问责性,以确保儿童的道德权利和尊严得以保护。
-
赋能政府和企业,提升他们对 AI 和儿童权利的知识。
-
通过教育准备少数群体,使他们意识到在大规模部署时,偏见 AI 解决方案可能带来的有害影响。
-
支持并培育个体才能的 AI 驱动生态系统,以实现其最大潜力。这需要消除任何针对儿童或特定群体儿童的偏见,这些偏见直接或间接导致了偏见对待。
AI 必须面向所有人,包括所有儿童;同时,在 AI 世界中必须确保隐私得到保护。
教育倡议
已组织的教育机构、教育机构和数据专业人员的倡议是让人们意识到 AI 系统及其风险水平的第一步(www.orrick.com/en/Insights/2021/07/AI-Tips-10-Steps-to-Future-Proof-Your-Artificial-Intelligence-Regulatory-Strategy
)。
这类教育项目的主要目的是教育人工智能从业者如何识别高、中、低风险,并采取适当的行动来评估人工智能模型的预测能力。
识别和评估系统的风险等级
高风险人工智能系统应禁止用于公共领域,其使用可限于研究和未来的改进。这些应当被禁止的人工智能系统包括:
-
通过其设计(如用户界面)、架构框架和人工智能模型操控人类行为、观点或决策,这可能导致对个体的不利决策。
-
基于受保护属性(如性别和种族)对个人或群体进行预测。
-
对所有个人进行不加区分的监控,不考虑受保护属性。一般监控可能导致对个人的监视、间谍行为或跟踪,而无需获得用户同意。
除了实施最佳实践外,我们还应能够识别高风险系统。除了普及公众教育外,我们还需要教育经验丰富的数据专业人士,他们正在构建大规模的机器学习系统。只有这样,我们才能防止默认预测“船长”是男性。例如,要做到这一点,我们需要消除概率偏见,如下图所示,这是针对词嵌入模型的一个示例(developers.googleblog.com/2018/04/text-embedding-models-contain-bias.html
):
图 3.5 – 更高的概率预测“船长”为男性
如你所见,模型预测“他”这个代词在此情境下更可能是合适的。
理解高风险系统
被分类为高风险的系统使政府和相关部门能够采取措施,如增加安全技术和进行审计,以识别风险。被认定为高风险的人工智能系统包括以下几种:
-
在公众可访问的空间内进行远程生物识别。
-
作为关键公共基础设施网络运作中的安全组件。
-
优先调度紧急服务,如消防员和医疗援助。
-
通过入学考试和其他成绩评估,决定 Merit 访问权限并将个人分配到教育和职业培训机构。
-
评估与招聘、晋升、奖励及任何类型合同关系终止相关的绩效。
-
评估个人的信用 worthiness,以认证其资格获得福利、资助和服务。此原则旨在通过减少例如向黑人和西班牙裔人群分配更高抵押贷款利率的可能性,避免个人信用 worthiness 的不一致,正如图 3.6所示。
图 3.6 – 一个偏见系统导致某些少数群体支付更高的抵押贷款金额
-
评估个人风险并利用预测积极管理这些风险。核心目标是确定个人提供信息的真实性。透明且可靠的系统应当包含适当的验证机制,以防止、调查、侦测或起诉犯罪行为。
-
作为犯罪或社会动荡事件的预测系统,评估并分配监控和监视资源,作为详细刑事调查的一部分。
-
审查并启用处理庇护和签证申请及相关投诉,以确定个人进入特定国家/地区的资格,例如欧盟。
-
协助法律系统,如法庭上的法官,但不包括辅助任务。
-
在战区部署无人机之前,访问安全指标。当前的一个例子是乌克兰-俄罗斯战争,俄罗斯部队已经测试了新的“蜂群”无人机。这属于军事伦理的范畴,评估这些自动化武器的准确性,这些武器能够跟踪并击落敌方飞行器。
这类高风险系统要求用于构建机器学习模型的训练和测试数据集必须使用真实且公正的表示。这是为了确保足够的透明度,以便理解其输出,并且需要包括适当的人机交互工具。此外,这些系统要求在整个生命周期内保持一致的性能和系统监控,并确保高精度、鲁棒性和安全性。非高风险系统也应接受国家级的测试和试点方案。
欧盟法规强调了对人工智能系统进行伦理风险评估程序的重要性,尤其是当预见到滥用行为并且由于应用知识有限、控制失效以及与机器人应用相关的风险而产生风险时。风险评估框架应当将与人类执行任务相同的可接受风险标准应用于基于人工智能的机器人应用。欧盟法规设定的标准鼓励公众和利益相关者参与机器人开发;人工智能模型和机器人设计中的一些关键考虑因素如下:
-
禁止设计会对社会造成伤害的 AI 系统和机器人。这样可以确保人类发明和制造的 AI 设备不会伤害人类。机器人应该是安全的,并且设计用来服务于其预定目的,且不带有任何隐藏动机。
-
要追究具备 AI 能力的机器人的设计师或制造商的责任。
-
在每个涉及数据、AI、ML 和模型的设计中都要融入隐私保护,前提是该系统对公众开放。
-
允许机器人在安全且伦理的前提下使用,通过详细的核算禁止其不道德行为。
-
为 AI 机器人设计师、个体和组织用户、行业与政府部门以及民间社会团体开展教育培训项目。
-
自主机器人应根据其行为进行分类,分为非法、不道德、允许的或过度的,并根据监管指南将其撤离服务。
国际 AI 举措与合作行动
国际举措旨在为不同国家的人们提供和谐与同步的教育。其主要目标是建立一个普遍的标准,提高对 AI 伦理的意识,并支持研究与技术合作。这使得不同国家的组织能够携手合作,推动举措中的协同效应。
一些关于 AI 的国际策略旨在解决因保护属性而导致的人类差异。为了为各国政府提供一个统一的框架,它们坚决支持“共同的 AI 未来愿景。G7 共同愿景就是其中之一,G7(加拿大、法国、德国、意大利、日本、英国和美国)的领导人在 2018 年会面,承诺遵循 12 条 AI 原则*” (www.europarl.europa.eu/RegData/etudes/STUD/2020/634452/EPRS_STU(2020)634452_EN.pdf
),并通过以下方式实现:
-
通过商业化应用,支持、领导并教育以人为本的 AI,采用系统化方式,确保技术以伦理且可信的方式实施。
-
分配资金以鼓励投资于研发,以便在研究人员、建筑师和数据专家的努力下,激发公众对新技术的兴趣。
教育、培训并提升个人的技能,以帮助他们适应新兴的创新技术。
支持开展活动和研究,调查欠代表群体的偏见来源,确保在建立模型之前,充分考虑到女性和边缘化群体的数据。
世界卫生组织(WHO)关于健康 AI 的伦理与治理团队(news.un.org/en/story/2021/06/1094902
)报告称,富裕国家已经在医疗保健中使用 AI 来加速和提高疾病的诊断和筛查的准确性。在临床护理中使用 AI 和改善健康研究和药物开发应包括强制性的安全和隐私机制,尊重患者数据的保密性。此外,WHO 强调需要开发符合法规、具有健全质量控制措施并为所有人提供准确预测的系统,无论年龄、性别、种族或人权法典保护的其他特征如何。
联合国大会第 74/299 号决议和 AI 道路安全倡议已经对创新的汽车和数字技术在 2030 年之前减少全球道路交通事故死亡和伤害人数超过 50%的角色进行了对齐(news.un.org/en/story/2021/10/1102522
)。其目标是集中在道路安全数据、监管框架以及设计更安全的车辆和道路基础设施,以实现更容易的事故后响应。国际电信联盟也与 AI 道路安全合作,支持与伦理和法律机构一致的持续监控和自动驾驶安全数据协议。
即使我们看到 Facebook 推广的广告(例如 2019 年的一则广告),也存在对性别、种族或宗教有偏见的情况。Facebook 积极推广“向女性推广护士或秘书工作的工作广告,而把清洁工和出租车司机的工作广告主要展示给男性”(research.aimultiple.com/ai-bias/
)。这些例子展示了教育组织战略、数据和架构团队遵守法律并遵循正确实践以建立和发布道德系统的重要性。
执法的法律影响
欧洲理事会的欧洲司法效率委员会(CEPEJ)在为司法系统中 AI 使用设置伦理原则方面发挥着领导作用,以指导政策制定者、立法者和司法专业人员(www.coe.int/en/web/cepej/cepej-european-ethical-charter-on-the-use-of-artificial-intelligence-ai-in-judicial-systems-and-their-environment
)。其目标是以符合欧洲人权公约(ECHR)和欧洲理事会个人数据保护公约所保障的基本权利为前提,负责任地应用 AI,以改善效率和质量。
关于欧洲数据保护委员会(EDPB)提出的隐私标准,违反 GDPR 可能导致高达 3000 万欧元的罚款或占组织全球年营业额 6%的罚款(以较高者为准)。如果违反了不可接受风险的 AI 系统或高风险 AI 系统的数据治理条款,也会面临同样的处罚。根据侵权程度,罚款最高可能会增加,比如将禁止的 AI 应用推向市场。其他种类的违法行为,如发布不正确信息,将导致最高 1000 万欧元的罚款,或占全球年营业额 2%的罚款。对于不遵守规定的行为,罚款可能高达 2000 万欧元,或占全球年营业额 4%的罚款。
一个最典型的可以应用法规和道德 AI 法律的例子,是不道德 AI 工具的使用,例如亚马逊的机器学习专家揭露的偏见招聘工具。亚马逊在 2015 年意识到,他们用来帮助招聘过程的基于 AI 的工具,在软件开发人员和其他技术职位的候选人评估中,并没有以性别中立的方式进行评分。最终,这个工具对女性做出了有偏见的决策。经过进一步调查,组织发现机器学习模型的训练是基于公司数据库中提交的 10 年期间的观察模式,来筛选申请人。由于该工具惩罚了包含“女性”一词的简历,组织决定废弃这个招聘工具,并解散了负责该项目的团队。
在这些部分中,我们已经了解了欧盟制定的 AI 监管法规,以及美国、澳大利亚和其他国际机构正在采取的行动和倡议。现在,让我们来看看组织、公司和 AI 研究人员应该如何构建可信赖的 AI 系统。
可信赖 AI 的下一步
在撰写本书时,已有超过 50 个国家采取了某种形式的 AI 监管政策(oecd.ai/en/dashboards
)。然而,像 AI 本身一样,围绕 AI 制定一项稳健的政策是一项艰巨的任务,这个任务因 AI 本身的不断发展而变得更加困难。然而,AI 研究人员和政策制定者提出了一些步骤,可以帮助向消费者提供可信赖的 AI。
企业的主要步骤之一是制定全公司范围的政策和程序,以创建合规设计方案。这样的方案有助于促进系统的透明度和可解释性,同时支持创新。此外,还应建立定期的审计和复审流程,定期分析使用情况并记录所有相关过程。应建立设计和审查流程,确保能够回应监管机构提出的额外信息要求。除了欧盟或各国监管机构提出的前述原则外,企业还需要通过公关/外部沟通提高产品意识,并将潜在客户和合作伙伴连接到收入渠道。
组织应持续寻求改善任何 AI 系统的公平性、完整性、隐私性和准确性。Google 提出的部分推荐最佳实践包括:
-
让所有具备 AI 能力的系统采用以人为本的设计方法,以便它们专注于用户体验,并考虑到用户和使用场景的多样性。
-
识别并监控多个治理标准以评估训练,并根据监控结果设置主动措施。这有助于判断模型指标对 AI 系统目标的相关性。
-
检查原始数据以评估评估指标,包括准确性,并判断系统的预测能力。
-
确定数据集和模型的限制,将这些限制传达至各部门,并遵循推荐的做法去除偏见,确保输入数据的公平性。
-
对 AI 系统进行严格、多样化和定期的集成测试和单元测试。
-
在部署后,针对所有 AI 系统制定定期监控和更新技术,以考虑实际表现和用户反馈。
AI 和少数群体(包括儿童)解决方案的日益普及使得伦理学家和数据专业人士认识到需要去偏见的 AI 系统。目标是维护儿童的集体保护权,并增加各背景儿童的参与。这适用于任何儿童互动的 AI 系统,无论该系统是否专门为儿童设计。组织在 AI 系统开发的价值提案和技术方案中应注入的部分原则如下:
-
包含特别设计的关键绩效指标(KPIs)和度量标准,可以集成到启用人工智能的系统中,以监控和跟踪儿童的福祉。由于儿童在与人工智能系统互动时会受到其影响,因此这些系统的设计应特别关注福祉框架和度量标准。此外,这些系统应在儿童身上进行测试,成功的参数应与儿童的福祉和发展紧密相关。
-
制定人工智能政策和战略,评估人工智能系统如何惠及儿童。这将有助于确定儿童所获得的整体益处,因为现有的政策和战略已经评估了儿童与此类系统互动时所涉及的风险。
-
采用保护儿童权利的设计风格,将儿童置于伦理人工智能政策和系统设计、开发与部署的核心。通过设计保障隐私、安全和包容性来保护儿童权利,有助于促进儿童的成长和福祉。
-
设计人工智能系统,确保儿童的健康、教育、清洁空气、水和安全等发展机会和权利。例如,专为儿童开发的基于人工智能的教育和推荐系统,不应显示不利于儿童教育和智力发展的广告。基于人工智能的系统应增加环境可持续性,而不是对环境产生负面影响。任何负面影响,例如碳足迹的增加,将严重影响儿童的福祉及其在可持续和健康的星球上生活的能力。应通过碳排放度量标准跟踪人工智能系统的训练、部署和计算基础设施,以应对气候变化,制定缓解策略,并推动更好的机器学习建模。
-
通过满足儿童需求,推动人工智能系统的可解释性和透明度,例如使用适龄的语言来描述人工智能。这将为人工智能系统的可解释性增添更多意义,使其更加透明。此外,人工智能应用应根据法律、政策框架、原则和规定赋能儿童用户,并应为救济提供空间。
-
开发系统,帮助儿童和教师培养必要的技能,以便为儿童准备应对人工智能的当前和未来发展。此外,针对儿童中心化的人工智能政策和战略的资助和激励应侧重于基础设施建设,并通过支持人工智能益处的公平共享来弥合数字鸿沟。最终目标是建立一个以儿童为中心的人工智能的坚实基础,其中包括保护(不造成伤害)、提供(做出积极贡献)和参与(包括所有儿童)。
尽管已经确定了成功构建下一代伦理 AI 系统的下一步措施,但世界经济论坛指出了一些直接影响政府采用 AI 的挑战(www.weforum.org/agenda/2019/08/artificial-intelligence-government-public-sector/
)。其中识别出的主要障碍包括:
-
数据的有效使用:缺乏对数据价值的理解,且数据很少在可扩展的基础设施中部署。同时,数据治理流程的实施也存在不足。
-
数据和 AI 技能:政府及其他政府资助的组织面临资金短缺,无法雇佣许多大公司能够负担得起的专家数据专业人员。这种吸引人才的差距影响了生产的 AI 解决方案的质量。
-
AI 生态系统:在 AI 市场中运营的公司经历了频繁的变化,包括他们所解决的问题和客户对解决方案的看法。开创 AI 解决方案的初创企业也面临着人才短缺的问题,难以为大规模项目伦理地扩展机器学习模型。
-
遗留文化:政府及政府资助的组织在采用变革性技术方面遇到困难,主要原因是员工没有接受伦理原则的教育,并且不愿冒险。
-
采购机制:基于机器学习的解决方案和系统通常被视为知识产权,具有条款和条件,这可能使政府在规定的时间内定制现有解决方案变得困难。
现有的挑战和空白
不同伦理协会和机构提出的框架已解决了之前识别和呈现的道德和伦理困境,但仍有一些空白需要填补。
图 3.7 – 人类心理在决定职业中的作用,左侧偏向女性,右侧偏向男性
与经济合作与发展组织(OECD)一道,欧盟强调了社会和环境福祉(包括可持续性和环保)的重要性,并根据防止伤害的原则制定了伦理指南。然而,它没有提供如何实现这一目标的示例。
伦理委员会也关注使用 AI 对人类心理的影响,以及人们与 AI 的互动方式。这一点在图 3.7中得到了体现,图中展示了现有的社会结构如何影响我们对不同职业的看法。因此,很明显,欧盟需要在伦理的背景下重新定位社会关系,以确保社会中可用的数据(展示了关于不同受保护属性的偏见决策,如图所示)不会最终训练机器学习系统,从而导致循环偏见。此处的x轴表示不同职业如何倾向于与男性、女性或两者相关联。
欧盟关于负责任 AI 的草案强调了持续监控的必要性,以评估 AI 与人类的互动,并规定在此类互动发生时,系统应通过创造性模拟进行全面测试,模拟所有类型的社会互动。这些模拟可以创建涉及人类与机器人互动的不同场景。即使这一规范也不足以在长期内提供安全性和保护,因为人类与机器人关系复杂并对人类心理产生影响。这些复杂的互动需要在下一代机器人自动化 AI 系统的创建中加以考虑。
如图 3.8所示,行人对于自动驾驶汽车仍然存在恐惧感。未来自动驾驶汽车系统的主要元素之一是利用真实的测试数据,增加那些感到自动驾驶汽车安全的行人的比例。此外,责任问题也是一个重要因素,以防这些车辆造成任何伤害。因此,量化安全性和保护性仍然是未来定义可信 AI 系统时的主要任务之一:
图 3.8 – 行人对自动驾驶汽车的安全担忧
提出的解决方案和改进领域
公布 AI 解决方案的艺术面临着多个挑战和问题。为了回应这些问题,法国国务委员会及其他欧盟国家和美国开展了实验,实施了四种不同类型的法规。这里描述的这些法规试图开发并认证真实的伦理 AI 解决方案:
-
由算法问责法案驱动的法规
-
政府监管机构提出的法规,包括食品和药物管理局(FDA)(针对医疗行业)、国家公路交通安全管理局(NHTSA)(交通运输)和联邦贸易委员会(FTC)(零售)
-
通过考虑劳动法和民权法启用的法规
-
由加利福尼亚消费者隐私法案驱动的法规
一项调查显示,在对人工智能解决方案应用实验性监管后,企业流程中人工智能的采用率下降了 16%,因为实施人工智能战略的成本显著增加。观察到,通常情况下,管理者减少了用于员工培训的资金,以发展一个更广泛的人工智能战略,从而支撑人工智能监管。目前的需求是制定认证、测试、审计和技术标准,验证所有使用案例中的模型性能指标。
组织们已经提出了监管沙盒,允许私营部门进行测试,以评估系统在现实个体和地方性监管约束下的表现。如以下图所示,这些沙盒包括几轮内部评估和压力测试,使用可解释人工智能(XAI)对系统进行审计和修正,并给予适当的反馈。
该图展示了监管沙盒的不同组成部分。这种沙盒使我们能够确定以下内容:
-
数据集被考虑的资格标准,例如数据集在属性方面的多样性。申请程序应纳入监管沙盒测试。
-
个人在监管测试过程中的实际参与。
-
沙盒的退出条件,取决于评估的风险模型。
-
参与者的权利和义务。
XAI 评估框架帮助我们实现以下目标:
-
理解并解释内部特征,以验证可解释性。
-
评估外部环境对系统的影响。
-
评估系统在安全关键场景中对外部环境的影响。
-
确保更好的治理、政策和监管理论的应用。
如果一个系统对健康、安全和基本权利构成生命威胁风险,应立即停止,以防在其开发和测试过程中造成进一步的损害。这些实验性监管和监管沙盒有助于基于证据的立法。其核心结构包括预设的事实、假设和立法框架,这些是遵循监管合规性的真实、成熟和可扩展人工智能系统的基础。
以下图示展示了一个人工智能系统在沙盒中,用以评估整体人工智能监管框架对经济、社会和政治影响的有效性。
图 3.9 – 风险评估和监管政策测试的人工智能沙盒
让我们总结本章内容。
概述
在本章中,我们了解了不同国家的伦理和治理机构所实施的法规与法律。我们现在理解了这些法规的基本原则,以及它们如何帮助培育公平系统的发展,特别是那些属于高风险类别的系统,例如与司法、自动驾驶汽车、医疗保健相关的模型,以及那些不仅旨在保护基本人权,还旨在促进地球可持续活动发展的系统。此外,我们强调了通过专注于整体福祉、有效性、透明度、问责制、能力、隐私和公平性,增强对人工智能可能被滥用的意识的重要性。我们现在理解了在发生违规或失败时可能造成的损失或损害,以及遵守现有法规或法律的重要性,为什么这种损失对社会产生负面影响。本章还让我们深入了解了现有法规和法律中的空白,以及需要进一步完善的地方。这些空白使我们有责任在设计这些系统时保持警觉,确保它们成为未来一代系统的示范性案例。
为了实现这一目标,让我们在下一章中学习如何构建和评估大规模大数据和机器学习模型管道。
进一步阅读
-
草案人工智能法规的关键条款:
www.allenovery.com/en-gb/global/news-and-insights/publications/key-provisions-of-the-draft-ai-regulation
-
关于儿童的人工智能政策指导:
www.unicef.org/globalinsight/media/2356/file/UNICEF-Global-Insight-policy-guidance-AI-children-2.0-2021.pdf
-
人工智能政策与国家 战略:
aiindex.stanford.edu/wp-content/uploads/2021/03/2021-AI-Index-Report-_Chapter-7.pdf
-
欧洲人工智能草案法规:关键问题 解答:
www.ey.com/en_ch/law/european-draft-regulation-on-artificial-intelligence-key-questions-answered
-
亚马逊放弃了对 女性有偏见的秘密人工智能招聘工具:
www.reuters.com/article/us-amazon-com-jobs-automation-insight-idUSKCN1MK08G
-
2022 年 AI、机器学习与大数据法律与法规 | 澳大利亚:
www.globallegalinsights.com/practice-areas/ai-machine-learning-and-big-data-laws-and-regulations/australia
-
美国人工智能法规逐渐成型:
www.jdsupra.com/legalnews/u-s-artificial-intelligence-regulation-1161759/
-
欧盟关于 AI 的草案法规及其对 医疗保健的影响:
www.kantify.com/insights/draft-eu-regulation-on-ai-and-its-impact-on-healthcare
-
FTC 警告可能会打击偏见 AI:
www.theverge.com/2021/4/20/22393873/ftc-ai-machine-learning-race-gender-bias-legal-violation
-
Ranchordas, S. (2021). AI 的实验性法规:道德和风俗的沙箱。格罗宁根大学法学院研究论文,(7)。
papers.ssrn.com/sol3/papers.cfm?abstract_id=3839744
,www.nomos-elibrary.de/10.5771/2747-5174-2021-1-86.pdf
-
联邦金融监管机构的 AI 公平贷款政策议程:
www.brookings.edu/research/an-ai-fair-lending-policy-agenda-for-the-federal-financial-regulators/
-
AI 权利法案蓝图:
www.whitehouse.gov/wp-content/uploads/2022/10/Blueprint-for-an-AI-Bill-of-Rights.pdf
-
负责任的 AI 架构师 指南:
indiaai.gov.in/responsible-ai/pdf/architect-guide.pdf
第二部分:下一代 AI 生态系统的构建模块与模式
本部分深入探讨大数据系统和 AI/ML 工作流,重点关注隐私管理、模型设计管道和生命周期管理。涵盖机器学习管道的各个阶段、模型评估和不确定性处理,并解决常见的挑战。此外,还讨论了高级主题,如超参数调整、MLOps 实践和 AutoML。通过提供理论讨论和实践指导,本部分为您提供了在大数据系统上部署 AI 模型时确保稳健、高效且保护隐私的解决方案所需的知识和工具。
本部分由以下章节组成:
-
第四章, 大数据中的隐私管理与模型设计流水线
-
第五章, 机器学习流水线、模型评估与不确定性处理
-
第六章, 超参数调优、MLOps 与 AutoML
第四章:大数据与模型设计管道中的隐私管理
本章提供了关于如何在云中定义和构建大数据及机器学习管道的详细概述。您将学习如何以可扩展且可解释的方式应用在第二章中学到的防御技术,并通过不同的使用案例和示例进行实践。此外,您还将探索不同机器学习组件、微服务和端点的安全原则。本章的主要目标是将前几章中获得的知识进行整合,并更广泛地应用于主动构建一个坚实的风险缓解策略基础。通过这样做,您不仅能做好各个层级的防御准备,还能及时监控和识别新威胁,并采取及时的补救措施。
本章将涵盖以下几个部分:
-
设计隐私证明的管道
-
设计安全的微服务
-
云安全架构
-
监控与威胁检测
技术要求
本章要求您在本地 PC 或云端安装Vault
。要在Ubuntu/Debian上安装,请执行以下命令:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install Vault
要在CentOS/RHEL上安装,请执行以下命令:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install Vault
要在macOS上安装,请运行以下命令:
brew tap hashicorp/tap
brew install hashicorp/tap/Vault
要在Windows上安装,请执行以下操作:
choco install Vault
安装完成后,不论使用哪种操作系统,您都可以在命令提示符中输入Vault
,如果正确安装,应该会显示不同的Vault
命令用法。
本章还要求您安装 Python 3.8 以及以下列出的 Python 包:
-
git
clone
https://github.com/as791/Adversarial-Example-Attack-and-Defense
-
pip
install interpret
设计隐私证明的管道
当任何机器学习(ML)模型部署到生产环境中时,它需要一个完全私密的管道,能够接收数据、进行预处理,并使其适合训练和预测操作。在本节中,让我们一起来了解在设计接收每毫秒甚至每秒可达数 TB 或 PB 数据的管道时,必须牢记的一些重要概念。
大数据管道
在大数据管道中,我们在设计过程中将安全性和隐私性贯穿于数据聚合、数据处理、特征工程、模型训练、评估和提供训练后的模型等各个环节。数据可以通过无数设备输入,涵盖从移动设备、传感器、物联网(IoT)到医疗物联网(IoMT)设备,数据形式包括文本、数字、图像或视频帧。为了构建这样一个支持隐私和安全的物联网到云的数据管道,我们遵循分层部署策略,主要设计四个访问层,分别用于以下目的:
-
设备层(也称为网状网络)包含所有类型的设备(如嵌入式系统、传感器、执行器和其他智能物体),这些设备从网络的边缘发送数据。
-
网络层(支持不同数据格式下的不同网络协议)负责从边缘网络到各个处理引擎的数据传输和聚合。例如,设备可能选择通过 HTTPS 传输 JSON 数据。
-
服务层包含不同的微服务,负责数据清理、处理、标记、标签、特征工程、模型训练和评估。服务层的工作不仅是执行在分散的边缘服务器或集中式云端的各种处理功能,还要通过将数据和模型存储在适当的存储位置来跟踪和维护数据与模型的血统。
-
应用层通过 API 网关将预测的模型结果提供给最终用户。
下图展示了五种不同的架构元素,以及可以以可扩展的方式在边缘/雾网络中集成的安全措施(如匿名化、伪匿名化、同态加密(HE)、安全多方计算(SMC)、差分隐私(DP)、数据丢失防护(DLP),如在第二章中讨论的)。
图 4.1 – 边缘/雾网络和云系统中的安全组件
确保高安全性设计架构的主要方式之一是确保每个数据中心的不同可用区(对应不同的地理位置)被分类为多个安全级别的抽象层次,从而形成分层的域结构。这个结构化的抽象可以根据设备类型以及业务和数据的背景来实现,例如数据从哪里进入系统。
我们可以根据提供的服务类型将整体系统划分为独立的部分,将其分为四个主要构建单元:
-
物联网和边缘网关:该元素主要用于与外部设备接口(如传感器、物联网等)进行通信,仅允许通过蓝牙、Wi-Fi 或 射频识别(RFID)从已认证设备传输数据。物联网元素和网关通过全球证书授权机构建立相互信任关系,双方共同信任的证书授权机构签发的公钥证书有助于在证书有效期内维护多个域的信任关系。安全物联网网关的隐私设计可以进一步扩展,以支持带宽和加密要求,动态生成密钥大小,基于物联网设备的硬件计算能力。
-
授权和认证层:此元素展示了来自策略库的不同策略,根据设备的唯一 ID 对设备进行授权和认证。成功认证和策略验证(基于请求代理)后,它会生成一个唯一的会话 ID,并响应一个证书(包含设备 ID 和会话密钥副本),以允许进一步的数据流向内部授权的微服务。
-
信任关系环境:此元素通过集成不同方面的安全协议(如完整性、保密性和治理)作为安全架构的坚实基础。换句话说,这一块治理授权策略,将策略代理与数据处理和模型训练单元连接起来。
-
数据转换和机器学习引擎:此元素由两层安全性构建。第一层基于设备/实体在该单元中的角色,允许低级别的数据访问(例如,关于元数据的数据)。在此,针对缓存和数据存储库的访问控制(特别是数据库、列、队列等)在精细级别上实现。边缘设备现在可以通过端到端加密(例如,使用同态加密)传输数据。该设计进一步允许每个设备连接到不同的收发器总线,创建额外的安全层。此外,第二层还通过与基于云的私有微服务的通信提供细粒度的高级数据访问,这些微服务可以在有/没有防火墙的情况下进行配置。
在使用 Hadoop 框架的大数据系统中(Hadoop 是一个用于在集群间处理大规模数据的分布式处理框架),该框架可以通过一个专用的反向代理应用 Apache Knox 来支持,该应用负责通过基于 表述性状态转移(REST)的 API 提供单一的身份验证点并可插拔的策略执行。图 4.2 展示了如何使用 Apache Knox 和 Apache Ranger 来进行用户的认证和授权。
图 4.2 – 使用 Apache Knox 和 Ranger 进行授权和认证的架构
我们还可以建立一个类似的架构框架,采用顺序授权过程,配备安全网关、Zookeeper PDP 和 Spark/Storm 集群,这样客户端就能灵活地提交 Storm 集群的拓扑。此类框架可在客户端触发分布式系统(Spark/Storm 集群)中的数据处理时使用,并允许其进入系统,利用 Spark/Storm 的数据处理和机器学习能力。
此外,我们可以使用受信执行环境(TEEs)来构建一个受信任的云生态系统,将应用程序托管在各自的私有空间中。操作系统(OS)可以在其自己的私有空间中运行,依托受保护的硬件资源。软件保护扩展(SGX)可在现代的英特尔芯片组计算机中使用。SGX 包含一组安全相关的指令代码,这些代码被嵌入到一些现代英特尔中央处理单元(CPU)中,从而使整个系统在计算成本方面更加高效。Oblivious RAM(负责将算法翻译为保持实际算法输入输出关系并具有独立内存访问模式的算法的编译器)可以帮助缓解因代码分支信息而发生的攻击。这种安全方法有一定的风险,因为对手可以根据输出逆向工程模型权重。
架构模型设计管道
现在我们已经研究了与大数据管道相关的安全措施,让我们来探讨一些关于对抗学习、模型训练和模型再训练中隐私和安全的最佳实践。
对抗扰动框架
为了减少 ML 服务中的隐私攻击,提出的防御机制之一是将组件/服务部署在一个架构框架中,以在防御机制和模型性能指标之间实现正确的权衡。这样的防御管道可以通过以下组件来架构:
-
一个对抗扰动生成器,负责以一种可以隐藏敏感私人信息免受攻击者侵害的方式制作对抗样本。
-
一个隐私泄露评估器,负责评估目标模型的信息泄露,并通过向生成器发送反馈来优化目标模型的性能。
-
一个部署在生成器和泄露评估器之间的模拟器,接收对抗样本以模拟目标模型生成的分类概率
图 4**.3展示了目标框架的所有不同组件,并且提供了生成扰动样本的三种不同方式。
图 4.3 – 在模型训练中设置的对抗防御管道
对抗扰动生成器
该组件的核心包括对抗算法选择器和扰动率控制器。算法选择器可以从可用算法集合中选择,例如 AdvGAN 或快速梯度符号方法(FGSM)。FGSM 是一种快速且可靠的技术,可以生成与其他对抗算法相比具有更高、更具辨别性的扰动示例:
-
在以下代码中,我们生成一个 FGSM 攻击:
def fgsm_attack(in_data,epsilon,grad_from_data): pert_out = in_data, + epsilon*grad_from_data.sign() pert_out = torch.clamp(pert_out, 0, 1) return pert_out
-
可以使用以下代码来触发攻击:
for data, target in test_loader: data, target = data.to(device), target.to(device) data.requires_grad = True output = model(data) init_pred = output.max(1, keepdim=True)[1] if init_pred.item() != target.item(): continue loss = F.nll_loss(output, target) model.zero_grad() loss.backward() data_grad = data.grad.data perturbed_data = fgsm_attack(data,epsilon,data_grad)
-
这将产生以下输出(如图 4.4所示),表明通过对抗训练(FGSM)进行模型训练时,隐私保护水平随着准确度的下降而提高。此过程在 MNIST 数据集上进行。
图 4.4 – 对抗防御管道中的 FGSM 扰动
另一方面,OPTMARGIN 防御技术通过区域分类器的代理模型生成低失真对抗样本,其中样本对小扰动具有鲁棒性。与此同时,控制器可以控制和调整上传的上游训练数据中对抗样本的比例。对抗样本通过保持对抗性失真(即每个对抗记录与原始数据之间的欧几里得距离)在最小水平来隐藏上传数据集中的敏感信息。通过使用最小失真率,我们可以生成具有与原始数据相同分类标签的对抗样本。
仿真器
该组件模拟目标模型的概率分布,以有效设计影子模型。影子模型紧密跟随目标模型的行为和分布模式。对抗数据可用于最小化仿真器的二次损失。
隐私泄露评估器
隐私泄露评估器负责推断对抗样本的隐私保护效果。它可以推断任何评估插件中的隐私泄露程度(例如,成员资格推断攻击),并帮助基准测试通过此框架实现的防御水平。评估器接收反馈并将评估结果发送给对抗扰动生成器,帮助生成器发现并生成正确的对抗样本。
评估函数可以采用约束条件(如泛化误差、攻击准确度的下降或攻击分类器的损失函数)。这些约束在微调噪声生成过程中特别重要。例如,评估器的高推断准确度会促使在更大扰动方向上进行调整,而评估器的低推断准确度则会促使在较小扰动方向上进行调整。
机器学习管道中对抗框架的目标
现在我们已经了解了对抗性框架中不同组件的重要性和功能,接下来的任务是将其作为 MLOps 和云端最佳实践策略的一部分来引入。当我们将这个框架与机器学习模型训练流水线结合使用时,可以获得两个主要好处。最重要的好处是,我们在对抗者查询模型并检索分类结果时,可以隐藏保护的信息。另一个重要的好处是,我们能够在架构中得到一个控制器,来控制从训练数据合成的新模型的性能。
增量/持续机器学习训练与再训练
现在让我们通过比较增量学习和持续学习技术,以及再训练技术,来探索不同的学习方法,以了解我们如何在训练过程中获得更多的隐私保护。研究结果表明,当人工神经网络持续学习一系列任务时,展现出了灾难性遗忘的特性。持续学习(CL),也称为终身学习、顺序学习或增量学习,能够使模型从数据流中顺序学习。
然而,当模型尝试吸收后续任务的新知识时,它会丧失之前收集的信息。由于模型在重要参数上的知识丧失,并且受限于稳定性(保持过去知识的能力)和可塑性(吸收新知识的能力)之间的权衡,模型无法考虑对抗性攻击的可能性,因此仍然容易受到毒性后门攻击的影响。针对这些风险,已有大量研究提出了缓解方法,形成了三种不同的途径:
-
基于数据的方法依赖于存储从之前学习中获得的历史知识(在情景记忆中),并将其与当前的训练数据结合,以完成训练任务。增量分类器和表征学习属于这一类别。
-
架构方法通过为每个任务分配不同的子网络来缓解遗忘风险。在这里,每个任务利用网络的不同部分。一旦完成一个训练任务,子网络就不需要再担心训练神经网络的其他部分。此类方法的例子包括渐进神经网络、专家门控(Expert Gate)和基于集成的学习方法,如 Learn++。我们进一步注意到,稀疏性的专家门控模型,在网络部分激活时,表现出更好的扩展性和保留能力。
-
基于正则化的方法试图解决早期方法中存在的数据存储和架构复杂性问题。它们通过向损失函数添加一个额外的正则化项,以防止先验知识的丧失。在学习阶段或完成学习操作后,模型通过不同的权重计算机制不断计算网络中每个参数的重要性。这有助于通过惩罚对最重要参数的剧烈变化,来保持后续学习阶段的信息。属于这一类别的示例包括弹性权重整合(EWC)、突触智能和记忆感知突触。
尽管这些连续学习(CL)技术已证明能够保持先验知识,但它们对对抗性攻击的脆弱性仍在研究中。然而,研究表明,在基于 CL 的 EWC 中的防御提案可能会被智能对手通过在训练过程中向模型注入虚假信息所破坏。对手可以进一步控制任何任务的遗忘程度,并通过注入后门污染样本来妥协神经网络,甚至只需要影响单一任务训练数据的 1%。这种攻击可以作为一种有效的工具来击败基于在线的连续学习者。
在这些情况下,分析模型泄漏信息并使用差分分数和差分排名等指标量化泄漏,可以在一定程度上缓解模型管道中的连续学习(CL)风险。现在,让我们讨论一个示例,说明这些指标如何确认模型更新导致的泄漏,尤其是在高容量生成性自然语言模型(LM)的情况下。这个用例有助于为实时模型管道的设计提供方向,当数据不断输入系统时。这个示例进一步展示了当对手访问模型的多个快照时的隐私影响,例如当文本数据在再训练阶段添加/移除时。研究应该促使我们在设计管道时,遵循正确的再训练模型流程,特别是在对手持续从训练模型所用数据的差异中学习的情况下。
设计策略可以扩展到以下情况,在这些情况下,威胁模型的设计受以下因素的影响:
-
有限的私人数据集用于微调预训练的公共大容量语言模型(LM)
-
具有记忆分布外训练样本能力的语言模型(LM)
-
大规模部署语言模型(LM)的系统,如智能手机上的预测键盘,允许对手更详细地分析模型
当微调一个高容量模型(例如,BERT 或 GPT2 等变换器模型)的公共快照时,数据泄露威胁会加剧。当模型通过某个实体的附加数据进行微调时,存在将微调后的模型和原始公共模型暴露给该实体用户的风险。
可以使用差异得分的概念来估算用于训练两个语言模型的数据差异。该得分帮助我们通过捕捉两个模型对令牌序列的概率差异来确定令牌序列,其中较高的差异得分意味着模型更新过程中添加了该序列。适当的搜索方法可以进一步帮助我们识别新增的令牌序列并检索与数据集差异相关的信息。这些信息现在对任何人都可用,无需了解数据集的内容和分布的背景知识。
为了缓解此类攻击并建立坚固的防御,需要对模型重训练流程进行某些调整,以触发增量学习并决定如何向外部实体展示模型快照。因此,应该做出设计选择,以限制对两个连续模型快照的查看。研究发现,两个快照按顺序排列时,会暴露更多关于数据添加或删除的信息。预防这种情况的最佳策略是限制对模型的访问,并仅向任何代理提供部分预测结果。
例如,任何外部实体仍然可以完全访问原始模型M,但只接收来自更新模型M’的前k个标记。当客户从云端获取预测结果时,允许云 API 返回带有每个查询截断版本的专用模型,从而实现这种场景。然而,当模型部署在客户端设备上时,它们可能被允许在同一设备上运行在 Intel SGX 或 ARM TrustZone 等受信执行环境(TEE)中。此方法有助于减少信息泄露。
有三种与模型重训练相关的广泛方法:
-
从头开始重训练:这种方法允许我们从头开始训练一个模型,以获得一个新的模型快照(M')。此过程考虑了模型参数的全新(随机)初始化,触发重训练过程将生成稍有不同的输出机器学习模型。由于该过程意味着从训练的全新开始,数据所有者可以在修剪数据后启动重训练过程。
-
持续训练:这种方法依赖于持续训练的原则,即原始模型在附加数据上进行增量训练,以生成新的模型快照 M'。该技术的一个主要优点是避免了从头开始训练大数据集所带来的额外计算成本。
图 4**.5 展示了重新训练和持续训练在数据泄露方面的差异。纵轴表示相对于数据 D 的困惑度,横轴表示相对于数据更新的困惑度。这里的困惑度指的是模型在选择下一个单词时的突发反应或“惊讶”的程度,因此较低的困惑度值表示数据与模型之间的匹配更好。
第一个图展示了更新所有模型参数的影响,而第二个图则演示了如何根据完全新的数据更新先前训练过的模型的参数。对角线的目的是根据数据分布是否更像私人数据更新 N 或基础数据 D 来对数据进行分类。位于对角线以上的点在分布上更接近(私人)数据更新 N,而不是基础数据 D。如第二个图所示,大量的困惑度和数据与模型之间更大的不匹配或不确定性,可能会导致更高的隐私性。在这里,更大的不确定性或变化验证了一个事实,即在持续训练后检索并返回的句子,比从头开始重新训练后的句子更有可能是私密的。
图 4.5 – 比较从头开始重新训练与持续训练时的数据隐私
- 两阶段持续训练:这一缓解策略允许训练过程分为两个阶段进行。首先,数据集被分为三等份 —— Dorig、Dextra 和 D'extra。
我们之前看到过,持续训练方法可以通过更新先前训练过的模型的参数来启动模型训练(当新的数据 D 或 D'到达时)。新的两步训练方法增加了一个额外的步骤(在训练模型使用合成/金丝雀数据(Dextra)后,执行在数据集 D'extra 上的训练)。这种方法模拟了一个场景,其中我们禁止攻击者访问两个连续的快照。这种两阶段或多阶段的持续训练可以降低训练阶段的差异得分,从而进一步减少私人信息泄露的可能性。
接下来,让我们看看如何通过对抗训练和在 GPU 上重新训练来扩展防御管道。
扩展防御管道
现在我们已经知道如何通过持续的模型重新训练在模型管道中引入防御机制,让我们来看看如何使这种对抗系统能够扩展到更大的数据集。可扩展的设计方法应考虑以下原则,以便以并行分布式的方式快速在大量数据上进行训练。
神经网络的泛化能力应足够强大,以便从大规模数据集中检测出最重要的特征。在迭代训练过程中引入模型泛化,可以在每一步优化数据表示,从而保持模型的准确性和鲁棒性。可以设计一种迭代模型训练机制,当扰动 η<η0 时,将对抗样本标注为原始/自然样本的标签;另一种方式是当扰动 η≥η0 时,将其标记为对抗样本,并向系统发出通知进行进一步分析。
最重要的方面在于使得迭代的对抗训练过程可并行化,这在图 4.6 中进一步说明。该图展示了一个分布式的对抗再训练框架,并使用了图形处理单元(GPU)。GPU 可以利用先前生成的对抗样本(t-2 时生成的样本),而无需等待在 t-1 时生成的样本。消除等待生成样本的需求可以加快处理速度。
图 4.6 – 对抗防御流水线的可扩展性
此外,我们还可以开发集成模型,使得最终标签的输出基于两个测试提供的标签,其中我们向一个测试集添加少量随机噪声,而不向另一个数据集添加噪声。这些少量的噪声旨在扭曲来自对抗攻击的最优扰动,使得加入噪声的图像与未加噪声的图像产生不同的输出,从而清晰区分原始图像与攻击图像。
我们现在已经了解了模型训练的不同机制如何为隐私增加额外保护。让我们重用在第二章中解释差分隐私(DP)概念的一些内容,并将其应用于机器学习训练流水线。
在可扩展架构中启用差分隐私
DP 解决方案在研究和实践之间存在脱节,主要由于隐私启用算法的低模型准确性和高运行成本。一个称为Bolton 差分隐私的私人随机梯度下降(SGD)算法解决了这些问题,且与可扩展的基于 SGD 的分析系统相集成效果良好。该解决方案完全依赖于在模型收敛后添加噪声。此外,该方案在不增加额外开销的情况下,提升了模型性能指标。
图 4.7 说明了在云环境(如谷歌云平台(GCP))架构中,涉及差分隐私的数据处理各个阶段。如我们所见,操作顺序如下:
-
从 BigQuery 中检索启用差分隐私的 SQL 查询。
-
使用 AutoML 进行数据模式验证。
-
使用 AutoML 进行特征工程。特征存储在云数据库/存储中。
-
在下一阶段,差分隐私再次发挥作用,以确保查询和模型的私密性,通过从存储中获取处理后的结果,将隐私融入系统。
-
使用差分隐私进行数据挖掘(运行差分隐私 SQL 查询)。
-
使用 Cloud Dataprep 工具进行建模的数据准备。
-
使用 DP 的机器学习建模。
-
预测结果的存储。
-
在测试集上的评估。
图 4.7 – 在 Google Cloud 上使用模型训练进行差分查询
现在我们已经了解如何在云端部署 DP 解决方案,接下来让我们探索如何对其进行解释。
DP 解决方案的可解释性
在这里,我们将展示如何使用微软研究院的interpretML工具来解释私密训练的模型。可解释提升机器(EBM)是一种最近的技术,它被用来训练可解释的机器学习模型,同时保护敏感数据。现在让我们看看如何将差分隐私添加到 EBMs 中,并设定以下目标:
-
训练过的模型提供了更好的全局和局部可解释性(非常适合差分隐私适用的场景)。通过全局可解释性,我们可以了解在模型结果中起重要作用的特征,而通过局部可解释性,我们可以解释每个单独的预测。
-
在训练过程后,模型可以被修正,以解决差分隐私引入的错误。
让我们通过一个示例来演示:
-
首先,我们有必要的导入项,如下所示:
from interpret.privacy import DPExplainableBoostingClassifier from interpret.glassbox import ExplainableBoostingClassifier import time from sklearn.metrics import roc_auc_score, accuracy_score
-
下一步是引入
DPExplainableBoosting
分类器,测量roc_auc
指标以及评估所需时间:start = time.time() dpebm = DPExplainableBoostingClassifier(epsilon=1, delta=1e-6) _ = dpebm.fit(X_train, y_train) dp_auroc = roc_auc_score(y_test, dpebm.predict_proba(X_test)[:, 1]) print(f"DP EBM with eps: {dpebm.epsilon} and delta: {dpebm.delta} trained in {end - start:.2f} seconds with a test AUC of {dp_auroc:.3f}") end = time.time()
-
接下来,我们介绍一个
ExplainableBoosting
分类器(没有 DP),并衡量roc_auc
指标以及评估所需时间:start = time.time() ebm = ExplainableBoostingClassifier() _ = ebm.fit(X_train, y_train) ebm_auroc = roc_auc_score(y_test, ebm.predict_proba(X_test)[:, 1]) end = time.time() print(f"EBM trained in {end - start:.2f} seconds with a test AUC of {ebm_auroc:.3f}")
接收到的输出如下:
DP EBM with eps: 1 and delta: 1e-06 trained in 3.38 seconds with a test AUC of 0.878
EBM trained in 10.43 seconds with a test AUC of 0.923
-
在最后一步,我们展示了两种模型的全局解释,并检查它们之间的差异:
from interpret import show show(ebm.explain_global(name='Standard EBM')) show(dpebm.explain_global(name='DP EBM'))
图 4.8展示了标准 EBM和DP EBM的输出,特征根据其重要性进行排名。我们看到,关系、性别和教育年限在 DP EBM 中比在标准 EBM 中发挥更大的作用。通过进一步分析每个特征的贡献(如婚姻状况),我们看到分居和DPOther在 DP EBM 中的得分范围比标准 EBM 大。
图 4.8 – 在 DP 模型上展示可解释性
既然我们已经知道如何创建差分隐私(DP)训练管道,那么接下来我们来研究一些经过验证的安全部署策略,以及如何在云基础设施中部署签名模型。
部署安全性和模型签名
主要的安全标准之一是确保模型训练和部署流水线的所有组件都与安全验证检查集成。此外,我们还应当小心保护敏感数据的隐私和完整性,如密码、令牌和其他密钥,这些都是生产环境中端到端系统功能所必需的。因此,所有生产环境中的机密信息应仅存储在托管的数字保险库中,并且绝不应提交到代码库和配置文件中。我们还应引入自动化,以支持在部署时动态生成机密,并定期检查流程,以检测和缓解由于未保护机密存在所带来的威胁。
现在让我们通过 图 4.9 来看看如何使用 AWS SageMaker 进行模型打包和签名 (aws.amazon.com/blogs/machine-learning/machine-learning-at-the-edge-with-aws-outposts-and-amazon-sagemaker/
)。这将帮助我们了解如何将模型工件打包在一起,提供有效的授权签名,并使用 Amazon SageMaker Edge Manager 存储到 S3。
在实际场景中,AWS SageMaker 帮助我们在 AWS 区域内构建和训练模型时,我们可以使用 Amazon SageMaker Edge Manager 以优化的方式训练模型,通过本地推理并将其存储在 AWS 相应的本地数据中心。这种优化的训练方法比起数据中心与 AWS 区域之间距离较远的情况,可以减少延迟。机器学习模型可以在 AWS SageMaker(在 AWS 区域内)上进行训练,一旦模型工件存储在 Amazon S3 中,就可以进行打包和签名。已编译和签名的模型可以从 AWS S3(在 AWS 区域内)复制到 AWS Outposts 上的 Amazon EC2 实例,并通过 SageMaker Edge Manager 代理提供模型推理服务。下图进一步详细说明了这些步骤:
图 4.9 – 在 AWS SageMaker 中的模型签名
在 GCP 中,我们有 BigQuery ML,它支持 CREATE MODEL
调用,指定训练选项中的 KMS_KEY_NAME
和可以用于存储模型的路径:
CREATE MODEL my_dataset.my_model
OPTIONS(
model_type='tensorflow',
path='gs://bucket/path/to/saved_model/*',
kms_key_name='projects/my_project/locations/my_location/keyRings/my_ring/cryptoKeys/my_key')
AS SELECT * FROM my_dataset.my_data
通过我们对保护私有机器学习模型的新知识,接下来让我们探讨如何设计安全的微服务。
设计安全的微服务
使用 ML,我们可以设计不同的智能预测服务,这些服务可以使用一个或多个算法,包括前馈神经网络(FFNNs),深度信念网络(DBNs)(www.sciencedirect.com/topics/engineering/deep-belief-network
),和递归神经网络(RNNs)。为了促进定制算法的重复使用,我们可以选择创建一个抽象层,并将每个预测服务封装为面向数据的微服务,这些微服务可以与需要 ML 能力的应用程序集成。此外,可以使用 TensorFlow 库对一个 ML 微服务进行训练,另一个可能使用 PyTorch 库,第三个微服务可能使用 Caffe 库进行训练。基于微服务的 ML 模型允许最大限度地重用 ML 库、算法特性、可执行文件和配置,促进 ML 团队之间的合作。
例如,如图 4**.10所示,有四个 ML 预测微服务 - 推荐,客户行为,基于位置的广告和购物篮,以及身份管理和客户交易。现在让我们看看如何在这些基于 REST 的微服务中引入安全机制:
-
任何 HTTP 客户端请求(从移动/网络 API)首先着陆在 API 网关(步骤 1a),然后通过负载均衡器将其指向身份管理(IM)微服务(步骤 1b)。
-
当由 IM 微服务(步骤 2)进行验证时,客户端将提供身份验证令牌,使用该令牌可以进一步请求任何预测服务。
-
当认证服务提供身份验证令牌时,然后由微服务在步骤 3中使用该令牌验证请求,并在步骤 6发送相应的响应。每个微服务可以通过从保险库(专用于存储密钥的存储区域)获得动态密钥来进一步保护。
-
此外,每个微服务在步骤 4向后端交易数据库发出请求,并在步骤 5收到其响应。
由于保险库与云和应用程序框架无关,因此可以轻松地在不同平台、环境和机器之间迁移。
此外,我们应遵循以下原则,以确保微服务的安全性:
-
限制权限并将其保持在每个用户或服务角色所需的最小数量。
-
永远不要授予伪或特权帐户给其他人以运行服务。
-
始终限制对可用资源的访问权限,例如,我们应始终定义安全规则,以限制容器对主机操作系统的访问。
-
始终将机密信息存储在保险库中,并运行安全自动化检查,以检测存储在容器或仓库中的机密信息。
-
通过使用适当的安全规则为具有不同敏感级别的可用资源定义隔离或沙盒单元。
图 4.10 – 基于机器学习的微服务架构示例
Vault
Vault 是一种用于管理零信任网络中密钥的工具。它通过限制数据访问并保持机密性,提供了高水平的保护。
Vault 支持高吞吐量的 API 接口,帮助管理在不同环境中运行的大量微服务的密钥。它还提供灵活的身份验证方法,使用其可用插件,支持在 Nomad 或 Kubernetes 中运行的应用程序进行身份验证。Vault 拥有插件,可为在任何云上运行的应用程序提供自动身份验证,涵盖了从 Azure、AWS 和 GCP 到阿里巴巴和微微等云平台。
Vault 提供更好的安全管理,通过动态密钥使每个端点可以根据被评估的实体拥有独立的用户名和密码。通过这样做,Vault 可以提供额外的保护,并能防止因任何一个微服务的安全漏洞引发的连锁攻击。在这种情况下,攻击者不再能够攻击某个不安全的区域并访问密钥,从而获得对整个环境的访问权限。Vault 的另一个重要特性是它生成的动态密钥是有时间限制的,并且容易撤销。因此,在环境中发生安全漏洞时,管理员可以轻松撤销密钥。Vault 的这一功能防止了系统重启。
让我们来看一个例子,了解 Vault 如何通过撤销权限将攻击者从系统中移除,从而限制攻击范围和攻击面。如果一个具有零权限的服务账户(来自云提供商如 GCP、AWS 或 Azure)通过 Vault 进行身份验证,那么即使服务账户被攻破,临时服务账户(由 Vault 认证)也有助于缓解攻击。在 Vault 认证的服务账户下,攻击者无法像在没有 Vault 认证的情况下那样启动数百个虚拟机。Vault 还充分利用了各种云提供商的 密钥管理服务(KMSs)中的密钥轮换技术,促进动态密钥生成,从而增加额外的保护层。
Vault 启用 Kubernetes 的 auth
方法,使用 Kubernetes 服务账户令牌对客户端进行身份验证。Vault 代理用于提供以下功能:
-
自动身份验证
-
安全交付/存储令牌
-
这些令牌的生命周期管理(续期和重新认证)
现在让我们研究如何在 Kubernetes 集群中运行 Vault 代理的示例:
-
第一步是从 GitHub 克隆
hashicorp/Vault-guides
仓库:git clone https://github.com/hashicorp/Vault-guides.git
-
下一步是进入
Vault-guides/identity/Vault-agent-k8s-demo
目录:cd Vault-guides/identity/Vault-agent-k8s-demo
-
接下来,我们启动一个 Vault 开发服务器,在
0.0.0.0:8200
本地监听请求,使用root
作为根令牌 ID:Vault server -dev -dev-root-token-id root -dev-listen-address 0.0.0.0:8200
-
为了提供访问 URL,我们为 Vault CLI 导出一个环境变量,以指向 Vault 服务器:
export VAULT_ADDR=http://0.0.0.0:8200
-
为了创建一个服务账户,让我们启动一个在 minikube 中运行的 Kubernetes 集群:
minikube start --driver=docker
-
检查 minikube 环境的状态,确保它已完全可用:
minikube status
状态的输出应显示如下:
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
-
在验证状态后,我们检查
Vault-auth-service-account.yaml
的内容,以确认服务账户的创建。 -
接下来,我们创建一个名为
Vault-auth
的 Kubernetes 服务账户:kubectl create serviceaccount Vault-auth
-
更新
Vault-auth
服务账户:kubectl apply --filename Vault-auth-service-account.yaml
-
现在,为了配置 Kubernetes 的
auth
方法,我们在 Vault 中创建一个只读策略,名为myapp-kv-ro
:Vault policy write myapp-kv-ro - <<EOF path "secret/data/myapp/*" { capabilities = ["read", "list"]} EOF
-
在接下来的步骤中,我们在
secret/myapp
路径下创建一些测试数据:Vault kv put secret/myapp/config \ username='appuser' \ password='suP3rsec(et!' \ ttl='30s'
-
现在让我们设置环境变量,指向正在运行的 minikube 环境。在这里,我们将
VAULT_SA_NAME
环境变量的值设置为Vault-auth
服务账户:export VAULT_SA_NAME=$(kubectl get sa Vault-auth \ --output jsonpath="{.secrets[*]['name']}")
-
在这里,我们还将
SA_JWT_TOKEN
环境变量的值设置为用于访问TokenReview
API 的服务账户 JWT:export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME \ --output 'go-template={{ .data.token }}' | base64 --decode)
-
接下来,我们将
SA_CA_CRT
环境变量的值设置为与 Kubernetes API 通信时使用的 PEM 编码 CA 证书:export SA_CA_CRT=$(kubectl config view --raw --minify --flatten \ --output 'jsonpath={.clusters[].cluster.certificate-authority-data}' | base64 --decode)
-
现在应该能够获得 minikube 的 IP 地址,因此我们将
K8S_HOST
环境变量的值指向该地址:export K8S_HOST=$(kubectl config view --raw --minify --flatten \ --output 'jsonpath={.clusters[].cluster.server}')
-
最后,我们需要在默认路径(
auth/kubernetes
)启用并配置 Kubernetes 的auth
方法:Vault auth enable kubernetes
-
此外,我们还需要让 Vault 知道如何与 Kubernetes(minikube)集群通信:
Vault write auth/kubernetes/config \ token_reviewer_jwt="$SA_JWT_TOKEN" \ kubernetes_host="$K8S_HOST" \ kubernetes_ca_cert="$SA_CA_CRT" \ issuer="https://kubernetes.default.svc.cluster.local"
-
在配置好所有内容后,最后我们需要创建一个名为
example
的角色,将 Kubernetes 服务账户映射到 Vault 策略和默认令牌的生存时间(TTL):Vault write auth/kubernetes/role/example \ bound_service_account_names=Vault-auth \ bound_service_account_namespaces=default \ policies=myapp-kv-ro \ ttl=24h
如我们在前一步所见,Vault 的每种身份验证方法都映射到一个角色。角色又映射到N个策略。策略提供了一种声明式的方式来授予或禁止对 Vault 中某些路径和操作的访问。以下代码片段演示了如何将路径与不同的权限关联:
path "secret/ms-1" {
capabilities = ["read"]
}
path "secret/ms-2" {
capabilities = ["update"]
}
Vault 提供键值存储,可以用来创建一个密钥并将其值存储在指定路径中,如此处所示:
Vault kv put secret/my-secret sec_val="value"
Vault 也可以作为加密服务运行,将来自前端应用的明文数据通过 Vault 的秘密进行加密,然后通过任何基于云的微服务传递给后端应用:
现在让我们理解如何在 Google Cloud 中运行 Vault,配备存储后端、Kubernetes 集群和 Google 的 KMS 服务,如图 4.11所示:
图 4.11 – 如何在 Google Cloud 中使用 Vault
为了运行 Vault,我们应始终将其运行在完全隔离的 Kubernetes 集群中,以防止其受到任何可能危及生产环境的外部威胁。前面图中所示的云存储单元有助于存储动态密钥。Vault 还需要一种人工或自动化的方法来解封/解锁密钥,这些密钥通常被拆分并存储在其中。以下代码片段通过 auto-unseal
生成恢复密钥。通过自动封印过程,我们能够启用自动构建解密数据加密密钥所需的主密钥:
-
首先,我们需要初始化 Vault 服务器:
vault operator init
-
KMS 用于通过其自动密钥轮换功能解锁拆分的密钥(例如,在系统重启时)。密钥轮换命令执行如下:
gcloud kms keys update <KEY_NAME> \ --location <LOCATION> \ --keyring <KEYRING_NAME> \ --rotation-period <ROTATION_PERIOD> \ --next-rotation-time <NEXT_ROTATION_TIME>
现在我们已经看到使用 Vault 实现云无关架构的安全选项,接下来让我们看看 AWS 在 弹性 Kubernetes 服务(EKS)中运行的单个微服务所提供的安全选项。此外,这些服务相互依赖,一个微服务在 Kafka 集群中发布的消息(即 Amazon Managed Streaming for Apache Kafka(MSK))会被其他微服务消费。AWS 提供的安全机制在图 4.12中有所展示。
图 4.12 – 在基于 ML 的企业解决方案中使用 Vault
在这里,我们找到四个不同服务中的身份验证机制:
-
传输层安全性(TLS)1.2 在 API 网关中用于与 AWS 资源的通信。
-
Apache Kafka 的身份验证和授权,其中使用 IAM 来验证客户端并允许或拒绝 Apache Kafka 操作。Kafka 操作的另一种允许或拒绝机制是通过使用 TLS 或 SASL/SCRAM 和 Apache Kafka ACLs。
-
Amazon MSK 集群的简单身份验证和安全层/加盐挑战响应身份验证机制(SASL/SCRAM)基于用户名和密码的身份验证可以用来增强保护。通过这种方法,凭证可以使用 KMS 加密并存储在 AWS Secrets Manager 中。
-
使用 AWS KMS 对 MSK 集群进行数据加密可以提供透明的服务器端加密。此外,TLS 1.2 可以在 MSK 集群的代理之间提供数据传输加密。此外,我们还可以使用 Kerberos、TLS 证书和高级访问控制列表(ACLs)来建立代理与 Zookeeper 之间的安全性。
现在让我们了解将安全特性添加到云系统架构中所需的基本要素。
云安全架构
在本节中,我们将探讨组织在云安全架构方面应标准化的主要安全原则。在此,我们还将研究一些如何在数据和模型在团队之间共享时架构可扩展安全架构的示例。
我们的大多数基于 SaaS 的机器学习应用在部署到云端时需要不同级别的安全性、访问控制和数据保护技术。我们仍然可以利用 Azure、Google Cloud 和 AWS 提供的现有安全架构,或者为我们自定义的云解决方案(承载预测 API)构建一个平台独立的安全框架。不论我们选择哪种方案,重要组件包括云访问安全代理(CASB)、API、代理、网关和身份与访问管理。这些工具帮助我们构建共享责任云模型和零信任架构。
对于任何基于云的机器学习系统,我们需要定期量化云架构面临的风险。在此过程中,我们需要考虑渗透测试的执行程度,是否已实施多因素认证和单点登录(SSO)等认证方法,以及各个云组件与企业认证和目录的集成程度。此外,还应考虑过去的安全漏洞记录及其严重性。
现在,让我们深入探讨云安全架构的基础原则(www.guidepointsecurity.com/education-center/cloud-security-architecture/
):
-
身份识别:保持关于用户、资产、业务环境、政策、漏洞和威胁等在云环境中存在的完整信息。
-
安全控制:定义参数并强制实施跨用户、数据和基础设施的政策,以更好地管理、评估和访问安全态势。
-
安全设计:遵循标准和指南,并进行及时审计,以定义每个用户及其对应设备的角色和责任。为每个大数据和机器学习处理组件执行安全配置,无论是否自动化运行。
-
合规性:纳入新标准进行审查,并及时引入安全验证过程。将现有的行业标准和监管组件与最佳实践集成到架构中。
-
边界安全:定义并遵守流量流动规则(通过设置代理和防火墙),确保不允许限制的流量从组织的云资源流向公共互联网。
-
分段:在隔离和划分微服务(包括训练、预处理和后处理作业)时,遵循最小权限原则,以防止在对抗性攻击中发生横向移动。
-
用户身份和访问管理:执行访问权限和额外的协议措施,以确保透明性并提高所有用户和设备对公司系统的可见性。将此范围扩展到参与机器学习训练的设备,适用于像联邦学习这样的场景。
-
数据匿名化/假名化:遵循第二章中讨论的加密方法,处理流数据和静态数据。此外,任何微服务之间的通信应加密,以降低风险。
-
自动化:促进快速的安全性和配置供应及更新,并快速检测威胁。
-
日志记录和监控:引入适当的工具,以在流水线中启用日志流动。这些日志将为各个部署中的故障和警告提供洞察力。允许一致地收集日志,以监控威胁并发出警报。
-
可见性:教育团队使用适当的工具和流程,确保多个机器学习解决方案在不同部署中的透明度和可见性。
-
灵活设计:不仅在架构和开发中实施敏捷方法论,还在安全生命周期管理中贯彻这一方法,以确保及时的修补和证书更新。根据需要,灵活地添加和修改额外的组件或安全层,以保护组织的系统和云资源。
既然我们已经了解了主要的设计原则,接下来让我们看一下如何通过一个包含特征存储的架构实践,建立对数据的安全控制、安全设计和分段原则。特征存储示例
在沙箱环境中开发
本节中,我们将了解不同团队如何在受限环境中进行开发。
图 4.13 说明了使用多个组件在 AWS 中创建沙箱环境(aws.amazon.com/blogs/security/how-to-centralize-and-automate-iam-policy-creation-in-sandbox-development-and-test-environments/
),供不同数据科学和工程团队在模型生命周期的不同阶段使用,包括特征工程、模型训练、测试和部署。可以根据具体情况为团队授予非常具体的安全权限。每个团队还可以根据团队的具体需求进一步定制该工作流。此外,一些团队可以将数据推送到特征库,其他团队可以从特征库中访问和读取数据,以便在其内部开发过程中使用。沙箱环境通过限制对单独团队的特权,从而促进协作。
现在,让我们参考图 4.13,尝试理解如何根据账户类型设置受限权限,并使用 AWS CodePipeline 创建和管理跨多个 AWS 账户运行的工作流:
-
沙箱管理员可以使用 S3 桶上传 IAM 策略。
-
自动化管道中的 IAM 角色用于访问存储 IAM 策略的 S3 桶。
-
AWS KMS 密钥用于加密 S3 桶中的 IAM 策略。
-
AWS Lambda 服务用于验证允许/拒绝权限。
AWS 用户(例如 Alice)可以使用 IAM 可视化编辑器授予适当的访问权限和权限,允许团队(例如数据科学团队 A)启动并管理 EMR 集群,以处理来自 S3 数据集的数据。IAM JSON 策略文档可以通过AWS 密钥管理服务(AWS KMS)密钥上传到 S3 桶中。
AWS CodePipeline 还可以查询 AWS 中的中央 Lambda 函数,查询 IAM JSON 策略文档并执行一系列验证检查。在此,Lambda 函数还可以将拒绝规则附加到 IAM 策略中,以限制沙箱账户中的用户权限。在验证成功后,Lambda 函数会创建用户策略(Alice),从而成功设置管道,进一步允许用户将其附加到正确的 IAM 用户、组或角色。如果 IAM JSON 策略失败,用户需要修改它以使其符合安全指南,并重新提交。
因此,我们可以看到如何通过 IAM 角色选择来隔离团队的工作环境。这也有助于根据需求实施限制性访问权限和特权。
图 4.13 – 基于访问控制的沙箱环境中的分区
当我们的 ML 解决方案通过云平台被多个用户的应用程序访问时,我们可以使用称为 Cloud Access Security Brokers(CASB)的代理,来提供有关潜在及即将发生的网络威胁的洞察。微软通过使用 Microsoft Defender for Cloud Apps (docs.microsoft.com/en-us/defender-cloud-apps/what-is-defender-for-cloud-apps
) 利用这样一个代理服务,该服务能够跨部署平台(通过 API 连接器和反向代理)促进日志收集和监控活动。这类服务有助于执行企业级安全措施,从而帮助我们实时保护组织资源。此外,它还作为支持不同部门(如人力资源、薪资、招聘等)之间内容协作的工具,每个部门可能有自己独立的 ML 服务和数据合规要求。Defender for Cloud Apps 的独特安全功能包括:
-
可见性:通过追踪每个用户对各个服务的访问权限,检测并标记所有云服务,按排名生成。
-
数据安全:通过 DLP 控制敏感信息,并参考内容上的安全标签。
-
威胁保护:利用 用户与实体行为分析(UEBA)识别异常行为和趋势,并提供 自适应访问控制(AAC)以缓解恶意软件风险。自适应安全或 AAC 也被称为零信任安全,这意味着默认不信任任何用户。由于基础策略不附带任何信任,结合灵活的支持和持续的监控技术,可以帮助用更新的自适应政策替代过时的传统基础设施。
-
合规性:构建报告和仪表板,以支持云和 ML 治理实践,确保满足数据驻留和监管合规要求。
-
下图展示了 Defender for Cloud Apps 如何融入基于云的架构中。Cloud Discovery 服务能够发现组织私有企业云中使用的应用程序。此外,防火墙和代理的应用程序级日志也可以进行分析。它还利用应用程序连接器提供有关应用程序治理的见解,并提供更好的保护。这些应用程序连接器通过云服务提供商的 API 与 Defender 服务进行集成。
使用 Microsoft Defender for Cloud Apps,可以采用反向代理架构结合条件访问应用控制。这种访问控制有助于提高对云环境中活动的可见性。Defender for Cloud Apps 可用于动态设置策略,并识别来自可疑数据点和未保护端点的风险。策略通常有助于整合修复过程,从而制定风险缓解计划。微软还提供了一个云应用目录,评估正在使用的应用所暴露的风险,考虑到监管认证、行业标准和最佳实践。
每个应用可以通过设置来限制传入请求的速率,使用限流规则,或通过动态时间窗口来调整 API。尽管这个过程会增加执行大规模 API 请求扫描操作所需的时间,但它同时有助于保护我们免受不良对抗性请求的侵害。
高效使用加密过程,避免在源代码和 Docker 文件中包含凭据,并应用不同的阻止策略,进一步提升安全标准。
以下图表进一步说明了如何授权一组受保护的应用访问云环境,并确保数据安全和合规性。通过增加代理、防火墙和应用治理等组件,监控和日志记录变得更加容易。此外,我们还可以看到可以跟随的逐步安全控制措施(基于角色的访问控制 (RBAC) | 策略管理 | 发现 | 设置 | 实时控制),这些措施有助于增强我们的安全防护体系。所有安全控制措施将在图 4.14中进一步解释:
图 4.14 – 启用受保护云应用访问的不同安全功能
这些内容在下表中进行了详细说明,包括安全管理策略及相应的操作:
项号 | 生命周期安全管理策略 | 操作 |
---|---|---|
1. | 基于角色的访问控制 (RBAC) | 审查有权访问 Defender for Cloud Apps 门户的用户,并验证其角色是否符合要求。验证具有访问权限的外部用户清单。 |
2. | 实时控制 | 从条件访问策略中增加/移除旧用户。更新第三方身份提供商的 SAML 证书。 |
3. | 策略管理 | 更新并重新审视策略。为发出警报制定个别策略。确保标签策略与当前的安全性和合规性配置对齐。 |
4. | 发现 | 通过删除旧数据源并添加/禁用应用连接器来升级日志收集器。 |
5. | 设置 | 审核托管的域,验证、添加或删除公司和 VPN 应用程序的当前 IP 范围。允许基于应用程序是否已批准、未批准或使用的标签类型来过滤应用程序。调整评分指标。移除成员查看信息的权限和特权。 |
表 4.1 – 安全管理策略
在云编排服务中管理机密
在诸如 Kubernetes(这是一个便携、可扩展的开源平台,负责管理容器化工作负载和服务:kubernetes.io/docs/home/
)这样的编排服务中,机密可以通过 API 轻松修改(kubernetes.io/docs/concepts/configuration/secret/
),因为它们以未加密的方式存储在 API 服务器的 etcd 数据目录中。即使是被授权在命名空间中创建 Pod 的团队或个人,也可以使用相同的访问权限读取该命名空间中的机密。保护这些机密的关键方法如下:
-
启用机密数据的静态加密。
-
启用并配置 RBAC 规则以限制读取权限,防止读取机密数据。
-
利用 RBAC 的使用来选择性地选择并允许主体创建新机密和替换现有机密。
现在让我们讨论监控和威胁检测的重要性,并了解其中的主要组件。
监控与威胁检测
为了在生产环境中运行启用安全的系统,我们需要将威胁检测策略纳入受保护的云环境。我们的监控操作应该自动化,以便我们能够快速检测恶意活动,并采取缓解措施中和漏洞。如果我们未能及时检测,我们将面临将关键信息和敏感数据丧失给攻击者的风险。
生产中的机器学习服务主要面临两种类型的威胁——已知威胁和未知威胁,其中未知威胁是攻击者使用新方法和技术进行的攻击。可以通过使用威胁情报服务来应对这两种威胁,例如安全信息和事件管理(SIEM)系统、杀毒软件、入侵检测系统(IDS)和网络代理技术。
IT 和信息安全策略的主要组成部分之一是跟踪和监控用户及实体行为分析,以防止攻击并进行根本原因分析。安全团队采取的另一个重要主动措施是设置陷阱,希望攻击者会上钩。这些陷阱可能包括蜜罐目标。这些陷阱对攻击者具有诱惑力,促使他们发动攻击。一旦他们进入系统,警报将发送给安全团队,通知所有人有可疑活动,应该立即处理。
第三个威胁检测机制是使用安全工具,通过主动扫描服务、网络和端点来发现并提出警报,以识别潜在的威胁或攻击,这些威胁或攻击可能尚未被检测到。
一个强大的威胁检测程序应该通过采用先进的安全技术来包含以下防御措施:
-
从整个网络收集事件聚合数据,包括身份验证、网络访问以及来自云系统中关键组件和微服务的日志。
-
分析网络流量模式,并监控受信任网络与外部接口之间的流量。
-
利用端点威胁检测技术,从用户机器收集并提供恶意事件的日志,以协助威胁调查过程。
主要的威胁检测组件应该具备处理实时数据流和存储在数据库或缓存中的数据的内置功能。换句话说,它们应该在所有组件(包括代理、负载均衡器、微服务、数据库、缓存和消息传递管道)上运行监控代理,以帮助事件响应和警报。
现在让我们通过一个例子来看看 AWS 如何根据严重性对不同的事件进行分类,方法是监控 VPC 流日志、DNS 日志和来自 Amazon CloudTrail(记录用户活动和账户使用情况)的日志。AWS 云有一个名为 GuardDuty 的服务(见图 4.15),它会不断扫描恶意活动和对抗性攻击。它使用 ML、异常检测和集成威胁情报来识别攻击的严重性。
图 4.15 – AWS GuardDuty 用于监控日志并分类事件
在将训练管道和基于 ML 的微服务投入生产之前,必须检查的清单之一是列出STRIDE 威胁——即欺骗、篡改、否认、信息泄露、拒绝服务和权限提升——跨越所有信任边界,以寻找一种有效的方法,在开发阶段捕捉设计错误,而不是等到为时已晚才发现它们。应根据现有和新兴的漏洞领域部署泄漏检测工具,如端口扫描器和网络监控器。现在我们已经看到了缓解威胁所需的安全属性,让我们快速总结一下我们所学到的关于主要安全组件的内容,这些组件是我们应该投资精力的领域,以识别潜在的数据和隐私泄露问题。
总结
在本章中,我们了解了大数据架构中针对批处理和流处理数据的不同安全实践。我们审查了不同的组件及其交换的信息,以便在 Hadoop 生态系统中设置授权和认证过程。我们进一步扩展了范围,了解了如何通过分析对抗性模型训练的设计策略,使模型训练管道适应可扩展架构。我们探讨了包括从头开始重新训练、持续训练和两阶段持续训练等概念,深入了解了诸如隐私保护重新训练等概念。我们对安全的基于机器学习的微服务设计进行了考察,从中获得了如何在个别微服务中嵌入安全层的见解,尤其是在一个微服务依赖于另一个微服务的敏感数据时。
当我们谈论隐私保护训练时,我们探讨了如何运行可扩展的基于差分隐私的机器学习系统。我们还讨论了云安全设计的原则以及在不同基础设施中监控威胁的方法。本章通过具体的例子帮助我们进一步学习了如何在团队之间(使用隔离的沙箱环境)建立合作,同时遵循最小特权原则。在深入了解机器学习和大数据管道的隐私方面后,我们将在接下来的章节中探讨如何确保数据收集的公平性,并设计公平的算法。
在下一章中,我们将关注公平性的一些重要考虑因素,以及可用于生成公平合成数据的机制。
进一步阅读
-
分析自然语言模型更新中的信息泄漏,Zanella-Béguelin Santiago,Lukas Wutschitz,Shruti Tople,Victor Rühle,Andrew Paverd,Olga Ohrimenko,Boris Köpf,Marc Brockschmidt. 2020 年。
arxiv.org/pdf/1912.07942.pdf
-
为可扩展的基于随机梯度下降的分析添加差分隐私,Wu Xi,Fengan Li,Arun Kumar,Kamalika Chaudhuri,Somesh Jha,Jeffrey Naughton. 2017 年。
andrewxiwu.github.io/public/papers/2017/WLKCJN17-bolt-on-differential-privacy-for-scalable-stochastic-gradient-descent-based-analytics.pdf
-
对抗性定向遗忘在正则化和基于生成的持续学习模型中的应用,Umer Muhammad 和 Robi Polikar。
arxiv.org/pdf/2102.08355.pdf
-
EasyFL:一个低代码的联邦学习平台,ArXiv abs/2105.07603 (2022),Zhuang, Weiming 等。
arxiv.org/pdf/2105.07603.pdf
-
通过对抗性后门攻击在持续学习者中实现定向遗忘和虚假记忆的形成, Umer Muhammad 和 Glenn Dawson 和 Robi Polikar.
arxiv.org/pdf/2002.07111.pdf
-
使用 Vault 进行微服务安全
www.hashicorp.com/resources/microservice-security-with-Vault
-
在测试时保护机器学习免受对抗样本的攻击, Lin, J., Njilla, L.L. , 和 Xiong, K.EURASIP 信息安全期刊 2022.
jis-eurasipjournals.springeropen.com/articles/10.1186/s13635-021-00125-2
-
一种针对远程机器学习服务隐私风险的防护框架, Bai Yang, Yu Li, Mingchuang Xie, 和 Mingyu Fan.
www.hindawi.com/journals/scn/2021/9924684/
-
从云到边缘:面向物联网应用的分布式和轻量级安全大数据管道。Feras Awaysheh, Awaysheh, Feras. (2021).
www.researchgate.net/publication/356343773_From_the_Cloud_to_the_Edge_Towards_a_Distributed_and_Light_Weight_Secure_Big_Data_Pipelines_for_IoT_Applications
-
“机器学习作为可重用的微服务,” NOMS 2018 - 2018 IEEE/IFIP 网络操作与管理研讨会, M. Pahl 和 M. Loipfinger,2018 年,第 1-7 页,
ieeexplore.ieee.org/document/8406165
-
通过客户管理的加密 密钥 保护模型
cloud.google.com/bigquery-ml/docs/customer-managed-encryption-key
-
InterpretML:机器学习的统一框架, Nori Harsha, Samuel Jenkins, Paul Koch, 和 Rich Caruana
arxiv.org/pdf/1909.09223.pdf
第五章:ML 流水线、模型评估与不确定性处理
本章从介绍 AI/ML 工作流开始。随后,本章深入探讨用于分类、回归、生成和强化学习的不同 ML 算法。还讨论了与这些算法的可靠性和可信度相关的问题。我们首先介绍 ML 流水线的各个组件,并解释了持续训练的必要性。接着,本章简要探讨了分类、回归和聚类任务中重要的 AI/ML 算法。进一步地,我们讨论了识别学习算法中的偏差和模型预测不确定性的原因。
本章将通过以下几个部分来覆盖这些主题:
-
了解 ML 流水线的不同组件
-
ML 任务和算法
-
模型预测中的不确定性原因
-
分类算法中的不确定性
-
回归算法中的不确定性
进一步,我们将编写 Python 代码来量化回归任务中的 aleatoric 和 epistemic 不确定性。
技术要求
本章要求您使用 Python 3.8,并安装一些必要的 Python 包:
-
TensorFlow 2.7.0
-
NumPy
-
matplotlib
-
Keras-Uncertainty – 安装方法如下:
!pip install --user git+https://github.com/mvaldenegro/keras-uncertainty.git
了解 ML 流水线的不同组件
正如任何数据科学家所知道的,ML 的效果取决于它所训练的数据。在现实世界中,数据是混乱和复杂的。因此,构建一个成功的 ML 系统不仅仅是构建算法。它还需要一个庞大且复杂的基础设施来支持。这包括从收集和清洗数据到部署和监控模型的各个方面。问题更加复杂的是,系统中的任何变动都可能引发连锁反应。例如,超参数的轻微调整可能需要改变数据的收集和处理方式。因此,构建一个成功的 ML 系统是一项极为复杂的任务。
图 5.1 – ML 工作流
我们可以将 ML 工作流分为五个主要组件:
-
数据提取:这是为训练模型收集所需数据的阶段。它是从一个更大的数据集中识别相关信息并将其转换为可用于进一步分析的格式的过程。这可以手动完成,但通常使用自动化算法来完成。数据提取可以用来从电子邮件列表中提取联系信息,识别股票价格趋势,或发现潜在的新客户。数据可以以不同形式存在(表格数据、图像文件、文本等)。数据的选择由具体用例的业务需求决定。例如,如果你的用例是零售领域的人工智能,你将拥有诸如产品图片和标签等数据。数据提取的过程通常从预处理开始,预处理涉及从数据集中识别相关信息。一旦相关信息被识别出来,它就会被转换为机器学习算法可以使用的格式。这使得算法能够专注于最相关的信息并忽略无关数据,从而提高机器学习算法的准确性,并帮助加快训练过程。
-
数据工程:在这一阶段,数据会被分析、清洗、探索,并预处理后传入模型。该阶段可能涉及将一个或多个特征合并和/或对数据进行降维处理,以提高计算效率。数据工程的目标是创建一个既准确又能代表现实世界的、可重复的数据集。
-
模型训练:这是一个迭代过程,其中进行模型实验。它包括选择最佳模型、进行超参数调优,并使用所需的指标验证训练过的模型。找到一组合适的超参数是一门艺术,在早期的机器学习发展中,只有一些专家能够有效地做到这一点。因此,许多人曾称机器学习为“炼金术”。然而,今天,借助强大可靠的优化器和 AutoML 功能,我们能够生成可靠且可重复的结果。值得一提的是,这一步骤是时间密集型和计算密集型的。
-
模型部署:最终模型部署到生产环境。监控模型的性能非常重要,一旦性能下降,应报告并采取相应的措施。已部署的模型需要监控 数据漂移 和 概念漂移。我们将在 第六章 中详细讨论这些概念。
-
用户界面:一旦模型部署完成,它就可以被使用。它将接收用户输入并进行预测,结果可以通过可视化仪表板分享出去。
根据专业水平和需求,机器学习管道的不同组件可以手动完成、作为 MLOps 自动化(详细信息请参考 第六章),或完全自动化为 CI/CD 流程。
机器学习任务和算法
一般来说,机器学习任务可以分为四类:分类、回归、聚类和降维(图 5.2)。
图 5.2 – 不同的机器学习任务和常见算法
对于每个任务,都存在许多标准算法。为了完整性,我们将列出机器学习任务及其常见算法:
-
分类:当数据需要被分为不同的类别或类时,我们使用分类算法。这是一个监督学习问题,目标是根据训练数据预测新样本的离散类别标签。分类是机器学习中最常用的技术之一,应用广泛,从识别垃圾邮件到人脸识别。分类的基本思想是构建一个模型,能够学习输入数据与类别标签之间的关系。然后,这个模型可以用于对新数据点进行预测。对于分类任务,有多种不同的算法可以选择,每种算法都有其优缺点。算法的选择主要取决于数据的性质和预测精度的要求。
-
回归:在机器学习中,回归是一种用于预测连续值的技术,比如价格或重量。它假设预测变量和响应变量之间存在线性关系。换句话说,随着预测变量的增加,响应变量也会按固定量增加(或减少)。回归模型可用于识别哪些预测因子对确定响应变量的值最为重要,也可用于估计预测中的不确定性。尽管回归方法简单,但它是一个强大的工具,能够解决许多实际问题。回归问题与分类问题一样,是一种监督学习问题。
-
聚类:聚类是机器学习中的一种技术,它将相似的数据点分组在一起。它被用于细分客户、分类文档和识别数据中的模式。有许多不同的聚类算法,但它们都遵循相同的原理:通过找到数据点之间的相似性,将数据划分为多个组,称为簇。聚类是一种无监督学习技术,这意味着它不需要标记数据。这使得聚类特别适合用于探索性数据分析。聚类可以用来在数据中寻找结构,生成关于数据如何组织的假设,并识别异常值。通过将相似的数据点聚集在一起,聚类可以简化复杂的数据集,使其更易于处理。聚类是机器学习和数据科学中的一项基本工具。它可以单独使用,也可以与其他技术结合使用来解决各种问题。许多聚类算法,如 K 均值,基于无监督学习范式。
-
降维:在机器学习中,降维是减少数据集中特征数量的过程。这样做有多种原因,例如减少训练时间或提高模型的性能。降维有许多不同的方法,最合适的方法将取决于数据集和所期望的结果。一些常见的方法包括主成分分析(PCA)和线性判别分析(LDA)。一般来说,降维可以作为提高机器学习模型的有用工具。然而,重要的是要为特定数据集和预期结果仔细选择合适的方法。否则,它可能会损害模型的性能。
以下表格列出了常用于每个任务的一些算法和深度学习模型。
分类 | 回归 | 聚类 | 降维 |
---|
|
-
逻辑回归
-
支持向量机
-
决策树分类器
-
随机森林分类器
-
XGBOOST 分类器
-
朴素贝叶斯分类器
-
多层感知机
-
卷积神经网络
|
-
线性回归
-
岭回归
-
决策树回归
-
随机森林回归器
-
支持向量机回归器
-
神经网络回归器
-
Lasso 回归器
|
-
K 均值
-
基于密度的空间聚类
-
高斯混合模型
-
亲和传播聚类
-
平衡迭代缩减和聚类层次
-
均值漂移聚类
-
聚合层次聚类
-
排序点以识别聚类结构(OPTICS)
|
-
主成分分析
-
T 分布随机邻居嵌入
-
奇异值分解
-
线性判别分析
-
因子分析
-
多维尺度分析
-
随机森林
|
表 5.1 – ML 算法表
表 5.1 中列出的算法采用了监督学习或无监督学习范式。然而,机器学习还有第三种范式——强化学习(RL)。它已经被探索用于训练人工智能代理进行游戏、用于自动驾驶汽车,以及在 AutoML 中找到适合不同任务的最佳模型和超参数。
此外,近年来,研究人员已经开发出了可以生成数据的 AI 算法(例如,生成对抗网络、变分自编码器、扩散模型等)。这些算法已经被探索用于生成文本、图像、艺术作品等。
每种算法都有其优缺点,因此选择最优算法来完成任务通常需要通过不同算法进行反复迭代,并选择在评估指标上表现最好的算法。然而,为了构建一个负责任的 AI 解决方案,重要的是要对模型进行偏差和公平性评估,并且让最终用户意识到模型预测的不确定性。
在接下来的章节中,我们将讨论不确定性以及如何估计模型预测中的不确定性。
机器学习中的不确定性
机器学习与不确定性是密不可分的。毕竟,机器是从本身就具有不确定性的数据中学习的。这些数据可能是嘈杂的、不完整的,甚至完全错误的。因此,机器从这些数据中得出的任何结论都将受到某种程度的不确定性影响。因此,我们需要意识到在任何结果中固有的不确定性,并适当考虑它。只有这样,我们才能在决策过程中最大限度地利用机器学习。为了说明这一点,这里给出一个使用 EfficientNet
的预测,它是 ImageNet
数据集中得分最高的网络之一(Tan 和 Le,2019)。
EfficientNet
接收以下图像:
图 5.3 – 来自 ImageNet 数据集的 EfficientNetB0 输入
它返回以下输出:
Predicted: [('n04326547', 'stone_wall', 0.81027746)]
如你所见,在展示一张木头原木的照片时,模型将其预测为 'stone_wall'
,置信度为 81%。
在我们深入探讨机器学习中的不确定性之前,回顾一下人类如何应对不确定性会非常有帮助。如果你被问到一个问题——比如“今天的纳斯达克指数是多少?”——如果你关注股市,你可能会给出其数值,或者可能会说它是看涨的还是看跌的,具体情况而定。但如果你不关心股市,你可能会简单地说“我不知道。”然而,机器学习算法无论输入是什么,都会给出一个预测。因此,如果你有一个训练过的机器学习算法来分类花卉,它会告诉你你是何种花卉,即使人类的识别并不是它的领域。如果我们的机器学习模型也能说“抱歉,我不知道——它不在我的领域内!”那该多好。例如,考虑自动驾驶汽车:它应该能够告诉司机“嘿,我不确定我看到的是否是行人。你能接管吗?”当我们使用深度学习模型进行重要决策时,比如提供贷款、提供医疗服务等等,这一点变得尤为重要。
解决这个问题的一种方法是量化预测中的不确定性,这样当模型做出预测时,它会告诉我们对预测的信心有多大,或者它的预测有多可靠。在本节中,我们将探讨一些不确定性如何定量描述的方法。但首先,让我们看看不确定性的不同类型以及它们的成因。
不确定性的类型
在机器学习中,我们通常讨论两种不同类型的不确定性。第一种是随机不确定性,指的是数据中的固有噪声。例如,两个测量同一事物的人可能会得到略有不同的结果。另一种不确定性是认知不确定性,指的是我们对模型本身缺乏知识。例如,如果我们试图预测股票价格,总会存在一些不确定性,因为我们无法了解股市的所有信息。不确定性是机器学习中的一个重要部分,理解不同类型的不确定性可以帮助我们构建更好的模型。
让我们深入探讨不确定性的类型。
随机不确定性
随机不确定性代表了由于自然过程的随机性而存在的不确定性。这是固有的不确定性,由于概率变异性而存在。例如,在抛硬币时,总会存在一定程度的不确定性,无法预测下次抛掷是否会是正面或反面。无论我们有多少数据,都无法消除这种不确定性。再举个例子,如果我们试图预测天气,由于大气的混沌特性,总会存在一些不确定性。我们无法消除这种不确定性。本质上,每次重复实验时,结果都会有一定的变异。
认知不确定性
认识论不确定性源于知识缺乏或信息不足。知识缺乏的原因可能有很多,例如对基础过程理解不充分、对现象的知识不完整等。这种类型的不确定性是可以减少的。
例如,你可以获取更多数据,进行更多实验,等等。你也可以尝试通过使用更强大的模型或更长时间的训练来减少不确定性。
预测不确定性
在机器学习(ML)中,我们主要关注预测中的不确定性,也叫预测不确定性。根据输入数据,预测不确定性有三种类型:
-
领域内不确定性:这种不确定性的原因是训练数据分布不均,例如,类别 A 的样本比类别 B 更多。这种不确定性可以通过提高数据质量来减少。
-
领域转移不确定性:当训练数据分布与实际情况发生显著变化时,会产生这种不确定性。例如,当一个模型被训练用来识别面部时,当面部被遮挡,或人戴眼镜、帽子或口罩时,模型的表现就会变差。通过在训练中加入遮挡样本,可以改善模型的性能。
-
领域外(OOD)不确定性:顾名思义,当输入来自一个完全未知的子空间时,就会产生这种不确定性。例如,如果我们训练一个识别狗照片的模型,并将其输入一张人类的照片,机器学习算法无法判断该输入是否超出了其已学习的领域。
不确定性的原因
不确定性有多种原因(有关更多细节,请参阅 Zio 和 Pedroni 2012 年的出版物——详见进一步阅读部分):
-
知识缺乏:在监督学习任务中,这可以被理解为缺乏能够 encapsulate 输入和输出之间关系的数据。这种缺乏可能是定量的——例如,我们可能不知道特征的概率分布——也可能是定性的,特征及其分布已知,但描述问题的特征却未知。通过获取更多数据,并与领域专家密切合作,可以减少这种不确定性的来源。
-
数据过剩:尽管如今我们可以存储和访问大量数据,但问题在于如何找到与使用案例相关的特征。严格的特征工程和数据探索有助于选择相关的特征。
-
数据的冲突性:当我们构建一个机器学习模型时,输入特征和输出变量应该具有某种因果关系。然而,尽管有专家知识,我们永远无法确定数据中看到的相关性是否也是因果关系。一个有趣的关于幽默相关性的例子可以在这个网站上找到:
www.fastcompany.com/3030529/hilarious-graphs-prove-that-correlation-isnt-causation
。 -
测量误差:通过传感器测量物理量时,由于测量设备本身的性质,总是会有一定程度的不确定性。
-
语言歧义:在不同的语境下,词语常常有不同的含义。尽管自然语言处理和新型变换器架构(Vaswani, 2017)取得了巨大进展,能够几乎像人类一样对话(
blog.google/technology/ai/lamda/
),我们仍然没有能够理解人类语言复杂性的系统。 -
分析师意见的主观性:最后,还有一个人类因素。由于数据分析师的主观解读,可能会存在不确定性。同一组数据可能会根据数据分析师的文化背景和能力,导致不同的解释。
正如我们所看到的,虽然有一些方法可以减少不确定性的原因,但完全消除它们是不可能的。因此,在本章的接下来的部分,我们将找到量化和减少不同机器学习任务中不确定性的方法。
量化不确定性
我们可以将文献中现有的深度神经网络不确定性量化方法分为四种类型。这些方法基于所使用的深度神经网络的数量(单一或多重)和性质(确定性或随机性)。图 5.4 显示了文献中不同类型的不确定性量化方法。
图 5.4 – 不同的不确定性量化方法
让我们了解这些方法:
-
单网络确定性方法:传统神经网络在训练后固定权重,因此对于相同的输入,每次预测结果都是相同的。在单网络确定性方法中,通常使用传统神经网络,但为了向模型添加不确定性分数,可以通过改变网络架构或损失函数来修改网络(内部方法)。另外,还有一些方法(外部方法),即模型和训练不发生变化,而是通过额外的组件来测量不确定性。例如,训练两个神经网络,一个用于实际的预测任务,另一个用于预测第一个网络预测中的不确定性。
-
贝叶斯方法:这些方法使用贝叶斯方法。在变分推理方法中,通常的做法是通过在一系列可处理的分布上优化,来近似后验分布。这是通过最小化 KL 散度来实现的。采样方法基于马尔科夫链蒙特卡洛(MCMC)方法。拉普拉斯近似方法通过近似对数后验分布,并基于此推导出网络权重的正态分布。
-
集成方法:这些方法使用多个传统的确定性神经网络。多个模型的预测结果会合并成一个预测结果。由于该方法依赖于多种集成,变化可以通过使用随机初始化和数据打乱来引入。使用如袋装法(bagging)和提升法(boosting)等方法来改变训练数据的分布,以及数据增强,是常见的使用多个模型的方法。
-
测试时增强方法:这里的想法是通过数据增强技术从原始测试数据中创建多个测试数据。增强后的测试数据可以探索不同的视角,并能够捕捉不确定性。
在这四种方法中,单网络确定性方法非常直接,易于实现,并且计算开销较小。近年来,贝叶斯方法引起了大量关注,随着像 TensorFlow Probability 这样的框架的出现,实验这些方法变得更加容易。
回归任务中的不确定性
假设我们考虑一个传感器,其输出可以通过线性过程建模,定义为 y = x。
假设我们从范围[-2.5,2.5]内对 x 进行采样。由于传感器固有的物理过程(例如,白噪声),总会引入一些噪声。此外,传感器可能具有如温度或压力等限制要求。下图展示了我们传感器的数据:
图 5.5 – 数据中的不同类型的不确定性
我们可以看到,在左下角,由于某些故障,存在较高的随机不确定性。同时,也有一些较大的空白区域,那里没有观察到训练数据,这可能导致该输入范围内的较高的知识性不确定性。
在讨论如何衡量这些不确定性之前,让我们先建立一个模型并在训练数据上进行训练。
我们使用 TensorFlow 的 Dense 层来构建模型。我们从输入层开始,然后使用 for
循环添加隐藏层,每个隐藏层后跟一个 Dropout
层,最后跟一个 Dense
输出层:
def build_model(layers_shape, input_dim, output_dim):
inputs = Input(shape=(input_dim,))
hidden = Dense(layers_shape[0], activation='relu', kernel_regularizer=l2(0.004))(inputs)
hidden = Dropout(0.05)(hidden, training=True)
for i in range(len(layers_shape)-1):
hidden = Dense(layers_shape[i+1], activation='relu', kernel_regularizer=l2(0.004))(hidden)
hidden = Dropout(0.05)(hidden, training=True)
outputs = Dense(output_dim)(hidden)
model = Model(inputs, outputs)
return model
model = build_model(layers_shape=[5,10,20,10,5], input_dim= 1, output_dim=1)
model.summary()
这里需要注意的一个重要点是,Dropout 层的training
参数被设置为True
。这意味着即使在推理过程中也会应用 Dropout,因此,我们将会得到预测结果的变化。模型摘要如下:
Model: "model"
______________________________________________________
Layer (type) Output Shape Param #
======================================================
input_1 (InputLayer) [(None, 1)] 0
dense (Dense) (None, 5) 10
dropout (Dropout) (None, 5) 0
dense_1 (Dense) (None, 10) 60
dropout_1 (Dropout) (None, 10) 0
dense_2 (Dense) (None, 20) 220
dropout_2 (Dropout) (None, 20) 0
dense_3 (Dense) (None, 10) 210
dropout_3 (Dropout) (None, 10) 0
dense_4 (Dense) (None, 5) 55
dropout_4 (Dropout) (None, 5) 0
dense_5 (Dense) (None, 1) 6
======================================================
Total params: 561
Trainable params: 561
Non-trainable params: 0
______________________________________________________
我们使用 rmsprop
优化器,并使用均方误差作为损失函数:
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
我们使用在图 5.5中绘制的训练数据(红点)对其进行训练:
history = model.fit(x_data, y_data, batch_size=10, epochs=200, shuffle=True, verbose=1)
以下图表(图 5.6)展示了随着训练的进行,损失的变化情况。我们可以看到,模型很早就学会了,并且在大约 25 个周期后,损失函数没有显著下降:
图 5.6 – 模型学习过程中的训练损失
现在让我们看看这个模型在测试数据上的表现。我们将输入范围设置为[-10, 10]
:
x_test = np.linspace(-10,10,100)
y_pred = model.predict(x_test)
让我们绘制数据:
fig, ax = plt.subplots(1,1,figsize=(10,10))
ax.scatter(x_data, y_data, s=10, label='train data', color='red')
ax.plot(x_test, x_test, ls='--', label='ground truth', color='blue')
ax.plot(x_test, y_pred, label='Model Prediction - R2 {:.2f}'.format(r2_score(x_test, y_pred)), color='green')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
ax.set_title('Model performance on test data');
以下图表展示了模型在测试数据集上的表现:
图 5.7 – 模型在测试数据集上的表现
我们可以看到,在测试数据上,R2 分数为 0.98。大部分情况下,这是一个很棒的模型。然而,正如我们之前所说,数据中确实存在知识性和随机性不确定性较高的区域。
让我们首先探讨知识性不确定性。我们对测试数据集进行大约 500 次评估,这意味着我们使用训练好的模型对相同的测试数据进行 500 次预测。这相当于模拟一个高斯过程。每次,我们都会得到测试数据中每个输入标量的输出值范围。因此,我们可以计算后验分布的标准差,并将其作为知识性不确定性的度量:
predictions = []
for _ in range(500):
predictions += [model.predict(x_test,verbose=0)]
mean, std = np.mean(np.array(predictions), axis=0), np.std(np.array(predictions), axis=0)
fig, ax = plt.subplots(1,1,figsize=(10,10))
ax.plot(x_test, x_test, ls='--', color='green', label='test data')
ax.scatter(x_data, y_data, color='blue', label='train data')
ax.set_title('{} - R2 {:.2f}'.format('Epistemic Uncertainity', r2_score(x_test, mean)))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.fill_between(np.squeeze(x_test), np.squeeze(mean+1*std), np.squeeze(mean-1*std), alpha=0.4, label='Epistemic Uncertainty', color='orange')
ax.legend();
图 5.8展示了我们模型的知识性不确定性:
图 5.8 – 测试数据集上的知识性不确定性
从图中可以看出,认知不确定性在我们没有足够训练数据的区域较高。在这里我们想提到,通常,要访问认知不确定性,必须构建一个贝叶斯近似模型,以便捕获权重的变化。可以使用 TensorFlow Probability 中的 VariableLayer
实现这一点。然而,在这里,我们利用了 Dropout 层可以作为贝叶斯近似(Gal 和 Ghahramani,2017)的事实。
认知不确定性是模型的属性。而随机不确定性则是数据的属性。随机不确定性有两种类型。一种是y
,还有它的方差。使用 TensorFlow Probability 的DistributionLambda
层也可以实现相同的效果。
我们使用与之前相同的数据,并定义异方差随机损失函数(Kendal 和 Gal,2017):
这里,N 是数据样本的数量,yi 是真实值,ŷi 是预测输出。输入的方差是 σ²。现在,如果你查看这个函数,第一个项是均方误差的缩放版本,确保模型预测接近真实值。然而,如果预测不准确,分母中的方差项(不确定性)会增大,从而减少第一个项的贡献。第二个项确保模型不会不断增加不确定性。
让我们看看回归不确定性是如何工作的:
-
以下 Python 代码实现了前述的损失函数:
# aleatoric loss function def aleatoric_loss(y_true, y_pred): N = y_true.shape[0] se = K.pow((y_true[:,0]-y_pred[:,0]),2) inv_std = K.exp(-y_pred[:,1]) mse = K.mean(inv_std*se) reg = K.mean(y_pred[:,1]) return 0.5*(mse + reg)
-
接下来,我们构建模型。之前,输出层只有一个神经元。现在,我们将有两个神经元,一个对应预测输出
y
,另一个对应方差:def build_model(layers_shape, input_dim, output_dim): inputs = Input(shape=(input_dim,)) hidden = Dense(layers_shape[0], activation='relu', kernel_regularizer=l2(0.004))(inputs) for i in range(len(layers_shape)-1): hidden = Dense(layers_shape[i+1], activation='relu', kernel_regularizer=l2(0.004))(hidden) outputs = Dense(output_dim)(hidden) model = Model(inputs, outputs) return model model = build_model(layers_shape=[5,10,20,10,5], input_dim= 1, output_dim=2) model.summary()
这是模型摘要:
Model: "model"
___________________________________________________________
Layer (type) Output Shape Param #
===========================================================
input_1 (InputLayer) [(None, 1)] 0
dense (Dense) (None, 5) 10
dense_1 (Dense) (None, 10) 60
dense_2 (Dense) (None, 20) 220
dense_3 (Dense) (None, 10) 210
dense_4 (Dense) (None, 5) 55
dense_5 (Dense) (None, 2) 12
===========================================================
Total params: 567
Trainable params: 567
Non-trainable params: 0
___________________________________________________________
-
现在,为了训练模型,我们需要重新调整数据的形状,以适应模型的变化:
x_data_reshaped = x_data.reshape(x_data.shape[0], 1) y_data_reshaped = np.vstack([y_data, np.zeros(y_data.shape)]).T
-
现在让我们定义优化器。我们将它保持为与第一次相同的
rmsprop
,并将损失函数更改为我们定制的损失函数:model.compile(optimizer='rmsprop', loss=aleatoric_loss, metrics=['mae'])
-
最后,进行训练:
model.fit(x_data_reshaped, y_data_reshaped, batch_size=10, epochs=1000, shuffle=True, verbose=1)
-
现在让我们绘制随机不确定性:
x_test=np.linspace(-10,10,100) p = np.array([model.predict(x_test, verbose=0)]) mean, epistemic_std = np.mean(p[:,:,0], axis=0), np.std(p[:,:,0], axis=0) aleatoric_std = np.exp(0.5*np.mean(p[:,:,1], axis=0)) fig, ax = plt.subplots(1,1,figsize=(10,10)) ax.scatter(x_data, y_data, s=10, label='train data') ax.plot(x_test, x_test, ls='--', label='test data', color='green') ax.fill_between(np.squeeze(x_test), np.squeeze(mean+1*aleatoric_std), np.squeeze(mean-1*aleatoric_std), alpha=0.4, label='Aleatoric Uncertainty (1 SD)', color='orange') ax.fill_between(np.squeeze(x_test), np.squeeze(mean+2*aleatoric_std), np.squeeze(mean-2*aleatoric_std), alpha=0.2, label='Aleatoric Uncertainty (2 SD)', color='blue') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_title('{} - R2 {:.2f}'.format('Aleatoric Uncertainity', r2_score(x_test, mean))) ax.legend()
随机不确定性的图如下所示:
图 5.9 – 测试数据集上的随机不确定性
从图中可以看出,在 -2.5 附近,随机不确定性较高,因为这是我们原始训练数据中数据本身噪声较多的地方。这种类型的不确定性在一些需要做出可能关系到生死的决策的应用中可能会带来问题,例如自动驾驶汽车的情况。因此,需要构建能够不仅做出预测,而且在预测时还能评估认知不确定性和随机不确定性(不确定性评分)的模型。
既然我们已经看到如何在回归任务中建模不确定性,现在让我们转向在分类任务中量化不确定性。
分类任务中的不确定性
在分类任务中,标准做法是在最后一层使用SoftMax 激活函数。默认情况下,这个 SoftMax 激活已经包含了一定的置信度测量(图 5.10)。然而,SoftMax 并不是非常可靠。例如,考虑一个训练用来分类马和斑马的模型,当它看到一只狗时,它不会说 50% 是马,50% 是斑马,而是会假设它是一只黑色的狗。它可能会认为它更像一匹马,并以 60% 的概率将其分类为马。
图 5.10 – 来自 MNIST 数据的图像及其 SoftMax 置信度
从数学上讲,分类任务使用最大类概率来确定类别:
这里,K 是类别的总数,pk 是该预测中类别 k 的 SoftMax 值。一些研究人员也尝试使用 SoftMax 预测的熵 。最大概率直接表示了确定性,而熵则描述了随机变量中的平均信息量。
尽管这些方法简单且直接使用,但它们并不可靠,尤其是当我们面对像医学诊断这样的关键决策 AI 模型时。
图 5.11 – 深度集成架构
量化分类任务中的不确定性的一种方法是使用集成方法。Lakshminarayanan 等人在他们的论文中表明,当模型面对域外数据时,使用集成方法比其他方法更有效。他们训练了一个深度神经网络的集成(图 5.11),并使用了整个 MNIST 训练数据集。经过训练的模型的预测结果被如下方式结合:
这里,M 是集成模型的数量。在论文中,M=5,y 是输入 x 的预测结果,θm 实例是网络参数。如你所见,对于分类任务,这对应于平均预测概率。此外,他们还生成了对抗性样本,并对集成中的每个网络进行了对抗训练。图 5.12 显示了 MNIST 和 NotMNIST 数据集的结果:
图 5.12 – MNIST 数据集(蓝色)和 NotMNIST 数据集(红色)的熵值
正如图中所示,集成方法在面对 NotMNIST 数据集时表现更好,因为 NotMNIST 的熵值分布范围更广,且峰值降低了。他们还将他们的方法与贝叶斯方法(加入蒙特卡洛丢弃)进行了比较。图中显示集成方法给出了更好的结果。因此,他们表明,深度集成方法为分布外数据生成了低置信度的输出。一般来说,对于数据集偏移和跨领域分布,深度集成方法相比其他方法表现出一致的更好性能。
用于基准测试和量化不确定性的工具
已经有很多工作致力于量化不确定性并为不确定性和鲁棒性创建基准。在本节中,我们将介绍一些突出的工作。请记住,这些标准仍处于初期阶段,因此,许多工具和 GitHub 仓库可能存在一定的局限性。
不确定性基准库
由 Google Brain 研究团队、牛津大学、剑桥大学、哈佛大学和德克萨斯大学的研究人员开发的不确定性基准库包含一组基准,您可以使用这些基准来比较不同深度学习方法的性能。这些基准是使用高质量方法实现的,并且适用于多种任务。您可以使用这些基准来开始自己的实验。完整的工作可以通过 GitHub 仓库访问,网址为github.com/google/uncertainty-baselines
。
目前没有稳定版本。然而,用户可以通过 Git 直接安装并进行实验。该库旨在为用户提供一个模块化、框架无关、硬件无关的工具。
Keras-Uncertainty
使用 scikit-learn 中的make_moon
方法创建合成分类数据。我们训练了五个模型,并使用 Keras-Uncertainty 库绘制了各自的不确定性。
图 5.13 – 二分类问题的不确定性
鲁棒性指标
由 Google Research 开发的鲁棒性指标库提供了可以帮助评估分类模型的函数和方法。它定义了三组指标:
-
分布外泛化:该指标评估模型准确分类具有相似性但可能具有不同视角的物体的能力。
-
稳定性:该指标评估模型在输入发生变化时预测的稳定性,以及模型在自然干扰下的表现效果。
-
不确定性:该指标衡量模型估计的概率与实际概率之间的接近度。
鲁棒性度量库甚至可以用于非视觉模型。实际上,如果你有分类任务,可以尝试使用这个库。它依赖于 TensorFlow 和 TensorFlow Probability,因此在使用之前,您需要先在系统上安装它们。
总结
本章首先介绍了机器学习管道的不同组成部分。接着我们讨论了各种机器学习任务以及为这些任务使用的不同算法。
本章的主要主题是深度学习中的不确定性。这种不确定性可能来自数据、模型,或者两者兼而有之。我们讨论了两种不确定性类型:随机不确定性和认知不确定性。本章还讨论了文献中用来量化不确定性的各种方法,并深入探讨了不确定性的原因。接着,我们实现了用于回归任务的量化不确定性的算法。最后,本章讨论了用于量化分类任务不确定性的方法。在深度学习中,需要开发不确定性和鲁棒性的基准和基线。尽管该领域正在进行大量研究,但不确定性和鲁棒性仍然是人工智能和机器学习中的关键研究问题。
在下一章中,我们将深入探讨超参数的概念,以及如何使用 AutoML 和 MLOps 来简化机器学习工作流。
参考文献
-
EfficientNet: 重新思考卷积神经网络的模型缩放。在国际机器学习会议上,Tan, M., & Le, Q.(2019 年 5 月)。(第 6105-6114 页)。PMLR.
proceedings.mlr.press/v97/tan19a/tan19a.pdf
-
决策分析中的不确定性表征,Zio, E., & Pedroni, N.(2012 年)。FonCSI.
www.researchgate.net/publication/266391086_Uncertainty_characterization_in_risk_analysis_for_decision-making_practice
-
Attention is all you need. 神经信息处理系统的进展,Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I.(2017 年)。30.
proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
-
Dropout 作为贝叶斯近似:在深度学习中表示模型的不确定性。在国际机器学习会议上,Gal, Y., & Ghahramani, Z.(2016 年 6 月)。(第 1050-1059 页)。PMLR.
proceedings.mlr.press/v48/gal16.pdf
-
我们在贝叶斯深度学习中需要哪些不确定性用于计算机视觉? 在神经信息处理系统的进展中,Kendall, A., & Gal, Y.(2017 年)。30.
arxiv.org/pdf/1703.04977.pdf
-
深度神经网络中的不确定性调查,Gawlikowski, J., Tassi, C. R. N., Ali, M., Lee, J., Humt, M., Feng, J., ... & Zhu, X. X. (2021)。arXiv 预印本 arXiv:2107.03342\。
arxiv.org/pdf/2107.03342.pdf
-
深度学习中的不确定性量化综述:技术、应用与挑战,Abdar, M., Pourpanah, F., Hussain, S., Rezazadegan, D., Liu, L., Ghavamzadeh, M., ... & Nahavandi, S. (2021)。发表于 信息融合,76,243-297 页。
arxiv.org/pdf/2011.06225.pdf
-
使用深度集成方法进行简单且可扩展的预测不确定性估计。发表于 神经信息处理系统进展,Lakshminarayanan, B., Pritzel, A., & Blundell, C. (2017)。第 30 页。
arxiv.org/pdf/1612.01474.pdf
-
鲁棒性指标,J. Djolonga, F. Hubis, M. Minderer, Z. Nado, J. Nixon, R. Romijnders, D. Tran, 和 M. Lucic. 2020 年。
github.com/google-research/robustness_metrics
-
不确定性基准:深度学习中不确定性与鲁棒性的基准测试,Nado, Z., Band, N., Collier, M., Djolonga, J., Dusenberry, M. W., Farquhar, S., ... & Tran, D. (2021)。arXiv 预印本 arXiv:2106.04015\。
arxiv.org/pdf/2106.04015
-
卷积神经网络的鲁棒性与可转移性,Djolonga, J., Yung, J., Tschannen, M., Romijnders, R., Beyer, L., Kolesnikov, A., ... & Lucic, M. (2021)。发表于 IEEE/CVF 计算机视觉与模式识别会议论文集(第 16458-16468 页)。
arxiv.org/pdf/2007.08558.pdf
第六章:超参数调优、MLOps 和 AutoML
开发一个机器学习(ML)模型是一个迭代的过程;那么多的模型,每个模型又有大量的超参数,这使得初学者感到复杂。本章继续上章内容,解释了在 ML 管道中需要持续训练的原因。它将提供目前可用于你的 ML 工作流的 AutoML 选项,扩展在无代码/低代码解决方案有用的情况,并探讨主要云服务商在易用性、功能性和模型可解释性方面提供的解决方案。本章还将探讨如 Kubeflow 和 Vertex AI 等编排工具,它们可以帮助你管理 ML 模型的持续训练和部署。
完成本章后,你将熟悉超参数调优的概念以及流行的现成 AutoML 和 ML 编排工具。
在本章中,以下主题将通过以下章节进行讲解:
-
介绍 AutoML
-
介绍 H2O AutoML
-
使用 Azure AutoML
-
了解 AWS SageMaker Autopilot
-
MLOps 的需求
-
TFX – 一个可扩展的端到端 AI/ML 工作流平台
-
了解 Kubeflow
-
Katib 用于超参数调优
-
Vertex AI
技术要求
本章要求你安装 Python 3.8,并且安装以下 Python 包:
-
TensorFlow (>=2.7.0)
-
NumPy
-
Matplotlib
-
你需要按以下方式安装 H2O:
pip install -f http://h2o-release.s3.amazonaws.com/h2o/latest_stable_Py.html h2o
或者,你可以通过以下方式安装:
conda install -c h2oai h2o
-
安装 Azure ML 客户端库:
pip install azure-ai-ml
AutoML 介绍
任何在机器学习领域工作过的人都能告诉你,构建 ML 模型是一个复杂且迭代的过程。你从一个数据集和一组特征开始,然后在这些数据上训练模型。随着数据的增加,你会加入更多的特征,并重新训练模型。这个过程会持续下去,直到你拥有一个能很好地泛化到新数据的模型。这个任务被多种超参数所复杂化,而这些超参数与模型表现之间存在一种非线性关系。选择合适的模型和选择最优的超参数依然被许多人认为是炼金术。
注意事项
你可以参考Has artificial intelligence become alchemy? Matthew Hutson, Science, Vol 360, Issue 6388获取更多信息。
AI 是否是炼金术是一个热门的辩论话题。虽然许多开始实验 AI 的人觉得它像炼金术一样,但也有专家,包括我们这些作者,认为事实并非如此。AI 就像任何其他实验科学一样,基于技术基础。最初,AI 的重点是开发 AI 模型和架构,但现在重点逐渐转向负责任且可解释的 AI。随着越来越多的工作发生在这个领域,我们将能够像理解其他技术一样理解 AI。
找到合适的模型、完美的特征以及最佳的超参数集可能是一个耗时且令人沮丧的任务。自动化机器学习(AutoML)帮助你选择一个模型和超参数。
它使得初创公司和低预算组织能够在不需要投资昂贵且难以找到的 AI 人才的情况下,受益于 AI 的强大功能。因此,为了降低机器学习的门槛,并帮助来自其他领域的专家在他们的任务中使用机器学习,大多数在机器学习领域的主要参与者都在研究自动生成机器学习模型的技术。
广义上,我们可以将构建 AI 模型分为以下三个迭代过程。这个过程在图 6.1中进行了说明:
图 6.1 – 机器学习流程中的迭代过程
让我们逐一讨论每个过程:
-
特征工程:特征工程是机器学习过程中的一个重要部分。简而言之,它是从现有数据中创建和选择(新的)特征的过程,这些特征有助于模型训练。这可以通过多种方式完成,但最常见的方法是变换或聚合。变换涉及将现有数据转化为新形式,例如将文本转化为数值。聚合则是将多个数据点合并为单一值,例如求一组数字的平均值。特征工程可能非常耗时,但它往往是构建准确模型的关键。通过细心的规划和执行,创建强有力的特征是可能的,它们可以对你的机器学习结果产生决定性影响。
-
超参数调优:这是通过微调超参数来优化机器学习算法以获得更好性能的过程。超参数是一组控制模型训练过程的变量,它们与机器学习模型的参数(例如,神经网络中的权重和偏差)不同,后者是在训练过程中学习的。超参数调优在任何机器学习项目中都至关重要,因为它可以显著影响模型的性能。然而,这一过程可能是耗时且昂贵的,特别是在处理大型和复杂数据集时。超参数调优有多种方法,包括手动调优、网格搜索和随机搜索。每种方法都有其优缺点,选择合适的方法对于解决当前问题至关重要。
-
模型选择:模型选择是选择最适合特定任务的机器学习算法的过程。在选择深度学习模型时,需要考虑多个因素,如数据类型、期望输出和可用的计算资源。模型选择过程可能令人生畏。近年来,深度学习模型在特定任务上达到了接近人类的表现。这些模型中的许多是由 AI 专家精心设计的,而找到最佳模型及其架构的过程并不简单。相反,这涉及大量的人工直觉以及许多尝试和失败。
对于不熟悉深度学习技术的领域专家来说,AutoML 可以轻松帮助他们创建机器学习解决方案。AutoML 旨在简化创建机器学习模型的过程,并通过自动化整个机器学习管道(包括数据准备、特征工程和自动模型生成)来降低手动构建机器学习解决方案的成本。最终,AutoML 的目标是让深度学习变得更加易于接触,让每个人都能从其强大功能中受益。
自动化创建和调优机器学习(ML)端到端管道提供了更简单的解决方案。它有助于减少生成这些管道的时间,并最终可能生成比手工设计的模型更优的架构。这是一个活跃且开放的研究领域,AutoML 的首篇研究论文于 2016 年底发布。
大多数商业化的 AutoML 平台接收结构化数据,并假设数据准备和特征工程已经完成,但它们仍提供模型生成。模型生成可以分为两个部分——搜索空间和优化方法。搜索空间确定可以设计的不同模型结构(如支持向量机、k-最近邻和深度神经网络),而优化方法通过调整模型参数来细化选定的模型,从而提高其性能。自动化神经架构搜索(NAS)如今正受到越来越多的关注。在他们的调查论文中,Elsken 等人将 NAS 分为以下三个主要部分:
-
搜索空间:这由一组操作组成,定义了如何将这些操作连接起来形成有效的网络架构。
-
搜索算法:这涉及用于在搜索空间中找到高性能模型架构的算法。
-
模型评估:这涉及预测所提议模型的性能。
图 6.2 提供了 NAS 管道的概览,列出了在该过程中采用的各种方法、算法和策略:
图 6.2 – NAS 流水线概述(改编自《AutoML:当前状态的调查》,Xin He 等,Knowledge-Based Systems 212 (2021): 106622 的图 5)
现在让我们探索一些提供 AutoML 服务的平台。
介绍 H2O AutoML
H2O 是由 H2O.ai 开发的一个快速、可扩展的机器学习和深度学习框架,采用开源 Apache 许可证发布。根据公司官网的信息,截至撰写本文时,已有超过 20,000 个组织在其机器学习/深度学习需求中使用 H2O。公司提供了许多产品,如 H2O AI Cloud、H2O Driverless AI、H2O Wave 和 H2O Sparkling Water。在本节中,我们将探讨其开源产品 H2O AutoML。
H2O AutoML 是一个旨在创建用户友好的机器学习界面的努力,旨在使初学者和非专家也能使用。它自动化了训练和调优多种候选模型的过程。该界面的设计使得用户只需指定数据集、输入和输出特征,以及对训练模型的总数或时间限制的任何要求。其余的工作由 AutoML 完成;它会在指定的时间内识别表现最好的模型,并提供一个 排行榜。通常观察到,堆叠集成模型(由所有先前训练的模型组成的集成模型)通常位居排行榜的顶部。高级用户有无数选项可供选择;这些选项及其各种功能的详细信息可以在 docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html
上查看。
你可以在他们的官网上了解更多关于 H2O 的信息:h2o.ai
。
让我们在合成数据上尝试 H2O AutoML。在开始之前,确保你已经安装了 H2O:
-
使用 scikit-learn 的
make_circles
方法,我们首先创建一个合成数据集并将其保存为 CSV 文件:from sklearn.datasets import make_circles import pandas as pd X, y = make_circles(n_samples=1000, noise=0.2, factor=0.5, random_state=9) df = pd.DataFrame(X, columns=['x1','x2']) df['y'] = y df.head() df.to_csv('circle.csv', index=False, header=True)
-
接下来,我们启动 H2O 服务器 – 在使用 H2O 之前,这是一个必要的步骤。可以通过
init()
函数来完成:import h2o h2o.init()
一旦 H2O 服务器初始化完成,它将显示有关 H2O 集群的详细信息,如 图 6.3 所示:
图 6.3 – H2O 初始化命令的输出
-
接下来,我们读取之前创建的合成数据文件。由于我们希望将问题视为分类问题(无论数据点是否位于圆内),我们将
y
标签重新定义为asfactor()
– 这将告诉 H2O AutoML 模块将y
变量视为分类变量,从而将问题视为分类问题。数据集按 60:20:20 的比例划分为训练集、验证集和测试集:class_df = h2o.import_file("circle.csv",\ destination_frame="circle_df") class_df['y'] = class_df['y'].asfactor() train_df,valid_df,test_df = class_df.split_frame(ratios=[0.6, 0.2],\ seed=133)
-
现在,我们从 H2O 调用 AutoML 模块,并在我们的训练数据集上进行训练。AutoML 将搜索最多 10 个模型 – 你可以更改
max_models
参数,以增加或减少要测试的模型数量:from h2o.automl import H2OAutoML as AML automl = AML(max_models = 13, max_runtime_secs=75, seed=27) automl.train(training_frame= train_df, \ validation_frame=valid_df, \ y = 'y', x=['x1','x2'])
对于每个模型,H2O 提供了性能摘要。例如,在图 6.4中,您可以参考 BinomialGLM
的评估摘要:
图 6.4 – H2O AutoML 模型的性能摘要
-
您可以在排行榜上查看所有由 H2O AutoML 评估的模型的性能:
lb = automl.leaderboard lb.head()
图 6.5 显示了排行榜的一部分:
图 6.5 – 排行榜摘要 – H2O AutoML
除了 AutoML,H2O 还提供了模型解释的方法。请参阅第九章以及书籍 GitHub 仓库中的 H2O Jupyter 笔记本,了解更多关于 H2O 提供的模型可解释性特性。
接下来,我们将探索 Microsoft AutoML 工具——Azure AutoML。
与 Azure AutoML 一起工作
Azure 提供了适用于表格、文本和图像数据的 AutoML 解决方案。Azure 使用贝叶斯优化来寻找最佳的模型架构,并结合协同过滤来搜索最适合数据转换的最佳管道。要使用 Azure AutoML,您需要拥有 Azure 订阅账户,创建 Azure 机器学习工作区,并创建计算集群。
Azure AutoML 是一项基于云的服务,支持分类、回归和时间序列预测任务。它不仅执行超参数调优和模型搜索,还可以执行特征工程任务。
您可以使用 ML Studio(提供无代码界面)或通过 Python SDK 与 Azure AutoML 交互。
使用 Python SDK 构建 AutoML 管道的基本步骤如下:
-
使用以下代码连接到 Azure 机器学习工作区:
credential = DefaultAzureCredential() ml_client = None try: ml_client = MLClient.from_config(credential) except Exception as ex: print(ex) # Enter details of your AML workspace subscription_id = "" resource_group = "" workspace = "" ml_client = MLClient(credential, subscription_id, resource_group, workspace)
-
获取数据并将其转换为 ML 表格格式。
-
使用
automl
模块配置 AutoML 作业。 -
提交作业进行训练。
-
获取最佳模型。
每个步骤都有不同的配置设置,具体取决于您的需求。例如,您可以选择交叉验证策略的类型、评估指标和最大训练时间。您还可以选择是否使用自动特征工程。如果您希望在不同的平台和设备上运行模型,您还可以配置 Azure AutoML,只查看那些可以转换为开放神经网络交换(ONNX)标准的模型,ONNX 是一个用于存储深度学习模型的开源格式。微软为免费试用提供了 200 美元的额度——试用期结束后,您可以选择按需付费或购买订阅。
了解 Amazon SageMaker Autopilot
当你启用 Autopilot 功能使用 Amazon SageMaker 时,AutoML 过程中的许多耗时步骤都会自动处理。它会自动检查你的数据,选择适合你问题类型的算法,并清理数据,以便更轻松地进行模型训练和调优。必要时,Autopilot 会自动对所有潜在算法进行交叉验证重采样,以评估它们预测数据的能力,尤其是它们在未曾学习的情况下如何预测其他数据。此外,它还会生成指标来评估其机器学习模型候选的预测质量。通过自动化这些 AutoML 过程中的基本步骤,你的机器学习体验将大大简化。它会按性能顺序对所有经过调优的模型进行排名,并迅速确定能够以最小努力使用的最高性能模型。
你可以通过多种方式使用 Autopilot,无论是完全自动化(因此得名),还是通过不同程度的人类指导,或通过 Amazon SageMaker Studio 进行无代码操作,或者通过 AWS SDK 中的一种进行基于代码的操作。Autopilot 目前支持以下问题类型——回归、二分类和多分类。它支持 CSV 或 Parquet 格式的表格数据,每列代表特定数据类型的特征,每行代表一个观测值。列可以存储数值、类别、文本或时间序列数据,数据形式为逗号分隔的字符串。Autopilot 允许你在大小达到数百 GB 的数据集上构建机器学习模型。
以下图表概述了 Azure AutoML Autopilot 管理的任务:
图 6.6 – Azure AutoML Autopilot 管道
在本节中,我们介绍了 AutoML,并简要讨论了各种 AutoML 平台。尽管每个服务都有其独特的工作流程和用户体验,但它们都始于相同的两步——激活 API 并将数据传输到存储库或桶中。启动实验运行后,模型可以导出到本地或立即部署。
这些框架之间的主要区别在于入口方式——基于 Web、通过命令行,或使用 SDK。现在我们已经介绍了 AutoML,接下来将进入 MLOps,构建模型、部署并管理模型的自动化过程。
MLOps 的需求
从 AI 研究到生产的旅程漫长且充满障碍。完整的 AI/ML 工作负载,无论是构建模型、部署模型,还是分配网络资源,都很繁琐,因为每一步的变化都会导致其他步骤的变化。即使在深度学习方面取得了进展,将一个想法从研究转化为生产的过程依然可能相当漫长。
图 6**.7 显示了 ML 系统的不同组件。我们可以看到,实际上只有 ML 系统的一小部分参与了实际的学习和预测;然而,它需要庞大而复杂的基础设施支持。问题在于 改变任何事物都会改变一切(CACE),即使是微小的调整超参数、改变学习设置或修改数据选择方法,都可能意味着整个系统都需要做出改变:
图 6.7 – ML 系统的不同组件
在 IT 行业中,速度、可靠性和信息获取是成功的关键因素,因此,提供竞争优势。无论组织的职能如何,都需要 IT 敏捷性。当考虑基于 AI/ML 的解决方案和产品时,这一点尤为重要。目前,大多数行业仍然手动执行 ML 任务,构建 ML 模型和部署之间存在巨大的延迟。这在 图 6**.8 中有所展示:
图 6.8 – ML 产品生命周期(图片来源:图 2: https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning)
收集到的数据经过准备和处理(如标准化、特征工程等),以为 ML 模型提供输入。模型训练后,经过多种度量标准和技术的模型评估,将其发送到模型注册表,并容器化以供服务。
从数据分析到模型服务,每个任务都是手动进行的。此外,从一个任务到另一个任务的过渡也是手动的。数据科学家独立于运维团队工作;训练好的模型交给开发团队,由他们在其 API 基础设施中部署该模型。这可能会导致训练与服务的偏差——即,模型在训练期间的表现与部署后的表现之间存在差异(即服务时的表现)。
由于模型开发与最终部署分离,发布迭代很少。此外,一个巨大的障碍是缺乏主动的性能监控。预测服务没有跟踪或维护模型预测的日志,这对于检测模型行为和性能的任何退化或漂移是必需的。从理论上讲,如果模型很少更改或训练,这一手动过程可能是足够的。然而,在实际操作中,模型在部署到现实世界后常常失败。失败的原因是多方面的:
- 模型退化:随着时间的推移,模型的准确度会下降。在传统的机器学习管道中,没有持续监控来识别模型性能的下降并加以纠正。最终,最终用户将承受这个问题。假设你为一家时尚公司提供服务,该公司根据客户的过去购买记录和时尚趋势推荐新款服装。然而,风格随着时间的变化而发生显著变化;秋季的“流行色”在冬季不再适用。如果你的模型不采纳最新的时尚数据并利用这些数据为客户提供推荐,他们会抱怨,最终,网站的用户群体将会缩小。最终,业务团队会注意到这一点,并且在很久之后,通过识别问题,你将被要求根据最新数据更新模型。如果可以持续监控模型的性能,并且有系统来实施针对新数据的持续训练,这种情况是可以避免的。见图 6.9:
图 6.9 – 持续训练
-
数据漂移:训练和测试数据集的输入特征与输出联合分布之间的差异可能导致数据集漂移。当模型最初部署时,真实世界的数据与训练数据集有相似的分布,但这种分布会随着时间的推移发生变化。例如,你建立了一个基于当时可用数据来检测网络入侵的模型。六个月后,你认为它还能像部署时那样有效吗?可能能,但很有可能会迅速偏离——在快速变化的互联网世界里,六个月几乎就是六代!如果有选项可以基于最新数据对指标进行切片,这个问题就能得到解决。
-
反馈循环:无意中的反馈可能会操控模型的预测并影响其训练数据。假设某人正在为一家音乐流媒体公司工作,该公司利用推荐系统根据用户的听歌历史和个人资料推荐新专辑。系统推荐的专辑信心度,假设超过 70%。现在,公司决定增加一个喜欢或不喜欢的功能。最初,公司会感到兴奋,因为推荐的专辑会获得越来越多的点赞。然而,随着时间的推移,用户的观看历史将影响模型的预测。因此,系统将开始推荐与用户之前听过的音乐类似的内容,可能会错过用户可能会喜欢的新音乐。持续的系统指标监控是解决此类问题的潜在方案。
要了解机器学习模型所带来的技术债务,我建议您阅读 Sculley 等人所写的论文《机器学习:技术债务的高利贷信用卡》。在这篇论文中,详细讨论了机器学习中的技术债务,并涵盖了使用 AI/ML 解决方案的系统所带来的维护成本。
尽管完全消除技术债务既不可能也不必要,但采用整体方法可以减少技术债务。所需的是一个能够将标准 DevOps 管道集成到我们的机器学习工作流中的系统——即机器学习管道自动化,或 MLOps。
MLOps,或称为机器学习(ML)的 DevOps,是一系列最佳实践,旨在将软件开发(Dev)和运维(Ops)整合,以加快机器学习模型和预测即服务应用程序的交付。MLOps 的主要目标是提高模型开发、部署和管理的质量与速度,同时减少与部署相关的风险,使其成为在市场中获得竞争优势的重要工具。
数据科学家和工程师之间的紧密协作对于将机器学习模型部署到生产环境中是必不可少的。因此,MLOps 有助于自动化机器学习工作流,并支持端到端的追踪,从数据准备到模型训练,从预测到服务交付。它还使机器学习模型可复现并可审计,这对于遵守诸如 GDPR 等监管要求至关重要。虽然 MLOps 的实施可能比较困难,但有许多工具和框架可以提供帮助,例如持续集成(CI)的 Jenkins,持续交付(CD)的 Spinnaker,以及用于机器学习模型管理的 Kubeflow。许多开源工具也可以用来创建 MLOps 管道。除了选择合适的工具外,文化和协作在实施 MLOps 时同样重要。一个成功的跨职能 MLOps 团队是必不可少的。还需要清晰地理解业务目标以及机器学习如何帮助实现这些目标。最终,MLOps 的目标是加速进程,同时保持高质量和合规性。如果做得正确,它可以帮助企业通过加速机器学习模型和应用交付获得优势。
让我们来看看不同的机器学习模型生命周期步骤(参考图 6.8)。这些步骤可以通过手动方式或通过自动化管道完成。这些步骤的自动化水平决定了从训练新模型到模型部署之间的时间差,因此可以帮助解决前一部分讨论的问题。自动化机器学习管道应该能够完成以下任务:
-
允许不同的团队独立工作:理想情况下,许多团队会参与到 AI/ML 工作流中,从数据收集、数据摄取、模型开发到模型部署。正如《MLOps 的需求》部分所讨论的那样,任何一个团队的改变都会影响到其他团队(CACE)。理想的 ML 管道自动化应该允许团队在各自的组件上独立工作,而不受其他团队干扰。
-
在生产环境中主动监控模型:构建模型并不是最大的挑战,真正的挑战在于保持模型在生产环境中的准确性。只有在生产中的模型被积极监控、日志被维护且在模型性能低于某个阈值时触发警报,才能实现这一点。这使得你能够检测到性能的任何退化。可以通过进行在线模型验证来实现这一目标。
-
适应数据漂移:模型应该随新数据模式的出现而进化,这些新模式在新数据进入时出现。这可以通过在生产管道中增加一个自动化的数据验证步骤来实现。任何数据模式的偏差(缺失特征或特征值异常)应触发数据科学团队进行调查。数据统计特性发生重大变化时,应触发模型的再训练。
-
持续训练(CT):在 AI/ML 领域,每周都会出现新的模型架构,你可能急于试验最新的模型或调整超参数。自动化管道应支持持续训练。当生产模型性能低于其阈值,或检测到数据发生显著漂移时,持续训练变得必要。
-
可重复性:此外,可重复性是 AI 领域的一个重要问题,甚至到了 NeurIPS 这样顶级 AI 会议设立可重复性主席的地步。研究人员的目标是提交一个可重复性检查表,帮助其他人复现结果。模块化的组件允许团队独立工作并进行更改而不影响其他团队,这有助于团队将问题缩小到特定组件,从而帮助实现可重复性。
-
CI/CD:为了在生产级别上实现快速且可靠的更新,应该建立一个强大的 CI/CD 系统。快速、可靠且安全地交付 AI/ML 解决方案可以提升组织的整体表现。
-
测试:最后,你可能希望在将模型应用于实际流量之前进行 A/B 测试;这可以通过将新模型配置为处理 10%到 20%的实际流量来实现。如果新模型表现更好,工程师/开发人员可以将所有流量转交给新模型;否则,回滚到旧模型。
本质上,我们需要 MLOps 作为一个集成的工程解决方案,统一 ML 系统的开发和操作。这将允许数据科学家探索各种模型架构,尝试特征工程技术和超参数,并自动将更改推送到部署环境中。图 6.10 显示了 ML CI/CD 自动化流水线的不同阶段:
图 6.10 – 带有 CI/CD 的自动化 ML 流水线的各个阶段
完整的自动化流水线包含六个阶段:
-
开发/实验:在此阶段,数据科学家反复尝试各种 ML 算法和架构。一旦满意,他们会将模型的源代码推送到源代码仓库。
-
流水线的 CI:此阶段涉及构建源代码,并识别和输出需要稍后部署的包、可执行文件和工件。
-
流水线的 CD:在阶段 2 中生成的工件被部署到目标环境。
-
CT:根据设置的触发器,训练后的模型在此阶段被推送到模型注册表。
-
模型的 CD:在此阶段,部署一个模型预测服务。
-
监控:在此阶段,收集模型性能统计数据,并用来设置触发器以执行流水线或新的实验周期。
在接下来的章节中,我们将介绍一些可以用于实施 MLOps 的 GCP(即 Google Cloud Platform)工具。我们将讨论 Cloud Run、TensorFlow 扩展和 Kubeflow,后者是本章的重点(以及 Vertex AI)。
TFX – 一个可扩展的端到端 AI/ML 工作流平台
TensorFlow 扩展 (TFX) 是一个可扩展的端到端平台,用于创建和部署 TensorFlow AI/ML 工作流。TFX 包括用于数据验证、数据预处理、特征工程、AI/ML 模型创建与训练、模型性能评估,最后将模型提供为 REST 和 gRPC API 的库。你可以通过它为多个 Google 产品提供支持来衡量 TFX 的价值,例如 Chrome、Google 搜索和 Gmail。Google、Airbnb、PayPal 和 Twitter 都在使用 TFX。作为一个平台,TFX 使用多个库来创建端到端的 ML 过程。
让我们看看这些库以及它们能做什么:
-
TensorFlow 数据验证 (TFDV):该库包括用于探索和验证数据的模块。它可以让你查看用于训练和/或测试模型的数据。它提供的统计摘要可用于发现数据中的任何异常。它包括一个自动化的模式创建工具,用于描述期望的数据范围。它还可以在比较不同实验和运行时检测数据漂移。
-
TensorFlow 转换 (TFT):你可以使用 TFT 对数据进行大规模预处理。TFT 库的函数可以用来评估数据、转换数据并进行高级特征工程活动。使用 TFT 的优势在于它可以模块化预处理过程。TensorFlow 和 Apache Beam 的结合使你能够处理整个数据集——例如,获取最大值和最小值或所有可用的类别——并将数据批次转换为张量。它还利用了 Google Dataflow,这是一项云服务。
-
TensorFlow Estimator 和 Keras:这是你可以用来设计和训练模型的标准 TensorFlow 框架。它还为你提供了大量的预训练模型。
-
TensorFlow 模型分析 (TFMA):这使你能够以分布式方式评估训练好的模型,处理海量数据,并使用训练时设定的相同模型评估指标。它可以让你分析并理解训练好的模型。
-
TensorFlow 服务 (TFServing):最后,当你对训练好的模型满意时,你可以通过 REST 和 gRPC API 将其交付到在线生产环境中。
这里的图表展示了不同的库如何集成,形成基于 TFX 的 AI/ML 流水线:
图 6.11 – 基于 TFX 的 AI/ML 流水线(图片来源:图 4: https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning)
这些阶段中的每一个都可以手动执行;然而,如前一节关于 MLOps 所提到的那样,最好让这些过程自动化执行。为了实现这一点,我们需要一个协调工具,将机器学习工作流中的各个模块(组件)连接起来——这正是 Kubeflow 发挥作用的地方,接下来的章节将讨论这一主题。
理解 Kubeflow
你可以使用 Kubeflow 管理整个 AI/ML 生命周期。它是一个原生 Kubernetes 操作支持系统 (OSS) 平台,用于在混合云和多云环境中开发、部署和管理可扩展的端到端机器学习工作负载。Kubeflow Pipelines 是 Kubeflow 的一项服务,帮助自动化整个 AI/ML 生命周期,使你能够编排、组织和自动化你的 AI/ML 工作负载。
它是一个开源项目,以下提交图表表明它是一个活跃且不断发展的项目。Kubeflow 的一个关键目标是简化任何人设计、实施和管理可移植、可扩展的机器学习。撰写本文时,Kubeflow 的 GitHub 项目已有 121,000 个星标和超过 2,000 个分叉 (github.com/kubeflow/kubeflow/graphs/contributors
):
图 6.12 – 对 Kubeflow GitHub 仓库的贡献
最棒的是,即使你对 Kubernetes 了解不多,你也可以使用 Kubeflow API 来设计你的 AI/ML 工作流。Kubeflow 可以在本地 PC 和任何云平台(如 GCP、Azure、AWS)上使用,支持单节点或集群指定;它旨在在不同环境下可靠地运行。Google 在 2022 年 11 月发布了 Kubeflow 1.2,允许组织在不同环境中运行他们的 ML 流程。Kubeflow 基于以下三个基本原则:
-
可组合性:Kubeflow 通过使用特定于 ML 的框架(如 TensorFlow、PyTorch 等)和库(如 scikit-learn 和 pandas),扩展了 Kubernetes 执行独立且可调整任务的能力。这为 AI/ML 工作流中的不同任务提供了不同的库。例如,数据准备和测试可能需要不同版本的 TensorFlow。因此,AI/ML 流程中的每个工作都可以独立容器化并处理。
-
可移植性:你可以从任何你想要的地方执行所有 AI/ML 工作流组件——无论是在云端、内部服务器,还是在度假时用笔记本电脑——只要它们都在 Kubeflow 上运行。
-
可扩展性:当你需要更多资源时,可以使用它们,且在不再需要时释放它们。Kubeflow 提升了 Kubernetes 在最大化资源可用性和最小化手动操作的情况下扩展资源的能力。
使用 Kubeflow 的一些优势如下:
-
它基于一个共同的基础设施进行标准化。
-
它使用开源、云原生生态系统来创建、编排、部署和运行可扩展、可移植的 AI/ML 工作负载,贯穿 AI/ML 生命周期。
-
它在混合云和多云环境中运行 AI/ML 工作流。
-
此外,在GKE(即Google Kubernetes Engine)上运行时,你可以利用 GKE 的企业级安全性、日志记录、自动扩展和身份识别功能。
Kubeflow 使用自定义资源定义(CRDs)来填充集群。它利用容器和 Kubernetes,因此可以在任何已经使用 Kubernetes 的地方使用。
下面列出的 Kubeflow 应用和组件可以用来在 Kubernetes 上组织你的 AI/ML 工作流:
-
Jupyter notebooks: Jupyter notebooks 是 AI/ML 从业者进行快速数据分析的事实标准工具。绝大多数数据科学项目都是从 Jupyter notebook 开始的。它们构成了现代云原生机器学习管道的基础。Kubeflow notebooks 允许您在本地执行实验,或者您可以在 notebook 中处理数据、训练模型并进行服务。Notebooks 与架构中的其他部分很好地配合,通过集群的 IP 地址提供对 Kubeflow 集群中其他服务的访问。它们也兼容访问控制和身份验证。Kubeflow 允许您设置多个 notebook 服务器,每个服务器可以运行多个 notebooks。根据服务器的项目或团队,每个 notebook 服务器属于特定的命名空间。Kubeflow 通过命名空间支持多个用户,使得协作和访问控制变得更加容易。在 Kubeflow 上使用 notebook 允许您动态扩展资源。最棒的是,它包括您在 Jupyter 中训练模型所需的所有插件/依赖项,包括 TensorBoard 可视化和可定制的计算资源。Kubeflow Notebooks 提供与本地 Jupyter notebooks 相同的体验,但增加了可扩展性、访问控制、协作和直接提交作业到 Kubernetes 集群的好处。
-
Kubeflow User Interface (UI): 用于运行管道、创建和启动实验、探索管道的图形、配置和输出,甚至调度运行的用户界面。
-
Katib: 超参数调优是 AI/ML 工作流中的一个重要步骤。找到正确的超参数空间可能是一个耗时的过程。Katib 促进了超参数调优、早期停止和神经架构搜索(NAS)。它有助于根据所选指标确定最佳的生产配置。
-
Kubeflow Pipelines: Kubeflow Pipelines 使您能够创建一系列阶段,涵盖从数据收集到提供训练好的模型的所有内容。由于它们基于容器,每个阶段都是可移植和可扩展的。Kubeflow Pipelines 可用于协调端到端的机器学习工作流。Kubeflow Pipelines 利用机器学习操作可以分解成一系列标准阶段这一事实,这些阶段可以以有向图的形式进行排列。每个 Kubeflow 管道作业都是一个自包含的代码单元,打包为 Docker 镜像,包含输入(参数)和输出。这种作业容器化使得可移植性成为可能,因为管道是自包含的程序,可以在任何地方运行。此外,相同的代码可以在另一个 AI/ML 管道中重复使用——任务可以被复用。
-
Metadata(元数据):在 AI/ML 工作流中,跟踪和管理元数据是非常有用的。元数据的跟踪可以用于执行实时模型评估,有助于检测数据漂移或训练与服务之间的偏差。它还可以用于审计和合规,帮助您查看哪些模型正在生产中并监控其表现。元数据组件默认随 Kubeflow 安装。许多 Kubeflow 组件会写入元数据服务器。此外,您还可以通过您的代码将数据写入元数据服务器。可以通过 Kubeflow UI 来查看元数据——通过工件存储。
-
KFServing:这允许您在任意框架上提供 AI/ML 模型服务。它包括自动扩展、网络和金丝雀发布等功能,且具有一个易于使用的界面来将模型提供到生产环境。通过使用 YAML 文件,您可以配置资源来服务和计算模型及其预测。金丝雀发布使您能够在不影响用户体验的情况下测试和更新模型。
-
Fairing:这是一个 Python 包,允许您在混合云环境中构建、训练和部署您的 AI/ML 模型。
总结来说,Kubeflow 提供了一套兼容的工具和工件,它们是运行生产级 AI/ML 应用的核心。这帮助组织在整个机器学习生命周期中标准化统一的建模基础设施。AI/ML 工作流中的另一个重要步骤是超参数调优,因此接下来我们将探讨 Katib,它是一个 Kubernetes 集群,提供超参数调优和 NAS 的选项。
Katib 用于超参数调优
Katib 是一个可扩展的、原生 Kubernetes 的 AutoML 平台,支持超参数调优和 NAS。图 6.13 显示了 Katib 的设计。要了解其工作原理,读者应参考 Katib: A Distributed General AutoML Platform on Kubernetes:
图 6.13 – Katib 作为通用 AutoML 系统的设计(论文中的图 2:https://www.usenix.org/system/files/opml19papers-zhou.pdf)
Katib 通过 YAML 文件规范、Jupyter Notebook 和 Python SDK 支持命令行超参数调优。它还提供图形界面来指定调优设置并可视化结果,如下所示:
图 6.14 – Katib 的图形界面
Katib 允许您选择度量标准,并决定是减少还是增加它。您可以选择要调整的超参数,并查看整个实验和各个运行的结果。
图 6.15 展示了 Katib 运行的结果,以验证准确度为指标,学习率、层数和优化器作为需要调优的超参数:
图 6.15 – Katib 生成的超参数调整结果
另一个有趣的平台,既支持 MLOps 又支持 AutoML,是 Google 提供的 Vertex AI,我们接下来将介绍它。
Vertex AI
Kubeflow 允许您编排 MLOps 工作流程。但是,您仍然需要处理 Kubernetes 集群。一个更好的解决方案是根本不需要担心集群的管理——这就是 Vertex AI 管道的用武之地。您可以在 Vertex AI 中使用 Kubeflow 管道或 TFX 管道。Vertex AI 为 ML 工作流的每个步骤提供工具,从管理数据集到不同的模型训练方式,评估和部署,以及进行预测。简而言之,Vertex AI 为您的 AI 需求提供了一站式解决方案。无论您是一个没有编码经验但有一个可以利用 AI 的好点子的初学者,还是一个经验丰富的 AI 工程师,Vertex AI 都能为您带来一些价值。Vertex AI 的 AutoML 功能使初学者可以轻松开始 ML;您只需加载数据,使用 Vertex AI 提供的数据探索工具,并开始训练模型。
专业的 AI 工程师可以创建自己的训练循环,通过云端训练他们的模型,并使用端点将其投入生产。此外,Vertex AI 允许您进行本地模型训练、部署和监控。Vertex AI 是一个全面的 AI/ML 平台,具有简化的用户界面,如图 6**.16所示:
图 6.16 – Vertex AI 完整 AI/ML 工作流的统一界面
图 6**.17展示了 Vertex AI 仪表板;在接下来的章节中,我们将探讨其许多有用的功能:
图 6.17 – Vertex AI 仪表板
接下来,我们将探讨 Vertex AI 支持的数据类型及其处理方法。
数据集
图像、视频、文本和表格都受 Vertex AI 支持。您可以在下表中查看使用 Vertex AI 管理的数据集完成的 AI/ML 任务的详细信息:
数据类型 的类型 | 支持的任务 |
---|---|
图像 |
-
图像分类(单标签)
-
图像分类(多标签)
-
图像目标检测
-
图像分割
|
视频 |
---|
-
视频动作识别
-
视频分类
-
视频物体跟踪
|
文本 |
---|
-
文本分类(单标签)
-
文本分类(多标签)
-
文本实体提取
-
文本情感分析
|
表格 |
---|
-
回归
-
分类
-
预测
|
表 6.1 – Vertex AI 支持的数据类型和 AI 任务类型
对于图像、视频和文本数据集,如果没有标签,您可以使用 Google 提供的标注服务。包含图像 URI 和标签的文件也可以从您的计算机导入。此外,您还可以从 Google Cloud Storage 导入数据。需要注意的是,上传的数据将使用 Google Cloud Storage 来存储您从计算机上传的文件。Vertex AI 仅支持 .csv
文件用于表格数据。您可以从本地计算机、云服务或从 BigQuery 导入它们。
Vertex AI 允许您在指定数据后浏览和分析数据。如果数据没有标签,您可以直接在浏览器中浏览数据并分配标签。此外,Vertex AI 提供了自动化或手动执行测试-训练验证分割的选项。图 6.18 展示了使用 Vertex AI 管理数据集服务对 HR 分析数据进行的分析(www.kaggle.com/arashnic/hr-analytics-job-change-of-data-scientists?select=aug_train.csv
)。
图 6.18 – AutoML 配置用于表格数据 – 选择训练参数和变换
Vertex AI 还提供了特征库选项,可用于分析数据的特征。使用相同的特征数据分布进行训练和服务可以帮助减少训练-服务偏差。此外,特征库还可以帮助识别模型或数据漂移。此外,Vertex AI 为需要此服务的用户提供数据标注服务。
Vertex AI 中的训练和实验
您已完成和正在进行的训练任务将在 Vertex AI 仪表板的训练选项卡中显示。这也可以作为一个全新训练序列的起点。只需选择创建,然后再次选择创建,然后按照屏幕上的提示完成该过程。如果选择 AutoML 路径,您可以指定应用于表格数据的变换,并选择用于训练的特征。目标函数也可以自定义。完成选择后,您只需设置您能够投入的训练时间(最短为一个小时)。如果模型在训练过程中没有取得进展,最好提前停止训练,如图 6.19所示。
实验选项卡可以让您跟踪、可视化和比较 ML 实验,并与他人分享:
图 6.19 – AutoML 配置用于表格数据 – 选择预算和提前停止
我们已使用 HR 分析数据(www.kaggle.com/arashnic/hr-analytics-job-change-of-data-scientists?select=aug_train.csv
)展示了如何预测数据科学家是否打算换工作。在训练模型时,我们使用了除了注册 ID 之外的所有可用数据。数据文件中有一列显示数据科学家是否积极寻找工作,我们使用此列作为目标列。
Vertex AI 中的模型与端点
模型标签包含关于训练模型的全面信息。这些模型已完整评估了测试数据集(当使用托管数据集训练时)。此外,对于表格数据,所有特征的特征重要性也可以访问。数据可以在仪表盘上以可视化或直接以文本的形式查看。
模型训练的预算为每小时 1 个节点。训练总时长约为 1 小时 35 分钟。AutoML 训练的模型在图 6.20中展示了测试数据集评估结果:
图 6.20 – 测试数据集的模型评估
现在请参考下图,展示了矩阵和特征重要性:
图 6.21 – 混淆矩阵和特征重要性
仪表盘使得检查模型预测变得简单。为了测试,模型必须部署到端点。Vertex AI 还提供了将模型保存在容器中的选项(以 TensorFlow SavedModel 格式),然后可以将模型用于任何其他本地或云服务。让我们继续选择部署到端点,将模型发送到某个地方。以下是可用的部署选项:
-
为端点命名。
-
选择流量拆分 – 对于单个模型,流量为 100%,但如果有多个模型,可以拆分流量。
-
选择最少数量的计算节点。
-
选择机器类型。
-
如果选择了模型可解释性选项,Vertex AI 为表格数据提供了一个采样的 Shapley 可解释性方法。
-
选择你希望关注的模型方面(特征漂移或训练与服务偏差),并相应调整警报设置。
初步设置完成后,部署过程快速且简单。现在让我们来测试一下预测(支持单次和批量预测)。从图 6.22可以清晰看出,数据科学家在选择的输入条件下,信心水平约为 0.67,因此并未积极寻求就业。我们可以使用 REST API 或 Python 客户端向模型发送测试请求。Vertex AI 端点提供了相关代码,支持这两种示例请求。
图 6.22 – 模型预测
项目中部署的所有模型和端点分别列在仪表板的 Models 和 Endpoints 标签页中。
Vertex AI Workbench
Vertex AI Workbench 与 JupyterLab 和 Jupyter Notebook 兼容。用户可以选择预制的笔记本或托管笔记本。在托管笔记本中,所有流行的深度学习框架和模块都已包含,您甚至可以使用 Docker 镜像添加自己的 Jupyter 内核。用户管理的笔记本提供了许多有用的起点。用户可以根据需要配置笔记本,选择 虚拟中央处理单元(vCPUs)和 图形处理单元(GPUs)。如果你是 Vertex AI 的新手,建议从托管笔记本开始。然而,如果你需要更多的管理权限,用户管理的笔记本是更好的选择。
要进入您的 JupyterLab 环境,在笔记本创建完成后,点击 OPEN JUPYTERLAB 链接。
图 6.23 – Vertex AI Workbench 中的 Jupyter 笔记本列表
Vertex AI Workbench 可以与 TFX 或 Kubeflow 配合使用,执行数据探索、模型构建、训练并运行代码。
Vertex AI 提供了统一的界面,涵盖所有 AI/ML 流程组件。您可以为模型训练和实验设置管道。该界面提供了一种简单的方法来调整超参数。可以选择自定义训练,允许用户从容器中选择并直接加载代码进行训练。Vertex AI 还集成了 AutoML,以加速 ML 工作流。通过 AutoML,您可以在受控数据集上获得高效的 ML 模型,并且所需的 ML 技能最少。使用特征归因,Vertex AI 还为其模型提供了解释性。当您的模型完成后,您可以选择端点进行批量或单次预测,并将模型部署到这些端点上。部署的最重要方面是能够在边缘设备上进行部署,并将模型放置在数据所在的位置。
总结
本章提供了有关 AutoML 和 MLOps 的全面概述。首先介绍了 AutoML 的概念,并解释了如何使用它自动化训练和调整大量候选模型的过程。本章还包括了使用 H2O AutoML 的实践示例,并讨论了 Microsoft Azure 和 Amazon SageMaker Autopilot 提供的 AutoML 功能。接着,本章介绍了 MLOps 的概念以及将其纳入 AI/ML 工作流的重要性。
本章简要介绍了 TFX 的特点,TFX 是一个基于 TensorFlow 的工具包,用于构建完整的机器学习管道。它提供了一系列库和预构建组件,可以轻松地用来构建和部署机器学习模型。
还介绍了 Kubeflow,一个旨在简化在 Kubernetes 上运行机器学习工作负载的开源项目,使其具有可移植性和可扩展性。我们还展示了如何使用 Katib 进行超参数调优,Katib 是一个基于 Kubernetes 的超参数调优系统。
最后,我们探索了谷歌的 Vertex AI。该平台提供了一个简单易用的接口,用于构建、部署和管理机器学习模型。通过使用 Vertex AI,我们训练并部署了一个基于人力资源分析数据训练的模型。
现在你已经熟悉了机器学习管道以及用于自动化的各种工具,在接下来的章节中,我们将讨论数据收集中的公平性概念。
进一步阅读
-
大规模图像分类器的演化。发表于国际机器学习会议,第 2902-2911 页,PMLR,2017 年,Real, Esteban, Moore, Sherry, Selle, Andrew, Saxena, Saurabh, Suematsu, Yutaka Leon, Tan, Jie, Le, Quoc V., 和 Kurakin, Alexey:
proceedings.mlr.press/v70/real17a/real17a.pdf
。 -
通过强化学习进行神经架构搜索。arXiv 预印本 arXiv:1611.01578(2016),Zoph, Barret, 和 Le, Quoc V:
arxiv.org/pdf/1611.01578.pdf
。 -
神经架构搜索:综述。机器学习研究杂志,20,第 1 期(2019):1997-2017,Elsken, Thomas, Metzen, Jan Hendrik, 和 Hutter, Frank:
www.jmlr.org/papers/volume20/18-598/18-598.pdf?ref=https://githubhelp.com
。 -
H2O AutoML:可扩展的自动化机器学习。发表于ICML 自动化机器学习研讨会论文集,2020 年,LeDell, Erin, 和 Poirier, Sebastien:
www.automl.org/wp-content/uploads/2020/07/AutoML_2020_paper_61.pdf
。 -
走向自动化机器学习:AutoML 方法和工具的评估与比较,Truong, Anh, Walters, Austin, Goodsitt, Jeremy, Hines, Keegan, Bruss, C. Bayan, 和 Farivar, Reza。发表于 2019 年 IEEE 第 31 届人工智能工具国际会议(ICTAI),第 1471-1479 页,IEEE,2019 年:
arxiv.org/pdf/1908.05557&ved=2ahUKEwjS0Zes2ermAhUqTt8KHdCF AhkQFjAGegQIBxAS&usg=AOvVaw0b_JUomS-A1rtsy7v5ZA64.pdf
-
AutoML:最前沿技术的调查。基于知识的系统,212(2021):106622,He, Xin, Zhao, Kaiyong, 和 Chu, Xiaowen。: https://arxiv.org/pdf/1908.00709.pdf?arxiv.org。
-
机器学习系统中的隐性技术债务,Sculley, David, Holt, Gary, Golovin, Daniel, Davydov, Eugene, Phillips, Todd, Ebner, Dietmar, Chaudhary, Vinay, Young, Michael, Crespo, Jean-Francois, 和 Dennison, Dan。《神经信息处理系统进展》,28(2015):
proceedings.neurips.cc/paper/2015/file/86df7dcfd896fcaf2674f757a2463eba-Paper.pdf
。 -
基于 Kubernetes 的分布式通用 AutoML 平台,Zhou, Jinan, Velichkevich, Andrey, Prosvirov, Kirill, Garg, Anubhav, Oshima, Yuji, 和 Dutta, Debo. Katib。发表于 2019 年 USENIX 运维机器学习大会(OpML 19),第 55–57 页,2019 年:
www.usenix.org/system/files/opml19papers-zhou.pdf
。
第三部分:模型优化与生命周期管理的设计模式
本书的这一部分深入探讨了围绕人工智能和机器学习系统的关键伦理问题和挑战,重点关注公平性、可解释性和模型治理。首先,讨论了各种公平性概念以及公平数据收集的重要性,突出了偏见数据对模型性能和社会影响的作用。接着,讨论了模型优化中的公平性,提出了减少偏差和确保公平结果的技术方法。还讨论了模型可解释性;我们将探索解释复杂模型的方法和工具,并促进对 AI 系统的信任。最后,书中探讨了人工智能的更广泛伦理影响和挑战,强调了在 AI 解决方案的开发和部署中,模型治理、问责制和透明度的重要性。通过提供理论洞察和实际指导,本部分将帮助你深入理解 AI 和机器学习的伦理维度,推动负责任和公平的 AI 系统的开发与部署。
本部分由以下章节组成:
-
第七章,公平性概念与公平数据收集
-
第八章,模型优化中的公平性
-
第九章,模型可解释性
-
第十章,伦理学与模型治理
第七章:公平性概念与公平数据生成
本章将首先通过提供社会中面临的不同挑战的示例,概述公平性在预测建模领域的重要性。然后,我们将深入研究公平性的分类法和类型,以详细描述相关术语。在此过程中,我们将通过引用并证明开源工具来帮助评估这些定义的指标,从而理解这些指标的重要性。接下来,我们将进一步强调数据质量的重要性,因为有偏的数据集可能会在机器学习模型中引入隐性偏见。在这个背景下,本章讨论了不同的合成数据生成技术,以及它们如何有效地消除机器学习模型中的偏见。此外,本章还强调了一些最佳实践,这些实践不仅能生成合成的私有数据,而且可以扩展并适应不同类型的问题。
在本章中,以下部分将覆盖这些主题:
-
理解数据对公平性的影响
-
公平性定义
-
数据审计和质量检查在公平性中的作用
-
公平的合成数据集
技术要求
本章需要你安装 Python 3.8 以及一些必要的 Python 包:
-
git clone https://github.com/yoshavit/fairml-farm.git
(适用于 TensorFlow-1.14.0 或 TensorFlow-1.15.0) -
python
setup.py install
-
%tensorboard --``logdir logs/gradient_tape
-
pip install fat-forensics[all]
(github.com/fat-forensics/fat-forensics
) -
pip
install fairlens
-
python3 main_driver.py
理解数据对公平性的影响
在第一部分,我们先来了解什么是公平性,以及数据在使数据集公平中所扮演的角色。公平性是指不存在任何基于个体或群体固有或获得特征的偏见或偏袒(《机器学习中的偏见与公平性调查》,Ninareh Mehrabi, Fred Morstatter, Nripsuta Saxena, Kristina Lerman, Aram Galstyan:arxiv.org/pdf/1908.09635.pdf
)。这个定义强调了某些偏见的存在,使得由于特定属性(如性别、年龄、性别、种族或民族等),对个体/群体的某一部分给予优待或不公平待遇。以下各节的目标是避免创建对某一部分人群有偏见的、不公平的算法。
现实世界中的偏见示例
为了研究数据集的影响,我们来看一些现实世界的例子,看看偏见存在的地方以及数据在产生这种偏见中的作用。一个最显著的偏见例子是矫正犯人管理与替代处罚档案分析(COMPAS)软件。该工具在美国多个司法辖区被用于预测定罪罪犯是否可能再犯。该软件揭示了对非裔美国人的偏见,显示非裔美国犯人的假阳性率高于白人犯人:前者(非裔美国人)比后者(白人)更可能错误地被认定为罪犯或重复犯罪者。一个明显的原因是缺乏对少数群体的充分数据表示。ProPublica 总结的种族歧视证据如下:
黑人被告常常被预测为比实际情况更有可能再次犯罪。我们的分析发现,在两年内没有再犯的黑人被告,比没有再犯的白人被告几乎有两倍的可能性被误判为高风险(45% 对比 23%)。
白人被告常常被预测为比实际情况更不具风险。我们的分析发现,白人再犯者在接下来的两年内几乎两倍于黑人再犯者被错误地标记为低风险(48% 对比 28%)。
分析还表明,即使在控制了先前犯罪记录、未来再犯、年龄和性别的情况下,黑人被告被判定为高风险的可能性比白人被告高 45%。
黑人被告在再犯暴力犯罪的风险上被误判为更高的可能性是白人被告的两倍。而白人暴力再犯者比黑人暴力再犯者更有 63%的可能性被误判为低风险。
暴力再犯分析还表明,即使在控制了先前犯罪记录、未来再犯、年龄和性别的情况下,黑人被告被判定为高风险的可能性比白人被告高 77%。
(引自我们如何分析 COMPAS 再犯算法,Jeff Larson、Surya Mattu、Lauren Kirchner 和 Julia Angwin 著)
ProPublica 发布的报告清晰地展示了种族歧视的影响。由于该工具明确展示了对少数群体的不公,COMPAS 数据集(www.kaggle.com/code/danofer/compass-fairml-getting-started/data
)通常用于评估机器学习算法中的公平性,检查是否存在偏见。
这种偏差在聊天机器人、就业匹配、航班路线规划、自动移民法律援助算法以及搜索和广告投放算法中更为显著。我们还可以看到,这种偏差在人工智能和机器人系统、面部识别应用、语音识别和搜索引擎中也普遍存在。
当有偏的机器学习模型的结果影响或剥夺机会、资源或信息(如招聘、学校录取和贷款)时,偏差对社会产生不利影响。这些问题在面部识别、文档搜索和产品推荐中尤为明显,系统的准确性会受到影响。当有偏的算法结果生成数据、算法和用户之间的反馈循环(由于用户与列表顶部项目的重复互动)时,最终用户的体验会受到影响,从而增加进一步偏差的来源。
注意
我们最需要了解的是,当算法在有偏数据上进行训练时,算法本身会在训练过程中学到这种偏差,并在其预测中反映出来。
现在让我们看看表 7.1并理解不同的偏差来源。由数据产生的偏差可能有不同的形式:数据到算法(DA)偏差、算法到用户(AU)偏差和用户到数据(UD)偏差。
偏差名称 | 偏差来源 | 类型 |
---|---|---|
测量偏差 | 数据选择、利用、转换和特征测量的偏差。 | DA |
遗漏变量偏差 | 模型中排除的重要变量。 | DA |
表示偏差 | 在数据收集过程中,由于从人群中采样而产生的偏差。 | DA |
聚合偏差 | 从整个群体中得出关于个体的错误推论。例如,辛普森悖论——聚合数据源中的关联在数据被拆解成子群体后消失或发生变化。 | DA |
采样偏差 | 采样偏差类似于表示偏差,源于对子群体进行非随机采样。 | DA |
纵向数据谬误 | 由于在单一时点聚合多种队列而产生。由于时间横断面数据分析和建模而突出。 | DA |
连接偏差 | 由于用户连接、活动或互动而误解真实用户行为。 | DA |
算法偏差 | 输入数据本身没有偏差,但算法会引入偏差。 | AU |
用户交互偏差 | 由两个来源触发:用户界面和用户施加的自选偏向行为与交互。 | AU |
流行偏差 | 更受欢迎的项目被暴露得更多,这些项目常常被虚假评论或社交机器人操控。 | AU |
新兴偏差 | 由于人口、文化价值观或社会知识的变化与真实用户的互动而产生。 | AU |
评估偏差 | 在模型评估过程中发生,源于不适当的评估技术。 | AU |
历史偏差 | 世界上的社会技术问题在很大程度上会影响数据生成过程,即使在应用完美的抽样和特征选择技术之后。 | UD |
人口偏差 | 当平台用户人群的统计数据、人口特征、代表性和用户特征与原始目标人群不同。 | UD |
自我选择偏差 | 一种选择偏差的子类型,研究对象由自己选择。 | UD |
社会偏差 | 社会偏差发生在他人的行为影响我们的判断时。 | UD |
行为偏差 | 行为偏差源于不同平台、上下文或不同数据集中的用户行为差异。 | UD |
时间偏差 | 由不同时间段内的人群和行为差异引起。 | UD |
内容生产偏差 | 由用户生成内容中的结构、词汇、语义和句法差异引起。 | UD |
表 7.1 – 不同类型的偏差及其来源
现在,随着我们对不同类型偏差的理解,让我们看看在图 7.1中它们是如何相互依赖并形成循环的。例如,用户交互的参与导致行为偏差,而当数据被输入时,这种偏差会被放大。输入数据会加剧聚合偏差或纵向偏差。接着,这些数据会被算法处理,形成偏差,这种偏差被称为排名偏差或突现偏差。
图 7.1 – 基于来源的不同类型偏差流动
偏差的原因
在以下列表中,我们将详细了解偏差的具体原因:
-
数据集偏斜:数据集可能会显示出向出现频率较低的类别偏斜。这种偏差通常随着时间的推移以复合速率增加。犯罪数据集表现出这种偏斜性,我们在任何地区都看到有限数量的罪犯与无辜人群的对比。一旦偏斜被观察到,侦探和警察部门也往往会有所偏见,向高犯罪率地区派遣更多的警力。这可能导致高犯罪率的揭示,与其他地区相比,更多的警力部署到这些地区。
-
训练数据不足:我们发现,当某些特定人群或其他群体的数据有限时,机器学习模型往往会产生偏差结果。此类模型未能察觉在极少数人群中存在的特殊特征。我们在第三章中看到过这样的例子,面部识别技术对白人男性的图像比对黑人女性的图像更为准确。
-
人类偏见:数据集经常因为人类偏见而受到污染。一个例子可以从我们收集的美国就业数据中看出。在关于美国 500 强公司的数据中,女性几乎没有担任 CEO。这是因为女性 CEO 的数量较少,而且我们未能收集到女性担任 CEO 的相关数据。基于这些数据训练的模型自然会预测,女性与担任 CEO 的相关性较差。
-
数据去偏见:为了去除历史数据中的偏见,我们常见的方法是删除敏感属性,但这并不能完全消除偏见。实验研究表明,相关的属性常常作为代理,即使在删除了敏感属性后,仍然为系统性歧视少数群体提供了条件。一个例子是,当某个地区主要由黑人居住,删除种族列并不能去除偏见,因为该地区的邮政编码仍然存在。为了避免这种情况,建议保留敏感列,并在模型训练过程中直接监控并修正由于代理特征存在而产生的违规行为。
-
数据去偏见的副作用:为了去除数据偏斜和模型偏见的技术有时会在下游模型中产生不良的副作用。曾观察到,当一个语音识别算法在男性和女性之间进行微调时,女性的结果明显差于男性。研究人员进一步发现,使用留存样本对模型进行偏见测试并没有解决问题,因为测试数据集本身也存在偏见。
-
有限特征的可用性:当某些特征对少数群体比对多数群体的对照组信息更少或可靠性较差时,模型在少数群体的准确性通常远低于多数群体。
-
数据和 AI 专业人士的多样性:研究发现,多样性的缺失是偏见的主要原因之一。团队中的多样性可以帮助减少偏见。由算法公正联盟创始人、MIT 媒体实验室前成员 Joy Buolamwini 提出的一项研究表明,当一位加纳裔美国计算机科学家加入她的研究团队时,团队发现了某些问题。她的团队发现,面部识别工具存在偏见,且在她的较深肤色上表现较差——只有她戴上白色面具时才会起作用。
-
驾驶公平算法的成本:没有投资于公平性的组织,其机器学习模型通常更具偏见。组织需要投入人力资源专家,并教育人员选择公平的机器学习模型设计。这可能会以牺牲模型准确性和公平性指标之间的合理权衡为代价,从而影响利润率、收入或客户数量。因此,在执行相关规定之前,必须平衡这两个目标。
-
外部审计:偏见也可能源于缺乏适当的外部审计。外部审计到位时,可以检测到偏见数据集或存在的算法偏见。然而,组织这些审计可能会违反 GDPR、CCPA 及其他严格执行客户敏感数据隐私的法规。一种解决办法是利用合成数据工具,这些工具可以生成完全匿名、完全现实且具有代表性的数据集。一个组织可以依赖合成数据集来训练机器学习模型,而不违反隐私法,因为共享数据不会侵犯个人隐私。
-
公平模型变得有偏:如果没有持续监控输入数据和模型指标,公平模型往往会变得有偏。一个这样的例子是微软开发的 AI 聊天机器人Tay。微软不得不将 Tay 从网络上撤下,因为它在学习 Twitter 用户的对话时变得性别歧视和种族主义。持续监控和评估模型指标可以帮助防止偏见随着时间的推移而产生。
-
有偏的 AI 及其恶性循环:如果我们没有衡量和评估 AI 算法中的偏见,它将深入社会,并可能变得更加有害。一个这样的例子是谷歌的搜索算法,在搜索黑色手等术语时,显示了种族主义的图像。通过搜索,结果本可以显示出更中立的图像,而不是 perpetuating 偏见并显示贬低的描述,如果初始搜索结果和点击结果没有指向那些有偏的图像。
现在,我们理解了在训练机器学习模型时如何引入偏见。我们还应该意识到歧视过程也会产生有偏的模型。
歧视是由于人类偏见和基于数据集中敏感属性的刻板印象而引发的不公平的另一种来源。歧视主要来源于系统或统计数据。系统性歧视指的是组织内现有的政策、习惯或行为,这些政策、习惯或行为加剧了对某些群体的歧视。统计歧视则发生在决策者使用群体的平均统计数据来判断该群体的个体时。
因此,我们可以说,在生成有偏的机器学习模型时,数据集扮演着重要角色,因为它提供了在模型训练阶段所学到的统计数据、特征和数据模式。
在这一部分中,我们研究了存在于系统中的不同类型的偏见。为了避免偏见,我们需要确保每个人都能获得公平的对待,为此我们需要定义什么是公平的对待。我们将在下一部分中讨论这一点。
定义公平性
在这一部分中,让我们尝试理解研究人员描述的不同类型的公平性,以避免歧视或对人们的不公正对待。机器学习算法和从业人员在这个问题上正受到越来越多的关注,以减少在信用、就业、教育和刑事司法等领域的不公平待遇风险。目标是设计不受受保护属性(如性别、种族和民族)影响的机器学习算法和流程,同时仍能提供公平的预测。我们将通过一些不同的公平性定义和示例来探讨这一问题。
数值型和二进制属性最常用于陈述和测试公平性标准。分类特征可以转换为一组二进制特征。通常,我们交替使用“受保护群体”和“未受保护群体”、“优势群体”和“劣势群体”、“多数群体”和“少数群体”这几个术语,以区分人口的不同群体,并评估不同群体的公平性。在本部分讨论的定义中,我们将主要使用已婚/离婚女性求职者和已婚/离婚男性求职者来演示如何避免偏袒或不公正对待,以确保模型预测的公平和公正。在这里,求职者指的是初始阶段的求职申请者。
基于统计指标的公平性类型
公平性的统计度量依赖于指标,这些指标可以通过混淆矩阵来最佳解释——混淆矩阵是一种通过将预测结果与实际数据进行比较生成的表格,实际表示分类模型的不同准确性指标。矩阵的行和列分别表示预测类和实际类。对于二分类器,预测类和实际类都包含两个值:正类和负类,如下图所示。以下定义进一步说明了位于图 7.2中矩阵四个象限的指标:
图 7.2 – 模型分类指标
真阳性(TP)
模型的预测结果和实际数据都属于正类(在二分类中为真)。
假阳性(FP)
模型的预测结果为真,而实际数据为假,属于负类。
假阴性(FN)
模型预测的结果是错误的,并且属于负类,而实际的真实数据是正确的,属于正类。
真阴性(TN)
模型预测和真实数据都是错误的,且它们都属于负类。
正预测值(PPV)/精确度
这是所有预测为正类的样本中,准确预测为正类或属于正类的正样本的比率。它表示一个预测结果为正的对象,实际上也真正属于正类的概率,P(Y = 1|d = 1),例如,预测为高资格分数的候选人实际上其资格分数也很高。
假发现率(FDR)
这是所有预测为正类的负样本中,错误预测为正的比率。FDR 表示假接受的概率,P(Y = 0|d = 1),例如,预测为具有良好资格分数的求职者,实际上其真实资格分数却被报告为低。
假遗漏率(FOR)
这是将正类样本错误分类并预测为负类的比率。FOR 表示真实值样本被不准确拒绝的概率,P(Y = 1|d = 0)。我们最常见的情况是,某个求职者被评估为具有低的预测资格分数,但该候选人实际上有一个较好的分数。
负预测值(NPV)
这是所有预测为负类的样本中,准确预测为负类的负样本的比率。NPV 表示一个被预测为负类的对象(或候选人)真正属于负类的概率,P(Y = 0|d = 0)。
真阳性率(TPR)
这是所有实际正类的样本中,准确预测为正类的正样本的比率。TPR 通常被称为敏感度或召回率,它表示一个真正属于正类的对象被正确识别的概率,P(d = 1|Y = 1)。在我们的例子中,它是一个具有良好资格分数的求职者的真实数据被模型准确预测的概率。
假阳性率(FPR)
这是模型将负样本错误预测为正的比率,所有实际负类的样本中。FPR 表示假警报的概率,P(d = 1|Y = 0)。例如,当一个实际具有低资格分数的候选人被模型错误分类,并被不准确地给予一个高的资格分数时,就会发生这种情况。
假阴性率(FNR)
这是在所有实际为正的案例中,错误地预测为负的样本的比例。FNR 代表给定实际结果下的负面结果概率,P(d = 0|Y = 1)。举个例子,当一个入选者的资格分数有可能被错误分类时。
真负率(TNR)
这是在所有实际为负的案例中,准确预测为负类的样本的比例。TNR 代表给定一个假值并且实际上属于负类的结果的概率,P(d = 0|Y = 0)。当一个资格分数较低的入选者被正确分类时,我们会观察到这一点。
让我们在 COMPAS 数据集上计算这些得分:
-
让我们首先导入必要的 Python 库:
%matplotlib inline from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix
-
接下来,我们加载数据:
url = 'https://raw.githubusercontent.com/propublica/compas-analysis/master/compas-scores-two-years.csv' df = pd.read_csv(url)
-
我们将数据集转换为二元分类问题,以评估一个人是否有较高/中等/低风险的再犯:
df['is_med_or_high_risk'] = (df['decile_score']>=5).astype(int)
-
接下来,我们绘制在按每行标准化后的模型性能——我们想查看 PPV、FDR、FOR 和 NPV:
cm = pd.crosstab(df[‘is_med_or_high_risk’], df[‘two_year_recid’], rownames=[‘Predicted’], colnames=[‘Actual’], normalize=’index’) p = plt.figure(figsize=(5,5)); p = sns.heatmap(cm, annot=True, fmt=".2f", cbar=False
这将产生以下输出:
图 7.3 – 使用 COMPAS 数据集的混淆矩阵
-
我们也可以使用
sklearn
混淆矩阵打印这些值:[[tn , fp],[fn , tp]] = confusion_matrix(df['two_year_recid'], df['is_med_or_high_risk']) print("True negatives: ", tn) print("False positives: ", fp) print("False negatives: ", fn) print("True positives: ", tp)
-
然后,我们集中在非裔美国人或白人被告身上,因为他们是 ProPublica 声明的主题:
df = df[df.race.isin(["African-American","Caucasian"])] (df['two_year_recid']==df['is_med_or_high_risk']).astype(int).groupby(df['race']).mean()
这将产生以下输出:
图 7.4 – 非裔美国人和白人的公平性准确度指标
在这里,我们看到公平性度量在两个群体之间并不相同。
基于预测结果度量的公平性类型
本节列出的公平性类型主要关注在考虑的问题中,涉及的不同人口群体的预测结果。
群体公平性/人口统计学平衡
这也常被称为统计平衡或等接受率。这关系到是否在保护组(如种族、性别、民族等)和非保护组之间,受试者在预测为正类的分类中表现出相等的概率。例如,当男女申请者有相等的机会达到同样优秀的预测资格分数时,该条件将得到满足:P (d = 1|G = m) = P (d = 1|G = f)。
为了进一步说明这一点,假设一个机器学习模型预测已婚/离婚的男性和女性入选者的分数分别为 0.81 和 0.75。在这种情况下,可以说分类器失败了,因为它未能满足男女两者之间分数相等的目标。
条件统计平衡
这个定义超出了之前的定义,通过允许一组可以影响模型预测的属性。进一步解释,这个度量只有在受保护组和非受保护组具有相同概率被指定为真实类时才算满足。这可以通过一组允许的因素L(包括参赛者的信用历史、就业状况和年龄)来控制。因此,为了从数学上说明男女参赛者在获得良好资格得分的概率相等,我们可以表示为:
P (d = 1|L = l, G = m) = P (d = 1|L = l, G = f*)
然而,已婚/离婚男性和女性参赛者的得分可以非常接近;例如,它们分别是 0.46 和 0.49。当我们看到两组之间存在如此微小的差异时,我们可以允许一个阈值因子来允许这种可接受的差异。
基于预测和实际结果度量的公平性类型
这里列出的公平性概念超越了模型对不同群体的预测结果d的考虑,它们还计算与实际结果Y(如实际数据中的真相所示)进行比较的评估度量,并记录在数据集中。
预测平等性
这个概念非常重要,它确保分类器能够保证受保护组和非受保护组在预测正类值(PPV)上表现出相同的度量——确保一个主体展示真实或正预测值的概率实际被包括在正类中。举个例子,我们需要确保男性和女性参赛者展示出相同的概率得分。这可以表述为:
P (Y = 1|d = 1, G = m) = P (Y = 1|d = 1, G = f*)
此外,一个具有相等 PPV 的分类器也会有相等的 FDR,这意味着:
P (Y = 0|d = 1, G = m) = P (Y = 0|d = 1, G = f)*
这些度量可能不完全相等,并且允许组之间存在一定的阈值差异。例如,一个分类器可能记录已婚/离婚男性和女性参赛者的 PPV 分别为 0.73 和 0.74,男性和女性参赛者的 FDR 分别为 0.27 和 0.26。
在现实世界的机器学习算法中,我们通常发现任何训练好的分类器对有优势的群体更为了解,并将其预测为正类。而劣势或少数群体的预测结果则面临更多正确评估的挑战,主要是因为该群体的数据有限。
假阳性错误率平衡/预测平等性
该指标确保分类器满足受保护组和未受保护组在行为上表现出相似性,通过展示平等的假阳性率(FPR)来体现——这是一个用于衡量误分类率的指标——即包含假值且被归入负类的对象实际具有真正的正预测值。例如,这个概念意味着男性和女性的参赛者展示相同的概率度量,导致那些成绩较低的参赛者被预测为具有较高的预期成绩。从数学上讲,可以表示为:
P (d = 1|Y = 0, G = m) = P (d = 1|Y = 0, G = f)
在这种情况下,具有相等假阳性率的分类器也将表现出相等的真阴性率(TNR)。因此:
P (d = 0|Y = 0, G = m) = P (d = 0|Y = 0, G = f)
从实际值来看,已婚/离婚男性和女性参赛者的假阳性率(FPR)分别为 0.70 和 0.55,而真阴性率(TNR)分别为 0.30 和 0.45。如果分类器倾向于将良好的预测分数分配给曾经有低信用的男性,它将违反上述定义,并导致分类器的失败。
假阴性错误率平衡/平等机会
这个概念确保分类器满足以下条件:无论是受保护组还是未受保护组,其假阴性率(FNR)相等——即包含真实值且被归入正类的对象实际上具有负预测值。这种情况由于误分类而发生。从数学角度来看,可以表示为:
P (d = 0|Y = 1, G = m) = P (d = 0|Y = 1, G = f)
这意味着,在男性和女性组中,任何具有良好预测分数的参赛者都被误分类,并且预测为具有较低的分数。具有相等假阴性率的分类器也将具有相等的真正阳性率(TPR)。从方程的角度来看,以下条件成立,其中 TPR 应该对于男性和女性相同:
P (d = 1|Y = 1, G = m) = P (d = 1|Y = 1, G = f)
例如,已婚/离婚男性和女性参赛者的假阳性率(FPR)和真正阳性率(TPR)分别为 0.13 和 0.87。由于分类器在男性和女性中展现出相等的良好预测分数,这将导致这两个组别的平等待遇。如果分类器还能够满足两组的低分数要求,那么它将被视为满足群体公平性的条件。
平等化机会/不平等待遇
这种公平性类型,也被称为条件程序准确性平等,通过结合前两个定义来强化公平性条件。它标准化了男性和女性人群的错误率,其中分类器在受保护和非受保护群体具有相等的 TPR 和相等的 FPR 时才能被认为是满意的。因此,当具有良好资格分数的参与者也被模型正确地指定为良好预测资格分数时,这充当了一个组合函数,确保男性和女性群体之间的平等。在现实中,参与者具有低资格分数的概率被模型错误分类,并指定为良好预测的资格分数。在数学上,它可以表达为:
P (d = 1|Y = i, G = m) = P (d = 1|Y = i, G = f), i ∈0, 1
例如,一个分类器展示出已婚/离婚男性和女性参与者的 FPR 为 0.70 时,仅当它同时记录了男性和女性的 TPR 为 0.86 时,才能满足不同的错误对待条件。但另一方面,它展示了对男性群体的优先对待,记录了 0.80 的 FPR,而对女性群体的 FPR 则为 0.70。这种优先或有偏差的处理将导致分类器未能满足平等的几率条件。因此,分类器通常被发现满足预测的平衡,但未能满足几率的平等条件。
图 7.5 – 代表群体/个体/总体公平不同类型的两棵公平树
图 7**.5 提供了这些公平定义的简要表示。前述图像展示了两棵公平树 – 第一棵是处理群体公平性时使用的,第二棵是处理个体或所有人公平性时使用的。
所谓的Theil 指数是一种经济不平等度量指标,用于量化当前资源(例如收入)在不同人群之间和内部分布的差异。因此,它有助于衡量在人群和亚群体内部的不平等程度(通过给出亚群体内的不平等的加权平均值),从而帮助人们测量人群的不平等性。
要计算个体公平度量,我们可以使用曼哈顿距离(计算两个数据集中样本之间的平均曼哈顿距离)或欧几里得距离(计算两个数据集中样本之间的平均欧几里得距离)。对于个体公平性,我们遵循一种类似的方法,适用于类似的个体,而不考虑他们与任何群体的关系。
基于不同的代表性或不同的错误生成了一个群体公平性树。这基于以下两个因素。
基于差异化表示的公平性 – 平等对比/比例对比
公平性树分裂为平等对比,当我们关注从每个组中选取相同人数时,或者比例对比,当我们关注按其在总体中的比例选取人数时。
基于系统中的差异化错误的公平性 – 惩罚性/辅助性错误指标
公平性树根据我们是否关注进行可能伤害或帮助个体的干预,分裂成惩罚性或辅助性错误指标。
我们进一步在图 7.6中说明了使用成人数据集计算群体公平性指标的过程(archive.ics.uci.edu/ml/datasets/adult
)。
图 7.6 – 基于成人数据集的群体公平性指标评估
条件性使用准确度平等
这种类型的公平性建立在将两个相等条件,PPV 和 NPV,结合起来的基本原则上。在这里,所考虑的对象在现实中具有真实预测值的概率被归类为正类(PPV)。我们还会观察到,实际中具有错误预测值的对象的概率被归类为负类(NPV)。在数学上,这可以表示为:
(P (Y = 1|d = 1, G = m) = P (Y = 1|d = 1, G = f ))∧(P (Y = 0|d = 0, G = m) = P(Y = 0|d = 0,G = f ))
男性和女性参与者的准确度相当。这意味着男性和女性参与者表现出相等的概率,展示相等的准确度值。进一步解释,一个良好的预测资格分数表示参与者应有的资格分数,而低预测资格分数则表示低资格分数。如同前述的指标,当性别偏见影响时,男性参与者的低预测分数的可能性降低,导致男性参与者获得不该有的较好资格分数。通过这个等效准确度指标来演示,男性和女性参与者分别具有 0.73 和 0.74 的 PPV,以及 0.49 和 0.63 的 NPV。
总体准确度平等
这迫使分类器满足保护组和非保护组表现出相等预测准确度的条件。在实际的基准数据中,真实或错误的预测值的概率被归类为正类或负类。模型的预测也使用相同的类别标签。这一定义意味着真实负样本和真实正样本同样重要。从数学角度,这可以表示为:
P (d = Y, G = m) = P (d = Y, G = f)
该指标允许男性和女性之间存在微小差异,其中两组的总体准确率分别为 0.68 和 0.71。然而,在此示例中,我们考虑的是总体准确率,而不是预测类别的个别准确率。
对待平等
这个指标确定了分类器的错误比率,而不是考虑其准确度。因此,分类器确保受保护和未受保护群体展示相同的假阴性和假阳性的比率(FN/FP),例如男性和女性参赛者的假阴性和假阳性比率分别为 0.56 和 0.62。这个概念的提出旨在确保不同群体在进行机器学习分类器公平性评估时,假阴性(FN)与假阳性(FP)的比率相等。
基于相似性度量的公平性类型
基于统计指标构建的公平性类型通常会忽视除敏感属性以外的所有属性,这导致即使同样的男性和女性参赛者展现相同的技能或标准,也会对某一组群体产生不公平待遇。当选择是随机进行的,而另一个群体(如女性)的选择则基于其他某些属性(例如拥有更多储蓄)时,就会出现这种情况。这会导致差异,尽管统计平等会将分类器标记为公平。以下提出了几种公平性类型,用以解决由于选择偏差引起的问题,通过消除被分类群体中无关属性X的边缘化。
因果歧视
当分类器对任何两个具有完全相同特征(或属性)X的对象做出相同分类时,就可以说它满足因果歧视的条件。为了满足这一标准,具有相同属性的男性和女性应分别被指定为良好的合格分数或低的合格分数,而且这应该对两组是相同的。数学上可以表示为:
(Xf = Xm ∧ Gf !
= Gm) → df = dm
为了测试此公平性度量,对于测试集中的每个参赛者,我们需要生成对立性别的相同参赛者,并比较这些参赛者的预测分类概率。如果我们未能为这两组实现相同的概率,分类器将失败。
通过无意识实现公平
当分类器没有显式使用任何敏感属性来预测最终模型结果时,可以说它满足公平性条件。训练这样的模型要求在训练过程中不能使用与性别、种族或民族相关的特征。数学上,两个相似的参与者 i 和 j(性别不同)具有相同属性时,分类结果可以表示为(X : Xi = Xj → di = dj)。为了验证这一条件,对于测试集中的每个参与者,我们需要生成性别相反的相同参与者,并比较这两个参与者的预测分类概率。然后,使用任何分类算法(如逻辑回归或随机森林分类器)训练该分类器,且不使用任何敏感属性,只有当它为两个组生成相同的概率时,才验证其成功。然而,我们还需要确保不使用任何直接敏感属性的代理特征来训练模型,这可能会导致模型结果产生不公平的结果。
通过意识实现公平
这种公平性度量结合了前两种类型,说明了相似的个体应展示相似的分类。我们可以基于距离度量来评估个体的相似性,其中个体的预测结果分布应该位于计算出的个体之间的距离之内。当 D(M(x), M(y)) ≤ k(x, y) 时,可以说满足公平性标准,其中 V 代表参与者集合,k 是两个参与者之间的距离度量,D(距离)表示预测输出分布之间的度量,V × V → R 创建从一组参与者到结果概率分布的对齐 M: V → δ**A。
现在让我们通过一个例子进一步说明。由于 k 表示两个参与者 i 和 j 之间的距离,如果 X 中的特征(除性别外的所有特征/属性)相同,则 k 的值可以为 0;如果 X 中的一些特征不同,则 k 的值为 1。如果分类器的预测结果属于同一类别,则 D 可以定义为 0,否则定义为 1。这里考虑的度量是距离,它是通过规范化年龄、收入等属性之间的差异计算得到的。简化版本的减少确保了距离的易表示,这表示模型对两个参与者预测概率的统计差异:D(i, j) = S(i) − S(j)。
基于因果推理的公平性类型
我们所讨论的公平类型是基于有向无环图(DAG)设计的,其中节点表示一个人的属性,边表示属性之间的关联。这样的图有助于构建公正的分类器和其他机器学习算法,因为它们是由属性之间的关系及其对模型结果的影响驱动的。这些关系可以通过一组不同的方程式进一步表达,以确定敏感属性的影响,并允许设定容忍阈值,从而允许不同群体之间存在一定的歧视。
图 7.7 – 包含代理属性和解决属性的因果图
图 7**.7 显示了一个因果图,其中包含信用额度、就业年限、信用历史、保护属性 G(或性别)和预测结果 d。图 7**.7 描述了如何从另一个属性中推导出 代理属性(如 G),在我们这个例子中,代理属性是就业年限。正如因果图所示,我们可以轻松地从一个人的就业年限推导出其性别。类似地,在因果图中,我们使用 解决属性 这一术语来描述由保护属性决定的属性,这种决定方式是公正的,不带有任何歧视。信用额度作为 G 的解决属性,其中不同 G 值下的信用额度变化不被视为偏见,也不带有任何歧视。
现在,让我们基于因果推理来看看不同类型的公平性:
-
反事实公平:当因果图中的预测结果 d 不依赖于保护属性 G 的任何后代时,这种公平性就适用。我们在 图 7**.7 中看到,d 依赖于信用历史、信用额度和就业年限。即使只有一个直接的后代 G,在这种情况下是就业年限,也会导致模型不满足反事实公平的条件。
-
无未解决歧视:当保护属性 G 到预测结果 d 之间没有任何路径时,因果图中就存在这种属性。解决变量的存在可以视为例外,不构成任何违规。在 图 7**.7 中,存在一条从 G 到 d 的路径,经过信用额度,这条路径是不带有歧视的。信用额度的存在使得解决属性得以建立,并进一步通过就业年限生成一条歧视性路径。因此,这个图展示了一个未解决歧视的例子,无法满足这一类型的公平性。
-
无代理歧视:因果图的这一属性意味着它没有任何代理歧视。换句话说,这意味着从受保护属性G到预测结果d之间不存在路径。在没有代理变量造成阻塞的情况下,可以说因果图没有代理歧视,从而确认数据的无偏表示。然而,在我们的例子中,从G到d通过就业时长代理属性存在间接路径,这意味着该图存在代理歧视。
-
公平推理:这种因果图中的公平性通过将路径标记为合法或不合法,帮助路径分类过程。因果图保证满足公平推理条件,即不存在从G到d的不合法路径。然而,正如图 7.7所示,通过信用额度存在另一条不合法路径,意味着它无法满足公平推理的条件。就业时长是信用相关决策中的一个重要因素,因此尽管它作为G的代理候选人,但这条路径可以被视为合法路径。
我们已经研究了不同的公平性统计衡量标准,但单凭这些是无法得出预测是否公平的结论的,它们假设有实际的、经过验证的结果。即使使用了统计指标,我们也不能确定训练数据中的结果总会出现在分类模型中,并且预测结果也会遵循相同的分布。为了支持模型预测中的公平性,也提出了使用基于距离的相似性度量和因果推理的更先进的公平性定义,但这些方法需要专家干预来确认结果。
寻求专家判断的一个问题是,它们可能会涉及偏见。现代研究技术探讨了如何在不妥协准确性的情况下减少搜索空间。此外,当我们尝试在解决方案中满足所有公平性条件时,解决方案的复杂性会增加,因为这样做需要探索更大的搜索空间。公平预测还需要考虑社会问题,如资源获取不平等和社会条件化。参与数据处理和机器学习模型开发的团队应尽量分析社会问题的影响,并在设计公平解决方案时加以考虑。
牢记这些公平性类型后,我们现在尝试掌握一些开源工具和技术,用于进行数据审计和质量检查。
数据审计和质量检查在公平性中的作用
在深入研究预测算法和评估公平性指标之前,我们必须先检查训练数据是否存在偏向于大多数人口群体的倾斜或偏见。这主要是因为大多数偏见源于对于人口中弱势群体或少数群体的数据不足。此外,当我们没有应用任何处理数据不平衡的技术时,偏见也会出现。在这种情况下,整合可解释性工具来证明数据的变化性和偏斜性是至关重要的。
现在让我们来探讨如何使用某些工具来衡量数据不平衡并解释变化性。我们首先要使用的工具之一是Fairlens,它有助于公平性评估和改进(如评估公平性指标、缓解算法、绘图等)。这里提供了一些示例代码片段(使用 COMPAS 数据集),这将帮助我们理解数据分布并评估公平性标准。
运行所有测试所需的导入如下:
import pandas as pd
import fairlens as fl
df = pd.read_csv""../datasets/compas.cs"")
公平性评估
让我们尝试使用 Fairlens:
-
fairlens.FairnessScorer
类可以用来自动生成数据集的公平性报告,只需提供目标列。在这里,目标列与敏感属性是独立的。我们可以通过传入所需输出列的名称,分析用于监督学习的数据集中的固有偏见。现在,让我们生成数据集的人口统计报告:fscorer = fl.FairnessScorer(df,""RawScor"", ""Ethnicit"",""Se""]) fscorer.plot_distributions() print""Demo Re"", fscorer.demographic_report())
这将生成如下输出,显示所有主要人口群体的分布评分完整表现。
图 7.8 – 各人口群体的分布统计
-
我们还绘制了非裔美国人和白人群体的十等分评分分布,如下所示:
group1 = ""rac"": ""African-America""]} group2 = ""rac"": ""Caucasia""]} fl.plot.distr_plot(df,""decile_scor"", [group1, group2]) plt.legend(""African-America"",""Caucasia""]) plt.show()
这将给出以下输出:
图 7.9 – 两个群体的比例 – 多数与少数
统计距离
这是另一个我们希望考虑的重要距离参数,如果我们想评估两个敏感人口群体/子群体之间分布的差异性。该指标用于评估两个概率分布(group1
和group2
)相对于目标属性的统计距离。
这可以通过以下代码来完成,返回(0.26075238442125354, 0.9817864673203285
)。它返回距离和 p 值,因为p_value
设置为True
:
group1 = ""Ethnicity"": ""African-America""]}
group2 = df""Ethnicity""] ==""Caucasia""
print (fl. metrics. stat_distance(df, target_attr, group1, group2, mode""aut"", p_value=True))
代理检测
该指标帮助我们评估某些数据集中的代理特征。一些不敏感的属性可能会与敏感列高度/部分相关,从而有效地成为它们的代理。这反过来会使得在使用相同数据集进行训练时,模型变得有偏。这里,我们可以尝试评估四个不同数据点中隐藏的不敏感代理特征:
col_names = ""gende"",""nationalit"",""rando"",""corr"",""corr""]
data = [
""woma"",""spanis"", 715, 10, 20],
""ma"",""spanis"", 1008, 20, 20],
""ma"",""frenc"", 932, 20, 10],
""woma"",""frenc"", 1300, 10, 10],
]
df = pd.DataFrame(data, columns=col_names)
print(fl.sensitive.find_sensitive_correlations(df))
线性回归
线性回归可以通过评估因变量和自变量之间的相关性,帮助我们识别代理特征。
余弦相似度/距离方法
余弦相似度是用于检测代理特征的机制之一,其中相似度因子在多维空间中评估相似项。当数据集中的任意两个特征(例如,在贷款申请数据集中)之间的余弦相似度方向相同,它们就会成为代理特征。这样的情况在看到月收入和支出作为代理特征时尤其明显,尤其是在贷款申请中,考虑到申请人的性别和抚养人数。
使用方差的线性关联方法
该指标在 Yeom、Datta 和 Fredrikson 的论文《在线性回归模型中寻找歧视性代理》中进行了讨论(arxiv.org/pdf/1810.07155.pdf
),旨在衡量两个属性之间的关联。要计算此指标,我们需要计算 cov (X1, X2)2 / Var (X1) Var (X2),其计算方法如下:
-
首先,我们需要计算两个特征属性之间的协方差因子:
covar_sex_dur = data.Sex.cov(data.Duration)
-
下一步是计算特征属性的各自方差:
variance_sex = data.Sex.var() variance_dur= data.Duration.var()
-
然后,我们尝试评估特征属性之间的线性关联度:
association = covar_sex_dur/(variance_sex*variance_dur) print ""Association between Sex and Duratio"", association)
我们得到以下输出:
Association between Sex and Duration -0.014593816319825929
现在,让我们来看一下如何确定保护特征与其他特征之间的相关性。
方差膨胀因子
方差膨胀因子(VIF)指标旨在通过评估每个变量的决定系数(R2)来衡量多重共线性。由于该方法确定了代理特征,它可以帮助去除作为敏感/受保护属性代理的共线性或多重共线性特征。通过利用多个回归树,还可以进一步移除特征。
在回归模型中,保护特征与其他特征之间的 VIF 值较高,表示多个共线性特征之间的共线性信号。此外,这也表明另一个特征存在强烈的共线性,因此成为研究特征的代理:
-
第一步是导入 VIF 所需的库并加载
german_credit
数据集:import pandas as pd from statsmodels.stats.outliers_influence import variance_inflation_factor df = pd.read_csv""../datasets/german_credit_data.cs"") data = df[''Ag'',''Se'',''Jo'',''Duratio'',''Credit amoun'']] data = data.dropna()
-
下一步是为敏感特征属性创建映射,并分隔我们希望计算 VIF 的自变量:
data''Se''] = data''Se''].map(''mal'': 0,''femal'': 1}) X = data[''Ag'',''Se'',''Jo'',''Credit amoun'',''Duratio'']]
-
最后一步是对数据运行 VIF,评估每个特征属性的 VIF,并发现潜在的代理特征:
vif_data = pd.DataFrame() vif_data""featur""] = X.columns vif_data""VI""] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))] print(vif_data)
-
我们得到以下输出,清晰地显示
Job
和Duration
具有较高的 VIF 值。将它们一起使用会导致模型出现较高的多重共线性。它们作为潜在的代理特征候选:feature VIF Age 5.704637 Sex 1.365161 Job 7.180779 Credit amount 3.970147 Duration 6.022894
互信息
该度量表示在已知某个特征属性的情况下,另一个特征属性可用的信息量。它在非线性树形算法中通过计算 I(X1, X2) 来工作,I(X1, X2) 是联合概率的加权和,与 COV(X1, X2) 相对,后者是两个特征乘积的加权和:
-
我们可以按如下方式计算
german_credit
数据集的互信息分数:mi_1 = mutual_info_score(data''Ag''], data''Se'']) mi_2 = mutual_info_score(data''Jo''], data''Se'']) mi_3 = mutual_info_score(data''Duratio''], data''Se'']) mi_4 = mutual_info_score(data''Credit amoun''], data''Se'']) print""Mutual Inf"", mi_1, mi_2, mi_3, mi_4, mi_5)
-
我们得到以下输出,这再次确认了信用金额与性别之间的关系较强,其次是性别与信用期限属性之间的关系:
Mutual Info 0.06543499129250782 0.003960052834578523 0.019041038432321293 0.5717832060773372
显著性检验
当我们评估公平性得分并评估统计距离时,我们也可能想要检验原假设,并查看原假设或备择假设是否成立。这可以通过自助法或排列检验来完成,通过多次重新采样数据。这些迭代会多次计算统计量,并通过计算度量的 p 值或置信区间来提供其分布的估计:
-
让我们通过以下示例来看一下如何计算男性和女性分布之间的置信区间以及 p 值:
group1 = df[df""Se""] ==""Male"] ""RawScor""] group2 = df[df""Se""] ==""Female"] ""RawScor""]
-
可以通过以下代码配置测试统计量。
t_distribution
可以通过排列或自助法在之前创建的两个组之间进行设置:test_statistic = lambda x, y: x.mean()–- y.mean() t_distribution = fl.metrics.permutation_statistic(group1, group2, test_statistic, n_perm=100)
或者,你可以使用以下代码:
t_distribution = fl.metrics.bootstrap_statistic(group1, group2, test_statistic, n_samples=100)
-
现在,让我们计算如图所示的置信区间和 p 值:
t_observed = test_statistic(group1, group2) print("Resampling Interval", fl.metrics.resampling_interval(t_observed, t_distribution, cl=0.95)) print("Resampling Pval", fl.metrics.resampling_p_value(t_observed, t_distribution, alternative="two-sided"))
-
现在我们得到以下输出。对于第一个案例,我们得到置信区间作为元组,而对于第二个案例,我们得到 p 值:
Resampling Interval (0.24478083502138195, 0.31558333333333327) Resampling Pval 0.37
评估组公平性
我们已经看到群体公平性对实现普遍公平性的重要性。Natalia Martinez、Martin Bertran 和 Guillermo Sapiro 是最小最大公平性标准概念的发明者,该概念旨在改进群体公平性指标。现在让我们研究一下最小最大公平性的重要概念 (github.com/amazon-research/minimax-fair
),它在没有保护性群体标签的情况下力图实现公平性。错误率平等是最直观且研究最深入的公平性形式之一。但在尝试通过提高错误率阈值来平衡错误率时,这会带来一个主要挑战,而这对于社会福利而言是不可取的。因此,提高错误容忍度以在种族群体、收入水平和地理位置上实现错误率平等并不是一个好的选择。为了进一步增加群体公平性,我们可以使用 Martinez 在 2020 年提出的最小最大群体误差。群体公平性的概念并不寻求平衡错误率(如前所述的公平性定义)。相反,这一度量指标试图最小化最大的群体误差率,以确保最差的群体在公平性度量方面表现出相同的值。这个放宽的公平性概念力图在最小最大公平性和整体准确性之间实现正确的平衡。该指标具有双重目标:
-
首先,它会尝试从给定的统计类别中找到一个最小最大群体公平模型
-
然后,它评估一个最小化整体错误的模型,其中约束已被设置为将所有群体的错误控制在指定的(预先确定的)阈值以下
前面两个步骤的目标是将过程简化为在同一类别上进行无约束(非公平)学习,在此过程中它们会收敛。最小最大公平性指标可以进一步扩展,以处理不同类型的错误率,如假阳性率(FP)和假阴性率(FN),以及具有交集特征的重叠群体。这些具有交集属性的群体不仅限于种族或性别,还可以是种族和性别的组合:
-
使用数据集,我们生成
X
、y
、grouplabels
和groupnames
:X, y, grouplabels, group_names, group_types, is_categorical = \ setup_matrices(path, label, groups, usable_features=usable_features, drop_group_as_feature=drop_group_as_feature, categorical_columns=categorical_columns, groups_to_drop=groups_to_drop, verbose=verbose, save_data=save_data, file_dir=file_dir, file_name=file_name)
-
这里
X
和y
是每种群体类型的特征和标签。此外,X
被划分为多个不同的群体,每个群体都有一个共享的线性函数。该函数用于带噪声的标签采样。在没有数据集的情况下,为了构建和评估一个公平的最小最大模型,我们可以使用合成数据生成机制,如以下代码片段所示:generate_synthetic_data(numdims, noise, numsamples=1000, num_group_types=1, min_subgroups=2, max_subgroups=10, min_subgroup_size=20, mean_range=0, variability=1, num_uniform_features=0, intercept_scale=2, binary=False, drop_group_as_feature=False, save_data=False, file_dir='', file_name='', random_seed=0)
-
现在可以启动学习过程,如以下代码片段所示,学习所需的参数在接下来的表格中给出:
minimax_err, max_err, initial_pop_err, agg_grouperrs, agg_poperrs, _, pop_err_type, total_steps, _, _, _, \ _, _, _ = \ do_learning(X, y, numsteps, grouplabels, a, b, equal_error=False, scale_eta_by_label_range=scale_eta_by_label_range, model_type=model_type, gamma=0.0, relaxed=False, random_split_seed=random_split_seed, group_names=group_names, group_types=group_types, data_name=data_name, verbose=verbose, use_input_commands=use_input_commands, error_type=error_type, extra_error_types=extra_error_types, pop_error_type=pop_error_type, convergence_threshold=convergence_threshold, show_legend=show_legend, save_models=False, display_plots=display_intermediate_plots, test_size=test_size, fit_intercept=fit_intercept, logistic_solver=logistic_solver, max_logi_iters=max_logi_iters, tol=tol, penalty=penalty, C=C, n_epochs=n_epochs, lr=lr, momentum=momentum, weight_decay=weight_decay, hidden_sizes=hidden_sizes, save_plots=save_intermediate_plots, dirname=dirname)
现在让我们来看看在公平合成数据生成中涉及的不同参数及其功能:
参数名称 | 目的 |
---|---|
X |
一个特征的 NumPy 矩阵,其维度等于numsamples 。 |
y |
长度为numsamples 的标签的 NumPy 数组。应为数值(0/1 标签的二进制分类)。 |
a, b |
eta = a * t ^ (-b) 的参数。 |
scale_eta_by_label_range |
是否应该按最大绝对标签值平方缩放输入值。 |
rescale_features |
是否应该重新调整特征值以确保数值稳定性。 |
gamma |
收敛时允许的最大允许最大分组错误。 |
relaxed |
表示我们是否正在解决问题的放松版本。 |
model_type |
sklearn 模型类型,如LinearRegression 、LogisticRegression 等。 |
error_type |
仅用于分类:总计、FP、FN 等。 |
extra_error_types |
我们想要绘制的错误类型集合。 |
pop_error_type |
在人群中使用的错误类型:例如,错误度量是整个人群的 FP/FN 总和。 |
convergence_threshold |
当样本权重的最大变化 < convergence_threshold 时,提前收敛。 |
Penalty |
logistic 回归的正则化惩罚。 |
C |
正则化强度的倒数。 |
logistic_solver |
用于 logistic 回归的底层求解器。 |
fit_intercept |
是否应该拟合额外的截距。 |
max_logi_iters |
logistic 回归迭代的最大次数。 |
表 7.2 – 训练最小最大模型的不同参数
图 7**.10显示了使用 logistic 回归和最小最大组公平性的合成数据中个体组错误、组权重和平均人群错误的变化。我们可以看到,个体子组(log 损失错误)和平均人群错误(log 损失)大致遵循相同的趋势,并保持在0.63
到0.65
之间。
图 7.10 – 显示训练最小最大模型的不同参数的图表
评估反事实公平性
让我们使用开源的FAT Forensics (fatf)库,这是一个用于评估预测系统公平性、问责和透明性的 Python 工具箱:
-
首先,让我们设置必要的导入:
import numpy as np import fatf.utils.data.datasets as fatf_datasets import fatf.utils.models as fatf_models import fatf.fairness.predictions.measures as fatf_pfm import fatf.transparency.predictions.counterfactuals as fatf_cf
-
让我们加载一个合成的医疗保健数据集:
hr_data_dict = fatf_datasets.load_health_records() hr_X = hr_data_dict['data'] hr_y = hr_data_dict['target'] hr_feature_names = hr_data_dict['feature_names'] hr_class_names = hr_data_dict['target_names']
-
数据集加载后,让我们将目标索引映射到目标名称,删除不必要的列,然后开始训练过程:
hr_y = np.array([hr_class_names[i] for i in hr_y]) unique_identifiers = ['name', 'email', 'zipcode', 'dob'] columns_to_keep = [i for i in hr_X.dtype.names if i not in unique_identifiers] hr_X = hr_X[columns_to_keep] hr_feature_names = [i for i in hr_feature_names if i not in unique_identifiers]
-
接下来,我们开始模型训练并选择用于反事实公平性的实例:
clf = fatf_models.KNN() clf.fit(hr_X, hr_y)
-
训练模型后,让我们选择数据实例(其受保护特征),以便测试反事实公平性:
data_point_index = 4 + 2 data_point = hr_X[data_point_index] data_point_y = hr_y[data_point_index] protected_features = ['gender', 'age']
-
打印受保护特征和实例:
assert protected_features, 'The protected features list cannot be empty.' person = ' is' if len(protected_features) == 1 else 's are' print('The following fautre{} considered protected:'.format(person)) for feature_name in protected_features: print(' "{}".'.format(feature_name)) print('\nEvaluating counterfactual fairness of a data point (index {}) of ' 'class *{}* with the following features:'.format(data_point_index, data_point_y)) for feature_name in data_point.dtype.names: print(' The feature *{}* has value: {}.'.format( feature_name, data_point[feature_name]))
这导致以下输出:
The following features are considered protected:
"gender".
"age".
Evaluating counterfactual fairness of a data point (index 6) of class *fail* with the following features:
The feature *age* has value: 41.
The feature *weight* has value: 73.
The feature *gender* has value: female.
The feature *diagnosis* has value: heart.
-
接下来的步骤是计算反事实不公平的样本:
cfs, cfs_distances, cfs_classes = fatf_pfm.counterfactual_fairness( instance=data_point, protected_feature_indices=protected_features, model=clf, default_numerical_step_size=1, dataset=hr_X)
-
最后一步是打印反事实不公平的数据点:
cfs_text = fatf_cf.textualise_counterfactuals( data_point, cfs, instance_class=data_point_y, counterfactuals_distances=cfs_distances, counterfactuals_predictions=cfs_classes) print('\n{}'.format(cfs_text))
-
这将生成以下输出:
Counterfactual instance (of class *success*): Distance: 19 feature *age*: *41* -> *22* Counterfactual instance (of class *success*): Distance: 20 feature *age*: *41* -> *22* feature *gender*: *female* -> *male*
我们已经学习了在研究公平性时,不平等影响的含义。现在,让我们通过代码示例来看如何衡量最常见的三种不平等影响度量。
-
要评估等精度指标,我们可以使用以下代码片段:
equal_accuracy_matrix = fatf_mfm.equal_accuracy(confusion_matrix_per_bin) print_fairness('Equal Accuracy', equal_accuracy_matrix)
-
要评估等机会指标,我们运行以下命令:
equal_opportunity_matrix = fatf_mfm.equal_opportunity(confusion_matrix_per_bin) print_fairness('Equal Opportunity', equal_opportunity_matrix)
-
要评估人口统计平等指标,我们运行以下命令:
demographic_parity_matrix = fatf_mfm.demographic_parity( confusion_matrix_per_bin) print_fairness('Demographic Parity', demographic_parity_matrix)
-
这是我们在评估等精度、等机会和人口统计平等时得到的输出:
The *Equal Accuracy* group-based fairness metric for *gender* feature split is: The fairness metric is satisfied for "('female',)" and "('male',)" sub-populations. The *Equal Opportunity* group-based fairness metric for *gender* feature split are: The fairness metric is satisfied for "('female',)" and "('male',)" sub-populations. The *Demographic Parity* group-based fairness metric for *gender* feature split is: The fairness metric is >not< satisfied for "('female',)" and "('male',)" sub-populations.
在了解了公平性的基本概念和示例之后,我们还应该了解如何应用这些概念来遵循最佳实践。
最佳实践
我们通过不同的示例和代码片段探索了如何评估不同的公平性指标。然而,在评估之前,我们需要确保用于训练模型的数据能够成比例地代表人口的所有不同群体。此外,为了解决公平性问题,另一个重要标准是确保你的预测对于每个群体都是经过校准的(towardsdatascience.com/understanding-bias-and-fairness-in-ai-systems-6f7fbfe267f3
)。当模型得分未对每个群体进行校准时,我们可能会高估或低估不同群体的结果概率。我们可能需要重新设计阈值,为每个群体创建单独的模型和决策边界。这个过程将减少偏差,并使每个群体的预测比单一阈值更公平。
大多数时候,我们无法获得所有群体在数据中均等代表的情况。在这种情况下,最佳实践是通过应用人工方法生成合成数据集,以便我们不仅能用不同群体的均等代表来训练模型,还能根据为每个群体定制的不同阈值验证预测结果。这将消除表示偏差,并在创建数据集时考虑地理多样性。
我们还有一些工具,接下来会提到,用于评估公平性。
偏差缓解工具包
这里列出了一些工具:
-
Aequitas:一个开源的偏差和公平性审计工具包,评估模型在多个子群体中的不同类型的偏差和公平性指标。
-
Microsoft Fairlearn:该工具包通过利用约束,采用公平分类(例如二分类)的减法方法。基于约束的方法将公平分类问题简化为一系列成本敏感的分类问题。在应用约束的情况下,生成一个随机分类器,并获得最低的(经验)误差。
-
假设分析工具:这是一个开源的 TensorBoard Web 应用程序,由 Google 提供的工具包,可以让你查看反事实数据,从而分析机器学习模型。用户可以将给定数据点与最相似的另一个数据点进行对比,而该数据点的模型预测结果不同。此工具还具有灵活性,可以调整不同分类阈值的效果,并能够调整不同的数值公平性标准。
-
AI 公平性 360:这是由 IBM 开发的工具包,包含了一套全面的公平性度量标准,适用于数据集和机器学习模型。它提供了对这些度量标准的可解释性,并提供了多种算法,以在数据预处理和模型训练阶段减轻数据偏差。
我们将在后续章节中讨论一些这些工具包。
既然我们了解了可用的不同偏差缓解工具包,以及审计数据和频繁进行质量检查的重要性,让我们研究合成数据集以及它们如何帮助建模公平的机器学习问题。
公平的合成数据集
所谓合成数据,是指从头开始人工生成的数据,其统计特性与输入到系统中的原始或基础数据集相匹配。合成生成的数据集与原始数据集中存在的真实对象没有任何关联。
现代人工智能(AI)研究推动了创新,并发布了先进的工具,这些工具能够在数据密集型环境中生成合成数据。随着更好工具和技术的出现,公平的、保护隐私的合成数据生成(尤其是表格数据)已被组织广泛采纳。
合成数据生成算法能够实时获取数据并学习其特征、不同特征间的关联性以及模式。然后,它们可以生成大量人工数据,这些数据在统计特性和分布上与原始数据非常相似。总体而言,这些新生成的数据集也具备可扩展性、隐私合规性,并且能够展示所有有价值的见解,而不违反数据保密规则。人工智能生成的合成数据在金融和医疗行业被广泛应用,以扩展其人工智能解决方案。合成数据还成功地为缺失和难以获取的数据生成了强健的替代品。
敏感数据通常被限制在团队和部门内部。但随着合成数据生成工具的实施,使用私密的合成数据副本以隐私合规的方式与团队和第三方进行合作变得更加容易。合成数据非常适合改善受偏见或不平衡影响的机器学习算法,尤其是在新的、稀有的来访数据具有比历史数据更大影响的情况下。这类合成数据在确定欺诈交易中发挥作用,欺诈交易的比例通常小于整体交易的 5%。上采样的合成数据集不仅能够检测交易数据中的偏见,还能遵循伦理原则,帮助机器学习模型为少数群体或弱势群体提供更好的、更公平的结果。因此,合成数据在设计伦理机器学习管道中起着至关重要的作用。公平的合成数据能够从机器学习模型的预测中消除社会和历史偏见。
现在,让我们通过一个例子来研究一个框架,该框架通过使用真实的训练样本生成私密合成数据,而不披露个人的 PII(个人身份信息)。
MOSTLY AI 的自监督公平合成数据生成器
该框架在自监督学习过程中考虑了公平性约束,用以模拟和生成大量的公平合成数据。该框架采用生成模型架构,输入数据集(在我们的例子中是 UCI 成人人口普查数据集),以获得一个比原始数据集具有更高公平度的数据集。
此外,结果数据集保留了属性之间的所有原始关系,但仅控制原始数据中的性别和种族偏见。预测模型结果的倾向评分显示了公平的合成数据与原始数据集相比,如何缓解偏见的事实。
在机器学习中,我们通常使用生成深度神经网络,这些网络使用新的合成样本(它们是实际数据的表示)来优化正在训练的机器学习模型的准确性损失。损失可以表示拟合函数与实际数据的观测分布的相似性。生成公平、代表性数据的过程需要对原始损失函数进行额外的损失,这可以惩罚任何违反统计平等的行为。
图 7.11 – 用于训练最小最大模型的不同参数
因此,公平合成数据生成算法涉及优化一个综合损失,其中包含以下内容:
-
准确性损失的加权和
-
一种与经验估计的统计平等偏差成正比的公平性损失
-
准确性与公平性之间的正确权衡,其中权重从一个损失组件转移到另一个
图 7.11展示了生成合成数据的逐步过程,并比较了在原始数据集和合成数据集上训练模型时的模型表现。
我们已经看到基于机器学习的合成数据生成是如何实现的。接下来,让我们看看在公平合成数据中,像性别和收入等保护属性如何帮助满足我们之前研究的一些公平性定义。
对公平性统计的影响
我们将利用生成式深度神经网络作为表格数据的合成器,从adult_income
数据集中生成合成数据样本。生成式模型合成器会在具有奇偶性公平约束的情况下运行 50 次,并将性别作为保护属性。图 7.12显示,在原始数据的高收入类别中存在的性别不平衡被合成数据成功缓解。通过比较高收入男性与高收入女性比例得出的差异影响在原始数据集中大约为 10/30 = 0.33,而在经过偏差校正的合成数据集中为 22/25 = 0.88。我们看到,合成数据的这一指标显著高于 0.80,这是行业基准。因此我们可以放心地得出结论,数据合成有助于缓解偏差。
我们进一步观察到,在模型训练过程中增加的额外公平约束并未降低数据质量,如图 7.12所示。
图 7.12 – 合成数据缓解收入差距
单变量和双变量分布都表明,数据集能够保持人口层面的男女比例和高收入者与低收入者比例。只有统计公平约束,表示收入和性别的依赖关系,被允许违背,使得它们变得不相关。使用代表性和合成数据后,这种相关性被减少到噪音水平,如下图所示(见图中浅绿色区域的红圈)。
图 7.13 – 原始数据与合成数据的单变量与双变量统计
研究代理属性进一步表明,它们并未通过“后门”引入不公平。即便是加入一个与性别高度相关的人工特征(名为“代理”),也发现它在原始数据集中与“性别”保持恒定的相关性,而通过引入奇偶性约束,由于促成了公平性,这一相关性得到了显著降低。女性部分显示,“代理”在 90%的情况下等于 1,剩余 10%的情况下等于 0。图 7.14进一步说明了这一点:
图 7.14 – 奇偶性公平性约束适用于性别等代理属性
对于成人数据集,通过在“性别”和“种族”上应用公平性约束来训练生成模型。此外,从图 7.15可以明显看出,合成数据在所有四个按种族和性别划分的组别中,高收入比例高度平衡。尽管该解决方案无法保证完全的奇偶性,但通过将公平性损失的权重相对于准确性损失的权重设置更高,可以在差异进一步缩小时获得完整的公平性。
图 7.15 – 通过分别考虑性别和种族的约束进行偏差缓解
在图 7.16中,我们看到相应预测模型的倾向得分,分别在原始数据集和合成数据集上展示。
图 7.16 – 对原始数据集和合成数据集的高收入预测
使用相同的机器学习模型,我们发现,原始数据集上拟合的模型显示女性进入高收入类别的概率得分明显低于对立性别——男性。因此,合成数据的差异被缩小,且由性别属性驱动的两个分布被发现一致。由于预测模型的训练过程没有通过公平性优化任何模型,因此显而易见,预测结果主要是由于使用了经过偏差修正的合成数据。一个基于公平性约束的合成数据解决方案确保了群体公平性。数据集保持了其他属性之间的关系,同时消除了敏感属性和目标属性之间的依赖关系。此外,奇偶性约束还确保了对隐藏代理属性的公平性。
以下步骤逐步演示如何生成公平的合成数据,以平等地表示男性和女性:
-
我们将设置一组特定的超参数(包括输入训练数据大小、层大小和分类器类型),并使用合成数据进行训练:
inputsize = train_dataset["data"]. shape[1] layersizes = [100] classifier_type = "paritynn" hparams = { "classifier_type": classifier_type, "layersizes": layersizes, "inputsize": inputsize, }
-
我们的下一个任务是设置一个分类器,使用前述状态中使用的超参数训练网络。在训练数据集的过程中,我们使用验证数据集来验证训练过程:
classifier = construct_classifier(hparams, loaddir=loaddir) classifier.train(train_dataset, logdir, epochs=args.epochs,] validation_dataset=validation_dataset) savepath = classifier.save_model(logdir) n = validation_dataset["label"].shape[0]
-
construct_classifier
函数被设置在fariml-farm
库中,用于构建分类器,如以下代码片段所示:classifier_types = [SimpleNN, ParityNN, AdversariallyCensoredNN] def construct_classifier(hparams, sess=None, loaddir=None): for c_type in classifier_types: if c_type.name == hparams["classifier_type"]: classifier = c_type(sess=sess) classifier.build(hparams=hparams) if loaddir is not None: classifier.load_model(loaddir) return classifier
-
我们的下一个任务是通过合成数据生成过程,使男性(
1
)和女性(0
)点的表示等效:n_males = sum(validation_dataset["label"]) limiting_gender = n_males > n - n_males n_limiting_gender = sum(validation_dataset["label"] == limiting_gender) max_points_per_gender = 500 n_per_gender = min(max_points_per_gender, n_limiting_gender) inds = np.concatenate([ np.where(validation_dataset["label"] == limiting_gender)[0][:n_per_gender], np.where(validation_dataset["label"] != limiting_gender)[0][:n_per_gender]], axis=0) vis_dataset = {k:v[inds, ...] for k, v in validation_dataset.items()} val_embeddings = classifier.compute_embedding(vis_dataset["data"]
-
分类器使用以下给定的损失函数进行优化:
overall_loss = crossentropy +\ self.hparams["dpe_scalar"]*dpe +\ self.hparams["fnpe_scalar"]*fnpe +\ self.hparams["fppe_scalar"]*fppe +\ self.hparams["cpe_scalar"]*cpe +\ self.hparams["l2_weight_penalty"]*l2_penalty
总损失是通过dpe
、fnpe
、fppe
和cpe
计算的各项损失之和。为dpe
评估的损失函数表示由demographic_parity_discrimination
(人口平衡歧视)引起的损失,而fnpe
和fppe
则表示由equalized_odds_discrimination
(均等机会歧视)引起的损失。
-
现在,如果我们尝试绘制嵌入图,我们可以使用以下代码片段,这将生成男性和女性群体年收入>=50K 或<50K 之间几乎等效的嵌入表示:
plot_embeddings(val_embeddings, vis_dataset["label"], vis_dataset["protected"], plot3d=True, subsample=False, label_names=["income<=50k", "income>50k"],protected_names=["female", "male"])
这将产生以下输出:
图 7.17 – 男性和女性群体年收入>=50K 或<50K 之间嵌入的等效表示
我们了解了 MOSTLY AI 的公平性 GAN 如何生成对公平统计产生积极影响的合成数据集。接下来,让我们探讨一种基于 GAN 的方法,该方法利用有向无环图(DAG)来生成公平的合成数据。
基于 GAN 的公平合成数据生成器
现在,让我们通过一个例子来看看如何使用因果感知生成网络生成公平、无偏的合成数据。目标是生成一个无偏的数据集,并且不丢失数据分布的表示。数据生成过程可以通过有向无环图(DAG)进一步建模。在这里,训练合成数据的机器学习模型(无论是单个模型还是一系列模型)不仅能对合成数据做出无偏的预测(满足公平性标准),还能够对现实世界的数据集做出无偏的预测。
去偏因果公平性(DECAF)框架基于 GAN,利用d个生成器(每个生成器分配给每个变量)通过因果结构的原理进行数据合成,以学习数据中存在的因果条件。DECAF 中嵌入的数据生成过程(DGP)允许根据变量的来源(即因果父节点)通过生成器的输入层重新构建和再生变量。像这样的框架可以从有偏的现实世界数据集中去除偏差(例如,低估少数群体的群体),以及那些已被人为引入偏差的现实世界数据集。此外,DECAF 还承诺通过差分隐私鉴别器替换标准鉴别器,为机密信息提供保护,从而实现私有合成数据生成过程。
鉴别器和生成器通过在连续的迭代中向两个网络添加正则化损失,进行优化过程。优化过程使用梯度下降,并保证与标准 GAN 相同的收敛标准。该框架包括以下内容:
-
满足马尔可夫兼容性的生成数据分布函数。对于已知的有向无环图(G),如果我们发现每个节点代表一个概率分布中的变量(P),则当图中的每个变量 X 与其非后代节点独立时,称其为马尔可夫兼容。
-
生成器 G 和鉴别器 D 都需要足够的能力。
-
每次训练迭代都成功优化给定的有向无环图(G)并相应地更新它。
-
最大化鉴别器损失。
-
生成器生成的分布函数,通过优化使其收敛到真实数据分布。
在训练阶段,DECAF 通过 GAN 学习数据中存在的因果条件。GAN 能够学习源节点与目标节点之间因果图中的因果条件。在生成(推理)阶段,框架通过应用三个基本原理来运行,CF 去偏、FTU 去偏和DP 去偏,这些有助于生成器创造公平的数据。然而,还假设在此之前已知数据生成过程(DGP)的图 G。
在推理过程中,变量合成过程源自根节点,然后传播到它们的子节点(来自因果图中生成的因果父节点)。数据合成的拓扑过程依赖于顺序数据生成技术,并在叶节点处终止。这使得 DECAF 算法能够在推理时通过执行针对性的/有偏边缘移除策略,战略性地去除偏差,并进一步增加满足用户定义公平性要求的概率。研究还发现,DECAF 能够满足我们之前讨论的公平性/歧视定义,同时保持生成数据的高效用性,使其能够被机器学习模型有效使用而不产生算法偏差。
通过无知实现公平(FTU)是通过保持所有其他特征不变,并计算下游分类器预测之间的差异来衡量的,当分类器的预测分别为 1 和 0 时,公式为 | PA = 0 (Yˆ|X)–– PA = 1(Yˆ|X) |。该度量帮助评估 A 对预测结果的直接影响。该度量旨在消除不同的对待,这在法律上与直接歧视相关,并力求为任何两位同等资质的人提供相同的机会,无论他们的种族、性别或其他受保护属性如何。
人口平衡(DP)是通过总变差来衡量的,这表示并解释下游分类器预测之间的差异。这有助于计算受保护变量 A 不同类别(例如非洲裔、美国裔、亚洲裔和西班牙裔)之间的正负比率:
| P (Yˆ |A = 0)–− P (Yˆ |A = 1) |
该指标不允许任何间接歧视,除非可解释性因素另有说明。
条件公平性(CF)旨在将 FTU 和 DP 进行泛化。
所有 DECAF 方法都能生成良好的数据质量指标:精准率、召回率和 AUROC。一个值得特别提及的优秀公平数据生成机制是 DECAF-DP,它在所有五个评估指标(精准率、召回率、AUROC、DP 和 FTU)中表现最佳,并且在数据集表现出高偏差时,仍能提供更好的 DP 性能结果。
图 7.18 – DECAF 中的训练阶段
前一图中的训练阶段直接跟随以下图中的推理阶段。
图 7.19 – 公平推理阶段,启用 DECAF 中的公平数据合成
现在,让我们看看如何使用以下代码片段通过 DECAF 生成合成数据:
-
以下代码包含所有必要的导入:
import networkx as nx import pytorch_lightning as pl from utils import gen_data_nonlinear import sys from decaf import DECAF from decaf.data import DataModule
-
现在,在设置必要的导入后,让我们使用
dag_seed
设置 DAG 结构。图的因果结构存储在dag_seed
中:dag_seed = [[1, 2], [1, 3], [1, 4], [2, 5], [2, 0], [3, 0], [3, 6], [3, 7], [6, 9], [0, 8], [0, 9], ]
-
下一步是使用以下代码片段调用
DiGraph
,并使用dag_seed
。dag
结构存储在dag_seed
变量中。边缘移除存储在bias_dict
变量中。在这里,我们移除了 3 和 6 之间的边缘。此外,gen_data_nonlinear
用于在每个节点应用扰动:bias_dict = {6: [3]} G = nx.DiGraph(dag_seed) data = gen_data_nonlinear(G, SIZE=2000) dm = DataModule(data.values) data_tensor = dm.dataset.x
-
在下一阶段,我们设置不同的超参数,以促进训练过程:
x_dim = dm.dims[0] z_dim = x_dim lambda_privacy = 0 lambda_gp = 10 l1_g = 0
-
权重衰减已初始化,AdamW 是一个优化器,它是Adam(自适应矩估计)的改进版,能够通过随机梯度下降以更快的训练速度生成更好的模型。AdamW 具有权重衰减功能,可以用来对所有网络权重进行正则化:
weight_decay = 1e-2
-
下一步是设置生成点的比例,对于顺序采样来说是负值:
p_gen = (-1) use_mask = True grad_dag_loss = False number_of_gpus = 0
WGAN-GP
你可以在这里阅读更多关于 Wasserstein GAN 与梯度惩罚(WGAN-GP)的内容:jonathan-hui.medium.com/gan-wasserstein-gan-wgan-gp-6a1a2aa1b490
。
-
现在让我们通过设置不同的超参数、生成器和正则化参数来初始化并训练 DECAF 模型:
model = DECAF( dm.dims[0], dag_seed=dag_seed, h_dim=args.h_dim, lr=args.lr, batch_size=args.batch_size, lambda_privacy=lambda_privacy, lambda_gp=lambda_gp, d_updates=args.d_updates, alpha=args.alpha, rho=args.rho, weight_decay=weight_decay, grad_dag_loss=grad_dag_loss, l1_g=l1_g, l1_W=args.l1_W, p_gen=p_gen, use_mask=use_mask, ) trainer = pl.Trainer( gpus=number_of_gpus, max_epochs=args.epochs, progress_bar_refresh_rate=1, profiler=False, callbacks=[], ) trainer.fit(model, dm) synth_data = ( model.gen_synthetic( data_tensor, gen_order=model.get_gen_order(), biased_edges=bias_dict ).detach() .numpy() )
我们现在已经生成了可以输入任何机器学习模型的合成无偏数据。
总结
在本章中,我们学习了公平性算法在解决社会偏见中的重要性,因为不同类型的偏见会妨碍机器学习模型得出公平结果的能力。我们深入探讨了各种公平性类型,并学习了如何将它们应用于数据质量检查、发现条件依赖关系和属性关系以及生成审计报告的实践过程中。在此过程中,我们探讨了偏见如何出现在数据本身和/或预测模型的结果中。此外,我们还迈出了学习公平合成数据生成过程的第一步,旨在帮助消除偏见。
在后续章节中,我们将进一步学习如何在多样化数据集或群体中应用公平意识模型的机制。此外,我们还将探讨如何根据问题领域和所研究数据集的特点,选择适当的受保护属性(如性别、种族等)。在下一章,第八章,模型训练与优化中的公平性,我们将深入了解如何创建受约束的优化函数,以帮助构建公平的机器学习模型。
深入阅读
-
《公平性定义解析》,发表于《软件公平性国际研讨会论文集》(FairWare ‘18),计算机协会,Verma Sahil 和 Julia Rubin(2018 年),
fairware.cs.umass.edu/papers/Verma.pdf
-
《公平性意识机器学习数据集调查》,《Wiley 跨学科评论:数据挖掘与知识发现》,10.1002/widm.1452,
www.researchgate.net/publication/355061634_A_survey_on_datasets_for_fairness-aware_machine_learning
-
《代表性与公平合成数据》,Tiwald, Paul & Ebert, Alexandra & Soukup, Daniel.(2021 年),
arxiv.org/pdf/2104.03007.pdf
-
《最小最大群体公平性:算法与实验》,《2021 年 AAAI/ACM 人工智能、伦理与社会会议论文集》,计算机协会,纽约。Emily Diana、Wesley Gill、Michael Kearns、Krishnaram Kenthapadi 和 Aaron Roth(2021 年)。
assets.amazon.science/9d/a9/e085008e45b2b32b213786ac0149/minimax-group-fairness-algorithms-and-experiments.pdf
-
《机器学习中的偏见与公平性调查》,ACM 计算机评论,54 卷,第 6 期,第 115 号文章(2022 年 7 月),Mehrabi Ninareh、Fred Morstatter、Nripsuta Saxena、Kristina Lerman 和 Aram Galstyan.(2021 年)。
arxiv.org/pdf/1908.09635.pdf
-
FAT Forensics: 一个用于算法公平性、问责制和透明度的 Python 工具箱,Sokol, K., Santos-Rodríguez, R., & Flach, P.A.(2019)。
arxiv.org/pdf/1909.05167.pdf
-
Minimax 帕累托公平性:一种多目标视角,Martinez Natalia, Martin Bertran, Guillermo Sapiro,
proceedings.mlr.press/v119/martinez20a/martinez20a.pdf
第八章:模型优化中的公平性
机器学习(ML)在近年来取得了巨大的进步,应用范围从金融到医疗保健。然而,这些系统往往不透明,并且可能对某些群体存在偏见。为了让 ML 发挥其潜力,我们必须确保它是公平且无偏的。
在第七章中,我们讨论了数据生成中的公平性概念。在本章中,我们将介绍优化约束和技术,这些对于优化和获取公平的机器学习(ML)模型至关重要。本章的重点是让你了解由研究揭示的新型自定义优化器,这些优化器可用于构建公平的监督式、无监督式和半监督式 ML 模型。从更广泛的角度来看,你将学习创建和定义模型约束的基础步骤,这些约束可以在训练过程中被不同的优化器使用。你还将了解如何使用适当的指标评估这些基于约束的模型,以及使用优化技术时所带来的额外训练开销,这将帮助你设计自己的算法。
本章将涵盖以下主题:
-
机器学习中公平性概念的应用
-
公平性问题的显性与隐性缓解
-
分类任务的公平性约束
-
回归任务的公平性约束
-
聚类任务的公平性约束
-
强化学习中的公平性约束
-
推荐任务的公平性约束
-
公平性挑战
技术要求
本章要求你具备 Python 3.8 及以下一些 Python 库:
-
TensorFlow 2.7.0
-
NumPy
-
Matplotlib
机器学习中的公平性概念
公平性是一个主观的术语。根据文化、时间、种族等不同,公平的含义各不相同。我们可以不厌其烦地讨论社会中的公平话题;然而,在本章中,我们关注的是与机器学习相关的公平性。在第七章中,你已经熟悉了公平性的概念,以及数据在你 ML 模型的公平性中所扮演的重要角色。在本章中,我们将进一步扩展公平性的概念。
正如你可能已经意识到的那样,公平性并没有统一的定义。例如,从组织的角度来看,公平可以有三个不同的维度(Cropanzano 等,2001 年,见进一步阅读):
-
分配公平性:算法在分配重要资源时应当公平,例如在招聘中。
-
互动公平性:算法应该能够解释其背后的原理,且算法提供的解释应该被相关人员认为是公平的,例如,为什么 A 应该比 B 获得晋升。
-
程序公平性:算法在组织内对不同子群体的使用不应产生不同的结果,例如,女性和男性的推荐结果不应不同。如果有不同,应该是因为可以解释的社会或生物学原因。
这些内容在图 8.1中有所展示。
图 8.1 – 组织中公平性的不同维度
偏见和公平性是机器学习领域常常交替使用的两个术语。然而,我们认为它们应当加以区分。借鉴 Booth 的观点(dl.acm.org/doi/fullHtml/10.1145/3462244.3479897
),我们将偏见定义为一种系统性错误,它基于特定的输入信息(如性别和地理位置)改变模型的决策。通常被称为测量偏见,这种偏见的产生要么是因为向输入特征空间添加了不必要的信息(构建污染),要么是因为模型没有捕捉到你正在测量的所有方面(构建缺失)。这里的构建是指那些不能直接测量的特征,而需要通过测量来推断。图 8.2展示了偏见的不同来源。
图 8.2 – 测量来源(改编自 Booth 等,2021)
一个有偏的模型不一定是坏事——模型可能是有偏的,但仍然是公平的(图 8.3)。正如 Pessach 等人在《算法公平性》一文中所阐述的那样,一个模型可以同时考虑 SAT 成绩和人口统计信息来进行录取选择,并根据学生是否来自特权背景或非特权背景不平等地分配名额,倾向于那些来自贫困背景的学生。虽然这样的模型是有偏的,但它是公平的,因为来自贫困背景的学生为了取得该成绩必须克服更多挑战,并且可能具有更高的潜力。
图 8.3 – 基于候选人的人口统计信息等进行的资源分配偏见可以通过为社会中代表性不足的群体提供工具来实现公平的算法
现在我们已经划定了公平性和偏见之间的界限,接下来我们将探讨不公平性及其缓解方法。
不公平性缓解方法
近年来,研究人员开发了各种技术来缓解 AI 模型中的不公平性。这些方法可以应用于模型开发的不同阶段:
-
预处理:预处理方法通过调整训练数据的分布,使敏感群体平衡。
-
后处理:后处理方法通过在模型训练完成后对预测结果进行校准来工作。
-
处理中:这些方法将公平性直接纳入模型设计中。
在第七章中,我们讨论了预处理方法和技术。在本章中,我们将首先讨论处理中不公平性缓解方法,随后讨论应用于不同机器学习任务的各种公平性约束。
处理中方法
使用处理中方法具有一定的优势:
-
已经观察到,机器学习模型通常会放大数据中存在的偏见。使用处理中技术来缓解不公平性可以帮助解决这个问题。因为放大的问题是由算法引起的,而处理中方法在模型优化的同时考虑了公平性,可以帮助减少或消除这个问题。
-
微调预训练模型已成为根据有限的训练数据定制不同任务建模的流行方法。尽管从预训练模型中进行迁移学习缓解了对大量训练数据的需求,但由于预训练模型通常是在有偏数据上训练的,预训练模型中的偏见问题变得更加关键。通过使用对比学习等技术,可以利用处理中方法来缓解预训练模型中的不公平性。
开发高效的处理中方法仍然是一个挑战。现有的算法不足,我们需要专注于开发新的方法,以解决当敏感属性未披露或不可用时的公平性问题。
处理中不公平性缓解方法可以进一步细分为两类:隐式方法和显式方法。在显式方法中,通过在目标函数中引入公平性度量,使用公平性约束或正则化参数来实现不公平性缓解。另一方面,隐式方法依赖于修改深度学习模型的学习策略——例如,在训练过程中加入对抗样本。显式方法易于实现,且通常具有灵活性。现在让我们探索如何通过显式方法来缓解不公平性。
注意
在第七章中,我们讨论了许多公平性衡量指标。在本章中,我们将称一个算法为公平的,如果它能够在其设计的公平性指标上取得良好的结果。
在本章的其余部分,我们将讨论各种不公平性缓解的技术。具体来说,我们将处理两个特定的公平性问题:
- 不同的待遇:不同的待遇是指基于个人的种族、性别或其他受保护特征而对其进行不同对待的情况。例如,如果一个算法在主要是男性的数据上进行训练,它可能会为男性候选人预测更高的薪资增长,而为女性候选人预测较低的薪资增长,尽管他们拥有相同的工作经验年数。通常,不同的待遇源于偏见数据,或在训练模型时使用敏感信息。
图 8.4 – Google 翻译算法的不公平待遇示例(摘自 Fitria,2021)
- 不同的影响:不同的影响是指模型在处理某些群体时存在差异,即使模型没有明确地在对应的敏感属性上进行训练。例如,如果一个算法在主要是男性的数据上进行训练,它可能会学会将男性名字与高职位关联,将女性名字与低职位关联。这种情况可能在模型无意中创建了一些与敏感信息相关的代理属性时发生。
显式不公平性缓解
如前一节所讨论的,通过在损失函数中添加正则化项或包括约束来显式地减轻不公平性。在本节中,我们将扩展关于显式不公平性缓解技术的内容,并探讨一些最近提出的策略。
分类任务的公平性约束
首先,让我们了解一下机器学习中的分类任务。假设Y、X和S是随机变量,分别对应类别/标签、非敏感输入特征和敏感输入特征。我们的训练数据集 D 将由这些随机变量的实例组成:
D = { (y, x, s) }
分类任务的目标是找到一个由参数Θ定义的模型 M,使其能够在给定敏感和非敏感特征的情况下正确预测类别的条件概率 M[Y|X,S; Θ]。模型参数通过使用最大似然估计(MLE)来估计:
让我们看看如何修改这个损失函数以减轻不公平性。
添加偏见移除正则化器
Kamishima 等人提出的论文《公平意识分类器与偏见移除正则化器》引入了一个偏见移除正则化项到损失函数中,如下图所示:
图 8.5 – 向损失函数中添加偏见移除正则化项
为了衡量模型的公平性,util
模块包含了CVS
函数来计算得分。为了有一个对比点,首先构建一个简单的分类器是很有益的:
-
首先,我们创建一个函数来创建一个简单的四层神经网络分类器。在每一层之间,我们添加了丢弃层进行正则化,以避免过拟合:
def Classifier(n_features, n_hidden=32, p_dropout=0.2,train=True): with nn.parameter_scope('classifier'): layer1 = PF.affine(n_features, n_hidden, name='layer1') layer1 = F.relu(layer1) if (train): layer1 = F.dropout(layer1,p_dropout) layer2 = PF.affine(layer1, n_hidden, name='layer2') layer2 = F.relu(layer2) if (train): layer2 = F.dropout(layer2,p_dropout) layer3 = PF.affine(layer2, n_hidden, name='layer3') layer3 = F.relu(layer3) if (train): layer3 = F.dropout(layer3,p_dropout) layer4 = PF.affine(layer3, 1, name='layer4') return layer4
上述代码利用了 NNabla(以nn
导入)库来构建网络。
-
现在,如果我们使用之前的函数创建一个简单的分类器,并在
Adult
数据集上进行训练(archive.ics.uci.edu/ml/datasets/Adult
),结果将显示准确率和 CV2NB 得分:Classifier accuracy : 84.85797101449275 Classifier CV2NB Score : 0.1644
-
但是现在,如果你包含偏见移除正则化项并使用修改后的损失函数重新训练相同的分类器,你会发现 CV2NB 得分有所提高:
图 8.6 – 在成人数据集上添加偏见移除正则化项到损失函数后,准确率与 CV2NB 得分的对比
在上图中,我们可以看到,随着η(公平性参数)的增加,CV2NB 得分也有所提高。更大的公平性参数值会增强公平性。然而,我们可以看到,增加公平性的代价是准确性;二者之间必须找到一个平衡点。并且,你可以看到,带有偏见移除正则化项的分类器的 CV2NB 得分为 0.16,相比于没有使用偏见移除正则化项的分类器(图 8.6),得分更高,从而证明了添加正则化项可以创建一个更公平的模型。
修改目标
这方面的很多工作是由 M. B. Zafar 完成的。那些对他完整的工作感兴趣的人可以参考他的 GitHub 仓库:github.com/mbilalzafar/fair-classification
。我们将考虑两种不同的分类器:支持向量机和逻辑回归。这两种分类器的共同点在于,它们都基于寻找一个决策边界来分隔类别。在支持向量机中,决策边界是通过最大化最小支持向量之间的距离来找到的,而在逻辑回归中,决策边界是通过最小化对数损失函数来找到的。
为了简单起见,我们考虑二元分类器的情况。对于线性二元分类器,决策边界定义如下:
ΘTX = 0
这里,Θ指的是定义决策边界的超平面系数。
为了使其生效,针对不公平对待的公平性是通过确保敏感属性(S)不参与决策/预测来保证的。按照我们的做法,这意味着 S ∩ X = ∅;也就是说,它们是互不相交的。
对于差异影响,使用 80%规则(更一般地称为 p 规则)作为公平性指标。将 80%规则转换为距离边界,它意味着如果 dθ(x)是特征向量x到决策边界的有符号(或定向)距离,则具有特定敏感特征的用户与没有该敏感特征的用户在正有符号距离上的比率不低于 80:100。数学上,对于一个二元敏感属性,s ∈ {0,1},我们可以将 p 规则表示如下:
为了缓解不公平,Zafar 等人引入了决策边界协方差的概念。他们将其定义为用户的敏感特征与用户输入特征到决策边界的有符号距离之间的协方差。数学上,它可以表示为:
简化后,这个表达式被缩减为以下形式:
因为这是一个凸函数,所以很容易将其纳入分类器目标中。让我们来实践一下。我们创建了一个具有两个敏感特征和一个非敏感特征的合成数据集。以下图表显示了生成的数据点。
图 8.7 – 使用两个敏感特征和一个非敏感特征生成的合成数据(仅显示 200 个样本点)
我们生成的数据的详细信息如下:
Total data points: 4000
# non-protected examples: 1873
# protected examples: 2127
Non-protected in positive class: 1323 (71%)
Protected in positive class: 677 (32%)
如果我们不使用任何公平性约束,训练一个简单的分类器,那么得到的准确度是 87%,但该分类器仅遵循 41%的 p 规则,而不是期望的 80%。现在,我们可以采取两种策略:
- 在公平性约束下最大化准确度:在这种情况下,约束条件设置为使 p 规则得到满足,同时最大化分类器的准确度。通过以下方式实现:
在满足和
的条件下最小化 L(D,Θ)
这里,c表示协方差阈值。它指定了敏感特征与输入特征到决策边界的有符号距离之间的协方差的上限。协方差阈值提供了准确度与公平性之间的权衡。
当c减小(c → 0)时,分类器在牺牲准确度的情况下变得更加公平。以下是使用公平性约束训练的分类器的结果。
图 8.8 – 在合成数据上训练的无约束和有约束的逻辑回归分类器的决策边界
你可以看到分类器的准确率略微下降(71%),但 p-rule 值是 104%——这意味着分类器是公平的。正类中的受保护与非受保护比例是 53:51。图表还展示了原始分类器和受限分类器的决策边界。
- 在准确性约束下最大化公平性:在这种情况下,我们最小化协方差决策边界,前提是受限分类器的损失(L(D,Θ))小于无约束分类器的损失(L(D,Θ*))——换句话说,以下是:
最小化 约束条件为
。
这里,Li 表示训练集中第i个用户的损失。下图展示了使用这些约束所获得的结果。
图 8.9 – 在合成数据上训练的无约束与有约束的逻辑回归分类器的决策边界
我们可以看到,现在 p-rule 从 41%提高到了 61%,而准确率的下降并不显著。对于企业来说,这一点很重要。你不能推出一个公平但不准确的产品。
上述图表是使用 Kamishima 小组提供的代码生成的,使用了以下参数:
n_samples = 2000 # Number of data points
disc_factor = math.pi / 4.0 # represents f in the paper-- decrease it to generate more discrimination
gamma = 2000.0
这种方法有助于缓解分类任务中的不公平影响。该方法可以扩展到许多分类任务中。
回归任务的公平性约束
在回归中,任务的变化是从找到决策边界变为找到一个包含大多数数据点的超平面。当决策空间较小且离散时,分类器表现良好,但更常见的是决策空间是连续的。例如,与其判断一个人是否会违约(一个二元问题),更有意义的是让决策者知道一个人违约的概率(一个介于 0 和 1 之间的连续值)。在这些场景中,回归是更好的选择。主要的区别是,在分类的情况下使用的是对数损失函数,而在回归中,传统的损失函数是均方误差(MSE)。这意味着我们可以像分类器一样添加正则化项,从而得到一个公平的回归。实际上,Berk 等人曾尝试过这种方法,并提出了一个适用于回归和分类任务的公平性通用框架:
这里,L是常规的损失函数(对于分类器,常规损失是对数损失,对于回归,我们通常使用均方误差(MSE)损失)。他们添加了一个λ加权的公平性损失项 fp。为了防止过拟合,还有标准的 L2 正则化项。这种方法可以应用于任何具有凸优化函数的模型。
使用这种方法,他们能够实现个体和群体的公平性。让我们看看具体是如何做到的。
使用公平性惩罚项的个体公平性
继续我们之前的术语,让s是一个二元敏感特征,s ∈ {0,1}。它告诉我们用户是否属于敏感群体。因此,对于个体公平性,惩罚项定义如下:
这里,d是一个非负函数,表示敏感和非敏感群体之间输出的绝对差异(|yi – yj|),n1 是属于敏感群体的个体数,n2 是不属于敏感群体的个体数。
我们可以看到,每当模型将敏感和非敏感输入区分对待时,都会受到惩罚。
使用公平性惩罚项的群体公平性
现在,对于群体公平性,我们希望两个群体样本的预测平均相似。这通过以下公平性惩罚项定义:
现在,为了验证这种方法是否真的适用于回归案例,我们使用 UCI ML 存储库提供的社区与犯罪数据集(archive.ics.uci.edu/ml
)。数据集包含与美国不同社区的人均暴力犯罪率相关的特征。这里的敏感特征是个体的种族,任务是预测犯罪率。
图 8**.10显示了数据集的公平损失与 MSE 损失。这里,单一指的是只为两个敏感群体建立一个模型的情况,而分开则是指我们有单独的模型。
图 8.10 – 社区与犯罪数据集的 MSE 损失与公平性
我们可以再次看到,在精度方面追求公平性是有代价的。因此,在定义关心的公平类型时,建模者必须谨慎,特定于其应用程序作出决策,并在预测精度与公平性之间找到适当的平衡。
聚类任务的公平性约束
聚类任务涉及将给定的数据点分组成簇。虽然有监督聚类算法,但无监督聚类更为常见。在这里,提供数据点 X = {xp ∈ RM,p = 1, … , N},任务是将它们分配到K个簇中。设M为簇分配向量:M = [m1, … , mN ] ∈ [0,1]NK。现在,假设数据包含敏感信息,例如,不同人口统计学群体的J。我们可以将敏感信息表示为向量,Sj = [sj, p] ∈ {0,1}N,因此如果点p分配给群体j,则 sj, p = 1;否则为 0。
K-means 是最广泛使用的聚类算法之一,它通过最小化各个数据点与代表性聚类中心之间的距离之和,将给定数据点聚类为 K 个簇。我们可以加入公平性惩罚。在论文《变分公平聚类》中,作者将所需人口比例和簇 m 内人口的边际概率(Pm=[P(j|m)]) 之间的 Kullback-Leibler 散度项加入到了目标函数中。在簇分配向量和人口信息向量的层面上,边际概率可以表示如下:
这里的 T 表示数学中的转置运算符。修改后的目标函数如下图所示:
图 8.11 – 带有公平性惩罚的聚类任务损失函数
有趣的是,公平性惩罚通过所需人口比例 U 和相应边际概率 Pk 之间的交叉熵项表示。这个惩罚项可以进一步分解为两个部分,一个是凸的,另一个是凹的。鼓励你阅读原论文以获取完整的数学证明,包括界限、收敛性和单调性保证(arxiv.org/abs/1906.08207
)。
表 8.1 列出了在不同数据集上应用这些公平性约束的结果。合成数据集是根据人口统计分布创建的;两个数据集都包含 450 个数据点和两个人口群体。在合成数据集中,两个群体的所需比例相等;然而,在合成不均衡数据集中,我们为两个群体分别创建了 310 和 140 个数据点:
数据集 | 聚类能量 | 公平性误差 | 平均平衡 |
---|---|---|---|
合成不均衡(样本数量 = 450,J = 2,l = 10) | 159.75 | 0.00 | 0.33 |
合成数据集(样本数量 = 450,J = 2,l = 10) | 207.80 | 3.69 | 0.01 |
成人(样本数量 = 32,561,J = 2,l = 10) | 9,507 | 0.27 | 0.48 |
银行(样本数量 = 41,108,J = 3,l = 10) | 8,443.88 | 0.69 | 0.15 |
Census II(样本数量 = 2,458,285,J = 2,l = 10) | 922,558.03 | 26.22 | 0.44 |
表 8.1 – 使用带有公平性惩罚的 K-means 聚类在不同数据集上列出聚类目标、公平性误差和平均平衡的表格
图 8.12 显示了在合成数据集和合成不均衡数据集上应用带有公平性惩罚的 K-means 聚类所获得的聚类结果。
图 8.12 – 使用带有公平性惩罚的 K-means 聚类在两个数据集上的聚类结果
相同的方法也可以应用于 K-median 聚类算法和 Ncut 聚类算法。
强化学习任务的公平性约束
强化学习与用于回归和分类任务的监督学习、以及用于聚类任务的无监督学习有很大的不同。它的不同之处在于,算法在这里并不知道期望的输出。它所做的每一个选择不仅影响当前学习,还会影响未来的结果。在强化学习中,算法从环境中获得反馈;正是这种反馈帮助它进行学习。
为了定义强化学习任务,我们可以说系统由代理(强化学习代理或算法)和环境组成。代理可以通过状态向量s
感知环境,可以通过动作a
对环境进行改变,环境可能通过奖励r
反馈给代理(图 8.13)。代理的目标是找到一个最优策略π(s,a),以最大化奖励。
图 8.13 – 强化学习框架
我们可以将一个简单的强化学习问题表示为一个多臂老丨虎丨机问题。这个问题假设一个赌徒在一排老丨虎丨机中进行赌博。他们需要决定每次玩哪个老丨虎丨机臂,以最大化他们的奖励。我们可以定义该问题有N个老丨虎丨机,赌徒的任务是在每个时间步t选择一个老丨虎丨机臂:
在每个时间步t,赌徒会收到一个奖励,rt ∈ [0, 1]N,这个奖励由一个固定的分布决定,E[rt(it)] = μ(it)。然而,赌徒并不知道这个分布。它们唯一能观察到的是奖励 rt(it)。赌徒的目标是选择一个臂的顺序,以最大化总奖励:
最优老丨虎丨机臂的最佳奖励概率如下:
其中,
为了训练我们的代理扮演赌徒的角色,我们可以将我们的损失函数定义为一个遗憾函数——表示代理在时间步t未选择最优老丨虎丨机臂所带来的遗憾:
我们可以将多臂问题看作一个资源分配问题——有限的资源应该被分配以获得最大性能。当强化学习代理开始时,它不知道哪种动作会产生好的奖励,因此大多数强化学习代理使用一种叫做探索与利用的技术。其思想是,代理最初通过选择随机动作来探索所有可能的动作,从中学习(探索),然后当足够的经验积累后,使用由学到的策略指导的动作(利用)。用来实现探索/利用的算法之一是ε贪心算法(Mnih,2015)。
探索与利用之间总是存在权衡。在ɛ贪婪算法中,通过减小探索参数ɛ来实现探索与利用之间的平衡。另一种实现探索与利用平衡的方法是使用上置信界限(UCB)。UCB 算法通过维护每个动作的预期奖励估计来工作。在每个步骤中,算法选择具有最高预期奖励的动作。然而,UCB 算法还在每个估计中添加了一项鼓励探索的项。这个项基于估计的不确定性,并且随着某个动作被执行的次数减少而增加。因此,UCB 算法在探索与利用之间达到了平衡,并且在在线环境中通常表现优于其他算法。
在本节中,我们将应用公平性约束来解决基于多臂赌博机的资源分配问题。目的是将公平性概念引入资源分配中。如今,基于 AI 的程序在分配资源(如医疗、贷款和补贴)时做出决策。我们能否确保这一分配过程的公平性?另外,分配过程中的公平性是否对合作产生影响?
解决这个问题的一种方法是由 Claure 等人在论文《带有公平性约束的多臂赌博机,用于向人类队友分配资源》中提出的。他们对个体分配资源的次数设置了公平使用约束限制,确保所有用户都能获得所需资源。他们修改了无约束的 UCB 算法,通过使用其过去的经验奖励均值以及每次被抽取的频率来估计每个臂的预期奖励。
为了评估他们的方法,他们考虑了一个协作俄罗斯方块游戏的环境,将两人小组配对,并要求他们使用该算法共同完成一局俄罗斯方块游戏。算法会在每个时间步骤决定由哪一位玩家控制下落的方块。然后,他们询问参与者是否觉得算法给他们分配轮次是公平的:即他们对游戏公平性的感知。
下表展示了不同约束限制下,参与者的感知:
约束限制 | 参与者的感知 |
---|---|
25%, 33% | “我感觉更有能力的玩家被分配了更多的轮次,这很有道理,但也是我觉得不公平的原因。” |
50% | “我认为这场比赛是公平的,它让我们轮流进行,每次都让我觉得自己在为比赛做出同等的贡献。” |
表 8.1 – 参与者在实验中对于不同约束限制的感知
他们的研究表明,使用他们变种的算法,资源可以公平地分配。这增加了个体之间的信任,而不会降低表现。
推荐系统的公平性约束
推荐系统用于为产品、服务、潜在朋友或内容提供建议。它们依赖于反馈数据,并通常通过机器学习算法运行。例如,一个在线书店可能使用推荐系统根据类别对书籍进行分类,并向购买过某本书的顾客推荐类似的书籍。Facebook 使用推荐系统向用户推荐潜在的朋友。YouTube 使用推荐系统向观看某个视频的用户推荐相关视频。一般来说,推荐系统用于解决冷启动问题,即在数据不足的情况下很难为新用户或新物品提供推荐。
推荐系统根据其所依赖的信息类型分为三类:协同过滤、基于内容的过滤和混合过滤。协同过滤推荐系统依赖于社区的集体智慧来进行推荐。基于内容的推荐系统使用关于物品本身的信息来进行推荐。混合推荐系统结合了协同过滤和基于内容的两种方法进行推荐。这些方法各有优缺点,适合特定应用的最佳推荐系统将取决于具体需求。
近年来,推荐系统在我们生活的许多方面变得越来越普及。从在线购物到社交媒体,这些系统在帮助我们找到所需的产品、服务和内容方面发挥着关键作用。然而,这些系统并不完美。特别是,它们常常会受到各种偏见的影响,导致不公平的推荐。例如,一个推荐系统可能会无意中偏向某些用户群体。这可能导致一些用户得到无法使用的推荐,甚至可能导致歧视性行为。因此,解决推荐系统中的不公平问题至关重要。幸运的是,近年来这一领域已经取得了进展,现在已经有许多方法可以帮助减轻这一问题。随着持续的研究,推荐系统有望变得更加公平和包容,适用于所有用户。
推荐系统是一个多方平台,涉及三个利益相关方:消费者、供应商和平台:
-
消费者是平台的用户。他们来寻求建议。因为他们可能在寻找某些东西,或在做决定时遇到困难,比如在购买什么时。消费者预期平台能够提供公平和客观的建议。
-
供应商或提供者位于推荐系统的另一端。他们提供服务,并从消费者那里获得一定的收益。
-
最后,是平台本身。它将消费者和供应商连接起来,并从中获益。
因此,当我们谈论推荐系统中的公平性时,我们也需要明确我们讨论的是哪种类型的公平性。通常,我们讨论两种类型的公平性,即提供者公平性和消费者公平性:
-
提供者公平性 关注的是被排名或推荐的项目。在这里,公平性的概念是相似的项目或项目组应该以相似的方式被排名或推荐。例如,考虑两篇关于相同主题的文章。如果其中一篇因为拥有更多的浏览量而被排名更高,这就是不公平的,因为它赋予了流行度更多的权重,而不是质量。为了解决这个问题,算法可以考虑其他因素,如时效性、分享次数和点赞数,以更准确地评估质量。通过考虑这些因素,算法对两篇文章都会更加公平。
-
消费者公平性 关注的是接收或使用数据或服务的用户。在这种情况下,一个公平的推荐算法应该确保用户或用户群体接收到相同的推荐或排名。继续以推荐系统推荐文章为例,如果两个读者拥有相同的教育背景和兴趣,算法应该向他们推荐相同或相似的文章,而不考虑性别或年龄等敏感属性。
实现推荐系统公平性的一种方法是将其视为分类算法,其中 推荐 是一个类别。另一种方法是将推荐系统视为排序问题;在这里,推荐是一个有序列表 L。我们已经讨论了如何在分类任务中添加公平性约束。在本节中,我们将讨论基于 Celis 等人论文 Ranking with Fairness Constraints 中提出的方法,如何在排序中添加公平性约束。基本思路是对不同组的项目在前 k 个位置出现的数量施加约束。
让我们从定义排序问题开始。我们有 m 个项目,目标是输出一个 n 个项目的列表(n ≪ m),该列表对消费者或提供者最有价值。我们定义一个数字 Wij,它表示如果第 i 个项目(i ∈ [m])排在第 j 位时所贡献的价值。获取 Wij 的方法不止一种。我们可以将其定义为一个 排序最大化问题。在这里,任务是为每个项目分配一个位置,以最大化总价值。
为了确保公平性,Celis 等人添加了约束条件,限制了具有属性 l 的对象在排名前 k 位中出现的数量,这些约束以上界 (Ul,k) 和下界 (Ll,k) 的形式存在。我们可以通过二进制矩阵 x 来表示项目的位置,x 是一个 n x m 的矩阵。这个二进制矩阵的 xij 元素告诉我们,第 i 个项目是否排在第 j 位。约束条件被施加在矩阵上:
在这里,{1, 2, ... , p} 是属性的集合,Pl ⊑ [m] 表示具有属性 l 的项的集合。通过这一变化,排名最大化将变为以下形式:
以下图示说明了这一点:
图 8.14 – W 的样本矩阵。数值表示最佳无约束排名(灰色)和有约束排名(橙色)。在前六个位置的男性数量上有一个上限约束为 2(图像改编自论文《排名与推荐中的公平性:概述》)
决策中的公平性是一个我们才刚刚开始理解的重要问题。例如,当有很多求职者或贷款申请者时,如果每个人看起来都同样合适,决定谁应该获得职位、贷款或其他决策就变得非常困难,甚至是不可能的。然而,根据种族等因素,某些候选人可能比其他人更值得考虑,这可能会造成社会上的不利影响,即便当事人并未意识到这一点。
公平性的挑战
各种机器学习公平性方法的开发引起了研究界越来越多的关注,我们也取得了显著进展。然而,仍然存在一些需要进一步研究的挑战。在这一部分中,我们简要讨论了构建公平模型时存在的不同挑战。
缺失的敏感属性
即使很少或者没有已知的敏感属性,机器学习模型中的公平性问题依然是一个挑战。实现公平性通常意味着确保生成的模型不会对任何特定群体存在偏见。当训练数据不包含个体敏感属性信息时,这一点尤其难以实现。目前大多数现有方法假设敏感属性是显式已知的。然而,随着隐私问题的日益关注,以及如 GDPR 等法规的出台,企业需要保护敏感数据。
多个敏感属性
本章中介绍的技术仅适用于一个敏感属性。然而,数据中可能存在多个敏感属性,例如性别和种族。当数据中存在多个敏感属性时,一个对某个敏感属性做出公平预测的模型,可能会对其他敏感属性做出不公平的预测。一个训练为性别公平的模型,仍然可能对种族不公平。多属性公平性目前是一个相对较少研究的问题,未来应当进一步探索。
公平性度量的选择
我们在本章中已经看到,缓解算法不公平性的不同技术设计取决于所期望的公平性度量。选择正确的公平性度量标准至关重要,并且这取决于具体考虑的情境。
个人公平性与群体公平性的权衡
群体公平性关注确保受保护群体(如女性)在机器学习模型的结果中得到公平表现。个体公平性则关注确保具有相似敏感属性(如种族或性别)的个体在模型中获得类似对待。群体公平性和个体公平性有不同的目标。现有的不公平性缓解算法通常只关注其中一个目标。因此,一个为了个体公平性优化的模型可能对群体不公平,反之亦然。然而,也可能存在两种公平性都希望实现的情况。
解释与公平性
通过利用可解释的机器学习技术,我们可以更好地理解我们的模型并进行调试。这可以作为识别和消除偏见并实现公平性的工具。例如,在情感分析任务中,我们可以通过分析每个群体的最重要特征,利用模型解释技术来检测种族偏见。
公平性与模型性能
公平性约束通常限制机器学习模型的决策空间,从而在公平性和模型性能之间产生权衡。需要对公平性约束和模型性能之间的关系进行系统的理论研究。
有限的数据集
用于研究公平性的数据集非常有限。下表列出了可用于基准测试公平性缓解算法的一些数据集:
数据集 | 描述 | 大小 | 领域 |
---|---|---|---|
德国信用卡数据集 | 包含个人状态、性别、信用评分和住房状况等属性。可用于研究与性别和信用相关的公平性问题。 | 1,000 | 金融 |
UCI 成人数据集 | 该数据集包含年龄、职业、教育、种族、性别、婚姻状况以及个人年收入是否超过 50K 美元等属性。 | 48,842 | 社会 |
面部多样性数据集 | 这是一个大型注释面部图像数据集。除了图像外,它还包含有关肤色、性别和面部对称性的信息。 | 100 万 | 面部图像 |
COMPAS 数据集 | 该数据集包含来自布劳沃德县被告的记录,包括他们的监禁时间和人口统计信息。 | 18,610 | 社会 |
社区和犯罪数据集 | 该数据来自美国各社区,来源于美国 LEMAS 调查和 FBI 统一犯罪报告。 | 1,994 | 社会 |
议会代表基准数据集 | 该数据包含来自三个欧洲国家(冰岛、瑞典、芬兰)和三个非洲国家(南非、塞内加尔、卢旺达)国家议会成员的数据。 | 1,270 | 面部图像 |
WinoBias 数据集 | 一个用于评估共指解析系统的文本集合,包含关于 40 个职业的句子,每个职业使用不同的人称代词描述多次,旨在揭示和解决性别偏见。 | 3,160 | 共指解析 |
青少年司法系统再犯数据集 | 该数据集包含 2002 至 2010 年间,在加泰罗尼亚青少年司法系统中犯下罪行的青少年罪犯的数据。 | 4,753 | 社会 |
表 8.2 – 用于公平性基准测试的有用数据集表
这些是研究算法公平性时广泛使用的数据集。
总结
本章讨论了应用于不同机器学习任务的公平性约束。我们从分类任务开始,讨论了如何在损失函数中添加正则化项以减少不公平性。本章还讨论了如何修改损失函数(目标函数)以缓解不公平性。随后,我们讨论了回归任务,同样,我们展示了如何通过添加正则化项来确保算法公平。我们讨论了个体公平性和群体公平性的惩罚项。接着,我们探讨了可以添加到聚类任务中的公平性项。我们还讨论了强化学习,并展示了如何将公平性约束添加到遗憾函数中。接下来是推荐任务,我们展示了如何通过上下界形式的公平性约束来缓解不公平性。我们还讨论了推荐任务与其他任务的异同。最后,我们讨论了公平性面临的挑战。我们看到,在这一领域仍有很多工作要做。目前,大多数公平性算法仍处于初始阶段。我们需要在现有的深度学习和机器学习框架中采纳公平性策略,以便广泛应用。在下一章中,我们将讨论人工智能中的可解释性。
进一步阅读
-
组织公平性的三条道路, Cropanzano, R., Rupp, D. E., Mohler, C. J., 和 Schminke, M. (2001)。(
www.emerald.com/insight/content/doi/10.1016/S0742-7301(01)20001-2/full/html
) -
多模态机器学习中的偏见与公平性:自动化视频面试的案例研究, Booth, B. M., Hickman, L., Subburaj, S. K., Tay, L., Woo, S. E., 和 D’Mello, S. K. (2021 年 10 月)。收录于 2021 年国际多模态交互会议论文集 (第 268-277 页) (
dl.acm.org/doi/fullHtml/10.1145/3462244.3479897
) -
算法公平性。arXiv 预印本 arXiv:2001.09784,Pessach, D. 和 Shmueli, E. (2020)。(
arxiv.org/pdf/2001.09784.pdf
) -
使用谷歌翻译中的性别偏见:问题与解决方案。语言圈:语言与文学期刊,15(2),Fitria, T. N. (2021)。(
journal.unnes.ac.id/nju/index.php/LC/article/download/28641/11534
) -
机器学习:一种概率视角。MIT 出版社,Murphy, K. P. (2012)。(
storage.googleapis.com/pub-tools-public-publication-data/pdf/38136.pdf
) -
具有偏见移除正则化器的公平感知分类器。收录于欧洲联合机器学习与数据库知识发现大会(第 35-50 页),Springer,Berlin,Heidelberg。Kamishima, T., Akaho, S., Asoh, H., 和 Sakuma, J.(2012 年 9 月)。(
link.springer.com/content/pdf/10.1007/978-3-642-33486-3_3.pdf
) -
三种朴素贝叶斯方法用于无歧视分类。收录于数据挖掘与知识发现,21(2),第 277-292 页,Calders, T. 和 Verwer, S.(2010 年)。(
link.springer.com/content/pdf/10.1007/s10618-010-0190-x.pdf
) -
公平约束:公平分类机制。收录于人工智能与统计(第 962-970 页),PMLR,Zafar, M. B., Valera, I., Rogriguez, M. G., 和 Gummadi, K. P.(2017 年 4 月)。(
proceedings.mlr.press/v54/zafar17a/zafar17a.pdf
) -
公平回归的凸框架,Berk, R., Heidari, H., Jabbari, S., Joseph, M., Kearns, M., Morgenstern, J., ... 和 Roth, A.(2017 年)。arXiv 预印本 arXiv:1706.02409。(
arxiv.org/pdf/1706.02409
) -
UCI 机器学习库,2013,Lichman, M. URL:
archive.ics.uci.edu/ml
-
通过深度强化学习实现人类级控制。《自然》,518(7540),第 529-533 页,Mnih, V., Kavukcuoglu, K., Silver, D., Rusu, A. A., Veness, J., Bellemare, M. G., ... 和 Hassabis, D.(2015 年)。(
www.nature.com/articles/nature14236?wm=book_wap_0005
) -
排名与推荐中的公平性:概述。VLDB 期刊,第 1-28 页,Pitoura, E., Stefanidis, K., 和 Koutrika, G.(2021 年)。(
link.springer.com/article/10.1007/s00778-021-00697-y
) -
带有公平性约束的排名。arXiv 预印本 arXiv:1704.06840,Celis, L. E., Straszak, D., 和 Vishnoi, N. K.(2017 年)。(
arxiv.org/pdf/1704.06840.pdf
)
第九章:模型可解释性
“如果你不能简单地解释它,那说明你还没有完全理解它。”
– 阿尔伯特·爱因斯坦
模型可解释性是机器学习(ML)和人工智能(AI)领域的重要话题。它指的是理解和解释模型如何做出预测和决策的能力。可解释性很重要,因为它使我们能够识别模型中的潜在偏见或错误,并能提高 AI 模型的性能和可信度。
在本章中,我们将探索不同的解释和理解机器学习模型的方法和技术。我们还将探讨模型可解释性面临的挑战和局限性,并考虑改善机器学习算法可解释性的潜在解决方案。
在本章中,我们将涵盖以下主题:
-
可解释 AI 简介
-
像我五岁一样解释 (ELI5)
-
本地可解释的模型无关 解释 (LIME)
-
使用 XAI 技术理解客户流失建模
-
CausalNex
-
用于因果推理的 DoWhy
-
AI 可解释性 360 用于解释模型
技术要求
本章要求你安装 Python 3.8,并使用以下 Python 包:
-
NumPy
-
Matplotlib
-
Scikit-learn
-
pandas
-
按照以下方式安装 ELI5:
pip install eli5
-
安装 LIME,请使用以下命令:
pip install lime
-
可以使用以下命令安装 SHAP:
pip install shap
-
使用以下命令安装 DoWhy:
pip install dowhy
-
AI 可解释性 360
可解释 AI 简介
考虑一个预测患者是否可能患某种终末期疾病的模型,一个帮助决策是否认定被告有罪的模型,以及一个帮助银行决定是否给某人贷款的模型。这些模型所做出的决策可能会对多个人的生活产生深远的连锁反应(与 Netflix 推荐电影的模型不同)。因此,拥有决策模型的机构必须能够解释其预测和决策背后的理由。模型可解释性或可解释 AI(XAI)旨在开发能够帮助我们理解和解释模型预测和决策背后原因的算法和技术。正如我们在前面的例子中看到的,XAI 在医疗保健、金融和刑事司法等领域尤为重要,因为模型决策的后果可能对个人和社会产生重大影响。
目前,由于机器学习模型复杂的内部机制和缺乏透明度,许多模型被视为黑箱。这可能引发关于问责制和偏见的担忧,并可能阻碍利益相关者采纳这些模型并信任它们。为了解决这些问题,越来越需要能够为机器学习模型提供可解释性和解释能力的方法和技术。
XAI 是一种机器学习可解释性技术,重点在于理解机器学习模型的预测,并以人类能够理解的方式解释这些预测是如何得出的,从而建立对模型的信任。顾名思义,XAI 广泛关注模型解释,并提供接口以解读这些解释,从而有效地架起机器学习与人类系统之间的桥梁。它是更广泛的人本责任 AI 实践的关键组成部分。
图 9.1展示了构建以人为本的 XAI 系统所涉及的不同领域:
图 9.1 – 以人为本的 XAI 系统
XAI 的发展与应用 AI/深度学习(DL)系统的发展同步,始于大约 2015 年。越来越复杂的 DL 模型,如深度神经网络,为开发者和模型相关方揭示了新的可解释性挑战。在 AI 的实施过程中,由于神经网络的黑箱特性,即使是工程师或数据科学家也无法清楚了解其背后的实际情况。因此,理解一个模型的预测变得困难,且在高风险场景中难以信任这些预测。
XAI 是当我们想要判断是否可以信任我们的 AI 模型的结果,并且如何确定我们有多大的信心相信该模型是正确的时的一种解决方案。它使我们能够理解 AI 模型在某种情况下如何得出结果,从而建立对这些结果的信任。
要实现一个可靠的 XAI 系统,我们应该关注三个主要组成部分:预测准确性、可追溯性和决策理解,如图 9.2所示:
图 9.2 – XAI 系统的三个主要组成部分
让我们讨论一下这些组件:
-
预测准确性涉及技术要求,毫无疑问,它是人工智能在日常操作中成功应用的关键组成部分。预测准确性可以通过将 XAI 输出与训练/测试数据集中的结果进行比较来确定。例如,我们可以使用 LIME 等算法来解释 AI/DL/ML 分类器做出的预测。
-
决策理解涉及人类需求,旨在通过教育和信息传递,克服对 AI 的不信任,帮助团队理解决策是如何做出的。这些信息可以通过仪表盘的形式展示给最终用户,显示影响某一决策的主要因素,以及每个因素对决策的影响程度。
-
可追溯性可能影响并限制决策过程,为机器学习规则和特征设定更窄的范围。像深度学习重要特征(DeepLIFT)这样的技术可以通过显示可追溯链接和依赖关系,比较神经网络中每个神经元与其参考神经元的激活情况。
如果用户对 AI 决策的生成过程缺乏理解,信任框架将受到损害,并最终可能导致模型被拒绝。考虑一个向用户推荐社交网络连接或购买产品的系统。对这些推荐的解释将成为机器学习系统采纳的催化剂,使信息对用户更具意义。
XAI 不仅仅是建立模型信任,它还涉及故障排除和提高模型性能。它使我们能够通过追踪模型在部署状态、公平性、质量和模型漂移等方面的洞察来调查模型行为。通过使用 XAI,可以分析模型性能,并在模型偏离预期结果并表现不佳时生成警报。
XAI 的范围
理解模型对于构建和操作机器学习系统中的许多任务至关重要,XAI 可以用于以下任务:
-
完善建模和数据收集过程:在对数据集进行拆分聚合和比较后,XAI 提供了一种方法,可以识别并提醒用户注意常见的机器学习问题,如数据偏斜和漂移。
-
调试模型性能:XAI 使我们能够调试模型的意外行为,并监控更深层次的特征级洞察,以指导修正行动。
-
建立信任:通过解释预测,XAI 支持决策过程,帮助与最终用户建立信任,使得模型决策更加公正和可靠。
-
识别意外的预测:它验证模型行为并提供修改措施。例如,它可以帮助监管机构有效地验证机器学习决策是否符合相关法律,以减少对最终用户产生不良模型结果的风险。
-
充当催化剂:XAI 通过建立用户信任,并以易于理解的形式向利益相关者展示模型结果,促进了机器学习系统的采用。
在理想的世界中,一个可解释且透明的模型可以在不同的行业中使用,例如在医疗健康领域,通过加速诊断、处理图像、简化药品审批流程,以及在制造、金融、物流和刑事司法领域做出关键决策,如加速 DNA 分析或监狱人口分析的结论。
可解释性可以帮助开发人员确保系统按预期工作,符合监管标准,甚至允许受决策影响的人挑战该结果。理解和解释模型预测的能力使公司和机构能够做出明智的决策,尤其是在利益相关者需要证明的情况下,如战略商业决策中。
XAI 的挑战
实施 XAI 解决方案时面临的一些具有挑战性的困境如下:
-
算法机密性:通常,由于安全问题,所使用的模型和算法的细节是保密的。在这种情况下,确保 AI 系统没有因为训练数据、目标函数或模型的缺陷而学到偏见观点(或一个有偏见世界的无偏见观点)就成为了一项具有挑战性的任务。
-
公平性:对于 XAI 来说,判断 AI 框架所做的决策或得到的输出是否公平是一项挑战,因为公平的印象是主观的,且依赖于用于训练 AI/ML 模型的数据。此外,公平性的定义可能会根据使用场景、文化等发生变化。
-
可靠性:如果不评估 AI 系统如何得出某个结果,就很难依赖该系统,因为需要澄清该系统是否合法。
构建一个可以轻松解释和解读的模型是克服上述挑战的关键。高度复杂的算法可以通过更简单的方式重新创建或替代,这些方法借助 XAI 可以更容易地解释。
XAI 技术分类
XAI 技术可以根据两个主要标准进行分类——范围和模型。请参见图 9.3:
图 9.3 – XAI 技术分类
让我们讨论每种技术:
-
范围:XAI 技术可以根据其解释的范围进行分类。在范围上,XAI 技术主要分为两大类:局部和全局。局部解释侧重于描述 AI 模型在特定输入或输出下的行为。这些解释提供了有关模型如何针对特定输入做出决策的见解,有助于理解模型在特定情况下的行为。另一方面,全局解释则提供有关 AI 模型在广泛输入和输出下的一般行为的见解。这些解释有助于理解 AI 模型的整体决策过程及其如何处理不同类型的输入。
-
模型:XAI 技术也可以根据应用的模型类型进行分类。在模型的上下文中,XAI 技术主要分为两类:特定模型和无关模型。特定模型的解释是针对特定 AI 模型的架构和设计量身定制的。这些解释通常具有局部性质,提供有关特定输入或输出的模型行为的见解。特定模型的 XAI 技术的例子包括特征重要性分析和显著性图。另一方面,无关模型的解释并不特定于任何特定的 AI 模型,可以应用于广泛的不同模型。这些解释通常具有全局性质,提供有关 AI 模型在各种输入和输出情况下的整体行为的见解。无关模型的 XAI 技术的例子包括反事实分析和模型蒸馏。
图 9.4 扩展了特定模型与无关模型的 XAI 技术之间的差异:
图 9.4 – 特定模型与无关模型的 XAI 技术
总体而言,XAI 技术可以根据其范围(局部或全局)以及它们与所应用模型的关系(特定模型或无关模型)进行分类。了解不同类型的 XAI 技术以及它们如何应用,可以帮助从业者为特定情境选择最合适的技术,并更好地理解他们 AI 模型的行为。
现在让我们探讨一些可以用于模型可解释性的 Python 库。
解释像我五岁一样(ELI5)
这个 Python 库使我们能够可视化和调试机器学习模型。它提供了本地和全局解释的功能。XGBoost、LightGBM、scikit-learn、Lightning 和 CatBoost 是 ELI5 支持的库之一。ELI5 的目标是使解释对普通观众易于理解,包括那些没有人工智能或机器学习背景的人。
这是一个示例,展示了如何使用 ELI5 来提供对 AI 模型预测的解释。
假设一个 AI 模型已经被训练用来预测一个病人根据多种医疗特征(如年龄、性别和病史)患某种特定疾病的可能性。该模型预测某个特定病人患该疾病的可能性较高。为了提供这个预测的 ELI5 解释,模型可以给出一个简单易懂的解释,比如:根据你的年龄、性别和病史,我们的模型预测你患该疾病的几率较高。这是因为根据我们的数据,具有类似特征的人患此病的风险较高。这个 ELI5 解释为模型做出的预测提供了清晰简洁的说明,使用了普通观众可以理解的语言和概念。它还突出了模型在做出预测时考虑的因素,有助于增加 AI 系统的透明度和问责性。
以下是我们介绍 ELI5 如何在代码中实现的一个大致框架:
-
首先,您要解释的 AI 模型应已经过训练并部署。这个模型可以是机器学习(ML)模型、深度学习(DL)模型或其他类型的 AI 模型。
-
然后,你需要选择你想要解释的模型输入或输出。这可以是模型做出的单个预测,也可以是一批预测。
-
接下来,你需要选择一个适合你的模型和你想要提供的解释类型的 ELI5 解释方法。有许多不同的 ELI5 方法,包括提供特征重要性解释、显著性图和反事实解释等方法。
-
一旦你选择了一个 ELI5 方法,你就可以用它来生成模型输入或输出的解释。这可能涉及将输入或输出通过 ELI5 方法进行处理,然后对生成的解释进行进一步处理,使其简单易懂,适合一般观众。
-
最后,您可以清晰简洁地将 ELI5 解释呈现给用户,使用普通观众可以理解的语言和概念。这可能涉及将解释显示在用户界面中、打印到控制台或保存到文件中。
然而,ELI5 存在一些局限性。其中一个局限性是,可能无法为 AI 模型做出的每个决策提供一个简单且易于理解的解释。在某些情况下,AI 模型的决策过程可能过于复杂或细微,无法简单地解释。另一个局限性是,ELI5 解释可能不足以完全理解 AI 模型的行为,尤其是对于那些具有更技术背景的人。在这些情况下,可能需要更详细和技术性的解释。另外,请注意,它并不适用于所有模型——例如,在 scikit-learn 中,它仅适用于线性分类器、回归器和基于树的模型。在 Keras 中,它支持使用 Grad-CAM 可视化来解释图像分类器。
LIME
LIME 是一种流行的 XAI 技术,用于为 AI 模型的预测提供局部解释。LIME 的目标是提供一个简单、易于理解的解释,帮助普通观众理解 AI 模型是如何从特定输入中得出某个预测的。
LIME 是与模型无关的,这意味着它可以应用于各种不同的 AI 模型,而不受其架构或设计的限制。这使得 LIME 成为一个灵活且广泛适用的工具,用于解释 AI 模型的行为。
在使用 LIME 生成解释时,该技术首先生成一组扰动版本的输入数据,称为 扰动。这些扰动是通过随机改变某些输入特征的值(每次一个特征),同时保持其他特征不变来获得的。然后,使用 AI 模型对每个扰动做出预测,结果的预测被用来构建一个简单的线性模型,该模型近似原始输入附近的 AI 模型行为。这个线性模型接着被用来为 AI 模型做出的预测提供解释。解释可以以一个特征列表的形式呈现给用户,这个列表列出了对预测贡献最大的特征,并显示每个特征的相对重要性。
例如,考虑一个使用 AI 模型对电子邮件进行分类的系统,该系统将电子邮件分类为垃圾邮件或非垃圾邮件。为了使用 LIME 解释某个特定电子邮件的分类,算法可能通过随机更改电子邮件中的一些单词,同时保持其他特征不变,生成一组扰动。然后,AI 模型将对每个扰动做出预测,结果的预测将用来构建一个简单的线性模型,该模型近似原始电子邮件附近的 AI 模型行为。
LIME 生成的线性模型随后可以用于解释原始电子邮件的分类结果,例如一份最重要词汇的列表,展示这些词汇对分类的贡献,并附上每个词汇的相对重要性。这个解释将在局部区域内忠实地反映 AI 模型的行为,意味着它能准确地体现 AI 模型在电子邮件周围局部区域的行为,并且是在电子邮件的可解释表示(即一份词汇列表)上学习得出的。
LIME 是一个用于理解 AI 模型行为的有用工具,它可以为这些模型做出的预测提供简单且易于理解的解释。然而,它也有一些局限性,例如它只能提供局部解释,可能无法捕捉到 AI 模型决策过程的全部复杂性。
现在让我们继续介绍工具箱中的下一个工具:SHAP。
SHAP
SHAP(即Shapley 加性解释)是另一种流行的 XAI 技术。SHAP 的目标是解释 AI 模型的整体决策过程以及它如何处理不同类型的输入,并为这一过程提供一个简单且易于理解的解释,面向一般观众。
SHAP 基于博弈论中的 Shapley 值概念,Shapley 值提供了一种公平地分配不同参与者对集体结果贡献的方法。在 XAI 的背景下,SHAP 利用 Shapley 值计算输入数据点中每个特征对 AI 模型预测的相对重要性。
为了使用 SHAP 生成解释,技术首先计算输入数据中每个特征的 Shapley 值。这是通过考虑所有可能的输入特征组合以及 AI 模型的相应预测,然后使用这些组合计算每个特征对预测的相对贡献。
SHAP 计算的 Shapley 值随后用于为 AI 模型的预测提供解释。这个解释可以以一份最重要特征的列表呈现给用户,这些特征对预测的贡献以及每个特征的相对重要性也会一并显示。
Shapley 值与合作博弈
Shapley 值基于一种合作博弈的概念,在这种博弈中,一组参与者合作以达成共同的目标。Shapley 值是衡量玩家对集体结果贡献的指标,考虑到所有其他成员的努力。Shapley 值为每个玩家提供了公平的价值,依据他们对集体结果的贡献。这意味着每个参与者只因自己对结果的贡献而获得功劳,同时考虑到其他玩家的努力。假设一组人正在合作建造一座房子。考虑到所有其他参与者的努力,每个参与者的 Shapley 值将代表他们对房屋建造的贡献。一个负责打地基的人会因地基的价值而获得功劳,但不会因为房顶或墙壁的建设而获得功劳,后者是由其他人贡献的。
SHAP 是一个强大且广泛适用的工具,用于理解 AI 模型的行为,并为这些模型所做的预测提供全球性的解释。然而,它也有一些限制,例如,计算大数据集的 Shapley 值可能在计算上非常昂贵。此外,对于技术背景有限的用户来说,SHAP 的解释可能并不总是易于理解。
现在我们已经了解了一些可以用来解释模型预测的工具,让我们看看如何使用它们。
使用 XAI 技术理解客户流失建模
现在你对 ELI5、LIME 和 SHAP 技术有了一定了解,让我们在实际问题中使用它们。为了演示,我们将考虑客户流失建模的问题。
客户流失建模是一种预测建模方法,用于识别可能停止使用公司产品或服务的客户,也称为流失。客户流失建模通常用于电信、金融服务和电子商务等行业,这些行业中客户保持是商业成功的重要因素。
客户流失建模通常包括使用机器学习或其他统计技术构建预测模型,以识别最可能导致客户流失的因素。该模型在涵盖过去客户的数据显示进行训练,其中包括关于客户的基本信息、使用模式和流失状态(即,是否流失)。然后,该模型将用于根据客户的特定特征和行为预测未来客户流失的可能性。
它可以用来识别高风险的可能流失客户,从而公司可以对这些客户采取主动措施来保留他们,例如提供折扣和激励,鼓励他们继续使用公司的产品或服务。它还可以更广泛地帮助理解导致客户流失的因素,这样公司可以采取措施应对这些因素,从而提高客户的总体留存率。
我们将开始构建一个预测流失的模型。在这个示例中,我们使用的是来自 github.com/sharmaroshan/Churn-Modeling-Dataset
的流失建模数据集。该数据集包含 10,000 个数据点和 14 个特征。图 9.5 显示了一些数据探索的结果:
图 9.5 – 在流失模型数据集上的数据探索
让我们开始构建模型。
构建模型
既然我们已经查看了数据,接下来我们开始构建一个模型来使用这些数据。由于我们的重点是解释如何使用之前讨论的 Python 库,因此我们将使用 scikit-learn 构建一个简单的 随机森林 分类器。
这是实现的步骤:
-
首先,我们导入构建模型所需的所有包,以及构建解释所需的包(即 ELI5、LIME 和 SHAP):
import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import make_scorer from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, auc, roc_auc_score import pickle import eli5 from eli5.sklearn import PermutationImportance import lime from lime import lime_tabular import shap
-
接下来,我们下载数据并从中获取特征和输出;然后,对分类变量
Geography
和Gender
进行独热编码:dataset = pd.read_csv('https://raw.githubusercontent.com/krishnaik06/Lime-Model-Interpretation/main/Churn_Modelling.csv') X = dataset.iloc[:, 3:13] y = dataset.iloc[:, 13] geography = pd.get_dummies(X["Geography"], drop_first=False) gender=pd.get_dummies(X['Gender'],drop_first=False)
-
让我们也删除数据框中所有不相关的列:
X=pd.concat([X,geography,gender],axis=1) X=X.drop(['Geography','Gender'],axis=1)
-
现在,我们将数据分成训练集和测试集:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
-
现在,让我们定义随机森林分类器并在训练数据集上进行训练:
Classifier=RandomForestClassifier() classifier.fit(X_train,y_train)
-
接下来,我们使用训练好的模型在测试集上进行预测。我们可以看到它在测试集上的准确率为 86%:
y_predict = classifier.predict(X_test) y_prob = [probs[1] for probs in classifier.predict_proba(X_test)]
-
我们还可以看到在测试集上的 ROC 曲线:
# Compute area under the curve fpr, tpr, _ = roc_curve(y_test, y_prob) roc_auc = auc(fpr, tpr) # Plot ROC curve plt.figure() plt.plot(fpr, tpr, color='orange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='—') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title("Churn Modeling") plt.legend(loc="lower right") plt.show()
这是 ROC 曲线的显示方式:
图 9.6 – ROC 曲线
ROC 曲线下的面积大约为 0.87,通常认为这是一个相当好的分类器的标志。
-
由于我们使用的是随机森林分类器,接下来让我们基于默认的 平均减小不纯度(MDI)标准来探索特征重要性。以下是获得该信息的代码。为了方便理解,我们将特征重要性以条形图的形式进行展示:
# Feature importance in a dataframe imp_df = pd.DataFrame({ 'feature': X_train.columns.values, 'importance':classifier.feature_importances_}) # Reorder by importance ordered_df = imp_df.sort_values(by='importance') imp_range = range(1,len(imp_df.index)+1) ## Bar chart with confidence intervals height = ordered_df['importance'] bars = ordered_df['feature'] y_pos = np.arange(len(bars)) plt.barh(y_pos, height) plt.yticks(y_pos, bars) plt.xlabel("Mean reduction in tree impurity in random forest") plt.tight_layout() plt.show()
这是条形图的显示方式:
图 9.7 – 使用 scikit-learn 的 MDI 标准的特征重要性
在前面的图中,我们可以看到,影响客户是否留存或流失的五个最重要特征分别是他们的年龄、估计薪资、账户余额、信用评分以及他们购买的产品数量。
接下来,我们使用 ELI5 来理解分类器。
使用 ELI5 来理解分类模型
我们使用 ELI5 的PermutationImportance
方法来解释我们构建的分类模型。PermutationImportance
是 ELI5 中实现的一个特征重要性度量方法,可以用来估算任何特征的重要性。PermutationImportance
方法通过随机排列单个特征的值,然后测量排列对所选模型性能的影响。模型的性能受到排列影响越大,特征的重要性就越高。我们将训练好的模型和数据集作为输入传递给 ELI5 中定义的PermutationImportance
类。让我们从这个开始:
-
在以下代码中,我们使用 ROC 曲线下面积作为度量来评估训练模型中不同特征的重要性:
perm_test = PermutationImportance(classifier, scoring=make_scorer(roc_auc_score), n_iter=50, random_state=123, cv="prefit")
-
让我们使用训练数据集计算特征重要性:
perm_test.fit(X_train, y_train)
-
我们现在可以使用
explain_weights
或show_weights
函数来获取每个特征的排列重要性:imp_df = eli5.explain_weights_df(perm_test)
-
imp_df
数据框包含估算器参数。同样,为了便于理解,最好重新排序它们并将结果绘制成条形图。这里是相关代码和条形图:label_df = pd.DataFrame({ 'feature': [ "x" + str(i) for i in range( len(X_test.columns))], 'feature_name': X_test.columns.values}) imp_df = pd.merge(label_df, imp_df, on='feature', how='inner', validate="one_to_one") # Reorder by importance ordered_df = imp_df.sort_values(by='weight') imp_range=range(1,len(imp_df.index)+1) ## Bar chart with confidence intervals height = ordered_df['weight'] bars = ordered_df['feature_name'] y_pos = np.arange(len(bars)) plt.barh(y_pos, height) plt.yticks(y_pos, bars) plt.xlabel("Permutation feature importance training set (decrease in AUC)") plt.tight_layout() plt.show()
这里是条形图:
图 9.8 – 使用 ELI5 PermutationImportance 并以 AUC 作为评分计算特征重要性
根据此图,年龄是最重要的因素,其次是购买的产品数量、余额以及是否为活跃会员。
现在,让我们尝试使用 LIME 来解释模型的预测结果。
实践 LIME
你可以将 LIME 应用于任何类型的数据集,无论是表格、文本还是图像数据。在本节中,我们将介绍如何使用 LIME 来理解我们的随机森林分类器在客户流失建模中的预测。
这里,我们有表格数据。通过使用 LIME,我们可以更好地理解模型如何做出决策,并识别出在预测客户流失时最重要的因素:
- 由于这是表格数据,我们将使用
lime_tabular
中定义的LimeTabularExplainer
类:
注意
理想情况下,我们不应该对分类特征进行独热编码,因为当 LIME 尝试做出预测时,它可能会给出无意义的输入。更多信息,请参见github.com/marcotcr/lime/issues/323
的讨论。
interpretor = lime_tabular.LimeTabularExplainer(
training_data=np.array(X_train),
feature_names=X_train.columns,
mode='classification')
-
现在,我们可以使用 LIME 来解释一个实例的预测结果。我们选择了以下实例:
X_test.iloc[3]: CreditScore 788.00 Age 32.00 Tenure 4.00 Balance 112079.58 NumOfProducts 1.00 HasCrCard 0.00 IsActiveMember 0.00 EstimatedSalary 89368.59 France 1.00 Germany 0.00 Spain 0.00 Female 0.00 Male 1.00 Name: 5906, dtype: float64
-
现在,我们使用 LIME 的
explain_instance
函数来概述其对输入的解释:exp = interpretor.explain_instance( data_row=X_test.iloc[3], #new data predict_fn=classifier.predict_proba ) exp.show_in_notebook(show_table=True)
输出结果如下所示:
图 9.9 – 使用 LIME 解释器解释 X_test.iloc[3]实例的特征重要性
LIME 解释器告诉我们,对于给定的客户,流失的概率微乎其微(0.01)。此外,在前面的结果中,我们可以看到各个因素对每个类别的贡献以及它们的贡献性质。再次发现,年龄对预测的影响最大。
我们可以看到所有工具都指向了同一个方向:年龄
是流失建模的重要特征。让我们看看 SHAP 的解释。
SHAP 实践
在本节中,我们将向您展示如何使用 SHAP 来解释我们流失预测模型的预测结果。SHAP 是一种强大的可解释 AI(XAI)技术,可以帮助我们理解输入数据点中的每个特征对机器学习模型预测的相对重要性。通过使用 SHAP,我们可以更好地理解模型如何做出决策,并识别出在预测流失时最重要的因素:
-
我们将使用 SHAP 的
TreeExplainer
类,该类专门设计用于树模型。TreeExplainer
类通过遍历模型的决策树并计算每个特征对每个树节点的预测贡献,从而工作。然后将这些贡献聚合,以生成模型预测的全局解释:explainer = shap.TreeExplainer(classifier) shap_values = explainer.shap_values(X_test)
-
现在我们将对与 LIME 使用的相同实例
X_test[3]
进行操作:shap.initjs() #initialize javascript in cell shap.force_plot(explainer.expected_value[0], shap_values[0][3,:], X_test.iloc[3,:])
这将生成一个给定实例的 SHAP 力量图。该力量图直观地解释了各个因素对该特定实例预测的贡献。显示了输入数据中每个特征的相对重要性,以及每个特征如何影响预测。第一个参数 explainer.expected_value[0]
表示该实例的模型期望值为 0
——也就是说,它属于 0 类,即没有流失。第二个参数 shap_values[0][3,:]
提供了我们给定实例的 SHAP 值数组。SHAP 值表示每个特征对模型为 0 类做出的预测的贡献。在这里,你可以看到这个图表:
图 9.10 – SHAP 力量图用于 X_test.iloc[3] 实例
如我们所见,SHAP 力图展示了一个线性坐标轴。这个坐标轴表示模型的输出。你还应该看到一组水平条形图,它们表示输入数据中的特征。该图还包括一个基准值,它是模型在为特定类别或标签进行解释时的预期输出值。每个水平条形图的长度表示相应特征对预测的相对重要性。较长的条形图表示更高的重要性,而较短的条形图表示较低的重要性。每个条形图的颜色表示该特征值如何影响预测结果。蓝色条形图表示该特征的较高值导致较高的预测值,而红色条形图表示该特征的较高值导致较低的预测值。
-
我们还可以使用 SHAP 的依赖图来了解输入数据集中特定特征与模型预测之间的关系。以下命令生成一个图,展示
Age
特征对 0 类别预测的影响:shap.dependence_plot("Age", shap_values[0], X_test)
这里是它的图示:
图 9.11 – SHAP 依赖图(Age 特征)
-
总结图使我们能够可视化所有输入特征的重要性。以下是相关代码:
shap.summary_plot(shap_values[1], X_test, plot_type="violin")
图示如下:
图 9.12 – SHAP 总结图
SHAP 总结图由一个垂直坐标轴组成,表示模型的输出(通常标记为f(x)
),以及一组水平的小提琴图,表示每个特征的 SHAP 值分布。小提琴图展示了每个特征在数据集中所有实例中的 SHAP 值分布,可以用来理解每个特征的值是如何影响模型的预测结果的。
到目前为止,我们所审视的库为我们提供了许多基于各特征重要性的模型预测见解。接下来,我们将探索一些提供因果关系分析的库。
CausalNex
CausalNex 是一个开源 Python 库,允许我们开发有助于推断因果关系的模型,而非仅仅观察相关性。CausalNex 提供的what if
库用于测试场景,利用贝叶斯网络进行因果推理。一些 CausalNex 的突出特点如下:
-
通过可视化简化贝叶斯网络中的因果关系理解:CausalNex 的主要特点之一是它通过可视化简化了贝叶斯网络中因果关系的理解。该库提供了一系列可视化贝叶斯网络的工具,包括网络图、影响图和决策图,允许用户查看不同变量之间的连接及其相互影响。
-
理解变量之间的条件依赖关系:CausalNex 还提供了用于理解变量之间条件依赖关系的工具。该库包括最先进的结构学习方法,这些算法可以从数据中自动学习贝叶斯网络的结构。这些方法使用户能够识别变量之间的关系,并理解它们如何受到网络中其他变量的影响。
-
增强领域知识:CausalNex 还提供了增强领域知识的工具,领域知识指的是用户在建模过程中所带入的特定知识和专业技能。该库允许用户将其领域知识融入贝叶斯网络的结构中,从而帮助提高模型的准确性和可靠性。
-
评估模型质量:CausalNex 包括用于评估模型质量的工具,如统计检查和模型选择方法。这些工具使用户能够确保他们构建的模型是准确的,并且适用于他们特定的问题。
-
基于结构关系构建预测模型:该库还包括基于贝叶斯网络中结构关系构建预测模型的工具,这对于预测未来结果或以“假设如果”的方式测试场景非常有用。
在下图中,你可以看到一个显示学生表现与可能影响因素之间因果关系的图:
图 9.13 – 子图显示影响学生表现的不同因素之间的因果关系
该结果来源于 CausalNex 的入门教程,causalnex.readthedocs.io/en/latest/03_tutorial/01_first_tutorial.html
。我们可以看到,过度的互联网使用会导致学生缺课增加。同样地,如果学生增加学习时间,他们的成绩(G1)会提高。
总体而言,CausalNex 是一个强大的贝叶斯网络因果推理工具包。它提供了一系列功能,用于简化因果关系的理解,理解变量之间的条件依赖关系,增强领域知识,评估模型质量,以及基于结构关系构建预测模型。
现在让我们探索下一个用于因果推断的 Python 库——DoWhy 库。
DoWhy 用于因果推断
DoWhy 是一个用于因果推断和分析的 Python 库。它旨在支持与其他因果估计库的互操作性,如 Causal ML 和 EconML,使用户能够轻松地在分析中结合不同的方法和途径。
DoWhy 的主要特点之一是专注于稳健性检验和敏感性分析。该库包括一系列方法来评估因果估计的稳健性,如自助法和安慰剂测试。这些方法帮助用户确保他们的估计是可靠的,不受偏差或混杂因素的影响。
除了稳健性检验外,DoWhy 还提供了一个 API,涵盖因果分析中的常见步骤。这些步骤包括创建因果模型、确定感兴趣的效应、使用统计估计方法估计效应,并通过敏感性分析和稳健性检验验证估计结果。
要创建因果模型,用户可以使用 DoWhy 的因果图和结构假设工具来表示变量之间的关系并指定模型的基本假设。一旦模型创建完成,用户可以使用 DoWhy 的识别工具来确定预期效应是否有效,然后使用该库的估计工具来估算效应。最后,用户可以使用 DoWhy 的验证工具,通过敏感性分析和稳健性检验确保估计结果的准确性和可靠性。
该库为因果推断领域做出了三大主要贡献:
-
将问题建模为因果图:DoWhy 允许用户将问题表示为因果图,这些图是变量之间因果关系的图形表示。通过将问题建模为因果图,用户可以明确表达他们的所有假设,从而帮助确保这些假设是透明的并且易于理解。
-
统一接口:DoWhy 结合了图模型和潜在结果这两个主要框架,提供了一个统一的接口,支持多种因果推断方法。这使得用户能够轻松地将不同的方法和途径结合到分析中,并选择最适合其特定问题的方法。
-
自动测试假设有效性:DoWhy 包括一系列测试假设有效性的工具,如稳健性检验和敏感性分析。通过自动测试假设的有效性,用户可以确保他们的估计是可靠的,不会受到偏差或混杂因素的影响。
DoWhy 将因果推断过程分为四个步骤:建模、识别、估计和反驳。在建模步骤中,用户创建因果图以编码他们的假设。在识别步骤中,用户制定他们希望估算的内容。在估计步骤中,用户使用统计估计方法计算效应估计值。最后,在反驳步骤中,用户通过敏感性分析和稳健性检验验证假设。
让我们动手试试,玩一玩 DoWhy。
DoWhy 的应用
我们将使用一个简单的合成数据集来演示 DoWhy 库的功能。
-
首先,导入 DoWhy 库以及我们将使用的组件,如下所示:
import dowhy import dowhy.datasets from dowhy import CausalModel
-
接下来,使用 DoWhy 的
linear_dataset
函数,我们生成一个合成数据集,使得干预和感兴趣结果之间的关系是线性的,这也称为线性处理效应(在我们的例子中,我们选择了beta=10
,因此真实的干预效应为10
)。这将创建一个具有指定干预效应的线性模型,并生成符合此模型的一组合成数据点。生成的 DataFrame 包含表示干预的列、表示结果的列,以及一组表示常见原因和工具变量的列。此外,num_effect_modifiers
参数指定了影响干预效应的效应修饰符或变量的数量,num_samples
参数指定数据集中样本的数量,treatment_is_binary
参数指示干预是二元的还是连续的。如果干预是二元的,则它只能取两个值:有效或无效、开或关;如果干预是连续的,则它可以取多个值。stddev_treatment_noise
参数指定了干预噪声的标准差,这个噪声会添加到干预效应中,生成合成数据。生成的数据是dictdata
类型。然后从中提取 DataFrame (df
):# Generate data data = dowhy.datasets.linear_dataset(beta=10, num_common_causes=5, num_instruments = 2, num_effect_modifiers=2, num_samples=6000, treatment_is_binary=True, stddev_treatment_noise=9, num_discrete_common_causes=1) df = data["df"]
-
df
DataFrame 将有 11 列,其中v0
列是干预名称,结果在y
列,W0-W4
代表五个常见原因,Z0
和Z1
是两个工具变量,X0
和X1
是两个效应修饰符。现在,我们使用CausalModel
类为我们的合成数据创建因果模型。CausalModel
类使用以下参数:-
data
:一个 pandas DataFrame,包含数据。 -
treatment
:DataFrame 中将被视为treatment
变量的列。它代表的是正在采取的干预或措施,目的是影响结果。 -
outcome
:DataFrame 中将被视为结果变量的列。 -
common_causes
:将被视为常见原因的列。这些变量既能影响干预,也能影响结果,通常也称为instruments
(工具变量):这些是用来推断因果关系的变量。
-
这将创建一个图形模型,表示数据中因果关系的结构。graph
参数指定了因果图,它编码了模型中变量之间因果关系的结构。这里,我们使用的是图形建模语言(GML)文件格式的因果图:
# Input a causal graph in GML format
model=CausalModel(
data = df,
treatment=data["treatment_name"],
outcome=data["outcome_name"],
graph=data["gml_graph"]
)
让我们查看 model.view_model()
图形:
图 9.14 – 数据集的因果图
-
接下来,我们查看目标变量和识别它们所需的假设。结果告诉我们估计量(模型估计的因果估计量,描述了感兴趣的因果效应)、它们的名称、表达式(用模型变量表示的估计量的数学表达式)以及所需的假设:
# Identification identified_estimand = model.identify_effect( proceed_when_unidentifiable=True) print(identified_estimand) >>> Estimand type: EstimandType.NONPARAMETRIC_ATE ### Estimand : 1 Estimand name: backdoor Estimand expression: d ─────(E[y|W0,W1,W3,W2,W4]) d[v₀] Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W0,W1,W3,W2,W4,U) = P(y|v0,W0,W1,W3,W2,W4) ### Estimand : 2 Estimand name: iv Estimand expression: ⎡ -1 ⎤ ⎢ d ⎛ d ⎞ ⎥ E⎢─────────(y)⋅ ─────────([v₀]) ⎥ ⎣d[Z₁ Z₀] ⎝d[Z₁ Z₀] ⎠ ⎦ Estimand assumption 1, As-if-random: If U→→y then ¬(U →→{Z1,Z0}) Estimand assumption 2, Exclusion: If we remove {Z1,Z0}→{v0}, then ¬({Z1,Z0}→y) ### Estimand : 3 Estimand name: frontdoor No such variable(s) found!
-
现在让我们使用
estimate_effect
方法来识别估计量,以计算治疗效应的估计值。我们可以看到估计的均值是9.162
,这表示治疗对结果的平均效应,在整个群体中的所有个体上都适用:# Estimation causal_estimate = model.estimate_effect(identified_estimand, method_name="backdoor.propensity_score_stratification") print(causal_estimate) >>> *** Causal Estimate *** ## Identified estimand Estimand type: EstimandType.NONPARAMETRIC_ATE ### Estimand : 1 Estimand name: backdoor Estimand expression: d ─────(E[y|W0,W1,W3,W2,W4]) d[v₀] Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W0,W1,W3,W2,W4,U) = P(y|v0,W0,W1,W3,W2,W4) ## Realized estimand b: y~v0+W0+W1+W3+W2+W4 Target units: ate ## Estimate Mean value: 7.151535367146138
-
你可以使用
refute_estimate
函数来测试治疗效应估计在数据或模型假设的各种扰动下的稳健性。
总的来说,DoWhy 是一个强大的因果推断和分析工具。它提供了用于创建因果模型、识别效应、估计效应和验证估计的多种功能,是因果推断领域的研究人员和分析师的宝贵资源。
用于解释模型的 AI Explainability 360
AI Explainability 360 是一个开源工具包,提供了多种用于解释和理解机器学习模型的技术。它支持模型特定和模型无关的方法,以及局部和全局解释,为用户提供多种理解模型的选项。此外,该工具包构建于流行的机器学习库之上,包括 scikit-learn 和 XGBoost,方便与现有管道集成。
AI Explainability 360 的一些特点包括:
-
模型无关和模型特定的可解释性技术:AI Explainability 360 提供了模型无关和模型特定的可解释性技术,可以用来理解和解释任何 AI 模型的预测。模型无关技术,如 LIME 和 SHAP,可以用来解释任何模型的预测,而模型特定技术,如特征重要性和部分依赖图,针对特定类型的模型进行定制。
-
局部和全局解释:AI Explainability 360 提供了 AI 模型的局部和全局解释。局部解释侧重于理解模型对单个实例所做的特定预测,而全局解释则侧重于理解模型的整体行为。
-
支持多种数据类型:AI Explainability 360 支持多种数据类型的解释,包括表格数据、文本、图像和时间序列数据。它提供了一系列针对每种数据类型特征的可解释性技术。
-
与流行的 AI 框架集成:AI Explainability 360 被设计为可以轻松与流行的 AI 框架集成,包括 TensorFlow、PyTorch 和 scikit-learn,方便在实际应用中使用。
-
广泛的文档和示例:AI 可解释性 360 配备了丰富的文档和示例,帮助用户在自己的项目中开始探索可解释性。
总体而言,AI 可解释性 360 是一个强大的工具包,用于理解和解释人工智能模型所做的预测,并构建透明、可信、公平的人工智能系统。
摘要
人工智能的未来在于使人们能够与机器协作解决复杂问题。像任何高效的合作一样,这需要良好的沟通、信任、清晰度和理解。XAI 旨在通过结合符号 AI 和传统机器学习的最佳特点来解决这些挑战。
在本章中,我们探讨了多种 XAI 技术,这些技术可以用于解释和解读机器学习模型。这些技术可以根据其范围(局部或全局)和模型类型(特定模型或无关模型)进行分类。
我们介绍了几种提供 XAI 功能的 Python 库,并解释了如何使用 ELI5、LIME 和 SHAP 探索模型预测中的特征重要性。LIME 可以为任何分类器做出基于实例的解释。LIME 使用可解释模型局部地近似分类器,并生成一个特征列表,列出在给定实例中对预测有贡献的特征。SHAP 使用 Shapley 值来解释每个特征对预测的贡献,支持局部和全局的解释,并且可以与各种模型类型一起使用。
DoWhy 是另一个因果推断和分析库。它提供了一个 API,涵盖因果分析中的常见步骤,包括建模、识别、估计和反驳。最后,我们介绍了 AI 可解释性 360,这是一个综合性的开源工具包,用于解释和解读机器学习模型。它支持特定模型和无关模型的解释,以及局部和全局的解释。
总之,市场上有多种工具和库可用于解释和解读机器学习模型。这些工具(如 ELI5、LIME、SHAP、CausalNex、DoWhy 和 AI 可解释性 360)提供了多种选项,用于理解模型如何做出预测,并且对于在 XAI 领域工作的研究人员和从业者非常有用。然而,必须注意的是,这一领域仍然存在一些局限性和挑战。
在下一章中,我们将深入探讨模型风险管理,并探索模型治理的最佳实践。
参考文献
-
黑盒与白盒:从实践角度理解它们的优缺点,Loyola-Gonzalez, Octavio。IEEE Access 7(2019):154096-154113。
-
可解释人工智能(XAI)中的机遇与挑战:一项调查。arXiv 预印本 arXiv:2006.11371,Das, Arun 和 Rad Paul。(2020)
-
人机交互与可解释人工智能在医疗保健中的系统性回顾与人工智能技术。IEEE Access 9(2021):153316-153348,Nazar, Mobeen 等人。
-
为什么我应该信任你?解释任何分类器的预测。Ribeiro, Marco Tulio,Singh Sameer 和 Guestrin Carlos。《第 22 届 ACM SIGKDD 国际知识发现与数据挖掘会议论文集》,2016 年。
-
统一的模型预测解释方法。《神经信息处理系统进展》30。Lundberg, Scott M. 和 Lee Su-In(2017)
-
通过定量输入影响实现算法透明性:学习系统的理论与实验。2016 IEEE 安全与隐私研讨会(SP)。Datta, Anupam,Sen Shayak 和 Zick Yair。IEEE,2016 年。
-
通过特征贡献解释预测模型和个体预测。《知识与信息系统》41.3 (2014):647-665。Štrumbelj, Erik 和 Kononenko Igor。
-
贝叶斯网络,Pearl, Judea. (2011)
-
基于贝叶斯网络的学习教程。《贝叶斯网络的创新》(2008):33-82。Heckerman, David。
-
概率图模型:原理与技术。MIT Press,2009 年。Koller, Daphne 和 Friedman Nir。
-
统计中的因果推断:概述。统计调查 3:96-146。Pearl, Judea. (2009)
-
CausalNex 文档:
causalnex.readthedocs.io/en/latest/
-
DoWhy GitHub 仓库:
github.com/py-why/dowhy
-
介绍 AI 可解释性 360:
www.ibm.com/blogs/research/2019/08/ai-explainability-360/
第十章:道德与模型治理
本章提供了模型风险管理(MRM)的详细概述,并介绍了最佳的治理实践,以帮助组织降低成本并提高效率。本章的主要目标是通过确保遵循正确的模型指标,展示 MRM 技巧,同时使用来自模型和数据两个角度的工具,帮助我们培养正确的风险缓解和治理实践。你将学习如何设计和制定风险管理记分卡,以帮助防止企业损失额外的资金。
此外,本章还强调了正确的策略和对数据或模型变化模式的了解在识别模型风险方面的有效性。这使我们能够量化部署在生产中的模型及其在模型库存中的风险。本章还解释了如何更好地管理和共享大量运行多个实验的模型库存,以便团队间可以协作共享。
在本章中,以下主题将在接下来的章节中进行讲解:
-
模型风险 管理(MRM)
-
模型版本控制
-
特征存储简介
技术要求
本章要求你安装 Python 3.8,并安装以下内容:
-
pip
install wandb
-
从
docs.docker.com/desktop
安装 Docker -
git
clone
(github.com/VertaAI/modeldb.git
): -
docker-compose -f
docker-compose-all.yaml up
-
pip
install verta
-
pip
install feast
-
pip
install wandb
本章的代码可以在 GitHub 上找到:github.com/PacktPublishing/Designing-Models-for-Responsible-AI/tree/main/Chapter10
。
模型风险管理(MRM)
在本节中,我们首先讨论为什么有必要为模型中的风险开发一个具体的框架,这一框架最早由顶级机构和金融行业提出。这使得银行和保险公司能够对 MRM 施加额外的控制。然而,这一框架可以扩展并应用到其他行业(如零售、媒体和娱乐),这些行业由于每天发生大量交易,已广泛采用持续监控和模型重训练管道。尽管我们将审视来自金融行业的一个真实案例,组织和领导层应该努力在任何 AI 产品和服务中采纳这些建议,因为 AI 的指南、法律和法规变得越来越严格。
现在我们已经了解了模型库存风险管理的重要性,接下来简要看看模型库存如何管理。模型库存管理是 MRM 的一个子部分。让我们了解它的类型。
模型库存管理的类型
AWS 提供了生产模型的目录管理和版本控制,支持模型库存管理,详细信息见此。模型注册表将元数据与模型关联,包括其训练指标、所有者名称和批准状态:
-
分布式模型库存管理方法:该方法允许将模型文件和工件存储在它们生成所在的同一账户中。此外,模型会注册到与每个账户关联的 SageMaker 模型注册表中。因此,任何业务单元都可以拥有自己的机器学习测试账户进行用户验收测试(UAT),并允许将训练过程中生成的模型注册并保存在业务单元自己的 UAT/测试账户中。
-
集中式模型库存管理方法:该方法允许所有生成的模型与关联的推理 Docker 容器镜像一起存储在共享服务账户中。此外,通过模型包组启用版本管理。任何在生产账户中进行的生产部署/升级,都可以通过来自中央模型包库的Amazon 资源名称(ARN)来实现版本控制。
模型风险管理监管指南(SR 11-7)于 2011 年 4 月由美国联邦储备系统理事会发布。该文件阐述了模型风险的概念,并已成为行业标准。它列出了模型中存在的固定风险,以及由于基于错误或不当使用模型输出和报告的决策,在模型开发生命周期的任何阶段可能引发的不良后果。
该文件还强调了决策者理解模型局限性的重要性,并避免将模型用于其原本不适用的领域。随着模型风险的量化,欧洲银行管理局的监管审查与评估流程也应运而生,该流程规定应识别、映射、测试和审查模型风险,以便机构能够量化市场风险对资本的影响。同时,它还提供了在无法量化特定风险的实际资本金额时分配特定预算的灵活性。
在制定模型风险时,当局已经意识到在评估过程中考虑风险,以简化评估流程。当不同的操作风险因使用预测模型影响到企业时,需要采取措施,如下所述:
-
当组织或银行低估自身资金,使用监管批准的模型时,风险就会产生。内部评级基础法(IRB)模型在信用风险和资本充足性评估中尤为明显,便是这种情况的例子。
-
风险与缺乏知识以及在定价产品和评估金融工具时不当使用模型相关。
让我们看看 MRM 所能提供的潜在节省。
MRM 的成本节约
MRM 的主要目标是通过提高构建、验证和部署模型的操作和流程效率来降低成本并防止损失,其中无效的模型将被淘汰。除了成本降低之外,由于减少了不必要的资本缓冲和附加费用,还带来了资本改善。一个定义明确的 MRM 职能通常能增强监管者的信心,减少罚款,并避免不合规带来的支出。MRM 显著改善了盈亏(P&L),因为当解决了模型所有权分散的问题时,建模成本(以百万计)将大幅降低。复杂模型被替换,并增加了更具可解释性的版本,并将其分配给合适的业务单元。研究结果表明,一家全球银行在四年内额外花费了4400 万欧元,相比原本的700 万欧元(总计5100 万欧元),这显示出在模型上的资本预算花费几乎增长了七倍。得益于 MRM 框架,银行在现有模型环境中获得了信心,这有助于他们将模型投资与业务风险及其优先事项对齐,并减少盈亏波动。这不仅将重点放在模型的透明度上,还为他们提供了培养机构风险文化的方法。接着,成本节省释放了可以分配给高优先级决策模型的资源和资金。
明确定义和结构化的模型风险管理(MRM)方法的优势在于,它通过将机器学习开发成本降低20-30%,使得银行在面对模型不当使用的风险时更加谨慎,并使其将重点转向模型验证预算,以优化具有更高质量、一致性和韧性的模型库。另一个日益受到关注的重要因素是基于业务决策优先级的风险识别。在这里,我们可以看到模型风险分类技术(也称为分层技术)的出现,这种技术可以通过战略性地利用资源并建立强有力的治理,进一步提高速度和效率。
在金融行业,AI/ML 驱动的解决方案和自动化在管理与银行客户关系方面产生了巨大影响。投资组合管理和优化通过使用验证计划、流程和矩阵,已展示出为企业减少25%成本的效果,从而减少了低效性。通过自动化明确且重复的验证任务,测试和编码成本也显著节省了25%。例如,标准化测试和模型复制机制也已被引入。
图 10.1展示了模型风险的五大基石,具体如下:
-
模型定义
-
模型治理
-
模型验证
-
操作风险
-
模型校准
这些可以在下图中看到:
图 10.1 – MRM 框架的四大支柱
每个模型定义(包括已退役、新模型和现有模型)都存储在模型清单中。模型清单包含与其相关的所有术语,以便为利益相关者提供一个关于模型的高层次概览,包括模型的作用和局限性。模型清单存储所有在生产中运行的 ML 模型,并允许我们创建依赖关系树,展示它们如何相互作用。
因此,它有助于绘制出哪些模型具有最大固有风险,主要是由于潜在的级联故障。
模型清单包括模型名称和描述、开发阶段(当前在用、开发中或已退役)、高级风险评估、模型目标、关于模型的假设及其局限性、模型的使用量、使用背景和财务影响。模型清单通常会随着时间的推移而过时,因此,管理清单的最佳方式是将责任分配给云/DevOps 工程师,由其负责模型清单管理,并与模型所有者紧密协调,确保每个模型的文档是最新的。文档还提供了模型创建过程中的尽职调查证据,并详细说明了验证的结果。
模型治理涉及与政策、控制、版本、角色与责任、文档、度量过程、报告、通知、模型的深入细节、风险评级以证明模型目标、模型的目标和局限性及其对其他模型的依赖等相关的所有活动和细节。由于模型治理控制模型版本和角色变更,它还负责量化模型的风险聚合,以及连续发布的模型版本。此外,模型执行的所有活动也都属于模型治理的范围。因此,它包括与变更控制过程、主要挑战、供应商使用、利益相关者凭证、生命周期过程和法规解释相关的所有信息。SR 11-7 中可用的 MRM 策略的正式化建议银行应专注于“测试与分析,主要目标是促进 准确性”(www.afponline.org/ideas-inspiration/topics/articles/Details/model-governance-and-model-risk-management
)。
以下是建议的用于区分角色和责任的行动步骤:
-
建立第二道和第三道防线,与高级管理层、模型开发者和模型验证人员合作,确保团队组成有适当的文档记录。这是为了为负责内部模型治理和监督的委员会提供授权和报告线,即使随着 ML 模型的变化,团队也会发生变化。
-
模型所有者负责模型的开发、实施和使用。他们与高级管理层密切协调,以定义部署新模型的签字政策。
-
模型开发者按照模型所有者的指导创建和实施机器学习模型。
-
模型用户可以属于与业务对接的内部团队,或是需求和期望已经明确的外部团队。他们还可以参与模型的开发过程,以验证模型在训练过程中的假设。
-
绘制出你的组织架构,包括能够快速识别并缓解与模型不确定性和缺陷相关的性能问题的外部资源。
模型验证过程不仅涉及模型的性能指标,还包括与设计过程、使用的数据评估方法、模型测试和文档(实际记录的内容)相关的所有细节。这是一个审计步骤,确保模型的表现符合文档中提到的输入数据和过程。
在模型验证过程中,会将模型的使用程度与预期的模型用途进行对比,这有助于我们决定风险评级;其局限性使我们能够进一步调整并记录设计控制。在验证阶段,所有与编程过程、将模型纳入网络、测试实施标准、基准测试以及每个模型的错误处理过程相关的信息都会得到验证。
组织可以选择定义内部和外部验证流程,以确保模型在部署之前达到期望的性能基准。通过结合外部验证(由外部审计人员或独立方执行验证)和内部验证(由同一团队或部门执行验证),可以实现双方验证策略。尽管验证通常由内部团队进行,但监管机构要求进行外部验证。验证的目标是揭示偏差、极限情况或文档、模型构建或版本控制中的遗漏,找出未考虑的情况,而无需模型所有者的输入。
操作风险识别所有涉及运行模型基础设施测试、模型版本管理、执行不同测试策略以及重新训练或更新模型的步骤。它不仅量化了由于数据本身存在固有问题或模型对另一个模型的依赖而产生的风险,还突出显示了由于微服务、延迟以及分布式拒绝服务(DDoS)攻击对生产环境造成的风险。
模型校准 调整模型、模型的时机及建议模型需要重新训练和校准的特征,并衡量其可解释性与所需文档。此外,它还通过监控工具展示了模型重新校准的原因,例如数据和概念漂移。它处理模型跟踪方案,以便在发现模型偏离预期结果或模型误用时立即加以纠正。这需要使用持续的模型监控工具来检测和解决潜在问题,帮助保持模型的条件和性能一致且可重复,即使模型的输入或依赖发生任何变化。
现在,让我们看看一个组织如何在模型开发生命周期的后续阶段中演变其 MRM 框架。
MRM 的转型之旅
MRM 从起步到转型与差异化的旅程经历了三个不同的阶段。如图 10.2所示,MRM 设计框架包含以下几个阶段:
-
基础阶段:该阶段建立了 MRM 政策、模型库存、基本的模型工作流工具以及模型治理标准。
-
实施与执行的成熟阶段:MRM 框架在大规模应用于大量复杂的机器学习模型时得以实施。本阶段还需要利益相关者的培训,并实施自动化工作流工具,定义数据血缘、模型治理以及其生命周期中的其他控制和流程。
-
通过价值进行转型/差异化:这一阶段涉及在卓越中心内开展 MRM 的研究和开发,推动工业化验证、透明度、流程效率以及资源的优化使用。
图 10.2 – 将 MRM 实践化
现在我们已经了解了 MRM 框架及其增强方式,接下来让我们学习两个可以帮助模型风险分级的重要工具。本章中描述的大多数模型风险分级工具和技术都受到了模型风险分级:行业实践与 原则(www.risk.net/journal-of-risk-model-validation/6710566/model-risk-tiering-an-exploration-of-industry-practices-and-principles
)的启发和/或改编。
模型风险分级
模型风险分层,从绝对的角度来看,是对模型库存风险的抽象外部表现,能够识别并区分一个模型的使用风险与其他模型的风险。评估指标是业务中(特别是在银行)需要考虑的重要参数,能够确定并对比单一业务用例的模型风险,反映任何问题的严重性。这直接取决于我们如何评估模型库存并定义风险分类因素。它与业务的其他外部和内部因素、市场条件以及其他财务风险因素密切相关,这些因素根据模型的重要性排序。
例如,规模、复杂性、年度/季度收入以及涉及的资本量等因素在为组织各部门设计定制化的 MRM 框架时都起着重要作用。例如,一家资产为 10 亿美元的地区性银行,其客户互动、机器学习模型行为、风险敞口和复杂性,与一家资产为 1 万亿美元的大型银行有所不同。
如果考虑这些因素,有助于根据业务的目的平衡 MRM 的层级结构。这些以业务为驱动的需求促使将模型划分为高风险层级、中风险层级和低风险层级,并能在一个稳健的 MRM 框架中共存,无论是对于小型企业,还是大型和复杂企业。
一个模型风险分层工具有助于通过考虑模型对企业决策的影响和重要性,明确模型的实质性(即根据使用量、使用背景和财务影响来衡量模型风险)和复杂性。输出模型的决策和模型质量也起着重要作用。模型分层过程还通过根据模型度量的优先级标准(由业务方规定)定义模型的等级,帮助模型风险的优先级排序。
-
专家判断是设计一个分类工具的主要驱动力,该工具通过经验量化、评估和排序模型风险。它推动了工具的工作哲学,并由业务和功能决策驱动。
-
一个模型风险分层工具应该简单易用、透明,并通过广泛地对所有库存模型进行分类,提供一致、可靠且公正的结果。
-
它更侧重于模型的固有风险,而非模型的剩余风险。这里,固有风险指的是由于使用过时的模型验证技术、完全没有模型验证方法或未解决的问题所导致的模型风险和资本成本。模型的剩余风险则主要指的是当前模型与组织库存中其他模型相比的风险。
-
模型风险类别帮助数据相关方了解模型中存在的相对风险,以及工具标记的不同层级中,预测所带来的间接风险。
-
模型风险分层工具的设计过程应允许团队在组织内的不同业务单元和法务实体之间,强烈关联并链接模型中存在的相对风险。
-
模型风险分类设计过程应生成并解释与管理层预期和业务结果一致的结果。该工具应能够解释所有库存模型的结果,并根据不同的权重因素进行分析。
模型风险分层为组织带来显著好处,尤其是在关键利益相关者意识到不同层级的模型失败所导致的业务损失时。可能包括以下内容:
-
你可以评估和估算模型对当前(账面或市场)价值的影响。财务影响可以通过预测结果的单位(美元价值)以及被建模实体的单位(美元价值)进一步量化。
-
你可以考虑因模型错误(由输入特征的敏感性引起)而导致的潜在业务损失(例如,因需求变化而失去客户)。计算得到的风险指标通常能够揭示模型由于外部波动性所导致的敏感性。
-
你可以理解直接或间接消费预测结果的客户数量对建模实体的影响,或者被建模实体的数量。
-
你可以基于结果分析模型的依赖关系,并评估对业务的影响。
现在,让我们来看看不同类型的风险分类工具。
模型风险树
模型风险树(MRT),由 Mankotia 和 Joshi(2013 年)首次提出,如图 10.3所示,采用决策树方法进行分类,以评估模型使用的不同维度。这是一个双重过程,具有透明性,易于理解。它考虑了不同的暴露阈值来标记并分类模型为高风险、中等风险或低风险。
在树的第一层,维度评估模型是否量化风险、延迟、时机、价格或任何其他值——一个指定模型领域覆盖范围整体风险的指标。这为进一步的分类类别铺平了道路。回答“否”得出结论,模型属于低风险层级,而回答“是”则推动进入下一阶段。下一个评估指标尝试确定模型的使用维度,以判断模型是用于关键决策还是用于监管或财务报告。如果答案是“是”,则该模型被标记为高风险或中等风险层级,而“否”则将模型标记为低风险到中等风险层级。如果模型属于中等风险到高风险层级,则需要对相对于阈值的暴露水平进行测试。如果暴露水平较高,监管或财务决策模型将被归类为高风险,而暴露有限的相同类别模型则被标记为中等风险。未参与关键决策过程的模型将再次根据暴露水平进行测试,并被分类为低风险或中等风险。这种 MRT 完全依赖于判断输入,并且结果只有二元分类,没有空间容纳多于两种答案。
基于决策树的风险树面临的主要挑战之一是当涉及多级分类变量时,它会迅速使决策树变得非常复杂,导致其偏倚,且更难以表示和解释。它还未能充分区分模型的重要性(相关风险),这导致更多的模型被分配到更高的层级(聚类)。
图 10.3 – 模型风险分类
随着多变量的可视化表示变得越来越具有挑战性,解决这一问题的最佳方式是使用更简单的基于评分卡的方法,如图 10.4所示。
模型风险评分卡
图 10.4展示了一个有效地将模型分类为不同风险类别的模型风险评分卡(MRS)。该评分卡基于因子/元素方法原理,其中包含四个相关因子。因子可以通过单一元素表示,也可以通过多个元素表示:
-
值范围列包括可以作为模型输入的值的可能范围。其中一些变量直接从模型配置文件中获取,而另一些则是在预处理后获得。数据转换步骤帮助我们将变量转化为连续、离散或多个级别或类别。这些包括美元影响或暴露、使用模型的用户数量以及广泛的输入变量类型和数量。
-
权重列表示每个贡献因素(以黄色标注)对最终得分的相对重要性。通过将其量化为百分比,我们可以表示每个元素对整体评分结构(以粉色标注)的重要性。
-
有两个调整,其中之一是资本压力测试指标,在模型分类过程中起着重要作用。它解释了模型在特定类别中的存在,无论其得分如何,以及它对其他因素的影响。
-
MRM 调整是一种得分覆盖度量,它覆盖基础结果并允许将配置的值添加到基础度量中。在这个例子中,赋予 MRM 小组负责人灵活性的值已固定为总体可能值的 50%。
-
MRS 会生成一个计算的风险分数,以得出模型所属的最终风险类别。如在图 10.4的风险等级分配中所示,它还包含模型的当前风险评级。
分配预处理阈值边界的过程,以及某些元素、因素权重和总体风险评分分类阈值的重要性,反映在评估矩阵中。
图 10.4 – 模型评分矩阵
样本 MRS 将二元变量与多级分类变量混合使用。它还考虑了加权方案,帮助确定不同重要性的参数。MRS 有明显的优势,特别适用于那些希望在不同类别中包含多个分类变量的组织。MRS 具有清晰的表示风格,使得团队更容易解读计划并考虑使用错误模型的影响。
重要性因素得分衡量货币单位中的估计财务影响(范围从 1 到 4),而监管曝光因素得分则涵盖与 AI/ML 和财务报告相关的曝光因素(得分为 0 或 1)。操作因素得分对模型风险分级过程的总体贡献为 10%,其中 50%由最终用户计算(EUC)实施贡献(得分因素为 0 或 1),50%由用户数量(得分范围为 1 到 4)贡献,后者是一个多层次的分类变量。
计算此操作风险元素的总体值,以评估其对模型 1最终得分贡献的公式是:
(1 × 50% + 2/4 × 50%) × 10% = 7.5%
我们知道,调整前的总体得分是 100,而操作因素为模型 1(模型 1得分表中的第三行)贡献了 7.5 分。
计算该模型复杂度的总体得分的公式,复杂度会影响最终得分中的风险元素,对于模型 1的公式是:
(1 × 40% + 2/4 × 20%) × 30% = 15%
我们还可以看到,最终的模型层级记录在三种不同颜色(绿色、粉色和橙色)的高亮框中。模型 1得分为 69,已被归类为Tier 2,而模型 2得分为 66.5,已被归类为Tier 1,其中Tier 2的阈值设定为 48 分,Tier 1的阈值为 78 分。此外,模型 1和模型 2当前的风险级别分别记录为Tier 1和Tier 3。
我们还观察到有关模型 2和模型 3的例外情况。模型 2的整体评分为 66.5 分,这本应将其归类为Tier 2,但该模型被分配到了Tier 1。资本压力测试的覆盖度量设置为 1,这会自动将所有用于资本压力测试的模型分配到最上层类别,在我们的案例中即为最高风险层级。对于模型 3,整体得分为 22.5 + 8.75 + 3 = 34.75 分。MRM 团队的风险量化人员为其增加了 10 分,将得分提升到 44.75 分。然而,这个得分仍不足以影响最终的模型层级分配,因为它未达到 48 分的阈值。
在这个例子中,一个操作因素在解释模型失败风险方面起着明确的作用。它考虑了在受限环境中,模型给出意外结果时可能出现的问题,并探讨了生产环境中可能导致模型失败的因素。
模型风险校准
组织通常会把太多的模型归类为高风险,但这样做并不符合预期目的,也意味着 MRS 工具需要校准。校准的一种方法是保持模型的相对排名不变,从而最小化模型风险分配的变化。当风险层级的变化得到系统控制时,这减少了额外的工作,并使得可以在过程中使用已有的与风险相关的信息。校准通常是通过彻底的试错、对模型档案元素的迭代调整以及判断性过程来进行的,目的是对比、对照并评估不同风险类别中模型分布与库存的差异。
图 10.5 – 模型风险评分校准中的重要因素
在模型重新校准中,模型在各层级之间的变动被记录下来,导致这些变动的主要因素也被记录。一些因素,如图 10.5所示,包括单个模型在多种产品或应用中重用的程度;模型库存的综合总结,其中缺失的模型被放置在低风险层级;帮助对齐模型的层级特定 MRM 要求;以及由于监管压力或承受压力测试而应被分类为高风险的库存比例。经过与业务和模型拥有者的审查后,组织可能仍然需要设置覆盖规则,以便 MRS 尽可能谨慎地将模型分配到各层级。这个多层级分类过程有助于解释由于合规要求、财务影响或其他业务因素,与某些类型或某些用途的模型相关的影响因素。
在本节中,我们学习了与模型风险分层相关的重要概念。现在,让我们学习模型的适应性和韧性,它们为强大的 MRM 框架奠定基础。
模型版本控制
模型管理是跟踪机器学习模型临时构建的重要环节。它促进了机器学习模型版本的管理、存储和索引,帮助在共享、查询和分析过程中发挥作用。在管理模型时,重新运行建模工作流变得越来越昂贵,这会消耗大量的 CPU/GPU 处理能力。为了使模型结果持久化,开发和部署能够自动构建、跟踪和负责模型开发生命周期中模型管理任务的工具是至关重要的。
模型管理通过生成每个机器学习模型的洞察,结合真实的版本控制,帮助减少开发和跟踪的工作量:
-
数据科学家能够全面了解和洞察迄今为止构建的模型。
-
它帮助我们通过版本化模型的预测结果来巩固和推断重要信息。检查版本化模型的指标使数据科学家能够利用当前模型对业务的影响。
-
它帮助我们发现不同客户和市场细分的趋势与洞察,并加速跨模型的元分析。
-
索引过程使数据科学家能够快速搜索模型库,以识别特征的正确或不当使用。
-
它还促进了数据科学家之间的轻松协作。
现在,让我们讨论如何使用一种名为ModelDB的模型管理工具,在其本地环境中自动跟踪机器学习模型。
ModelDB
ModelDB 通过内置智能技术支持索引和模型探索,提供 SQL 查询和可视化界面。ModelDB 配备了不同的原生客户端学习环境(目前有spark.ml1
和scikit-learn2
),一个优化存储模型的存储层,以及一个基于 Web 的可视化界面,可以在多个模型之间进行元分析。它可以记录涉及预处理、训练和测试步骤的多阶段流水线,通过管理与元数据(如预处理步骤的参数和模型超参数)、质量指标(如 AUC 和准确度)以及每个模型的训练和测试数据相关的信息。
如图 10.6所示,ModelDB 有四个主要组件:适用于不同机器学习框架(如 Spark ML、scikit-learn 和 R)的原生客户端库,一个定义主要抽象的后台,作为存储层的中介访问器,以及一个用于可视化探索模型性能指标和元数据的 Web 用户界面。模型工件(数据样本、参数、属性、超参数、工件、模型指标以及所有涉及训练模型的元数据和参数的变更版本)通过 ModelDB 客户端提取,并通过 Thrift 接口存储在后台数据库中。
关系型数据库能够通过使用模型索引快速执行搜索操作,以检索模型工件。
图 10.6 – ModelDB 架构
所有模型和流水线都作为一系列动作存储,并通过一个分支模型来存储历史记录,以记录模型随时间发生的变化。后台的关系型数据库存储流水线信息,而一个自定义引擎则用于存储和索引模型。前端配备了一个易于导航的基于 Web 的可视化界面,允许进行模型和流水线的可视化探索和分析。我们来使用 ModelDB 进行一个实验:
-
要运行 ModelDB 实验,我们首先需要进行以下导入:
import joblib from verta import Client from verta.dataset import Path from sklearn import ensemble
-
接下来,我们连接到 ModelDB 客户端,设置第一次实验,启动实验编号和数据集版本,以便记录与之相关的所有结果。我们还加载了用于训练和测试的 scikit-learn 糖尿病数据集:
modeldb_client = Client("http://localhost:3000") proj = modeldb_client.set_project("Model Classification") expt = modeldb_client.set_experiment("ModelDB Experiment") run = modeldb_client.set_experiment_run("First Run") dataset = modeldb_client.set_dataset(name = "Diabetes Data") save_path = '/tmp/modeldb_model_artifacts/' dataset_version = dataset.create_version(Path(save_path)) run.log_dataset_version("v1", dataset_version) diabetes = datasets.load_diabetes() X, y = diabetes.data, diabetes.target
-
加载数据集后,我们运行
GradientBoostingRegressor
(来自集成模型库),并使用交叉验证执行网格搜索:reg_model = ensemble.GradientBoostingRegressor() cv = RepeatedStratifiedKFold(n_splits=2, n_repeats=3, random_state=1) grid_search = GridSearchCV(estimator=reg_model, param_grid=params, n_jobs=-1, cv=cv, scoring='r2',error_score=0) grid_result = grid_search.fit(X, y)
-
在下一步中,我们记录最佳模型得分、损失值以及使用网格搜索结果优化模型时使用的不同超参数:
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) run.log_metric("r2", grid_result.best_score_) means = grid_result.cv_results_['mean_test_score'] stds = grid_result.cv_results_['std_test_score'] params = grid_result.cv_results_['params'] i = 0 for mean, stdev, param in zip(means, stds, params): print("%f (%f) with: %r" % (mean, stdev, param)) run.log_observation("mean", mean) run.log_observation("stdev", stdev) param_dict = dict(param) param_dict['iter'] = str(i) i = i +1 run.log_observation("lr", param_dict['learning_rate']) run.log_observation("loss", param_dict['loss']) run.log_observation("maxdepth", param_dict['max_depth']) run.log_observation("minsamplesplit", param_dict['min_samples_split']) run.log_observation("nestimator", param_dict['n_estimators']) run.log_observation("iter", param_dict['iter']) grid_result.fit(X_train, y_train) y_pred = grid_result.predict(X_test) train_score = grid_result.score(X_train, y_train) test_score = grid_result.score(X_test, y_test) run.log_metric("Accuracy_train", train_score) run.log_metric("Accuracy_test", test_score)
-
在获得训练和测试指标后,我们将它们记录在 ModelDB 中。此外,我们还会记录最佳的超参数和实际的模型文件(保存为
joblib
格式):run.log_metric("mse", mse) run.log_hyperparameters(grid_result.best_params_) filename_2 = "simple_model_gbr_2.joblib" joblib.dump(grid_result, filename_2) run.log_model(save_path, filename_2) test_score = np.zeros((grid_result.best_params_["n_estimators"],), dtype=np.float64) best_model = grid_result.best_estimator_ print("test score shape", test_score.shape) for i, y_pred in enumerate(best_model.staged_predict(X_test)): test_score[i] = best_model.loss_(y_test, y_pred) run.log_observation("testscore", test_score[i])
-
我们可以绘制涉及的估计器与训练/测试得分的关系图(使用网格搜索结果返回的最佳参数)。该图会作为工件记录在 ModelDB 中:
fig = plt.figure(figsize=(6, 6)) plt.subplot(1, 1, 1) plt.title("Deviance") plt.plot(np.arange(grid_result.best_params_["n_estimators"]) + 1, best_model.train_score_, "b-", label="Training Set Deviance", ) plt.plot(np.arange(grid_result.best_params_["n_estimators"]) + 1, test_score, "r-", label="Test Set Deviance" ) plt.legend(loc="upper right") plt.xlabel("Boosting Iterations") plt.ylabel("Deviance") fig.tight_layout() plt.savefig(save_path + 'perf_gbr.png') run.log_artifact("perf_gbr", save_path + 'perf_gbr.png')
图 10.7 展示了 ModelDB 仪表板,识别模型的单个运行 ID,以及数据集版本、记录的工件、观察、指标和超参数:
图 10.7 – ModelDB 实验运行仪表板
以下图表帮助我们确定是否要研究随着训练轮次增加的任何模型指标:
图 10.8 – 随着训练轮次增加,ModelDB 仪表板上的性能指标
在理解了 ModelDB 的架构和使用方式后,让我们来学习一下权重与偏差(Weights & Biases),它是另一个非常流行的用于跟踪机器学习模型的工具。
权重与偏差(Weights & Biases)
权重与偏差(Weights & Biases)是 MLOps 中的另一个实验跟踪工具,帮助对传统和深度学习模型进行版本管理。
让我们通过一个例子来了解如何跟踪和可视化结果:
-
首先,我们导入库并提供登录密钥,该密钥可以通过
wandb.ai/authorize
创建:import wandb wandb.login(key='') #please specify our own login key
-
在下一步中,我们通过为神经网络提供随机丢弃率来初始化一些实验。随机率在初始化
wandb
运行时作为参数提供:for _ in range(5): wandb.init( project="pytorch-intro", config={ "epochs": 20, "batch_size": 64, "lr": 1e-3, "dropout": random.uniform(0.02, 0.90), }) config = wandb.config
-
在接下来的步骤中,我们通过定义损失函数和优化器来训练我们的模型:
model = get_model(config.dropout) loss_func = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=config.lr)example_ct = 0 step_ct = 0 for epoch in range(config.epochs): model.train() for step, (images, labels) in enumerate(train_dl): images, labels = images.to(device), labels.to(device) outputs = model(images) train_loss = loss_func(outputs, labels) optimizer.zero_grad() train_loss.backward() optimizer.step() example_ct += len(images) metrics = {"train/train_loss": train_loss, "train/epoch": (step + 1 + (n_steps_per_epoch * epoch)) / n_steps_per_epoch, "train/example_ct": example_ct} if step + 1 < n_steps_per_epoch: wandb.log(metrics) step_ct += 1 val_loss, accuracy = validate_model(model, valid_dl, loss_func, log_images=(epoch==(config.epochs-1)))
-
在最后一步,我们将训练和验证指标记录到
wandb
并结束wandb
运行:val_metrics = {"val/val_loss": val_loss, "val/val_accuracy": accuracy} wandb.log({**metrics, **val_metrics}) print(f"Train Loss: {train_loss:.3f}, Valid Loss: {val_loss:3f}, Accuracy: {accuracy:.2f}") wandb.summary['test_accuracy'] = 0.8 wandb.finish()
-
它生成了以下汇总表,如图 10.9所示,包含来自 MNIST 数据集的每个数字。该表格可以通过以下代码获得:
table = wandb.Table(columns=["image", "pred", "target"]+[f"score_{i}" for i in range(10)]) for img, pred, targ, prob in zip(images.to("cpu"), predicted.to("cpu"), labels.to("cpu"), probs.to("cpu")): table.add_data(wandb.Image(img[0].numpy()*255), pred, targ, *prob.numpy()) wandb.log({"predictions_table":table}, commit=False)
图 10.9 – wandb 跟踪数字 1-10 的预测概率
现在,所有模型实验都已经记录并通过 ModelDB 跟踪,模型的血缘信息可以得以维护。对于企业级 AI 应用程序,我们还可以借助数据血缘工具(如 Apache Atlas)建立级联血缘信息。
使用 Apache Atlas 的数据血缘
Atlas 可以与 Hive、Cassandra 及其他我们存储预测模型结果的数据库进行集成。Atlas 是一个可扩展的框架,满足 Hadoop 中的合规性要求,并与企业数据生态系统无缝集成。
Atlas 允许我们创建具有原始属性、复杂属性和对象引用的新类型的元数据。可以创建、组合和检索称为实体的实例类型,实体捕获元数据对象的详细信息及其关系。Atlas 提供了在动态创建分类时的极大灵活性,例如 PII
、EXPIRES_ON
、DATA_QUALITY
和 SENSITIVE
,并支持 EXPIRES_ON
分类中的 expiry_date
属性。
谱系和搜索/发现操作可以通过 REST API 使用 SQL 自由支持。Atlas 的所有功能都具有内嵌安全性,允许其实体与多个分类相关联,而不会导致数据泄露。图 10.10 显示了当输出表 ML_O
被创建为两个输入表的联合时,谱系图的样子,ML_O
表示为 (select * from ML_I2) UNION ALL (select * from ML_I1)
:
图 10.10 – 使用 Apache Atlas 的模型谱系
在这里,我们能够看到由两个输入表生成的输出表的谱系。接下来,让我们看看如何通过命令来执行相同的操作:
- 以下
curl
命令演示了谱系如何帮助定义一种结构,使得数据源可以被聚合,创建新的聚合源,检查源,或删除源。
lineage.json
中定义的 JSON 结构创建了两个输入 Hive 表,这些表可以组合成输出表:
curl -v -H 'Accept: application/json, text/plain, */*' -H 'Content-Type: application/json;charset=UTF-8' -u admin:admin -d @lineage.json
-
可以通过点击实体找到 GUID,发现所有实体后,调用 API 如下:
http://localhost:21000/api/atlas/entities
-
在谱系中创建的任何实体都可以通过以下方式删除:
curl -X DELETE -u admin:admin -H 'Content-Type: application/json; charset=UTF-8' 127.0.0.1:21000/api/atlas/entities?guid=febdc024-a3f8-4a66-be88-1e719c23db35
在检查了一些用于模型和数据治理的框架后,让我们简要了解特征库是什么,它们如何以可重用的方式连接数据和模型治理管道,从而在开发生产级 ML 模型时促进协作。
特征库简介
以数据驱动的组织,甚至是传统的组织,都已经意识到特征库在获取实时洞察中的作用和重要性。这些洞察对任何行业领域都非常有价值,因为它们传达了驱动业务的客户指标的有意义信息。这些洞察的实现得益于快速开发和使用预测微服务,能够处理批量数据和实时数据。云端可扩展特征库的主要目的是通过将业务利益相关者、架构师、数据科学家、大数据专业人士和分析专业人士汇聚到一个统一的基础构件下,节省精力和时间。这一特征库促进了数据、模型、特征、结果和报告的共享,从而实现了跨团队的协作,增强了模型部署生命周期。通过允许信息的重用、创建结构化文档、进行必要的版本分析和评估模型性能,特征库能够提升跨团队的协作效果。
特征库的主要目标是:
-
移除各个团队定制系统的开发和维护,转而鼓励跨部门的协调空间,支持任何类型的数据共享。
-
创建一个基于访问驱动的协作空间,便于发现和共享类似类型 ML 模型的特征。当数据来自相同的业务且预测面向相似的客户群体时,这可以节省时间、精力和构建新模型的开发成本。
-
通过利用现有的微服务,在可扩展的大数据系统中复用数据。
-
允许在微服务内部进行轻松集成和通信,具备更强的模型特征分析、再训练、度量比较、模型治理和可追溯性的能力,从而减少每一轮敏捷开发生命周期中所花费的时间。
-
便于轻松跟踪、版本控制和重新训练具有季节性特征的模型,而无需重复进行特征工程和模型训练时涉及的非线性/指数成本。
-
通过设置警报和触发器,跟踪模型训练中特征的添加和/或删除。
-
基于传入的新数据推导特征和洞察,这些数据可以用来推算特征、预计算并自动填充特征。这包括在线计算和离线聚合,以确保训练和服务之间的一致性。
-
确保个人身份信息(PII)的隐私和机密性(无论是在数据库、缓存还是磁盘中),并通过衡量隐私和公平度指标,以及预测模型的可解释性,确保遵循伦理特征存储设计。
现在,让我们通过图 10.11来说明 Comcast 开发的特征存储框架:
图 10.11 – 在线与离线特征存储
如图 10.11所示的特征存储架构允许对流数据和按需特征进行持续的特征聚合。它可以帮助数据科学家复用版本化特征,上传在线(实时)/流数据,并按模型查看特征度量。特征存储是一个动态灵活的单元,能够支持多个可插拔单元。传入特征组装的负载(一个包含模型执行所需特征的仓库,其中包含模型名称和账户号)会被加入,使得特征存储能够持续刷新新数据和新特征,基于模型度量进行再训练,并验证伦理性与合规性。模型的元数据可以解释哪些特征对于哪些团队是必要的,并显著有助于推导模型的洞察。
内置的模型仓库(如图 10.12所示)包含与数据预处理(归一化和缩放)相关的工件,展示了执行模型所需特征的映射。该架构使用 Spark 在 Alluxio 上构建(Alluxio 是一个开源的数据编排层,将数据带到计算近处,以支持云中大数据和 AI/ML 工作负载),并结合了 S3、HDFS、RDBMS、Kafka 和 Kinesis。
这种特征存储可以为组织提供可扩展的、容错的、分布式的功能,帮助共享、处理、追踪和存储用例、模型、特征、模型与特征的映射、版本化模型和数据集。当与定义良好的编排服务(如 Kubeflow)集成时,它可以使模型部署容器、预测/结果接收器、容器仓库和 Git 集成数据、代码和运行时工件,以实现 CI/CD 集成。
图 10.12 – 在线和流数据的特征存储中的特征处理
现在,让我们通过示例代码来看如何从特征存储中检索历史数据并训练模型。在这里,我们使用了 Google 的特征存储 Feast,以及来自 BigQuery 数据集 feast_driver_ranking_tutorial
的司机排名数据:
-
在初始步骤中,我们导入必要的 Python 库,并从磁盘加载司机订单数据:
import feast from joblib import dump import pandas as pd from sklearn.linear_model import LinearRegression orders = pd.read_csv("/content/feast-driver-ranking-tutorial/driver_orders.csv", sep="\t") orders["event_timestamp"] = pd.to_datetime(orders["event_timestamp"])
-
在下一步,我们连接到特征存储提供商并从 BigQuery 检索训练数据:
fs = feast.FeatureStore(repo_path="/content/feast-driver-ranking-tutorial/driver_ranking") training_df = fs.get_historical_features( entity_df=orders, feature_refs=[ "driver_hourly_stats:conv_rate", "driver_hourly_stats:acc_rate", "driver_hourly_stats:avg_daily_trips", ], ).to_df() print("----- Feature schema -----\n") print(training_df.info)
这将输出以下结果:
图 10.13 – 使用特征存储进行历史数据检索
-
现在,我们使用以下代码片段来训练并保存我们的模型:
target = "trip_completed" reg = LinearRegression() train_X = training_df[training_df.columns.drop(target).drop("event_timestamp")] train_Y = training_df.loc[:, target] reg.fit(train_X[sorted(train_X)], train_Y) dump(reg, "driver_model.bin")
-
训练后,我们需要通过以下命令将在线存储物化到 Firestore 中,数据科学家负责访问特征存储并选择将更新到在线存储的日期:
!cd /content/feast-driver-ranking-tutorial/driver_ranking/ && feast materialize-incremental 2022-01-01T00:00:00
这将输出以下结果:
图 10.14 – 将数据保存到在线特征存储
-
在最后一步,我们再次选择相同的特征存储来进行预测,并选择最佳的司机:
self.fs = feast.FeatureStore(repo_path="/content/feast-driver-ranking-tutorial/driver_ranking/") # Read features from Feast driver_features = self.fs.get_online_features( entity_rows=[{"driver_id": driver_id} for driver_id in driver_ids], features=[ "driver_hourly_stats:conv_rate", "driver_hourly_stats:acc_rate", "driver_hourly_stats:avg_daily_trips", ], ) df = pd.DataFrame.from_dict(driver_features.to_dict()) df["prediction"] = reg.predict(df[sorted(df)]) best_driver_id = df["driver_id"].iloc[df["prediction"].argmax()]
在这个示例中,我们学习了在线特征存储如何在训练和预测任务中发挥作用。在 第十三章 中,我们将进一步了解如何使用特征存储的高级概念,促进团队间的合作并推动可持续的训练。
总结
本章中,我们学习了 MRM 指导方针以及组织如何使用这些指导方针节省成本。我们探讨了通过研究与 MRM 相关的不同概念(如模型风险分层、MRT、MRS 和模型风险校准)来减轻业务损失的过程、功能和清单。我们还了解了如何确保正确的目标、假设、限制、量级、政策、控制、角色与职责、文档、测量程序、报告、通知、风险量化和评估方法得以实施。 本章还深入探讨了如何监控模型指标以及理解为什么这很重要,因为模型会受到漂移和模型重训练的影响。
在本章的结尾,我们还学习了特征库。在下一章,我们将学习更多与模型漂移和模型校准相关的详细概念。
进一步阅读
-
模型风险 管理 的演变:
www.mckinsey.com/business-functions/risk-and-resilience/our-insights/the-evolution-of-model-risk-management
-
模型风险分层:行业实践与 原则 的探索:
www.risk.net/journal-of-risk-model-validation/6710566/model-risk-tiering-an-exploration-of-industry-practices-and-principles
-
模型治理与模型风险 管理:
www.afponline.org/ideas-inspiration/topics/articles/Details/model-governance-and-model-risk-management/
-
ModelDB:机器学习模型 管理 系统:
cs.stanford.edu/~matei/papers/2016/hilda_modeldb.pdf
-
Weights & Biases:
github.com/wandb/wandb
第四部分:实施组织战略、最佳实践和应用案例
本部分提供了组织战略、可持续技术和最佳实践的全面概述,这些都是为了适应伦理 AI 在组织和政府大规模采用而应采纳的。本部分强调了如何设计稳健的机器学习模型,使其能够适应输入数据的各种变化。还介绍了不同专家小组和工作组织的倡议和行动计划,用于衡量和量化 AI 解决方案对客户、国家或环境可能产生的负面影响。此外,本部分还突出了实际的行业广泛应用案例,旨在加速伦理 AI 解决方案的使用,无论解决方案的规模和大小如何。
本部分由以下章节组成:
-
第十一章,模型适应性的伦理问题
-
第十二章,构建可持续的企业级 AI 平台
-
第十三章,可持续模型生命周期管理、特征库和模型校准
-
第十四章,行业广泛应用案例
第十一章:模型适应性的伦理
本章详细介绍了如何在组织中为模型治理目的检测不同类型的模型漂移。本章的主要目标是展示机器学习(ML)模型的变异,通过多个示例让你意识到检测数据变化和模型指标变动所需的不同统计量的重要性。这将帮助数据科学家和 MLOps 专业人员选择合适的漂移检测机制,并遵循正确的模型指标性能阈值,以控制由于错误预测带来的风险。你将学会如何量化和解释模型漂移,并解答与模型校准需求相关的问题。这还将使你能够理解设计合理校准模型的范围。
本章将覆盖以下内容:
-
数据和模型漂移的适应性框架
-
如何解释在漂移或校准条件下的机器学习模型
-
理解模型校准的必要性
技术要求
本章要求你使用 Python 3.8 并在开始之前运行以下命令:
-
pip
install
alibi-detect
-
pip
install
river
-
pip
install
detecta
-
pip install nannyml (``dependency numpy==1.21.0)
-
git
clone
github.com/zelros/cinnamon.git
-
python3
setup.py install
-
git
clone
github.com/Western-OC2-Lab/PWPAE-Concept-Drift-Detection-and-Adaptation.git
安装步骤中提到的alibi-detect
包可以在 GitHub 上找到。作为参考,你可以在github.com/SeldonIO/alibi-detect
查看该项目的更多细节。
数据和模型漂移的适应性框架
数据处理取决于数据访问的方式,基于其可用性,无论是顺序数据还是连续数据。随着不同模式的输入数据处理和建模技术的建立,各种因素(内部和外部)会导致数据分布发生动态变化。这种变化被称为概念漂移,它对生产中的机器学习模型构成了若干威胁。在概念漂移术语中,关于数据分布的变化,窗口一词用来指代用于训练当前或最近预测器的最新已知概念。
概念漂移的例子可以在电子商务系统中看到,其中机器学习算法分析用户的购物模式,并提供个性化的相关产品推荐。导致概念漂移的因素包括婚姻、搬迁到不同地理区域等事件。COVID-19 疫情导致了消费者购买行为的剧烈变化,因为人们被迫转向电子商务平台进行在线购物。这导致了对产品的需求远高于预期,从而在供应链网络中的需求预测中产生了高错误率。电子商务、供应链和银行行业已经经历了数据模式的变化,导致模型漂移。
图 11.1 – 四种概念漂移类型
如图 11.1所示,概念漂移有四种类型,可能由各种内部或外部因素,甚至是对抗性活动引起:
-
突变:由行为变化引起
-
增量:突发变化,具有较慢的衰减
-
重现:类似于季节性趋势
-
渐变:缓慢、长期的变化
其他间接因素,如学习速度、报告正确特征(或度量单位)时的错误,以及分类或预测准确性的巨大变化,也可能导致概念漂移。图 11.2中进行了说明。为了解决概念漂移,我们需要更新导致漂移的模型。这可能是盲目更新或使用加权数据训练、模型集成、增量模型更新,或者应用在线学习模式。
图 11.2 – 漂移因素和补救措施的不同类型
我们根据数据到达模式(批处理或在线)对概念漂移检测器(如图 11.3所示)进行分类。批处理检测技术可以进一步分为全批次检测和部分批次检测技术。批次的大小和样本是将其分类为全批次或部分批次检测的两个因素。在线检测器则根据其调整参考窗口的能力来检测漂移。检测窗口通常是一个滑动窗口,随着新的实例到来而移动,通常被称为当前概念。然而,也有使用固定参考窗口来检测概念漂移的情况。
在线检测器通过评估前W个数据点计算的测试统计量来工作,然后更新测试统计量。更新可以以较低的成本按顺序进行,从而帮助我们检测测试统计量是否超出阈值。超过阈值的值表示已经发生了漂移。
图 11.3 – 常用的漂移检测器
图 11.3展示了无监督批量基础(固定窗口)和基于在线(固定和滑动窗口)漂移检测技术的概念,这些方法在必要的数据分布比较和显著性测试后,用来检测是否存在漂移。批量方法可能需要在批次上进行实例选择和统计计算,以确认漂移条件的测试,从而推断是否发生了漂移。这里的数字表示检测在线和离线漂移所需的步骤顺序。
图 11.4 – 在线和批量漂移检测方法
一个在线漂移自适应框架的例子是性能加权概率平均集成(PWPAE)框架,能够在 IoT 异常检测应用场景中有效使用。
该框架可以部署在 IoT 云服务器上,利用来自 IoT 设备的无线媒介处理大数据流。这个集成自适应漂移检测器由四个基础学习器组成,帮助进行实时漂移检测:
-
一个带有ADWIN 漂移检测器的自适应随机森林(ARF)模型(简称ARF-ADWIN)
-
一个带有DDM 漂移检测器的 ARF 模型(简称ARF-DDM)
-
一个带有ADWIN 漂移检测器的流随机补丁(SRP)模型(简称SRP-ADWIN)
-
一个带有DDM 漂移检测器的 SRP 模型(简称SRP-DDM)
四个基础在线学习器通过根据它们的准确性和分类概率加权组合在一起。让我们在 CICIDS2017(www.unb.ca/cic/datasets/ids-2017.html
)模拟入侵检测数据集上尝试 PWPAE 框架,该数据集包含良性和近期常见的攻击,类似于真实世界的例子:
-
为了运行 PWPAE,让我们首先从
river
包中导入必要的模块:from river import metrics from river import stream from river import tree,neighbors,naive_bayes,ensemble,linear_model from river.drift import DDM, ADWIN
-
然后,我们使用
X_train
和y_train
设置 PWPAE 模型进行训练,并在X_test
和y_test
上进行测试。以下代码片段展示了如何使用 PWPAE 模型:name = "Proposed PWPAE model" t, m = PWPAE(X_train, y_train, X_test, y_test) acc_fig(t, m, name)
训练结果和比较输出在图 11.5中进行了可视化。
图 11.5 – PWPAE 与 Hoeffding 树(HT)和提升袋装(LB)模型的性能结果
PWPAE 的准确率为 99.06%,超越了其他模型的准确率。
让我们研究一些有监督的漂移检测策略,其中可以获得实际的预测反馈,并与预测结果一起使用,以产生误差指标。
统计方法
统计方法帮助我们比较和评估两种不同的分布。散度因子或距离度量可以用来衡量两种分布在不同时间点的差异,以了解它们的行为。这有助于及时检测模型的性能指标,并找出导致变化的特征。
库尔巴克–莱布勒散度
库尔巴克–莱布勒(KL)散度,也通常称为相对熵,量化了一个概率分布与另一个概率分布之间的差异。数学上,它可以表示为以下公式:
Q 是旧数据的分布,P 是新数据的分布,我们为此计算散度,|| 表示散度。当 P(x)很高而 Q(x)很低时,散度会很高。另一方面,如果 P(x)较低而 Q(x)较高,散度会很高,但不会太高。当 P(x)和 Q(x)相似时,散度会很低。以下代码为一个均值为 5,标准差为 4 的(P,Q,M)分布生成一个 KL 散度图:
x = np.arange(-10, 10, 0.001)
q = norm.pdf(x, 5, 4)
plt.title('KL(P||Q) = %1.3f' % kl_divergence(p, q))
plt.plot(x, p)
plt.plot(x, q, c='red')
由于 KL 散度导致的分布模式变化在图 11.6中有所展示:
图 11.6 – KL 散度
还有更多形式的散度,接下来我们将讨论这些。
詹森–香农散度
詹森–香农(JS)散度使用 KL 散度,并可以通过以下数学公式表示:
KL 散度与 JS 散度之间的一个区别是,JS 散度是对称的,并且具有强制性的有限值。由于 JS 散度导致的分布模式变化在图 11.7中有所展示:
图 11.7 – JS 散度
为了计算 JS 和 KL 散度,我们运行以下代码片段:
-
首先,我们为分布 1 创建一个正态分布:
data1 = scipy.stats.norm.rvs(size=100000, loc=0, scale=1.5, random_state=123) hist1 = np.histogram(data1, bins=100) hist1_dist = scipy.stats.rv_histogram(hist1) import matplotlib.pyplot as plt X1 = np.linspace(-8.0, -2.0, 1000) plt.title("PDF") plt.hist(data1, density=True, bins=100, color ='blue') plt.plot(X1, hist1_dist.pdf(X1), label='PDF', color = 'blue')
-
接下来,我们创建另一个正态分布,这就是我们的第二个分布:
data2 = scipy.stats.norm.rvs(size=100000, loc=0, scale=5.5, random_state=123) hist2 = np.histogram(data2, bins=100) hist2_dist = scipy.stats.rv_histogram(hist2) X2 = np.linspace(4.0, 8.0, 1000) plt.title("Probability Density Function") plt.hist(data2, density=True, bins=100, color ='green') plt.plot(X2, hist2_dist.pdf(X2), label='PDF', color = 'green') plt.legend(['X1', 'X2'])
-
在下一步中,我们首先评估概率分布 1 与
Y1
和Y2
的均值之间的 KL 散度,同样地,我们也评估概率分布 2:Y1 = hist1_dist.pdf(X1) Y2 = hist2_dist.pdf(X2) M = (Y1 + Y2) / 2 d1 = scipy.stats.entropy(Y1, M, base=2) print("KL div Y1 and M", d1) d2 = scipy.stats.entropy(Y2, M, base=2) print("KL div Y2 and M", d2)
-
上一步的输出如下所示:
KL div X1 and X2 0.21658815880427068 KL div Y1 and M 1.0684247605300703 KL div Y2 and M 0.1571132219534354
-
在下一步中,我们首先评估分布之间的 JS 散度,也评估每个分布内部的 JS 散度:
js_dv = (d1 + d2) / 2 js_distance = np.sqrt(js_dv) print("JS Dist d1 and d2", js_distance)
我们将其与 SciPy 计算的分布之间的 JS 散度进行比较:
js_distance_scipy = scipy.spatial.distance.jensenshannon(Y1, Y2)
print("JS Dist d1 and d2 of Scipy", js_distance_scipy)
js_distance_scipy = scipy.spatial.distance.jensenshannon(X1, X2)
print("JS Dist X1 and X2 of Scipy", js_distance_scipy)
dx1 = scipy.stats.entropy(Y1, X1, base=2)
dx2 = scipy.stats.entropy(Y2, X2, base=2)
js_dv = (dx1 + dx2) / 2
print("JS Div X1 and X2", js_dv)
上述步骤的输出如下所示:
JS Dist d1 and d2 0.7827956254615587
JS Dist d1 and d2 of Scipy 0.6037262820103958
JS Dist X1 and X2 of Scipy 0.1941318696014193
JS Div X1 and X2 1.3749093686870903
第一个距离给出了对称的 JS 散度,而第二个评估的度量给出了 JS 距离,这是 JS 散度的平方根。评估出的第三个和第四个距离度量分别给出了 X1
、X2
和 dx1
、dx2
之间的 JS 距离。这里的 dx1
和 dx2
表示从 Y1
、X1
和 Y2
、X2
分布中生成的熵。
科尔莫哥罗夫–斯米尔诺夫检验
两样本Kolmogorov-Smirnov(KS)检验是一种常用的非参数方法,用于区分两个样本。通过 KS 检验识别的数据变化模式如图 11.8所示。累积分布函数(CDF)表示在样本中低于x的观察值的百分比。这可以通过以下步骤获得:
-
对样本进行排序
-
计算样本内观察值的数量是否小于或等于x
-
将步骤 2 中计算的分子除以样本上的总观察值数量
漂移检测器的目的是在两个分布函数观察到变化时,检测漂移模式,这会导致两个样本形态的变化:
图 11.8 – KS 检验
人口稳定性指数
人口稳定性指数(PSI)是一种监测和衡量两个样本或两个时间段之间人口行为变化的指标。它作为一个风险评分卡指标,用于提供一个时间外验证样本与建模样本之间的风险估计,包括依赖变量和独立变量。PSI 的应用还可以扩展到社会人口学研究中比较两个或更多人口的教育、收入和健康状况。
模型蒸馏是一种技术,它允许将知识从一个大网络转移到一个小网络,该小网络在简化架构上使用从原始模型提取的软目标(输出分布或 logits)训练第二个模型。这为通过比较原始模型和蒸馏模型的输出分布来检测对抗性和恶意数据以及数据漂移铺平了道路。
现在让我们通过一个例子,看看如何在漂移检测的背景下通过模型蒸馏检测器检测对抗得分。KS 检验已被用作评分函数,以便在参考批次和测试数据的对抗得分之间进行简单的一维检验。较高的对抗得分表示有害的漂移,并为恶意数据漂移设置标志。在这里,我们可以从 Google Cloud 桶中提取预训练的模型蒸馏检测器,或者从头开始训练一个:
-
首先,我们从
alibi_detect
导入必要的包:from alibi_detect.cd import KSDrift from alibi_detect.ad import ModelDistillation from alibi_detect.models.tensorflow.resnet import scale_by_instance from alibi_detect.utils.fetching import fetch_tf_model, fetch_detector from alibi_detect.utils.tensorflow.prediction import predict_batch from alibi_detect.utils.saving import save_detector from alibi_detect.datasets import fetch_cifar10c, corruption_types_cifar10c
-
然后,我们定义并训练蒸馏模型:
from tensorflow.keras.layers import Conv2D, Dense, Flatten, InputLayer from tensorflow.keras.regularizers import l1 def distilled_model_cifar10(clf, nb_conv_layers=8, distl_model_filters1=256, nb_dense=40, kernel1=8, kernel2=8, kernel3=8, ae_arch=False): distl_model_filters1 = int(distl_model_filters1) distl_model_filters2 = int(distl_model_filters1 / 2) distl_model_filters3 = int(distl_model_filters1 / 4) layers = [InputLayer(input_shape=(64, 64, 3)), Conv2D(distl_model_filters1, kernel1, strides=2, padding='same')] if nb_conv_layers > 2: layers.append(Conv2D(distl_model_filters2, kernel2, strides=2, padding='same', activation=tf.nn.relu, kernel_regularizer=l1(1e-5))) if nb_conv_layers > 2: layers.append(Conv2D(distl_model_filters3, kernel3, strides=2, padding='same', activation=tf.nn.relu, kernel_regularizer=l1(1e-5))) layers.append(Flatten()) layers.append(Dense(nb_dense)) layers.append(Dense(clf.output_shape[1], activation='softmax')) distilled_model = tf.keras.Sequential(layers) return distilled_model
-
接下来,根据我们的配置,我们可以选择加载一个预训练模型或训练一个新模型:
load_pretrained = True detector_type = 'adversarial' detector_name = 'model_distillation' filepath = os.path.join(filepath, detector_name) if load_pretrained: ad = fetch_detector(filepath, detector_type, dataset, detector_name, model=model) else: distilled_model = distilled_model_cifar10(clf) print(distilled_model.summary()) ad = ModelDistillation(distilled_model=distilled_model, model=clf) ad.fit(X_train, epochs=50, batch_size=128, verbose=True) save_detector(ad, filepath)
-
我们现在绘制每个严重程度级别的平均得分和标准差。我们将模型准确性图定义为有害和无害得分的均值和标准差:
def evaluate_plot_model_accuracy(): mu_noharm, std_noharm = [], [] mu_harm, std_harm = [], [] acc = [clf_accuracy['original']] for k, v in score_drift.items(): mu_noharm.append(v['noharm'].mean()) std_noharm.append(v['noharm'].std()) mu_harm.append(v['harm'].mean()) std_harm.append(v['harm'].std()) acc.append(v['acc'])
图表(见图 11.9)展示了不同数据损坏严重度等级下的平均危害评分(从左侧开始的折线图)和 ResNet-32 准确率(右侧显示的柱状图)。级别 0 对应原始测试集。我们展示了不同恶意(损坏)数据及其严重度对模型的影响。
危害评分表示由于数据损坏而给出错误预测的实例。即使是无害的预测也存在,这些预测(如Y轴上标注为黄色的危害指数所示)在数据损坏后保持不变,这是由于恶意对抗样本的注入。进一步总结,我们可以在图 11.9中看到,随着危害评分的增加(由青色柱状图表示),损坏严重度加剧,准确率下降(由蓝色折线表示)。
图 11.9 – 提取型漂移检测器检测数据损坏严重度
还有一些其他方法可以归类为上下文方法。
上下文方法
这些方法的目的是比较并评估训练集与测试集之间的差异,并在预测结果存在显著差异时评估漂移情况。
树的特征
该方法允许你基于数据和预测时间戳训练一个简单的树模型,时间戳作为独立输入特征之一,与其他特征一起使用。通过分析树模型的特征重要性,显而易见,不同时间点的数据对模型的影响有助于揭示由概念漂移引起的差异。树的分裂以及基于时间戳的特征分裂,有助于解释漂移带来的变化。
洗牌与重采样(SR)
数据在假定的漂移点处被分为训练集和测试集,然后使用训练集训练模型,并通过测试集评估模型的错误率。通过洗牌相同的数据集并重新计算错误度量,重复相同的训练和测试机制。当天订单数据的错误率与洗牌数据的平均错误率之间的差异超过指定阈值时,认为检测到了漂移。这也是一个计算密集型机制,因为它涉及在漂移发生时训练多个模型。
统计过程控制
这种漂移检测器控制机制确保当生产中的模型随着时间产生变化的准确度指标时,模型的误差能够得到管理。尽管这种方法在短时间内有效检测到突发性、渐进性和增量性的漂移,但提取样本标签时可能存在较高的延迟。要求有标签数据的限制使得该方法更难以广泛应用。
漂移检测方法(DDM)
这种漂移检测方法是最早设计的方法之一。假设输入数据呈现二项分布,且伯努利试验变量(或单一数据点)根据预测误差率推断漂移的发生。
该算法记录最小误差概率(p)率和二项分布的最小标准差(s),当p + s达到其最小值时。若p + s的值超过最小误差概率(pmin)与最小标准差的倍数(smin)的和,则认为存在漂移。我们可以表示为(p + s)>(pmin + 3 ✶ smin)。
推荐的乘数因子是 3。当变化发生缓慢时,该方法有局限性,此时缓存/内存可能会溢出。
早期漂移检测方法(EDDM)
这种方法虽然与 DDM 类似,但通过计算两个误差之间的均值(m)和标准差(s)来关注渐进式漂移。它记录(m + 2 ✶ s),当该值达到最大值时,会将这两个值分别保存为 mmax 和 smax。当比率(m + 2 ✶ s)/(m + 2 ✶ smax)低于阈值(β;推荐值为 0.9)时,漂移被检测到,并应触发警报。
CUSUM 和 Page-Hinkley
累积和(CUSUM)及其变种Page-Hinkley(PH)都依赖于顺序分析技术,通常基于平均高斯信号。这些方法通过检测当观察值与均值之间的差异超过用户定义的阈值时发出警报。由于这些变化对参数值敏感,这种方法的一个缺点是可能会触发误报。这些方法可以广泛应用于数据流。
CUSUM
该漂移检测算法使用 CUSUM 检测均值的微小变化。当变化前后的概率分布已知时,CUSUM 过程通过考虑延迟和误报频率来优化目标函数。它具有额外的优点,即在最大似然的解释上简单直观。它是无记忆的、单侧的和不对称的,只能检测观察值与均值之间差异的增加。
CUSUM 检测器是一种基于核的方法,持续比较数据库中的样本。漂移判断的指标叫做最大均值差异(MMD)。该程序非常适合大数据量,因为它无需比较变化前后的分布,而是集中于当前数据来识别漂移。CUSUM 已经被增强,使用嵌套滑动窗口的双均值方法,这被称为基于数据流的双 CUSUM(DCUSUM-DS)。CUSUM 的另一个变体是 DCUSUM-DS,它使用双均值的 CUSUM。DCUSUM-DS 算法在嵌套滑动窗口中工作,通过两次计算窗口内数据的平均值来检测漂移。检测到平均值后,它提取新特征,然后生成累积和受控图表,以避免虚假推断。这种方法的一个主要优点是,它可以检测到新特征并重新运行分析,以确保正确检测漂移,而不仅仅依赖于检测到的平均值。
CUSUM 的基于核的变体不需要变化前后的分布,而是依赖于变化前分布中的样本数据库,利用该数据库与进入的观察样本进行持续比较。用户选择的核函数和比较的统计指标是 MMD。核累积和(KCUSUM)算法在拥有大量背景数据的情况下效果良好,尤其是在需要检测与背景数据偏差的情况下。
该算法可以配置一个阈值,设置超过该阈值时触发警报。漂移阈值的大小(例如,80%、50%或 30%)帮助我们获得识别漂移的正确指标。因此,当数据或模型模式出现任何偏差时,需要触发警报。例如,算法可以设置为非常大的幅度,并且 80%的阈值边界将使其比设置为 30%时更频繁地检测到漂移。检测器返回以下值:
-
ta
:变化检测指标 —— 返回值表示报警时间(检测到变化时的索引) -
tai
:变化的起始索引 —— 显示变化开始时的索引 -
taf
:变化的结束索引 —— 表示变化结束时的索引(如果ending
为True
) -
amp
:表示变化的幅度(如果ending
为True
)
配置参数的一种方法是从一个非常大的threshold
值开始,并将drift
设置为预期变化的一半。我们还可以调整drift
,使得g
有超过 50%的时间为0
。然后,我们可以微调threshold
,以便获得所需的虚假警报或延迟检测漂移的数量。为了更快地检测漂移,我们需要减小drift
,而为了减少虚假警报并最小化小变化的影响,我们需要增大drift
。
以下代码片段演示了如何使用 CUSUM 漂移探测器:
from detecta import detect_cusum
x = np.random.randn(500)/5
x[200:300] += np.arange(0, 4, 4/100)
ta, tai, taf, amp = detect_cusum(x, 4, .025, True, True)
x = np.random.randn(500)
x[200:300] += 6
detect_cusum(x, 3, 1.5, True, True)
x = 2*np.sin(2*np.pi*np.arange(0, 2.8, .01))
ta, tai, taf, amp = detect_cusum(x, 1.8, .05, True, True)
前面的代码能够检测出不同数据区间之间的漂移,通过漂移百分比、阈值和变化实例的数量来进行说明。
图 11.10 – CUSUM 漂移探测器变化检测
这里使用的基于阈值的漂移检测技术展示了(图 11.10)在检测漂移时,CUSUM 对正负变化的作用。
协变量和先验概率数据漂移
协变量漂移是由于内部或外部因素引起的一个或多个独立特征的分布发生变化,但输入X和目标Y之间的关系保持不变。当协变量数据漂移时,输入特征X的分布发生变化,而在先验概率变化下,输入变量的分布保持不变,但目标变量的分布发生变化。目标分布的变化导致了先验概率数据漂移。为了实现协变量漂移,我们将一个正态分布的均值进行偏移。
该模型现在正在新区域的特征空间中进行测试,导致模型错误分类新的测试观测。在没有真实测试标签的情况下,无法衡量模型的准确性。在这种情况下,漂移探测器可以帮助检测是否发生了协变量漂移或先验概率漂移。如果是后者,可以通过在参考集的标签上初始化探测器来监控先验漂移的代理,然后将其输入到模型的预测标签中,以识别漂移。
以下步骤展示了如何通过与初始数据集上训练的原始模型进行比较来检测数据漂移:
-
首先,我们采用多变量正态分布,然后指定参考数据以初始化探测器:
shift_norm_0 = multivariate_normal([2, -4], np.eye(2)*sigma**2) X_0 = shift_norm_0.rvs(size=int(N_test*phi1),random_state=2) X_1 = ref_norm_1.rvs(size=int(N_test*phi2),random_state=2)
-
我们堆叠参考分布,并通过与
true_slope
进行比较来估计漂移,true_slope
已被设置为-1
:phi1 = phi1*1.5 phi2 = phi2*2.5 true_slope = -1 shift_norm_0 = multivariate_normal([3, -8], np.eye(2)*sigma**2) X_0 = shift_norm_0.rvs(size=int(N_test*phi1),random_state=2) X_1 = ref_norm_1.rvs(size=int(N_test*phi2),random_state=2) X_test = np.vstack([X_0, X_1]) y_test = true_model(X_test,true_slope) plot(X_test,y_test,true_slope,clf=clf) print('Mean test accuracy %.2f%%' %(100*clf.score(X_test,y_test))) pred = detector.predict(X_test) print('Is drift? %s!' %labels[pred['data']['is_drift']])
该代码片段生成以下图表,以演示无漂移与协变量漂移的用例,显示出漂移情况下(右侧)均值准确度较低,而没有漂移时(左侧)较高。
图 11.11 – 协变量数据漂移
-
当图 11.11展示协变量数据漂移时,以下代码演示了 MMD 方法的使用,其中计算了Xref | C和Xtest | C的核条件均值嵌入之间的期望平方差,以评估测试统计量:
def detect_prior_drift(): label_detector = MMDDrift(y_ref.reshape(-1,1), backend='tensorflow', p_val=.05) y_pred = clf.predict(X_test) label_detector.predict(y_pred.reshape(-1,1)) detect_prior_drift()
-
我们得到以下输出:
{'data': {'is_drift': 1, 'distance': 0.107620716, 'p_val': 0.0, 'threshold': 0.05, 'distance_threshold': 0.013342142}, 'meta': {'name': 'MMDDriftTF', 'detector_type': 'offline', 'data_type': None, 'version': '0.9.0', 'backend': 'tensorflow'}}
MMD 探测器在0.1076
的距离下检测到漂移,漂移检测的阈值为0.013342
。
最小二乘密度差异
[0,1]
并预测相同的二元结果。
来自alibi_detect
的 LSDD 在线漂移检测器需要一个期望运行时间(ERT)(反向的假阳性率(FPR)),使得检测器在没有漂移的情况下运行平均步数,之后才可能产生错误检测。若 ERT 较高,检测器的敏感度降低,响应变慢,因此该配置会在 ERT 和期望检测延迟之间调整权衡,以针对理想的 ERT 进行优化。模拟所需配置的最佳方式是选择比所需 ERT 大一个数量级的训练数据:
-
在以下代码片段中,模型在白葡萄酒样本上进行训练,这些样本形成了参考分布,而红葡萄酒样本则来自漂移的分布。接下来的步骤展示了如何运行 LSDD 漂移检测,并帮助比较无漂移与有漂移的情况:
white, red = np.asarray(white, np.float32), np.asarray(red, np.float32) n_white, n_red = white.shape[0], red.shape[0] col_maxes = white.max(axis=0) white, red = white / col_maxes, red / col_maxes white, red = white[np.random.permutation(n_white)], red[np.random.permutation(n_red)] X = white[:, :-1] X_corr = red[:, :-1] X_train = X[:(n_white//2)] X_ref = X[(n_white//2) :(3*n_white//4)] X_h0 = X[(3*n_white//4):] X_ref = np.concatenate([X_train, X_ref], axis=0)
-
在第一次运行中,没有设置检测器,我们没有检测到任何漂移:
n_runs = 550 times_h0 = [time_run(cd, X_h0, window_size) for _ in range(n_runs)] print (f"Average run-time under no-drift: {np.mean(times_h0)}") _ = scipy.stats.probplot(np.array(times_h0), dist=scipy.stats.geom, sparams=1/ert, plot=plt)
上述代码产生如下输出:
Average run-time under no-drift: 47.72
-
以下代码片段从
alibi_detect
导入LSDDDriftOnline
并通过参考数据、ert
、window_size
、运行次数以及原始分布和当前分布的 TensorFlow 后端来设置漂移检测器。然后,在线漂移检测器以ert
值为50
和window_size
为10
运行:X_new_ref = np.concatenate([X_train, X_ref], axis=0) from alibi_detect.cd import LSDDDriftOnline def lsdd_detector(): cd = LSDDDriftOnline( X_new_ref, ert, window_size, backend='tensorflow', n_bootstraps=5500, ) times_h0 = [time_run(cd, X_h0, window_size) for _ in range(n_runs)] print(f"Average run-time under no-drift: {np.mean(times_h0)}") _ = scipy.stats.probplot(np.array(times_h0), dist=scipy.stats.geom, sparams=1/ert, plot=plt)
这将产生以下输出:
图 11.12 – LSDD 漂移检测器
图 11.12 演示了使用 LSDD 进行在线漂移检测。在这里,我们让检测器运行可配置的次数(50)或迭代,并配置 5,500 次自助法(bootstraps)来检测漂移。自助法用于运行模拟并配置阈值。更大的数量有助于提高获取 ERT 的准确性,通常配置为比 ERT 大一个数量级。
我们得到如下输出:
Average run-time under drift: 54.39
此外,我们观察到,在第一次运行时,保留的参考数据上的检测器遵循几何分布,均值为 ERT,且没有漂移。然而,一旦检测到漂移,检测器反应非常迅速,如图 11.12所示。
Page-Hinkley
这种漂移检测方法通过计算观察值及其均值来检测变化,直到当前时刻。如果发现观察均值超过阈值 lambda 值,则不会发出任何警告信号,而是运行 PH 测试来检测概念漂移。数学上,它可以表示为:
当 gt– Gt > h 时,会触发警报。
现在,让我们逐步了解使用 PH 方法检测漂移的过程:
-
以下代码示例演示了我们如何模拟两个分布:
import random from river import drift import matplotlib.pyplot as plt import numpy as np rng = random.Random(123456) ph = drift.PageHinkley()
-
现在,我们组合并绘制一个由三种数据分布组成的数据流:
data_stream = rng.choices([50, 100], k=1200) + rng.choices(range(600, 900), k=5000) + rng.choices(range(200, 300), k=5000) plt.plot(data_stream) plt.show()
-
现在,我们更新漂移检测器并查看是否检测到变化:
for I, val in enumerate(data_stream): in_drift, in_warning = ph.update(val) if in_drift: print (""Change detected at index {i}, input value: {val"")
-
我们得到以下输出。我们看到在不同时间点检测到图表的三个不同分布的漂移。变化检测点打印在图表的两侧。
图 11.13 – 使用 PH 探测器在分布的三个范围内检测到漂移
快速 Hoeffding 漂移检测方法
快速 Hoeffding 漂移检测方法(FHDDM)允许持续追踪正确预测概率的滑动窗口值以及观察到的最大概率值。当正确预测概率低于最大配置值,并且概率差异超过阈值时,就认为发生了漂移。
配对学习器
配对学习器(PL)机制包括两个学习器,一个是对所有数据进行训练的稳定学习器,另一个是对最近数据进行训练的学习器。每当稳定学习器在预测中出错而最近学习器没有出错时,计数器就会递增。为了弥补错误,每当最近学习器在预测中出错时,计数器就会递减。一旦计数器的增量超过指定的阈值,就认为发生了漂移。该机制涉及大量计算,用于训练新模型并保持两个学习器。
指数加权滑动平均概念漂移检测
在指数加权滑动平均概念漂移检测(ECDD)方法中,通过连续计算预测的均值和标准差,使用指数加权滑动平均(EWMA)预测。它通常用于监控和检测流分类器的误分类率。当预测值超过均值加上标准差的倍数时,就检测到漂移。
特征分布
这种漂移检测技术通过识别p(y|x)由于p(x)的相应变化来实现,无需反馈响应。可以使用任何多元无监督漂移检测技术来检测这种变化。
回归模型中的漂移
要在回归模型中检测漂移,您需要取回归误差(一个实数)并对误差数据应用任何无监督漂移检测技术。
集成和层次漂移检测器
集成检测器主要基于一致性水平工作,其中一致性可以从少数、全部或大多数学习者中得出。层次化检测器仅在第一级检测器通过任何先前讨论的漂移检测技术检测到漂移后才会起作用。然后,可以使用一致性方法在其他级别验证结果,从下一级开始。一些集成和层次漂移检测算法包括线性前馈率(LFR)、选择性检测器集成(eDetector)、漂移检测集成(DDE)和层次假设测试(HLFR)。
现在我们已经了解了不同类型的概念漂移检测技术,接下来我们讨论在漂移/校准时的模型可解释性。
使用 PCA 进行多变量漂移检测
为了从多变量数据分布中检测漂移,我们通过主成分分析(PCA)将数据压缩到一个低维空间,然后再解压数据以恢复原始特征表示。由于我们在转换过程中仅保留相关信息,重建误差(通过原始数据和转换数据之间的欧氏距离评估)帮助我们识别一个或多个特征之间数据关系的变化。在第一步中,我们在原始参考数据集上计算 PCA,并存储带有允许上下限阈值的重建误差。然后对新数据重复此过程,在该过程中我们使用 PCA 对数据进行压缩和解压。当重建误差超过上限或下限阈值时,表示数据分布发生了变化。
以下代码演示了如何检测多变量特征漂移:
-
在第一步中,我们进行必要的导入:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import nannyml as nml from scipy.spatial.transform import Rotation
-
接下来,我们基于其三个特征进行随机数据设置:
# analyze with reference and analysis periods # Days/week * Hours/day * events/hour DPP = 7*24*24 np.random.seed(23) s1 = np.random.randn(DPP*22) x1 = s1 + np.random.randn(DPP*22)/8 x2 = s1 + np.random.randn(DPP*22)/8 x3 = np.random.randn(DPP*22)/8 xdat = np.array([x1, x2, x3]).T rot = Rotation.from_euler('z', 90, degrees=True) # following matrix multiplication implementation, we need a 3xN data matrix hence we transpose ydat = np.matmul(rot.as_matrix(), xdat.T).T # drift is sudden and affects last 5-7 weeks dataar = np.concatenate( (xdat[:-5*DPP], ydat[-5*DPP:]), axis=0) datadf = pd.DataFrame(dataar, columns=['feature1', 'feature2', 'feature3']) datadf = datadf.assign(ordered = pd.date_range(start='1/3/2020', freq='5min', periods=22*DPP)) datadf['week'] = datadf.ordered.dt.isocalendar().week - 1 datadf['partition'] = 'reference' datadf.loc[datadf.week >= 8, ['partition']] = 'analysis' datadf = datadf.assign(y_pred_proba = np.random.rand(DPP*22)) datadf = datadf.assign(y_true = np.random.randint(2, size=DPP*22))
-
接下来,我们可以进一步解释独立特征,但目标是按照以下方式设置漂移检测器:
rcerror_calculator = nml.DataReconstructionDriftCalculator( feature_column_names=feature_column_names, timestamp_column_name='ordered', chunk_size=DPP ).fit(reference_data=reference) rcerror_results = rcerror_calculator.calculate(data=analysis) figure = rcerror_results.plot(plot_reference=True) figure.show()
-
这产生了图 11.14中所示的结果,在其中我们看到数据从 0.84 漂移到 0.80。
图 11.14 – 使用 PCA 的多变量漂移检测器
理解概念漂移/校准过程中的模型可解释性
在上一节中,我们学习了不同类型的概念漂移。现在,让我们研究如何通过可解释的机器学习来解释它们:
-
首先,我们导入创建回归模型和漂移解释库所需的包。加利福尼亚住房数据集已被用来解释概念漂移:
from xgboost import XGBRegressor from cinnamon.drift import ModelDriftExplainer, AdversarialDriftExplainer from sklearn import datasets from sklearn.datasets import fetch_california_housing from sklearn.datasets import fetch_openml california = fetch_openml(name="house_prices", as_frame=True) california_df = pd.DataFrame(california.data, columns=california.feature_names) RANDOM_SEED = 2021
-
然后,我们训练 XGBoost 回归模型:
model = XGBRegressor(n_estimators=1000, booster="gbtree",objective="reg:squarederror", learning_rate=0.05,max_depth=6,seed=RANDOM_SEED, use_label_encoder=False) model.fit(X=X_train, y=y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=20, verbose=10)
-
在下一步中,我们使用
ModelDriftExplainer
拟合我们的训练模型,绘制预测图,并提取任何漂移,如果解释器观察到的话:drift_explainer = ModelDriftExplainer(model) drift_explainer.fit(X_train, X_test, y_train, y_test) drift_explainer.plot_prediction_drift() drift_explainer.get_prediction_drift()
下图说明了在两个不同数据集中的漂移检测差异。
图 11.15 – 两个数据集的输入特征或数据分布的漂移
在图 11.15中,可以明显看出预测分布中没有出现明显的漂移。
-
然后,我们绘制目标标签来评估预测结果中是否有漂移:
drift_explainer.plot_target_drift() drift_explainer.get_target_drift()
然而,如图 11.16所示,我们并没有观察到目标标签的明显漂移:
图 11.16 – 加利福尼亚住房数据集目标数据分布的漂移
-
在接下来的步骤中,当我们评估加利福尼亚住房训练集和测试集的数据性能指标时,我们可以看到性能指标的均值和解释方差出现了数据漂移:
drift_explainer.get_performance_metrics_drift()
在运行加利福尼亚住房数据集的漂移解释器时,我们得到以下输出:
PerformanceMetricsDrift(dataset1=RegressionMetrics (mse=10567733.794917172, explained_variance=0.9983637108518892), dataset2=RegressionMetrics(mse=540758766.1766539, explained_variance=0.9088298308495063))
- 我们的下一个任务是绘制基于树的方法计算出的漂移值,获取加利福尼亚住房数据集的特征重要性,并在数据集上使用
AdversarialDriftExplainer
。如图 11.17所示,Neighborhood_OldTown
和BsmtQual_Gd
特征是受到漂移影响最大的特征:
图 11.17 – 结果漂移中的特征重要性
-
最终,我们可以绘制每个特征并评估它们的漂移,如图 11.18所示。这里,
Neighborhood_OldTown
,第一个特征,在训练集和测试集之间没有显示出明显的漂移:drift_explainer.plot_feature_drift('Neighborhood_Old_Town') drift_explainer.get_feature_drift('Neighborhood_Old_Town')'
前面的代码片段输出以下结果,显示两个数据集之间的差异不显著,因为p_value
是 0.996 > 0.05:
DriftMetricsNum(mean_difference=-0.022504892367906065, wasserstein=0.022504892367906093, ks_test=BaseStatisticalTestResult (statistic=0.022504892367906065, pvalue=0.996919812985332))
图 11.18 – 由于 Neighborhood_Old_Town 特征导致的分布差异/漂移
在了解漂移后,作为数据科学家,我们还需要理解在发生变化时,何时需要对模型进行校准。
理解模型校准的必要性
推荐系统(基于内容的过滤或混合系统)几乎在所有行业领域中都得到了应用,包括零售、电信、能源和公用事业。使用用户到用户或项目到项目嵌入的深度学习推荐模型,通过可解释性特征建立了信任和信心,并改善了用户体验。深度学习推荐系统通常使用注意力分布来解释神经网络的性能,但在自然语言处理(NLP)的情况下,这种解释受到深度神经网络校准不良的限制。
已观察到,由于过度自信或缺乏自信,模型的可靠性会受到影响,特别是对于设计用于医疗保健(疾病检测)和自动驾驶等领域的模型。在模型的可靠性受到质疑的情况下,使用像模型校准这样的度量标准至关重要,因为它能够确保模型预测的概率与其真实正确性的可能性相关联,从而决定模型的性能。
换句话说,当一个经过校准的模型具有较高的置信度(比如超过 80%)时,可以称其为真实有效的模型,此时超过 80%的预测结果被准确分类。我们还可以通过模型校准来绘制可靠性图。这可以作为模型的准确性,通过将可靠性解释为模型对预测的置信度的函数来实现。过于自信的模型的可靠性图低于身份函数,而缺乏信心的模型的可靠性图则高于身份函数。我们还可以看到,经过校准的真实模型提供了完美的分类边界,其中可靠性图可以作为身份函数进行基准测试。
图 11.19包含了深度基于物品的协同过滤(DeepICF)模型的可靠性图。DeepICF 通过使用非线性神经网络训练所有交互物品对,检查物品之间的非线性和高阶关系。它有助于我们理解如何在不同组中建模预测,并通过可靠性图研究准确性与置信度之间的权衡。
图 11.19 – DeepICF 模型的可靠性图
我们将模型的预测结果按置信度分成不同的区间,并计算每个区间的准确性。图 11.19展示了 DeepICF 模型(带有注意力网络:www.researchgate.net/publication/333866071_Model_Explanations_under_Calibration
)随着置信度的增加,正负类别的预测变得过于自信。DeepICF 模型是一个深度神经网络,它通过学习用户和物品的潜在低维嵌入生成。通过逐元素点积,神经网络层捕捉用户和物品之间的配对交互。此外,该模型还使用基于注意力的池化方法生成固定大小的输出向量。这导致在不平衡和负偏态数据集上准确性下降,表明通过注意力分布生成的模型解释在过于自信的预测下变得不那么可靠。
现在,让我们讨论一下当我们看到模型预测结果出现漂移时,如何将可解释性和模型校准结合起来。
可解释性与校准
通过解决数据集中的不平衡问题并为注意力分布添加稳定性,可以实现模型可解释性和适当的模型校准。然而,另一个需要解决的问题是由概念漂移引起的校准漂移。在医疗行业中,一个明显的例子是由于患者特征和不同健康中心、地区及国家的疾病发生率或流行率变化,导致风险预测校准不佳。当一个算法在高疾病发生率的环境中训练时,它会受到模型输入的主导,导致风险估计过高。当这种校准漂移由于模型在非静态环境中的部署发生时,这些模型需要重新训练和重新校准。重新校准有助于修复模型的准确性和置信度,从而提高可靠性图。
现在,让我们通过一个例子来看看为什么在以下情况下有必要对推荐模型进行校准:
-
当由于人口中新客户群体的加入而观察到用户偏好的变化时
-
当观察到现有客户中用户偏好的变化时
-
当有促销/活动或新产品发布时
在以下示例中,我们将研究如何将后处理逻辑嵌入到底层推荐算法中,以确保推荐结果变得更加校准。为了说明这个问题,我们将使用movielens-20m-dataset
:
-
为了计算推荐系统的效用指标,我们必须计算用户-项目交互分布与推荐分布之间的 KL 散度。在这里,我们选择了一个相关的 lambda 项,用来控制评分和校准之间的权衡。lambda 值越高,最终推荐结果被校准的概率越大:
def compute_recommendation_utility(reco_items, interacted_distr, lmbda=0.65): total_score = 0.0 reco_distr = compute_likely_genres(items_to_recommend) kl_div = evaluate_kl_divergence(interacted_distr, reco_distr) for item in items_to_recommend: total_score += item.score rec_utility = (1 - lmbda) * total_score - lmbda * kl_div return rec_utility
-
这里定义的效用函数在每次迭代时都会被调用,以更新列表并选择最大化效用函数的项目:
def calibrate_recommendations(items, interacted_distr, topn, lmbda=0.65): calib_rec_items = [] for _ in range(topn): max_utility = -np.inf for rec_item in items: if rec_item in calib_rec_items: continue rec_utility = compute_recommendation_utility(calib_rec_items + [rec_item], interacted_distr, lmbda) if rec_utility > max_utility: max_utility = rec_utility best_item = rec_item calib_rec_items.append(best_item) return calib_rec_items
-
lambda 项允许我们将控制器(lambda)调整到极高的水平,以生成修改后的校准推荐列表。现在,让我们对校准后的计算推荐进行区分和评估(以优化评分𝑠),并与原始推荐及用户与项目的历史关系进行比较。这里,𝑠(𝑖)表示推荐系统预测的项目评分,𝑖∈𝐼,s(I) = ∑i ∈ Is(i)表示新生成列表中所有项目评分的总和:
calib_rec_item_distr = compute_likely_genres(calib_items_to_recommend) calib_reco_kl_div = evaluate_kl_divergence(interacted_distr, calib_rec_item_distr) reco_kl_div = evaluate_kl_divergence(interacted_distr, reco_distr) distr_comparison_plot(interacted_distr, calib_rec_item_distr)
在这里,我们观察到校准后的推荐在类型覆盖面上更广,并且其分布看起来类似于用户过去互动的分布和校准度量。KL 散度还确保从校准推荐生成的值低于原始推荐的分数。即使校准推荐分布的精度(0.125)低于原始分布的精度(0.1875),我们仍然可以进一步控制 λ,达到精度与校准之间的可接受平衡。
图 11.20 – 比较用户历史分布和校准推荐分布
在前面的讨论中,我们看到了由于输入数据和模型的变化,开发校准模型的重要性。现在,让我们从伦理 AI 的角度,讨论如何将公平性纳入模型并构建校准模型。
校准和公平性的挑战
到目前为止,我们已经了解了什么是跨不同人群子群体的公平机器学习模型,使得预测结果在所有种族、民族、性别和其他人口类别中都不会存在偏差。从 AI 伦理的角度来看,我们还应尝试设计公平且校准的模型,并在过程中理解与其相关的风险。为了设计一个公平且校准的模型,至关重要的是,赋予预测概率为 p 的群体,在通用机器学习模型中能够看到公平的代表性。为了实现这一点,我们应该让这组成员的 p 部分属于分类问题中的正实例。
因此,为了证明两个组之间的公平性,G1 和 G2(例如非洲裔美国人和白人被告),满足两组公平性的最佳方式是校准条件在每个组内的每个个体上同时成立。
然而,校准和误差率约束有着相互冲突的目标。研究表明,校准仅在存在单一误差约束时是容忍的(即各组之间的假阴性率相等)。此外,在使用校准概率估计时,跨不同人群群体最小化误差差异变得越来越困难。即使目标得以满足,得到的解决方案也类似于一个通用分类器,它仅优化一部分预测结果。因此,总结来说,无法设计出一个完全公平且校准的模型。
总结
在本章中,我们学习了与概念漂移相关的不同思想。这些思想可以应用于流式数据(批处理流)、实时数据以及训练好的机器学习模型。我们还学习了统计方法和上下文方法如何在通过判断模型漂移来估计模型度量指标时发挥重要作用。本章还回答了一些关于模型漂移和可解释性的重要问题,并帮助你理解模型校准。在校准的背景下,我们还讨论了公平性与校准,以及如何同时实现两者的局限性。
在下一章中,我们将学习更多关于模型评估技术以及如何处理模型构建流程中的不确定性。
进一步阅读
-
8 种概念漂移检测 方法:
www.aporia.com/blog/concept-drift-detection-methods/
-
关于公平性与 校准:
proceedings.neurips.cc/paper/2017/file/b8b9c74ac526fffbeb2d39ab038d1cd7-Paper.pdf
-
校准的 推荐系统:
ethen8181.github.io/machine-learning/recsys/calibration/calibrated_reco.html
第十二章:构建可持续的企业级 AI 平台
本章的主要目标是向你介绍可持续性最佳实践以及模型治理技术,以便将其与组织目标和计划对齐。你将了解到训练深度学习(DL)模型的环境影响以及你可以采取的可能补救措施。你还将熟悉不同平台的可持续性指标,这将有助于实现可持续的模型训练和部署。
到本章结束时,你将掌握联邦学习(FL)中的协作和去中心化学习技术,无论是模型训练发生在网络、边缘还是云端。最后,你还将了解帮助跟踪碳排放统计数据的工具。
本章将涵盖以下几个主题:
-
可持续企业级 AI 平台的关键
-
跨不同云平台的可持续实践和指标
-
碳排放追踪器
-
采用 FL 进行可持续模型训练和部署
技术要求
本章要求你安装 Python 3.8,并包含以下一些 Python 包:
-
Keras 2.7.0 和 TensorFlow 2.7.0
-
pip
install CodeCarbon
可持续企业级 AI 平台的关键
可持续性在伦理 AI 时代中扮演着非常重要的角色,因为预测能源排放的能力可以支持保护环境和节约资源的倡议。AI 平台可以促进排放减少和二氧化碳(CO2)去除,这有助于建立更绿色的交通网络,并监测与控制森林砍伐。因此,通过以可持续的方式有效利用 AI 解决方案,我们可以努力预防极端天气情况。
作为第一步,我们应当理解为什么组织会设定无碳愿景。同时,理解领导层的愿景同样重要,以便将团队与高层领导和 CXO 们设定的可持续使命目标对齐。
因此,作为第一步,我们将探讨组织重构其路线图以构建可持续 AI 解决方案的动机。
将 AI 作为组织路线图的可持续解决方案
我们应非常小心地构建环保的解决方案。大量研究表明,仅仅 40 天的研究训练就能排放 96 吨 CO2。这一数值非常庞大,相当于 1,000 小时的航空旅行,约等于 23 个美国家庭的碳足迹(www.analyticsinsight.net/new-mit-neural-network-architecture-may-reduce-carbon-footprint-ai/
,inhabitat.com/mit-moves-toward-greener-more-sustainable-artificial-intelligence/
)。进行神经网络搜索的碳排放量曾高达 600,000 CO2e(磅),相当于 5 辆汽车的生命周期。训练像自然语言处理(NLP)模型(或 transformer)这样的算法会消耗大量能量,因此数据科学家在设计此类 DL 神经网络架构时需要格外小心(aclanthology.org/P19-1355.pdf
)。这种训练方式对环境可能构成威胁。如果我们继续以这种方式构建 AI 解决方案,未来的世代将面临不利的环境后果。
希望将 AI 应用于可持续发展的组织,不仅应关注可持续的银行业务、能源消费或医疗保健,还应开发最佳实践,通过衡量碳足迹和计算训练及评估数据中心管理方法所需的计算能力来量化 CO2e。
此外,数据科学家和工程师应首先评估是否需要使用 DL 模型。对于某些应用场景,使用标准模型即可保证相似的性能,而无需训练 DL 模型。因此,在训练 DL 模型之前,组织需要建立正确的实践和审核机制,以避免造成过大的碳足迹。
一旦数据科学团队最终确定了模型(无论是在集中式还是 FL 设置中使用传统模型还是 DL 模型),超参数的选择和精确调优在碳排放中起着重要作用。对于 FL 来说,调优超参数可能在能耗方面变得非常昂贵,因为这会导致调优数百个不同的模型(包括客户端中的本地模型)。
FL 中的调优过程可能会变得越来越复杂,这主要是由于聚合策略中的参数化以及客户端各个数据集的异质性。两种学习方式中超参数调优的复杂性必须仔细设计,以尽量减少 CO2e 排放。
团队应该注意数据集的选择以及所涉及的预处理和特征工程的程度。一个例子是,使用金融和零售数据来开发推荐系统时,特征工程技术变得更加详尽和昂贵,而不仅仅是使用零售数据。
让我们研究能够支持这些框架构建的组织标准。
可持续框架的组织标准
高管和领导层必须参与将可持续数据和模型实践作为组织目标的强制性要求。这些可伸缩云平台的可持续实践源于设定正确的目标和基于当前业务需求的服务级别协议(SLAs)。这可能需要通过优先考虑业务关键功能并允许非关键功能的较低服务级别来影响可持续性指标,来选择正确的权衡。至关重要的是,企业应通过定义适用于可持续模型训练和部署的架构设计模式来处理跨部门的孤立数据。
现在,让我们开始研究在不同云平台上测量的指标。
不同云平台的可持续实践和指标
在本节中,我们将探讨如何评估以下内容:
-
谷歌云的有用排放指标
-
无碳能源的最佳实践和策略
-
数据中心的能源效率
首先,我们将讨论谷歌云的一些指标,并引用微软推广的一些倡议和工具。
谷歌在可持续云解决方案中的角色是巨大的,它一直是领先的云服务提供商,在购买足够的可再生能源方面超过任何其他组织。从 2007 年宣布成为到 2017 年第一家主要碳中和公司的承诺开始,现在其所有电力消耗都来自可再生能源。在没有足够的风能和太阳能或可再生资源的情况下,谷歌从当地电网获取电力来运行本地数据中心的操作。相反,当有足够的电力可用时,多余的电力会反馈到当地电网用于其他用途。以 2030 年实现全天候无碳能源的愿景,谷歌使用以下各节提到的指南使其数据中心和电网无碳。
微软还为 Azure 推出了其 Power BI 应用程序,被称为 Microsoft 可持续性计算器,该应用程序提供了有关每个区域数据中心碳排放量的见解。即使是购买碳中和的可再生能源等举措也有助于推动其年度云消费。
谷歌云的排放指标
为了在 2030 年实现碳自由能源,Google Cloud 提出了一个倡议,帮助客户实现 24/7 利用碳自由能源。客户可以在设计解决方案时考虑碳影响,分析一种叫做 CFE% 的指标。该指标量化了每小时消耗的碳自由能源,通过将其大致分为两大类:CFE% 和碳强度。CFE% 的计算是基于任何时候向电网供应的能源以及 Google 提供的可再生能源资源供给所做的碳自由能源贡献。
-
Google CFE%:该指标提供了碳自由能源的平均百分比。按小时计算时,这一指标为客户提供了一个估算,表明他们的应用程序能够在多长时间内使用碳自由能源,这取决于该地区电网投资的碳自由能源比例。
-
电网碳强度(gCO2eq/kWh):该指标量化了在特定位置从电网获取的单位能源的平均生命周期排放。通过这个指标,我们可以比较在同一电网中表现相似的不同位置的电力碳强度。利用这一点,当两个或更多地点的 CFE% 相似时,我们可以选择一个生产应用的部署区域。例如,我们经常会看到法兰克福和荷兰的 CFE% 得分相似,但荷兰的排放率较高。
现在,来讨论一下如何利用碳自由能源的最佳实践。
碳自由能源的最佳实践和策略
随着 Google Cloud Platform 积极专注于提升每个 Google Cloud 区域的 CFE%(碳自由能源比例),碳自由能源的比例增加有助于提升部署的可持续性。以下是针对云 AI 专家和架构师的一些独特建议:
-
选择低碳区域:在低碳区域(如芬兰或瑞典)建立并运行新应用程序,且该区域具有较高的 CFE%,有助于实现目标碳自由能源排放。
-
在低碳区域运行批处理任务:通过精心规划运行批处理工作负载,可以最大限度地利用碳自由能源。这意味着我们无需将低至中等负载的任务分开运行,通过将高负载和低负载的任务结合起来,可以确保高 CPU 利用率。
-
推动绿色云应用的组织政策:领导团队和组织应该设定优先级,允许在特定区域使用资源和服务,同时限制在其他区域的访问和使用。
-
高效使用服务:有效地规划虚拟机大小,并结合使用无服务器产品如 Cloud Run 和 Cloud Functions,可以进一步减少碳排放,因为它们会根据工作负载自动扩展,并尽可能节省能源。
数据中心的能源效率
为了运行高效的数据中心,我们需要精心规划并选择虚拟机在多站点云中的部署位置。除了选择合适的数据中心来托管虚拟机外,虚拟机的大小同样重要,因为它可以防止额外计算资源的浪费,并提高应用程序的执行速度。通过允许并行化并采用合适的技术来合并云资源,我们可以提高数据中心的效率,从而减少能源消耗。
物理机器(PMs)占数据中心总能源消耗的 35%。它们消耗的能量可以分为静态(虚拟机空闲时消耗的能量)和动态两部分。动态功率消耗主要依赖于各个组件的使用情况,占最大功率消耗的 50%以上,而空闲功率消耗则保持在最大功率消耗的 50% 以下。此外,睡眠模式下也会消耗少量电力。我们需要在空闲和动态功率消耗之间找到合适的平衡,以实现高利用率的工作负载,从而使 PMs 通过保持与利用负载成比例的能耗,贡献于高能源效率比。我们需要考虑优化以减少能耗,确保空闲功率消耗为 0 W(当 PMs 未使用时),在其他时候,根据工作负载的增加来相应调整,直到达到最大利用负载。虚拟化资源具有将用户任务合并到较少 PMs 中的灵活性。我们还必须仔细决定如何减少 PMs 的使用,以减少空闲功率,从而降低整体消耗。除了 PMs,在确定数据中心的整体效率时,以下是一些需要关注的指标:
-
功率使用效率(PUE)指标是一个依赖于云服务提供商的可变因素,表示数据中心的能源效率。它通过评估进入数据中心的总电力中,用于使 IT 设备完全正常运行的部分,来估算每个计算周期的开销。一个高效的数据中心将具有接近 1.0 的理想值。
-
总功率使用效率(TUE)指标用于弥补由 PUE 指标产生的差距。TUE 通过计算数据中心消耗的总能量与单个计算元素消耗的能量之比来获得。因此,它在评估环境影响时更有帮助,因为它只考虑执行工作负载所消耗的能量,而不是整个 IT 设施的能耗。
-
绿色能源系数(GEC)指标通过百分比估算来自绿色能源来源的能量,其中一些来源受天气条件影响,如太阳能电池板和风力发电机。使用可再生能源的驱动数据中心对环境的负面影响较小,因此更具吸引力。
确保数据中心的高效性还需要遵循一些与我们如何构建程序以在云端运行,以及如何衡量电力消耗相关的最佳实践或技术。以下是值得遵循的一些最佳实践:
-
DevOps 和云架构师无需考虑虚拟机的启动成本,因为这几乎可以忽略不计。
-
开发人员应确保所有程序自动利用虚拟机中可用的所有核心。
-
在工作流的每个步骤中,强烈建议指定计算资源,以便为创建虚拟机(VM)提供支持。实现这一目标的最佳方法是确保有足够的磁盘空间和内存可用,以支持程序的执行。当可用资源准备好执行任务时,允许应用程序开始处理。
-
允许提交的应用程序执行任务的所有步骤,直到任务结束。
-
启用动态电压和频率调整(DVFS)以减少 PM(物理机)上虚拟机的功耗,通过动态调整 CPU 的电压和频率来实现。
-
禁止在 PM 上过度分配资源,以免影响资源密集型应用程序的执行速度。
现在,让我们估算如何追踪碳排放量。
碳排放跟踪器
通过深入了解 Google Cloud 上的碳度量,我们的下一课将集中在单个虚拟机(VM)能效计算机制上,我们已经通过 GitHub 上的示例进行了说明。我们的下一步是通过嵌入碳排放跟踪器来计算碳排放量,碳排放跟踪器可以提供来自源代码中的详细排放统计分析。
现在,让我们探索一些可以用于联邦学习(FL)和集中学习的排放工具。
FL 碳排放计算器
在一组设备进行联邦学习(FL)时,碳排放量可以通过一种 FL 碳排放计算器来追踪(mlsys.cst.cam.ac.uk/carbon_fl/
,github.com/mlco2/codecarbon
),其中需要指定以下参数:
-
设备:设备使用的硬件类型。
-
国家: 由燃烧化石燃料产生的能源生产量取决于国家。第一个参数用于获取该国的电力/碳转化率,第二个参数用于估算客户端与服务器之间通信所产生的碳排放量。
-
数据集: 用于指定平衡的、非独立同分布 (IID) 数据集,如 ImageNet 和 CIFAR-10。与 IID 数据集不同,非 IID 数据集包含随机变量,这些变量之间没有相互独立性,也不是同分布的。这使得它们与 IID 数据集有很大不同,因为它们似乎并非来自同一分布。
-
轮次数: 用于指定中央服务器通过聚合过程构建全局模型所使用的总迭代次数。
-
本地纪元数 (LEs): 用于指定每个客户端在将本地模型发送到服务器之前进行训练的迭代次数。
-
活跃设备数量: 用于指定每一轮中活跃客户端设备的数量,这通常是所使用的设备总数的一部分。
-
网络: 用于定义给定设备集的互联网上传/下载速度。
图 12.1 演示了在一个具有 5 个客户端、10 个本地纪元和 10 轮训练的 FL 设置中,总共排放的碳量为 2.51 gCO2eq。这里,CO2eq 用于衡量硬件(如 CPU 和 GPU)的能耗,并确定硬件的位置。结合该地区的平均 CO2 排放(以 gCO2eq/KWh 为单位)和 ML 模型架构,可以帮助确定部署的地区。例如,对于需要高能耗的部署,可以选择像加拿大魁北克这样的地区,但在某些其他情况下,可能会被迫将解决方案部署在美国爱荷华州,该地区的 CO2 排放高达 735.6 gCO2eq/KWh:
图 12.1 – 来自一个具有 5 个客户端、10 个本地纪元和 10 轮训练的 FL 设置的碳排放
现在,让我们看看如何计算集中式学习的 CO2 排放。
集中式学习碳排放计算器
就像 FL 一样,我们也可以对集中式学习做同样的计算,正如 图 12.1 所示,使用 ML CO2 影响计算器(mlco2.github.io/impact/
或 github.com/mlco2/codecarbon
)来计算不同云平台的碳排放。
我们还展示了以下示例,说明如何使用 CodeCarbon 工具来衡量碳排放,该工具可以轻松地集成到自然工作流中。它从代码内部捕捉排放指标,并帮助开发人员在函数或模块级别跟踪这些指标:
-
首先,让我们导入所有必要的库:
import tensorflow as tf from codecarbon import EmissionsTracker from tensorflow.keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import cross_val_score, StratifiedKFold,RandomizedSearchCV
-
在接下来的步骤中,以下代码演示了使用 MNIST 数据集训练深度学习模型:
def train_model(): mnist = tf.keras.datasets.mnist (x_train, yv_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential( [ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation="relu"), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10), ]) loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"]) model.fit(x_train, y_train, epochs=10) return model
-
最后,使用以下代码,我们可以追踪训练深度学习代码时的排放数据:
with EmissionsTracker(project_name="mnist") as tracker: model = train_model() print(tracker.final_emissions)
这里是以千克二氧化碳(kg CO2)为单位的输出:
0.0001063754808656955
我们可以看到,深度学习(DL)模型产生了 0.0001063 千克的二氧化碳排放。
现在,我们已经具备了可持续机器学习的指标来控制我们的能耗。然而,研究表明,联邦学习在不同情况下对控制二氧化碳当量(CO2e)排放起着重要作用。让我们现在来看如何在使用联邦学习进行模型训练和部署时融入可持续性。
采用可持续的模型训练和部署方式,使用联邦学习(FL)
随着机器学习训练量的指数级增长,从 2012 年到 2018 年增长超过 300,000 倍——即 3-4 个月翻倍(远超摩尔定律的 2 年翻倍周期)——数据科学家和算法研究人员越来越多地研究去中心化的模型训练方法,以试图遏制深度学习模型在数据中心的专用硬件加速器上运行时产生的巨大热量。这些专用硬件消耗大量能源(200 太瓦时(TWh)),高于一些国家的国家电力消费,并占全球碳排放的 0.3%(2018 年《自然》期刊中引用)。例如,谷歌的 AlphaGo Zero 和训练自然语言处理(NLP)模型已经排放了大量的二氧化碳当量,突显了采用去中心化机制的紧迫性。
移动设备和物联网设备数量的指数级增长意味着联邦学习及其协作训练方法在降低能耗和碳排放方面发挥了重要作用。此外,研究发现,与集中式学习相比,联邦学习的设计具有更绿色的环境影响,因为它的碳排放较少。
现在,让我们理解模型训练过程中的排放指标。
二氧化碳当量(CO2e)排放指标
要量化在数据中心或边缘服务器中训练深度学习模型的环境影响,只有考虑以下指标时,才能真正理解其环境影响,因为能源消耗会根据地理位置转化为二氧化碳当量(CO2e)排放:
-
集中式学习和联邦学习系统硬件消耗的总能量,以及联邦学习系统的通信能量
-
数据中心因冷却效应而消耗的能量,特别是在集中式学习的情况下
现在,让我们隔离出导致集中式学习和基于联邦学习的训练系统能耗的因素。
比较排放因子——集中式学习与联邦学习(FL)
以下因素总结了集中式学习与联邦学习在能源消耗上的主要区别点。
硬件依赖性
集中式学习训练过程中的能耗可以通过在训练期间采样 GPU 和 CPU 的功耗来推算。可以查询 NVIDIA 系统管理界面,以平均所有样本在训练期间的 GPU 功耗。然而,对于 FL 来说,除了配备 GPU 的聚合服务器和客户端之外,这部分能耗可以安全地忽略。
在一个具有分布式训练设置和来自异构边缘设备的多个通信轮次的 FL 环境中,训练时间可能远远超过集中式训练的时间。这是因为集中式训练收敛得更快。对于 FL 来说,训练时间以及能耗与每次迭代中选择的客户端数量、客户端的数据分布(通常是非 IID 的)以及参与训练过程的具有不同计算能力的异构客户端设备密切相关,因为客户端的计算能力各不相同。
除了这些因素外,实际消耗的能源还受到每个客户端设备所使用的硬件设备(RAM 或 HDD)、基础设施和设备分布的影响。在扩展 FL 设置时,我们需要在做出正确的硬件选择之前,仔细评估所有可能的选项。因此,为了区分集中式学习和 FL 的能耗指标,我们需要基准测试 FL 客户端的硬件,以验证比较指标。
数据中心冷却
数据中心的冷却过程在整体能源利用中起着重要作用,其贡献高达总能源消耗的 40%(Capozzoli 和 Primiceri, 2015: www.researchgate.net/publication/290010399_Cooling_Systems_in_Data_Centers_State_of_Art_and_Emerging_Technologies0
)。这一过程主要由数据中心的效率决定,并通过 PUE 比率进行估算,2019 年全球 PUE 的平均值为 1.67,并且在不同的云服务提供商之间有所不同(2020 年 Google 记录为 1.11,Amazon 为 1.2,Microsoft 为 1.125)。FL 训练过程没有关联的冷却过程。然而,中央聚合服务器也可以配备冷却功能。
一些数据中心的冷却技术通过使用最佳控制机制来实现,如热冷通道布局(不分隔冷热通道以促进空气自由混合)、封闭(通过隔离冷热空气)、机架摆放(促进机架热点的热循环)、电缆整理(确保数据中心内空气流畅通行)以及使用空白面板(防止热空气进入数据中心的气流)。这些高效的冷却方法有助于维持数据中心内的温度。甚至部署监控工具来管理数据中心的气流、湿度、温度、气压和热点,也能通过更好的温度和压力控制提高效率。
数据交换过程中的能量利用率
当训练发生在中央服务器上时,肯定不涉及数据交换。相比之下,在 FL 生态系统中,数据和模型会在中央聚合服务器与分布式客户端之间传输、下载或上传。除此之外,能量利用率还考虑了由于下载和上传,路由器和硬件所消耗的能量。
说明 FL 比集中学习更有效
Xinchi 团队进行的实验结果(arxiv.org/pdf/2102.07627.pdf
)解释、比较并评估了集中学习与 FL 的影响:
-
达到目标精度所需的通信轮次
-
集中学习和 FL 相关的能量
-
集中学习和 FL 的训练时间
-
与 FL 一起使用的不同训练优化器
在 FL 设置中,每个客户端都使用低功耗、支持 GPU 的边缘设备进行小数据集的训练。该设置在一个或五个 LE(训练周期)内达到了目标精度。相比之下,在集中训练环境中,一个 LE 相当于标准的训练周期,这一周期应用于整个数据集的训练过程中。
此外,研究表明,在 FL(联邦学习)设置中,能量利用率甚至比使用节能训练优化器(如 FedAdam)的集中学习设置还要低。FedAdam 因其在初始收敛速度上表现优于联邦平均法(FedAvg)而广为人知,甚至在与非自适应优化器的比较中也表现更好。这种自适应优化技术不会导致额外的客户端存储或通信成本,而是确保与跨设备 FL 的兼容性。
在 FedAvg 中,参与训练的客户端通过多个随机梯度下降(SGD)步骤将本地更新共享给服务器。这种方法在异构环境(如具有不同用户和词汇的 NLP 领域)下表现不佳,因为它使用共享更新的简单平均值来升级初始模型。
一种基于梯度的优化技术,如 FedAdam,专注于通过每个坐标的方法来平均客户端的模型更新,从而实现自适应服务器优化过程。在这里,服务器端的优化旨在通过 FedAvg 和服务器动量,从全局视角优化聚合后的模型。另一方面,个别客户端在本地训练期间通过多次迭代使用客户端优化器。通过这种方式,它在有限参与过程中尽可能减少本地数据的总体损失。
在 FL 中,相比集中式学习,更多的 LE 通常会导致 ML 模型在较少的 FL 轮次中更快地收敛。尽管这并不能确保更低的能耗,但像 FedAdam 这样的自适应聚合策略在全局模型收敛速度上表现更好。
此外,非 IID 数据集需要比 IID 数据集更多的 FL 轮次,而 IID 数据集的收敛速度比非 IID 数据集更快。
FedADAM 优化器的有效性在 Xinchi 小组研究中得到了验证(实验结果摘自《Federated Learning 碳足迹初探》的研究结果,arxiv.org/pdf/2102.07627.pdf
),我们看到它在 CIFAR-10 和 SpeechCmd 数据集上都表现优于 FedAvg。此外,使用五个 LE 时,FedAdam 的 CO2e 排放量低于集中式学习和使用 FedAvg 的 FL。对于 ImageNet 实验,为了在非 IID 数据情况下达到所需的测试准确率,FedAdam 的排放量高于 FedAvg。这是因为该数据集天然不平衡,导致需要多轮训练才能达到目标测试准确度,这导致了更长的训练时间,从而产生更高的 CO2e 排放。例如,使用 FedAdam 优化器时,IID SpeechCmd 数据集的排放量显著更低。
因此,我们可以看到能效取决于集中式学习和 FL 中的多个因素,其中主要因素是 FL 中使用的优化器。在非 IID 数据集(例如,SpeechCmd)中,使用 FedAdam 优化器、较简单的模型架构以及较少的通信轮次,FL 的 CO2 排放量往往低于集中式学习。因此,我们可以得出结论,使用轻量级神经网络时,FL 在能效方面似乎优于集中式学习。
让我们了解如何通过权衡并优化 FL 中的以下因素来减少 CO2 排放。
FL 的 CO2 足迹
决定集中式学习和 FL 训练 CO2 足迹的一些主要因素如下,这些因素导致了不同水平的 CO2e 排放:
-
硬件的地理定位:例如,研究发现,在法国进行训练时会产生最低的 CO2e 排放,因为核能是法国的主要能源来源,这也导致了最低的能量转 CO2e 的转换率。
-
深度学习模型的类型,特别是模型架构:例如,基于 FedAvg 的联邦学习优化在使用 ResNet-18 进行图像任务时比现代 GPU 和集中式训练排放更多 CO2。而在 SpeechCmd 数据集上训练 LSTM 模型时,相同的联邦学习优化反而排放较少的 CO2。如果联邦学习中的本地训练任务较轻,通信和数据交换较少,研究表明,这将导致更低的 CO2 排放。
-
硬件效率:像 Tegra X2 这样的芯片可能会嵌入到智能手机、平板电脑和其他物联网设备中。当使用这种先进的芯片时,联邦学习将继续减少排放。
-
数据中心的冷却需求和可用性:联邦学习在数据中心没有集中式的冷却过程;这些冷却需求分布在联合中的各个设备上,并根据每个设备的需求而变化。集中式学习的分布式设置需要冷却设施。高性能 GPU 或TPU(张量处理单元)需要大量计算能力,要求更高的冷却需求,从而导致更高的能量消耗。
-
联邦学习中的通信轮次:在集中式学习中,一个 LE 产生的 CO2 比五个 LE 更多,无论是聚合策略还是设备类型。这是因为较少的本地训练 epoch 会导致模型收敛所需时间增加,从而导致更多的数据交换和本地客户端与全球服务器之间的通信轮次。使用五个 LE 时,单个设备训练时间更长,导致较少的通信轮次和较低的排放。
-
联邦学习中的数据交换:正如我们之前所看到的,CO2e 排放的百分比也主要由广域网络(WAN)排放所驱动,这些排放源自数据集和联邦学习设置之间的交换。例如,通信的能量利用可能占总排放的 0.4%(五个 LE 的 ImageNet)和 95%(一个 LE 的 CIFAR-10)。
为了在比较 CO2e 排放时达到对等性和一致性,联邦学习中的通信轮次被转换为集中式训练的 epoch。CO2e 排放与集中式 epoch 的数量直接相关。Xinchi 团队提出的一些 CO2 排放增加的关键因素如下:
-
集中式 epoch 的数量
-
硬件的热设计功耗
-
模型大小的增加,增加了通信所消耗的能量
-
训练数据集的大小
-
使用更好的基于深度学习的优化器,例如 FedAdam,它能够优于集中式学习
我们知道,过去十年气候变化的毁灭性影响迫使我们在部署架构之前重新思考和审视我们的排放指标。气候变化和对更绿色星球的关注将推动设计新指标时的研究和创新。所有这些因素汇聚在一起,促使我们选择更好的硬件,以便能够看到 CO2 足迹并提供可能的修正建议。现在,我们必须了解如何部署用于训练 FL 模型的流行设计模式。
我们还应考虑其他可再生能源发电方式,这些方式可以在说服组织控制排放并鼓励投资可再生能源方面发挥重要作用。
因此,让我们探讨如何补偿 CO2e 排放。
如何补偿等效 CO2e 排放
为了补偿 CO2e 排放,我们需要理解如何处理有关能源电网的信息或将能源转化为 CO2e 的转换率。由于公共信息来源的匮乏,有一些推荐的实践方法需要牢记:
-
我们必须假设,所有连接到本地电网的数据中心和边缘设备都直接与其物理位置相关联。特定于电力的 CO2e 排放因子以 kg CO2e/kWh 表示,不同国家的排放因子各不相同,例如法国(0.0790)、美国(0.5741)和中国(0.9746)。
-
排放技术(包括计算电力传输和分配时能量损失的适当指标)以及热电厂的吞吐量或生产力可能会影响整体能源利用情况。
-
考虑到上述假设,评估 FL 和集中式学习的转换因子可以帮助我们计算并设定一个具有最少 CO2 排放的能源利用指标。在 FL 中,通信所需的能源因数据分区类型(IID 数据集需要更多能源)、通信轮数、硬件类型、位置及我们已经讨论过的其他因素而有所不同。
-
作为可持续发展专家,我们的下一个目标是通过购买美国的可再生能源凭证(RECs)或欧盟的可交易绿色证书(TGCs)来补偿由此产生的 CO2 排放。即使是支持环保项目的倡议,如可再生能源项目或大规模植树活动,也可以得到鼓励。
我们现在需要考虑如何通过考虑不同的参数来训练 FL 模型,这些参数会影响 CO2 排放。
基于 FL 的模型训练设计模式
到目前为止,我们一直在集中讨论从可持续性角度看,FL 是一种非常好的方法。然而,除了可持续性之外,FL 还从数据隐私的角度提供了巨大的好处,这与负责任的人工智能(Responsible AI)相关。在 FL 中,客户端能够分享来自本地数据的匿名化学习,而无需将潜在敏感的数据与集中式处理过程共享。在这一部分中,我们将进一步了解这一点,并深入了解 FL 的不同设计模式。
FL 有不同的设计和部署策略,这些策略将影响其二氧化碳排放指标。以下是一些关键指标:
-
每个客户端中非 IID 数据集的大小
-
参与的客户端数量
-
客户端参与训练之前的等待时间,这影响模型的收敛性
-
本地客户端的训练时间以及聚合全局模型的时间
现在让我们来看一下基于 FL 的训练的不同模式。
当我们考虑使用 FL 进行模型训练和数据处理模式时,我们需要考虑数据类型,以及客户端参与本地训练的动机。因此,我们可以将它们主要分为三种类型:
-
一个多任务模型训练器,用于训练非独立同分布(non-IID)数据集
-
一种用于训练异构数据集的异构数据处理器
-
一个激励注册系统,通过奖励机制激励客户端
在每个与设计模式对应的示意图中,我们使用了以下的 FL 序列:
-
一个通用的全局模型由中央服务器训练。
-
在特定训练轮次中选择的每个客户端下载全局模型,并启动本地训练过程。
-
客户端本地训练的模型随后会在全球服务器上进行更新。
-
服务器使用 FedAvg 算法聚合全局模型,以改进共享版本的模型。
-
然后,本地设备将被更新为最新的重训练全局模型,这为它们的本地重训练做准备,并更新它们以进行后续迭代。
多任务模型训练器
这种训练模式的主要目标是提高学习效率和模型性能指标。此外,它最适合在本地设备上训练独立的相关模型。具体而言,当客户端的数据分布模式有所不同,并且全局模型无法代表每个客户端所展示的数据模式时,我们会使用这种方法。例如,正如下图所示,在计算机视觉、强化学习、语音识别和自然语言处理(NLP)上训练独立的模型,对于建模和展示每个模型的目的至关重要:
图 12.2 – FL 模型训练设计模式 – 一个多任务模型训练器
一个现实世界的例子是使用机器学习(ML)解决下一个词预测任务(涉及自然语言处理的相关机器学习任务),通过使用设备数据,如文本消息、网页浏览器搜索字符串和电子邮件。
为了获得更高的准确性,该设计每一轮都涉及更多的训练时间、计算和能源资源,这与其他传统联邦学习(FL)技术的期望一致。该方法的主要挑战是本地客户容易受到数据隐私威胁的影响,并且训练只能应用于凸损失函数。
一个异构数据处理器
这种训练模式通过应用诸如数据增强和使用生成对抗网络进行对抗训练等特殊处理技术,保持数据隐私,并在数据分布非独立同分布(non-IID)和偏斜的情况下,找到更好的基本 FL 使用方法:
图 12.3 – FL 模型训练设计模式 – 一个异构数据处理器
由于客户的个性化数据导致数据分布不均衡和偏斜,在设备上训练的本地模型在聚合时往往会降低全局模型的准确性。因此,必须通过插入一个异构数据处理器来提升数据效率,该处理器可以正确地增强和提炼联邦数据,同时仍然保持数据隐私。提炼过程使客户端设备能够定期从其他参与设备收集信息,而无需直接访问其他客户的数据。
该机制试图以训练时间和计算资源为代价,提供更好的模型性能指标,最终导致较低的能源效率和较低的可持续性指标。
一个激励登记
如下图所示的训练模型根据参与客户在数据量、模型性能、计算资源等方面的贡献进行奖励。这是一种激励客户并提高全局模型性能的措施。下图展示了基于区块链和智能合约的激励机制:
图 12.4 – FL 模型训练设计模式 – 一个激励登记
激励机制能激励更多客户端参与,因为这种训练策略并不是通过每个客户端在每次迭代中都完全参与来驱动的。此外,激励机制需要客户端和学习协调者之间达成共识,以决定评估标准。制定激励机制的一些常见方法包括强化学习、区块链/智能合约和斯塔克尔伯格博弈模型。基于区块链的 FL 激励机制的一个具体应用是 FLChain,它支持协作训练和模型交易市场。该模型同样面临着长时间训练和计算资源挑战的问题。
在本节中,我们了解了控制 FL 训练设置的重要因素,包括参数、客户端数量、时间和训练的时期周期。所有这些因素都影响着训练环境中的能量消耗,从而加剧了全球变暖。除了模型训练,我们还将了解不同的模型部署模式如何影响能源排放。在接下来的章节中,我们将主要讨论一种 FL 环境中的策略,其中只有选定的客户端参与训练。尽管我们将提到参与训练过程的个别客户端,但我们的主要目标是理解那些能促使客户端启动本地训练过程的操作或部署模式。
模型部署中的可持续性
在上一节中,我们了解了 FL 在可持续性方面的重要作用。现在,让我们探讨一个可持续的 FL ML 框架。我们将看到如何使用能够从环境中积累能量并在间歇性训练期间有效利用这些能量的可充电设备。
这种框架可以扩展到跨设备和跨信息孤岛的 FL 设置,包括无线边缘网络中的 FL、物联网和医疗设备互联网(IoMD)。单个本地设备的训练可以推动模型的收敛,并使其适应以下设置:
-
通过允许随机选择少量客户端来最小化每次迭代中的通信开销。
-
启用客户端选择,以最大化学习速率,加速收敛速度。
-
基于每个客户端的能源到达过程启用客户端选择过程。这是为了应对间歇性和非均匀的能源到达模式,以有效管理客户端掉线。
该部署框架非常适合异构设备可用且每轮训练独立进行的场景。这使得框架更加灵活,因为每个参与训练过程的设备在某一轮中不会被未来的连续轮次所约束或依赖。训练过程(由随机的能量供应驱动)由中央服务器协调,服务器汇总客户端的本地模型并将更新的全局模型发送给它们。各个客户端使用自己的数据集进行本地训练,并通过多次 SGD 迭代更新收到的全局模型。该框架不仅有助于节能的可持续 FL 训练,而且在设备通过间歇性和非同质的能量更新过程生成能量的场景下,能够最小化训练的总能量成本。
该框架允许不同类型的客户端具有不同的能量生成水平以参与训练,提供两种不同的配置:
-
一种有偏的模型预测策略,其中全局模型偏向于那些能量供应更频繁的客户端。这种模型在预测结果的准确性上会有性能损失,但能够提供更好的收敛速度。
-
一种无偏的模型预测策略,其中允许所有客户端在每次参与训练过程之前,等待足够的能量生成。这种模型基于最慢客户端的等待时间,会有最长的等待时间。然而,这种训练尽管收敛速度较慢,但在性能指标上表现更好。
提出的框架配备了四个不同的实体,如下所述,以促进一个能量感知的客户端调度和训练策略:
-
客户端的能量配置:考虑所有客户端的能量供应是最重要的因素,因为它决定了客户端基于从环境中获得的能量(如太阳能、动能、环境光或射频能量)参与训练的情况。能量配置是一种研究能量模式的机制,用于推断是否有足够的能量来训练本地模型并将更新发送给中央服务器。任何参与的客户端从初始时刻 t 开始参与全球轮次的训练过程,确保客户端在该全球轮次的整个时段内参与训练,{t, . . ., t+T −1},期间客户端正在训练本地模型。此外,参与任何全球轮次训练过程的客户端,在该指定的全球轮次训练的整个过程中保持不变。
-
客户端调度:该框架具有灵活性,允许客户端根据其能量状态决定是否参与当前迭代的训练过程。随机参与过程在客户端本地估计能量到达过程后,将其纳入调度,以最大化收敛速度或减少训练的通信开销。调度过程无需客户端之间的协调,使得在大规模网络中更容易扩展。
-
客户端本地训练:此阶段允许参与的客户端使用 SGD 训练本地数据集,然后将其更新到中央服务器。
-
服务器更新模型:此阶段允许服务器聚合本地模型,以整合全球模型并发送到各个设备。
在研究了影响能量智能客户端调度的主要因素后,我们将在此讨论基于客户端能量可用性如何进行调度的过程。
图 12.5 说明了两种不同的预测策略,其中客户端要么在能量到达时立即参与,要么等到所有客户端积累了启动训练所需的能量后再开始。图的左侧部分对模型收敛持乐观态度,在能量可用时立即开始客户端调度(由不同颜色的 t1、t2、t3 和 t4 表示)。而右侧子图则比较保守,等待所有客户端都具备可用能量后再统一调度,它们的颜色都是相同的橙色,其中 t1、t2、t3 和 t4 表示不同的时间点:
图 12.5 – 基于能量到达模式的客户端调度
本节中,我们已经学习了如何通过使用随机能量到达过程,在大规模网络中部署可持续的 FL。此外,结合模型量化和压缩技术,利用客户端间完全随机的能量可用性,能够更好地描述能量更新过程与训练性能之间的关系。
我们已经理解了基于能量调度客户端的训练过程。现在,让我们看看这些训练模式如何根据架构进行调度,以及如何扩展 FL 模型。
基于 FL 的模型部署设计模式
让我们深入探讨一旦 FL 模型在生产环境中上线后,如何管理和聚合它们。在这里,我们将讨论两种架构设计,主要从数据通信、模型管理和治理的角度出发,探讨这些模型如何被聚合并分发给本地客户端:
-
基于 FL 的模型管理模式:我们需要模型管理模式来建立与本地客户端的数据或模型大小相关的规则和流程。大小在数据或模型交换中起着至关重要的作用,因此影响能耗。此外,替换模型的频率以及更新全局模型的频率是决定 CO2e 排放量和 FL 可持续性的关键因素。
-
基于 FL 的模型聚合模式:我们需要 FL 中的模型聚合模式,将来自单个客户端的学习整合起来,以创建更新后的全局模型。模型聚合过程的模式——无论是异步的、分层的,还是去中心化的——都会影响时机和延迟。所有这些因素共同作用,导致不同水平的 CO2e 排放。
让我们在接下来的部分中讨论这些设计。
基于 FL 的模型管理模式
模型管理模式负责模型的传输、部署和治理。根据消息传输方式或客户端如何在本地存储模型,我们可以将它们分为四个大类,如下所述:
-
消息压缩器,减小传输消息的大小
-
一个模型共版本注册表,参与模型版本管理,通过接收客户端的模型更新,帮助促进模型聚合
-
一个模型替换单元,监控全局模型的性能,并在模型性能下降时启动新的训练
-
部署选择器,将改进后的全局模型推送到客户端
让我们详细讨论这四个类别中的每一个。
消息压缩器
如图 12.6所示,这一设计模式在每轮模型交换过程中压缩消息,以减小数据大小:
图 12.6 – FL 模型部署设计模式 – 消息压缩器
这个过程通过有效地压缩模型参数或梯度,帮助在带宽有限的情况下提高通信效率。然而,当服务器必须聚合大量的模型参数时,该模式会带来额外的计算成本。此外,它还会增加消息压缩和解压缩的开销,可能会丢失一些关键信息。
一个模型共版本注册表
模型共版本注册表,如图 12.7所示,通过跟踪每个客户端的模型版本并将其与相应迭代的全局模型对齐,帮助本地模型治理过程:
图 12.7 – FL 模型部署设计模式 – 模型共版本注册表
这有助于同步和异步模型更新、客户端掉线、模型选择以及提前停止复杂模型训练。此外,这种模式具有独特的优势,可以跟踪模型质量(包括全局模型、客户端设备更新以及应用程序或设备操作系统/固件的版本),以及客户端的对抗性行为(当客户端充当对手时),以增强系统的问责性。注册表用于收集本地模型更新并将其映射到全局模型,从而确保模型版本号和客户端 ID 保持不变。此模式还可以通过区块链实现,以提供模型来源和共同版本管理。该架构所需的额外存储量,用于存储所有版本的全局和本地模型,带来了额外的好处,即为系统安全提供保障,能够检测出可能导致系统故障的不诚实客户端。这个模式的一个典型例子是基于 Databricks 构建的 MLflow 模型注册表,它提供了一个高效的集中式模型存储,用于跟踪模型的时间线、版本管理和阶段过渡。
一个模型替换触发器
这个联邦学习设计模式通过在新的模型任务上设置触发器来启动模型的替换,当模型的性能降到可接受阈值以下时。为了解决模型准确度下降等问题,这个模式提供了机制,在建立新的模型训练过程之前,先调查这种准确度下降的原因。只有在连续几轮注意到模型性能退化时,才会启动重新训练过程,从而强烈推断性能下降是全局性的。重新训练模型会增加通信和计算成本,但在处理具有异质非独立同分布(non-IID)数据集的联邦学习环境中的客户端时非常有效,因为这些客户端拥有个性化数据集,并且随着多轮迭代,全球模型的性能会更快衰退。微软 Azure 机器学习设计器和 Amazon SageMaker 是基于模型性能退化触发模型重新训练的知名平台。
一个部署选择器
如图 12.8所示,这种部署策略能够使全局模型收敛,并根据所运行的应用将全局模型推送到选定的客户端。因此,不同组的客户端接收到不同版本的收敛模型,目的是提高模型的性能指标。模型选择解决了客户端之间非 IID 数据分布的问题,使得不同定制的收敛模型能够更好地服务于不同的客户端组。然而,这一过程会增加服务器的开销,因为中央服务器需要正确识别客户端,以便为它们提供不同版本的全局模型,同时训练和存储适用于不同客户端的不同模型。尽管训练成本增加,但我们根据客户端的 ML 任务得到了更好的泛化模型。此策略需要内置额外的隐私保护措施,以防止在服务器尝试分组客户端时出现隐私泄露。这种 FL 训练可以在 Amazon SageMaker 和 Google Cloud 上进行,它们可以训练和管理多个模型版本,并将其部署到不同的端点:
图 12.8 – FL 模型部署设计模式 – 模型部署选择器
基于 FL 的模型聚合模式
这种设计模式采用不同的策略进行模型聚合,以减少聚合延迟并提高系统的效率、可靠性和可追溯性。主要目标是通过有效利用最佳资源来改善模型的性能指标。它们可以大致分为以下四种模式:
-
异步安全聚合器
-
去中心化聚合器
-
安全聚合器
-
分层聚合器
我们在以下小节中展示了四种模式;最后两种模式可以组合成一个混合的分层安全聚合器。
异步聚合器
这种异步全局模型聚合策略,如下图所示,使我们能够在新的模型更新到来时加速模型聚合,而无需等待在客户端本地训练的模型。
图 12.9 – FL 模型部署设计模式 – 异步聚合器
这一机制与传统的 FL 有所不同,它允许客户端跳过第一次聚合轮次,在下一次(第二次或后续)聚合阶段中客户端异步地更新模型。因此,它能够适应客户端在计算资源、带宽可用性和通信能力方面的差异。客户端在参与全局模型聚合时享有明显优势,因为服务器的模型收敛过程不受延迟的影响。
使用此策略所面临的挑战会导致全局模型产生偏差,如果重要信息被消除,可能会影响模型的质量。此外,服务器上的最大聚合延迟由最慢客户端发送更新的时间决定,从而导致模型收敛速度缓慢。
然而,这种方法的一些主要优点包括在每轮聚合中都进行集中聚合,而不是等待最慢的客户端。我们还看到,每轮的带宽使用量减少,因为只有少数客户端异步发送它们的更新。
设计模式的例子包括异步在线联邦学习和异步 联邦优化。
去中心化聚合器
如下图所示,这种聚合策略遵循去中心化联邦学习(FL)方法,通过去除对中央服务器的依赖,避免了单点故障的风险。在这种架构中,中央服务器可能会遇到额外的负载,因为它需要接收并聚合来自所有客户端的更新。图示展示了区块链和智能合约如何在更新共享给相邻设备时接收模型更新。在传统的 FL 训练中,当并非所有参与的客户端都信任中央服务器时,系统可能会受到隐私限制的影响。
图 12.10 – FL 模型部署设计模式 – 去中心化聚合器
推荐使用这种去中心化方法,其中允许客户端设备之间进行模型更新。然而,这种架构还需要合理定义去中心化的模型管理系统,在该系统中,同行设备能够收集、存储、检查并聚合本地模型。此外,我们还需要定义系统所有权,通过该方式随机选择一个客户端执行来自本地相邻客户端的聚合操作,并将聚合后的模型发送到客户端网络。区块链作为去中心化 FL 的最佳选项之一,可以存储不可变的模型,学习协调者可以维护区块链。区块链机制可靠、可追溯且值得信赖,从而增强了对抗攻击的韧性、信任度和透明度。
该系统的主要缺点之一是由于区块链共识协议在模型聚合过程中的延迟。此外,客户端设备还可能因为参与训练和模型聚合的并行性而导致电池耗电。即便是这种去中心化架构,也存在客户端可能泄露其同伴的敏感信息的风险。此类点对点学习模式的一个实际例子是 BrainTorrent,在该模式中,客户端之间直接进行学习和交流。
安全聚合器
这种聚合策略支持内置的安全协议,比传统的联邦学习(FL)更好地保护模型,且不需要数据加密的支持。这与传统的联邦学习形成对比,后者没有考虑数据加密和参数的安全交换,容易留下未经授权的数据访问空间。为了防止恶意客户端加入训练过程并遏制对数据/模型的污染攻击,我们需要确保在模型向中央服务器发送更新时,合适的安全协议已到位。确保模型参数和梯度不被第三方访问的最佳方式是采用安全的多方计算来进行模型交换和聚合,确保每个参与客户端都能意识到自己的模型输入和输出。我们还可以使用同态加密,使客户端能够加密,服务器能够解密模型。应用级安全机制,如成对遮蔽和差分隐私,有助于减少数据泄露给外部对手的风险。
这种架构模式的一些缺点包括由于增加额外的安全协议和加密方法,导致系统效率降低和模型准确性下降。因此,我们需要选择合适的隐私阈值,以平衡模型性能和隐私之间的权衡。谷歌开发的安全聚合协议(Secure Aggregation)就是联邦学习中一种安全聚合协议的典型例子。
层次化聚合器
这种聚合技术增加了一个额外的层次化聚合器层(如边缘服务器),以减少非独立同分布(non-IID)对全局模型的影响,并提高系统效率。下图展示了我们如何使用边缘网络 1 和边缘网络 2 在触发全局聚合过程之前,先从附近的客户端设备进行部分聚合。这种设计模式引入了位于边缘网络的中间服务器,用于处理客户端与远程服务器之间的慢速通信,从而提高系统效率。引入层次化聚合器有助于扩展联邦学习系统,并促进更好的全局模型聚合,因为服务器可以将来自数据异质性相似的客户端的本地模型进行组合。
这种架构的主要缺点是当设备与边缘服务器断开连接时,系统的可靠性受到影响,进而影响模型的训练和性能。此外,我们还需要特别小心安全协议,因为边缘服务器可能会出现安全漏洞,并且更容易受到网络安全威胁。
一个直接使用这种架构的联邦学习模型的实际例子是层次化联邦平均(Hierarchical FedAvg),在该模型中,根据从客户端逐步接收的更新,采用多个边缘服务器进行部分模型聚合:
图 12.11 – FL 模型部署设计模式 – 层级聚合器
摘要
在本章中,我们了解了在开发 AI 解决方案时可持续性日益重要的背景,以及可以帮助我们减少二氧化碳排放的所需云计算指标、架构和操作技能。我们详细概述了如何根据客户端的能源可用性训练 FL 模型,以减少较高二氧化碳排放的负面影响。现在我们已经了解了高效的基于 FL 的设计模式,无论是训练、模型管理,还是模型聚合模式。
在联邦学习(FL)的训练和部署策略的背景下,我们还获得了探索基于深度学习(DL)的不同训练优化器的优势及其对解决方案可持续性影响的机会。此外,我们还探讨了集中式学习与联邦学习(FL)中的可持续性因素,这有助于我们使用硬件规格、效率、活动运行时、模型架构、冷却需求、云服务提供商和地区等信息来估算 GPU 计算的二氧化碳排放量。我们还探索了如何计算总能耗、可以使用的不同排放指标,以及我们可以遵循的最佳实践,以最大化数据中心的效率。
在下一章中,我们将深入探讨在创建特征存储时如何确保可持续性。
进一步阅读
-
朝着系统化报告机器 学习的能量和碳足迹:
jmlr.org/papers/volume21/20-312/20-312.pdf
-
如何计算我的 Azure 虚拟机的 CO2 等效排放量?:
devblogs.microsoft.com/sustainable-software/how-can-i-calculate-CO2eq-emissions-for-my-azure-vm/
-
可持续联邦学习框架, B. Güler 和 A. Yener:
dl.ifip.org/db/conf/wiopt/wiopt2021/WiOpt_2021_paper_100-invited.pdf
, 2021 第 19 届国际移动、自治和无线网络建模与优化研讨会(WiOpt) -
可持续的联邦 学习:
arxiv.org/pdf/2102.11274.pdf
-
云 可持续性:
cloud.google.com/sustainability
-
你的云服务有多无碳?新的数据让你 知道:
cloud.google.com/blog/topics/sustainability/sharing-carbon-free-energy-percentage-for-google-cloud-regions
-
联邦 学习中的 CO2:
mlsys.cst.cam.ac.uk/carbon_fl/
-
联邦学习能拯救 地球吗?
arxiv.org/pdf/2010.06537.pdf
-
联邦学习系统设计的架构模式:
www.researchgate.net/publication/348316341_Architectural_Patterns_for_the_Design_of_Federated_Learning_Systems
第十三章:可持续模型生命周期管理、特征存储和模型校准
本章的主要目标是为你提供在模型开发过程中应遵循的与可持续性相关的最佳实践。这与上一章讨论的与可持续人工智能相关的组织目标一致。我们的目的是鼓励组织层级中的不同层级的人们重构组织路线图,建立可信的人工智能解决方案。你将了解人工智能伦理的各个方面的重要性,以及需要遵循的最佳实践。我们将通过一个特征存储的例子说明如何将隐私、安全和可持续性纳入其中。
本章中,你将学习如何改进模型的概率估计,以获得更准确的结果。我们将从可持续性的角度探讨可调节系统。
通过将可持续性与模型训练和部署的概念结合,你将学习如何实现可持续、可调节的系统,这些系统促进协作和共享。你将探索模型校准,并了解在设计可调节的伦理人工智能解决方案时它的重要性。
本章内容包括以下几点:
-
可持续模型开发实践
-
特征存储中的可解释性、隐私和可持续性
-
探索模型校准
-
构建可持续、可调节的系统
可持续模型开发实践
除了道德地部署人工智能(AI)外,可持续性帮助我们所有人向更好的生态完整性和社会正义迈进。在构建人工智能产品的过程中——从创意生成到训练、调整、实施和治理——我们应该意识到我们的行动和人工智能解决方案对环境的影响,并确保它们对未来世代友好。当我们使用度量标准来考虑我们的工作影响时,我们会更负责任地和道德地开展工作。至关重要的是拥有一份描述模型开发各阶段最佳实践的组织路线图,这样变更管理最小且容易跟踪。这还将促进可持续人工智能的创新,并迫使组织为人工智能的训练、验证、部署和使用设定二氧化碳排放目标。
在接下来的子章节中,我们将探讨如何使组织、人员和流程能够朝着可持续人工智能模型开发的方向发展。这将帮助团队部署在长期内取得成功的模型。
首先,让我们看看组织如何制定构建可持续、可信框架的指南。
可持续、可信框架的组织标准
在 第三章 中,我们学习了关于可信 AI 的法规和政策;我们部署到生产的系统需要 100% 符合这些法规。我们有一些可以重用并集成到现有平台中的开源框架,如下所示:
-
TensorFlow 模型修正:这是由 Google 开发的一个库,旨在限制模型预处理训练或后处理过程中产生的偏差。
-
TensorFlow 隐私:这是由 Google 开发的一个库,使机器学习优化器能够在融合差分隐私的同时优化机器学习模型的目标函数。
-
AI 公平性 360:这是 IBM 开发的一个库,用于检测和缓解偏差。
-
负责任的 AI 工具箱:这是由 Microsoft 开发的一个库,旨在帮助在可信环境中伦理地访问、开发和部署 AI 解决方案。
-
XAI:这是一个通过模型评估和监控来促进模型可解释性的库。
-
TensorFlow 联邦:这是一个支持多个客户端参与的分布式训练的库。
此外,我们需要知道如何将最佳实践融入现有技术平台中,这些平台可以作为评估可信框架的指引。让我们总结一下组织领导应当践行的常见模型治理和风险管理活动。为了在开发和部署生命周期中建立最佳的伦理和可持续实践,需要回答 图 13.1 中列出的问题:
模型实践 | 关键问题 |
---|---|
模型开发阶段 | |
识别 | 组织是否根据联邦指导方针识别并列出了关键的合规工具?例如,对于银行和保险,某些金融和风险模型需要用于评估框架。 |
库存管理 | 模型库存管理策略是什么?例如,在模型开发生命周期中,是否有模型分类过程?不同的风险是否已被考虑,并且这如何影响不同模型的排名? |
命名策略和安全性 | 模型命名空间如何管理?是否考虑了领域问题以及业务用例?关键利益相关者如何参与模型版本控制和安全管理? |
正式化政策和程序 | 是否有适当的指南、审计检查清单以及授权人员参与正式化模型开发、验证、使用、监控和退休的标准和指南? |
合规性 | 是否有合规要求清单?是否有针对合规要求的定期审计?是否有经过培训的人员参与,并与机器学习、数据工程和分析团队密切合作,以确保所有企业系统都遵守确认和合规性? |
研究与最佳实践应用 | 是否有针对模型服务的实际问题进行深入研究的计划?是否有专门训练的人员负责研究并传播当前模型的最佳(标准)实践? |
文档编制 | 是否有良好记录的模型,涵盖问题定义和业务目标的范围?是否有特征存储的定义,并在团队共享和重用特征、模型和数据时建立了沟通流程?如何确保数据和模型的可用性,同时不违反安全性,并确保团队成员的意识? |
共享与重用 | 在集中式和联邦学习(FL)中,机器学习模型和特征是如何共享的?内建的安全、隐私和通知策略如何在团队之间的特征更新中应用? |
模型验证阶段 | |
测试与验证 | 当模型部署在服务框架中时,如何进行模型的单元测试和系统测试?为了确保正式的模型验证程序和模型服务 API,采用了哪些干预和监督技术?为了确保跨平台的模型互操作性,已采取哪些准则和实践?考虑了哪些排放指标? |
挑战/有效批评 | 在模型输入、输出、训练、验证和测试过程中遇到的审查/挑战如何处理?有哪些敏捷流程被采用,以便纳入增量模型变更,确保模型准确,同时又符合隐私、公平和可解释性? |
模型实施阶段 | |
治理的实施和使用 | 模型的标准操作程序是什么,特别是在刷新、查询、链接使用、数据转储和输入标识处理方面?是否遵循了共享控制工具的推荐实践?是否已经建立了共享用户技术,如监视窗口、平衡检查和备份? |
模型的持续监控 | |
修复 | 是否有适当的模型追踪机制,用于修复和纠正错误?是否已经为平台、机器学习模型和数据管道的可持续性定义了指标? |
变更管理 | 如何追踪和更新模型变更文档? |
审计和审查 | 是否已建立最佳的审计和审查流程,以验证防御层并确保模型输出的质量?如何建立基准,以在更大规模的企业平台中区分和扩展模型?如何有效地控制不同客户平台上基准的成本? |
风险容忍度、风险偏好和风险阈值的定义 | 模型接受的不同阈值水平是什么?我们是否基于问题范围、领域和数据量制定了一个风险容忍度水平,并在一定的不确定性范围内接受?我们是否在维护和建立每个模型期望值的财务影响/美元差异? |
识别次级风险 | 评估管理其他风险(例如延迟完成截止日期或干扰数据架构)所带来的风险的技术是什么? |
识别操作风险 | 我们如何定义模型实施中的操作风险?这是否涉及考虑和定期审查不同特征,例如折扣率,或确保操作程序的验证,如版本控制? |
识别新兴风险 | 随着模型的持续更新,出现的新风险或潜在的风险是什么? |
跟踪 | 传统模型、基于深度学习的模型和基于联邦学习的模型的跟踪步骤有哪些?这些跟踪步骤如何允许修改并在整个模型生命周期内提供额外使用的空间? |
持续监控 | 为了能够定期监控模型的准确性、相关性和可解释性,现有的监控工具和仪表盘有哪些?我们如何使用模型可解释性工具与业务利益相关者沟通关于商业模型的风险、数据以及概念漂移? |
AI 应用使用 | |
许可协议、使用条款和点击协议的条款 | 我们有哪些审核流程来验证许可协议、使用条款和担保条款?我们如何确保通过包含语言来防止不当使用 AI 应用,避免因意外应用产生的责任?例如,允许针对任何用于生命救援设备、关键任务航空电子设备、军事应用或军火的豁免,并同时声明不允许向禁运国家出口或使用。 |
表 13.1 – 关键模型实践与问题
每个业务单元都需要回答前述问题,以确保建模过程与公司战略的适当对接。这反过来有助于组织意识到可持续性实践,并将注意力集中在数据和模型开发以及治理策略上。总的来说,目标是以环保的方式促进重用和协调。因此,我们需要一个统一的链管理模型,通过提高透明度和可解释性并减少对关键人物的依赖,防止机器学习模型的潜在滥用。设定董事会治理公司和 CxO 办公室运作的伦理边界也是至关重要的。CxO(指 CEO、CTO 和 CIO 角色)发起的组织和推动上述过程的数据团队,是任何 AI 驱动的业务成功的关键。通过这样的举措,我们不仅可以提高几个百分点的利润率,还能通过明智使用资源和雇佣训练有素的数据团队,节省数十亿美元。
那些未能回答前面问题并建立所需流程的组织,通常会遭受时间和金钱的损失。此外,他们无法在这个竞争激烈的世界中维持基于 AI 的业务用例。
在理解了这一点后,我们可以继续深入研究特征存储。
特征存储中的可解释性、隐私性和可持续性
在第十章中,我们介绍了特征存储的概念,并通过一个例子演示了如何使用在线特征存储。此外,在前一节中,我们学习了可持续模型训练和部署的关键方面,并且了解了如何在不同的云服务商之间跟踪可持续模型指标的最佳实践。我们还在第十二章中看到,联邦学习(FL)通过允许设备本地训练,为可持续性提供了一个训练环境。因此,我们必须尝试在医疗保健、零售、银行等行业中,利用 FL 进行机器学习模型的训练,特别是在通用模型表示起到重要作用而计算能力有限的情况下。
在本节中,让我们深入探讨如何创建可解释的、私密的和可持续的特征存储。
特征存储的组件和功能
现在,让我们探索特征存储的不同组件如何在分布式架构中发挥其功能角色,如图 13.1所示:
图 13.1 – 伦理特征存储的不同组件
以下列表详细介绍了每个组件:
-
第一个组件是数据源单元,在这里数据可以从第三方来源接收并聚合。数据可以是原始数据、SQL 数据或事件数据。为了构建可持续的机器学习模型和特征存储,我们需要在基础设施中构建联邦学习能力,其中数据主要来自移动设备、物联网设备或医疗物联网(IoMTs)的事件数据。联邦学习无疑为我们提供了实践可持续模型开发的机会。然而,如果没有联邦学习,具有自动反馈循环和再训练能力的系统也可以帮助我们创建可持续的机器学习模型。
-
第二个组件包括数据摄取和特征工程管道,在这里,数据需要匿名化以保护个人身份信息(PII),我们在第二章中有讨论过。为了突出并构建可持续的管道,我们必须在设计中支持重用,以提取可以跨团队使用的相关特征。此外,为了支持基于联邦合作学习方法和部署策略,特征工程管道应该分布在云端和边缘设备上。这将有助于分配负载并控制集中训练程序的排放速率。例如,图 13.2展示了在边缘网络中使用深度神经网络(DNNs)的联邦学习工作方法。我们还展示了可以在服务器组件中使用的不同类型的云服务(来自谷歌云平台)。
图 13.2 – 边缘网络中的联邦学习
在前面的图中,图 13.2,客户端从多个物联网设备收集数据,并进行基于本地深度学习的模型训练,而部署在多个边缘的少数服务器负责第一层模型聚合,最终将其聚合到云端。聚合后的模型随后被推送到边缘,客户端继续在本地数据集上进行训练。
-
第三个组件涉及特征管理和在线与离线处理的可解释性。在第四章中,我们讨论了如何通过使用适当的安全规则创建沙箱环境或隔离单元,以处理和存储不同团队所需的特征,这些团队具有不同的敏感性级别(请参见第四章中的图 4.12)。该组件还涉及满足规范特征可解释性、偏差识别和特征推荐的 AI 伦理原则。数据和特征的公平性也需要通过该组件来满足,因为有偏的数据集和提取的特征可能导致有偏的机器学习模型。
-
第四个组件是存储,在此存储元数据、在线和离线特征。这包括 SQL 和 NoSQL 数据库以及缓存,数据可以存储在磁盘上,也可以存储在内存中以便快速检索。
-
第五个组件涉及用户如何执行时间旅行查询,这些查询能够快速搜索并返回某一特定时间点的数据(我们可以了解数据的历史以及记录其沿革),某一时间区间的数据,以及自某一时间点以来数据所做的更改。时间旅行查询通过使用索引(布隆过滤器、z 索引和数据跳过索引)高效执行,这些索引值得特别提及,因为它们减少了需要从文件系统或对象存储读取的数据量。
-
最后的组件(与模型训练、部署和监控一同)还负责识别模型漂移。通过对个别模型设置访问权限,该组件促使模型评分指标的比较,以便快速采取模型再训练的措施。
接下来,让我们继续学习 FL 的特征存储。
FL 的特征存储
我们看到特征存储在 ML 模型重用和集中学习特征中的重要作用,在 第十章 中已经讨论过。现在,让我们探讨如何利用现有的特征存储管道概念来支持协作学习,特别是在 FL 框架的案例中。这将促进联合工具的开发和部署,允许组织、教育机构和合作伙伴的技术团队共同协作,分享数据、ML 模型和特征。
我们将看到 FeatureCloud AI Store 如何为 FL(主要用于生物医学研究)提供一个平台,通过统一一组即用型应用来跨领域使用。
图 13**.3 展示了 FeatureCloud 的不同组件,解释了合作方如何协作创建一个可以包含新的第三方应用程序的云端认证特征存储:
图 13.3 – 一个私有的 FeatureCloud 存储用于 FL
这些统一的联邦应用可以在可扩展平台上产生类似于集中式机器学习的结果。随着协作的增加,内置的隐私机制如同态加密、安全多方计算和差分隐私变得极为重要,因为它们可以保护敏感信息。FeatureCloud AI Store 是一个特征存储,通过重新定义应用程序接口(API),消除了传统基于联邦学习(FL)建模的限制,使开发者可以更容易地重用和分享外部开发者的创新应用程序。配合开放的 API 系统,它支持部署分发,允许通过可配置的工作流程使用算法。该特征存储对外部开发者透明开放,开发者可以自由添加和发布自己的联邦应用,使该系统成为数据、模型和应用程序高效协作的媒介。
如前图所示,第三方应用中提供的应用接口提供了有关不同类别应用的详细信息,通过显示它们的基本信息,包括简短描述、关键词、用户评分和认证状态。此外,每个应用不仅被分类为预处理、分析或评估,还配备了图形化前端或简单配置文件,用于设置应用参数并使其适应不同的上下文。
任何在 FeatureCloud 中运行的应用都在一个 Docker 容器内运行,该容器可以通过 FeatureCloud API 与其他应用交换数据和其他关键信息。该存储通过提供模板和测试模拟器来加速联邦应用的开发。
这种共享应用环境带有应用文档、搜索和过滤功能,以及应用认证流程,以推动 AI 商店中的隐私标准。认证流程对频繁测试隐私泄露有严格的指导原则;如果测试失败,将通知相关开发者解决问题。然而,它也提供了一项功能,即每当应用更新时,都会发起一个新的认证流程。
这种协作型、可持续的平台的一个主要缺点是,协调者在聚合各个模型之前可以访问所有的单独模型。因此,该框架提供了不同的隐私保护措施,如安全多方计算和差分隐私,以防止任何隐私泄露。
联邦工作流可以通过让所有协作伙伴在他们的机器上下载并启动客户端 FeatureCloud 控制器(使用 Docker)来设计。由于用户可以在 FeatureCloud 网站上创建账户,跨用户应用程序的协调可以顺利建立。这通过在工作流中的独立应用程序中集成交叉验证(CV)、标准化、模型训练和模型评估程序,促进了跨机构的数据和算法共享与分析,如图 13.4所示:
图 13.4 – 基于应用程序的 FL 的 FeatureCloud 工作流
当多个应用程序形成一个工作流时,这些应用程序的连续执行完成了一个独特工作流的运行。一个应用程序的输出或结果可以被另一个应用程序消费,整体工作流的进展可以被追踪或监控。工作流的结果可以在参与方之间共享,以便理解和评估整体建模过程的每一步。FeatureCloud 可以解决生物医学和其他领域的实际问题。
现在我们了解了 FeatureCloud 的运作方式,让我们尝试了解一些它的重要属性。
FeatureCloud 的属性
在这里,我们将学习如何通过一套在联合设置中创建的应用程序,构建一个协作云环境,帮助我们提供更好的工作流:
-
FeatureCloud 提供了多种机器学习算法的组合,来解决常见问题,通过高效地利用 AI 商店或应用模板中的应用程序。
-
它使用一种通用的标准化数据格式,提供了一种简便的方法来组合应用程序进入工作流,从数据摄取和相互数据消费到输出生成。
-
它推动了协作研究,通过引入经验较少的开发者和有经验的专业人士,共同创建定制化的工作流,以实现更广泛的目标。
在本节中,我们了解了与道德合规的联合特征存储相关的概念。现在,让我们了解如何通过确定不同类别预测的可能性,来增强 AI/ML 驱动系统的可预测性。这将帮助我们设计出具有最小漂移的现实系统。
那么,让我们探索模型校准,这是一种不仅能改善模型概率估计,还能帮助创建可持续、稳健的模型预测的后处理技术。
探索模型校准
校准是一种模型后处理技术,用于提高概率估计。其目标是改进模型,使得预测概率和观察到的概率的分布及行为相匹配。
对于关键任务应用,需要进行模型校准,在这些应用中,数据点与某一类别相关联的概率非常重要——例如,构建一个预测个体生病概率的模型。
让我们通过经典的猫狗分类器示例更好地理解校准。
假设我们正在使用一个猫狗分类器,其中所有输入图像要么是猫要么是狗。现在,如果模型认为输入图像是猫,它输出1
;反之,如果它认为输入图像是狗,它输出0
。我们的模型本质上是连续映射函数——也就是说,它们输出介于0
和1
之间的值。这可以通过数学方法实现,例如在最后一层使用 sigmoid 函数作为激活函数。一个好的分类器通常会为猫生成接近1
的分数,为狗生成接近0
的分数。
那么这些介于0
和1
之间的分数是否代表实际的概率呢?
图 13.5 – 猫狗分类器示例
上图中的 0.18 分数意味着输入图像中有 18%是猫吗?如果模型经过良好校准,那么假设是的!我们可以将其结果解释为概率。主要问题是如何判断我们的模型是否已经校准好。考虑一个现实生活中的例子——当天气应用给出的降雨概率低于 5%时,你却看到外面乌云密布。这通常发生在模型没有良好校准的情况下,从而导致其表现不佳。让我们来看看如何判断一个模型是否经过良好校准。
判断模型是否经过良好校准
参考之前的猫狗分类器示例,为了理解这些数字是否可以视为概率,我们需要绘制一个可靠性图。在可靠性图中,x轴绘制模型给出的分数——即正类的预测概率(在我们的例子中是猫
类)。每当接收到一张图像时,它将根据模型给出的分数被放入正确的区间——例如,如果图像的分数为 0.9,它将被放入 0.8 到 1 的区间,模型假定它更有可能是猫的图像。对于分数为 0.06 的图像,它将被放入 0 到 0.2 的区间,表示该图像很可能是狗的图像。我们可以以此类推,继续为许多图像绘制图表。当我们添加大量图像后,可以查看y轴,它表示实际为猫的图像数量;换句话说,y轴表示正类的实际频率。对于一个良好校准的分类器,这些点将接近对角线。
图 13.6 – 模型输出的分数与实际为猫的图像比例
上述图表展示了一个校准不准确的模型示例。在 0.4 到 0.6 的范围内,如果得分确实代表概率,那么某个图像是猫的概率应该是 40%到 60%。然而,我们只看到在这个区间内,图像为猫的概率为 25%;这表明这是一个校准不准确的模型。
校准适用于分类任务和回归任务。这里我们讨论的是分类任务的示例。在回归任务中,我们关注的是估计预测值的概率分布。校准后的回归模型定义了平均预测值,并且围绕这个均值的预期分布反映了与预测相关的不确定性。
在深入探讨不同的校准技术之前,我们首先要了解为什么会发生校准不准确。
为什么会发生校准不准确
校准不准确是机器学习模型常见的问题,尤其是当模型没有在概率框架下训练,且训练数据存在偏差时。在大多数情况下,模型的固有特性决定了该模型是否最终会被校准。以逻辑回归为例,我们利用损失函数,因此无需额外的训练后处理。这是因为其生成的概率在前期已经过校准。高斯朴素贝叶斯中的独立性假设可能导致概率估计不准确,将其推向接近 0 或 1 的值。然而,在随机森林分类器的情况下,接近 0 或 1 的值很少出现,因为是多个内部决策树的平均值计算得出的。唯一能确保达到 0 或 1 的方式是每个模型返回一个接近 0 或 1 的值,这是从概率的角度来看非常有趣的情况。
现在让我们了解各种校准技术。
校准技术
一些分类模型,如支持向量机(SVM)、k 近邻和决策树,既不提供概率分数,或者给出的是不准确的估计值。这些方法需要被强制给出类似概率的分数,因此,在使用前必须进行校准。
Platt 扩展和等距回归是目前最为突出的两种校准技术。两者都将模型的输出转换为似然分数,从而实现校准。我们将在接下来的章节中研究这些技术。
Platt 扩展
这一技术的原理是将分类模型的输出转换为概率分布。简而言之,当校准图呈现 S 形曲线时,使用 Platt 扩展技术非常有效,尤其适用于小型数据集。
图 13.7 – Platt 扩展示意图
Platt 缩放是一个修改过的 S 型函数,通过求解优化问题来获得 A 和 B。它返回对实际结果的确定程度,而不是返回类别标签。对于诸如支持向量机(SVM)之类的分类模型,如前所述,我们采用特定的转换技术来校准模型,并获取概率作为输出。
等距回归
与 Platt 缩放相比,等距回归是一种更强大的校准技术,能够修正任何单调的失真。当校准图形看起来不像 S 型曲线时,它会被使用。等距回归将曲线分割为多个线性模型,因此需要比 Platt 缩放更多的点。这种技术试图找到一组最佳的非递减预测,并尽可能接近原始数据点。该方法在应用于校准问题时,涉及在原始校准曲线上实施回归。与 Platt 缩放不同,等距回归不推荐用于小型数据集,以避免过拟合,并且适用于大型数据集,因为它对离群点较为敏感。
接下来,我们将通过一个动手示例,展示模型校准如何影响模型的可靠性。
使用 scikit-learn 进行模型校准
在本节中,我们将使用 scikit-learn 模块合成数据,以比较未校准模型和已校准模型的可靠性与性能。具体方法如下:
-
首先,我们导入所有必要的模块。在这里,我们将使用 scikit-learn 来生成合成数据,并构建分类器——包括未校准和已校准的分类器:
from sklearn.datasets import make_classification from sklearn.calibration import CalibratedClassifierCV from sklearn.calibration import calibration_curve from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score, brier_score_loss import matplotlib.pyplot as plt import pandas as pd import numpy as np import seaborn as sns
-
在这里,我们首先考虑一个平衡的数据集。以下语句生成了 10,000 个样本,每个样本有 10 个特征,并且两类的分布是相等的:
X, y = make_classification(n_samples=10000, n_features=1000, n_redundant=10, random_state=37, weights=[0.5])
为了方便,我们将特征和标签放入各自的 DataFrame 中:
Xs = pd.DataFrame(X)
ys = pd.DataFrame(y, columns=['label'])
-
现在,让我们使用以下代码验证数据是否平衡:
#plotting bar chart ys.value_counts().plot(kind='bar')
在下图中,您可以看到标签的均匀分布:
图 13.8 – 显示合成数据中类别分布的条形图
-
接下来,我们将数据分为训练集、验证集和测试集,比例为 60:20:20:
X_train_raw, X_test, y_train_raw, y_test = train_test_split(Xs, ys, test_size=0.20, shuffle=False) X_train, X_val, y_train, y_val = train_test_split(X_train_raw, y_train_raw, test_size=0.20, shuffle=False)
接着,我们在训练数据集上训练一个简单的逻辑回归分类器:
clf = LogisticRegression()
clf.fit(X_train, y_train.values.ravel())
y_pred_uncal = clf.predict_proba(X_test)[:, 1]
让我们通过曲线下面积指标来查看分类器的表现:
roc_auc_score(y_test, y_pred_uncal)
>>> 0\. 9185432154389126
我们分类器的 auc
值是 0.92
——还不错!
我们还使用 Brier 分数 来检查分类器的表现。它是对概率预测准确度的衡量,数学表达式如下:
Brier 分数 = 1N∑i = 1Np(yi) − o(yi)²
这里,N 是实例的数量,p(yi) 是实例 i
属于 yi 类的预测概率,o(yi) 是实例 i
的实际结果,若 yi 为真实类别,则 o(yi) = 1,否则 o(yi) = 0:
brier_score_loss(y_test, y_pred_uncal)
>>> 0.10919273032433353
布赖尔得分的范围从 0 到 1,得分为 0 表示完美准确,得分为 1 表示最差的表现。我们的分类器显示布赖尔得分为 0.11,表现依然优秀。
现在,让我们为同一平衡数据集重复该过程,使用校准后的分类器:
Calibrated_clf = CalibratedClassifierCV(clf, method='sigmoid')
calibrated_clf.fit(X_val, y_val.values.ravel())
y_pred_cal = calibrated_clf.predict_proba(X_test)[:, 1]
print(f'ROC Score {roc_auc_score(y_test, y_pred_cal):.2f} \nBrier Score {brier_score_loss(y_test, y_pred_cal):.2f})
>>> ROC Score 0.92
>>> Brier Score 0.11
从准确性和布赖尔得分(Brier score)值来看,我们可以看到,对于平衡数据集,未经校准的分类器与校准后的分类器表现相当:
plt.rcParams.update({'font.size': 10})
frac_of_positives_uncal, pred_prob_uncal = calibration_curve(y_test, y_pred_uncal, n_bins=10)
sns.lineplot(x=pred_prob_uncal, y=frac_of_positives_uncal)
frac_of_positives_cal, pred_prob_cal = calibration_curve(y_test, y_pred_cal, n_bins=10)
sns.lineplot(x=pred_prob_cal, y=frac_of_positives_cal)
plt.grid(linestyle='-', linewidth=0.2)
plt.title("Reliability curve balanced data")
xlabel = plt.xlabel("Probability of positive")
ylabel = plt.ylabel("Fraction of positives")
plt.legend(labels = ['Uncalibrated', 'Calibrated'])
ticks = [0, 0.2, 0.4, 0.6, 0.8, 1]
xticks = plt.xticks(ticks)
yticks = plt.yticks(ticks)
以下绘制的可靠性曲线证实了这一点:
图 13.9 - 平衡数据的可靠性曲线
现在,让我们为不平衡数据集重复该过程:
X, y = make_classification(n_samples=10000, n_features=1000, n_redundant=10, random_state=37, weights=[0.7])
Xs = pd.DataFrame(X)
ys = pd.DataFrame(y, columns=['label'])
我们可以通过绘制标签的频率图来验证类别的高度不平衡:
#plotting bar chart
ys.value_counts().plot(kind='bar')
这里是相应的图表:
图 13.10 - 显示合成数据中类别分布的条形图
如前所述,我们将数据集按 60:20:20 的比例分为训练集、验证集和测试集:
X_train_raw, X_test, y_train_raw, y_test = train_test_split(Xs, ys, test_size=0.20, shuffle=False)
X_train, X_val, y_train, y_val = train_test_split(X_train_raw, y_train_raw, test_size=0.20, shuffle=False)
现在,我们探索未经校准的模型:
clf = LogisticRegression()
clf.fit(X_train, y_train.values.ravel())
y_pred_uncal = clf.predict_proba(X_test)[:, 1]
print(f'ROC Score {roc_auc_score(y_test, y_pred_uncal):.2f} \nBrier Score {brier_score_loss(y_test, y_pred_uncal):.2f}')
>>> ROC Score 0.88
>>> Brier Score 0.04
最后,我们探索校准后的模型:
calibrated_clf = CalibratedClassifierCV(clf,cv=3, method='isotonic')
calibrated_clf.fit(X_val, y_val.values.ravel())
y_pred_cal = calibrated_clf.predict_proba(X_test)[:, 1]
print(f'ROC Score {roc_auc_score(y_test, y_pred_uncal):.2f} \nBrier Score {brier_score_loss(y_test, y_pred_uncal):.2f}')
>>> ROC Score 0.88
>>>Brier Score 0.04
这里是相应的图表:
图 13.11 - 不平衡数据的可靠性曲线
我们可以看到,校准后的模型相比未经校准的模型,对于不平衡数据提供了更可靠的预测。
现在让我们通过考虑动态校准曲线来探索如何设计适应性强的系统。
构建可持续、适应性强的系统
我们已经查看了模型治理、可持续模型训练和部署的逐步流程。我们现在也明白了构建可重用特征存储的重要性。
我们了解到,如果没有特征存储(feature store),每个我们想要部署的模型都会有一个独立的特征工程流程。重复的流程不可避免地会导致计算成本增加、数据血统(lineage)开销增大以及大量工程工作。然而,如果建立的特征存储没有足够的鲁棒性和适应性以应对数据和概念漂移,那么建立可持续的特征存储的努力将是徒劳的。
即使在设计大规模分布式机器学习系统时,我们也应考虑构建一个具有检测数据漂移、概念漂移和校准漂移能力的适应性系统。这将有助于持续监控,并意味着我们可以管理来自不同来源的新数据。例如,在零售系统中,我们可能会遇到具有不同购买模式的新客户,而在医疗保健系统中,我们可能会看到新患者带来新的疾病。为了构建能够应对持续变化的适应性系统,我们必须理解校准和动态校准曲线如何帮助我们检测和改善模型性能。校准曲线提供了在一系列预测概率下的模型性能的图示,而动态校准曲线则通过考虑每个观察值的情况,帮助我们可视化时间序列上真实校准曲线的发展。此外,动态曲线通过表示预测概率的加权分布,帮助我们估算评估集上的拟合值。这种拟合有助于评估拟合曲线的性能。你可以在这里阅读更多内容:www.sciencedirect.com/science/article/pii/S1532046420302392
。
我们构建的特征存储应该内置自动化功能,以支持动态校准曲线,并评估来自新观察的模型性能变化。特征存储漂移检测器可以在新数据积累时提醒团队注意误校准,此外,还可以使用最近的数据窗口自动化重新训练过程。最重要的是,如果我们能够准确检测时间序列中的漂移,并且趋势似乎是永久性的,那么我们还应该看到校准的变化。
一旦校准漂移开始,MLOps 团队应警惕其速度和幅度,这可以通过精确的监控系统有效检测。变化应来自相对较高数量的观察,以确保我们有信心确定模型从已校准状态转变为误校准状态。
由于在相关概率区域内的知识有限,动态校准曲线在低密度、高概率范围内学习误校准的能力不够强。
图 13.12 展示了动态校准曲线,特别是其响应如何因模型性能的变化而在一段时间内发展。
所谓误校准(et),是指曲线偏离理想校准的情况,其通过计算观察值的预测概率(pt)与当前曲线在预测概率处的拟合值之间的绝对差异来获得(www.sciencedirect.com/science/article/pii/S1532046420302392
)。
图 13.12 – 一段时间内的动态标定曲线
这里列出了需要关注的一些重要领域,以检测需要更新模型的标定漂移:
-
动态标定曲线应旨在展示性能衰退,即使不突出具体的衰退部分。
-
错标定可能会在过度预测和欠预测区域之间出现波动,且概率边界较宽。这一点在漂移前后的标定误差变化中得到了进一步体现。
-
标定漂移通常源自过渡状态。
-
动态标定曲线的方差可以通过调整 Adam 优化器的步长或初始学习率来处理,从而快速响应模型性能的变化。(Adam 优化器是一种深度学习优化器,用于随机目标函数的一阶基于梯度的优化)
-
对于模型性能的显著性边际,需要为非常小的标定变化正确设置和定义。
-
根据模型的复杂性,需要定义最小窗口大小,以捕获足够的样本进行模型更新。
正如你在图 13.13中看到的,在线和离线特征空间是共享的,创建了一个合并的共享特征,称为编码器。参见下图:
图 13.13 – 特征存储中标定漂移检测器的重要性
虽然B 队参与离线特征生成过程,A 队和C 队则参与在线特征生成过程。如果任何在线特征的突然变化触发标定漂移并损害模型的性能,必须立即向B 队触发警报,因为该队也访问共享特征空间。使用B 队共享特征训练的模型也可能经历标定漂移,并且必须通过触发重新训练来立即进行修正。
在这里,我们观察到运行和触发警报的标定漂移检测算法的重要性。
除了标定漂移,我们在第七章中研究了数据和概念漂移如何发挥重要作用,以及适应性框架如何发展以应对这些漂移。现在,重要的是,我们要拓宽视野,将这一概念应用于可持续训练环境,并将适应性框架融入特征存储。我们已经了解了可持续特征存储;现在,让我们将概念漂移的思想整合到 FL 环境中。
考虑概念漂移的联邦平均(CDA-FedAvg)
我们在 FL 设计模式中看到,异步发送模型更新的方法对于电力消耗大的设备非常有利,使它们在有电的情况下灵活参与训练。它还帮助在协作环境中进行概念漂移检测和适应技术,服务器负责协调这一过程。
服务器充当协调者,将来自各个设备的模型进行聚合,本地设备则成为决定性主体,选择数据和触发本地训练过程的时间。
由中央服务器聚合的模型是全球公认的(参与实体的每个单独模型都经过服务器的同意并平均化),然后服务器将其广播到所有客户端。客户端负责检测和处理数据和模型模式的变化。客户端在其本地训练数据集上训练模型,并通过三阶段过程来管理漂移:
-
基于时间的漂移识别
-
漂移根本原因分析(RCA)用于识别漂移的原因和漂移开始发生的数据实例
-
响应与缓解方法以适应漂移,从而产生高精度模型
当客户端接收到来自多个输入源的新收集数据时,它们会配备漂移检测算法以识别新概念(漂移检测)并从中学习。内建的漂移适应技术帮助分析数据或模型在两个时间戳之间的差异,以及分析漂移的性质或其原因,并采取相应的补救措施。当地客户端配备了短期记忆和长期记忆,以便在检测到漂移时立即做出响应。短期记忆帮助存储和比较客户端在最新时间间隔内收集的数据实例,而长期记忆则存储过去事件或概念的数据样本,这些事件或概念与当前时间点相比较。
这种具有短期和长期记忆的适应性帮助我们理解数据、模型模式和概念,并通过长时间存储数据记录来触发本地模型训练或再训练。这个过程按照事件顺序发生,如图 13.14所示:
图 13.14 – CDA-FedAvg 在 FL 客户端中的应用
如前所示图所示,我们基于漂移的存在与否采取以下行动:
-
当本地训练过程尚未启动时,短期和长期记忆都会初始化为空。
-
一旦客户端获得首个数据,它将作为初始概念存储在长期记忆中,并用于首次训练和本地更新。
-
客户端收到的任何后续数据将存储在短期记忆中,以评估漂移。
-
在识别到潜在漂移后,与新概念相关的新数据将被存储在长期记忆中。
-
此外,新的漂移案例会触发客户端的新的训练轮次。
因此,一个设计良好的系统不仅应运行最佳的概念漂移检测算法,无论是在集中式还是 FL 环境中,还应经过良好的校准,以确保由于输入数据变化导致的漂移最小。
总结
在本章中,我们学习了领导者和利益相关者应采取的主要指导原则,以便采取直接行动,推动最佳的模型构建实践融入他们的组织文化。本章深入探讨了如何在设计联邦特征存储时充分利用联邦学习,鼓励通过使用 API 促进协作研究。此外,我们还探索了特征存储中可适应框架的概念,这些框架在隐私、可解释性和公平性方面也符合伦理要求。
此外,我们还学习了如何通过校准来改进模型,当模型输出显示存在高概率区域时,这些区域可能并不真实。也可以考虑将预测分数作为输入的指标——例如,曲线下面积-接收者操作特征(AUC-ROC)分数基于预测位置,但在准确校准的概率方面表现不佳。
校准在复杂的机器学习系统和实际场景中具有优势。它在训练后调整机器学习模型的结果,并保持输出的一致性。执行校准可能会影响模型的准确性,通常观察到校准后的模型准确度略低于未经校准的模型。然而,这种对准确性的负面影响非常低,而校准所带来的优势则要显著得多。如果模型的目标是实现良好的概率预测,校准模型是提高预测性能的关键步骤。
在本章中,我们识别了伦理模型的可持续性方面,以及如何将联邦学习(FL)和联邦特征存储结合起来,通过可持续能源解决方案来计算和控制碳排放。在充分理解了最佳设计框架用于伦理机器学习建模之后,在下一章中,我们将学习如何将这些模式应用于不同领域,以解决实际的使用案例。
深入阅读
-
FeatureCloud AI Store 在生物医学和 其他领域中的联邦学习应用:
arxiv.org/pdf/2105.05734.pdf
-
临床预测模型中校准漂移的检测,以指导模型 更新:
www.sciencedirect.com/science/article/pii/S1532046420302392
-
校准技术及其在机器 学习中的重要性:
kingsubham27.medium.com/calibration-techniques-and-its-importance-in-machine-learning-71bec997b661
-
校准,数据不平衡:
amueller.github.io/aml/04-model-evaluation/11-calibration.html
-
Brier 分数:理解模型 校准:
neptune.ai/blog/brier-score-and-model-calibration
-
如何为不平衡 分类校准概率:
machinelearningmastery.com/probability-calibration-for-imbalanced-classification/
-
分类器 校准:
towardsdatascience.com/classifier-calibration-7d0be1e05452
-
为什么模型校准很重要,如何实现 ?:
www.unofficialgoogledatascience.com/2021/04/why-model-calibration-matters-and-how.html
-
Python 中的模型校准是什么意思 ?:
www.projectpro.io/recipes/what-does-model-calibration-mean
-
模型 校准指南:
wttech.blog/blog/2021/a-guide-to-model-calibration/
-
机器 学习中的校准:
medium.com/analytics-vidhya/calibration-in-machine-learning-e7972ac93555
-
预测与校准技术以优化机器学习 模型的表现:
towardsdatascience.com/calibration-techniques-of-machine-learning-models-d4f1a9c7a9cf
第十四章:行业范围的应用案例
本章展示了关于零售、供应链管理、银行和金融以及医疗健康领域的负责任 AI 的不同应用案例。本章的主要目标是通过实践应用帮助您提升技能,以便将 AI 解决方案应用于现实世界的用例,进而推动创造一个更加公平和包容的世界。您将增强对 AI 伦理和合规性的理解,帮助您更好地识别和解决涉及 AI 在不同产业领域应用的未来用例。此外,本章还将让您通过在大规模分布式系统中应用基于 AI 的工具和算法,测试、衡量和量化各行业领域的业务成果。
在本章结束时,您将能够创建关于零售、银行和医疗领域的无偏、公正的 AI 驱动解决方案。
本章将涵盖以下主题:
-
在各行业中构建道德的 AI 解决方案
-
涉及零售和供应链管理领域的 AI 应用案例
-
涉及银行和金融领域的 AI 应用案例
-
涉及医疗健康领域的 AI 应用案例
技术要求
本章要求您安装 Python 3.8,并使用以下命令安装以下 Python 软件包:
-
tensorflow-2.7.0
-
pip
install pycausalimpact
-
pip
install causalml
-
pip
install dice-ml
-
pip
install causalnex
-
pip
install auton-survival
在安装这些库时,您可能会发现依赖库之间存在冲突,因此建议您先安装并运行一个库的应用案例,然后再继续安装下一个库。
让我们首先看看各个行业领域如何遭遇偏见解决方案,以及如何构建道德的解决方案来改善客户体验。
在各行业中构建道德的 AI 解决方案
聊天机器人在零售、金融、医疗、旅游、酒店和消费品行业,以及其他垂直行业中发挥着重要作用。因此,负责任的 AI 实践应该能够识别由 AI/ML 模型产生的偏见聊天机器人,并采取适当的措施确保它们在预测中的公正性。
偏见聊天机器人
聊天机器人无法理解某些口音或方言,导致负面的客户体验。客户被迫直接联系您的客服部门。聊天机器人在零售行业的应用广泛,主要体现在以下几种方式:
-
通过提供 24/7 全天候服务、快速响应时间,并解决客户问题,帮助保留客户。
-
通知客户新产品的可用性,并提醒客户与买家兴趣相符的个性化产品。
-
通过获取客户信息,如电话号码、支付选项等,帮助客户下订单并确保顺利的结账流程。
在多样性不足的数据上训练的聊天机器人会给终端用户提供偏见性的答案,迫使他们直接拨打客户服务电话。在仅使用美式英语口音数据训练的聊天机器人可能无法理解少数群体和被低估群体的口音和方言,例如非裔美国人英语。一个例子是 Facebook 基于 Reddit 数据训练的 Blender 聊天机器人,它很快学会了粗俗的语言。
一个类似的案例是微软于 2016 年推出的 AI 聊天机器人 Tay,它开始发布种族主义言论,并在发布后的 24 小时内被撤回。Tay 仅使用来自 Twitter 的数据进行训练,展示了偏见数据集如何对不同人口群体产生歧视性预测。
除了符合伦理标准的聊天机器人外,我们还需要考虑扩展现实(XR)/增强现实(AR)/虚拟现实(VR)环境的伦理问题,因为它们在各行业中得到了广泛应用。因此,让我们了解在零售行业中,VR、AR 和 XR 环境是如何被使用的,以及它们在设计时遵循最佳实践的重要性。
XR/AR/VR 中的伦理问题
零售行业已经推出了多种XR工具,包括AR、VR和混合现实(MR),这些工具通过数字技术使顾客在购买之前能够与他们选中的商品互动和体验。零售商现在配备了 AR/VR 设施,可以将顾客可能想试戴的任何物品进行数字投影,从不同尺寸和颜色的眼镜到珠宝、衣服、鞋子和手表等。顾客还可以利用智能手机相机在家中组织他们计划购买的家具,甚至可以将自己传送到不同的地点,享受他们所穿衣服或鞋子的感觉。
随着品牌在社交媒体平台上的影响力不断上升,品牌和监管机构应当意识到在这些平台上促进人工智能伦理使用的最佳实践。由于通过人口信息定位客户并提供个性化购物体验,一些品牌开始面临关于其产品的指控,因为许多产品被发现带有种族主义的品牌标签。例如,许多国际消费品品牌计划从其产品中移除“公平”、“白色”和“亮白”等标签,包括在印度流行的美白面霜。
康德义务伦理学(其制定了适用于所有人类的普遍道德原则,不受情境或背景的限制)解释了人类应当以尊重和荣誉的态度相互对待,就像他们希望别人以同样的方式对待自己一样。这也适用于 AR/VR 的情境——如果我们对虚拟角色不尊重,或故意或无意地实施暴力或不宽容行为,可能会对这些角色所代表的人造成心理伤害。因此,AR/VR 的设计者必须审慎考虑虚拟角色和代理人可能执行的所有行动,禁止它们进行不道德的行为。
在缺乏关于 AR/VR/XR 数据隐私、版权和责任的结构性法规的情况下,我们可以将康德义务伦理学作为思考人工智能伦理影响和应当规范人工智能系统开发和使用的道德规则的框架。例如,康德的定言命令认为我们应当只以我们愿意看到普遍适用的方式行事,这一原则可以应用于人工智能系统的开发。可以认为,我们应当只开发符合道德价值观并愿意普遍适用的人工智能系统,而不是开发可能被用于不正当目的或可能导致负面后果的系统。
此外,伦理机构和经验丰富的研究人员应评估易受影响群体暴露于可能造成伤害并影响用户身心健康的敏感话题的风险。例如,顾客可能访问一个虚假的虚拟零售商店,并被提示进行虚假的商业交易,顾客的个人数据和银行信息将被盗取。
因此,这类 AR/VR 系统的开发者应考虑以下参数,并可能根据受众的特点进行调整。例如,某些 AR/VR 系统可能对残障人士或老年和年轻人群体构成危险 (www.frontiersin.org/articles/10.3389/frvir.2020.00001/full
)。这包括以下内容:
-
AR/VR 媒体的速度(或帧率)以及人们可能经历的晕动症程度。
-
影响一个人的感官、运动和知觉能力,或者其手动灵活性或身体定位能力。
-
通过劝导行为可能对个体产生的信息过载程度。
-
长期和频繁使用 XR 可能导致对物理世界事件的不信任,以及对虚拟世界事件的过度优先考虑,例如顾客可能在一段时间后无法区分真实与虚拟事件。
-
在虚拟现实环境中,用户需要时间来适应体验的强化,或考虑到需要心理治疗以防止其产生不良反应。
-
在虚拟现实环境中离开后,人们可能带着认知、情感(例如,如果观众的虚拟形象被虚构角色侮辱)和行为(例如,某些在 XR 环境中被接受的行为在社会上是非伦理的,如性别或种族歧视,或对特定群体的错误归因)上的困扰,再次进入现实世界时可能会有负面影响。
-
即使是在虚拟世界中的现实情境,在现实世界中也可能是危险的。当客户在 XR 中看到一些现实世界中没有对应物的事物,并尝试将其复制到现实世界时,就会出现这种情况。一个例子是椅子问题,客户尝试坐在一个没有物理对应物的虚拟椅子上。
为了设计符合伦理的零售行业解决方案,我们必须考虑隐私、公平性和可解释性。
零售行业中的使用案例
让我们考虑一些能够传达这些方面重要性的具体使用案例。
零售行业的隐私
零售商应主动通过遵守数据隐私和安全相关的法律法规来保护客户的敏感数据,如欧盟的通用数据保护条例(GDPR)。全球范围内,零售商还必须遵守其他法律,以保护消费者。这包括 2002 年的电子商务条例、支付卡行业数据安全标准、反垃圾邮件法以及全球其他众多规则。为了保障客户数据的安全,一些最佳的安全实践包括安装防火墙服务、强制实行双因素认证以及其他在第二章中详细说明的安全做法,风险规避方法与框架的出现。
零售行业的公平性
在零售行业中,人们观察到,基于人工智能驱动的解决方案往往会根据人们的社会人口学(性别、种族或其他被认为敏感的属性)背景,导致不同的结果。因此,作为人工智能设计师,我们必须深入研究客户细分,以便制定我们的解决方案。我们知道,在零售行业中,客户档案在决定客户对公司终身价值方面起着主导作用。因此,客户档案以及他们的浏览历史,决定了是否可以根据客户的点击流(即用户浏览会话中的一系列事件)来提供促销、折扣和优惠券。然而,即使考虑了这些因素,研究表明,激励购买的行为(Koehn 等人,2020,通过点击流数据使用深度学习预测在线购物行为,https://www.sciencedirect.com/science/article/abs/pii/S0957417420301676
)可能导致优惠券的分发,其中来自某些社会、人口或文化背景的消费者会受到偏袒和不公平的对待,而没有收到折扣的消费者则产生负面情绪。一个例子是当折扣分配不均,并主要面向那些具有更高购买可能性的高收入家庭的人员,而低收入家庭的人员则被排除在外。
此外,点击流会话揭示了男性和女性用户之间的明显差异,并得出结论,性别即使作为一个代理变量,也会导致偏倚模型的产生。统计数据表明,女性用户通常有更高的浏览频率,并且每次会话在网页上的停留时间也更长。随着浏览时间的增加,电子商务平台的后台处理引擎通常会认为女性用户比男性用户更有可能进行购买。然而,这并不适用于所有年龄段的男性和女性。甚至年龄也是产生不同分配的重要因素,女性的平均年龄明显高于男性。为了消除在我们的机器学习模型中使用偏倚数据,我们需要应用“平等机会”原则(如在第五章,公平数据收集 中研究的),其内容如下:
-
无论性别如何,男性和女性用户在被视为符合优惠券条件的概率上应当是相同的。
-
无论性别如何,男性和女性用户在不被视为符合优惠券条件的概率上应当是相同的。
这将消除由偏见导致的特权用户获得数字优惠券的情况,即使他们的鼠标点击率较低。如果我们实施平等机会原则,那么我们就可以限制真实世界点击流数据中的性别偏见,从而防止通过访问更多优惠券给予某些群体优势。
另一个在电子商务中观察到的著名歧视性推荐是,当 AI 被用来个性化网站互动时,这些 AI 系统显示的广告显著地减少了新产品或由新入场者和小型市场参与者销售的产品广告。
让我们了解一下歧视性推荐的原因:
-
导致歧视性模型结果的第一个原因是,算法从实际客户行为中学习到了歧视性行为(例如,随着越来越多的人被推荐大市场参与者的产品,他们更有可能点击这些广告)。
-
第二个可能的原因是,算法从其他数据来源学习到了这些行为(例如,基于国家人口统计信息的市场领导者赞助的产品和广告中其他形式的性别歧视)。
-
第三个可能性认为,这不是由学习偏见引起的,而是由给定地区的经济因素推动的。举例来说,包括广告投放技术驱动了观察到的差异(例如,高成本广告关键词的价格溢价较高)。
为了遏制这种歧视性结果,消除偏见,并确保 AI 解决方案的公平性,如在第五章《数据收集中的公平性》一节中所研究的,单独采用去除敏感属性的技术可能不足以解决问题。这是因为其他属性可能充当代理变量,导致预测结果中固有的偏见。一个例子是在电子商务中,AI 根据用户的浏览历史预测最成功的广告内容。该方法的一个主要缺点是,浏览历史信息常常被作为性别的代理(例如,github.com
作为男性的代理,pinterest.com
作为女性的代理)。此外,在第八章《模型训练和优化中的公平性》一节中,我们了解到在算法优化器中约束条件的重要性,这些约束可以控制偏见。
在零售领域,价格经常变动,并且影响销售和收入,因此理解价格变化的原因非常重要。那么,我们来探讨一下零售商店中定价项目的伦理问题。
伦理定价选择
为了促进社会福祉,伦理定价选择是电子商务应用和平台在使用智能动态定价引擎时一个重要的考量因素。动态定价引擎的设计方法应解决价格变化的根本原因,以减少对顾客、组织和更广泛社会的潜在危害。如果企业避免解决动态定价带来的负面影响,可能会引发媒体报道、诉讼和立法调查。法律和监管的变化可能会损害品牌形象和声誉,并加剧顾客对公司的不信任。
一些在伦理定价选择中的重要因素(参考自hbr.org/2021/03/how-ai-can-help-companies-set-prices-more-ethically
)如下:
-
基本服务和产品价格变化所造成的障碍程度——在最糟的情况下,可能会阻碍人们获取基本服务,如食品、住所、药品、交通和互联网。我们在疫情期间观察到这一点,当时高价格减少了个人防护设备如 N95 口罩和洗手液的获取途径,而失去这些设备的人群暴露在病毒面前。
-
在零售行业,疫情之前,小型第三方卖家曾声称,大型零售商如亚马逊通过利用他们的数据来与这些小型卖家竞争,从供应商处以更低的成本大批量购买相同产品,并以更低的价格销售。由人工智能驱动的制药公司算法提出的高涨价历史上曾阻碍了慢性病患者获取药物的途径,危及他们的生命。
-
价格变动对弱势群体影响的程度。例如,当产品或服务销售给患有慢性/严重疾病或收入有限的顾客时,社会歧视所造成的脆弱性变得更加突出。此外,在保险领域,考虑到投保人的职业、年龄等因素的预期利率指南,最终造成了广泛的社会危害,贫困投保人最终支付的保险费高于精英职业投保人。
-
定价引擎调整价格的方式使得它们可能对顾客产生不利影响。这一问题常常促使我们设计可解释的模型,以便提供更具信息性的购买决策。这也帮助我们阐明,受益于定价引擎的顾客能够做出更加明智的决策。如果价格变动总是通过利用顾客来将商业利益放在首位(例如打车应用在需求高峰期间使用指数型票价上涨),那么这样的模型就需要接受监管机构的审查和批准。
因此,我们可以看到动态定价引擎在电子商务、零售和保险中的负面后果。作为动态定价算法专家,我们应当仔细检查该问题是否引起了企业的足够关注,并确保定价决策对所有客户群体公平。
现在我们理解了零售中的公平性概念,让我们深入探讨可解释性概念如何融入零售行业。
可解释性——反事实(CFs)的作用
理解客户的痛点和偏好是电子商务平台上营销活动和促销活动的关键前提。一旦识别出客户需求,零售商可以提供促销优惠和折扣,并重新吸引流失的客户。例如,对于像 Tesco、Carrefour 或 Walmart 这样的零售商来说,能够识别出每个门店的常规客户和大额客户尤为重要,后者通常对该门店的整体月度采购量贡献巨大。一旦零售商理解了主要客户群体及其偏好,他们不仅可以提供实时推荐,还能通过短期和长期的项目和活动推动业务决策。
客户的不满情绪可能由因果推断引起,这种推断将客户满意度或客户奖励积分等无形变量转化为关键业务指标。以 Uber 为例,其推出的促销活动 Uber Pro,作为一个试点项目在美国八个城市开展,旨在奖励最为敬业的司机伙伴。这些司机通过此项目获得了更高的收入、减少的汽车维修费用、优先机场接送权以及免费的凹陷修复服务等奖励。
电子商务平台经常犯的一个错误是过分重视社交媒体广告,认为这可能会导致例如冬季服装销量的增加,而当其他时间的广告预算被削减时,销量却下降。然而,他们未能注意到冬季几个月恰逢圣诞节、感恩节、新年和其他节日,人们通常会互赠礼物。因此,电子商务平台上的社交媒体营销人员需要通过研究如果没有营销活动时,销量的变化来考虑 CF(因果因素)。这意味着要直接确定由于营销活动带来的收入增长,而不是因为商品价格低廉或正在进行的节日活动推动了人们的购买。我们可以通过 A/B 测试进行详细实验,将客户分为两个不同的组:对照组和目标组。对照组不进行任何营销活动,而目标组则进行营销活动。然后,我们比较目标组和对照组之间的收入增长差异。通过更高的信心来确定 CF 的影响,有助于我们通过衡量目标群体和非目标群体之间的差异来深入了解不同干预措施的效果。这还帮助我们评估营销活动、新产品发布、促销活动以及在特定地区和针对特定消费者群体的优惠的影响。接下来,我们将详细了解 CF 营销活动。
使用 CF 评估营销活动的影响
通过因果推断,我们可以回答一些因果性问题,这些问题在某些情况下是无法仅通过 A/B 测试来回答的。当我们有一个随机对照的 A/B 测试时,但每个个体所采取的处理(行为)对不同个体而言却是不同的,这时我们通常会遇到另一种困难。例如,组中的某人没有打开邮件或没有使用奖励积分。我们将很快看到一个示例,说明因果推断如何帮助解决这个问题。
首先,让我们研究因果推断如何通过为我们提供以下见解来帮助我们确定营销活动或促销活动对销售的影响:
-
价格变化如何影响选定的活动指标(正向或负向)
-
选定日期间的促销活动如何影响销量
在下面的例子中,我们将展示零售商如何检验网站上新产品推荐的效果,以得出其影响是正面还是负面。我们可以选择任何固定/特定日期,比如圣诞节。观察在指定日期前后的流量变化,可以帮助我们确定通过推荐框架是否实现了改善或退步。销售的增长或下降可以通过因果影响建模来评估,展示某一行动在指定日期前后的效果。我们将在本例中演示这一过程。通过这种方式,我们可以更容易地确定并解释,是否因为新设计的推荐框架而导致了有机搜索数量的增加。此外,我们还可以预测如果没有任何营销活动,可能会出现什么样的结果:
-
首先,让我们进行必要的导入并加载数据集:
import numpy as np import pandas as pd import tensorflow as tf import tensorflow_probability as tfp import matplotlib.pyplot as plt from causalimpact import CausalImpact df = pd.read_csv('https://raw.githubusercontent.com/flyandlure/datasets/master/causal_impact_dataset.csv')
-
现在,让我们为研究设定前后时间段:
pre_period = ['2021-07-04', '2021-07-17'] post_period = ['2021-07-18', '2021-07-31']
接下来,我们希望检查零售商网站在pre_period
和post_period
日期范围内的点击次数,日期范围来自前面的列表:
model = CausalImpact(df['clicks'], pre_period, post_period)
-
最后,我们必须通过研究干预的影响来分析模型输出:
print(model.summary(output='report'))
以下是它的输出:
图 14.1 – 从 model.summary()获得的输出
模型总结给出了在干预后期未进行任何干预的情况下,平均预计有 243 次点击。通过干预,我们确定了两个变量之间的关联,X和Y,其中一个变量X是另一个变量Y的直接原因,前提是所有其他变量保持固定。
然而,实际观察到的点击次数是 344。所以,预测与实际点击次数之间的差异是 101 次点击。这 101 次点击印象展示了干预对模型的因果效应。电商网站上引入产品推荐框架以及其他任何变化,都积极地通过提高网站流量 42%来做出了贡献。
- 我们还可以使用
model.plot()
绘制数据,研究预测与实际数据之间的差异:
图 14.2 – 通过预测与实际点击次数在干预后期的差异获得的因果效应
这就是我们如何研究干预后期前后的因果效应。
我们现在将研究不同的场景,探讨如何通过必要且充分的因果关系推动客户转化。
理解转化率 – 必要且充分的因果关系
让我们通过研究三种不同类型的因果关系来说明优惠券对客户转化率的因果效应:
-
必要:一个强制性的条件,没有这个条件客户不会转化,也就是在没有优惠券的情况下。
-
充分:一个存在的条件,优惠券有助于将客户转化。
-
必要且充分:优惠券在客户转化中起着主要作用,因为没有优惠券,客户在任何情况下都不会转化。
如果我们需要研究这三种类型的干预措施,我们可以将实验数据和观察数据结合起来,以确定每种类型的因果关系发生的概率边界。一旦获得了这些边界,我们就可以安全地推断出最有效的方式来利用基于优惠券的促销,而不浪费资金。以下代码演示了逐步实现这一方法:
-
首先,让我们导入必要的库:
import numpy as np import pandas as pd from causalml.optimize import get_pns_bounds
在这里,我们尝试观察选择促销的个体(例如,拿到药物或收到优惠券的人)与未选择促销的个体的结果。根据田和 Pearl 的假设(ftp.cs.ucla.edu/pub/stat_ser/R290-A.pdf
)关于识别因果效应的条件,图中所示的两个数据集可以结合起来,以获得通过独立查看任一数据集无法看到的信息。这将帮助我们通过结合两种数据源来识别必要且充分因果关系的概率或边界,其中包括处理组和对照组中的死亡与生还数据。
用于实验的数据集如下所示:
数据集名称 | 组别 | 处理组 | 对照组 |
---|---|---|---|
数据集 1 | 未转化数 | 16 | 14 |
数据集 2 | 转化数 | 894 | 986 |
数据集 3 | 未转化数 | 28 | 2 |
数据集 4 | 转化数 | 998 | 972 |
表 14.1 – 实验模拟数据集
这是代码:
num_samples = 5000
half = int(num_samples / 2)
treatment = np.tile([0, 1], half)
recovery = np.zeros(num_samples)
df_expt = pd.DataFrame({'treatment': treatment, 'death': recovery})
df_obsv = pd.DataFrame({'treatment': treatment, 'death': recovery})
-
现在,为了实验目的并分析其影响,我们将实验数据集中的 16 个处理组和 14 个对照组观察的标签设置为 1,并将观察数据集中的 2 个处理组和 28 个对照组观察的标签设置为 1:
df_expt.loc[df_expt.loc[df_expt['treatment'] == 1].sample(n=16).index, 'death'] = 1 df_expt.loc[df_expt.loc[df_expt['treatment'] == 0].sample(n=14).index, 'death'] = 1 df_obsv.loc[df_obsv.loc[df_obsv['treatment'] == 1].sample(n=2).index, 'death'] = 1 df_obsv.loc[df_obsv.loc[df_obsv['treatment'] == 0].sample(n=2).index, 'death'] = 1 df_obsv.loc[df_obs.loc[df_obsv['treatment'] == 0].sample(n=28).index, 'death'] = 1
-
接下来,我们将使用
get_pns_bounds()
函数来评估相关的概率边界,主要有三种类型:pns_lb, pns_ub = get_pns_bounds(df_expt, df_obsv, 'treatment', 'death', type='PNS') pn_lb, pn_ub = get_pns_bounds(df_expt, df_obsv, 'treatment','death', type='PN') ps_lb, ps_ub = get_pns_bounds(df_expt, df_obsv, 'treatment', 'death', type='PS')
-
这产生了以下概率边界:
图 14.3 – 必要且充分因果关系的概率边界
这表明,未转化且获得优惠券的参与者相比未获得优惠券的参与者,转化的机会更高。那些已经转化且没有提供优惠券的参与者,如果他们得到优惠券,未转化的风险将在 0.1%到 1.2%之间。此外,我们还可以看到,个体的转化概率范围在 0.1%到 0.6%之间,以及是否获得了优惠券。
现在,让我们了解不同类型的因果推理技术,以及它们如何应用于不同的背景。
不同的因果推理技术模式
以下图表描绘了我们可以以非互斥的方式进行因果分析的不同方式,在这种方式下,我们可以将多种方法应用于同一个问题:
图 14.4 – 不同的因果推理方法
前图中描述的方法可以用来消除选择偏差。选择偏差的例子发生在奖励活动中,当我们试图估计一封邮件的影响时:
-
不是所有在处理组中获得奖励的人都打开了它。
-
在处理组中打开奖励的人与没有得到奖励的对照组的人进行比较。
-
选择打开邮件或申请奖励的人可能与没有选择打开邮件或申请奖励的人有所不同。
为了避免选择偏差,我们可以比较整个处理组(或测试组),无论他们是否打开了邮件或使用了奖励程序。但这并不能避免稀释效应,在这种效应下,处理组中的个体(在多个处理组的背景下更为适用)被以不同的方式对待。为了应对并评估实际接受治疗的影响,我们可以使用编译器平均因果效应(CACE),其中 CACE 调整了意图治疗效应(ITT)(即被分配治疗的效应,也就是说,处于测试条件下的效应),并结合合规率。这是因为 ITT 参数低估了干预的效果。毕竟,某些个体在试验中可能偏离了他们分配的治疗。
这种调整有助于估计正在接受治疗或被考虑进行实验的子群体的治疗效应。这里的治疗指的是经历测试条件的实验组。CACE 框架依赖于假设,客户会打开邮件并使用奖励程序,而实际接受治疗(即接受奖励计划的客户群体)的效果驱动了结果变量。总结来说,CACE 通过工具变量(IVs)来运作,在无法进行可控实验时,它们决定因果关系。
这种情况发生在随机实验中,在这种情况下,治疗(在此背景下为奖励程序)无法实施,因此,无法将此类治疗的影响传递给每个单位。这里可以使用 CACE 框架及其工具变量(IVs)。IV 是一种第三方变量,帮助我们研究候选原因对结果的影响。
当处理效应在不同群体之间存在差异时
零售巨头和运输即服务公司(如 Uber)有着非常不同的客户群体,以至于对一个客户群体实行的处理方法在其他群体中并不适用。推荐使用异质处理效应估计(HTE)方法进行因果推断,以识别可为所有人带来最大效益的定制体验。在该方法中,成功地部署了条件平均处理效应(CATE),通过对观察到的协变量进行条件运算来计算处理效应。该方法的主要目标是评估在接受处理时,哪个子群体将从中受益最大。评估通过 A/B 测试进行,其中实验数据用于训练模型。该指标代表提升成功,并通过计算目标组(接受处理的对象)与控制组之间的最大差异(或差值)来评估。Uber 通过使用其提升建模应用 HTE。分位数回归(估算响应变量的条件中位数)也很受欢迎。
中介建模是另一种著名的因果推断方法,旨在揭示处理和结果变量之间的“黑匣子”。换句话说,它解释了为何某事发生,从而帮助我们得出是否支持因果假设的结论。该机制通过将总处理效应分解为以下两部分来运作:
-
某一特定机制的假设,表示平均因果中介效应
-
其他机制显示了平均直接效应
此外,该方法突出了多个潜在机制的相对重要性,其中无形变量对企业的各个方面(包括收入和客户满意度)产生影响,并有助于制定长期和短期的措施来解决客户痛点。例如,当我们观察到客户在零售商那里经历订单延迟配送时,我们通常会假设这是由于客户参与度增加,客户频繁更改所订购的商品。然而,延迟也可能归因于大量订单的存在,这无可避免地推动了这一群体向更高的参与度发展:
图 14.5 – 具有数据生成能力的因果图,用于展示一个工具/因素对候选因果变量的影响
在前面的图示中,我们可以看到一个因子与结果之间的混杂关系。用户的亚马逊生鲜订单数量表示治疗变量和感兴趣的结果之间存在一个后门路径(某种依赖关系)。因果推断支持观察性分析,我们试图阻止后门路径。这可以通过将订单数量限制为三到四个来实现。确定应该控制哪些变量以及不应该控制哪些变量需要领域专家和数据科学家的合作。此外,如果我们能识别出一个影响延迟交付对客户体验的结果的第三个变量,就可以解决由延迟交付与客户参与之间的后门路径导致的偏估计问题。
另一种已知的方法是前门法,在这种方法中,我们通过评估变量与感兴趣结果之间的关系来尝试估计该变量的影响。此方法依赖于中介原理,它要求引入一个介入变量(通常用于临床研究),该变量不同于治疗(即结果),并且通常被称为因果中介分析(CMA)。它在将治疗的总效应分解为直接效应和间接效应中起着重要作用。
因果建模的第一步是识别应该包含的变量。我们将因果建模技术应用于已识别的变量,比较处理组和未处理组在相关协变量上具有相同值的个体。比较的度量标准依赖于通过预测概率得分对变量的表示。这一概率帮助我们衡量治疗程序的有效性,称为倾向得分(propensity score)。
另一种流行的因果推断技术叫做回归不连续性方法。该方法帮助我们研究和评估回归线中的不连续性。干预发生点处的不连续性表明了干预的影响。该方法在确定不同级别的动态定价如何影响顾客是否从零售店购买商品或在 Uber 平台上预定行程方面非常有用。
以 Uber 为例,当我们研究因果效应时,我们必须意识到,在没有该效应的情况下,旅行请求率应该在一个明确的临界点两侧相等,例如引入加价定价时。这一假设成立的前提是,接近临界点的乘客在相关的混杂变量(影响独立和因变量的第三变量)上应该相似。此外,在引入加价定价时,如果旅行请求率在该点出现明显的断层现象,表明超过此价格点的加价对请求率产生了因果影响。
另一种类似的方法是分析候选因果事件前后的时间序列数据结果。这种方法称为中断时间序列设计,旨在预测事件发生的瞬间时间序列中可能发生的任何变化。用于因果推理的时间序列分析的流行方法有合成控制和贝叶斯结构时间序列。Google 提供的贝叶斯结构时间序列分析的流行库是 Causal Impact 包。
现在,让我们来看看因果建模在解决与供应链相关问题中的作用。
供应链应用案例
零售业中公平发挥关键作用的另一个重要方面是供应链。在零售商看到库存短缺和过剩的情况下,作为数据科学和机器学习专家,我们必须监督库存优化政策。因此,我们很可能根据实际需求和当前可用的库存容量来评估公平分配。以下是一些直接影响多个零售商公平库存履行(通过适当匹配供需,避免库存不足和过剩)的因素:
-
零售商的公平库存分配(例如,平等利润、相同的补货率,或者在处理需求不匹配时,供应的公平份额)。这一过程受比例分配政策的管理(在库存不足时最为有效)或库存稀缺以及多余库存的平等分配(用于库存过剩时)。
-
我们如何在行业中满足公平感知,包括公平定价和公平工资等要素。
为了进一步阐述在为多个零售商服务的综合供应链网络中的公平性,我们来考虑一个共享库存池,其中总库存按零售商级别进行分配,总成本在多个零售商位置之间分摊。库存补充和履约订单进入仓库,以下场景中会融入公平性约束:
-
来自多个零售商的总需求超过了可用的供应量。
-
多个供应商的总供应量超过了需求。
-
多个零售商从相同的供应商处获得库存。
-
基于市场需求,在多个零售商之间公平分配库存(受到每个零售商订购商品数量等其他条件的限制),以确保公平的利润分配。
除了在库存优化中引入公平性外,从伦理学角度来看,准确性和可解释性也变得十分重要。因为在供应链不同环节优化的库存分配能够最小化并预测供应商的运输延迟。此外,我们还可以追溯延迟的原因并提出补救措施。
在研究模型可解释性和可理解性时,第十章中提到,了解模型预测背后的根本原因能够帮助企业采取补救措施。通过识别漏洞的阶段和来源,复杂供应链中的百万美元损失由于延迟可以避免。例如,如图 14.6所示,在疫情期间,供应链管道发生了延迟,这可以归因于多种原因:
图 14.6 – 展示直接和虚假相关性的因果关系
主要的延迟因素是封锁和运营供应商数量减少。然而,这些主要的延迟因素可能导致其他延迟因素,如工厂停工、员工缺席,或者需要旅行通行证来运输货物。
为了解释因果关系,我们需要的是一种评估程序,不仅有助于确定相关性,还能够通过图形辅助因果发现过程,正如我们在这里所展示的。一旦我们获得了因果结构的图形表示,就更容易在问题的每个步骤中建议补救措施或分配资源。
在下一节中,我们将学习因果结构如何帮助我们进行供应链交付。
供应链管理的因果发现
因果图能够捕捉给定问题中不同变量之间的因果关系,突出系统中的关键参与者、他们在系统中的角色以及方向。典型供应链中的关键系统参与者包括以下几类:
-
订单数量和每个订单的数量
-
制造工厂的原材料供应和供应商的可用性
-
工厂的运营模式和在场工人的数量
-
成功的采购订单(PO)创建
-
一个高效的交付系统,能够确认交付数据
这些主要元素在因果图中共同作用,描述它们之间的相互关系,并阐明某一物品的需求是如何按提前/延迟的时间表到达目的地的,以及延迟对其他上游交付渠道的影响。因此,任何交付管道的延迟和不确定性都能得到更好的解释,这也能加速图形发现过程。不同变量在供给链管道两个不同阶段(采购订单创建和订单交付服务)对整体延迟的相对影响,可以通过下图最清晰地解释:
图 14.7 – 供给链生命周期中不同阶段交付延迟的因果图
我们可以进一步从因果图中提取结构因果模型(SCM),以解释变量之间的交互关系,正如图 14.8所示:
图 14.8 – 供给链生命周期中不同阶段针对某些订单的因果推断(CF)措施
在图的左侧,我们看到通过增加 15%的供应商数量并遵循最佳库存补充策略,我们可以缓解采购订单创建的延迟。在图的右侧,我们看到通过使用因果推断(CF)解释,我们可以发现最佳的交付合作伙伴和路线,以及替代的运输来源(例如,使用航空运输来避免在港口的延迟),这些都可以在因果图中发现。当系统具有实时监控功能时,可以触发因果推断措施,以驱动通过最佳路线尽可能快速到达目的地,从而使这些发现成为可能。
除了降低成本并为企业带来收入提升外,这些由因果图提供支持的因果推断措施还使我们能够了解应使用的适当关键绩效指标(KPIs),以减少成本并提高收入。
多方平台中的公平性
大规模的多方零售平台,如亚马逊、阿里巴巴和 Airbnb,为买家提供个性化的推荐,将他们与相关卖家连接起来。所提供的推荐服务应设计为促进公平,确保每个卖家的推荐物品数量均衡。这将确保小型卖家的商品也能获得公平的推荐机会。公平推荐的主要目标是最大化推荐效用(以便它们能够转化为现实世界中的购买),同时最小化物流成本。
在偏见渗透并且买家收到低效推荐以满足全球卖家的覆盖需求的情况下,公平的政策仍然遥不可及。在一个公平和理想的系统中,我们可以加入约束,以满足卖家的覆盖标准并同时考虑买家的目标,从而为每个买家提供高效的推荐。
现在,让我们来探讨一下负责任的 AI在银行、金融服务和保险(BFSI)行业中的重要作用。
BFSI 中的应用案例
伦理 AI 的一个重要元素是可解释性,正如我们在第九章中讨论的那样。除了模型解释之外,如果我们能向模型设计师、决策者和关键利益相关者提供一种互动方式(调整模型超参数和特征),那么他们就可以调节模型的超参数并模拟不同情景下的数值特征,从而评估和最小化来自高风险金融模型的财务损失。在 BFSI 的背景下,这将为高风险决策的解释提供更高层次的细节,从而降低对生命的关键决策风险,如拒绝抵押贷款或汽车贷款。在这里,CF 解释起着重要作用,一致且可解释的解释可以帮助审问模型,找到可以逆转模型决策所需的改变。
以下是 CF 在 BFSI 中一些突出的应用案例:
-
交易:CFs 用于分析不同交易的潜在后果以及不同投资策略的潜在风险和回报。例如,AI 系统可以用来分析历史数据并识别可能表明盈利交易机会的模式。然后,CF 分析可以用来理解如果进行不同的交易可能发生什么,并根据这一分析优化交易策略。
-
投资组合优化:通过分析不同资产配置的潜在后果,优化金融投资组合的组成。例如,AI 利用历史数据来识别可能表明不同资产相对表现的模式。然后,CF 分析可以用来理解如果不同资产被纳入投资组合可能会发生什么,并基于这一分析优化投资组合。
-
风险管理:了解并减轻金融系统中的风险,包括市场风险、信用风险或操作风险。然后,可以使用 CF 分析来理解如果采用不同的风险管理策略,可能会发生什么,并基于此分析优化风险管理。
现在,让我们看看 CF 解释库如何使用。
CF 解释库的功能
在探索了 BFSI(银行、金融服务和保险)行业中 CF 的一些应用案例后,我们来看一个在贷款申请授予过程中使用 CF 解释的实际示例。我们的示例将使用Diverse Counterfactual Explanations(DiCE)库。
DiCE 是一个 Python 库,它通过呈现相同输入特征的不同扰动版本来帮助我们传达必要的解释,从而产生不同的结果。在金融机构拒绝贷款等应用场景中,DiCE 能够展示使用给定机器学习模型对同一贷款申请者进行一系列特征扰动的效果。
这可以通过展示拒绝并非最终决定,给客户提供如何提高贷款获批机会的方向,增强客户的信心。例如,如果 DiCE 的 CF(反事实解释)显示“如果收入增加了 1 万美元,客户将获得贷款”,这将有助于决策者评估贷款申请的可信度,并同时指导他们理解驱动结果的必要条件(如现有贷款或收入)。例如,基于多个输入的贷款拒绝 CF 解释,有助于评估公平性标准,并减少错误。
然而,DiCE 在生成多样且可行的 CF 解释时面临两大挑战。因此,DiCE 的扩展版本DiCE4EL(即DiCE for Event Logs,详见icpmconference.org/2021/wp-content/uploads/sites/5/2021/09/DiCE4EL_-Interpreting-Process-Predictions-using-a-Milestone-Aware-Counterfactual-Approach.pdf
)应运而生,它通过捕捉和解释中间阶段的日志(例如金融机构的贷款申请日志)和事件,帮助对过程预测进行 CF 解释。DiCE 使用一种通用的神经网络架构,通过考虑静态和动态特征来预测下一个事件。我们可以利用这一架构解决长期过程执行日志的理解问题。此外,通过引入在训练集内搜索有效 CF 并将这些信息应用于损失函数,DiCE 解决了优化带有分类变量的 CF 搜索的困难。
现在,让我们通过 DiCE 来查看如何评估客户贷款申请中的不同特征扰动。这里使用的模型无关的技术应用了黑箱分类器。损失函数优化依赖于根据距离(以及稀疏性、多样性和可行性)对给定点附近的其他点进行采样:
-
首先,我们需要导入 CF 分析所需的库,并加载成人收入数据集:
import dice_ml from dice_ml.utils import helpers from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier dataset = helpers.load_adult_income_dataset() d = dice_ml.Data(dataframe=dataset, continuous_features=['age', 'hours_per_week'], outcome_name='income')
-
在对特征进行标准化缩放和独热编码处理后,我们必须使用
RandomForestClassifier
来训练模型:clf = Pipeline(steps=[('preprocessor', transformations),('classifier', RandomForestClassifier())]) model = clf.fit(x_train, y_train)
-
接下来,我们必须将训练好的 ML 模型提供给 DiCE 的模型对象,以生成多样化的 CFs:
backend = 'sklearn' m = dice_ml.Model(model=model, backend=backend) exp_random = dice_ml.Dice(d, m, method="random") dice_exp_random = exp_random.generate_counterfactuals(query_instances, total_CFs=2, desired_class="opposite", verbose=False)
这是输出结果:
图 14.9 – 使用随机采样生成的 CFs
使用随机采样,我们可以生成比 DiCE 当前实现更加不稀疏的 CFs。然而,增加total_CFs
确实会增加 CF 的稀疏度。
-
现在,我们必须选择特征范围,以展示在 CF 生成过程中,如何精确控制作为输入参数的连续特征范围(
permitted_range
)。我们可以使用features_to_vary
参数设置如['age','workclass','education','occupation','hours_per_week']
等特征:dice_exp_random = exp_random.generate_counterfactuals( query_instances, total_CFs=4, desired_class="opposite",permitted_range={'age': [22, 50], 'hours_per_week': [40, 60]})
它的显示方式如下:
图 14.10 – 使用特征范围(permitted_range)生成的 CFs
为了在接近性和多样性目标之间找到平衡,我们尝试只生成那些对用户可行的 CF 解释。在这里,接近性和多样性帮助我们理解数据与原始输入的相似度,反映出被显著修改的数据如何影响 CF 解释。我们还尝试设置足够的多样性,以便模型可以在多个可能的选项中做出选择。在这里,使用 DiCE 时,我们已将proximity_weight
(默认值为0.5
)和diversity_weight
(默认值为1.0
)分别调整了接近性和多样性。然而,随着我们研究 CF 如何变化,仍可以进一步调整它们:
query_instance = pd.DataFrame({'age': 25, 'workclass': 'Private', 'education': 'HS-grad', 'marital_status': 'Single','occupation': 'Service', 'race': 'White', 'gender': 'Female',
'hours_per_week': 45}, index=[0])
r_exp = dice_ml.Dice(d, m)
dice_exp = r_exp.generate_counterfactuals(query_instance, total_CFs=4, desired_class="opposite", proximity_weight=1.5, diversity_weight=1.0)
dice_exp.visualize_as_dataframe(show_only_changes=True)
它的显示方式如下:
图 14.11 – 使用接近性和多样性参数生成的 CFs
上述输出显示了一个多样化的 CF 集,这些 CF 是从原始数据中生成的,其中收入值被翻转,教育水平从高中文凭变为职业学校,婚姻状况从单身变为已婚,而职业从服务业变为白领或专业人员。这种替代或多样性帮助银行职员向贷款申请人解释什么因素可能会改变模型的结果。换句话说,它们解释了如果贷款被批准而不是被拒绝,哪些条件可能会发生变化。
在这个例子中,我们了解了如何通过反转目标收入列,从输入查询中生成不同类型的 CFs。我们现在熟悉了模型如何为决策提供建议,以及我们如何与它们互动。在这个基础上,让我们了解一下被误用的机器学习模型如何对 BFSI 行业中的客户构成威胁。接下来我们要讨论的一个强大威胁是深度伪造。
深度伪造
无论是在零售、银行还是金融领域,人工智能的一个应用需要负责任的使用,那就是深度伪造技术。深度伪造是通过深度学习方法生成的逼真伪造视频、音频或照片,内容涉及真人。这些生成的合成视频、音频和照片通过对大量数据进行模型训练而获得,其中的模型版本代表了实际人物没有参与的行为或话语。当原始行为被修改时,深度伪造技术带来了前所未有的威胁,可能被用来冒充个人,导致欺诈性电话或视频会议。例如,使用合成的 CEO 声音指示员工转移资产或资金。更高层次的安全漏洞也可能发生,通过音频或视频会议对客户进行合成冒充,可能导致关于项目或组织的敏感信息被转移。
现在,让我们看看深度伪造技术带来的银行和金融领域的潜在威胁:
-
作为洗钱计划的一部分,创建虚假账户。在这种情况下,犯罪分子可能大规模伪造身份,攻击多个账户,并使全球金融服务瘫痪,导致全球损失达到 34 亿美元 (
www.finextra.com/blogposting/23223/why-deepfake-fraud-losses-should-scare-financial-institutions
)。 -
使用“幽灵欺诈”技术,犯罪分子利用已故人员的个人数据,控制他们的在线账户和服务,包括信用卡、储蓄账户、抵押贷款和汽车贷款。
-
合成身份欺诈,指的是犯罪分子通过融合虚假、真实和被盗的信息,创造出不存在于现实中的虚假身份。合成身份欺诈是增长最快的金融犯罪类型。
然而,尽管存在深度伪造技术的滥用,我们也看到了其在零售、电商和时尚领域的几个优势。Facebook Shops 和 Google Shopping 平台利用深度伪造技术接触中小型零售商,通过电子商务平台促进销售。例如,Cadbury 使用基于人工智能的机器学习模型重现了一位流行演员的面部和声音,声音非常接近该演员的原声,甚至能喊出本地商店或品牌的名称。零售商正在探索逼真的数字模型和 生成对抗网络(GANs)的力量,以为客户创造更好的体验。深度伪造模型展示了不同肤色、身高和体重的服装,吸引更广泛的顾客群体。因此,中小型零售商能够节省成本,充分利用沉浸式逼真平台(如 Unreal Engine)的能力,生成实时模型和背景。
为了确保安全性和隐私,组织需要牢记以下准则,以防止深度伪造带来的威胁:
-
企业安全团队应使用有效的网络安全策略,结合网络安全和社交媒体监控工具,监控支付和转账。
-
组织应教育员工关于深度伪造技术的知识。组织内的所有员工应了解如何检测深度伪造,例如识别其中人物的不一致性或不自然的动作。
-
应用生物特征识别和在线面部验证技术,以验证和认证现有用户和新用户。
现在你已经了解了人工智能在 BFSI 中的角色,让我们来看一下医疗行业中的不同应用案例。
医疗领域的应用案例
当我们深入探讨人工智能在医疗行业中的伦理使用时,我们应了解疾病的早期检测和治疗如何与伦理人工智能相关。以下是一些例子:
-
人工智能可以通过 X 射线、CT 扫描和 MRI 影像技术支持诊断。
-
在疾病发展早期阶段检测癌症、肿瘤和其他恶性细胞。
-
进行实验,确定治疗是否有效。
-
监控患者,识别疾病的复发或缓解。
下图展示了基于人工智能的深度学习算法如何帮助在训练过的图像(放射科医生和医生标记为疑似癌症的图像)上识别脑肿瘤中 IDH1 基因突变的存在 (www.cancer.gov/news-events/cancer-currents-blog/2022/artificial-intelligence-cancer-imaging
):
图 14.12 – MRI 扫描预测脑肿瘤中 IDH1 基因突变的存在
在预测高风险疾病的存在时,我们应设计符合医疗标准的系统。让我们研究一个使用 Google Cloud 的参考架构,它符合这些标准。
使用 Google Cloud 的医疗系统架构
现在,让我们研究设计一个符合规定的大规模分布式医疗系统所需的不同云组件,用于存储医疗数据和疾病诊断:
-
从放射学检查中获得的 DICOM 影像数据可以通过 Cloud Healthcare DICOM API 导入,方便搜索和检索。该 API 还提供元数据提取和数据整合(存储在 BigQuery 中)功能,以推断疾病预测和临床调查的高级见解。
-
遵守行业范围内的医疗标准:
-
FHIR:一种新兴的医疗数据交换标准
-
HL7v2:最流行的医疗系统集成方法
-
DICOM:放射学和影像领域的主导标准
-
此外,它还支持使用 Cloud Healthcare API 和 Cloud Dataflow 将数据格式从 HL7v2 转换为 FHIR 格式的功能。此外,它符合美国的 HIPAA、加拿大的 PIPEDA 以及其他全球隐私标准。
-
配备用于检测新数据到达并通过 Cloud Pub/Sub 向应用程序发送通知的单元。这使得与 HL7v2 消息解析栈的无缝集成成为可能。
-
数据去标识化(通过删除或转换)服务,用于保护敏感数据元素,这些元素可以用于分析、机器学习模型和其他使用案例。
-
与 Cloud Datalab 和 Cloud ML 的集成,以探索大规模数据集并在 Cloud Healthcare API 数据集存储的 DICOM 放射学和自然光图像上进行训练:
图 14.13 – 使用 Google Cloud 的医疗保健系统架构
现在,让我们学习如何在疾病进入缓解期之前、患者或患者群体进展到死亡之前(例如,在 COVID-19 期间),或者在临床试验中评估不同治疗方法时,构建负责任的人工智能系统。在这些情况下,我们需要利用生存分析来开发人工智能模型。
负责任的人工智能在医疗保健应用中的生存分析
负责任的人工智能在医疗保健领域的应用需要准确预测不良事件的发生或可能性,如疾病、住院和死亡。为了解决这些问题,我们通常使用生存分析,这是一种统计方法,可以预测故障的时间和事件的发生时间。此外,生存分析能够处理审查问题(即缺失数据问题),当预期事件在研究期间未发生时,可能是因为感兴趣的对象未参与研究,或在研究结束之前就退出了研究。在这种情况下,研究人员可能只拥有部分关于患者生存时间的数据,例如,在大流行期间,发现患者因病毒以外的疾病而死亡的情况。一个例子是,当研究人员想研究患者开始显示病毒感染迹象的平均时间时,由于缺乏有效的数据收集过程,未能获得个体的完整数据,导致数据缺失。
以下是我们构建负责任的生存分析模型所需具备的关键能力:
-
在领域转移场景下的生存回归调整
-
对审查数据的分析及不同审查理论的影响研究
-
CF 和治疗影响的估计与评估
-
亚组发现和表型化,用于识别和分层不同组的风险因素
-
每个个体都有多个时间依赖和时间变化的协变量观测值,这有助于在估计事件发生时间预测时发现时间依赖性:
-
虚拟双胞胎生存回归(虚拟双胞胎能够通过增强体验实现对整个环境的可视化、建模和仿真)以理解个体行为及对干预措施的异质性治疗效果的响应:
现在,让我们看一个使用 Cox 比例风险深度神经网络与开源auton-survival
包的例子。这个包帮助评估模型中患者的协变量与治疗效果之间的相互作用(通过比例风险比),并作为建议个性化治疗推荐的机制。我们开始吧:
-
我们先从所需的库导入开始。请注意,在这个例子中,我们使用的是
SUPPORT
数据集,该数据集附带了auton-survival
包:from auton_survival.estimators import SurvivalModel from auton_survival.metrics import survival_regression_metric from sklearn.model_selection import ParameterGrid from estimators_demo_utils import plot_performance_metrics
-
接下来,我们将创建
SurvivalModel
对象,并使用fit
函数来训练模型。我们在这里设置的times
变量用于在一定时期内调优模型的超参数。我们还提供了用于训练的代码,并展示了从这里定义的param_grid
参数中选定参数的输出:param_grid = {'bs': [100, 200], 'learning_rate': [ 1e-4, 1e-3], 'layers': [ [100], [100, 100]] } params = ParameterGrid(param_grid) times = np.quantile(y_tr['time'][y_tr['event']==1], np.linspace(0.1, 1, 10)).tolist() model = SurvivalModel('dcph', random_seed=0, bs=param['bs'], learning_rate=param['learning_rate'], layers=param['layers']) model.fit(x_tr, y_tr)
-
我们还必须计算验证集上的生存概率,并提供集成 Brier 分数(IBS):
predictions_val = model.predict_survival(x_val, times) metric_val = survival_regression_metric('ibs', y_val, predictions_val, times, y_tr)
-
接下来,我们必须获取测试集上的生存概率。此外,我们还需要获取特定模型在选定超参数下的预测结果。
times
变量帮助我们获取在某个时刻使用的模型超参数:predictions_te = model.predict_survival(x_te, times)
-
最后,我们必须评估测试集上的 IBS 和时间依赖一致性指数。这将决定模型的表现:
results = dict() results['Brier Score'] = survival_regression_metric('brs', outcomes=y_te, predictions=predictions_te, times=times, outcomes_train=y_tr) results['Concordance Index'] = survival_regression_metric('ctd', outcomes=y_te, predictions=predictions_te, times=times, outcomes_train=y_tr) plot_performance_metrics(results, times)
在模型超参数集上的最终模型性能统计信息如下图所示:
图 14.14 – 模型性能过度调优与超参数:
在前面的示例中,我们学习了如何使用 DeepSurv(一个由网络权重参数化的前馈深度神经网络)评估个人的失败风险(对治疗无反应,有时会导致死亡),通过利用患者协变量对其风险率的影响。在医疗保健行业,这有助于提供个性化的治疗方案/建议,让我们可以研究个人如何根据特定的治疗对评估的风险率做出反应。此外,我们还可以通过创建目标组(接受治疗建议)和对照组(不接受治疗建议)进行 A/B 测试。我们可以对这两组的结果进行 Log-rank 检验,以验证两个子集之间的差异是否显著,从而代表治疗建议的有效性。
现在我们已经理解了生存分析模型在负责任 AI 中的作用,让我们总结一下本章所学的内容。
总结
在本章中,我们考察了与零售、供应链、BFSI 和医疗保健领域相关的多种 AI 应用案例。我们了解了零售商必须遵守的隐私法律规定和标准,并且作为负责任 AI 的倡导者,我们理解了动态定价的正面和负面后果,以及如何实现公平定价。接下来,我们深入研究了 CF(因果推断)的概念及其在零售、供应链、BFSI 和医疗保健行业中的不可或缺的应用。通过实例,我们学习了 CF 如何帮助我们评估营销活动、计算零售行业的转化率、了解延迟的影响并减轻供应链管道中的延迟。我们还基于实际案例研究了贷款申请过程,并生成了多种 CF,观察它们如何影响贷款申请的批准/拒绝。
我们还理解了审计和负责任的 AI 法规对深度伪造技术、聊天机器人和 AR/VR/XR 媒体的必要性。这些创新可能通过歧视性和不道德的滥用危及人们的生命。接下来,我们研究了如何构建可扩展、合规和分布式的医疗保健系统架构。最后,我们深入了解了生存回归模型以及它如何帮助我们评估和建议有效的患者治疗方法。
到此为止,我们已经涵盖了平台和模型设计的相关概念。希望你能激励自己继续扩展从本书中获得的知识,保持学习!
我们希望你喜欢阅读这本书。随着 ChatGPT 的到来,虽然负责任 AI 目前是其中的重要方面,但我们没有涵盖与大型语言模型(LLM)、元宇宙和区块链设计相关的 AI 伦理问题。希望未来的版本能够涵盖这些内容。
深入阅读
要了解本章涵盖的主题,请查看以下资源:
-
人工智能中的公平成本:来自电子商务的证据 – Moritz von Zahn, Stefan Feuerriegel, 和 Niklas Kuehl:
aisel.aisnet.org/cgi/viewcontent.cgi?article=1681&context=bise
-
利用因果推断改善 Uber 用户 体验:
www.uber.com/blog/causal-inference-at-uber/
-
人工智能如何帮助公司更 道德地 设置价格:
hbr.org/2021/03/how-ai-can-help-companies-set-prices-more-ethically
-
基于因果 AI 的供应链根本原因分析:
medium.com/causalens/supply-chain-root-cause-analysis-with-causal-ai-be73c78441f2
-
DeepSurv: 个性化治疗推荐系统,基于 Cox 比例风险深度神经 网络:
bmcmedresmethodol.biomedcentral.com/articles/10.1186/s12874-018-0482-1
-
人工智能能否帮助以全新且更好的方式 发现癌症?:
www.cancer.gov/news-events/cancer-currents-blog/2022/artificial-intelligence-cancer-imaging
-
auton-survival: 一个开源包,用于回归、反事实估计、评估和带有审查的事件时间数据的表型:
www.cs.cmu.edu/~chiragn/papers/auton_survival.pdf
-
人工智能中的公平成本:来自 电子商务 的证据:
link.springer.com/article/10.1007/s12599-021-00716-w
-
库存分配中的公平理想:
onlinelibrary.wiley.com/doi/full/10.1111/deci.12540
-
印度辩论肤色偏见,美容公司调整 广告:
www.nytimes.com/2020/06/28/world/asia/india-skin-color-unilever.html
-
虚拟现实和增强现实中的现实主义伦理:
www.frontiersin.org/articles/10.3389/frvir.2020.00001/full
-
虚拟现实和增强现实的风险是什么,ANSES 推荐什么良好实践?:
www.anses.fr/en/content/what-are-risks-virtual-reality-and-augmented-reality-and-what-good-practices-does-anses
-
Google Cloud Platform: 医疗解决方案 操作手册:
cloud.nih.gov/resources/guides/science-at-cloud-providers/science-on-gcp/GCPHealthcareSolutionsPlaybook.pdf