dl-cdr-fai-pt-merge-01
面向程序员的 FastAI 和 PyTorch 深度学习(二)
原文:Deep Learning for Coders With Fastai and Pytorch
译者:飞龙
第二章:从模型到生产
我们在第一章中看到的六行代码只是在实践中使用深度学习过程的一小部分。在本章中,我们将使用一个计算机视觉示例来查看创建深度学习应用的端到端过程。更具体地说,我们将构建一个熊分类器!在这个过程中,我们将讨论深度学习的能力和限制,探讨如何创建数据集,在实践中使用深度学习时可能遇到的问题等等。许多关键点同样适用于其他深度学习问题,例如第一章中的问题。如果您解决的问题在关键方面类似于我们的示例问题,我们期望您可以快速获得极好的结果,而只需很少的代码。
让我们从如何构建您的问题开始。
深度学习的实践
我们已经看到深度学习可以快速解决许多具有挑战性的问题,并且只需很少的代码。作为初学者,有一些问题与我们的示例问题足够相似,以便您可以非常快速地获得极其有用的结果。然而,深度学习并不是魔法!同样的六行代码不会适用于今天任何人可以想到的每个问题。
低估深度学习的限制并高估其能力可能导致令人沮丧的糟糕结果,至少在您获得一些经验并能解决出现的问题之前。相反,高估深度学习的限制并低估其能力可能意味着您不会尝试可解决的问题,因为您自己否定了它。
我们经常与低估深度学习的限制和能力的人交谈。这两者都可能是问题:低估能力意味着您可能甚至不会尝试可能非常有益的事情,而低估限制可能意味着您未能考虑和应对重要问题。
最好的做法是保持开放的心态。如果您对深度学习可能以比您预期的更少的数据或复杂性解决部分问题持开放态度,您可以设计一个过程,通过该过程您可以找到与您特定问题相关的特定能力和限制。这并不意味着进行任何冒险的赌注-我们将向您展示如何逐渐推出模型,以便它们不会带来重大风险,并且甚至可以在投入生产之前对其进行回测。
开始您的项目
那么您应该从哪里开始深度学习之旅呢?最重要的是确保您有一个要处理的项目-只有通过处理自己的项目,您才能获得构建和使用模型的真实经验。在选择项目时,最重要的考虑因素是数据的可用性。
无论您是为了自己的学习还是为了在组织中的实际应用而进行项目,您都希望能够快速开始。我们看到许多学生、研究人员和行业从业者在试图找到他们完美的数据集时浪费了几个月甚至几年的时间。目标不是找到“完美”的数据集或项目,而只是开始并从那里迭代。如果您采取这种方法,您将在完美主义者仍处于规划阶段时进行第三次迭代学习和改进!
我们还建议您在项目中端到端迭代;不要花几个月来微调您的模型,或打磨完美的 GUI,或标记完美的数据集……相反,尽可能在合理的时间内完成每一步,一直到最后。例如,如果您的最终目标是一个在手机上运行的应用程序,那么每次迭代后您都应该拥有这个。但也许在早期迭代中您会采取捷径;例如,在远程服务器上进行所有处理,并使用简单的响应式 Web 应用程序。通过完成项目的端到端,您将看到最棘手的部分在哪里,以及哪些部分对最终结果产生最大影响。
当您阅读本书时,我们建议您完成许多小实验,通过运行和调整我们提供的笔记本,同时逐渐开发自己的项目。这样,您将获得所有我们解释的工具和技术的经验,同时我们讨论它们。
Sylvain 说
为了充分利用这本书,花时间在每一章之间进行实验,无论是在您自己的项目上还是通过探索我们提供的笔记本。然后尝试在新数据集上从头开始重写这些笔记本。只有通过大量练习(和失败),您才能培养出如何训练模型的直觉。
通过使用端到端迭代方法,您还将更好地了解您实际需要多少数据。例如,您可能会发现您只能轻松获得 200 个标记数据项,而在尝试之前,您无法真正知道这是否足以使您的应用在实践中良好运行。
在组织环境中,您可以通过展示一个真实的工作原型来向同事展示您的想法是可行的。我们反复观察到,这是获得项目良好组织支持的秘诀。
由于最容易开始的项目是您已经有数据可用的项目,这意味着最容易开始的项目可能与您已经在做的事情相关,因为您已经有关于您正在做的事情的数据。例如,如果您在音乐行业工作,您可能可以访问许多录音。如果您是放射科医生,您可能可以访问大量医学图像。如果您对野生动物保护感兴趣,您可能可以访问大量野生动物图像。
有时您必须有点创造性。也许您可以找到一个先前的机器学习项目,比如一个与您感兴趣的领域相关的 Kaggle 竞赛。有时您必须做出妥协。也许您找不到您所需的确切数据来完成您心中的项目;但您可能会找到一些来自类似领域的数据,或者以不同方式测量的数据,解决一个略有不同的问题。在这些类似项目上工作仍然会让您对整个过程有很好的理解,并可能帮助您识别其他捷径、数据来源等。
特别是当您刚开始学习深度学习时,最好不要涉足非常不同的领域,不要涉足深度学习之前未应用的领域。因为如果您的模型一开始就不起作用,您将不知道是因为您犯了错误,还是您试图解决的问题根本无法用深度学习解决。您也不知道从哪里寻求帮助。因此,最好首先找到在线的一个例子,该例子已经取得了良好的结果,并且至少与您尝试实现的目标有些相似,通过将您的数据转换为其他人以前使用过的格式(例如从您的数据创建图像)。让我们看看深度学习的现状,这样您就知道深度学习目前擅长的领域。
深度学习的现状
让我们首先考虑深度学习是否能够解决您要解决的问题。本节概述了 2020 年初深度学习的现状。然而,事情发展得非常快,当您阅读本文时,其中一些限制可能已经不存在。我们将尽力保持本书网站的最新信息;此外,搜索“AI 现在能做什么”可能会提供当前信息。
计算机视觉
深度学习尚未用于分析图像的许多领域,但在已经尝试过的领域中,几乎普遍表明计算机可以至少与人类一样好地识别图像中的物品,甚至是经过专门训练的人,如放射科医生。这被称为物体识别。深度学习还擅长识别图像中物体的位置,并可以突出它们的位置并命名每个找到的物体。这被称为物体检测(在我们在第一章中看到的变体中,每个像素根据其所属的对象类型进行分类—这被称为分割)。
深度学习算法通常不擅长识别结构或风格与用于训练模型的图像明显不同的图像。例如,如果训练数据中没有黑白图像,模型可能在黑白图像上表现不佳。同样,如果训练数据不包含手绘图像,模型可能在手绘图像上表现不佳。没有一般方法可以检查训练集中缺少哪些类型的图像,但我们将在本章中展示一些方法,以尝试识别当模型在生产中使用时数据中出现意外图像类型的情况(这被称为检查域外数据)。
物体检测系统面临的一个主要挑战是图像标记可能会很慢且昂贵。目前有很多工作正在进行中,旨在开发工具以尝试使这种标记更快速、更容易,并且需要更少的手工标签来训练准确的物体检测模型。一个特别有帮助的方法是合成生成输入图像的变化,例如通过旋转它们或改变它们的亮度和对比度;这被称为数据增强,并且对文本和其他类型的模型也很有效。我们将在本章中详细讨论这一点。
另一个要考虑的问题是,尽管您的问题可能看起来不像是一个计算机视觉问题,但通过一点想象力可能可以将其转变为一个。例如,如果您要分类的是声音,您可以尝试将声音转换为其声学波形的图像,然后在这些图像上训练模型。
自然语言处理
计算机擅长基于类别对短文档和长文档进行分类,例如垃圾邮件或非垃圾邮件、情感(例如,评论是积极的还是消极的)、作者、来源网站等。我们不知道在这个领域是否有任何严格的工作来比较计算机和人类,但从经验上看,我们认为深度学习的性能在这些任务上与人类的性能相似。
深度学习还擅长生成与上下文相关的文本,例如回复社交媒体帖子,并模仿特定作者的风格。它还擅长使这些内容对人类具有吸引力—事实上,甚至比人类生成的文本更具吸引力。然而,深度学习不擅长生成正确的回应!例如,我们没有可靠的方法来将医学信息知识库与深度学习模型结合起来,以生成医学上正确的自然语言回应。这是危险的,因为很容易创建对外行人看来具有吸引力但实际上完全不正确的内容。
另一个问题是,社交媒体上的上下文适当、高度引人入胜的回应可能被大规模使用——比以前见过的任何喷子农场规模大几千倍——来传播虚假信息,制造动荡,鼓励冲突。一般来说,文本生成模型总是在技术上略领先于识别自动生成文本的模型。例如,可以使用一个能够识别人工生成内容的模型来实际改进创建该内容的生成器,直到分类模型无法完成其任务为止。
尽管存在这些问题,深度学习在自然语言处理中有许多应用:可以用来将文本从一种语言翻译成另一种语言,将长篇文档总结为更快消化的内容,找到感兴趣概念的所有提及等。不幸的是,翻译或总结可能包含完全错误的信息!然而,性能已经足够好,许多人正在使用这些系统——例如,谷歌的在线翻译系统(以及我们所知道的每个其他在线服务)都是基于深度学习的。
结合文本和图像
深度学习将文本和图像结合成一个单一模型的能力通常比大多数人直觉期望的要好得多。例如,一个深度学习模型可以在输入图像上进行训练,输出用英语编写的标题,并且可以学会为新图像自动生成令人惊讶地适当的标题!但是,我们再次提出与前一节讨论的相同警告:不能保证这些标题是正确的。
由于这个严重问题,我们通常建议深度学习不要作为完全自动化的过程,而是作为模型和人类用户密切互动的过程的一部分。这可能使人类的生产力比完全手动方法高出几个数量级,并且比仅使用人类更准确。
例如,自动系统可以直接从 CT 扫描中识别潜在的中风患者,并发送高优先级警报,以便快速查看这些扫描。治疗中风只有三个小时的时间窗口,因此这种快速的反馈循环可以挽救生命。同时,所有扫描仍然可以按照通常的方式发送给放射科医生,因此不会减少人类的参与。其他深度学习模型可以自动测量扫描中看到的物品,并将这些测量结果插入报告中,警告放射科医生可能错过的发现,并告诉他们可能相关的其他病例。
表格数据
对于分析时间序列和表格数据,深度学习最近取得了巨大进展。然而,深度学习通常作为多种模型集成的一部分使用。如果您已经有一个正在使用随机森林或梯度提升机(流行的表格建模工具,您很快将了解)的系统,那么切换到或添加深度学习可能不会带来任何显著的改进。
深度学习确实大大增加了您可以包含的列的种类——例如,包含自然语言(书名、评论等)和高基数分类列(即包含大量离散选择的内容,如邮政编码或产品 ID)。不过,与随机森林或梯度提升机相比,深度学习模型通常需要更长的训练时间,尽管由于提供 GPU 加速的库(如RAPIDS),情况正在改变。我们在第九章中详细介绍了所有这些方法的优缺点。
推荐系统
推荐系统实际上只是一种特殊类型的表格数据。特别是,它们通常具有代表用户的高基数分类变量,以及代表产品(或类似物品)的另一个变量。像亚马逊这样的公司将客户所做的每一次购买都表示为一个巨大的稀疏矩阵,其中客户是行,产品是列。一旦他们以这种格式拥有数据,数据科学家们会应用某种形式的协同过滤来填充矩阵。例如,如果客户 A 购买产品 1 和 10,客户 B 购买产品 1、2、4 和 10,引擎将推荐 A 购买 2 和 4。
由于深度学习模型擅长处理高基数分类变量,它们非常擅长处理推荐系统。尤其是当将这些变量与其他类型的数据(如自然语言或图像)结合时,它们就像处理表格数据一样发挥作用。它们还可以很好地将所有这些类型的信息与其他元数据(如用户信息、先前交易等)表示为表格进行组合。
然而,几乎所有的机器学习方法都有一个缺点,那就是它们只告诉你一个特定用户可能喜欢哪些产品,而不是对用户有用的推荐。用户可能喜欢的产品的许多种推荐可能根本不会有任何帮助——例如,如果用户已经熟悉这些产品,或者如果它们只是用户已经购买过的产品的不同包装(例如,当他们已经拥有该套装中的每一件物品时,推荐一个小说的套装)。Jeremy 喜欢读特里·普拉切特的书,有一段时间亚马逊一直在向他推荐特里·普拉切特的书(见图 2-1),这实际上并不是有用的,因为他已经知道这些书了!

图 2-1. 一个不太有用的推荐
其他数据类型
通常,您会发现特定领域的数据类型非常适合现有的类别。例如,蛋白质链看起来很像自然语言文档,因为它们是由复杂关系和意义贯穿整个序列的离散令牌组成的长序列。事实上,使用 NLP 深度学习方法是许多类型蛋白质分析的最先进方法。另一个例子,声音可以表示为频谱图,可以被视为图像;标准的图像深度学习方法在频谱图上表现得非常好。
驱动系统方法
许多准确的模型对任何人都没有用,而许多不准确的模型却非常有用。为了确保您的建模工作在实践中有用,您需要考虑您的工作将如何使用。2012 年,Jeremy 与 Margit Zwemer 和 Mike Loukides 一起提出了一种称为驱动系统方法的思考这个问题的方法。
驱动系统方法,如图 2-2 所示,详细介绍在“设计出色的数据产品”中。基本思想是从考虑您的目标开始,然后考虑您可以采取哪些行动来实现该目标以及您拥有的(或可以获取的)可以帮助的数据,然后构建一个模型,您可以使用该模型确定为实现目标而采取的最佳行动。

图 2-2. 驱动系统方法
考虑自动驾驶汽车中的模型:您希望帮助汽车安全地从 A 点驾驶到 B 点,而无需人为干预。出色的预测建模是解决方案的重要组成部分,但它并不是独立存在的;随着产品变得更加复杂,它会消失在管道中。使用自动驾驶汽车的人完全不知道使其运行的数百(甚至数千)个模型和海量数据。但随着数据科学家构建越来越复杂的产品,他们需要一种系统化的设计方法。
我们使用数据不仅仅是为了生成更多数据(以预测的形式),而是为了产生可操作的结果。这是 Drivetrain 方法的目标。首先要明确定义一个明确的目标。例如,当谷歌创建其第一个搜索引擎时,考虑了“用户在输入搜索查询时的主要目标是什么?”这导致了谷歌的目标,即“显示最相关的搜索结果”。下一步是考虑您可以拉动的杠杆(即您可以采取的行动)以更好地实现该目标。在谷歌的情况下,这是搜索结果的排名。第三步是考虑他们需要什么新数据来生成这样的排名;他们意识到关于哪些页面链接到哪些其他页面的隐含信息可以用于此目的。
只有在完成了这前三个步骤之后,我们才开始考虑构建预测模型。我们的目标和可用的杠杆,我们已经拥有的数据以及我们需要收集的额外数据,决定了我们可以构建的模型。这些模型将以杠杆和任何不可控变量作为输入;模型的输出可以结合起来预测我们的目标的最终状态。
让我们考虑另一个例子:推荐系统。推荐引擎的目标是通过推荐客户不会在没有推荐的情况下购买的物品来推动额外的销售。杠杆是推荐的排名。必须收集新数据以生成将导致新销售的推荐。这将需要进行许多随机实验,以收集关于各种客户的各种推荐的数据。这是很少有组织采取的一步;但是没有它,您就没有所需的信息来根据您的真正目标(更多销售!)优化推荐。
最后,您可以为购买概率构建两个模型,条件是看到或没有看到推荐。这两个概率之间的差异是给定推荐给客户的效用函数。在算法推荐客户已经拒绝的熟悉书籍(两个组成部分都很小)或者他们本来就会购买的书籍(两个组成部分都很大并互相抵消)的情况下,效用函数会很低。
正如您所看到的,在实践中,您的模型的实际实施通常需要比仅仅训练一个模型更多!您通常需要运行实验来收集更多数据,并考虑如何将您的模型整合到您正在开发的整个系统中。说到数据,现在让我们专注于如何为您的项目找到数据。
收集数据
对于许多类型的项目,您可能能够在线找到所需的所有数据。本章中我们将完成的项目是一个“熊探测器”。它将区分三种类型的熊:灰熊、黑熊和泰迪熊。互联网上有许多每种类型熊的图片可供我们使用。我们只需要找到它们并下载它们。
我们提供了一个工具供您使用,这样您就可以跟随本章并为您感兴趣的任何对象创建自己的图像识别应用程序。在 fast.ai 课程中,成千上万的学生在课程论坛上展示了他们的作品,展示了从特立尼达的蜂鸟品种到巴拿马的公交车类型的一切——甚至有一名学生创建了一个应用程序,可以帮助他的未婚妻在圣诞假期期间认出他的 16 个表兄弟!
在撰写本文时,Bing 图像搜索是我们知道的用于查找和下载图像的最佳选择。每月免费提供最多 1,000 次查询,每次查询可下载最多 150 张图片。然而,在我们撰写本书时和您阅读本书时之间可能会出现更好的选择,因此请务必查看本书籍网站以获取我们当前的推荐。
与最新服务保持联系
用于创建数据集的服务时常变化,它们的功能、接口和定价也经常变化。在本节中,我们将展示如何在撰写本书时作为 Azure 认知服务一部分提供的Bing 图像搜索 API。
要使用 Bing 图像搜索下载图像,请在 Microsoft 注册一个免费帐户。您将获得一个密钥,您可以将其复制并输入到一个单元格中(用您的密钥替换XXX并执行):
key = 'XXX'
或者,如果您在命令行上感到自在,您可以在终端中设置它
export AZURE_SEARCH_KEY=*your_key_here*
然后重新启动 Jupyter 服务器,在一个单元格中键入以下内容,并执行:
key = os.environ['AZURE_SEARCH_KEY']
设置了key之后,您可以使用search_images_bing。这个函数是在线笔记本中包含的小utils类提供的(如果您不确定一个函数是在哪里定义的,您可以在笔记本中输入它来找出,如下所示):
search_images_bing
<function utils.search_images_bing(key, term, min_sz=128)>
让我们尝试一下这个函数:
results = search_images_bing(key, 'grizzly bear')
ims = results.attrgot('content_url')
len(ims)
150
我们已成功下载了 150 只灰熊的 URL(或者至少是 Bing 图像搜索为该搜索词找到的图像)。让我们看一个:
dest = 'images/grizzly.jpg'
download_url(ims[0], dest)
im = Image.open(dest)
im.to_thumb(128,128)

这似乎运行得很好,所以让我们使用 fastai 的download_images来下载每个搜索词的所有 URL。我们将每个放在一个单独的文件夹中:
bear_types = 'grizzly','black','teddy'
path = Path('bears')
if not path.exists():
path.mkdir()
for o in bear_types:
dest = (path/o)
dest.mkdir(exist_ok=True)
results = search_images_bing(key, f'{o} bear')
download_images(dest, urls=results.attrgot('content_url'))
我们的文件夹中有图像文件,正如我们所期望的那样:
fns = get_image_files(path)
fns
(#421) [Path('bears/black/00000095.jpg'),Path('bears/black/00000133.jpg'),Path('
> bears/black/00000062.jpg'),Path('bears/black/00000023.jpg'),Path('bears/black
> /00000029.jpg'),Path('bears/black/00000094.jpg'),Path('bears/black/00000124.j
> pg'),Path('bears/black/00000056.jpeg'),Path('bears/black/00000046.jpg'),Path(
> 'bears/black/00000045.jpg')...]
Jeremy 说
我就是喜欢在 Jupyter 笔记本中工作的这一点!逐步构建我想要的东西并在每一步检查我的工作是如此容易。我犯了很多错误,所以这对我真的很有帮助。
通常当我们从互联网下载文件时,会有一些文件损坏。让我们检查一下:
failed = verify_images(fns)
failed
(#0) []
要删除所有失败的图像,您可以使用unlink。像大多数返回集合的 fastai 函数一样,verify_images返回一个类型为L的对象,其中包括map方法。这会在集合的每个元素上调用传递的函数:
failed.map(Path.unlink);
在这个过程中要注意的一件事是:正如我们在第一章中讨论的,模型只能反映用于训练它们的数据。而世界充满了有偏见的数据,这最终会反映在,例如,Bing 图像搜索(我们用来创建数据集的)。例如,假设您有兴趣创建一个应用程序,可以帮助用户确定他们是否拥有健康的皮肤,因此您训练了一个模型,该模型基于搜索结果(比如)“健康皮肤”。图 2-3 展示了您将获得的结果类型。

图 2-3. 用于健康皮肤检测器的数据?
使用此作为训练数据,您最终不会得到一个健康皮肤检测器,而是一个年轻白人女性触摸她的脸检测器!一定要仔细考虑您可能在应用程序中实际看到的数据类型,并仔细检查以确保所有这些类型都反映在您模型的源数据中。(感谢 Deb Raji 提出了健康皮肤的例子。请查看她的论文“可操作的审计:调查公开命名商业 AI 产品偏见性能结果的影响”以获取更多有关模型偏见的迷人见解。)
现在我们已经下载了一些数据,我们需要将其组装成适合模型训练的格式。在 fastai 中,这意味着创建一个名为DataLoaders的对象。
从数据到数据加载器
DataLoaders是一个简单的类,只是存储您传递给它的DataLoader对象,并将它们作为train和valid可用。尽管它是一个简单的类,但在 fastai 中非常重要:它为您的模型提供数据。DataLoaders中的关键功能仅用这四行代码提供(它还有一些其他次要功能我们暂时跳过):
class DataLoaders(GetAttr):
def __init__(self, *loaders): self.loaders = loaders
def __getitem__(self, i): return self.loaders[i]
train,valid = add_props(lambda i,self: self[i])
术语:DataLoaders
一个 fastai 类,存储您传递给它的多个DataLoader对象——通常是一个train和一个valid,尽管可以有任意数量。前两个作为属性提供。
在本书的后面,您还将了解Dataset和Datasets类,它们具有相同的关系。要将我们下载的数据转换为DataLoaders对象,我们至少需要告诉 fastai 四件事:
-
我们正在处理什么类型的数据
-
如何获取项目列表
-
如何为这些项目打标签
-
如何创建验证集
到目前为止,我们已经看到了一些特定组合的工厂方法,当您有一个应用程序和数据结构恰好适合这些预定义方法时,这些方法非常方便。当您不适用时,fastai 有一个名为数据块 API的极其灵活的系统。使用此 API,您可以完全自定义创建DataLoaders的每个阶段。这是我们需要为刚刚下载的数据集创建DataLoaders的步骤:
bears = DataBlock(
blocks=(ImageBlock, CategoryBlock),
get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2, seed=42),
get_y=parent_label,
item_tfms=Resize(128))
让我们依次查看每个参数。首先,我们提供一个元组,指定我们希望独立变量和因变量的类型:
blocks=(ImageBlock, CategoryBlock)
独立变量是我们用来进行预测的东西,因变量是我们的目标。在这种情况下,我们的独立变量是一组图像,我们的因变量是每个图像的类别(熊的类型)。在本书的其余部分中,我们将看到许多其他类型的块。
对于这个DataLoaders,我们的基础项目将是文件路径。我们必须告诉 fastai 如何获取这些文件的列表。get_image_files函数接受一个路径,并返回该路径中所有图像的列表(默认情况下递归):
get_items=get_image_files
通常,您下载的数据集已经定义了验证集。有时,这是通过将用于训练和验证集的图像放入不同的文件夹中来完成的。有时,这是通过提供一个 CSV 文件,在该文件中,每个文件名都与应该在其中的数据集一起列出。有许多可以完成此操作的方法,fastai 提供了一种通用方法,允许您使用其预定义类之一或编写自己的类。
在这种情况下,我们希望随机拆分我们的训练和验证集。但是,我们希望每次运行此笔记本时都具有相同的训练/验证拆分,因此我们固定随机种子(计算机实际上不知道如何创建随机数,而只是创建看起来随机的数字列表;如果您每次都为该列表提供相同的起始点——称为种子,那么您将每次都获得完全相同的列表)。
splitter=RandomSplitter(valid_pct=0.2, seed=42)
自变量通常被称为x,因变量通常被称为y。在这里,我们告诉 fastai 要调用哪个函数来创建数据集中的标签:
get_y=parent_label
parent_label是 fastai 提供的一个函数,它简单地获取文件所在文件夹的名称。因为我们将每个熊图像放入基于熊类型的文件夹中,这将为我们提供所需的标签。
我们的图像大小各不相同,这对深度学习是一个问题:我们不是一次向模型提供一个图像,而是多个图像(我们称之为mini-batch)。为了将它们分组到一个大数组(通常称为张量)中,以便通过我们的模型,它们都需要是相同的大小。因此,我们需要添加一个转换,将这些图像调整为相同的大小。Item transforms是在每个单独项目上运行的代码片段,无论是图像、类别还是其他。fastai 包含许多预定义的转换;我们在这里使用Resize转换,并指定大小为 128 像素:
item_tfms=Resize(128)
这个命令给了我们一个DataBlock对象。这就像创建DataLoaders的模板。我们仍然需要告诉 fastai 我们数据的实际来源——在这种情况下,图像所在的路径:
dls = bears.dataloaders(path)
DataLoaders包括验证和训练DataLoader。DataLoader是一个类,它一次向 GPU 提供几个项目的批次。我们将在下一章中更多地了解这个类。当您循环遍历DataLoader时,fastai 会一次给您 64 个(默认值)项目,全部堆叠到一个单一张量中。我们可以通过在DataLoader上调用show_batch方法来查看其中一些项目:
dls.valid.show_batch(max_n=4, nrows=1)

默认情况下,Resize会将图像裁剪成适合请求大小的正方形形状,使用完整的宽度或高度。这可能会导致丢失一些重要细节。或者,您可以要求 fastai 用零(黑色)填充图像,或者压缩/拉伸它们:
bears = bears.new(item_tfms=Resize(128, ResizeMethod.Squish))
dls = bears.dataloaders(path)
dls.valid.show_batch(max_n=4, nrows=1)

bears = bears.new(item_tfms=Resize(128, ResizeMethod.Pad, pad_mode='zeros'))
dls = bears.dataloaders(path)
dls.valid.show_batch(max_n=4, nrows=1)

所有这些方法似乎都有些浪费或问题。如果我们压缩或拉伸图像,它们最终会变成不现实的形状,导致模型学习到事物看起来与实际情况不同,这会导致更低的准确性。如果我们裁剪图像,我们会移除一些允许我们进行识别的特征。例如,如果我们试图识别狗或猫的品种,我们可能会裁剪掉区分相似品种所需的身体或面部的关键部分。如果我们填充图像,就会有很多空白空间,这对我们的模型来说只是浪费计算,并导致我们实际使用的图像部分具有较低的有效分辨率。
相反,我们在实践中通常做的是随机选择图像的一部分,然后裁剪到该部分。在每个纪元(即数据集中所有图像的完整遍历),我们随机选择每个图像的不同部分。这意味着我们的模型可以学习关注和识别图像中的不同特征。这也反映了图像在现实世界中的工作方式:同一物体的不同照片可能以略有不同的方式构图。
事实上,一个完全未经训练的神经网络对图像的行为一无所知。它甚至不认识当一个物体旋转一度时,它仍然是同一物体的图片!因此,通过训练神经网络使用物体在略有不同位置并且大小略有不同的图像的示例,有助于它理解物体的基本概念,以及如何在图像中表示它。
这里是另一个示例,我们将Resize替换为RandomResizedCrop,这是提供刚才描述行为的转换。传递的最重要参数是min_scale,它确定每次选择图像的最小部分:
bears = bears.new(item_tfms=RandomResizedCrop(128, min_scale=0.3))
dls = bears.dataloaders(path)
dls.train.show_batch(max_n=4, nrows=1, unique=True)

在这里,我们使用了unique=True,以便将相同图像重复使用不同版本的RandomResizedCrop变换。
RandomResizedCrop是更一般的数据增强技术的一个具体示例。
数据增强
数据增强指的是创建输入数据的随机变化,使它们看起来不同但不改变数据的含义。对于图像的常见数据增强技术包括旋转、翻转、透视变形、亮度变化和对比度变化。对于我们在这里使用的自然照片图像,我们发现一组标准的增强技术与aug_transforms函数一起提供,效果非常好。
因为我们的图像现在都是相同大小,我们可以使用 GPU 将这些增强应用于整个批次的图像,这将节省大量时间。要告诉 fastai 我们要在批次上使用这些变换,我们使用batch_tfms参数(请注意,在此示例中我们没有使用RandomResizedCrop,这样您可以更清楚地看到差异;出于同样的原因,我们使用了默认值的两倍的增强量):
bears = bears.new(item_tfms=Resize(128), batch_tfms=aug_transforms(mult=2))
dls = bears.dataloaders(path)
dls.train.show_batch(max_n=8, nrows=2, unique=True)

现在我们已经将数据组装成适合模型训练的格式,让我们使用它来训练一个图像分类器。
训练您的模型,并使用它来清理您的数据
现在是时候使用与第一章中相同的代码行来训练我们的熊分类器了。对于我们的问题,我们没有太多的数据(每种熊最多 150 张图片),因此为了训练我们的模型,我们将使用RandomResizedCrop,图像大小为 224 像素,这对于图像分类来说是相当标准的,并且使用默认的aug_transforms:
bears = bears.new(
item_tfms=RandomResizedCrop(224, min_scale=0.5),
batch_tfms=aug_transforms())
dls = bears.dataloaders(path)
现在我们可以按照通常的方式创建我们的Learner并进行微调:
learn = cnn_learner(dls, resnet18, metrics=error_rate)
learn.fine_tune(4)
| epoch | train_loss | valid_loss | error_rate | time |
|---|---|---|---|---|
| 0 | 1.235733 | 0.212541 | 0.087302 | 00:05 |
| epoch | train_loss | valid_loss | error_rate | time |
| --- | --- | --- | --- | --- |
| 0 | 0.213371 | 0.112450 | 0.023810 | 00:05 |
| 1 | 0.173855 | 0.072306 | 0.023810 | 00:06 |
| 2 | 0.147096 | 0.039068 | 0.015873 | 00:06 |
| 3 | 0.123984 | 0.026801 | 0.015873 | 00:06 |
现在让我们看看模型犯的错误主要是认为灰熊是泰迪熊(这对安全性来说是不好的!),还是认为灰熊是黑熊,或者其他情况。为了可视化这一点,我们可以创建一个混淆矩阵:
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()

行代表数据集中所有黑色、灰熊和泰迪熊,列分别代表模型预测为黑色、灰熊和泰迪熊的图像。因此,矩阵的对角线显示了被正确分类的图像,而非对角线的单元格代表被错误分类的图像。这是 fastai 允许您查看模型结果的许多方式之一。当然,这是使用验证集计算的。通过颜色编码,目标是在对角线以外的地方都是白色,而在对角线上我们希望是深蓝色。我们的熊分类器几乎没有犯错!
看到我们的错误发生在哪里是有帮助的,以便确定它们是由数据集问题(例如,根本不是熊的图像,或者标记错误)还是模型问题(也许它无法处理使用不同光照或从不同角度拍摄的图像等)。为了做到这一点,我们可以根据损失对图像进行排序。
损失是一个数字,如果模型不正确(尤其是如果它对其不正确的答案也很自信),或者如果它是正确的但对其正确答案不自信,那么损失就会更高。在第二部分的开头,我们将深入学习损失是如何计算和在训练过程中使用的。现在,plot_top_losses向我们展示了数据集中损失最高的图像。正如输出的标题所说,每个图像都标有四个内容:预测、实际(目标标签)、损失和概率。这里的概率是模型对其预测分配的置信水平,从零到一:
interp.plot_top_losses(5, nrows=1)

这个输出显示,损失最高的图像是一个被预测为“灰熊”的图像,且置信度很高。然而,根据我们的必应图像搜索,它被标记为“黑熊”。我们不是熊专家,但在我们看来,这个标签显然是错误的!我们可能应该将其标签更改为“灰熊”。
进行数据清洗的直观方法是在训练模型之前进行。但正如您在本例中所看到的,模型可以帮助您更快速、更轻松地找到数据问题。因此,我们通常更喜欢先训练一个快速简单的模型,然后使用它来帮助我们进行数据清洗。
fastai 包括一个方便的用于数据清洗的 GUI,名为ImageClassifierCleaner,它允许您选择一个类别和训练与验证集,并查看损失最高的图像(按顺序),以及菜单允许选择要删除或重新标记的图像:
cleaner = ImageClassifierCleaner(learn)
cleaner

我们可以看到在我们的“黑熊”中有一张包含两只熊的图片:一只灰熊,一只黑熊。因此,我们应该在此图片下的菜单中选择<Delete>。ImageClassifierCleaner不会为您删除或更改标签;它只会返回要更改的项目的索引。因此,例如,要删除(取消链接)所有选定要删除的图像,我们将运行以下命令:
for idx in cleaner.delete(): cleaner.fns[idx].unlink()
要移动我们选择了不同类别的图像,我们将运行以下命令:
for idx,cat in cleaner.change(): shutil.move(str(cleaner.fns[idx]), path/cat)
Sylvain 说
清理数据并为您的模型做好准备是数据科学家面临的两个最大挑战;他们说这需要他们 90%的时间。fastai 库旨在提供尽可能简单的工具。
在本书中,我们将看到更多基于模型驱动的数据清洗示例。一旦我们清理了数据,我们就可以重新训练我们的模型。自己尝试一下,看看你的准确性是否有所提高!
不需要大数据
通过这些步骤清理数据集后,我们通常在这个任务上看到 100%的准确性。即使我们下载的图像比我们在这里使用的每类 150 张要少得多,我们也能看到这个结果。正如您所看到的,您需要大量数据才能进行深度学习的常见抱怨可能与事实相去甚远!
现在我们已经训练了我们的模型,让我们看看如何部署它以便在实践中使用。
将您的模型转化为在线应用程序
现在我们将看看将这个模型转化为一个可工作的在线应用程序需要什么。我们将只创建一个基本的工作原型;在本书中,我们没有范围来教授您有关 Web 应用程序开发的所有细节。
使用模型进行推断
一旦您拥有一个满意的模型,您需要保存它,以便随后将其复制到一个服务器上,在那里您将在生产中使用它。请记住,模型由两部分组成:架构和训练的参数。保存模型的最简单方法是保存这两部分,因为这样,当您加载模型时,您可以确保具有匹配的架构和参数。要保存这两部分,请使用export方法。
这种方法甚至保存了如何创建您的DataLoaders的定义。这很重要,因为否则您将不得不重新定义如何转换您的数据以便在生产中使用您的模型。fastai 默认使用验证集DataLoader进行推理,因此不会应用数据增强,这通常是您想要的。
当您调用export时,fastai 将保存一个名为export.pkl的文件:
learn.export()
让我们通过使用 fastai 添加到 Python 的Path类的ls方法来检查文件是否存在:
path = Path()
path.ls(file_exts='.pkl')
(#1) [Path('export.pkl')]
您需要这个文件在您部署应用程序的任何地方。现在,让我们尝试在我们的笔记本中创建一个简单的应用程序。
当我们使用模型进行预测而不是训练时,我们称之为推理。要从导出的文件创建我们的推理学习者,我们使用load_learner(在这种情况下,这并不是真正必要的,因为我们已经在笔记本中有一个工作的Learner;我们在这里这样做是为了让您看到整个过程的始终):
learn_inf = load_learner(path/'export.pkl')
在进行推理时,通常一次只为一个图像获取预测。要做到这一点,将文件名传递给predict:
learn_inf.predict('images/grizzly.jpg')
('grizzly', tensor(1), tensor([9.0767e-06, 9.9999e-01, 1.5748e-07]))
这返回了三个东西:以与您最初提供的格式相同的预测类别(在本例中,这是一个字符串),预测类别的索引以及每个类别的概率。最后两个是基于DataLoaders的vocab中类别的顺序;也就是说,所有可能类别的存储列表。在推理时,您可以将DataLoaders作为Learner的属性访问:
learn_inf.dls.vocab
(#3) ['black','grizzly','teddy']
我们可以看到,如果我们使用predict返回的整数索引到 vocab 中,我们会得到“灰熊”,这是预期的。另外,请注意,如果我们在概率列表中进行索引,我们会看到几乎有 1.00 的概率这是一只灰熊。
我们知道如何从保存的模型中进行预测,因此我们拥有开始构建我们的应用程序所需的一切。我们可以直接在 Jupyter 笔记本中完成。
从模型创建一个笔记本应用
要在应用程序中使用我们的模型,我们可以简单地将predict方法视为常规函数。因此,使用任何应用程序开发人员可用的各种框架和技术都可以创建一个从模型创建的应用程序。
然而,大多数数据科学家并不熟悉 Web 应用程序开发领域。因此,让我们尝试使用您目前已经了解的东西:事实证明,我们可以仅使用 Jupyter 笔记本创建一个完整的工作 Web 应用程序!使这一切成为可能的两个因素如下:
-
IPython 小部件(ipywidgets)
-
Voilà
IPython 小部件是 GUI 组件,它在 Web 浏览器中将 JavaScript 和 Python 功能结合在一起,并可以在 Jupyter 笔记本中创建和使用。例如,我们在本章前面看到的图像清理器完全是用 IPython 小部件编写的。但是,我们不希望要求我们的应用程序用户自己运行 Jupyter。
这就是Voilà存在的原因。它是一个使 IPython 小部件应用程序可供最终用户使用的系统,而无需他们使用 Jupyter。Voilà利用了一个事实,即笔记本已经是一种 Web 应用程序,只是另一个复杂的依赖于另一个 Web 应用程序:Jupyter 本身的 Web 应用程序。基本上,它帮助我们自动将我们已经隐式创建的复杂 Web 应用程序(笔记本)转换为一个更简单、更易部署的 Web 应用程序,它的功能类似于普通的 Web 应用程序,而不是笔记本。
但是我们仍然可以在笔记本中开发的优势,因此使用 ipywidgets,我们可以逐步构建我们的 GUI。我们将使用这种方法创建一个简单的图像分类器。首先,我们需要一个文件上传小部件:
btn_upload = widgets.FileUpload()
btn_upload

现在我们可以获取图像:
img = PILImage.create(btn_upload.data[-1])

我们可以使用Output小部件来显示它:
out_pl = widgets.Output()
out_pl.clear_output()
with out_pl: display(img.to_thumb(128,128))
out_pl

然后我们可以得到我们的预测:
pred,pred_idx,probs = learn_inf.predict(img)
并使用Label来显示它们:
lbl_pred = widgets.Label()
lbl_pred.value = f'Prediction: {pred}; Probability: {probs[pred_idx]:.04f}'
lbl_pred
预测:灰熊;概率:1.0000
我们需要一个按钮来进行分类。它看起来与上传按钮完全相同:
btn_run = widgets.Button(description='Classify')
btn_run
我们还需要一个点击事件处理程序;也就是说,当按下按钮时将调用的函数。我们可以简单地复制之前的代码行:
def on_click_classify(change):
img = PILImage.create(btn_upload.data[-1])
out_pl.clear_output()
with out_pl: display(img.to_thumb(128,128))
pred,pred_idx,probs = learn_inf.predict(img)
lbl_pred.value = f'Prediction: {pred}; Probability: {probs[pred_idx]:.04f}'
btn_run.on_click(on_click_classify)
您现在可以通过单击按钮来测试按钮,您应该会看到图像和预测会自动更新!
现在,我们可以将它们全部放在一个垂直框(VBox)中,以完成我们的 GUI:
VBox([widgets.Label('Select your bear!'),
btn_upload, btn_run, out_pl, lbl_pred])

我们已经编写了所有必要的应用程序代码。下一步是将其转换为我们可以部署的内容。
将您的笔记本变成一个真正的应用程序
现在我们在这个 Jupyter 笔记本中已经让一切运转起来了,我们可以创建我们的应用程序。为此,请启动一个新的笔记本,并仅添加创建和显示所需小部件的代码,以及任何要显示的文本的 Markdown。查看书中存储库中的bear_classifier笔记本,看看我们创建的简单笔记本应用程序。
接下来,如果您尚未安装 Voilà,请将这些行复制到笔记本单元格中并执行:
!pip install voila
!jupyter serverextension enable voila --sys-prefix
以!开头的单元格不包含 Python 代码,而是包含传递给您的 shell(bash,Windows PowerShell 等)的代码。如果您习惯使用命令行,我们将在本书中更详细地讨论这一点,您当然可以直接在终端中键入这两行(不带!前缀)。在这种情况下,第一行安装voila库和应用程序,第二行将其连接到您现有的 Jupyter 笔记本。
Voilà运行 Jupyter 笔记本,就像您现在使用的 Jupyter 笔记本服务器一样,但它还做了一件非常重要的事情:它删除了所有单元格输入,仅显示输出(包括 ipywidgets),以及您的 Markdown 单元格。因此,剩下的是一个 Web 应用程序!要将您的笔记本视为 Voilà Web 应用程序,请将浏览器 URL 中的“notebooks”一词替换为“voila/render”。您将看到与您的笔记本相同的内容,但没有任何代码单元格。
当然,您不需要使用 Voilà或 ipywidgets。您的模型只是一个可以调用的函数(pred,pred_idx,probs = learn.predict(img)),因此您可以将其与任何框架一起使用,托管在任何平台上。您可以将在 ipywidgets 和 Voilà中原型设计的内容稍后转换为常规 Web 应用程序。我们在本书中展示这种方法,因为我们认为这是数据科学家和其他不是 Web 开发专家的人从其模型创建应用程序的绝佳方式。
我们有了我们的应用程序;现在让我们部署它!
部署您的应用程序
正如您现在所知,几乎任何有用的深度学习模型都需要 GPU 来训练。那么,在生产中使用该模型需要 GPU 吗?不需要!您几乎可以肯定在生产中不需要 GPU 来提供您的模型。这样做有几个原因:
-
正如我们所见,GPU 仅在并行执行大量相同工作时才有用。如果您正在进行(比如)图像分类,通常一次只会对一个用户的图像进行分类,而且通常在一张图像中没有足够的工作量可以让 GPU 忙碌足够长的时间以使其非常有效。因此,CPU 通常更具成本效益。
-
另一种选择可能是等待一些用户提交他们的图像,然后将它们批量处理并一次性在 GPU 上处理。但是这样会让用户等待,而不是立即得到答案!而且您需要一个高流量的网站才能实现这一点。如果您确实需要这种功能,您可以使用诸如 Microsoft 的ONNX Runtime或AWS SageMaker之类的工具。
-
处理 GPU 推理的复杂性很大。特别是,GPU 的内存需要仔细手动管理,您需要一个仔细的排队系统,以确保一次只处理一个批次。
-
CPU 服务器的市场竞争要比 GPU 服务器更激烈,因此 CPU 服务器有更便宜的选项可供选择。
由于 GPU 服务的复杂性,许多系统已经出现尝试自动化此过程。然而,管理和运行这些系统也很复杂,通常需要将您的模型编译成专门针对该系统的不同形式。通常最好避免处理这种复杂性,直到/除非您的应用程序变得足够受欢迎,以至于您有明显的财务理由这样做。
至少对于您的应用程序的初始原型以及您想展示的任何爱好项目,您可以轻松免费托管它们。最佳位置和最佳方式随时间而变化,因此请查看本书网站以获取最新的建议。由于我们在 2020 年初撰写本书,最简单(且免费!)的方法是使用Binder。要在 Binder 上发布您的 Web 应用程序,请按照以下步骤操作:
-
将您的笔记本添加到GitHub 存储库。
-
将该存储库的 URL 粘贴到 Binder 的 URL 字段中,如图 2-4 所示。
-
将文件下拉菜单更改为选择 URL。
-
在“要打开的 URL”字段中,输入
/voila/render/*name*.ipynb(将name替换为您笔记本的名称)。 -
单击右下角的剪贴板按钮以复制 URL,并将其粘贴到安全位置。
-
单击“启动”。

图 2-4. 部署到 Binder
第一次执行此操作时,Binder 将花费大约 5 分钟来构建您的站点。在幕后,它正在查找一个可以运行您的应用程序的虚拟机,分配存储空间,并收集所需的文件以用于 Jupyter、您的笔记本以及将您的笔记本呈现为 Web 应用程序。
最后,一旦启动应用程序运行,它将导航您的浏览器到您的新 Web 应用程序。您可以分享您复制的 URL 以允许其他人访问您的应用程序。
要了解部署 Web 应用程序的其他(免费和付费)选项,请务必查看书籍网站。
您可能希望将应用程序部署到移动设备或边缘设备,如树莓派。有许多库和框架允许您将模型直接集成到移动应用程序中。但是,这些方法往往需要许多额外的步骤和样板文件,并且并不总是支持您的模型可能使用的所有 PyTorch 和 fastai 层。此外,您所做的工作将取决于您针对部署的移动设备的类型 - 您可能需要做一些工作以在 iOS 设备上运行,不同的工作以在较新的 Android 设备上运行,不同的工作以在较旧的 Android 设备上运行,等等。相反,我们建议在可能的情况下,将模型本身部署到服务器,并让您的移动或边缘应用程序连接到它作为 Web 服务。
这种方法有很多优点。初始安装更容易,因为您只需部署一个小型 GUI 应用程序,该应用程序连接到服务器执行所有繁重的工作。更重要的是,核心逻辑的升级可以在您的服务器上进行,而不需要分发给所有用户。您的服务器将拥有比大多数边缘设备更多的内存和处理能力,并且如果您的模型变得更加苛刻,那么扩展这些资源将更容易。您在服务器上拥有的硬件也将更加标准化,并且更容易受到 fastai 和 PyTorch 的支持,因此您不必将模型编译成不同的形式。
当然也有缺点。你的应用程序将需要网络连接,每次调用模型时都会有一些延迟。(神经网络模型本来就需要一段时间来运行,所以这种额外的网络延迟在实践中可能对用户没有太大影响。事实上,由于你可以在服务器上使用更好的硬件,总体延迟甚至可能比在本地运行时更少!)此外,如果你的应用程序使用敏感数据,你的用户可能会担心采用将数据发送到远程服务器的方法,因此有时隐私考虑将意味着你需要在边缘设备上运行模型(通过在公司防火墙内部设置本地服务器可能可以避免这种情况)。管理复杂性和扩展服务器也可能会带来额外的开销,而如果你的模型在边缘设备上运行,每个用户都会带来自己的计算资源,这将导致随着用户数量的增加更容易扩展(也称为水平扩展)。
Alexis 说
我有机会近距离看到移动机器学习领域在我的工作中是如何变化的。我们提供一个依赖于计算机视觉的 iPhone 应用程序,多年来我们在云中运行我们自己的计算机视觉模型。那时这是唯一的方法,因为那些模型需要大量的内存和计算资源,并且需要几分钟来处理输入。这种方法不仅需要构建模型(有趣!),还需要构建基础设施来确保一定数量的“计算工作机器”始终在运行(可怕),如果流量增加,更多的机器会自动上线,有稳定的存储用于大型输入和输出,iOS 应用程序可以知道并告诉用户他们的工作进展如何等等。如今,苹果提供了 API,可以将模型转换为在设备上高效运行,大多数 iOS 设备都有专用的 ML 硬件,所以这是我们用于新模型的策略。这仍然不容易,但在我们的情况下,为了更快的用户体验和更少地担心服务器,这是值得的。对你来说有效的方法将取决于你试图创建的用户体验以及你个人认为容易做的事情。如果你真的知道如何运行服务器,那就去做。如果你真的知道如何构建本地移动应用程序,那就去做。有很多条路通往山顶。
总的来说,我们建议在可能的情况下尽可能使用简单的基于 CPU 的服务器方法,只要你能够做到。如果你足够幸运拥有一个非常成功的应用程序,那么你将能够在那个时候为更复杂的部署方法进行投资。
恭喜你——你已经成功构建了一个深度学习模型并部署了它!现在是一个很好的时机停下来思考可能出现的问题。
如何避免灾难
在实践中,一个深度学习模型只是一个更大系统中的一部分。正如我们在本章开头讨论的那样,构建数据产品需要考虑整个端到端的过程,从概念到在生产中使用。在这本书中,我们无法希望涵盖所有管理部署数据产品的复杂性,比如管理多个模型版本,A/B 测试,金丝雀发布,刷新数据(我们应该一直增加和增加我们的数据集,还是应该定期删除一些旧数据?),处理数据标记,监控所有这些,检测模型腐烂等等。
在本节中,我们将概述一些需要考虑的最重要问题;关于部署问题的更详细讨论,我们建议您参考 Emmanuel Ameisin(O'Reilly)的优秀著作《构建机器学习驱动的应用程序》。
需要考虑的最大问题之一是,理解和测试深度学习模型的行为比大多数其他代码更困难。在正常软件开发中,您可以分析软件所采取的确切步骤,并仔细研究这些步骤中哪些与您试图创建的期望行为相匹配。但是,对于神经网络,行为是从模型尝试匹配训练数据中产生的,而不是精确定义的。
这可能导致灾难!例如,假设我们真的正在推出一个熊检测系统,将连接到国家公园露营地周围的视频摄像头,并警告露营者有熊靠近。如果我们使用下载的数据集训练的模型,实际上会出现各种问题,比如:
-
处理视频数据而不是图像
-
处理可能不在数据集中出现的夜间图像
-
处理低分辨率摄像头图像
-
确保结果返回得足够快以在实践中有用
-
在照片中很少见到的位置识别熊(例如从背后,部分被灌木覆盖,或者离摄像机很远)
问题的一个重要部分是,人们最有可能上传到互联网的照片是那些能够清晰艺术地展示主题的照片,而这并不是该系统将获得的输入类型。因此,我们可能需要进行大量自己的数据收集和标记以创建一个有用的系统。
这只是更一般的“域外”数据问题的一个例子。也就是说,在生产中,我们的模型可能看到与训练时非常不同的数据。这个问题没有完全的技术解决方案;相反,我们必须谨慎地推出技术。
我们还需要小心的其他原因。一个非常常见的问题是域漂移,即我们的模型看到的数据类型随着时间的推移而发生变化。例如,一个保险公司可能将深度学习模型用作其定价和风险算法的一部分,但随着时间的推移,公司吸引的客户类型和代表的风险类型可能发生如此大的变化,以至于原始训练数据不再相关。
域外数据和域漂移是更大问题的例子:您永远无法完全理解神经网络的所有可能行为,因为它们有太多参数。这是它们最好特性的自然缺点——它们的灵活性,使它们能够解决我们甚至可能无法完全指定首选解决方案的复杂问题。然而,好消息是,有办法通过一个经过深思熟虑的过程来减轻这些风险。这些细节将根据您正在解决的问题的细节而变化,但我们将尝试提出一个高层次的方法,总结在图 2-5 中,我们希望这将提供有用的指导。

图 2-5. 部署过程
在可能的情况下,第一步是使用完全手动的过程,您的深度学习模型方法并行运行,但不直接用于驱动任何操作。参与手动过程的人员应查看深度学习输出,并检查其是否合理。例如,对于我们的熊分类器,公园管理员可以在屏幕上显示所有摄像头的视频源,任何可能的熊目击都会被简单地用红色突出显示。在部署模型之前,公园管理员仍然应该像以前一样警惕;模型只是在这一点上帮助检查问题。
第二步是尝试限制模型的范围,并由人仔细监督。例如,对模型驱动方法进行小范围地理和时间限制的试验。与其在全国各地的每个国家公园推出我们的熊分类器,我们可以选择一个单一的观测站,在一个星期的时间内,让一名公园管理员在每次警报发出之前检查。
然后,逐渐扩大您的推出范围。在这样做时,请确保您有非常好的报告系统,以确保您了解与您的手动流程相比所采取的行动是否发生了重大变化。例如,如果在某个地点推出新系统后,熊警报数量翻倍或减半,您应该非常关注。尝试考虑系统可能出错的所有方式,然后考虑什么措施、报告或图片可以反映出这个问题,并确保您的定期报告包含这些信息。
杰里米说
20 年前,我创办了一家名为 Optimal Decisions 的公司,利用机器学习和优化帮助巨大的保险公司设定价格,影响数千亿美元的风险。我们使用这里描述的方法来管理可能出错的潜在风险。此外,在与客户合作将任何东西投入生产之前,我们尝试通过在他们去年的数据上测试端到端系统的影响来模拟影响。将这些新算法投入生产总是一个非常紧张的过程,但每次推出都取得了成功。
意想不到的后果和反馈循环
推出模型的最大挑战之一是,您的模型可能会改变其所属系统的行为。例如,考虑一个“预测执法”算法,它预测某些社区的犯罪率更高,导致更多警察被派往这些社区,这可能导致这些社区记录更多犯罪,依此类推。在皇家统计学会的论文“预测和服务?”中,Kristian Lum 和 William Isaac 观察到“预测性执法的命名恰如其分:它预测未来的执法,而不是未来的犯罪。”
在这种情况下的部分问题是,在存在偏见的情况下(我们将在下一章中深入讨论),反馈循环可能导致该偏见的负面影响变得越来越严重。例如,在美国已经存在着在种族基础上逮捕率存在显著偏见的担忧。根据美国公民自由联盟的说法,“尽管使用率大致相等,黑人因大麻被逮捕的可能性是白人的 3.73 倍。”这种偏见的影响,以及在美国许多地区推出预测性执法算法,导致 Bärí Williams 在纽约时报中写道:“在我的职业生涯中引起如此多兴奋的技术正在以可能意味着在未来几年,我的 7 岁儿子更有可能因为他的种族和我们居住的地方而被无故定性或逮捕,甚至更糟。”
在推出重要的机器学习系统之前,一个有用的练习是考虑这个问题:“如果它真的很成功会发生什么?”换句话说,如果预测能力非常高,对行为的影响非常显著,那么会发生什么?谁会受到最大影响?最极端的结果可能是什么样的?你怎么知道到底发生了什么?
这样的思考练习可能会帮助你制定一个更加谨慎的推出计划,配备持续监控系统和人类监督。当然,如果人类监督没有被听取,那么它就没有用,因此确保可靠和有弹性的沟通渠道存在,以便正确的人会意识到问题并有权力解决它们。
开始写作吧!
我们的学生发现最有帮助巩固对这一材料的理解的事情之一是把它写下来。尝试教给别人是对你对一个主题的理解的最好测试。即使你从不向任何人展示你的写作,这也是有帮助的,但如果你分享了,那就更好了!因此,我们建议,如果你还没有开始写博客,那么现在就开始吧。现在你已经完成了这一章并学会了如何训练和部署模型,你已经可以写下你的第一篇关于深度学习之旅的博客文章了。你有什么惊讶?你在你的领域看到了深度学习的机会?你看到了什么障碍?
fast.ai 的联合创始人 Rachel Thomas 在文章“为什么你(是的,你)应该写博客”中写道:
我会给年轻的自己的最重要建议是尽早开始写博客。以下是一些写博客的理由:
- 这就像一份简历,只不过更好。我知道有几个人因为写博客文章而得到了工作机会!
- 帮助你学习。组织知识总是帮助我整合自己的想法。是否理解某事的一个测试是你是否能够向别人解释它。博客文章是一个很好的方式。
- 我通过我的博客文章收到了参加会议的邀请和演讲邀请。我因为写了一篇关于我不喜欢 TensorFlow 的博客文章而被邀请参加 TensorFlow Dev Summit(太棒了!)。
- 结识新朋友。我认识了几个回复我写的博客文章的人。
- 节省时间。每当你通过电子邮件多次回答同一个问题时,你应该把它变成一篇博客文章,这样下次有人问起时你就更容易分享了。
也许她最重要的建议是:
你最适合帮助比你落后一步的人。这些材料仍然新鲜在你的脑海中。许多专家已经忘记了作为初学者(或中级学习者)时的感受,忘记了当你第一次听到这个话题时为什么难以理解。你特定背景、风格和知识水平的背景将为你所写的内容带来不同的视角。
我们已经提供了如何在附录 A 中设置博客的详细信息。如果你还没有博客,现在就看看吧,因为我们有一个非常好的方法让你免费开始写博客,没有广告,甚至可以使用 Jupyter Notebook!
问卷调查
-
文本模型目前存在哪些主要不足之处?
-
文本生成模型可能存在哪些负面社会影响?
-
在模型可能犯错且这些错误可能有害的情况下,自动化流程的一个好的替代方案是什么?
-
深度学习在哪种表格数据上特别擅长?
-
直接使用深度学习模型进行推荐系统的一个主要缺点是什么?
-
驱动器方法的步骤是什么?
-
驱动器方法的步骤如何映射到推荐系统?
-
使用你策划的数据创建一个图像识别模型,并将其部署在网络上。
-
DataLoaders是什么? -
我们需要告诉 fastai 创建
DataLoaders的四件事是什么? -
DataBlock中的splitter参数是做什么的? -
我们如何确保随机分割总是给出相同的验证集?
-
哪些字母通常用来表示自变量和因变量?
-
裁剪、填充和压缩调整方法之间有什么区别?在什么情况下你会选择其中之一?
-
什么是数据增强?为什么需要它?
-
提供一个例子,说明熊分类模型在生产中可能因训练数据的结构或风格差异而效果不佳。
-
item_tfms和batch_tfms之间有什么区别? -
混淆矩阵是什么?
-
export保存了什么? -
当我们使用模型进行预测而不是训练时,这被称为什么?
-
IPython 小部件是什么?
-
什么时候会使用 CPU 进行部署?什么时候 GPU 可能更好?
-
将应用部署到服务器而不是客户端(或边缘)设备(如手机或 PC)的缺点是什么?
-
在实践中推出熊警告系统时可能出现的三个问题的例子是什么?
-
什么是域外数据?
-
什么是领域转移?
-
部署过程中的三个步骤是什么?
进一步研究
-
考虑一下驱动器方法如何映射到你感兴趣的项目或问题。
-
在什么情况下最好避免某些类型的数据增强?
-
对于你有兴趣应用深度学习的项目,考虑一下这个思维实验,“如果它进展得非常顺利会发生什么?”
-
开始写博客,撰写你的第一篇博客文章。例如,写一下你认为深度学习在你感兴趣的领域可能有用的地方。
第三章:数据伦理
正如我们在第一章和第二章中讨论的,有时机器学习模型可能出错。它们可能有错误。它们可能被呈现出以前没有见过的数据,并以我们意料之外的方式行事。或者它们可能完全按设计工作,但被用于我们非常希望它们永远不要被用于的事情。
因为深度学习是如此强大的工具,可以用于很多事情,所以我们特别需要考虑我们选择的后果。哲学上对伦理的研究是对对错的研究,包括我们如何定义这些术语,识别对错行为,以及理解行为和后果之间的联系。数据伦理领域已经存在很长时间,许多学者都专注于这个领域。它被用来帮助定义许多司法管辖区的政策;它被用在大大小小的公司中,考虑如何最好地确保产品开发对社会的良好结果;它被研究人员用来确保他们正在做的工作被用于好的目的,而不是坏的目的。
因此,作为一个深度学习从业者,你很可能在某个时候会面临需要考虑数据伦理的情况。那么数据伦理是什么?它是伦理学的一个子领域,所以让我们从那里开始。
杰里米说
在大学里,伦理哲学是我的主要研究领域(如果我完成了论文,而不是辍学加入现实世界,它本来会是我的论文题目)。根据我花在研究伦理学上的年份,我可以告诉你这个:没有人真正同意什么是对什么是错,它们是否存在,如何识别它们,哪些人是好人哪些人是坏人,或者几乎任何其他事情。所以不要对理论抱太大期望!我们将在这里专注于例子和思考的起点,而不是理论。
在回答问题“什么是伦理?” 应用伦理马库拉中心说,这个术语指的是以下内容:
-
有根据的对人类应该做什么的正确和错误的标准
-
研究和发展自己的伦理标准
没有正确答案的清单。没有应该和不应该做的清单。伦理是复杂的,依赖于背景。它涉及许多利益相关者的观点。伦理是一个你必须发展和实践的能力。在本章中,我们的目标是提供一些路标,帮助你在这个旅程中前进。
发现伦理问题最好是作为一个协作团队的一部分来做。这是你真正可以融入不同观点的唯一方式。不同人的背景将帮助他们看到你可能没有注意到的事情。与团队合作对于许多“锻炼肌肉”的活动都是有帮助的,包括这个。
这一章当然不是本书中唯一讨论数据伦理的部分,但是有一个地方专注于它一段时间是很好的。为了定位,也许最容易看一些例子。所以,我们挑选了三个我们认为有效地说明了一些关键主题的例子。
数据伦理的关键例子
我们将从三个具体的例子开始,这些例子说明了技术中三个常见的伦理问题(我们将在本章后面更深入地研究这些问题):
救济程序
阿肯色州有缺陷的医疗保健算法让患者陷入困境。
反馈循环
YouTube 的推荐系统帮助引发了阴谋论繁荣。
偏见
当在谷歌上搜索传统的非裔美国人名字时,会显示犯罪背景调查的广告。
事实上,在本章中我们介绍的每个概念,我们都会提供至少一个具体的例子。对于每一个例子,想想在这种情况下你可以做什么,以及可能会有什么样的障碍阻止你完成。你会如何处理它们?你会注意什么?
错误和救济:用于医疗福利的错误算法
《The Verge》调查了在美国半数以上州使用的软件,以确定人们接受多少医疗保健,并在文章《当算法削减您的医疗保健时会发生什么》中记录了其发现。在阿肯色州实施算法后,数百人(许多患有严重残疾的人)的医疗保健被大幅削减。
例如,Tammy Dobbs 是一名患有脑瘫的女性,需要助手帮助她起床、上厕所、拿食物等,她的帮助时间突然减少了 20 小时每周。她无法得到任何解释为什么她的医疗保健被削减。最终,一场法庭案件揭示了算法的软件实施中存在错误,对患有糖尿病或脑瘫的人造成了负面影响。然而,Dobbs 和许多其他依赖这些医疗福利的人生活在恐惧中,担心他们的福利可能再次突然而莫名其妙地被削减。
反馈循环:YouTube 的推荐系统
当您的模型控制您获得的下一轮数据时,反馈循环可能会发生。返回的数据很快就会被软件本身破坏。
例如,YouTube 有 19 亿用户,他们每天观看超过 10 亿小时的 YouTube 视频。其推荐算法(由谷歌构建)旨在优化观看时间,负责约 70%的观看内容。但出现了问题:它导致了失控的反馈循环,导致《纽约时报》在 2019 年 2 月发表了标题为《YouTube 引发了阴谋论繁荣。能够控制吗?》的文章。表面上,推荐系统正在预测人们会喜欢什么内容,但它们也在很大程度上决定了人们甚至看到什么内容。
偏见:拉塔尼亚·斯威尼“被捕”
拉塔尼亚·斯威尼博士是哈佛大学的教授,也是该大学数据隐私实验室的主任。在论文《在线广告投放中的歧视》中,她描述了她发现谷歌搜索她的名字会出现“拉塔尼亚·斯威尼,被捕了?”的广告,尽管她是唯一已知的拉塔尼亚·斯威尼,从未被捕。然而,当她搜索其他名字,如“Kirsten Lindquist”时,她得到了更中立的广告,尽管 Kirsten Lindquist 已经被捕了三次。

图 3-1。谷歌搜索显示关于拉塔尼亚·斯威尼(不存在的)被捕记录的广告
作为一名计算机科学家,她系统地研究了这个问题,并查看了 2000 多个名字。她发现了一个明显的模式:历史上黑人的名字会收到暗示这个人有犯罪记录的广告,而传统上的白人名字则会有更中立的广告。
这是偏见的一个例子。它可能对人们的生活产生重大影响,例如,如果一个求职者被谷歌搜索,可能会出现他们有犯罪记录的情况,而实际上并非如此。
这为什么重要?
考虑这些问题的一个非常自然的反应是:“那又怎样?这和我有什么关系?我是一名数据科学家,不是政治家。我不是公司的高级执行官之一,他们决定我们要做什么。我只是尽力构建我能构建的最具预测性的模型。”
这些是非常合理的问题。但我们将试图说服您,答案是每个训练模型的人都绝对需要考虑他们的模型将如何被使用,并考虑如何最好地确保它们被尽可能积极地使用。有一些你可以做的事情。如果你不这样做,事情可能会变得相当糟糕。
当技术人员以任何代价专注于技术时,发生的一个特别可怕的例子是 IBM 与纳粹德国的故事。2001 年,一名瑞士法官裁定认为“推断 IBM 的技术援助促进了纳粹在犯下反人类罪行时的任务,这些行为还涉及 IBM 机器进行的会计和分类,并在集中营中使用。”
你看,IBM 向纳粹提供了数据制表产品,以追踪大规模灭绝犹太人和其他群体。这是公司高层的决定,向希特勒及其领导团队推销。公司总裁托马斯·沃森亲自批准了 1939 年发布特殊的 IBM 字母排序机,以帮助组织波兰犹太人的驱逐。在图 3-2 中,阿道夫·希特勒(最左)与 IBM 首席执行官汤姆·沃森(左二)会面,希特勒在 1937 年授予沃森特别的“对帝国的服务”奖章。

图 3-2. IBM 首席执行官汤姆·沃森与阿道夫·希特勒会面
但这并不是个案 - 该组织的涉入是广泛的。IBM 及其子公司在集中营现场提供定期培训和维护:打印卡片,配置机器,并在它们经常出现故障时进行维修。IBM 在其打孔卡系统上设置了每个人被杀害的方式,他们被分配到的组别以及跟踪他们通过庞大的大屠杀系统所需的后勤信息的分类。IBM 在集中营中对犹太人的代码是 8:约有 600 万人被杀害。对于罗姆人的代码是 12(纳粹将他们标记为“不合群者”,在“吉普赛营”中有超过 30 万人被杀害)。一般处决被编码为 4,毒气室中的死亡被编码为 6。

图 3-3. IBM 在集中营中使用的打孔卡
当然,参与其中的项目经理、工程师和技术人员只是过着普通的生活。照顾家人,周日去教堂,尽力做好自己的工作。服从命令。市场营销人员只是尽力实现他们的业务发展目标。正如《IBM 与大屠杀》(Dialog Press)的作者埃德温·布莱克所观察到的:“对于盲目的技术官僚来说,手段比目的更重要。犹太人民的毁灭变得更不重要,因为 IBM 技术成就的振奋性只会因在面包排长队的时候赚取的奇幻利润而更加突出。”
退一步思考一下:如果你发现自己是一个最终伤害社会的系统的一部分,你会有什么感受?你会愿意了解吗?你如何帮助确保这种情况不会发生?我们在这里描述了最极端的情况,但今天观察到与人工智能和机器学习相关的许多负面社会后果,其中一些我们将在本章中描述。
这也不仅仅是道德负担。有时,技术人员会直接为他们的行为付出代价。例如,作为大众汽车丑闻的结果而被监禁的第一个人并不是监督该项目的经理,也不是公司的执行主管。而是其中一名工程师詹姆斯·梁,他只是听从命令。
当然,情况并非全是坏的 - 如果你参与的项目最终对一个人产生了巨大的积极影响,这会让你感到非常棒!
好的,希望我们已经说服您应该关心这个问题。但是您应该怎么做呢?作为数据科学家,我们自然倾向于通过优化某些指标来改进我们的模型。但是优化这个指标可能不会导致更好的结果。即使它确实有助于创造更好的结果,几乎肯定不会是唯一重要的事情。考虑一下从研究人员或从业者开发模型或算法到使用这项工作做出决策之间发生的步骤流程。如果我们希望获得我们想要的结果,整个流程必须被视为一个整体。
通常,从一端到另一端有一条非常长的链。如果您是一名研究人员,甚至可能不知道您的研究是否会被用于任何事情,或者如果您参与数据收集,那就更早了。但是没有人比您更适合告知所有参与这一链的人您的工作的能力、约束和细节。虽然没有“灵丹妙药”可以确保您的工作被正确使用,但通过参与这个过程,并提出正确的问题,您至少可以确保正确的问题正在被考虑。
有时,对于被要求做一项工作的正确回应就是说“不”。然而,我们经常听到的回应是:“如果我不做,别人会做。”但请考虑:如果您被选中做这项工作,那么您是他们找到的最合适的人——所以如果您不做,最合适的人就不会参与该项目。如果他们询问的前五个人也都说不,那就更好了!
将机器学习与产品设计整合
假设您做这项工作的原因是希望它被用于某些目的。否则,您只是在浪费时间。因此,让我们假设您的工作最终会有所作为。现在,当您收集数据并开发模型时,您会做出许多决定。您将以什么级别的聚合存储数据?应该使用什么损失函数?应该使用什么验证和训练集?您应该专注于实现的简单性、推理的速度还是模型的准确性?您的模型如何处理域外数据项?它可以进行微调,还是必须随时间从头开始重新训练?
这些不仅仅是算法问题。它们是数据产品设计问题。但是产品经理、高管、法官、记者、医生——最终会开发和使用您的模型的系统的人——将无法理解您所做的决定,更不用说改变它们了。
例如,两项研究发现亚马逊的面部识别软件产生了不准确和种族偏见的结果。亚马逊声称研究人员应该更改默认参数,但没有解释这将如何改变有偏见的结果。此外,事实证明,亚马逊并没有指导使用其软件的警察部门这样做。可以想象,开发这些算法的研究人员和为警察提供指导的亚马逊文档人员之间存在很大的距离。
缺乏紧密整合导致社会、警察和亚马逊出现严重问题。结果表明,其系统错误地将 28 名国会议员与犯罪照片匹配!(而与犯罪照片错误匹配的国会议员是有色人种,如图 3-4 所示。)

图 3-4. 亚马逊软件将国会议员与犯罪照片匹配
数据科学家需要成为跨学科团队的一部分。研究人员需要与最终使用他们研究成果的人密切合作。更好的是,领域专家们自己可以学到足够的知识,以便能够自己训练和调试一些模型——希望你们中的一些人正在阅读这本书!
现代职场是一个非常专业化的地方。每个人都倾向于有明确定义的工作要做。特别是在大公司,很难知道所有的细节。有时公司甚至会故意模糊正在进行的整体项目目标,如果他们知道员工不会喜欢答案的话。有时通过尽可能地将部分隔离来实现这一点。
换句话说,我们并不是说这些都很容易。这很难。真的很难。我们都必须尽力而为。我们经常看到那些参与这些项目更高层次背景的人,试图发展跨学科能力和团队的人,成为他们组织中最重要和最受奖励的成员之一。这是一种工作,往往受到高级主管的高度赞赏,即使有时被中层管理人员认为相当不舒服。
数据伦理学主题
数据伦理学是一个广阔的领域,我们无法涵盖所有内容。相反,我们将选择一些我们认为特别相关的主题:
-
追索和问责制的需求
-
反馈循环
-
偏见
-
虚假信息
让我们依次看看每一个。
追索和问责制
在一个复杂的系统中,很容易没有任何一个人感到对结果负责。虽然这是可以理解的,但这并不会带来好的结果。在早期的阿肯色州医疗保健系统的例子中,一个错误导致患有脑瘫的人失去了所需护理的访问权限,算法的创建者责怪政府官员,政府官员责怪那些实施软件的人。纽约大学教授丹娜·博伊德描述了这种现象:“官僚主义经常被用来转移或逃避责任……今天的算法系统正在扩展官僚主义。”
追索如此必要的另一个原因是数据经常包含错误。审计和纠错机制至关重要。加利福尼亚执法官员维护的一个涉嫌帮派成员的数据库发现充满了错误,包括 42 名不到 1 岁的婴儿被添加到数据库中(其中 28 名被标记为“承认是帮派成员”)。在这种情况下,没有流程来纠正错误或在添加后删除人员。另一个例子是美国信用报告系统:2012 年联邦贸易委员会(FTC)对信用报告进行的大规模研究发现,26%的消费者的档案中至少有一个错误,5%的错误可能是灾难性的。
然而,纠正这类错误的过程非常缓慢和不透明。当公共广播记者鲍比·艾伦发现自己被错误列为有枪支罪时,他花了“十几个电话,一个县法院书记的手工操作和六周的时间来解决问题。而且这还是在我作为一名记者联系了公司的传播部门之后。”
作为机器学习从业者,我们并不总是认为理解我们的算法最终如何在实践中实施是我们的责任。但我们需要。
反馈循环
我们在第一章中解释了算法如何与环境互动以创建反馈循环,做出预测以加强在现实世界中采取的行动,从而导致更加明显朝着同一方向的预测。举个例子,让我们再次考虑 YouTube 的推荐系统。几年前,谷歌团队谈到他们如何引入了强化学习(与深度学习密切相关,但你的损失函数代表了潜在长时间后行动发生的结果)来改进 YouTube 的推荐系统。他们描述了如何使用一个算法,使推荐以优化观看时间为目标。
然而,人类往往被争议性内容所吸引。这意味着关于阴谋论之类的视频开始越来越多地被推荐给用户。此外,事实证明,对阴谋论感兴趣的人也是那些经常观看在线视频的人!因此,他们开始越来越多地被吸引到 YouTube。越来越多的阴谋论者在 YouTube 上观看视频导致算法推荐越来越多的阴谋论和其他极端内容,这导致更多的极端分子在 YouTube 上观看视频,更多的人在 YouTube 上形成极端观点,进而导致算法推荐更多的极端内容。系统失控了。
这种现象并不局限于这种特定类型的内容。2019 年 6 月,《纽约时报》发表了一篇关于 YouTube 推荐系统的文章,标题为“在 YouTube 的数字游乐场,对恋童癖者敞开大门”。文章以这个令人不安的故事开头:
当 Christiane C.的 10 岁女儿和一个朋友上传了一个在后院游泳池玩耍的视频时,她并没有在意……几天后……视频的观看次数已经达到了数千次。不久之后,观看次数已经增加到 40 万……“我再次看到视频,看到观看次数,我感到害怕,”Christiane 说。她有理由感到害怕。研究人员发现,YouTube 的自动推荐系统……开始向观看其他预备期、部分穿着少儿视频的用户展示这个视频。
单独看,每个视频可能是完全无辜的,比如一个孩子制作的家庭影片。任何暴露的画面都是短暂的,看起来是偶然的。但是,当它们被组合在一起时,它们共享的特征变得明显。
YouTube 的推荐算法开始为恋童癖者策划播放列表,挑选出偶然包含预备期、部分穿着少儿的无辜家庭视频。
谷歌没有计划创建一个将家庭视频变成儿童色情片的系统。那么发生了什么?
这里的问题之一是指标在推动一个财政重要系统中的核心性。当一个算法有一个要优化的指标时,正如你所看到的,它会尽其所能来优化这个数字。这往往会导致各种边缘情况,与系统互动的人类会寻找、发现并利用这些边缘情况和反馈循环以谋取利益。
有迹象表明,这正是发生在 YouTube 的推荐系统中的情况。卫报发表了一篇题为“一位前 YouTube 内部人员是如何调查其秘密算法的”的文章,讲述了前 YouTube 工程师 Guillaume Chaslot 创建了一个网站来跟踪这些问题。Chaslot 在罗伯特·穆勒“关于 2016 年总统选举中俄罗斯干预调查”的发布后发布了图表,如图 3-5 所示。

图 3-5. 穆勒报告的报道
俄罗斯今日电视台对穆勒报告的报道在推荐频道中是一个极端的离群值。这表明俄罗斯今日电视台,一个俄罗斯国有媒体机构,成功地操纵了 YouTube 的推荐算法。不幸的是,这种系统缺乏透明度,使我们很难揭示我们正在讨论的问题。
本书的一位审阅者 Aurélien Géron,曾在 2013 年至 2016 年间领导 YouTube 的视频分类团队(远在这里讨论的事件之前)。他指出,涉及人类的反馈循环不仅是一个问题。也可能存在没有人类参与的反馈循环!他向我们讲述了 YouTube 的一个例子:
对视频的主题进行分类的一个重要信号是视频的来源频道。例如,上传到烹饪频道的视频很可能是烹饪视频。但我们如何知道一个频道的主题是什么?嗯...部分是通过查看它包含的视频的主题!你看到循环了吗?例如,许多视频有描述,指示拍摄视频所使用的相机。因此,一些视频可能被分类为“摄影”视频。如果一个频道有这样一个错误分类的视频,它可能被分类为“摄影”频道,使得未来在该频道上的视频更有可能被错误分类为“摄影”。这甚至可能导致失控的病毒般的分类!打破这种反馈循环的一种方法是对有和没有频道信号的视频进行分类。然后在对频道进行分类时,只能使用没有频道信号获得的类别。这样,反馈循环就被打破了。
有人和组织试图解决这些问题的积极例子。Meetup 的首席机器学习工程师 Evan Estola 讨论了男性对科技见面会表现出比女性更感兴趣的例子。因此,考虑性别可能会导致 Meetup 的算法向女性推荐更少的科技见面会,结果导致更少的女性了解并参加科技见面会,这可能导致算法向女性推荐更少的科技见面会,如此循环反馈。因此,Evan 和他的团队做出了道德决定,让他们的推荐算法不会创建这样的反馈循环,明确不在模型的那部分使用性别。看到一家公司不仅仅是盲目地优化指标,而是考虑其影响是令人鼓舞的。根据 Evan 的说法,“你需要决定在算法中不使用哪个特征...最优算法也许不是最适合投入生产的算法。”
尽管 Meetup 选择避免这种结果,但 Facebook 提供了一个允许失控的反馈循环肆虐的例子。与 YouTube 类似,它倾向于通过向用户介绍更多阴谋论来激化用户。正如虚构信息传播研究员 Renee DiResta 所写的那样:
一旦人们加入一个阴谋论倾向的[Facebook]群组,他们就会被算法路由到其他大量群组。加入反疫苗群组,你的建议将包括反转基因、化学尾迹观察、地平论者(是的,真的)和“自然治愈癌症”群组。推荐引擎不是将用户拉出兔子洞,而是将他们推得更深。
非常重要的是要记住这种行为可能会发生,并在看到自己项目中出现第一个迹象时,要么预见到一个反馈循环,要么采取积极行动来打破它。另一件要记住的事情是偏见,正如我们在上一章中简要讨论的那样,它可能与反馈循环以非常麻烦的方式相互作用。
偏见
在线讨论偏见往往会变得非常混乱。 “偏见”一词有很多不同的含义。统计学家经常认为,当数据伦理学家谈论偏见时,他们在谈论统计学术语“偏见”,但他们并没有。他们当然也没有在谈论出现在模型参数中的权重和偏见中的偏见!
他们所谈论的是社会科学概念中的偏见。在“理解机器学习意外后果的框架”中,麻省理工学院的 Harini Suresh 和 John Guttag 描述了机器学习中的六种偏见类型,总结在图 3-6 中。

图 3-6。机器学习中的偏见可能来自多个来源(由 Harini Suresh 和 John V. Guttag 提供)
我们将讨论其中四种偏见类型,这些是我们在自己的工作中发现最有帮助的(有关其他类型的详细信息,请参阅论文)。
历史偏见
历史偏见源于人们的偏见,过程的偏见,以及社会的偏见。苏雷什和古塔格说:“历史偏见是数据生成过程的第一步存在的基本结构性问题,即使进行了完美的抽样和特征选择,它也可能存在。”
例如,以下是美国历史上种族偏见的几个例子,来自芝加哥大学 Sendhil Mullainathan 的《纽约时报》文章“种族偏见,即使我们有良好意图”:
-
当医生看到相同的档案时,他们更不可能向黑人患者推荐心脏导管化(一种有益的程序)。
-
在讨价还价购买二手车时,黑人被要求支付的初始价格高出 700 美元,并获得了远低于预期的让步。
-
在 Craigslist 上回应带有黑人姓名的公寓出租广告比带有白人姓名的回应要少。
-
一个全白人陪审团比一个黑人被告有 16 个百分点更有可能定罪,但当陪审团有一个黑人成员时,他们以相同的比率定罪。
在美国用于判决和保释决定的 COMPAS 算法是一个重要算法的例子,当ProPublica进行测试时,实际上显示出明显的种族偏见(图 3-7)。

图 3-7。COMPAS 算法的结果
任何涉及人类的数据集都可能存在这种偏见:医疗数据、销售数据、住房数据、政治数据等等。由于潜在偏见是如此普遍,数据集中的偏见也非常普遍。甚至在计算机视觉中也会出现种族偏见,正如 Twitter 上一位 Google 照片用户分享的自动分类照片的例子所示,见图 3-8。

图 3-8。其中一个标签是非常错误的...
是的,这正是你认为的:Google 照片将一位黑人用户的照片与她的朋友一起分类为“大猩猩”!这种算法错误引起了媒体的广泛关注。一位公司女发言人表示:“我们对此感到震惊和真诚地抱歉。自动图像标记仍然存在许多问题,我们正在研究如何防止将来发生这类错误。”
不幸的是,当输入数据存在问题时,修复机器学习系统中的问题是困难的。谷歌的第一次尝试并没有激发信心,正如卫报的报道所建议的那样(图 3-9)。

图 3-9。谷歌对问题的第一次回应
这些问题当然不仅限于谷歌。麻省理工学院的研究人员研究了最受欢迎的在线计算机视觉 API,以了解它们的准确性。但他们并不只是计算一个准确性数字,而是查看了四个组的准确性,如图 3-10 所示。

图 3-10。各种面部识别系统的性别和种族错误率
例如,IBM 的系统对较深肤色的女性有 34.7%的错误率,而对较浅肤色的男性只有 0.3%的错误率——错误率高出 100 多倍!一些人对这些实验的反应是错误的,他们声称差异仅仅是因为较深的皮肤更难被计算机识别。然而,事实是,由于这一结果带来的负面宣传,所有相关公司都大幅改进了他们对较深肤色的模型,以至于一年后,它们几乎和对较浅肤色的一样好。因此,这表明开发人员未能利用包含足够多较深肤色面孔的数据集,或者未能用较深肤色的面孔测试他们的产品。
麻省理工学院的一位研究人员 Joy Buolamwini 警告说:“我们已经进入了自信过度但准备不足的自动化时代。如果我们未能制定道德和包容性的人工智能,我们将冒着在机器中立的幌子下失去民权和性别平等所取得的成就的风险。”
问题的一部分似乎是流行数据集的构成存在系统性不平衡,用于训练模型。Shreya Shankar 等人的论文“没有代表性就没有分类:评估发展中国家开放数据集中的地理多样性问题”的摘要中指出,“我们分析了两个大型公开可用的图像数据集,以评估地理多样性,并发现这些数据集似乎存在明显的美洲中心和欧洲中心的代表性偏见。此外,我们分析了在这些数据集上训练的分类器,以评估这些训练分布的影响,并发现在不同地区的图像上表现出强烈的相对性能差异。”图 3-11 展示了论文中的一个图表,展示了当时(以及本书撰写时仍然如此)两个最重要的图像数据集的地理构成。

图 3-11。流行训练集中的图像来源
绝大多数图像来自美国和其他西方国家,导致在 ImageNet 上训练的模型在其他国家和文化的场景中表现更差。例如,研究发现这样的模型在识别低收入国家的家庭物品(如肥皂、香料、沙发或床)时表现更差。图 3-12 展示了 Facebook AI Research 的 Terrance DeVries 等人的论文“目标识别对每个人都有效吗?”中的一幅图像,说明了这一点。

图 3-12。目标检测的实际应用
在这个例子中,我们可以看到低收入肥皂的例子离准确还有很长的路要走,每个商业图像识别服务都预测“食物”是最可能的答案!
接下来我们将讨论,绝大多数人工智能研究人员和开发人员都是年轻的白人男性。我们看到的大多数项目都是使用产品开发团队的朋友和家人进行用户测试。鉴于此,我们刚刚讨论的问题不应该令人惊讶。
类似的历史偏见也存在于用作自然语言处理模型数据的文本中。这会在许多下游机器学习任务中出现。例如,据广泛报道,直到去年,Google 翻译在将土耳其中性代词“o”翻译成英语时显示了系统性偏见:当应用于通常与男性相关联的工作时,它使用“he”,而当应用于通常与女性相关联的工作时,它使用“she”(图 3-13)。

图 3-13。文本数据集中的性别偏见
我们也在在线广告中看到这种偏见。例如,2019 年穆罕默德·阿里等人的一项研究发现,即使放置广告的人没有故意歧视,Facebook 也会根据种族和性别向非常不同的受众展示广告。展示了同样文本但图片分别是白人家庭或黑人家庭的房屋广告被展示给了种族不同的受众。
测量偏见
在《“机器学习是否自动化了道德风险和错误”》一文中,Sendhil Mullainathan 和 Ziad Obermeyer 研究了一个模型,试图回答这个问题:使用历史电子健康记录(EHR)数据,哪些因素最能预测中风?这是该模型的前几个预测因素:
-
先前的中风
-
心血管疾病
-
意外伤害
-
良性乳腺肿块
-
结肠镜检查
-
鼻窦炎
然而,只有前两个与中风有关!根据我们迄今所学,你可能已经猜到原因。我们实际上并没有测量中风,中风是由于脑部某个区域由于血液供应中断而被剥夺氧气而发生的。我们测量的是谁有症状,去看医生,接受了适当的检查,并且被诊断出中风。实际上患中风不仅与这个完整列表相关联,还与那些会去看医生的人相关联(这受到谁能获得医疗保健、能否负担得起自付款、是否经历种族或性别歧视等影响)!如果你在发生意外伤害时可能会去看医生,那么在中风时你也可能会去看医生。
这是测量偏见的一个例子。当我们的模型因为测量错误、以错误方式测量或不恰当地将该测量纳入模型时,就会发生这种偏见。
聚合偏见
聚合偏见发生在模型未以包含所有适当因素的方式聚合数据,或者模型未包含必要的交互项、非线性等情况下。这在医疗环境中尤其常见。例如,糖尿病的治疗通常基于简单的单变量统计和涉及小组异质人群的研究。结果分析通常未考虑不同种族或性别。然而,事实证明糖尿病患者在不同种族之间有不同的并发症,HbA1c 水平(用于诊断和监测糖尿病的广泛指标)在不同种族和性别之间以复杂方式不同。这可能导致人们被误诊或错误治疗,因为医疗决策基于不包含这些重要变量和交互作用的模型。
表征偏见
Maria De-Arteaga 等人的论文“Bias in Bios: A Case Study of Semantic Representation Bias in a High-Stakes Setting”的摘要指出,职业中存在性别不平衡(例如,女性更有可能成为护士,男性更有可能成为牧师),并表示“性别之间的真正阳性率差异与职业中现有的性别不平衡相关,这可能会加剧这些不平衡。”
换句话说,研究人员注意到,预测职业的模型不仅反映了潜在人口中的实际性别不平衡,而且放大了它!这种表征偏差是相当常见的,特别是对于简单模型。当存在明显、容易看到的基本关系时,简单模型通常会假定这种关系始终存在。正如论文中的图 3-14 所示,对于女性比例较高的职业,模型往往会高估该职业的普遍性。

图 3-14。预测职业中的模型误差与该职业中女性比例的关系
例如,在训练数据集中,14.6%的外科医生是女性,然而在模型预测中,真正阳性中只有 11.6%是女性。因此,模型放大了训练集中存在的偏见。
既然我们已经看到这些偏见存在,我们可以采取什么措施来减轻它们呢?
解决不同类型的偏见
不同类型的偏见需要不同的缓解方法。虽然收集更多样化的数据集可以解决表征偏见,但这对历史偏见或测量偏见无济于事。所有数据集都包含偏见。没有完全无偏的数据集。该领域的许多研究人员一直在提出一系列建议,以便更好地记录决策、背景和有关特定数据集创建方式的细节,以及为什么在什么情况下使用它,以及其局限性。这样,使用特定数据集的人不会被其偏见和局限性所困扰。
我们经常听到这样的问题,“人类有偏见,那么算法偏见真的重要吗?”这个问题经常被提出,肯定有一些让提问者认为有道理的理由,但对我们来说似乎并不太合乎逻辑!独立于这是否合乎逻辑,重要的是要意识到算法(特别是机器学习算法!)和人类是不同的。考虑一下关于机器学习算法的这些观点:
机器学习可以创建反馈循环
少量偏见可能会因为反馈循环而迅速呈指数增长。
机器学习可能会放大偏见
人类偏见可能导致更多的机器学习偏见。
算法和人类的使用方式不同
在实践中,人类决策者和算法决策者并不是以插拔方式互换使用的。这些例子列在下一页的清单中。
技术就是力量
随之而来的是责任。
正如阿肯色州医疗保健的例子所示,机器学习通常在实践中实施并不是因为它能带来更好的结果,而是因为它更便宜和更高效。凯西·奥尼尔在她的书《数学毁灭的武器》(Crown)中描述了一个模式,即特权人士由人处理,而穷人由算法处理。这只是算法与人类决策者使用方式的许多方式之一。其他方式包括以下内容:
-
人们更有可能认为算法是客观或无误差的(即使他们有人类覆盖的选项)。
-
算法更有可能在没有上诉程序的情况下实施。
-
算法通常以规模使用。
-
算法系统成本低廉。
即使在没有偏见的情况下,算法(尤其是深度学习,因为它是一种如此有效和可扩展的算法)也可能导致负面社会问题,比如当用于虚假信息时。
虚假信息
虚假信息的历史可以追溯到数百甚至数千年前。它不一定是让某人相信错误的事情,而是经常用来播撒不和谐和不确定性,并让人们放弃寻求真相。收到矛盾的说法可能会导致人们认为他们永远无法知道该信任谁或什么。
有些人认为虚假信息主要是关于错误信息或假新闻,但实际上,虚假信息经常包含真相的种子,或者是脱离上下文的半真相。拉迪斯拉夫·比特曼是苏联的一名情报官员,后来叛逃到美国,并在 20 世纪 70 年代和 80 年代写了一些关于苏联宣传行动中虚假信息角色的书籍。在《克格勃和苏联虚假信息》(Pergamon)中,他写道“大多数活动都是精心设计的事实、半真相、夸大和故意谎言的混合物。”
在美国,近年来,FBI 详细描述了与 2016 年选举中的俄罗斯有关的大规模虚假信息活动。了解在这次活动中使用的虚假信息非常有教育意义。例如,FBI 发现俄罗斯的虚假信息活动经常组织两个独立的假“草根”抗议活动,一个支持某一方面,另一个支持另一方面,并让他们同时抗议!休斯顿纪事报报道了其中一个奇怪事件(图 3-15):
一个自称为“德克萨斯之心”的团体在社交媒体上组织了一场抗议活动,他们声称这是反对“德克萨斯伊斯兰化”的。在特拉维斯街的一边,我发现大约有 10 名抗议者。在另一边,我发现大约有 50 名反对抗议者。但我找不到集会的组织者。没有“德克萨斯之心”。我觉得这很奇怪,并在文章中提到:一个团体在自己的活动中缺席是什么样的团体?现在我知道为什么了。显然,集会的组织者当时在俄罗斯的圣彼得堡。“德克萨斯之心”是特别检察官罗伯特·穆勒最近指控试图干预美国总统选举的俄罗斯人中引用的一个互联网喷子团体。

图 3-15。由德克萨斯之心组织的活动
虚假信息通常涉及协调的不真实行为活动。例如,欺诈账户可能试图让人们认为许多人持有特定观点。虽然大多数人喜欢认为自己是独立思考的,但实际上我们进化为受到内部群体的影响,并与外部群体对立。在线讨论可能会影响我们的观点,或改变我们认为可接受观点的范围。人类是社会动物,作为社会动物,我们受周围人的影响极大。越来越多的极端化发生在在线环境中;因此影响来自虚拟空间中的在线论坛和社交网络中的人们。
通过自动生成的文本进行虚假信息传播是一个特别重要的问题,这是由于深度学习提供的大大增强的能力。当我们深入研究创建语言模型时,我们会深入讨论这个问题第十章。
一种提出的方法是开发某种形式的数字签名,以无缝方式实施它,并创建我们应该信任仅经过验证的内容的规范。艾伦人工智能研究所的负责人奥伦·艾齐奥尼在一篇题为“我们将如何防止基于人工智能的伪造?”的文章中写道:“人工智能正准备使高保真伪造变得廉价和自动化,可能会对民主、安全和社会造成灾难性后果。人工智能伪造的幽灵意味着我们需要采取行动,使数字签名成为验证数字内容的手段。”
虽然我们无法讨论深度学习和算法带来的所有伦理问题,但希望这个简短的介绍可以成为您的有用起点。现在我们将继续讨论如何识别伦理问题以及如何处理它们。
识别和解决伦理问题
错误是难免的。了解并处理错误需要成为包括机器学习在内的任何系统设计的一部分(还有许多其他系统)。数据伦理中提出的问题通常是复杂且跨学科的,但至关重要的是我们努力解决这些问题。
那么我们能做什么?这是一个重要的话题,但以下是一些解决伦理问题的步骤:
-
分析你正在进行的项目。
-
在您的公司实施流程以发现和解决伦理风险。
-
支持良好的政策。
-
增加多样性。
让我们逐步进行,从分析你正在进行的项目开始。
分析你正在进行的项目
在考虑工作的伦理影响时很容易忽略重要问题。一个极大的帮助是简单地提出正确的问题。Rachel Thomas 建议在数据项目的开发过程中考虑以下问题:
-
我们甚至应该这样做吗?
-
数据中存在什么偏见?
-
代码和数据可以进行审计吗?
-
不同子群体的错误率是多少?
-
基于简单规则的替代方案的准确性如何?
-
有哪些处理申诉或错误的流程?
-
构建它的团队有多少多样性?
这些问题可能有助于您识别未解决的问题,以及更容易理解和控制的可能替代方案。除了提出正确的问题外,考虑实施的实践和流程也很重要。
在这个阶段需要考虑的一件事是你正在收集和存储的数据。数据往往最终被用于不同于最初意图的目的。例如,IBM 在大屠杀之前就开始向纳粹德国出售产品,包括帮助纳粹德国进行的 1933 年人口普查,这次普查有效地识别出了比之前在德国被认可的犹太人更多。同样,美国人口普查数据被用来拘留二战期间的日裔美国人(他们是美国公民)。重要的是要认识到收集的数据和图像如何在以后被武器化。哥伦比亚大学教授蒂姆·吴写道:“你必须假设 Facebook 或 Android 保存的任何个人数据都是世界各国政府将试图获取或盗贼将试图窃取的数据。”
实施流程
马库拉中心发布了工程/设计实践的伦理工具包,其中包括在您的公司实施的具体实践,包括定期安排的扫描,以主动搜索伦理风险(类似于网络安全渗透测试),扩大伦理圈,包括各种利益相关者的观点,并考虑可怕的人(坏人如何滥用、窃取、误解、黑客、破坏或武器化您正在构建的东西?)。
即使您没有多样化的团队,您仍然可以尝试主动包括更广泛群体的观点,考虑这些问题(由马库拉中心提供):
-
我们是否只是假设了谁/哪些团体和个人的利益、愿望、技能、经验和价值观,而没有实际咨询?
-
谁将直接受到我们产品影响的所有利益相关者?他们的利益是如何得到保护的?我们如何知道他们的真正利益是什么——我们有没有询问过?
-
哪些团体和个人将受到重大影响而间接受到影响?
-
谁可能会使用这个产品,而我们没有预料到会使用它,或者出于我们最初没有打算的目的?
伦理镜头
马库拉中心的另一个有用资源是其技术和工程实践中的概念框架。这考虑了不同基础伦理镜头如何帮助识别具体问题,并列出以下方法和关键问题:
权利的观点
哪个选项最尊重所有利益相关者的权利?
正义的观点
哪个选项平等或成比例地对待人们?
功利主义的观点
哪个选项将产生最多的好处并造成最少的伤害?
共同利益的观点
哪个选项最好地服务于整个社区,而不仅仅是一些成员?
美德的观点
哪个选项会让我表现得像我想成为的那种人?
马库拉的建议包括更深入地探讨这些观点,包括通过后果的视角来审视一个项目:
-
谁将直接受到这个项目的影响?谁将间接受到影响?
-
总体上,这些影响可能会产生更多的好处还是伤害,以及什么类型的好处和伤害?
-
我们是否考虑了所有相关类型的伤害/好处(心理、政治、环境、道德、认知、情感、制度、文化)?
-
未来的后代可能会受到这个项目的影响吗?
-
这个项目可能会对社会中最弱势的人造成的伤害风险是否不成比例?好处是否会不成比例地给予富裕者?
-
我们是否充分考虑了“双重使用”和意外的下游影响?
另一种视角是义务论的视角,它侧重于对和错的基本概念:
-
我们必须尊重他人的哪些权利和对他人的义务?
-
这个项目可能会如何影响每个利益相关者的尊严和自主权?
-
信任和正义的考虑对这个设计/项目有何影响?
-
这个项目是否涉及与他人的冲突道德责任,或者与利益相关者的冲突权利?我们如何能够优先考虑这些?
帮助提出完整和周到的答案的最佳方法之一是确保提出问题的人是多样化的。
多样性的力量
根据Element AI 的一项研究,目前不到 12%的人工智能研究人员是女性。在种族和年龄方面的统计数据同样令人堪忧。当团队中的每个人背景相似时,他们很可能在道德风险方面有相似的盲点。哈佛商业评论(HBR)发表了许多研究,显示了多样化团队的许多好处,包括以下内容:
多样性可以导致问题更早地被识别,并考虑更广泛的解决方案。例如,Tracy Chou 是 Quora 的一名早期工程师。她描述了自己的经历,描述了她在内部为添加一个功能而进行倡导,该功能可以允许封锁恶意用户和其他不良行为者。Chou 回忆道,“我渴望参与这个功能的开发,因为我在网站上感到被挑衅和虐待(性别可能是一个原因)...但如果我没有那种个人视角,Quora 团队可能不会那么早地将构建封锁按钮作为优先事项。”骚扰经常会导致边缘群体的人离开在线平台,因此这种功能对于维护 Quora 社区的健康至关重要。
一个关键的方面要理解的是,女性离开科技行业的速度是男性的两倍以上。根据哈佛商业评论的数据,41%的从事科技行业的女性离开,而男性只有 17%。对 200 多本书籍、白皮书和文章的分析发现,她们离开的原因是“她们受到不公平对待;薪酬较低,不如男同事那样容易获得快速晋升,无法晋升。”
研究已经证实了一些使女性在职场中更难晋升的因素。女性在绩效评估中收到更多模糊的反馈和个性批评,而男性收到与业务结果相关的可操作建议(更有用)。女性经常被排除在更具创造性和创新性的角色之外,并且没有获得有助于晋升的高能见度的“拓展”任务。一项研究发现,即使阅读相同的脚本,男性的声音被认为比女性的声音更具有说服力、基于事实和逻辑。
统计数据显示,接受指导有助于男性晋升,但对女性没有帮助。背后的原因是,当女性接受指导时,这是关于她们应该如何改变和获得更多自我认识的建议。当男性接受指导时,这是对他们权威的公开认可。猜猜哪个对于晋升更有用?
只要合格的女性继续退出科技行业,教更多女孩编程并不能解决困扰该领域的多样性问题。多样性倡议往往主要关注白人女性,尽管有色人种女性面临许多额外障碍。在对从事 STEM 研究的 60 名有色人种女性进行的采访中,100%的人表示曾经遭受过歧视。
技术领域的招聘过程特别混乱。一项表明这种功能障碍的研究来自 Triplebyte,这是一家帮助将软件工程师安置到公司的公司,作为这一过程的一部分进行了标准化的技术面试。该公司拥有一个引人入胜的数据集:300 多名工程师在考试中的表现结果,以及这些工程师在各种公司的面试过程中的表现结果。Triplebyte 的研究中的第一个发现是,“每家公司寻找的程序员类型往往与公司的需求或业务无关。相反,它们反映了公司文化和创始人的背景。”
这对于试图进入深度学习领域的人来说是一个挑战,因为大多数公司的深度学习团队今天都是由学者创立的。这些团队往往寻找“像他们一样”的人——也就是说,能够解决复杂数学问题并理解密集行话的人。他们并不总是知道如何发现那些真正擅长使用深度学习解决实际问题的人。
这为那些愿意超越地位和门第,专注于结果的公司提供了一个巨大的机会!
公平、问责和透明度
计算机科学家的专业协会 ACM 举办了一个名为“公平性、问责制和透明度会议”的数据伦理会议(ACM FAccT),以前使用的缩写是 FAT,现在使用不那么有争议的 FAccT。微软也有一个专注于 AI 中的公平性、问责制、透明度和伦理的团队(FATE)。在本节中,我们将使用缩写 FAccT 来指代公平性、问责制和透明度的概念。
FAccT 是一些人用来考虑伦理问题的一种视角。一个有用的资源是 Solon Barocas 等人的免费在线书籍《公平性与机器学习:限制与机会》,该书“提供了一个将公平性视为中心问题而不是事后想法的机器学习视角”。然而,它也警告说,“它故意范围狭窄……机器学习伦理的狭窄框架可能会诱使技术人员和企业专注于技术干预,而回避有关权力和问责制的更深层次问题。我们警告不要陷入这种诱惑。”与提供 FAccT 伦理方法概述的重点不同(最好在像那样的书籍中完成),我们的重点将放在这种狭窄框架的局限性上。
考虑伦理视角是否完整的一个好方法是尝试提出一个例子,其中视角和我们自己的伦理直觉给出不同的结果。Os Keyes 等人在他们的论文中以图形方式探讨了这一点。该论文的摘要如下:
算法系统的伦理含义在人机交互和对技术设计、开发和政策感兴趣的更广泛社区中已经被广泛讨论。在本文中,我们探讨了一个著名的伦理框架——公平性、问责制和透明度——在一个旨在解决食品安全和人口老龄化等各种社会问题的算法中的应用。通过使用各种标准化的算法审计和评估形式,我们大大增加了算法对 FAT 框架的遵从,从而实现了更具伦理和善意的系统。我们讨论了这如何可以作为其他研究人员或从业者的指南,帮助他们确保在工作中的算法系统产生更好的伦理结果。
在本文中,相当有争议的提议(“将老年人变成高营养浆料”)和结果(“大大增加算法对 FAT 框架的遵从,从而实现更具伦理和善意的系统”)是相互矛盾的……至少可以这么说!
在哲学中,尤其是伦理哲学中,这是最有效的工具之一:首先,提出一个过程、定义、一组问题等,旨在解决问题。然后尝试提出一个例子,其中明显的解决方案导致一个没有人会认为可接受的提议。这可以进一步完善解决方案。
到目前为止,我们关注的是您和您的组织可以做的事情。但有时个人或组织的行动是不够的。有时政府也需要考虑政策影响。
政策的作用
我们经常与那些渴望技术或设计修复成为解决我们所讨论问题的全部解决方案的人交谈;例如,对数据进行去偏见的技术方法,或者制定技术不那么容易上瘾的设计指南。虽然这些措施可能有用,但它们不足以解决导致我们目前状态的根本问题。例如,只要创造上瘾的技术是有利可图的,公司将继续这样做,无论这是否会导致推广阴谋论并污染我们的信息生态系统。虽然个别设计师可能会尝试调整产品设计,但在基础利润激励措施改变之前,我们不会看到实质性的变化。
监管的有效性
要看看是什么导致公司采取具体行动,考虑 Facebook 的以下两个行为示例。2018 年,联合国调查发现 Facebook 在缅甸罗兴亚人持续种族灭绝中发挥了“决定性作用”,联合国秘书长安东尼奥·古特雷斯将罗兴亚人描述为“世界上最受歧视的人之一,如果不是最受歧视的人”。自 2013 年以来,当地活动人士一直在警告 Facebook 高管,称他们的平台被用来传播仇恨言论和煽动暴力。2015 年,他们被警告说,Facebook 可能在缅甸扮演与卢旺达种族灭绝期间广播电台扮演的相同角色(那里有一百万人被杀)。然而,到 2015 年底,Facebook 只雇用了四名会说缅甸语的承包商。正如一位知情人士所说,“这不是事后诸葛亮。这个问题的规模很大,而且已经显而易见。”扎克伯格在国会听证会上承诺雇佣“几十人”来解决缅甸的种族灭绝问题(2018 年,数年后种族灭绝已经开始,包括 2017 年 8 月之后至少摧毁了北拉钦邦至少 288 个村庄)。
这与 Facebook 迅速在德国雇佣了 1,200 人以避免根据德国新法律反对仇恨言论面临高达 5000 万欧元的昂贵罚款形成鲜明对比。显然,在这种情况下,Facebook 更多地是对财务处罚的威胁做出反应,而不是对一个种族少数群体的系统性破坏。
在一篇关于隐私问题的文章中,马切伊·塞格洛夫斯基与环境运动进行了类比:
这一监管项目在第一世界取得了如此成功,以至于我们可能忘记了之前的生活是什么样子。今天在雅加达和德里杀死成千上万人的浓烟曾经是伦敦的象征。俄亥俄州的奎哈霍加河曾经经常起火。在一个特别可怕的意外后果的例子中,添加到汽油中的四乙基铅导致全球暴力犯罪率上升了五十年。这些伤害都不能通过告诉人们用钱包投票,或者仔细审查他们给予业务的每家公司的环境政策,或者停止使用相关技术来解决。这需要跨越司法辖区的协调和有时高度技术化的监管来解决。在一些情况下,比如禁止商用制冷剂导致臭氧层消耗,这种监管需要全球共识。我们已经到了需要在隐私法中进行类似转变的时候。
权利和政策
清洁空气和清洁饮用水是几乎不可能通过个人市场决策来保护的公共物品,而是需要协调的监管行动。同样,许多技术误用的意外后果造成的伤害涉及公共物品,比如污染的信息环境或恶化的环境隐私。隐私往往被框定为个人权利,然而广泛监视会产生社会影响(即使有一些个人可以选择退出也是如此)。
我们在科技领域看到的许多问题都是人权问题,比如一个带有偏见的算法建议黑人被告应该获得更长的监禁,特定的工作广告只显示给年轻人,或者警察使用面部识别来识别抗议者。解决人权问题的适当场所通常是法律。
我们需要监管和法律变革,以及个人的道德行为。个人行为的改变无法解决不一致的利润激励、外部性(即企业在向更广泛社会转嫁成本和危害的同时获得巨额利润)或系统性失败。然而,法律永远不可能涵盖所有边缘案例,重要的是个人软件开发人员和数据科学家能够在实践中做出道德决策。
汽车:历史先例
我们面临的问题是复杂的,没有简单的解决方案。这可能令人沮丧,但我们在考虑历史上人们已经解决的其他重大挑战时找到了希望。一个例子是增加汽车安全的运动,被提及为“数据集数据表”一书中的案例研究,作者是 Timnit Gebru 等人,以及设计播客99% Invisible。早期汽车没有安全带,仪表盘上有金属旋钮,在事故中可能刺入人们的头颅,常规平板玻璃窗以危险的方式破碎,非可折叠转向柱刺穿驾驶员。然而,汽车公司甚至不愿讨论安全作为他们可以帮助解决的问题,普遍的看法是汽车就是它们的样子,是使用它们的人造成了问题。
消费者安全活动家和倡导者经过几十年的努力,改变了国家对汽车公司可能需要通过监管来解决一些责任的讨论。可折叠转向柱发明后,由于没有财务激励,几年内并未实施。主要汽车公司通用汽车公司雇佣了私家侦探,试图挖掘消费者安全倡导者拉尔夫·纳德的黑材料。安全带、碰撞测试假人和可折叠转向柱的要求是重大胜利。直到 2011 年,汽车公司才被要求开始使用代表普通女性的碰撞测试假人,而不仅仅是代表普通男性的身体;在此之前,女性在相同冲击下的车祸中受伤的可能性比男性高 40%。这是偏见、政策和技术产生重要后果的生动例证。
结论
从二进制逻辑的背景出发,伦理学中缺乏明确答案可能一开始会令人沮丧。然而,我们的工作如何影响世界,包括意外后果和工作被不良行为者武器化的影响,是我们可以(也应该!)考虑的最重要问题之一。尽管没有简单的答案,但有明确的陷阱要避免和实践要遵循,以朝着更具道德行为迈进。
许多人(包括我们!)正在寻找更令人满意、扎实的答案,以解决技术带来的有害影响。然而,考虑到我们面临的问题的复杂性、广泛性和跨学科性质,没有简单的解决方案。Julia Angwin,ProPublica 前资深记者,专注于算法偏见和监视问题(也是 2016 年调查 COMPAS 累犯算法的调查人员之一,该算法帮助引发了 FAccT 领域),在 2019 年的一次采访中表示:
我坚信,要解决问题,必须先诊断问题,而我们仍处于诊断阶段。如果您考虑到世纪之交和工业化,我们经历了,我不知道,30 年的童工、无限工作时间、糟糕的工作条件,需要大量记者揭发和倡导来诊断问题并对其有所了解,然后通过积极行动来改变法律。我觉得我们正处于数据信息的第二次工业化...我认为我的角色是尽可能清楚地表明问题的不利方面,并准确诊断问题,以便能够解决。这是艰苦的工作,需要更多的人来做。
令人欣慰的是,Angwin 认为我们在很大程度上仍处于诊断阶段:如果您对这些问题的理解感到不完整,那是正常和自然的。目前还没有“治疗”方法,但我们继续努力更好地理解和解决我们面临的问题是至关重要的。
我们这本书的一位审阅者 Fred Monroe 曾在对冲基金交易领域工作。他在阅读本章后告诉我们,这里讨论的许多问题(数据分布与模型训练不同、部署和扩展后反馈循环对模型的影响等)也是构建盈利交易模型的关键问题。考虑到社会后果所需做的事情将与考虑组织、市场和客户后果所需做的事情有很多重叠,因此认真思考伦理问题也可以帮助您认真思考如何使您的数据产品更普遍地成功!
问卷
-
伦理是否提供了“正确答案”清单?
-
在考虑伦理问题时,与不同背景的人合作如何有助于解决问题?
-
IBM 在纳粹德国的角色是什么?为什么公司会参与其中?为什么工人会参与其中?
-
第一个在大众柴油丑闻中被监禁的人的角色是什么?
-
加利福尼亚执法官员维护的涉嫌黑帮成员数据库存在什么问题?
-
为什么 YouTube 的推荐算法会向恋童癖者推荐部分裸露儿童的视频,尽管谷歌的员工没有编程这个功能?
-
指标的中心性存在哪些问题?
-
为什么 Meetup.com 在其技术见面会的推荐系统中没有包括性别?
-
根据 Suresh 和 Guttag,机器学习中有哪六种偏见类型?
-
在美国历史上,有哪两个种族偏见的例子?
-
ImageNet 中的大多数图像来自哪里?
-
在论文“机器学习是否自动化道德风险和错误?”中,为什么鼻窦炎被发现与中风有关?
-
代表性偏见是什么?
-
在决策方面,机器和人有何不同?
-
虚假信息和“假新闻”是一回事吗?
-
通过自动生成的文本传播虚假信息为什么是一个特别重要的问题?
-
马库拉中心描述的五种伦理视角是什么?
-
政策在解决数据伦理问题方面是否是一个合适的工具?
进一步研究
-
阅读文章“当算法削减您的医疗保健”(链接)。未来如何避免类似问题?
-
研究更多关于 YouTube 推荐系统及其社会影响的信息。你认为推荐系统是否必须始终具有带有负面结果的反馈循环?谷歌可以采取什么方法来避免这种情况?政府呢?
-
阅读论文“在线广告投放中的歧视”。你认为谷歌应该对 Sweeney 博士发生的事情负责吗?什么是一个合适的回应?
-
跨学科团队如何帮助避免负面后果?
-
阅读论文“机器学习是否自动化了道德风险和错误?” 你认为应该采取什么行动来处理这篇论文中指出的问题?
-
阅读文章“我们将如何防止基于 AI 的伪造?” 你认为 Etzioni 提出的方法能行得通吗?为什么?
-
完成部分“分析你正在进行的项目”。
-
考虑一下你的团队是否可以更多元化。如果可以,有哪些方法可能会有所帮助?
实践中的深度学习:总结!
恭喜!你已经完成了书的第一部分。在这一部分中,我们试图向你展示深度学习可以做什么,以及你如何使用它来创建真实的应用和产品。在这一点上,如果你花一些时间尝试你所学到的东西,你将从这本书中获得更多。也许你一直在学习的过程中已经在做这些事情了,如果是这样,太棒了!如果没有,也没关系——现在是开始自己尝试实验的好时机。
如果你还没有去过书的网站,现在就去吧。非常重要的是你要设置好自己来运行这些笔记本。成为一个有效的深度学习从业者就是要不断练习,所以你需要训练模型。所以,如果你还没有开始运行这些笔记本,请现在就去运行!并查看网站上的任何重要更新或通知;深度学习变化迅速,我们无法改变这本书中印刷的文字,所以你需要查看网站以确保你拥有最新的信息。
确保你已经完成了以下步骤:
-
连接到书网站上推荐的 GPU Jupyter 服务器之一。
-
自己运行第一个笔记本。
-
上传你在第一个笔记本中找到的图像;然后尝试一些不同类型的图像,看看会发生什么。
-
运行第二个笔记本,根据你提出的图像搜索查询收集你自己的数据集。
-
思考一下如何利用深度学习来帮助你自己的项目,包括你可以使用什么类型的数据,可能会遇到什么问题,以及你如何在实践中可能会减轻这些问题。
在书的下一部分,你将了解深度学习是如何以及为什么起作用的,而不仅仅是看到你如何在实践中使用它。了解如何以及为什么对从业者和研究人员都很重要,因为在这个相当新的领域中,几乎每个项目都需要一定程度的定制和调试。你对深度学习的基础理解越深入,你的模型就会越好。这些基础对于高管、产品经理等人来说不那么重要(尽管仍然有用,所以请继续阅读!),但对于任何正在训练和部署模型的人来说都是至关重要的。


浙公网安备 33010602011771号