面向孩子们的机器学习项目-全-

面向孩子们的机器学习项目(全)

原文:zh.annas-archive.org/md5/e26ef8c8d0b52e2485e3e4a7d548b597

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

Alphabet-I在本书中,你将使用一个名为 Machine Learning for Kids 的免费教育工具来构建 ML 项目。本章将介绍该工具的工作原理,你将如何在每个项目中使用它,以及你的父母或老师如何为你设置它。

你可以在MachineLearningForKids.co.uk/找到《Machine Learning for Kids》。这个网址很长,所以第一次访问时最好保存为书签。

主页如图 2-1 所示。(和所有网站一样,设计会随着时间略有变化,因此它可能看起来与此处所示略有不同。)

f02001

图 2-1:《Machine Learning for Kids》主页

登录

本书中每个项目的第一步是访问 Machine Learning for Kids 网站并登录。

点击顶部菜单栏中的登录。你将看到如图 2-2 所示的登录界面。

f02002

图 2-2: 《Machine Learning for Kids》登录页面

你有两个选择:

  1. 登录  如果你的父母或老师已经为你创建了免费账户,点击登录并输入你的用户名和密码。登录后,你可以保存你的项目,并在以后回来继续。

  2. 现在尝试  如果你还没有账户,点击现在尝试。你仍然可以进行项目,但仅限四个小时。这足以完成本书中的任何项目,但你无法稍后回来继续这些项目。**

注册按钮,在这里你的父母或老师为你创建一个免费的账户,具体内容请参见第 14 页的“创建账户”。

创建一个新的 ML 项目

登录后,你将进入你的项目列表,如图 2-3 所示。你可以随时通过点击顶部菜单栏中的“项目”来返回该列表。

f02003

图 2-3: 空的项目列表

要创建一个新项目,请按照以下步骤操作:

  1. 点击添加新项目(见图 2-3)。

  2. 在“项目名称”文本框中输入项目名称,如图 2-4 所示。

    书中的每一章都会建议项目名称,但如果你喜欢,也可以在这里输入不同的名称。

    f02004

    图 2-4: 创建一个新的 ML 项目

  3. 点击识别,如图 2-4 所示。你应该会看到一个下拉列表,列出了不同类型的 ML 项目(图 2-5)。在这里,你可以选择想要教计算机识别的类别(例如文本或图片)。书中的每个项目都会告诉你在这里选择哪个选项。f02005

    图 2-5: 选择 ML 项目的类型

  4. 点击创建

  5. 系统会带你返回项目列表,如图 2-6 所示。点击你刚创建的项目名称以开始。f02006

    图 2-6: 更新后的项目列表

机器学习项目的阶段

每个项目有三个主要阶段:训练、学习与测试和制作(见图 2-7)。

你可以通过点击蓝色按钮切换到每个阶段。项目说明会告诉你何时进入每个阶段。

f02007

图 2-7: 机器学习项目的阶段

训练

在训练阶段,你将收集计算机需要学习识别的示例。

你将为每个子类别创建一个桶,让计算机学习识别。每个桶都有一个灰色的边框,如图 2-8 所示。

f02008

图 2-8: 训练阶段

接下来,你将为每个桶填充示例。对于文本项目,这意味着收集属于每个子类别的写作示例。在图 2-8 中,桶包含了某些其他某些子类别的文本示例。(在实际项目中,对于文本子类别,你可能会添加赞美的示例,而对于文本子类别恶意,你可能会添加侮辱的示例。)对于图像项目,你将为每个桶填充说明该子类别的图片示例。对于声音项目,你将收集符合该子类别的声音录音示例。

每个桶右下角的数字是一个方便的计数器,显示你已收集的示例数量。

如果你不小心将一个示例添加到桶中并想将其删除,将鼠标指针移到该示例上,然后点击红色的 X。

如果你想删除整个桶,包括所有训练示例,将鼠标指针移到桶的右上角,然后点击红色的 X。请确保这样做,因为一旦删除桶,就无法恢复!

学习与测试

一旦你收集了足够的示例,你就可以开始用它们来训练一个机器学习模型了。(下一章将进一步讲解模型的内容。)

要开始训练过程,点击训练新的机器学习模型(见图 2-9)。

f02009

图 2-9: 训练模型

这个过程需要多长时间取决于项目的类型和你收集的示例数量。图像项目比文本项目需要更长时间(因为计算机理解图像比理解文本或数字要困难得多)。你的示例越多,训练时间就越长。有时,机器学习计算机服务器会很忙,可能需要稍长的时间。

训练过程可能需要 30 秒,也可能需要几分钟。请耐心等待!页面底部有一个小测验,可以在等待时尝试。

如果你没有收集足够的示例,你将看不到“训练新机器学习模型”按钮。请返回到训练阶段添加更多示例。

制作

一旦你拥有了机器学习模型,你就可以用它来创建项目。

你可以构建不同类型的项目,但本书中的所有项目都使用 Scratch 3。点击Scratch 3,如图 2-10 所示。

f02010

图 2-10: 创建机器学习项目

现在你准备好开始本书中的项目了!但请记住,如果你想使用“登录”选项(而不是“立即试用”),以便保存你的项目,你需要请一位成年人为你创建一个账户。让我们现在来看看如何操作。

创建账户

创建账户是免费的,只需要一次操作。共有 10 个步骤,注册过程最多可能需要 10 分钟。此部分涵盖了你的家长、教师或编程俱乐部领导需要遵循的说明。

  1. 点击注册(如图 2-2 所示)。

  2. 点击按钮确认你是家长、教师或编程俱乐部领导。

  3. 在“创建一个未管理的班级账户”下点击注册。这意味着你将负责你的账户并自行设置。

  4. 填写图 2-11 中显示的表格。选择一个用户名并输入一个可以联系到你的电子邮件地址。你还可以选择性地描述你打算如何使用这个网站。f02011

    图 2-11: 创建家长/教师账户

  5. 你将收到一封电子邮件,以验证你的电子邮件地址。在继续下一步之前,请点击电子邮件中的链接。

  6. 一旦使用家长/教师账户登录,你将可以访问图 2-12 中显示的管理页面。点击顶部菜单栏中的教师,进入管理页面。f02012

    图 2-12: 家长/教师界面

  7. 点击限制,查看你账户的默认限制。一些限制可以根据你的偏好进行修改。

  8. 点击API 密钥,输入来自 IBM Cloud 的代码,这些代码将为你的项目提供机器学习技术。你需要一个 Watson Assistant 的 API 密钥。

    要创建这些代码,你需要在 IBM Cloud 上创建一个免费账户。Watson Assistant 密钥代码无需收费。

    如果你不习惯面向软件开发者的网站,IBM Cloud 网站可能会让你感到有些困惑。machinelearningforkids.co.uk/apikeys-guide/上的逐步指南会详细解释该如何操作。**

*** 点击学生,为将进行本书项目的学生创建用户名。如果有多个学生将一起构建这些项目,你可以创建多个用户名。

学生无需使用真实姓名或提供任何联系信息。

学生的用户账户比教师的账户简单。学生不需要担心 IBM 的 API 密钥或任何其他技术细节。

如果他们忘记了密码,你可以在学生页面为他们重置密码。

+   点击**监督**查看学生创建的项目列表。

除非有很多学生同时在使用本书,否则你不太可能达到你所添加 API 密钥的限制。如果发生这种情况,你将能够看到哪些项目正在使用这些 API 密钥。**

**## 你学到了什么

《儿童机器学习》是你将在本书中使用的免费工具。该工具会引导你完成 ML 项目的主要阶段。项目说明将明确告诉你在每个阶段该做什么,以及何时进行下一阶段或返回上一个阶段。

如果你想保存你的项目,你需要让一个成年人为你创建一个账户。创建账户稍微有点复杂,可能需要大约 10 分钟,但这个过程是免费的,只需做一次,并且有详细的在线说明。****

第一章:分类动物照片

Alphabet-W我们都喜欢图片。每年我们拍摄超过一万亿张数字照片,这还不包括我们制作的其他类型的图片,如绘画和画作。

使用计算机对图片进行排序并帮助我们找到需要的图片,这叫做图像识别。为了创建一个图像识别系统,我们收集大量相同主题的图片。然后,我们使用这些图片来训练一个 ML模型,它能够识别这些图片的共同点,并利用这些信息来识别新的图片。

例如,如果我们想训练计算机识别小猫的照片,我们会收集大量小猫的照片。ML 系统通过这些照片学习小猫照片中常出现的形状、模式和颜色。然后,模型可以识别照片中是否有小猫。

人们每天都在使用图像识别技术。在线照片共享工具用它来帮助整理我们上传的照片。网站用它来描述照片的内容,帮助视力障碍的人即使看不见照片,也能知道照片里有什么。社交媒体网站用它来识别我们发布的照片中的朋友和家人的面孔。公司用它来跟踪他们的 logo 或产品何时出现在网上的照片中,以便了解他们在社交媒体上的讨论情况。更重要的是,医生用它来帮助识别患者扫描和照片中的医疗状况。医生需要记住许多不同的疾病症状和体征,因此图像识别系统可以帮助他们识别照片中的皮肤肿瘤或细胞显微照片中的癌症。

在本章中,你将通过训练一个 ML 模型来创建自己的图像识别系统,用于识别和自动分类动物照片。让我们开始吧!

构建你的项目

首先,选择两种你希望计算机识别的动物。对于本章,我选择了牛和羊,制作一个农场主题的 Scratch 项目(参见图 3-1)。你可以选择任何两种动物,只要你能轻松找到它们的许多照片。

f03001

图 3-1: 将动物照片分类成不同的组

训练你的模型

为了训练计算机识别你选择的两种动物的不同图片,你需要收集大量这些动物的图片,并利用这些图片来训练一个 ML 模型。

  1. 创建一个新的 ML 项目,输入动物分类器作为项目名称,并设置其学习识别图片。

  2. 点击训练,如图 3-2 所示。f03002

    图 3-2: 训练是 ML 项目的第一阶段。

  3. 点击添加新标签(参见图 3-3)。然后输入你选择的第一种动物的名称。f03003

    图 3-3: 点击添加新标签来创建一个新的训练示例桶。

  4. 在你的网页浏览器中打开第二个窗口(通常通过选择文件新建窗口),并将两个窗口并排放置,如图 3-4 所示。在第二个窗口中,搜索第一种动物的照片。在我的案例中,我搜索了牛的照片。f03004

    图 3-4: 将两个网页浏览器窗口并排放置。

  5. 从搜索窗口中拖动一张照片,放入你的第一种动物的训练桶中。你应该在训练桶中看到这张照片的缩略图,如图 3-5 所示。如果你没有看到它,尝试再次拖放该照片。f03005

    图 3-5: 将牛的照片放入我的训练桶

  6. 重复步骤 5,直到你拥有至少 10 张该动物的不同照片,如图 3-6 所示。f03006

    图 3-6: 我的用于识别牛的照片的训练数据

  7. 重复步骤 3 到 6,直到你为每种动物收集到至少 10 张不同的照片,如图 3-7 所示。f03007

    图 3-7: 我的农场主题项目的训练数据

  8. 点击屏幕左上角的返回项目

  9. 点击学习与测试(见图 3-8)。f03008

    图 3-8: 学习与测试是机器学习项目的第二个阶段。

  10. 点击训练新的机器学习模型(见图 3-9)。f03009

    图 3-9: 点击训练新的机器学习模型开始训练。

    计算机会使用你收集的示例学习每种动物照片的共同特征。这可能需要几分钟,但你可以在等待时继续使用第二个网页浏览器窗口进行下一个步骤。

准备你的项目

为了测试你的机器学习模型,你需要一些新的照片,这些照片没有用于训练。计算机会使用你从训练样本中学到的内容,尝试在这些新照片中识别你选择的两种动物。然后,你将创建一个 Scratch 项目来测试你的模型的表现。

  1. 搜索你选择的动物的更多照片,并将它们保存到你的计算机中。要保存照片,右键点击并选择保存图片另存图片为,如图 3-10 所示。f03010

    图 3-10: 将测试照片保存到计算机

  2. 确保每种动物至少有五张测试照片,如图 3-11 所示。f03011

    图 3-11: 我的牛和羊测试照片文件夹

  3. 点击屏幕左上角的返回项目

  4. 点击制作(见图 3-12)。f03012

    图 3-12: 制作是机器学习项目的第三个阶段。

  5. 点击 Scratch 3,然后点击 在 Scratch 3 中打开 以在新窗口中打开 Scratch。

    你应该会在工具箱中看到代表你 ML 模型的新模块,如 图 3-13 所示。

    f03013

    图 3-13: 新的模块将自动添加到你的 ML 项目中的 Scratch 工具箱。

  6. 为你的项目创建一个背景。

    在 Scratch 窗口的右下角,将鼠标指针移动到选择背景图标上,如 图 3-14 所示。

    f03014

    图 3-14: 我的农场背景,用于将牛和羊分成两组。

    这里有几种选择。如果你不喜欢绘画,可以点击 选择背景 来选择默认背景,或者点击 上传背景 来使用互联网中的图片。要为你的动物设计自己的背景,点击 绘画 并使用代码画布左侧的绘图和上色工具,在绘画编辑器中进行创作。

    无论你选择哪种选项,都要确保为每种动物类型在背景中添加清晰标记的区域。

    我选择了农场动物,所以我画了一个农场场景,并标注了“牛”和“羊”两个标志。你可以画一些与所选动物相匹配的东西。例如,如果你选择了狗和猫,可以画一个宠物店。如果你选择了狮子和大象,可以画一个动物园。

  7. 点击猫精灵,然后在屏幕左下角,将鼠标指针移动到选择服装图标上。点击 上传服装,如 图 3-15 所示。

**选择你在步骤 2 中保存的所有测试照片,一次性上传所有照片。f03015

图 3-15: 点击 **上传服装** 来添加你的测试照片。你可以从左侧的服装面板中删除猫的服装。

+   如果你漏掉了某些测试照片,点击 **上传服装** 再次上传,直到你上传了步骤 2 中的所有测试照片。

我们不需要 Scratch 猫的服装,所以你可以删除它们。在最左边的*服装面板*中(见 图 3-15),点击服装,然后点击右上角的垃圾桶图标删除它。

确保为同一个精灵上传服装,如 图 3-16 所示。不要将每张照片作为一个新精灵上传。

![f03016](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f03016.png)

图 3-16: 上传额外的服装到*同一个*精灵。

+   点击 **代码** 标签,复制 图 3-17 中显示的脚本。![f03017](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f03017.png)

图 3-17: 排序动物照片的示例代码*

*这段代码将遍历你所有的测试照片服装,利用你的 ML 模型识别动物并将其移到正确的区域。

  1. go to x: 10 y: -145 块 1 设置了每张照片的起始位置。这个脚本将从屏幕底部中间开始每张照片。调整这些坐标以适应你的背景的起始位置。

  2. recognise image 块 2 使用你的机器学习模型来识别照片。

  3. glide to x: pick random -200 to -50 y: pick random 50 to 150 块 3 将照片移动到屏幕左上角的随机位置。调整这些坐标,以使你的第一类动物的照片出现在背景上的位置。

  4. glide to x: pick random 70 to 210 y: pick random 50 to 150 块 4 将照片移动到屏幕右上角的随机位置。调整这些坐标,以使你的第二类动物的照片出现在背景上的位置。

  5. if my variable is < 145 中的数字指的是你有多少张测试照片。将这个值设置为你在第 2 步保存并在第 8 步上传的测试服装数量。我有 14 个服装在我的测试精灵中,所以我的脚本会处理 14 张测试照片。

测试你的模型

要测试你创建的模型,请点击左上角的绿色旗帜,正如图 3-18 所示。你的模型会将测试照片分类为两组动物。

计算你的模型将多少张照片移到正确的一侧。这是衡量你的项目如何将两种动物的照片分类的简单方法。

f03018

图 3-18: 识别照片并将其分类

如果你的模型出错很多,你可以尝试通过更多的训练样本来改进它。返回训练阶段,拖入更多每种动物的照片。然后回到学习与测试阶段,训练新的改进过的机器学习模型。再次运行你的 Scratch 脚本,看看新模型是否能更好地分类你的测试照片。

审查和改进你的项目

你已经成功训练了一个机器学习模型来识别动物的照片!这个项目并不是基于规则的。你没有描述不同动物的外观,也没有给计算机提供具体的识别指令。相反,你使用机器学习训练计算机去做这件事。这个方法叫做监督学习因为你通过准备训练样本集来监督这个过程,让计算机使用这些样本。

只要你的测试照片与训练照片相似,你的模型应该能正常工作。然而,如果你用与训练照片有所不同的图片来测试模型,你可能会得到不同的结果。

例如,我尝试将我 Scratch 项目中的服装替换为牛和羊的卡通插图,而不是照片。然后,我通过点击绿色旗帜重新运行了代码。正如你在图 3-19 中看到的,我的新模型错误很多。

f03019

图 3-19: 如果测试输入与训练输入不相似,机器学习模型会出错很多。

我得到这些结果是因为我的模型从训练照片中学到的模式对帮助它识别卡通画没有用。如果你希望计算机能够识别照片卡通画,你需要同时用这两者来训练它。

返回到训练阶段,并创建一个新的训练示例集,其中包括照片和卡通画,如图 3-20 所示。我在每个桶中收集了 10 张照片和 10 张卡通画示例。

f03020

图 3-20: 训练计算机识别照片和卡通画

然后返回到学习与测试阶段,使用你的新训练示例集训练一个新的机器学习模型。这个新示例集应该教会计算机识别照片和卡通画中的模式,这样它就能同时识别两者。图 3-21 展示了我的更新版机器学习模型的表现有多么出色。

f03021

图 3-21: 用混合照片和画作进行测试

如你所见,测试图像越接近计算机从中学习的训练图像,机器学习模型的表现就越好。

你还能做什么其他改进来提升你的模型?

你学到了什么

在本章中,你使用机器学习(ML)创建了一个图像识别系统,能够识别并分类动物图片。你学到了一些机器学习项目中的关键原则,比如通过增加训练图像数量来改进结果,并确保这些图像与计算机需要识别的图像相似。

你还学到了如何通过用测试图片测试图像识别系统来衡量它的表现,看看它能正确识别多少张。你亲自尝试过,通过在 Scratch 中创建一个项目来测试你的机器学习模型如何分类一组动物照片。

在下一章中,你将训练另一个图像识别系统,并用它制作一个游戏。你还将了解机器学习项目可能出错的一些方式。***

第二章:与计算机玩剪刀石头布

Alphabet-I在第三章中,你使用机器学习创建了一个图像识别系统,可以对动物照片进行分类。你学习了如何通过收集希望计算机识别的图片样本来创建图像识别系统。

在本章中,你将训练一个机器学习模型,识别在剪刀石头布游戏中你做出的不同手势(见图 4-1),然后编程让计算机与你对战。

f04001

图 4-1: 玩剪刀石头布

开始吧!

构建你的项目

对于这个项目,你将拍摄你的手部照片,因此你需要一个网络摄像头。

训练你的模型

  1. 创建一个新的机器学习项目,将其命名为Rock Paper Scissors,并设置为学习如何识别图像。

  2. 点击训练,如图 4-2 所示。f04002

    图 4-2: 训练是机器学习项目的第一阶段。

  3. 点击添加新标签以创建一个训练桶,并输入名称Rock。然后创建两个名为PaperScissors的训练桶,如图 4-3 所示。f04003

    图 4-3: 点击添加新标签以创建你的训练桶。

  4. 点击网络摄像头 ****在Rock桶中,并在你的网络摄像头前做出拳头动作,如图 4-4 所示。f04004

    图 4-4: 使用网络摄像头拍摄你的第一张训练照片。****

***** 当你准备好时,点击添加(见图 4-4)。一张拳头照片应该被添加到 Rock 桶中,如图 4-5 所示。f04005

图 4-5: 你的照片缩略图显示在训练桶中。

+   使用网络摄像头按钮,重复步骤 4 和 5,为“Paper”和“Scissors”训练桶拍摄照片。继续进行,直到在 Rock 桶中拍摄到 10 张拳头照片,在 Paper 桶中拍摄到 10 张平手照片,在 Scissors 桶中拍摄到 10 张两指照片,如图 4-6 所示。![f04006](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f04006.png)

图 4-6: 剪刀石头布的训练图像 *   点击屏幕左上角的**返回项目**。*   点击**学习与测试**,如图 4-7 所示。![f04007](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f04007.png)

图 4-7: 学习与测试是机器学习项目的第二阶段。

+   点击**训练新机器学习模型**,如图 4-8 所示。![f04008](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f04008.png)

图 4-8: 点击**训练新机器学习模型**开始训练模型。****

****你拍摄的示例照片将用于训练 ML 模型。计算机会学习每个文件夹中照片的共性,以便能够识别不同的手势形状。这个过程可能需要几分钟,但你可以在等待时继续进行下一个部分,开始准备你的游戏。

准备你的游戏

你将在 Scratch 中创建一个脚本,利用你的 ML 模型与电脑玩剪刀石头布。该脚本将使用你的摄像头拍摄你的手势照片,然后你的模型会识别出你手势的形状。

  1. 点击左上角的返回项目

  2. 点击制作

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开,以打开一个新的 Scratch 窗口。

    你应该会在工具箱中看到代表你的 ML 模型的新积木块,如图 4-9 所示。

  4. 在 Scratch 窗口的顶部,点击项目模板,如图 4-9 所示。

    这将让你访问各种示例和起始项目,应该能节省你的时间。

    f04009

    图 4-9: 从顶部菜单中打开项目模板

  5. 在项目模板列表中点击剪刀石头布。(你可以在搜索框中输入名称,或者点击图像项目以更快找到它。)

    这个模板给了你一个完整的、可工作的剪刀石头布游戏。接下来的步骤将向你展示如何将 ML 添加到 Scratch 项目中,但在开始之前,试着阅读代码,了解它是如何工作的。

  6. 点击角色,然后找到当绿旗被点击当我收到新动作脚本,如图 4-10 所示。f04010

    图 4-10: 找到要修改的脚本,位于角色中。

  7. 将代表你的剪刀石头布ML 训练文件夹的积木块拖入当绿旗被点击脚本中,如图 4-11 所示。f04011

    图 4-11: 更新当绿旗被点击脚本,添加你项目的相关积木块。

  8. 识别图像(标签)积木块拖入当我收到新动作脚本中,然后将服装图像积木块拖入该积木块中,如图 4-12 所示。f04012

    图 4-12: 更新当我收到新动作脚本,添加你项目的相关积木块。

测试你的游戏

现在是时候尝试你的项目了!

点击绿旗图标开始与电脑进行剪刀石头布的对战。

将你的手放在摄像头前,形成剪刀、石头或布的手势,然后按下键盘上的 P 键拍照。

计算机会从剪刀、石头和布中随机选择一个,并显示一个卡通图像表示其动作。它将使用你的 ML 模型根据你的手势识别你的动作,然后显示一条信息,说明谁赢了(参见图 4-13)。

f04013

图 4-13: 玩石头、剪刀、布

审查和改进你的项目

你已经训练了一个机器学习模型来识别三种不同手型的照片!试着实验一下,看看什么能让它表现得很好,什么会让它出错。

记住,机器学习模型并不是从了解“石头、剪刀、布”游戏或你不同手型的含义开始的。它只能从你拍摄的示例照片中的模式中学习。

假设你把所有的石头训练示例照片拍成你的手非常非常接近摄像头,看起来手非常大,而把所有的剪刀训练示例照片拍成你的手远远离开摄像头,看起来手非常小。计算机可能会假设这个大小模式很重要,并学会了大手意味着“石头”,小手意味着“剪刀”。这意味着它可以将任何大手的照片识别为“石头”,不管手型如何。

现在假设你把所有的石头训练示例照片都拍成你的手从左边进入,而所有的布训练示例照片都拍成你的手从右边进入,如图 4-14 所示。计算机可能会假设这个方向模式很重要,并学会了手朝右意味着“石头”,而手朝左意味着“布”。这意味着它可以将任何手型朝右的照片识别为“石头”。

f04014

图 4-14: 计算机可以从训练数据中的意外模式中学习。

我们只使用训练桶上的标签来帮助我们组织项目。计算机在寻找训练示例中的模式时并不会考虑这些标签。如果你隐藏了标签,并请一个朋友猜测图 4-14 中每组照片的共同点,他们可能会说:“这些手都是朝右的,而那些手都是朝左的。”机器学习模型的工作方式类似,它们也可能学会识别出误导性的模式。

照片的背景也可能产生类似的影响。我曾经帮助过一个学生,他在创建这个项目时偶然发现了这一点。他的脸出现在所有的石头和布的训练照片中,而在所有的剪刀训练照片中,他的脸和一位同学的脸都会出现。

当他在 Scratch 中测试他的项目时,似乎能很好地识别他的手型,直到我站在他旁边观看。当我站在他旁边时,无论他做什么手势,他的项目几乎总是认为他在做剪刀。

尽管他一开始没有意识到这一点,但他已经训练他的机器学习模型来识别照片中一人或两人的区别。它学会了将两个人的照片识别为“剪刀”。

如果你不希望这些误导性的模式影响你的机器学习模型,最好在你的训练示例中加入多样性。当你的训练照片包括大量不同的同一对象的照片时,项目会表现得最好。在拍摄岩石训练照片时,尽量从每个不同的角度和方向拍摄岩石的形状。拍一些近距离的大照片,也拍一些远距离的小照片。如果你能拍摄不同背景的照片,那就更好了。如果你的岩石训练示例之间唯一的共同点是拳头形状,那么计算机就会学会识别这个模式。

**我们将在第十四章学习更多关于如何混淆机器学习模型的内容,但现在请记住:如果每个训练桶中的照片之间只有一个共同点,那么机器学习模型将只会学会识别这个模式

你学到的内容

在这一章,你已经训练了另一个机器学习模型来识别照片。在第三章,你用它做了一个任务:整理照片。这一次,你用它来和计算机玩剪刀石头布游戏,让它识别你的手形。这两个项目展示了图像识别并且是它每天应用的好例子

你已经学到,训练计算机进行图像识别的基本方法是收集示例照片,而且你已经学到了避免训练数据中出现误导性模式的重要教训,这将有助于提高你的结果。

然而,计算机不仅能学会识别照片中的内容,在下一章你将看到机器学习模型可以学习的其他模式。*******

第三章:识别电影海报

Alphabet-I在过去的两章中,你收集了训练图像,创建了一个机器学习系统,通过学习识别训练图像中共同的颜色、形状和图案,从而识别某个物体的图片。

在这一章,你将使用相同的技术训练一个模型,识别图片的风格而不是其内容。例如,如果你将水彩画的样本放入一个训练桶,将钢笔画的样本放入另一个训练桶,你可以训练一个机器学习模型来识别一张图片是水彩画还是钢笔画。

这种技术在现实生活中最常见的例子就是搜索引擎。图像搜索引擎可以识别图像的视觉风格,允许你按类型(如剪贴画、线条图、照片等)筛选图像搜索结果。这些搜索引擎使用一个经过大量不同风格图像示例训练的机器学习模型,能够识别每个搜索结果的类型。

有些人使用机器学习系统来创造全新的图片。这涉及到训练计算机识别某种风格的艺术作品中的模式,然后让计算机利用它所学到的知识生成该风格的新艺术作品。2018 年,一个人工智能系统创作了一幅画,作为艺术作品拍卖,成交价超过了 40 万美元。

这种项目被称为计算创意并且已经被用来创造各种各样的东西。人工智能系统已经创作了新的音乐作品,甚至发明了食谱和菜肴。

在这一章,你将训练一个机器学习模型,该模型可以仅根据一幅艺术作品的图片来识别它的类型。

想一想某些电影类型的海报有哪些共同点。例如,惊悚片的海报通常有深色背景和大字体。浪漫片的海报通常有浅色背景和花哨的字体。科幻片的海报通常有飞船、星星、行星和黑色背景。

我们都学会了这些模式,往往没有意识到,以至于我们可以仅凭看到电影海报就识别出电影的类型(参见图 5-1)。

在这个项目中,你将训练计算机识别特定类型艺术作品的共同特征。例如,动作电影的海报是否有共同之处?赛车视频游戏的盒装艺术?说唱专辑的封面艺术?你将观察计算机是否能学习识别这些模式,从而仅凭一本书的封面或海报图片,就能识别其类型。

f05001

图 5-1: 机器学习模型可以学习识别电影类型。

让我们开始吧!

构建你的项目

选择一种可以按类型分组的艺术形式,并且有图形封面或海报来表示。

例如,你可以选择:

  • 书籍,通过书籍封面表示书籍,通过书籍封面表示书籍,通过书籍封面表示书籍,通过书籍封面表示书籍,通过书籍封面表示书籍,通过书籍封面表示

  • 电影,通过电影海报表示

  • 视频游戏,通过盒装艺术作品表示

  • 音乐专辑,通过专辑封面表示

你需要收集你所选择的艺术作品的图片,作为本项目的训练示例。寻找按类别分类的书籍、电影、游戏或专辑的网站。如果你选择了书籍,书店或图书馆的网站是很好的训练示例来源。如果你选择了音乐专辑或视频游戏,零售商网站也是不错的选择。

接下来,选择一些你希望训练计算机能够识别的类别。如果你选择的类别差异非常明显,那么训练计算机会更容易。例如,识别动作片和浪漫片的海报差异要比识别动作片和冒险片的海报差异容易。

对于本项目中的截图,我训练了一个机器学习模型来识别三种类型的电影——动作片、家庭片和剧情片——基于它们的电影海报。

一旦你选择了艺术类型和类别,就可以开始训练你的模型了。

训练你的模型

  1. 创建一个新的机器学习项目,命名为Judge a book by its cover,并设置为学习识别图片。

  2. 点击训练,如图 5-2 所示。f05002

    图 5-2: 训练是机器学习项目的第一阶段。

  3. 点击添加新标签,如图 5-3 所示,输入你的第一个类别名称。f05003

    图 5-3: 点击添加新标签为你的类别创建训练桶。

  4. 在你的网页浏览器中打开第二个窗口(通常通过选择文件新建窗口),并将两个窗口并排排列,如图 5-4 所示。在第二个窗口中,搜索与你的第一个类别匹配的图片。f05004

    图 5-4: 将你的两个网页浏览器窗口并排排列。

  5. 拖动一张图片(书籍封面、电影海报、游戏盒装或专辑封面)到你项目中的训练桶里,用于你的第一个类别。

    你应该会看到训练桶中的图片缩略图,如图 5-5 所示。如果没有看到,尝试再次拖放图片。

    f05005

    图 5-5: 我的第一个训练示例,用于识别动作片

  6. 重复步骤 5,直到你有至少 10 个该类别的作品示例,如图 5-6 所示。f05006

    图 5-6: 动作片海报的训练示例

  7. 对您希望您的模型能够识别的所有类别,重复步骤 3 到 6,如图 5-7 所示。

    尝试为每个类别收集类似数量的示例。换句话说,避免在一个类别中有大量示例,而在另一个类别中几乎没有。

    f05007

    图 5-7: 用于识别不同类型电影海报的训练示例

  8. 点击屏幕左上角的返回项目

  9. 点击学习与测试,如图 5-8 所示。f05008

    图 5-8: 学习与测试是 ML 项目的第二阶段。

  10. 点击训练新机器学习模型,如图 5-9 所示。f05009

    图 5-9: 点击训练新机器学习模型以开始训练过程。

计算机将使用您收集的示例,寻找不同类别封面或海报中的模式。训练模型可能需要几分钟时间,具体取决于您收集的示例数量,但您可以在等待时切换到第二个浏览器窗口继续项目的下一步。

准备您的模型

您需要测试您的 ML 模型是否能够识别它之前未见过的图片中的某个类型。为了测试模型,您需要保存一些未用于训练的新图片,并创建一个 Scratch 脚本来用这些图片测试您的模型。

  1. 搜索您选择的每个类别的更多图片并将其保存到计算机中。要保存照片,右键点击图像并选择保存图片图片另存为,如图 5-10 所示。xf05010

    图 5-10: 将测试照片保存到您的计算机

    将这些测试照片保存在计算机上的一个文件夹中,如图 5-11 所示。保存的照片越多,您可以用来测试您的 ML 模型的图片也就越多。

    f05011

    图 5-11: 准备测试照片

  2. 点击屏幕左上角的返回项目

  3. 点击创建,如图 5-12 所示。f05012

    图 5-12: 创建是 ML 项目的第三阶段。

  4. 点击Scratch 3,然后点击在 Scratch 3 中打开以打开一个新的 Scratch 窗口。

  5. 点击屏幕右下角精灵窗格中的猫精灵(Sprite1)。然后,点击左上角的服装标签。

将鼠标指针移动到屏幕左下角的“选择服装”图标上。点击上传服装,然后找到您在计算机上保存下载的测试图片的文件夹。选择您在第 1 步保存的所有测试照片,将它们作为猫精灵的服装一次性上传。 更改*猫精灵的名字Sprite1**,通过在精灵文本框中输入test images,如图 5-13 所示。f05013

图 5-13: 创建一个精灵来存放测试图片。* **你需要一些按钮精灵来为你的 Scratch 项目使用。将鼠标指针移动到右下角的选择精灵图标上。  

要绘制自己的按钮,点击**绘画**以访问绘图和着色工具。如果在绘图时犯了错误,不用担心——只需点击服装名称旁边的蓝色撤销箭头。  

如果你不喜欢绘图,点击**选择精灵**,从 Scratch 精灵库中选择一个,如图 5-14 所示。  

为每个类型创建一个按钮。  

![f05014](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05014.png)  

图 5-14: 通过点击**选择精灵**访问精灵库。  

+   将你的按钮精灵重命名为与类型相匹配,如图 5-15 所示。我将我的三个按钮命名为动作、家庭和剧情。![f05015](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05015.png)  

图 5-15: 为每个类型创建按钮。* 点击**服装**标签,并选择文本工具(看起来像一个 T)为按钮添加标签。使用填充工具选择标签颜色。使你的标签与类型名称匹配,如图 5-16 所示。* 接下来,你将创建三个变量。点击**代码**标签,点击工具箱中的**变量**,然后点击**创建变量**,如图 5-17 所示。![f05016](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05016.png)  

图 5-16: 我使用文本和填充工具为每个按钮添加了白色标签。

其中两个变量用于计算你同意或不同意计算机决策的次数。将第一个变量命名为`agree`,第二个变量命名为`disagree`。  

第三个变量存储计算机为最新图片选择的类型。将此变量命名为`computer`。  

![f05017](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05017.png)  

图 5-17: 点击**创建变量**以创建项目的三个变量。* 确保`agree`和`disagree`变量旁边的复选框已选中。这将它们显示在舞台上,以便在测试项目时查看分数。取消选中**computer**变量旁的框。* 点击**测试图片**精灵(该精灵的服装是你的测试图片)。* 复制图 5-18 所示的脚本。  

在`switch costume`积木中,使用下拉箭头将服装设置为你的第一张测试图片(在图 5-18 中,我的第一张测试图片叫做*image001*)。  

![f05018](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05018.png)  

图 5-18: 识别电影海报的代码  

+   点击你第一个类型按钮精灵,如图 5-19 所示。![f05019](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05019.png)  

图 5-19: 类型按钮 * 复制图 5-20 所示的脚本,将`action`积木更改为与你的第一个类型按钮的标签匹配。![f05020](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05020.png)  

图 5-20: 第一个类型按钮的代码  

当用户点击按钮时,计算机会使用这段代码来猜测类型。如果用户的选择与模型识别的结果匹配,`agree`计数将增加 1。如果不匹配,`disagree`计数则会增加。

+   点击下一个类型按钮的精灵,并复制步骤 17 中的脚本,如图 5-21 所示。如前所述,将类型与按钮上的标签匹配。对于我的项目,第二个按钮是家庭电影类型的按钮。![f05021](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05021.png)

图 5-21: 第二个类型按钮的代码 *   重复步骤 17,直到你的所有类型按钮都复制了脚本,如图 5-22 所示。![f05022](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f05022.png)

图 5-22: 每个类型按钮都需要一个脚本副本。**

**现在是测试你的机器学习项目的时候了!

测试你的模型

尝试找其他人来测试你的机器学习项目,因为最好是测试项目的人没有看到你下载的测试图片。

一旦他们点击绿色旗帜,Scratch 将展示每张测试图片,并要求他们判断认为该艺术作品属于哪个类型。你的 Scratch 代码将记录他们与机器学习模型一致和不一致的次数,如图 5-23 所示。

f05023

图 5-23: 测试你的机器学习模型

要求测试你项目的人员通过图片来决定点击什么,即使他们已经认出这件艺术作品并且知道一些关于它的信息。

审查并改进你的项目

在这个项目中,你训练了一个机器学习模型来识别不同类型的图像中常见的视觉风格。

如果你的机器学习模型表现不佳,意见不合的次数远远多于一致的次数,试着在训练阶段向你的训练数据桶中添加更多的例子,然后在学习与测试阶段用这些新例子重新训练机器学习模型。通常来说,机器学习模型从更多的训练例子中学习,结果会更好。

你学到了什么

在本章中,你训练了另一个机器学习模型来识别图片。在前两章中,你训练了图像识别系统来识别图片中的物体。这一次,你用一个模型来识别图片的风格,而不是内容。

你也看到,我们常用的一种方法来衡量机器学习系统的效果是将它给出的测试问题答案与人们给出的答案进行比较。

在下一章,你将学习另一个有用的图像识别应用:手写识别。***

第四章:邮件分类

Alphabet-I在过去几章中,您一直在训练计算机识别图像。如果计算机知道如何看,便有许多有用的工作可以帮助我们完成。一个这样的工作是光学字符识别 (OCR),即计算机在看到大量该字符的例子后,能够识别字母或数字的图片。

一台经过训练的计算机可以读取报纸和书籍中的印刷文字。

当与文本转语音系统结合时,可以大声朗读识别出的文字,OCR 可帮助视力障碍者阅读他们可能无法自己看到的文本。

历史学家、图书馆员和档案管理员使用 OCR 来研究历史书籍和印刷文献。机器学习使得通过几百年前的出版物进行搜索成为可能,因为 OCR 可以识别单词。

在我们的道路上,OCR 系统识别车牌上的字母和数字。自动车牌识别 (ANPR) 用于通过实现快速高效的收费系统来保持交通流畅,并通过识别车辆通过检查点时的速度来提高道路安全性。

商业用 OCR 帮助处理表格和文档。如果您填写表格或写支票,机器学习系统通常会使用 OCR 自动识别您写的内容。

如果您曾经出国旅行,您可能使用过翻译应用。您可以将智能手机对准外语的标牌或菜单,手机会将其翻译成您自己的语言。OCR 用于识别图片中的单词和字母。

OCR 的一个常见应用是帮助分类邮件,这也是我们在本章中要做的事情。您将训练一台计算机识别手写内容,并看看 OCR 如何快速地对信件进行分类。您将在 Scratch 中创建一个邮件分类办公室,可以通过识别信封上写的邮政编码来自动分类信件(参见图 6-1)。

让我们开始吧!

f06001

图 6-1: 通过识别邮政编码来排序信件

构建您的项目

首先,选择您希望排序办公室能够识别信件的三个大城市。

对于我的截图,我选择了英国的三个城市:爱丁堡、牛津和南安普敦。

接下来,您需要选择一些可以用来识别这些城市的代码。在我所在的英国,这些被称为邮政编码。(在美国,它们被称为 ZIP 码。)为了加快这个项目的进度,我使用了每个邮政编码的前几个字母。

对于我的项目,我使用了:

  • EH 作为爱丁堡地址的邮政编码

  • OX 作为牛津地址的邮政编码

  • SO 作为南安普敦地址的邮政编码

如果您在美国,您可以使用州的邮政缩写来代替邮政编码。例如,您可以使用 TX 代表达拉斯的地址,或 MA 代表波士顿的地址。

选择三个城市,并为它们选择三个不同的短编码来代表它们。

训练你的模型

为了训练计算机识别你选择的邮政编码,你需要绘制这些编码的示例,并用它们来训练机器学习模型。

  1. 创建一个新的机器学习项目,命名为Sorting office,并设置它学习识别图像。

  2. 点击训练,如图 6-2 所示。f06002

    图 6-2: 训练是机器学习项目的第一阶段。

  3. 点击添加新标签,如图 6-3 所示。然后输入你第一个城市的名称。f06003

    图 6-3: 点击添加新标签来为你的城市创建训练桶。

  4. 点击你城市训练桶底部的绘图,如图 6-4 所示。

    在弹出的窗口中,在框内绘制你想要训练计算机识别的编码。

    完成绘制后,点击添加

    f06004

    图 6-4: 点击绘图来添加新示例。

  5. 重复第 4 步,直到你为第一个城市绘制了至少 10 个手写编码示例,如图 6-5 所示。f06005

    图 6-5: 识别爱丁堡邮政编码的训练示例

  6. 对接下来的两个城市重复步骤 3 到 5,直到每个城市的邮政编码都有至少 10 个示例,如图 6-6 所示。f06006

    图 6-6: 三个城市的邮政编码训练示例

  7. 点击屏幕左上角的返回项目

  8. 点击学习与测试,如图 6-7 所示。f06007

    图 6-7: 学习与测试是机器学习项目的第二阶段。

  9. 点击训练新机器学习模型,如图 6-8 所示。

    计算机将使用你绘制的示例学习如何识别不同城市的编码。由于你所有的示例都是用相同的“笔”并且用相同的颜色绘制的,计算机可能最擅长识别这样写的编码。

    训练过程可能需要几分钟。

    f06008

    图 6-8: 训练一个新的机器学习模型来识别邮政编码。

  10. 现在是测试你的机器学习模型的时候了!在之前的项目中,你是通过直接进入 Scratch,看看计算机如何识别并整理你从互联网下载或用网络摄像头拍摄的照片来进行测试的。这一次,我们将在这里先测试我们的模型,确保它符合我们的要求,然后再去 Scratch。

    通过点击通过绘图测试来测试你的机器学习模型,如图 6-9 所示。尝试为你的城市写编码,看看计算机识别你写的内容的准确度如何。

    f06009

    图 6-9: 测试是机器学习项目中的重要环节。

    如果你没有看到“通过绘图测试”按钮,说明你的机器学习模型尚未完成训练。你可能需要再等一分钟或两分钟。

    如果你对你的机器学习模型识别邮政编码的效果不满意,可以返回训练阶段并添加更多示例。通常,你使用的训练示例越多,机器学习模型的表现就会越好。记得再次点击训练新机器学习模型,以便用新的示例更新你的机器学习模型。

准备你的项目

现在你将通过在 Scratch 中创建一个虚拟的邮件分拣办公室,进一步测试你的机器学习模型,该分拣办公室使用你的 OCR 系统来分拣信封。

  1. 点击屏幕左上角的返回项目

  2. 点击制作,如图 6-10 所示。f06010

    图 6-10:制作是机器学习项目的第三阶段。

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开以在新窗口中打开 Scratch。你应该能在工具箱中看到一个新部分,如图 6-11 所示,其中包含来自你的排序办公室项目的积木。f06011

    图 6-11:带有你的机器学习模型积木的 Scratch 3

  4. 在 Scratch 窗口顶部,点击项目模板,如图 6-12 所示。

    这让你可以访问示例项目和启动代码,帮助你节省时间。

    f06012

    图 6-12:点击顶部菜单中的项目模板

  5. 点击排序办公室模板,如图 6-13 所示。f06013

    图 6-13:排序办公室项目模板

  6. 点击舞台背景,如图 6-14 所示。f06014

    图 6-14:点击舞台背景,进入排序办公室项目。

  7. 点击背景标签,如图 6-15 所示。

  8. 使用文本工具编辑邮件袋上的标签。编辑所有三个袋子,使它们的标签与所选城市的名称匹配。如果城市的完整名称无法容纳,你可以只使用邮政编码。f06015

    图 6-15:编辑邮件袋的标签,使它们与你选择的城市相匹配。

  9. 点击邮政编码精灵,然后点击服装标签,如图 6-16 所示。f06016

    图 6-16:你将在精灵列表中找到邮政编码精灵。

  10. 使用画笔工具在画布上写下其中一个城市的字母。

    如果你将线条风格与之前写的训练示例匹配,效果会更好,因此请将填充设置为黑色,并将线条宽度设置为大约20,如图 6-17 所示。

    f06017

    图 6-17:设置画笔工具以匹配你的训练示例。

  11. 完成后,点击左下角的绘画按钮,添加一个新服装,如图 6-18 所示。f06018

    图 6-18: 点击绘画按钮,向邮政代码精灵添加新服装。

  12. 重复步骤 10 和 11,直到你在邮政代码精灵中有多个服装。像图 6-19 所示那样多次绘制每个城市的代码。

    如果在绘制时犯了错误,不用担心——只需点击服装名称旁边的蓝色撤销箭头。

    f06019

    图 6-19: 在邮政代码精灵中绘制多个测试服装。

  13. 点击代码选项卡并找到when Green Flag clicked脚本,如图 6-20 所示。

    你可能需要滚动一下才能找到这个脚本。它应该位于代码区域的左上角。

    f06020

    图 6-20: 在邮政代码精灵中找到when Green Flag clicked脚本。

  14. 将包含城市名称的积木拖入when Green Flag clicked脚本中,如图 6-21 所示。

    在代码区域中有不止一个when Green Flag clicked脚本,因此请滚动查找看起来像图 6-21 中脚本的那个。

    重要的是,你要确保与背景中邮袋上的名称匹配顺序。左边的袋子是destination1,中间的袋子是destination2,右边的袋子是destination3

    f06021

    图 6-21: 确定你项目中城市的名称。

  15. 在代码区域中找到recognise postcode脚本,它应该紧接在前一步的when Green Flag clicked脚本下方,仍然在邮政代码精灵上。

  16. recognise image (label)积木拖入recognise postcode脚本中,然后将costume image积木拖入recognise image (label)积木中,如图 6-22 所示。f06022

    图 6-22: 用于识别信封上邮政编码的脚本

测试你的项目

现在是时候尝试排序一些信件了!

点击绿旗图标,观看你的机器学习模型运行。

屏幕顶部的传送带将开始运行,你写下的邮政编码信件将开始滚动,像图 6-23 所示。

f06023

图 6-23: 传送带上的测试信封

当信封在机器学习模型试图识别你写的内容时,它会放大。

一旦它识别了你的图片,脚本将把信封发送到相应的邮袋,像图 6-24 所示。

f06024

图 6-24: 识别邮政编码的测试结果

回顾并改进你的项目

你已经训练了一个机器学习模型来识别信封上的手写文字,并且你在 Scratch 中创建了一个使用 OCR 自动排序信件的项目!

你能如何改进你的项目?

尝试让别人来测试你的项目。它能识别他们的手写字吗?如果模型在识别他们的手写字时出现很多错误,请让他们在训练阶段向你的训练数据桶中添加一些示例。(确保在学习与测试阶段重新训练一个新的机器学习模型,这样计算机才能从你们两个的示例中学习。)

你用来训练计算机的示例种类越多,机器学习模型在识别不同手写风格时的效果就越好。

你还可以做些什么来改进你的项目?

你学到了什么

排序邮件是光学字符识别的一个常见应用。全球各地的大型邮件处理中心使用 OCR 系统在瞬间识别和排序信件。你的项目刚刚识别了一个邮政编码,但现实中的多行光学字符识别仪器可以识别多行地址。基本原理非常相似,它有助于大规模邮件排序的高效性和实用性。

到目前为止,你的所有项目都使用了图像,但计算机也可以训练来识别许多不同类型的数据。在下一章,你将训练一个机器学习模型来识别文本!

第五章:侮辱计算机

Alphabet-I 在本章中,我们将探讨如何训练计算机识别书面文本中的不同语气和情感,这种技术称为情感分析

想象你需要写几句话,说明你明天要去动物园。

想想,如果你对去动物园感到非常开心和兴奋,你会写什么?你喜欢动物园,迫不及待想去。你会使用什么样的词汇?你的兴奋会影响你写句子的方式吗?

现在想想,如果你因为不得不去而生气时会写什么。你讨厌动物园,明天有其他事情你更想做,而且你很生气有人让你去。那这种情绪会如何体现在你的写作中?你的烦恼是否会让你使用和你高兴时不同的词汇?你会以不同的方式表达句子吗?

这两段文字的基本含义相同(即你明天要去动物园),但它们的语气和情感会有所不同。计算机可以通过训练来识别我们在烦恼时和高兴时写作方式中的模式。通过足够多的情感和情绪示例文本,你可以训练一个机器学习模型,根据计算机学习识别的词汇和语法模式,识别新写作中的情感或语气。

经过训练的机器学习系统可以识别文本中的情感和情绪,用于了解人们对事物的感受。例如,企业利用情感分析来了解人们对其产品或服务的看法,方法是将他们的机器学习模型指向数百万篇博客、论坛、新闻组和社交媒体帖子——这是他们自己无法阅读的数量。情感分析可以告诉他们反馈中有多少看起来是正面的,多少看起来是负面的,以及最常见的投诉和批评是什么。

情感分析不仅仅应用于互联网上大量的文本。公司通常会利用它来帮助分类和优先处理客户支持信件和电子邮件,首先回复那些看起来最生气或最烦恼的信件和邮件。

类似地,公司也会在内部讨论中使用情感分析,作为估算员工幸福感的方式,并看看是否有需要关注的问题或顾虑。

在本章中,你将训练一个机器学习模型,来识别两种不同类型文本所表达的情感:赞美和侮辱。

构建你的项目

在这个项目中,你将创建一个角色,它会对你输入的消息做出反应(见图 7-1)。如果你给角色一个赞美,它会显得很开心。如果你侮辱它,它会显得很伤心。

f07001

图 7-1: 识别赞美和侮辱

准备你的游戏

首先,开始设计你的角色。对于我的截图,我绘制了一个简单的面孔。你可以画任何你喜欢的,只要能够看出它是开心还是难过。你可以画一个动物、机器人、外星人,或者任何你能想到的东西。

  1. 访问 machinelearningforkids.co.uk/scratch3/ 开始一个新的 Scratch 项目。

  2. 点击服装标签,如图 7-2 所示。f07002

    图 7-2: 在服装标签中设计角色

  3. 将鼠标指针移到屏幕左下角的猫脸图标上,查看添加服装的选项,如图 7-3 所示。f07003

    图 7-3: 添加新服装

    如果你想绘制自己的角色,点击绘画。对于我的截图,我通过绘制几个彩色圆圈并加上一些头发,画了一个简单的绿色外星人角色(见图 7-4)。

    如果你不想自己绘制角色,可以选择其他几种方式。如果你的电脑有摄像头,并且想使用你的面部照片,点击相机。或者,如果你想使用已保存的图片(例如从互联网下载的图片),点击上传服装。如果你想从 Scratch 服装库中选择一个服装,点击选择服装

    无论你选择哪种方式,完成此步骤后,你应该能够在画布上看到角色。

    f07004

    图 7-4: 绘制你的角色

  4. 在服装面板中右击角色服装,点击复制,如图 7-5 所示。你需要三个副本。f07005

    图 7-5: 复制服装

  5. 通过点击服装面板中的角色服装,然后在画布上方的服装文本框中输入新名称来重命名每个角色副本,如图 7-6 所示。分别命名为waitingfeeling happyfeeling sadf07006

    图 7-6: 重命名你的角色服装

  6. 点击服装面板中的每个角色服装,并绘制一个与其名称匹配的表情,如图 7-7 所示。

    feeling happy 服装应该看起来开心。如果是脸部,你可以让它微笑。如果是动物,你可以改变尾巴或耳朵的位置。或者,你也可以画出角色举着写有其感受的标语牌。

    feeling sad 服装应该看起来很难过。如果是脸部,你可以画一个皱眉或眼泪。

    waiting 服装将在角色等待你与其对话时使用,因此它既不应该看起来开心,也不应该看起来难过。

    f07007

    图 7-7: 为不同的角色服装添加表情

  7. 通过点击文件保存到你的计算机来保存你的 Scratch 项目。

在没有机器学习的情况下编写游戏

在开始使用 ML 之前,尝试不使用 ML 编写这个 AI 项目,了解 ML 带来的差异是很有用的。但如果你更愿意直接使用 ML,可以跳过这部分。

  1. 点击代码选项卡,如图 7-8 所示。f07008

    图 7-8: 代码选项卡

  2. 复制图 7-9 中显示的脚本。f07009

    图 7-9: 编写没有 ML 的项目代码

  3. 使用文件保存到你的计算机来保存你的项目。

  4. 通过点击绿色旗标图标来测试你的项目。你的角色会要求你对它说些什么。输入I like youYou are nice,你的角色会看起来很高兴。如果你输入其他任何内容,你的角色会看起来很伤心。

    现在输入You are lovely。为什么你的角色看起来不高兴?

    你需要对代码做出什么改变才能让它识别“我喜欢你”和“你很好”以及“你很可爱”作为赞美呢?

    你认为你能写出一个脚本,涵盖所有可能的方式来表达每一种可能的赞美和侮辱吗?

在第一章中,我提到过,机器学习(ML)并不是创建 AI 系统的唯一方式。在这里,你通过基于规则的方法创建了一个 AI 程序。你可以看到,尽管像这样的基于规则的技术仍然用于一些非常简单的 AI 项目,但对于更复杂的项目,ML 是首选方法。接下来我们将按照这种方式训练我们的项目,稍后在本章中我们将看到 ML 代码与基于规则的代码相比的表现。

训练你的模型

为了训练计算机识别赞美和侮辱,你需要收集两者的示例,并用它们来训练一个 ML 模型。

  1. 创建一个新的 ML 项目,命名为Make me happy,并设置为学习识别你所选语言中的文本。

  2. 点击训练,如图 7-10 所示。f07010

    图 7-10: 训练是 ML 项目的第一阶段。

  3. 点击添加新标签,如图 7-11 所示。将此训练桶命名为compliments。然后,创建第二个训练桶并将其命名为insultsf07011

    图 7-11: 使用添加新标签准备两个训练桶。

  4. 点击添加示例 compliments**桶中,如图 7-12 所示,并输入你能想到的最好的赞美词。

    重复此步骤,至少添加五个可以让你的角色高兴的赞美示例。这些是你的 ML 模型将用来学习什么是赞美的示例,所以尽量考虑多种不同的方式。

    f07012

    图 7-12: 用于识别赞美的训练示例

*** 点击添加示例侮辱桶中,如图 7-13 所示,并输入你能想到的最恶毒、最残忍的侮辱。

重复这个步骤,至少添加*五个*让你的角色感到难过的侮辱性示例。同样,这些是你的机器学习模型用来学习侮辱是什么样子的示例,因此尽量想出几个不同的变体。

![f07013](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f07013.png)

图 7-13: 识别侮辱的训练示例 *   点击屏幕左上角的**返回项目**。*   点击**学习与测试**。*   点击**训练新机器学习模型**,如图 7-14 所示。![f07014](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f07014.png)

图 7-14: 训练一个新的机器学习模型

计算机将使用你刚刚创建的示例来学习如何识别称赞和侮辱。

为此,它将查找你写的示例中的模式。它将从你选择的词汇和你组织句子的方式中学习。然后,它会使用这些模式来识别我们将在下一步发送给它的消息的含义。

训练模型可能需要一分钟,但你会发现它比你在前几章中训练的图像分类器要快得多。计算机学习文本中的模式比学习图像中的模式要容易得多。

+   通过在**测试**框中输入称赞或侮辱来测试你的机器学习模型,如图 7-15 所示。

重要的是,你要用那些没有包含在训练桶中的示例来测试它。你在测试计算机如何识别它从未见过的新示例,而不是测试它如何记住你已经给它的示例。

如果你的模型出现错误,返回训练阶段并添加更多示例。然后,返回学习与测试阶段,训练一个新的机器学习模型。

继续进行,直到你对计算机的表现满意。在下一章,你将学习更好的机器学习模型测试方法,但现在,简单地尝试几次模型就是一个很好的开始。

![f07015](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f07015.png)

图 7-15: 测试是机器学习的重要部分。**

**### 用机器学习编写你的游戏

现在你已经有了一个能够识别称赞和侮辱的机器学习模型,你将修改之前的项目,使用你的机器学习模型,而不是之前使用的规则。

  1. 点击屏幕左上角的返回项目

  2. 点击制作,如图 7-16 所示。f07016

    图 7-16: 一旦你对你的机器学习模型满意,就该用它制作一些东西了!

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开,以在新窗口中打开 Scratch。

    你应该会在工具箱中看到代表你机器学习模型的新积木,如图 7-17 所示。

    f07017

    图 7-17: Scratch 会打开一个包含新积木集的项目。

  4. 通过点击文件从电脑加载来打开你保存的项目,如图 7-18 所示。f07018

    图 7-18: 打开你之前创建的基于规则的项目。

  5. 如果你之前创建了基于规则的脚本,请更新它以匹配图 7-19。如果你跳过了基于规则的项目方法,请创建图 7-19 中显示的整个脚本。f07019

    图 7-19: 使用机器学习编码的项目

    在这个脚本中,你的角色会要求你对它说些什么。这个脚本使用你的机器学习模型来识别你输入的消息是赞美还是侮辱。它会根据识别的结果展示你绘制的其中一套服装,让它看起来像是你的角色在对你是赞美还是侮辱做出反应!

    如果你之前没有使用机器学习编写这个项目,比较一下这个脚本和之前的版本。你能看到机器学习如何让创建一个能够对更多种类的消息做出反应的项目变得更加容易吗?

测试你的游戏

现在是时候测试你的项目了。点击绿色旗帜,尝试输入一些信息。即使你输入了训练中没有使用的内容,希望角色也能正确反应你的消息。如果没有,你总是可以回到训练阶段,添加更多示例,然后重新训练一个新的机器学习模型。

你已经成功创建了一个能够识别并对你给予的赞美或侮辱做出反应的角色!

审查并改进你的项目

让我们看看你可以改进这个项目的几种方法。

使用语音输入代替打字

那么,怎样改进你的项目,使你可以通过说出赞美和侮辱而不是输入文字呢?

你需要在计算机上连接麦克风才能使用语音输入,并且你需要从 Scratch 扩展库中添加语音转文本扩展。要访问扩展库,请点击工具箱底部的“添加扩展”图标(看起来像两个带加号的模块,+)。这个库包含了你可以在项目中使用的额外模块。

找到并点击语音转文本扩展,将这些模块添加到你的工具箱中,然后更新你的脚本,使其像图 7-20 所示。

f07020

图 7-20: 使用语音识别的“让我开心”项目

语音识别 是机器学习的另一个应用。在这个改进中,你不是自己训练语音机器学习模型,而是使用别人为你训练好的模型。但是语音模块创建的基本原理与创建打字版的赞美和侮辱示例类似。

你还可以做些什么来改进你的项目?

识别不是赞美或侮辱的语音

对你的角色说What is the time?。它可能认为这个问题是赞美并表现得很高兴,或者它可能把这个问题识别为侮辱并表现得很难过。

这两种反应都不是正确的做法。你可以更新代码,使它在收到既不是赞美也不是侮辱的消息时完全不做反应。

当你在“学习与测试”阶段测试 ML 模型时,你可能注意到置信度分数显示了计算机对识别消息的信心有多大。

现在再次输入What is the time?,如图 7-21 所示。

f07021

图 7-21: 测试“What is the time?”分类的置信度

你应该会看到这个消息的置信度分数非常低。这是 ML 模型告诉你它没有识别出该文本的方式。它在说,在你给它的所有训练样本中,它没有见过类似的内容,因此无法识别该消息是赞美还是侮辱。

我的 ML 模型在对“What is the time?”的分类中给出的置信度分数为 0。你的 ML 模型可能得分稍高,具体取决于你如何训练它。例如,如果你在侮辱类别中包括了很多像“你怎么了?”这样的句子,那么你的 ML 模型可能会对“What is the time?”有 10%的置信度认为它是侮辱,单单因为它是一个问题。这仍然是有用的信息,因为它告诉你有 90%的可能性这个消息不是侮辱。它在说,这个消息在某些方面与它从侮辱中学到的模式相似,但它不能自信地确定这个消息是侮辱。

尝试不同的测试句子,这些句子既不是赞美也不是侮辱,看看你能得到什么样的置信度分数。将这些与测试 ML 模型时得到的关于真实赞美和侮辱的置信度分数进行比较。

当你的 ML 模型正确识别出一个真实的赞美或侮辱时,它给出的置信度分数是多少?

你可以在你的 Scratch 项目中使用置信度分数,如图 7-22 所示。

f07022

图 7-22: 在代码中使用置信度分数

这个脚本只有在 ML 模型至少有 70%的置信度确认它识别了你给出的消息时才会让角色做出反应。否则,脚本会忽略该消息。

你需要将70更改为适合你 ML 模型的百分比,具体取决于你自己的测试。

还有其他什么方法可以改进你的项目吗?

从错误中学习

当有人使用 ML 系统时,他们通常会知道计算机是否犯了错误。改进 ML 项目的一种方式是让它从这些错误中学习。

给用户一个方式来告诉项目 ML 模型是否犯了错误。可以是一个按钮,或者是一个文本框,用户在其中输入“yes”或“no”,以回答“我做对了吗?”这个问题。

图 7-23 中显示的脚本将询问机器学习(ML)模型是否正确。如果你输入“no”,计算机未正确识别的文本将被添加到训练示例中。每新增五个训练示例,就会训练一个新的 ML 模型。

f07023

图 7-23: 从错误中学习的一个示例

训练你的模型从错误中学习,随着使用时间的推移,它会变得更加智能。想想当你的角色误解了你时,你希望如何告诉它,并使用类似这样的脚本,这样它就可以从你的反馈中学习。

你学到了什么

在本章中,你学习了情感分析,即使用机器学习识别文本中的语气和情感。你了解到企业和组织如何使用情感分析从互联网上获取客户的宝贵反馈和见解,优先处理客户服务响应,并衡量员工满意度。

你发现,与简单的基于规则的方法相比,机器学习在为复杂项目构建 AI 系统时是一个更好的选择。你还学习了如何通过置信度得分来判断机器学习模型对其预测的确定性,并看到了如何通过帮助模型从错误中学习来改善它们。

在下一章中,你将使用类似于情感分析的方法来训练一个模型,识别不同的写作风格。****

第六章:识别报纸中的语言

Alphabet-I在上一章中,你看到计算机可以被训练来识别写作的不同特征。在那个项目中,你训练了一个机器学习模型来识别赞美和侮辱。计算机也可以学习识别许多其他写作风格。

例如,你可以训练一个机器学习模型来识别正式写作与非正式写作之间的区别,方法是训练它识别人们选择的词汇和使用的表达方式中的模式。

不同的报纸和新闻网站使用不同的词汇和短语来描述相同的故事。在本章中,你将通过创建一个能够识别头条所属报纸类型的机器学习模型,训练计算机识别媒体中语言的使用方式(见图 8-1)。

f08001

图 8-1: 识别报纸头条

让我们开始吧!

构建你的项目

本项目的目的是看看计算机是否能学会识别报纸使用语言的方式。在本章的截图中,我训练了一个机器学习模型来识别小报(包含八卦故事和大量照片的小型报纸)与大报(传统的、全尺寸的报纸,通常有更多严肃的文章)之间的头条区别。

你也可以选择相同的主题,或者设计自己的项目。如果你选择设计自己的项目,你应该选择一个特征来训练计算机进行识别。你可以调查很多方面。例如,你可以根据以下内容来设计项目:

  1. 英国报纸(与美国报纸相比)  美国报纸与英国报纸在语言使用上有何不同?

  2. 夏季头条(与冬季头条相比)  不同季节的头条写法有何不同?

  3. 国家报纸(与地方报纸相比)  国家级报纸的头条与地方报纸的头条写法是否有所不同?

  4. 周末头条(与工作日头条相比)  报纸在工作日和学校日使用的语言与周末是否不同?

  5. 来自两份不同报纸的文章   如果你选择两份特定的报纸,你能训练计算机识别其中一份报纸的文章吗?

  6. 1950 年代的头条(与今天的头条相比)  今天的头条写法与过去有何不同?

你需要一些报纸文章或头条的例子,用来训练机器学习(ML)模型进行识别。你可以利用很多网站来寻找这些例子。以下是一些建议:

  1. www.thepaperboy.com/

  2. www.ukpressonline.co.uk/

  3. www.time.com/vault/

想一想您认为有趣的比较,然后看看是否能找到足够的示例,以便轻松实现。

您将需要两个组来训练 ML 模型:

  • 您希望模型识别的报纸文章/头条新闻类型的示例

  • 不具备该特征的报纸文章/头条新闻示例

尝试在第二组中只改变一个特征。例如,1970 年代英国小报头条类别有三个变量:国家(英国)、报纸类型(小报)和时间段(1970 年代)。那么,您会在第二组中放入什么?

您可以将其填充为 1970 年代美国小报头条的示例,这样计算机就可以学习识别 1970 年代英国和美国小报头条的区别。或者,您可以将其填充为今天英国小报的头条新闻示例,这样计算机就能学习识别 1970 年代和现在英国小报头条的区别。

不应做的是,例如,使用当前美国大报的头条新闻。这将改变所有三个变量,导致模型难以识别一致的模式。

作为另一个示例,如果您想训练计算机识别每日时报的文章写作方式,第二组中可以包括同一天来自不同报纸的文章。更好的是,您可以尝试选择关于相同主题的文章。这样,您的 ML 模型将不会学习识别文章的主题,而是学习每日时报描述相同主题的方式。

为了训练我的 ML 模型识别小报的头条新闻,我将小报的头条新闻与大报的头条新闻进行了比较。以下是我保持一致的内容:

  • 我使用的是相同时间段的报纸:2015 年 3 月到 2015 年 4 月。

  • 我使用了每份报纸的相同版面:首页最大字号的头条新闻。

  • 我使用的是相同类型的报纸:全国性平日报纸。

  • 我使用的是相同国家的报纸:英国。

训练您的模型

  1. 创建一个新的 ML 项目,命名为Newspapers,并设置为学习识别您首选语言中的文本。

  2. 点击训练,如图 8-2 所示。f08002

    图 8-2: 训练是 ML 项目的第一阶段。

  3. 点击添加新标签,如图 8-3 所示,为您在项目中要比较的两个组创建训练桶。

    对于我的项目,我使用了小报和大报。

    f08003

    图 8-3: 为两个组创建训练桶以进行比较。

  4. 查找并复制您第一组的示例。这将取决于您正在做的项目。如果您正在做关于头条新闻的项目,那可能是报纸的头条新闻。如果您在比较不同报纸如何写同一主题的文章,那可能是文章的第一段。

    在我的项目中,我从一个展示英国国家报纸首页的网站上复制了标题。

  5. 点击每个训练桶中的添加示例,如图 8-4 所示,并粘贴你找到的示例。f08004

    图 8-4: 报纸项目的第一个训练示例

  6. 重复步骤 4 和 5,直到每个训练桶中至少有 20 个示例,如图 8-5 所示。

  7. 点击屏幕左上角的返回项目f08005

    图 8-5: 报纸项目的训练数据

  8. 点击学习与测试,如图 8-6 所示。f08006

    图 8-6: 学习与测试是机器学习项目的第二阶段。

  9. 点击训练新机器学习模型,如图 8-7 所示。f08007

    图 8-7: 点击训练新机器学习模型以开始训练。

    计算机可能需要一分钟来从你收集的示例中学习。在等待时,考虑这些问题:

    • 在将示例复制到训练桶中时,你是否发现了两组示例之间的任何模式?

    • 是否有某些话题或主题在一组中比另一组更常出现?

    • 是否有某些词汇、术语或短语在一组中使用得比另一组更多?

    • 句子的结构方式是否有差异?有一组的句子比另一组长吗?有一组更频繁地使用大写字母吗?

    • 使用的单词类型是否存在模式?例如,一组是否使用更简单的语言或更短的单词?一组是否使用更多的情感词汇?

    尝试猜测你的机器学习模型可能从你提供的训练示例中学习到哪些模式。

准备你的项目

在你迄今为止制作的项目中,你通过尝试模型来测试了你的机器学习(ML)模型。在本章中,你将看到一些机器学习项目在现实世界中如何正式进行测试。

  1. 点击屏幕左上角的返回项目

  2. 点击制作

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开,以打开一个新的窗口并启动 Scratch。

  4. 删除Sprite1猫精灵,因为你不需要它。点击其右上角的垃圾桶图标。此时,服装标签应已被背景标签取代。

  5. 点击背景标签,并绘制一个将你的 Scratch 项目分为上下两部分的背景,如图 8-8 所示。

    上半部分将用于与您训练机器学习模型识别的报纸匹配的部分。

    下半部分将用于与您训练机器学习模型识别的报纸不匹配的部分。

    为每一半选择一种颜色。我使用了红色表示上半部分,蓝色表示下半部分。

    在两半之间画一条线,以划分空间。

    你应该最终得到类似图 8-8 的效果。

  6. 通过将鼠标指针移动到屏幕右下角的选择精灵图标(猫脸)上来添加一个精灵。这个精灵将代表你训练的机器学习模型应该识别的报纸头条,因此,在画布上方的服装文本框和屏幕右下角的精灵文本框中都给它起个合适的名字。

    要绘制你自己的报纸,选择绘画

    要上传你保存到计算机中的报纸图片,点击上传精灵

    f08008

    图 8-8: 为报纸项目准备背景。

  7. 点击服装标签并使用绘图工具将报纸涂色,使其与背景的上半部分相匹配。

    对于我的项目,我画了一个红色的报纸精灵来代表小报的头条,并命名为“小报”,如图 8-9 所示。

    f08009

    图 8-9: 绘制第一个报纸精灵。

  8. 点击代码标签,点击工具箱中的变量,然后点击创建列表,如图 8-10 所示。

    确保选择了所有精灵,并根据你训练机器学习模型识别的内容为你的列表命名。

    对于我的项目,我创建了一个名为“小报头条”的列表。

    f08010

    图 8-10: 为第一组头条创建一个列表。

  9. 如图 8-11 所示,至少在列表中输入 10 个示例。点击列表左下角的加号按钮添加新行。你可以拖动列表右下角的等号,使列表变宽,这样可以更容易查看你输入的内容。

    你在这个列表中输入的文本应该是报纸头条或文章的示例,这些内容符合你训练机器学习模型所识别的标准。

    重要的是,这些头条应该是你在训练示例中没有使用过的新头条。它们应该是计算机之前没有见过的头条,这样你才能正确测试它是否能够识别新的头条,而不仅仅是记住它们。

    当你完成输入测试头条到列表中后,取消勾选工具箱中的列表,以将其隐藏在舞台上。

    f08011

    图 8-11: 测试第一组示例

  10. 点击代码标签并复制图 8-12 中显示的脚本。

    用你在项目中训练计算机识别的标签替换小报块。

    f08012

    图 8-12: 报纸项目的第一个代码脚本

    这个脚本将遍历我的每个小报头条,如果机器学习模型识别它为小报头条,它将把该头条移动到屏幕的上半部分。否则,它将把头条移动到屏幕的下半部分。

    你在第三章做过类似的事情,当时你根据机器学习模型识别精灵的外观来排序动物精灵。这一次,你是根据机器学习模型识别列表中的某些文本来排序精灵。

  11. 点击绿旗,观察脚本运行。

    你的机器学习模型表现如何?它可能会有些错误答案,但希望它能大多数都做对。你可以在图 8-13 中看到我的机器学习模型的表现。

    f08013

    图 8-13: 报纸项目的第一次测试

    但仅凭这些报纸精灵的分组,你无法判断我的机器学习模型是否能够区分小报头条与大报头条。也许它将几乎所有东西都识别为小报头条。为了知道我的模型是否也能识别大报头条,我需要在列表中添加一些大报头条的例子。

  12. 按照第 6 步中的说明创建一个新精灵,这次代表应出现在你创建的背景下半部分的头条/文章。将精灵的颜色设置为与你绘制背景时选择的下半部分颜色匹配,并给精灵和服装命名,使其符合你训练模型识别的内容。

    对于我的项目,我绘制了一个蓝色的报纸精灵来表示大报头条,并将其命名为 broadsheet,如图 8-14 所示。

    f08014

    图 8-14: 第二个精灵用于报纸项目

  13. 代码选项卡中,点击工具箱中的变量,然后点击创建一个列表。将至少 10 个应该出现在背景下半部分的头条/文章添加到此列表中。

    如前所述,确保选择了所有精灵,并将列表命名为与第二组相匹配的名称。

    对于我的项目,我创建了一个名为"broadsheet headlines"的列表,并将 10 个大报头条的例子填入其中,如图 8-15 所示。

    在将测试头条输入列表后,取消选中工具箱中的列表,以便在舞台上隐藏该列表。

  14. 创建一个变量来计数这些头条,方法是点击你的第二个报纸精灵,点击工具箱中的变量,然后点击创建一个变量。为变量命名,以与你的第二组名称相符。

    对于我的项目,我创建了一个名为"broadsheet"的变量,如图 8-15 所示。

    f08015

    图 8-15: 为第二组报纸准备数据

  15. 复制图 8-16 中显示的脚本,用于第二个报纸精灵。f08016

    图 8-16: 报纸项目的第二次测试

    这些脚本与你在第 9 步中为第一个报纸精灵创建的脚本类似。

    这段代码将遍历第二个列表中的示例。对于每个示例,它将创建一个精灵,如果机器学习模型识别该示例属于第二组,代码将把它移到屏幕的下半部分。否则,代码将把示例移到上半部分。

    小心不要使用第一个精灵中的列表或变量。我的第一个脚本是关于小报头条的,第二个脚本则是关于大报头条的。

    请注意,脚本中的坐标也必须不同,这样正确匹配的项目才能显示在屏幕的下半部分。

  16. 再次点击绿色旗帜,观察你的脚本运行。

    如前所述,如果你的机器学习模型没有完全正确也没关系。你可以查看我的机器学习模型在图 8-17 中的表现。

    你的机器学习模型表现如何?

    f08017

    图 8-17: 第二次测试的报纸项目结果

审查并改进你的项目

你已经训练了一个机器学习模型来识别媒体中的语言使用!你还使用 Scratch 制作了一个简单的测试,来可视化你的机器学习模型的效果。

如果我的机器学习模型表现完美,它应该会把所有的红色报纸移到上半部分,把所有的蓝色报纸移到下半部分。

它没有做到。

正确识别 100%的头条新闻是不太可能的,因为我只给了我的模型少量的训练数据。随着更多的训练样本,我预计结果会有所改善,但即便如此,机器学习系统也很少能做到完美。

但是它到底有多好呢?

我们可以通过许多方法来描述机器学习系统的性能。

性能测量:准确度

我们用来描述机器学习模型性能的一个指标是准确度,即计算机器学习模型正确回答的数量。

*创建一个新变量,选择所有精灵,并命名为correct

修改第一个精灵的脚本(图 8-12 中的报纸应显示在上半部分),使其与图 8-18 中的脚本匹配。

请注意,你需要删除脚本中的最后一个if块,并用if...else块替换它。

现在修改第二个精灵的脚本(图 8-16 中的报纸应显示在下半部分),使其与图 8-19 中的脚本匹配。

f08018

图 8-18: 修改第一个测试脚本(来自图 8-12)以计算正确答案的数量。

请注意,你还需要将此脚本中的最后一个if块替换为if...else块。

f08019

图 8-19: 修改第二个测试脚本(来自图 8-16)以计算正确答案的数量。

使用这些更新后的脚本,你的 Scratch 项目将计算机器学习模型的准确度,并在测试结束时显示结果。公式为:

**correct answers / ( (number of tabloid headlines) + (number of broadsheet headlines) )** 

如图 8-20 所示。

f08020

图 8-20: 计算准确率(Scratch 将列表中的项数称为列表的长度

换句话说,准确率是指机器学习模型正确分类的头条的百分比。

我的机器学习模型的准确率如图 8-21 所示。它与您的项目相比如何?

f08021

图 8-21: 显示准确度

性能测量:混淆矩阵

准确率是一个有用的衡量标准,也许是最著名的一个。但它通常不够,因此通常不是现实世界中机器学习系统唯一使用的衡量标准。

你能想到准确率的任何问题吗?

如果我的机器学习模型认为所有的都是大报头条,如图 8-22 所示,那怎么办?

f08022

图 8-22: 将每个头条分类为大报

准确率将是 50%,因为模型会将所有 10 个大报报纸放在正确的位置,但会将所有 10 个小报报纸放错地方。

但“50%准确率”并不是对一个始终给出相同答案的系统的良好描述。我们需要一种更好的方式来描述我们的机器学习模型的性能,避免这种误导性的结果。

混淆矩阵是一种工具,您可以在其中统计机器学习模型正确和错误的数量,然后将这些结果按表格排列。让我们看一个例子。

创建四个新变量,选择所有精灵,并将它们命名为真正例真负例假正例假负例。确保在工具箱中选择了这四个变量的复选框,如图 8-23 所示。

f08023

图 8-23: 为混淆矩阵准备变量

按照图 8-24 中的示例,将变量安排在舞台上。

f08024

图 8-24: 在 Scratch 中创建混淆矩阵

修改第一个精灵的脚本(即图 8-18 中的报纸,应该放在上半部分),使其与图 8-25 中的脚本匹配。

这有点长,但请慢慢来,仔细对照,确保正确复制。如之前一样,我已经添加了注释以突出变化。

我们增加了真正例假负例的计数,并且调整了滑块的x值,使得小报保持在屏幕的左侧。

****f08025

图 8-25: 修改第一个脚本(来自图 8-18)以计算混淆矩阵值。

修改第二个精灵的脚本(即图 8-19 中的报纸,应该放在下半部分),使其与图 8-26 中的脚本匹配。

我们正在增加真正负例假正例的计数,并改变滑行模块的x值,以便大报能够保持在屏幕的右侧。

****f08026

图 8-26: 修改第二个脚本(来自图 8-19)以计算混淆矩阵的值。

点击绿色旗帜再次测试你的机器学习模型。我的结果显示在图 8-27 中。

f08027

图 8-27: 在 Scratch 中显示混淆矩阵

表 8-1 显示了我的机器学习模型结果,排列成混淆矩阵。

表 8-1:在混淆矩阵中排列结果

| 真正例 头条来自小报。机器学习模型认为它来自小报。

(正确) | 假正例 头条不是来自小报。机器学习模型认为它来自小报。

(不正确) |

| 假负例 头条来自小报。机器学习模型认为它不是来自小报。

(不正确) | 真正负例 头条不是来自小报。机器学习模型认为它不是来自小报。

(正确) |

这是一种有用的方式,可以描述机器学习模型的表现,它能提供比准确度单独能提供更多的信息。

如果我的机器学习模型认为所有内容都来自大报,那么混淆矩阵将如图 8-28 所示。

f08028

图 8-28: 混淆矩阵示例

测量性能:精度和召回率

描述机器学习模型表现的另一种方式是使用精度召回率

**精度计算公式为 真正例 / (真正例 + 假正例)

召回率计算公式为 真正例 / (真正例 + 假负例)

你可以更新你的脚本,包含图 8-29 中显示的计算方式。将它们添加到第二个精灵的当我作为克隆开始时脚本的末尾,模块之后。

f08029

图 8-29: 在 Scratch 中计算精度和召回率

我将这个计算添加到了我的机器学习模型脚本中。图 8-30 显示了我得到的结果。

f08030

图 8-30: 在 Scratch 中显示精度和召回率

精度分数意味着,当我的机器学习模型认为某个内容是小报头条时,它正确的概率是 78%。

召回率分数意味着它找到了测试集中的 70%小报头条。

准确度分数意味着机器学习模型给出的答案中,有 75%是正确的。

精度、召回率和准确度有助于全面描述机器学习模型的表现。

例如,图 8-31 展示了两种不同机器学习模型的结果,这两种模型的准确率均为 50%。其他得分有助于描述模型工作方式的差异。

f08031

图 8-31: 不同的机器学习模型,准确率为 50%

与我们在上一章中通过手动输入测试值并直观了解模型正确次数的测试方法相比,使用衡量值是一种更一致、更有效的方式来描述 ML 模型的性能。我们将在下一章中讨论图像识别项目中性能衡量值的另一种应用。

改进您的 ML 模型

尝试为您在训练阶段的两个训练桶各添加另外 10 个示例,并使用这些示例训练一个新的 ML 模型,然后进入学习和测试阶段。

一旦新的 ML 模型完成训练,请重新运行您的 Scratch 脚本。

增加训练样本数量对您的精度、召回率和准确度评分有什么影响?

您学到了什么

从您自己的所有项目中可以看出,ML 并不完美,也会犯错误。然而,ML 不需要完美才能有用。ML 系统通过快速工作来弥补它们的错误,分析大量的文本,而这些文本是一个人一生也读不完的。即使它每 10 次就出错一次,ML 系统在发现需要关注的事项时仍然能发挥作用。但了解一个 ML 系统犯错的次数是非常重要的,这有助于衡量它的表现如何。

在这一章中,您了解了测试 ML 系统和衡量它们表现的多种方法,这些方法可以帮助我们决定如何使用它们给出的结果。

在下一章中,您将学习如何通过将问题分解成单独的部分,让 ML 模型识别,从而解决更复杂的问题,您还将再次使用混淆矩阵来查看这种方法的效果。

第七章:在图片中找到物体

Alphabet-I在前几章中,你学到了如何训练一个机器学习系统,让它能够识别图片中的物体。这在整张图片都是你感兴趣的东西时非常有用,就像你在第四章制作石头、剪刀、布游戏时那样。在那个游戏中,你的手占据了整张照片的画面。但有时我们希望计算机学会找到图片中只有一小部分的物体。在这一章中,你将看到如何将一个复杂的任务拆分成几个更简单的部分,然后分别使用机器学习来处理每一部分。

例如,假设你想使用机器学习来找出树在图 9-1 中的位置。

f09001

图 9-1: 树在哪里?

基本的想法是,你训练一个机器学习模型来识别树的图片,就像你在第三章中训练它来识别某些动物的图片一样。然后,你将这张新照片拆分成更小的部分,并使用该机器学习模型检查每一部分,看看哪一部分看起来像是一张树的照片。

例如,图 9-1 的左上角部分在图 9-2 中有所显示。机器学习模型不会将这张图片识别为树,所以我们可以说树并不在图片的左上角。

f09002

图 9-2: 图 9-1 的左上角

或者,我们可以尝试图 9-3 中显示的右下部分。机器学习模型也不会将这张图片识别为树,所以我们可以说树并不在图片的右下角。

f09003

图 9-3: 图 9-1 的右下角

我们继续进行,直到尝试测试类似图 9-4 的图片。当我们得到一个机器学习模型高可信度认为是树的图片部分时,我们就知道已经找到了树的位置。

f09004

图 9-4: 图 9-1 的左下角

一个很好的思考方式是,你将图片拆分成多个小块,并单独测试每一块。在这一章中,你将亲自体验这种方法是如何工作的,同时训练一个机器学习模型来找到随机生成场景中物体的位置。

构建你的项目

在这一章中,我们将使用一个 Scratch 项目,它会选择一个随机背景,然后将十几个精灵随机分布在舞台上。其中一个精灵是一只鸭子。这个项目的目标是仅通过查看舞台来找到那只鸭子,而不是通过使用精灵的坐标来作弊(见图 9-5)。

f09005

图 9-5: 这个项目的目标是找到那只鸭子。

训练你的模型

  1. 创建一个新的机器学习项目,命名为找到鸭子,并设置它学习识别图片。

  2. 点击训练,如图 9-6 所示。f09006

    图 9-6: 训练是机器学习项目的第一阶段。

  3. 点击添加新标签,如图 9-7 所示。然后输入Duckf09007

    图 9-7: 创建一个用于存储鸭子图片示例的训练桶。

  4. 再次点击添加新标签,并将此桶命名为Not the Duck,如图 9-8 所示。(下划线会自动添加。)

    这个桶将用于存储负训练示例,即那些不是你希望计算机学习识别的内容。

    f09008

    图 9-8: 创建一个用于存储非鸭子图片示例的训练桶。

  5. 点击屏幕左上角的返回项目

  6. 点击制作

  7. 点击Scratch 3,如图 9-9 所示。f09009

    图 9-9: 点击Scratch 3

    你会看到一个警告,提示你还没有机器学习模型。没关系,因为你将使用 Scratch 来收集训练示例。

  8. 点击直接进入 Scratch,如图 9-10 所示。f09010

    图 9-10: 点击直接进入 Scratch打开没有机器学习模型的 Scratch。

  9. 在顶部菜单中点击项目模板。然后点击显示的模板列表中的查找鸭子

    该项目有 12 个精灵,排列在舞台上形成 3×4 的图块网格。当你首次加载模板时,精灵是隐藏的,但它们的名称如图 9-11 所示。

    f09011

    图 9-11: 查找“查找鸭子”模板中的精灵。

  10. 点击右下角精灵列表中的0,0精灵。在代码区的左上角,在黄色的 TRAINING 注释下,找到store training data example of the duckstore training data example of NOT the duck块,如图 9-12 所示。f09012

    图 9-12: 查找0,0精灵的脚本块。

  11. 点击左侧工具箱中的查找鸭子组,然后在两个脚本中都添加一个add training data块。接着,从图像组中,将一个backdrop image块拖到两个add training data块中,如图 9-13 所示。

    将第一个脚本设置为将背景添加到“鸭子”训练桶,第二个脚本设置为将背景添加到“非鸭子”训练桶。

    f09013

    图 9-13: 向两个训练桶添加训练示例。

  12. 对所有 12 个精灵重复第 11 步(参见图 9-14)。完成后,点击任何一个图块都可以将示例添加到你的训练数据中。f09014

    图 9-14: 将脚本块添加到所有 12 个精灵。

  13. 现在是收集训练示例的时间了!点击绿旗开始。当项目询问你是否想要训练或测试时,点击训练

    当系统询问你是否点击鸭子时,点击确定,然后点击包含鸭子的瓷砖。你点击的瓷砖将被添加到你的鸭子训练桶中,如图 9-15 所示。

  14. 当系统询问你是否点击一个没有鸭子的瓷砖时,点击确定。确保点击一个没有显示任何鸭子部分的瓷砖。f09015

    图 9-15: 将鸭子的示例添加到训练数据中

  15. 在“Machine Learning for Kids”网站上,点击返回项目,然后点击训练,确保一切正常工作。你应该能看到你点击的两个瓷砖,如图 9-16 所示。检查它们是否在正确的桶中。f09016

    图 9-16: 训练示例应该出现在训练阶段的正确桶中。

  16. 在 Scratch 中重复步骤 13 到 15,直到每个桶中有 10 个示例,如图 9-17 所示。

    这里有两个关于不是鸭子训练示例的小贴士:

    • 确保每次为你的不是鸭子桶点击的角色都不相同。你不希望它成为识别鹦鹉等的训练集。制作一个好的不是鸭子训练集的最佳方法是点击其他角色的均匀混合。

    • 第二,尽量包含一些没有任何字符的瓷砖。你希望计算机学习到空瓷砖也是不是鸭子f09017

    图 9-17: 用于寻找鸭子的训练数据

  17. 点击返回项目,然后点击学习与测试。点击训练新的机器学习模型,如图 9-18 所示。

    等待模型完成训练,这可能需要几分钟时间。

    f09018

    图 9-18: 使用你收集的示例训练一个 ML 模型。

准备你的项目

接下来,你需要修改你的 Scratch 项目来完成测试脚本。

  1. 点击右下角角色列表中的0,0角色,在代码区域找到当我收到 test-0,0脚本。它位于你之前编辑过的脚本右侧,如图 9-19 所示。f09019

    图 9-19: 在0,0角色中找到测试脚本。

  2. 当我收到 test-0,0脚本中,从找鸭子组中拖入一个识别图像(标签)块,并按照图 9-20 所示进行更新。

    这个脚本将使用你的 ML 模型来测试左下角的瓷砖是否包含鸭子,如果是,它将显示“这里有鸭子吗?”的信息。

    f09020

    图 9-20: 更新测试脚本以使用你的 ML 模型。

  3. 对所有 12 个精灵重复步骤 2(见图 9-21)。一旦完成,你的机器学习模型就能检查所有瓷砖,找出鸭子所在的位置。f09021

    图 9-21: 将测试块添加到所有 12 个精灵上。

测试你的项目

是时候测试你的机器学习模型了!

  1. 点击绿色旗帜,然后点击舞台上的测试,以测试 Scratch 项目。

    你的项目将使用机器学习模型来测试每个瓷砖,并突出显示它识别为鸭子的任何瓷砖,如图 9-22 所示。

    f09022

    图 9-22: 测试你的机器学习模型

  2. 尝试几次,看看你的模型多经常正确识别。找到大场景中的小图像是一个复杂的任务,所以仅用 10 个训练样本,模型可能会犯一些错误。

  3. 通过点击绿色旗帜并点击训练,如之前所做,向每个桶中再添加 10 个训练样本。你可以在训练阶段查看新的训练样本,如图 9-23 所示。

    点击返回项目,然后点击学习与测试,用更大的训练样本集来训练一个新的机器学习模型。

    f09023

    图 9-23: 尝试使用每组 20 个样本训练新的机器学习模型。

  4. 像之前那样重新测试。你的新机器学习模型是否更擅长找到鸭子?

审查并改进你的项目

你怎么描述机器学习模型的表现如何?

在第八章中,你学到了如何记录计算机正确与错误的次数:

  1. 真阳性    计算机认为包含鸭子的瓷砖,且确实包含

  2. 假阳性    计算机认为包含鸭子的瓷砖,实际并不包含

  3. 真阴性    计算机认为不包含鸭子的瓷砖,且确实不包含

  4. 假阴性    计算机认为不包含鸭子的瓷砖,实际却包含

你可以使用这个计数来绘制混淆矩阵,并计算机器学习模型的准确率、召回率和精度。

例如,查看图 9-24 中的测试图像。

f09024

图 9-24: 测试图像,右下角的两个瓷砖被识别为匹配

鸭子出现在棋盘右下角的四个瓷砖中。我的机器学习模型识别出了其中两个,另外两个则漏掉了。所以,我的混淆矩阵看起来是这样的:

真阳性 2 假阳性 0
假阴性 2 真阴性 8

这个混淆矩阵给出了:

  1. 精度:100%

    (每次我的机器学习模型认为看到了鸭子时,那里确实有一只鸭子。)

  2. 召回率:50%

    (我的机器学习模型找到了包含鸭子的瓷砖的一半。)

  3. 准确率:83%

    (我的机器学习模型给出了 12 个答案中的 10 个正确答案。)

你需要一个更大的样本量,包括不同的背景,才能真正信任这些数字。

我进行了五次测试,整体结果如下:

真阳性 9 假阳性 0
假阴性 6 真阴性 45
  1. 精确度:100%

  2. 召回率:60%

  3. 准确率:90%

这些数字为我们提供了一种更有意义的方式来描述机器学习模型的表现。

我的模型只使用了少量示例进行训练,似乎非常精确(当它识别出一只鸭子时,总是正确的)。然而,它有时会遗漏一些内容。

我们描述了一个有时会遗漏内容的精确模型,称其为偏向精确而非召回。这种方法适用于那些不能错误识别事物的项目。

对于那些更重要的是不遗漏任何东西,并且偶尔犯错也无妨的项目,你应该训练机器学习模型,使其偏向召回而非精确

你的项目表现如何?

复杂图像识别系统的实际应用

你可能以前训练过类似的图像识别机器学习模型。你有没有曾被网站要求通过点击街道标志图像来证明你是人类,如图 9-25 所示?或者是自行车?或者出租车?

f09025

图 9-25: 帮助训练机器学习模型

希望你能理解这种图像识别应用程序,即验证码,将是收集大量训练样本的绝佳方式,以便训练一个能够在街道上识别不同物体的图像识别系统。你认为这对自动驾驶汽车的开发有帮助吗?

*这里的基本思想在章节的介绍部分有描述。如果我们想在更大的图像中找到某个小物体,我们就将图像分割成更小的图块,并使用训练好的机器学习模型分别测试每个图块,以识别该物体。

你可能已经对这种技术的挑战有了一些了解,尤其是亲自训练过它之后。例如,最大的挑战之一就是决定使用什么尺寸的图块。记得在图 9-1 中寻找树木的例子吗?

如果你将图块做得太小,你可能永远只能看到你想找的物体的一小部分,而无法识别出它。例如,你的机器学习模型可能无法将图 9-26 识别为树木。

f09026

图 9-26: 只包含树木一部分的图块

另一方面,如果你将图块做得太大,如图 9-27 所示,你仍然会遇到图中有过多的非树木部分,这会挑战训练识别树木图像的机器学习模型。

f09027

图 9-27: 一个过大,无法聚焦于树木的图块

如果你知道你在图像中寻找的物体的可能尺寸,你可以合理地估算使用什么尺寸的图块。有些系统甚至会要求用户指定图块的尺寸。

如果这两种解决方案都不可行,你可以尝试多种瓦片大小,并使用能让模型获得最高信心的结果,如图 9-28 所示。

即使你获得了正确的网格大小,你寻找的物体也不一定会完美地出现在瓦片的中心(就像你可能在鸭子示例中注意到的那样)。

f09028

图 9-28: 如果你无法知道最佳大小,尝试各种瓦片大小。

为了提高在瓦片中心找到你想要的物体的机会,你还需要尝试不同的起始位置。

使用这些技术组合的系统可以非常有效。例如,在 2015 年,由于加利福尼亚州的干旱导致的紧急状态中,一个机器学习模型被用来寻找影响水使用的草坪、游泳池和其他特征。

将整个州的卫星图像切割成瓦片,就像你在项目中做的那样,这意味着每个瓦片都可以单独分类。主要的不同之处在于,加利福尼亚的机器学习(ML)模型不仅仅是识别一种物体,而是识别多种不同的事物,这些事物影响着水的使用。(你在第三章中看到了如何训练机器学习模型来识别不同物体的图片。)将图像识别与地图结合意味着加利福尼亚的官员可以快速了解全州水资源使用的影响。

加利福尼亚是一个庞大的州,手动进行这样的普查或调查需要很长时间。机器学习是一种快速且高效的方式来得出有用的估计,而在紧急情况下,速度和效率是非常重要的。

机器学习图像识别技术也经常在商业中使用。例如,无人机可以在飞越建筑物、屋顶、桥梁、太阳能板、管道等时拍摄高分辨率的照片。这些照片随后被切割成瓦片,并由一个经过训练的机器学习模型进行测试,用来识别损坏或维护不良的迹象。基于与本章项目相同原理的自动图像识别系统被应用于多个领域,如土木工程(用于检查桥梁和建筑物)、农业(用于识别健康或生病的植物和作物),甚至公共安全(例如在澳大利亚,机器学习被用于救生无人机,可以从空中识别鲨鱼)。

你学到了什么

在本章中,你训练了一个机器学习模型来识别作为更大场景一部分的物体。这是你迄今为止做过的最复杂的项目,但希望你现在对如何构建复杂的图像识别系统有了很好的理解。你学到了一些训练此类系统的挑战,比如知道如何将复杂的任务拆分为更简单的任务(例如选择正确的瓦片大小),并且你获得了一些解决这些问题的技巧。你还看到了这些复杂机器学习系统的一些实际应用,以及它们使用的领域实例。

在下一章,我们将探讨机器学习的另一个常见应用:智能助手*。

第八章:智能助手

Alphabet-I 在本章中,我们将看一下机器学习的一个常见家庭应用:智能助手,如 Siri、Alexa 或 Google Home,当你请求时,它们可以为你完成一些简单的任务,比如设定闹钟、启动计时器或播放音乐。

智能助手是经过机器学习训练的系统,能够识别文本的含义。你已经看到,你可以训练计算机,使它在你提供文本时,能够理解你想要表达的意思。如果计算机能理解你想说的,它就能理解你让它做什么。

要创建一个基于识别文本意图(意图分类)的文本分类程序,我们收集大量每种命令类型的示例,并使用机器学习来训练模型。

从你到目前为止完成的项目中,你已经熟悉了分类 意图分类的部分。例如,消息可以被分类为赞美或侮辱,报纸头条可以被分类为小报或大报。计算机知道一些写作类别,当你给它一些文本时,它会尝试分类这些文本,或者找出这些文本应该归入哪个类别。意图部分是因为我们利用分类文本的能力来识别其意图。

意图分类对于构建我们可以自然互动的计算机系统非常有用。例如,计算机可以识别出当你说“打开灯”时,意图是打开灯。这被描述为自然语言接口。换句话说,你不需要按开关来打开灯,而是使用自然语言——一种在人类中自然演变出来的语言,而不是为计算机设计的语言——来传达这个意图。

**计算机通过我们提供的示例中的模式来学习——例如我们选择的单词、命令的措辞方式、我们如何将单词组合成特定类型的命令,以及我们在使用短命令与长命令时的不同,只是其中的一些例子。

在本章中,你将制作一个虚拟智能助手,它可以识别你的命令并执行你的指令(参见图 10-1)。

f10001

图 10-1: 在 Scratch 中制作智能助手

让我们开始吧!

创建你的项目

首先,你将训练机器学习模型来识别命令,以控制两个设备——风扇和灯——的开关。

在没有机器学习的情况下编写你的项目

正如我们在第七章中所看到的,通过先尝试编写一个没有使用机器学习的 AI 项目,来了解机器学习带来的差异是很有用的。如果你已经很好地理解了基于规则的方法与机器学习之间的区别,并且更愿意直接使用机器学习,可以跳过这一步。

  1. 访问 Scratch 网站 machinelearningforkids.co.uk/scratch3/

  2. 点击屏幕顶部的项目模板,如图 10-2 所示。f10002

    图 10-2: 项目模板包含了起始项目,可以节省你的时间。

  3. 点击智能教室模板。

  4. 复制图 10-3 中显示的脚本。f10003

    图 10-3: 使用规则编码智能助手

    该脚本要求你输入一个命令。如果你输入Turn``on(或offthe``fan(或lamp),Scratch 将播放相应的动画。让我们试试看。

  5. 通过点击绿色旗帜来测试你的项目。输入命令Turn on the fan并检查风扇是否真的开始转动。

    如果拼写错误会发生什么?如果更改措辞会发生什么(例如,“请开风扇”)?如果没有提到fan这个词会发生什么(例如,“我很热,我们需要一些空气!”)?

    为什么这些不起作用?

    你认为可以编写一个脚本来处理这四个命令的任何措辞吗?

回想一下第一章中的定义,我提到过,机器学习(ML)并不是创建 AI 系统的唯一方式。在这里,你通过基于规则的方法而不是机器学习(ML)创建了一个 AI 项目。通过尝试其他技术并了解它们的不足之处,你可以更好地理解为什么机器学习在许多项目中被优先选择。

训练你的模型

  1. 创建一个新的机器学习(ML)项目,命名为智能教室,并设置它学习识别你喜欢的语言的文本。

  2. 点击训练,如图 10-4 所示。f10004

    图 10-4: 第一阶段是收集训练示例。

  3. 点击添加新标签,如图 10-5 所示,创建一个名为fan on的训练桶。重复此步骤,创建三个名为fan offlamp onlamp off的训练桶。(下划线会自动添加。)f10005

    图 10-5: 创建训练桶以识别命令。

  4. 点击添加示例fan_on**桶中输入一个示例,说明你会如何请求别人打开风扇,如图 10-6 所示。f10006

    图 10-6: 收集如何请求打开风扇的示例

    它可以简短(例如,“fan on please”)或较长(“你现在能为我打开风扇吗?”)。

    它可以是礼貌的(“请你开一下风扇吗?”)或不太礼貌(“现在把风扇打开”)。

    它可以包含单词fanon(“你能开一下风扇吗?”)或两者都不包含(“这里太热了。我们能开点空气吗?”)。

    输入你能想到的尽可能多的示例,如图 10-6 所示。你需要至少五个示例,但我已经给了你六个,所以这应该不难!**

点击添加示例,在fan_off*桶中,如图 10-7 所示。

这次,输入你能想到的尽可能多的请求别人关闭风扇的示例。你需要至少五个示例。这些将是你的 ML 模型用来学习“关闭风扇”命令的示例。

尝试包括一些没有包含*风扇*或*关闭*这两个词的示例。

![f10007](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f10007.png)

图 10-7: 收集如何请求关闭风扇的示例

+   对最后两个桶执行相同操作,直到你为所有四个命令至少提供五个示例,如图 10-8 所示。![f10008](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f10008.png)

图 10-8: 智能助手项目的训练数据 * 点击屏幕左上角的**返回项目**。* 点击**学习与测试**。* 点击**训练新的机器学习模型**,如图 10-9 所示。

计算机会使用你写的示例来学习如何识别你的四个命令。这可能需要一点时间。

![f10009](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f10009.png)

图 10-9: 为你的智能助手训练一个 ML 模型。

+   在训练了 ML 模型后,我们测试它,以查看它在识别新命令方面的表现。在**测试**框中输入一个命令,如图 10-10 所示。

f10010

图 10-10: 测试你的 ML 模型

如果模型犯错,你可以回到训练阶段,添加更多的命令示例,尤其是模型经常出错的命令。这就像教师通过学生的考试成绩差来找出学生需要复习的科目,以帮助提高学生的理解。

一旦你添加了更多示例,回到学习与测试阶段,训练一个新的 ML 模型。然后再次测试它,看看计算机是否能更好地识别命令。

用 ML 编程你的项目

现在你已经有了一个能够识别你命令的 ML 模型,你可以重新创建之前的项目,使用 ML 来代替你之前使用的规则。

  1. 点击屏幕左上角的返回项目

  2. 点击创建

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开以在 Scratch 中打开一个新窗口。

    你应该会在工具箱中看到一组新的块,用于你的 ML 项目,如图 10-11 所示。

    f10011

    图 10-11: 你的机器学习(ML)项目将被添加到 Scratch 工具箱中。

  4. 点击顶部菜单栏中的项目模板,然后选择智能课堂模板。

  5. 复制图 10-12 中显示的脚本。

    当你给这个脚本命令时,它将使用你的 ML 模型来识别命令并执行指令。

f10012

图 10-12: 智能助手的 ML 方法

测试你的项目

通过点击绿色旗帜并输入各种不同方式表述的命令来测试你的项目。看看你的智能助手与没有使用 ML 版本相比表现如何。

审查并改进你的项目

你已经创建了自己的智能助手:一个虚拟版的亚马逊 Alexa 或苹果 Siri,可以理解并执行你的命令!你可以做些什么来改善它的表现?

使用你的模型的置信度评分

返回到“学习与测试”阶段时,你应该已经注意到测试模型时显示的置信度评分。这告诉你计算机对识别命令的信心程度。

现在返回到“学习与测试”阶段,尝试输入一些不符合计算机已学习识别的四个命令的内容。

例如,你可以尝试提问“法国的首都是什么?” 如图 10-13 所示。

f10013

图 10-13: 测试你的智能助手

我的机器学习模型将其识别为“灯开”,但它对这个分类的置信度为 0%。那是机器学习模型告诉我它没有识别出该命令的方式。

“法国的首都是什么?”看起来不像我给机器学习模型提供的任何示例。这个问题与我用于训练模型的示例中识别的模式不匹配。这意味着它无法自信地识别这个问题为它已训练的四个命令之一。

你的机器学习模型可能有高于 0 的置信度,但它应该仍然是一个相对较低的数字。(如果不是,尝试添加更多示例来训练你的机器学习模型。)

尝试其他与风扇或灯具无关的问题和命令。将你的机器学习模型给出的置信度评分与它识别实际的风扇开、风扇关、灯开和灯关命令时显示的置信度评分进行比较。你的机器学习模型在正确识别某个命令时给出的置信度评分是什么?

一旦你熟悉了你的机器学习模型的置信度评分如何工作,你可以在你的 Scratch 项目中使用它。更新你的脚本,使其看起来像图 10-14 所示。

现在,如果模型的信心值不到 80%,它将显示一个“抱歉”的回应,持续 2 秒钟,并且不会执行该操作。

你需要将脚本中的80值更改为与你的机器学习模型行为相匹配的百分比。

你还能做些什么来改善你的项目?

f10014

图 10-14: 在你的机器学习项目中使用置信度评分

使用语音输入代替键盘输入

你可以通过使用语音输入代替键盘输入,使你的项目更像现实中的智能助手。

在工具箱中,点击“扩展库”图标(看起来像两个方块和一个加号),添加语音转文本扩展,并更新你的脚本,如图 10-5 所示。

f10015

图 10-15: 为你的智能助手添加语音识别

你还能做些什么来改善你的项目?

收集训练数据

机器学习通常用于识别文本,因为它比编写规则更快。但正确训练模型需要大量的例子。要在现实世界中构建这些系统,我们需要比单纯自己输入所有例子更高效的收集方法。例如,与其让一个人写 100 个例子,不如让 100 个人每人写一个例子。或者是 1000 个人,或者是 10000 个人。

如果你能找出你的机器学习模型在哪些地方出错,你就可以收集更多的例子添加到训练集。例如,如果机器学习模型的置信度得分很低怎么办?或者如果某人不断以稍微不同的方式给出相似的命令怎么办?这可能意味着机器学习模型没有正确识别命令或没有按照用户的意图执行操作,这对你的训练来说是有用的反馈。如果用户点击了“我不满意”的大拇指向下按钮怎么办?如果他们最终按下了一个按钮去做某事怎么办?如果他们听起来越来越烦躁怎么办?

有很多方法可以猜测某些事情没有做得很好。每当发生这种情况时,这都是你可以收集的一个例子,并将其添加到你的训练集,以便下一个更新的机器学习模型在下一次能够做得更好。

我们使用所有这些技术(从大量人群中收集训练例子、获取用户反馈等等)来帮助我们构建可以理解你意思的计算机和设备。

你学到了什么

在本章中,我们研究了机器学习是如何用来识别文本的含义,以及它如何用来构建能够理解我们意思并按照我们要求行动的计算机系统。

在你的项目中,你使用了与智能助手相同类型的机器学习技术,例如亚马逊的 Alexa、谷歌的 Google Home、微软的 Cortana 和苹果的 Siri。 自然语言界面 让我们通过使用像英语这样的语言告诉设备我们想让它们做什么,而不是仅仅通过按屏幕或按钮来操作。

当你询问智能手机时间,或要求设置闹钟、定时器,或播放你最喜欢的歌曲时,计算机需要对该命令进行分类。它需要将你选择的一系列词语进行分析,识别其意图。

智能手机和智能助手的制造商通过制定一系列类别来训练机器学习模型,以识别用户命令的含义——所有他们认为用户可能想要给出的命令。然后,对于每个命令,他们收集了大量的例子,展示了用户可能会如何给出这些命令。

在这个项目和现实世界中,过程是这样的:

  1. 预测你可能给出的命令。

  2. 收集每个命令的例子。

  3. 使用这些例子来训练机器学习模型。

  4. 编写脚本或代码,让计算机在识别到每个命令时执行相应的操作。

要创建一个真正的智能助手,你需要为成千上万个命令重复这些步骤,而不仅仅是四个。并且,每个命令你都需要成千上万的示例。

在下一章,你将利用这个能力构建能够回答问题的程序。*******

第九章:聊天机器人

Alphabet-I在上一章中,我们讨论了意图分类**:构建能够识别文本含义(意图)的机器学习系统。我们讨论了意图分类的一种常见应用,即构建能够理解我们指令并执行命令的智能助手。

在本章中,我们将讨论如何利用能够理解文本含义的机器学习模型来构建问答(QA)* 系统。QA 系统能够识别并回应我们的问题,从一组文档中自动发现答案。*

与搜索引擎返回网页列表不同,QA 系统会对特定问题返回具体答案。这更具挑战性,因为它要求对问题及可能包含答案的网页或文档的含义有深入的理解。例如,问题“克利夫兰总统的妻子是谁?”的正确答案是“弗朗西斯·福尔森”,而不是包含美国总统传记的文档列表。

QA 一直是人工智能研究的目标和活跃领域。例如,美国国家标准与技术研究院(NIST)自 1999 年起每年举办 QA 竞赛,大学和公司竞争看哪种计算机系统能够正确回答最多的问题。

或许更为人知的是 IBM 的 QA 计算机系统 Watson,正如第一章提到的,它曾参加美国电视智力竞赛节目Jeopardy!并击败了两位冠军。Jeopardy!以提出复杂且有时具有挑战性的问题而闻名,涵盖各种主题,因此它是对计算机系统的一项特别具有挑战性的测试。

聊天机器人**,模拟人类对话的程序,对于计算机而言,比 QA 系统简单得多,原因有很多。首先,聊天机器人通常是为了回答单一相对较小且特定的主题的问题,而 QA 系统则试图回答关于任何主题的问题。

此外,聊天机器人回复通常是预先准备好的。简单的聊天机器人通常不期望自己能够找到答案。复杂的聊天机器人可能有更详细的脚本,允许跟进或澄清问题,但一般原则是相同的。

聊天机器人正变得越来越普遍。它们通常用于客户服务,帮助公司回答公众关于产品和服务的问题。常见问题可以快速有效地得到回答,而更复杂的问题则会迅速转交给人工客服代表。

你可以在许多网站和手机应用程序上找到聊天机器人和虚拟助手——它们可以接收你的比萨订单,推荐衣物和时尚配件,回答关于天气的问题,管理你的银行账户,安排会议和预约,寻找餐厅并预定座位,提供帮助你管理疾病的建议等等。

在这个项目中,你将创建自己的聊天机器人,并训练它回答你选择的主题上的问题(如图 11-1 所示)。我们将遵循以下过程:

  1. 预测用户可能会问的问题。

  2. 收集这些问题的提问方式示例。

  3. 使用这些示例来训练机器学习模型。

  4. 准备计算机在识别到每个问题时应该给出的答案。

f11001

图 11-1: 聊天机器人使用机器学习回答我们的问题。

让我们开始吧!

构建你的项目

决定你希望你的聊天机器人回答关于什么问题。这个主题可以是任何你喜欢的,以下是一些建议,如果你想不出主题,可以参考:

  • 你最喜欢的书

  • 你最喜欢的电视节目

  • 你最喜欢的运动队

  • 你最喜欢的演员、作者或音乐艺术家

  • 太空、行星和太阳系

  • 恐龙

  • 一段历史时期,比如古罗马或维京时代

在本章的截图中,我制作了一个回答关于月亮问题的聊天机器人。

准备你的角色

访问 Scratch 网站 machinelearningforkids.co.uk/scratch3/,并为你的问答聊天机器人添加一个背景和角色。

确保你创建的场景与主题匹配。例如,如果你制作一个聊天机器人来回答关于罗马帝国的问题,你可以绘制一位罗马军团士兵在战场上的图像。

对于我的关于月亮的聊天机器人,我绘制了一个太空主题的背景,如图 11-2 所示。

f11002

图 11-2: 为你的聊天机器人角色创建自定义背景。

对于我的聊天机器人角色,我制作了一个月亮精灵,并添加了卡通眼睛和嘴巴,如图 11-3 所示。

f11003

图 11-3: 为你的聊天机器人角色创建自定义精灵。

如果你不想自己绘制,你可以点击“选择背景”或“选择精灵”来选择一个现成的选项。或者,你也可以点击“上传精灵”或“上传背景”,使用你从网上保存的图片。例如,如果你正在制作一个关于你最喜欢的乐队的聊天机器人,你可以使用他们的照片。如果你正在制作一个关于学校或公司的聊天机器人,你可以使用它们的标志。

一旦你创建了你的聊天机器人场景,确保保存你的 Scratch 项目,因为之后会用到。如果你不确定如何操作,请阅读介绍部分的“保存你的工作”一节,第 xxiv 页。

训练你的模型

  1. 创建一个新的机器学习(ML)项目,命名为Chatbot,并设置为学习识别你喜欢的语言中的文本。

  2. 点击训练,如图 11-4 所示。f11004

    图 11-4: 训练是机器学习项目的第一阶段。

  3. 想一想人们可能会问的关于你选择的主题的最常见问题。

    对于我的主题——月亮,我猜人们会问月亮有多大。

    当你选择了第一个问题后,点击添加新标签,如图 11-5 所示,输入一个或两个词,代表这个问题。例如,我为我的训练桶标签使用了“大小”一词。

    f11005

    图 11-5: 创建一个桶来表示第一个问题的示例。

  4. 点击添加示例,**并输入一种提问方式,如图 11-6 所示。f11006

    图 11-6: 添加提问第一问题的不同方式示例。

    思考不同的人可能会如何表述这个问题。现在不需要担心答案。

    输入尽可能多的提问方式,确保至少有五个示例。这些示例将用于训练 ML 模型,帮助其识别用户何时提出这个问题。

    如果你的聊天机器人看起来像你正在提问的主题(比如我的卡通月亮正在回答关于月亮的问题),那么你可以包含一些向角色提问的示例问题,比如“你有多大?”**

*** 思考更多关于你主题的问题类型。再次点击添加新标签为每种问题类型创建一个训练桶,并点击添加示例,以添加如何提问该问题的示例。和之前一样,每种问题类型至少需要五个示例。

对于我的项目,我从四种类型的问题开始,每种问题提供五个示例(见图 11-7)。你的项目会根据主题的不同以及你能想到的问题数量而有所变化。  

![f11007](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f11007.png)  

图 11-7: 写下不同类型的问题示例,用户可能会提问这些问题。  

对于你的主题,你需要猜测最常见的问题,并想象人们可能提出这些问题的不同方式。现实中的 ML 项目通常会从实际客户或用户那里收集这些示例,以便计算机能学习到实际的提问方式和内容。例如,一个商店正在训练虚拟助手回答关于电视设置的问题时,会记录客户曾经打电话询问过的问题;或者一个银行正在训练虚拟助手回答关于储蓄账户的问题时,会记录客户在银行网站上通过聊天窗口提问的问题。这些公司可以利用真实的提问示例来训练他们的 ML 模型。  

我们在第三章中看到,当机器学习(ML)模型使用与项目需求相似的数据进行训练时,它们能提供更好的答案。你了解到,如果想让 ML 模型识别不同动物的照片,你应该用照片进行训练;如果你想让它识别卡通图像,则应用卡通图像进行训练。  

文本 ML 模型的工作方式类似。当我们用人们实际提问的方式训练它们时,它们会给出更好的答案。对现实世界 ML 项目来说,最好的做法是找现有的示例,而不是像我们在这个项目中所做的那样自己编造问题。*   点击屏幕左上角的**返回项目**。*   点击**学习与测试**,如图 11-8 所示。![f11008_new](https://github.com/OpenDocCN/greenhat-zh/raw/master/docs/ml-kid/img/f11008_new.png)

图 11-8: 学习与测试是 ML 项目的第二个阶段。

+   点击**训练新的机器学习模型**,如图 11-9 所示。

计算机会使用你编写的示例来学习如何识别人们关于你选择的主题提出的问题。这个过程可能需要一分钟左右的时间。计算机利用这段时间学习每个训练类别中的问题的共性,例如你使用的词汇、问题的表述方式、问题的长短等。

f11009

图 11-9: 使用你编写的示例训练 ML 模型。

准备你的项目

现在你已经有了角色和 ML 模型,接下来是将它们结合起来创建你的聊天机器人。

  1. 点击屏幕左上角的返回项目

  2. 点击制作,如图 11-10 所示。f11010

    图 11-10: 制作是 ML 项目的第三个阶段。

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开。Scratch 将会以新的区块集打开你的聊天机器人 ML 项目。

  4. 点击文件从计算机加载,如图 11-11 所示,打开你之前保存的带有聊天机器人场景的项目。f11011

    图 11-11: 打开之前创建的场景项目。

  5. 复制图 11-12 中显示的脚本。f11012

    图 11-12: 创建简单聊天机器人的示例脚本

    这个脚本会要求你输入一个问题,然后使用你训练的 ML 模型来识别你提问的内容。

    你的脚本应该和我的不同,因为我的脚本包含了关于月球的问题,这些问题是我用来训练我的 ML 模型的。一定要使用你自己的问题类型。

    你还需要在这里添加你选择的主题的答案。如果你不知道答案,现在正是进行一些研究,找出你的聊天机器人应该给出哪些答案的时候!

  6. 点击文件保存到你的计算机以保存你的项目。

测试你的项目

点击绿色旗帜并尝试向你的聊天机器人提问。它能给出正确答案吗?

审查并改进你的项目

你已经创建了一个简单的聊天机器人,能够识别并回答你选择的主题的常见问题。做得好!

你可以做些什么来改进你的聊天机器人?

回应与记录用户报告的错误

AI 系统无法正确理解所有内容,因此你可以通过训练机器学习模型来处理错误,从而改进你的机器学习项目。处理错误的一个好方法是训练你的机器学习模型,识别出有人对它给出的结果表示抱怨。

回到训练阶段,添加一个新的训练桶,命名为mistake。并按图 11-13 所示,填充用户可能抱怨机器学习模型出错的示例。

例如,你可以将That's not what I meant添加到错误桶中。

f11013

图 11-13: 收集用户可能抱怨模型犯错误的示例。

一旦你添加了至少五个示例,你需要回到学习与测试阶段,训练一个新的机器学习模型。

当你的聊天机器人识别到有人抱怨时,它可以给出的最简单回应就是向他们道歉。按图 11-14 所示更新你的脚本。

f11014_new

图 11-14: 更新你的脚本,使其在用户抱怨时进行道歉。

你可以通过记录错误来让你的项目变得更好。例如,我创建了一个新列表,叫做mistakes(为此,点击变量在工具箱中,点击创建列表,并输入名称mistakes),并按照图 11-15 所示更新了脚本,这样如果有人抱怨他们得到的答案,他们的问题就会被添加到列表中。

f11015

图 11-15: 保持记录聊天机器人出错的问题。

当我问,“谁是第一个登上月球的人?”时,我的模型告诉我月球离地球有多远。然后,当我回复“不是,我不是问这个”时,我关于第一个登月者的问题被添加到了错误列表中。

追踪错误是提高实际机器学习项目的常见技术。错误列表作为示例集合,用于训练机器学习模型的下一个版本。

你还可以做些什么来改进你的聊天机器人?

识别用户不高兴的时刻

你的聊天机器人用户可能不会总是告诉你机器学习系统出错了。那么,你能通过其他方式发现它犯错误吗?

在第七章中,你学到了如何训练机器学习模型识别写作中的语气和情感。你可以将该技术与这个项目结合起来,让你的聊天机器人识别出用户何时生气或恼火。

训练两个机器学习模型:一个用来识别问题的含义(就像你刚刚做的那样),另一个用来识别情感(比如“恼火”和“没有恼火”,类似于你在第七章中的项目)。如果第二个机器学习模型非常确信用户听起来很恼火,那么你的聊天机器人应该道歉,而不是再次尝试回答问题。

检测用户的语气,并在必要时道歉,是一种常见的技术,通常用于与公众沟通的聊天机器人,比如客服。人们如果发现某些技术不断误解他们,可能会感到恼火。如果系统能够识别出情况不佳并进行道歉,客户可能会更开心。在这种情况下,这些系统通常还会请求一位人类客服代表或经理加入对话并提供帮助。

还有什么其他方法可以改进你的项目吗?

只有在机器学习模型有信心时才回答问题

识别用户是否感到恼火是一件好事。但通常最好是避免一开始就让用户感到恼火!你可以利用置信度得分来防止你的聊天机器人给出错误的答案。

在第七章中你学到,置信度得分是由机器学习模型返回的一个百分比,表示模型对自己正确识别所训练内容的信心。

在这个项目中,如果置信度得分较低,意味着机器学习模型不确定是否理解了问题。你可以按照图 11-16 中所示的方式修改你的聊天机器人代码,使得如果模型未能理解问题,聊天机器人会道歉,而不是简单地猜测答案,并且将该问题添加到未来用于训练模型的示例列表中。

f11016

图 11-16: 通过记录问题来处理低置信度得分,以便在未来的训练中使用。

机器学习与伦理

这些改进你项目的建议基于现实世界中常见的机器学习项目方法。正如你所看到的,收集训练数据需要大量的时间和精力。为了节省时间,一些使用机器学习的公司收集足够的训练示例,以使机器学习模型基本能工作,然后让他们的客户开始使用它(有时将其描述为测试版来解释为什么它仍然会犯一些错误)。之后,他们会收集客户在使用机器学习模型时遇到的不良体验,以便改进训练数据。这可能意味着收集那些机器学习模型置信度得分较低的客户提问示例,或者客户报告说答案没有帮助。公司随后会审查这些客户问题,并将其分类到正确的训练数据集。

公司表示,他们这样做是因为这意味着他们的机器学习模型在未来能够更好地回答问题。他们用来训练的示例越具有代表性,系统就能提供更好的答案。但有时候,这会让那些没有意识到智能设备制造商可能会记录他们向设备提出的问题的人感到惊讶。试着在网上搜索关于你最喜欢的智能设备制造商监听用户提问的新闻故事。你能找到多少篇文章?你如何看待这些反应?

你认为这对创建机器学习系统的人员责任意味着什么?你认为机器学习开发者从他们的客户或用户那里收集训练样本是道德的吗?你认为他们应该告诉用户这一点吗?如果有用户不知道什么是训练样本,或者不知道它们对训练机器学习系统为何如此重要,你会如何向他们解释?

你所学到的

在本章中,你学到了机器学习模型可以被训练来理解和回应人们提出的问题。你了解了问答系统(QA)与其更简单的对手——聊天机器人之间的区别。接着,你设计了一个自定义聊天机器人,并训练了一个机器学习模型,以识别你选择的主题中最常见的问题。你看到了几种可以扩展聊天机器人以提高其性能和准确性的方法,比如跟踪错误、根据客户的反馈和语气做出适当的回应,并使用置信度评分来决定何时将问题转交给人工处理(例如在客户服务环境中)。最后,你了解了在使用真实人类反馈训练机器学习模型时需要考虑的一些伦理问题。

在下一章,我们将切换话题,首次训练一个机器学习模型来识别简化版视频游戏吃豆人中的数字。*****

第十章:避开怪物

Alphabet-A我和机器学习对未来电脑游戏具有激动人心的潜力,例如能够理解你话语和动作的电脑游戏角色。目前已经有一些游戏,游戏角色的行为类似于你在上一章中学习到的聊天机器人。然而,真正智能的游戏机会是巨大的,它们能够在游戏过程中自我适应。

在本章中,我们将讨论相反的情况:不是 AI 如何促进游戏开发,而是游戏如何在 AI 开发中发挥作用。

游戏提供了一个具有明确目标的模拟环境,一个收集训练样本的方法,以及衡量效果的方法,这使得它们成为计算机系统学习研究和开发的绝佳平台。

吃豆人(和小姐吃豆人)是一个经典的电脑游戏,经常被用于 AI 研究。小姐吃豆人 AI 竞赛,学者们提交机器学习系统,竞争看哪个系统在玩游戏时表现最好,自 2007 年以来已举行多次,并且至今仍被用作 AI 学生和研究人员的任务。*

在本章中,你将尝试训练一个机器学习系统来玩简化版的吃豆人*,目标是在迷宫中引导角色避开怪物(参见图 12-1)。

开始吧!

f12001

图 12-1: 我们可以训练一个机器学习系统来玩的简单视频游戏

构建你的项目

在我们开始之前,先亲自体验一下游戏,了解我们将训练计算机做什么。首先,访问machinelearningforkids.co.uk/scratch3/,然后点击顶部菜单栏中的项目模板,如图 12-2 所示。

f12002

图 12-2: 从项目模板菜单中访问游戏。

点击避开怪物游戏,如图 12-3 所示。

f12003

图 12-3: 在项目模板列表中点击避开怪物

在这款游戏中,你扮演角色nano,它从舞台的左下角开始。你的目标是尽可能长时间避免怪物,怪物从舞台的右上角开始。

你可以通过方向键控制 nano 改变方向。Nano 只能沿着网格移动,所以你只能上下左右移动,不能斜着移动。

当你没有按下方向键时,nano 会继续沿着你上次按下的方向前进。

Nano 的移动速度不能超过怪物。游戏的代码使用定时器,使得 nano 和怪物每秒只能移动一次。

有两堵墙挡在路上。无论是 nano 还是怪物,都不能穿过这些墙。

尝试一下游戏。点击右上角控制面板中的全屏图标,然后点击绿色旗帜。

你能躲避怪物多久?

描述游戏状态

游戏板可以表示为图形,如图 12-4 所示。

f12004

图 12-4: 将游戏板看作是一个带有 x 轴和 y 轴的图形。

使用这个图形,你可以将 nano 和怪物的位置描述为一对坐标。例如,在图 12-4 中,怪物的位置是x = 7,y = 3。

我们将使用这种游戏表示方式来向计算机描述游戏。

我们希望给计算机四个数字,让它决定让 nano 向上、向下、向左或向右移动,以躲避怪物。

例如,如果我们输入图 12-5 中显示的坐标,计算机可能决定让 nano 向上移动。

f12005

图 12-5: Nano 位于x = 5,y = 5,怪物位于x = 7,y = 3。

这个项目的目标是训练一个机器学习模型,决定最佳方向以躲避怪物。

训练你的模型

为了训练计算机玩游戏,你需要收集游戏进行时的示例。最好的方法是你自己玩游戏,并利用你的操作来训练计算机。

第一步是准备存储你所做动作示例的训练桶。

  1. 访问* machinelearningforkids.co.uk/*。创建一个新的机器学习项目,命名为避免怪物,并设置为学习识别数字。

  2. 点击添加值,输入nano x作为值名称,并将值类型设置为数字。点击添加另一个值,然后添加三个值,分别命名为nano ymonster xmonster y,如图 12-6 所示。添加完这四个值后,点击创建

    这些值将存储图形中两个角色的坐标。

    f12006

    图 12-6: 为“避免怪物”项目准备值。

  3. 点击训练,如图 12-7 所示。f12007

    图 12-7: 点击训练以准备你的训练桶。

  4. 点击添加新标签,如图 12-8 所示,为 nano 可以移动的四个方向创建四个训练桶。命名为go leftgo rightgo upgo down。(下划线会自动添加。)f12008

    图 12-8: 为 nano 可以移动的四个方向准备四个训练桶。

    例如,假设 nano 位于坐标x = 2,y = 3,而怪物位于坐标x = 6,y = 7,当你在玩游戏时,如果你按下右箭头让 nano 向右移动,这组数字将被添加到 go_right 训练桶中,如图 12-9 所示。

    f12009

    图 12-9: 你在玩游戏时的移动将被添加到训练桶中。

    下一步是收集大量的示例,用于训练 ML 模型。我们将通过玩游戏来收集训练示例。

  5. 点击Back to project,然后点击Make,如图 12-10:所示。f12010

    图 12-10: 点击Make以在 Scratch 中使用你的项目。

  6. 点击Scratch 3,如图 12-11:所示。f12011

    图 12-11: 点击Scratch 3返回到 Scratch。

  7. 点击straight into Scratch,如图 12-12:所示。

  8. 点击顶部菜单栏中的Project templates

  9. 点击Avoid the monster再次打开模板,这一次包含来自你 ML 项目的积木块。f12012

    图 12-12: 即使你还没有 ML 模型,点击straight into Scratch

  10. 点击屏幕右下角的Stage背景。在代码区域,找到第一个When Green Flag clicked脚本,如图 12-13:所示。f12013

    图 12-13: 在代码区域找到第一个较短的绿旗脚本。

  11. 在工具箱中点击Avoid the monster,将你训练桶的名称块拖入脚本,如图 12-14:所示。确保方向匹配;例如,将go_left拖入set left to块中。f12014

    图 12-14: 将你的项目标签添加到脚本中。

  12. 在代码区域向下滚动,找到define nano-decision脚本,如图 12-15:所示。f12015

    图 12-15: 找到define nano-decision脚本。

  13. 从工具箱中的Avoid the monster组中,拖动一个新的add training data块到脚本中,如图 12-16:所示。这个积木将把你在玩游戏时的每个动作添加到你的训练示例中。

    在工具箱中点击Variables,然后将图 12-16:中显示的积木拖入add training data块。每次移动时,角色和怪物的坐标将与所做的决策一起添加到你的训练示例中。

    f12016

    图 12-16: 更新define nano-decision脚本。

  14. 现在你需要保存项目,以便以后返回。在顶部菜单栏的Scratch Project文本框中,输入Avoid the monster TRAINING,如图 12-17:所示。这表明这是用来训练你的 ML 模型的项目版本。

    然后点击FileSave to your computer

    f12017

    图 12-17: 在保存此版本之前更新项目名称。

  15. 玩游戏!

    在屏幕右上方的控制选项中,点击全屏图标,然后点击绿色旗帜开始游戏。使用方向键控制 nano 角色,就像你之前做的那样。

    尽力避免怪物,尽可能长时间保持躲避。你玩得越好,机器学习模型学习得也就越好。

    当你觉得玩得足够久时,点击红色的停止标志。

    如果你返回到训练阶段,可以看到你所做的动作,如图 12-18 所示。你可能需要刷新页面以查看最新的例子。

    f12018

    图 12-18: 你在游戏中做的动作应该会显示在你的训练桶中。

  16. 再玩几局,直到你认为已经收集了所有 nano 可能遇到的情况的例子。

  17. 现在是时候使用你收集的例子训练机器学习模型了。点击返回项目,然后点击学习与测试,如图 12-19 所示。f12019

    图 12-19: 点击学习与测试,使用你收集的动作训练模型。

  18. 点击训练新机器学习模型,如图 12-20 所示。

f12020

图 12-20: 使用你玩的动作训练一个新的机器学习模型。

测试你的游戏

你已经训练了一个机器学习模型来玩这个游戏!测试你模型的最佳方式是让机器学习模型控制 nano 角色,看看它能躲避怪物多久。

我们需要修改 Scratch 项目,使其能够由机器学习模型控制,而不是由方向键控制。

  1. 在代码区域找到when arrow key pressed脚本。共有四个脚本,如图 12-21 所示:when left arrow key pressedwhen right arrow key pressedwhen up arrow key pressed,和when down arrow key pressed

    删除这些脚本,可以通过点击每个模块并按删除键,或者通过右键点击每个模块并选择删除模块。确保删除所有四个脚本中的每一个模块,这样你就无法通过任何方向键控制角色了。

    f12021

    图 12-21: 删除四个when arrow key pressed脚本,这样你就无法再控制 nano 了。

  2. 找到你之前更新的define nano-decision模块。使用工具箱中的变量避免怪物组中的模块,重新更新脚本,使其看起来像图 12-22 所示。

    现在,你不再让计算机从你的方向键学习,而是希望计算机使用你的机器学习模型做出决策。

    f12022

    图 12-22: 更新define nano-decision脚本,以便你的机器学习模型控制游戏。

  3. 找到较长的when Green Flag clicked脚本,删除wait 1 second模块。

    这样可以让游戏运行得稍微快一些,这样你就不必等每个动作。更新后的脚本将如图 12-23 所示。(箭头显示了我移除该积木前的位置。)

    f12023

    图 12-23: 移除 wait 1 second 块。

  4. 现在你需要再次保存你的项目,以便稍后能返回。此次,在文本框中输入名称Avoid the monster TESTING,这样你就能知道这个版本的项目是让机器学习模型来玩的。然后,点击文件保存到你的电脑

  5. 点击全屏图标,然后点击绿色旗帜。

    看着你的机器学习模型尝试保护纳米免受怪物的攻击(图 12-24)!

f12024

图 12-24: 你的机器学习项目运行中

审查并改进你的项目

你的机器学习模型表现如何?

它成功避开怪物的时间越长,表现就越好。如果你做得很好,它将能够永远避开怪物。因为怪物的移动速度和纳米一样,只要你的机器学习模型不犯错误,纳米有可能永远领先怪物。

训练量的差异有多大?

尝试打开你训练版的 Scratch 项目,通过玩游戏稍微长一点时间来添加更多的训练示例。然后,返回到学习与测试阶段,使用你额外的训练示例来训练一个新的机器学习模型。最后,打开你测试版的 Scratch 项目,观看新的机器学习模型玩游戏。

额外的训练有帮助吗?

尝试多做几次,看看训练量如何影响你的机器学习模型的表现。

你在这个项目中训练的机器学习模型类型被称为决策树分类器,因为模型根据下一步的决策方式可以绘制成一种树形结构,如图 12-25 所示。要查看你的机器学习模型的图示,在学习与测试阶段,点击描述你的模型!,位于测试按钮旁边。

*f12025

图 12-25: 决策树

决策树图示有助于你理解机器学习模型如何对每一步的结果做出预测

树中的每个框代表一个测试;例如,怪物 x < 3 意味着“怪物的 x 坐标小于 3 吗?”如果测试为真,树将跟随左箭头。如果测试不成立,树将跟随右箭头。

机器学习模型从树的顶部开始,按照测试确定的箭头一路往下,直到到达树的底部。

要查看决策过程的示例,请在决策树右侧的框中输入 nano 和怪物的坐标,然后点击测试。图表将突出显示你的机器学习模型如何对这些坐标进行预测。当没有更多箭头可跟随并且到达树的底部时,你将找到最终的预测结果,如图 12-26 所示。

f12026

图 12-26: 突出显示用于预测移动结果的坐标

使用不同的坐标集测试你的模型,以了解它是如何学会做出预测的。

你学到了什么

在本章中,你学到了机器学习模型可以通过训练来识别数字集合中的模式。你使用了一个决策树分类器来训练一个模型,模拟玩简化版的游戏吃豆人,利用一组 x 和 y 坐标来基于预测结果决定其下一步动作。

决策树并不是训练机器学习模型以基于数字进行预测的唯一方法,但它是一个受欢迎的选择,因为它非常快速且是最容易理解的技术之一。在前面的章节中,你一直在使用神经网络,虽然它们可能更强大,但更复杂且难以理解。

你已经看到,与之前训练的其他机器学习模型一样,随着你收集更多的训练示例,模型的表现会逐渐提高。在下一章,你将了解训练数据量对机器学习项目的影响。**

第十一章:井字游戏

Alphabet-I 在上一章中,你看到了像吃豆人(Pac-Man)这样的计算机游戏是如何用于机器学习发展的。井字游戏(也叫零与叉,或 X 与 O)已经被用来帮助人们了解机器学习更长时间了。

例如,英国人工智能研究员唐纳德·米奇(Donald Michie)于 1960 年设计了MENACE,即机器可教零与叉引擎(Machine Educable Noughts and Crosses Engine)(见图 13-1)。它是第一个能够学会完美下井字游戏的程序之一。MENACE 的演示使用了火柴盒和彩色玻璃珠,这提醒我们,许多机器学习背后的原则是在几十年的时间里发展起来的。

f13001

图 13-1: 唐纳德·米奇的机器可教零与叉引擎(MENACE)的重建(来源:Matthew Scroggs,commons.wikimedia.org/wiki/File:Mscroggs-MENACE-cropped.jpg

然而,井字游戏并不是唯一被用于推动人工智能发展的游戏。象棋是另一个很好的例子。在第一章中,我提到了 IBM 的计算机深蓝(Deep Blue),它击败了国际象棋世界冠军加里·卡斯帕罗夫。这是几十年努力的结果,目的是让计算机能够下象棋。早在 1950 年代,数学家艾伦·图灵就写了一篇名为《数字计算机在游戏中的应用》的论文,他在其中提出了一个问题:“是否能制造出一种机器来下象棋,并且能够通过不断的游戏积累经验,逐步提高其棋艺?”

近年来,人工智能社区将注意力转向了更复杂的游戏,比如围棋(Go)。由于围棋中有极其庞大的潜在走法和策略,依靠像深蓝那样的“暴力破解”方法(计算机检查所有可能的未来走法和棋局)是行不通的。2016 年,Google DeepMind 的计算机 AlphaGo 在人工智能研究中取得了一个里程碑,当时它击败了围棋世界冠军李世石(Go)。

创建神经网络的工具变得越来越容易使用,而我们的计算机也变得更快更强大,超越了人工智能学生和研究人员的领域。如果你在网上搜索“超级马里奥神经网络”,你会找到数十个训练机器学习模型玩像超级马里奥世界*这样的游戏的例子和教程。

然而,在本章中,我们将专注于基础内容。我们将在 Scratch 中构建唐纳德·米奇的 MENACE 设计的简化版本,并训练一个机器学习模型来玩井字游戏(见图 13-2)。

f13002

图 13-2: 井字游戏是一个非常适合机器学习研究的游戏。

让我们开始吧!

构建你的项目

你可能已经知道如何玩井字游戏,但让我们快速在 Scratch 中试一试,看看如何规划将机器学习引入其中。

访问machinelearningforkids.co.uk/scratch3/,然后点击顶部菜单栏中的项目模板,如图 13-3 所示。

在模板列表中,点击圈圈叉叉。该模板加载了一个简单的井字游戏在 Scratch 中。点击绿色旗帜试一试。

你在放置叉(X),计算机在放置圈(O)。计算机的策略并不聪明,但在这一章中,你将让它变得更智能。

f13003

图 13-3: 从顶部菜单访问项目模板。

尝试找出计算机遵循的规则。计算机下一步走的位置逻辑都在代码区,因此你可以查看那里的脚本,看看自己是否猜对了。

有许多方式可以表示游戏棋盘,但为了开始,我们将使用一种非常简单的方法:给棋盘上的每个格子编号,从 1 到 9,如图 13-4 所示。

f13004

图 13-4: 一种表示棋盘的方法是给格子编号。

在 Scratch 项目模板中,格子也通过数字表示,如图 13-5 所示。

f13005

图 13-5: 在 Scratch 项目模板中定义的游戏棋盘表示

我们还需要描述棋盘上圈圈和叉叉的位置。我们希望从任何一方的胜利中学习(无论是圈圈还是叉叉获胜),因此为了清晰起见,我们会用玩家来描述获胜方的走法,用对手来描述失败方的走法。

例如,假设棋盘在游戏早期的样子像图 13-6,最终是叉(X)获胜。

f13006

图 13-6: 一个示例游戏棋盘状态

我们可以这样描述这个棋盘:

左上 对手
上中 玩家
右上 对手
左中
中中
中右
左下
底部中间
右下

我们希望训练一个机器学习模型,使得给定像这样的棋盘状态时,它能够选择下一步走在哪里。为了实现这一目标,我们需要训练示例,这些示例包含了导致胜利的决策。每个示例需要包括:

  • 走棋前棋盘的样子

  • 哪一步是走的

训练示例仅会记录玩家获胜方的走法。如果你(叉)赢得了游戏,那么你希望用叉(X)的走法来训练模型。如果计算机(圈)赢得了游戏,那么你希望用圈(O)的走法来训练模型。

准备你的游戏

和上一章的吃豆人风格游戏一样,收集训练示例的最佳方法不是通过键入它们,而是亲自玩游戏。

第一步是准备训练数据桶,用于存储你所做的每个动作的示例。你将需要九个训练数据桶,每个桶对应游戏中的每个可能选择。

  1. 访问https://machinelearningforkids.co.uk/,创建一个新的机器学习项目,命名为Tic Tac Toe,并设置为学习识别数字。

  2. 点击添加一个值,输入TopLeft作为值名称,将值类型设置为多选。在选择项下,添加三个选择项:EMPTYPLAYEROPPONENT。然后点击添加另一个值,并添加八个具有相同三个选择项的多选值:

    1. TopMiddle

    2. TopRight

    3. MiddleLeft

    4. MiddleMiddle

    5. MiddleRight

    6. BottomLeft

    7. BottomMiddle

    8. BottomRight

    确保所有九个值的选择拼写完全相同,这样计算机才能知道每个游戏板上的空格所能选择的内容是相同的。如果你打错字,点击选择旁边的红色 X 删除它,然后重新添加。

    完成后,你的屏幕应显示如图 13-7 所示。

    f13007

    图 13-7: 准备项目

  3. 点击创建

  4. 点击训练,如图 13-8 所示。f13008

    图 13-8: 点击训练来准备训练数据桶。

  5. 点击添加新标签,如图 13-9 所示,并创建九个训练数据桶来表示游戏板上的九个格子。命名为top lefttop middletop rightmiddle leftmiddle middlemiddle rightbottom leftbottom middlebottom right。(下划线将自动添加。)f13009

    图 13-9: 井字游戏的训练数据桶

    这些数据桶是存储你的训练示例的地方。例如,回顾图 13-6 所示的游戏板状态。如果玩家的下一步(X)落在middle_middle格子中,游戏板的状态将记录在训练数据中,如图 13-10 所示。

    f13010

    图 13-10: 井字游戏的训练示例

    下一步是收集大量示例来训练机器学习模型。

  6. 点击屏幕左上角的返回项目

  7. 点击制作

  8. 点击Scratch 3,然后点击直接进入 Scratch,如图 13-11 所示。f13011

    图 13-11: 点击直接进入 Scratch,即使我们还没有机器学习模型。

  9. 再次打开井字游戏项目模板。

    代码与之前打开该模板时相同,但现在你在工具箱中有额外的模块用于你的项目。

  10. 点击屏幕右下角的 舞台 背景。在代码区域,找到 图 13-12 中所示的 setup model labels 脚本。该脚本设置了整个项目中使用的常量。f13012

    图 13-12: 找到 setup model labels 脚本。

  11. 在工具箱中,点击 井字游戏,并将训练桶的名称块拖入 setup model labels 脚本,如 图 13-13 所示。确保位置匹配;例如,将 top_left 拖入 set top_left to 块中。f13013

    图 13-13: 使用项目中的训练桶名称填充脚本。

  12. 在代码区域中滚动,找到 define add cross moves to training datadefine add nought moves to training data 脚本块,如 图 13-14 所示。f13014

    图 13-14: 找到自定义的 define 块。

  13. 在工具箱的 井字游戏 组中,将 add training data 块拖入两个 define 脚本中,如 图 13-15 所示。f13015

    图 13-15: 向两个 define 脚本中添加训练数据。

  14. 按照 图 13-16 中所示更新 add training data 块。你需要的橙色块已经在项目模板中准备好,紧挨着它们应该放置的位置。从左侧开始,将每个块拖入它上方的空白位置。f13016

    图 13-16: 填充训练数据块。

    仔细检查脚本。历史交叉列表中的移动应该出现在 add cross moves to training data 脚本中,如 图 13-17 所示。

    f13017

    图 13-17: 检查你是否已将交叉块与交叉脚本匹配。

    同样,历史圈子列表中的移动应该在 add nought moves to training data 脚本中使用。

    游戏棋盘上的位置名称也应该匹配。例如,top-middle 移动应该进入 TopMiddle 位置,如 图 13-18 所示。

    f13018

    图 13-18: 检查你是否正确匹配了游戏棋盘位置的名称。

    确保你填充了所有块中的空白。你需要向右滚动才能完成这项操作,正如你在 图 13-19 中看到的那样。

    f13019

    图 13-19: 确保你填写了所有空白位置。

  15. 现在找到 when I receive game over 脚本,如 图 13-20 所示。该脚本在每局游戏结束时运行,负责调用你刚设置的 add moves to training data 脚本。f13020

    图 13-20: 找到 when I receive game over 脚本。

    when I receive game over脚本的末尾添加一个新的train new machine learning model区块,如图 13-21 所示。

    f13021

    图 13-21: 每局游戏后训练一个新的机器学习模型。

现在,每局游戏结束时,获胜者的操作将被添加到训练桶中,你将使用这个更新后的训练示例集来训练一个新的机器学习模型。这意味着,经过每一局游戏后,你的机器学习模型应该变得更聪明,表现得更好。

训练你的模型

是时候玩游戏了!

  1. 点击全屏图标,然后点击屏幕右上角的绿色旗帜。像图 13-22 所示那样,玩一局井字游戏。f13022

    图 13-22: 玩一局井字游戏。

  2. 游戏结束后,点击返回项目,然后点击训练。你应该能看到获胜玩家的所有操作,如图 13-23 所示。f13023

    图 13-23: 比较训练数据与图 13-22 中的游戏。

  3. 现在你有了一个机器学习模型,是时候更新 Scratch 游戏,让计算机能够使用模型来决定它的下一步行动。在代码区域滚动,找到define``use machine learning model脚本,如图 13-24 所示。f13024

    图 13-24: 找到define use machine learning model脚本。

    更新脚本,如图 13-25 所示,使其使用你的机器学习模型来识别计算机的最佳移动。

    f13025

    图 13-25: 将recognise numbers``(label)区块添加到脚本中。

  4. 将橙色区块拖到recognise numbers``(label)区块中,如图 13-26 所示。如之前所述,这些区块已经在它们应该放置的位置下方的模板中准备好了。这个代码块将提供游戏板当前的状态给机器学习模型,以便模型能用这些信息识别出最佳的下一步。

    确保你添加了所有九个区块,覆盖游戏板上的所有九个空间,并从左到右进行操作。还要确保区块名称匹配。例如,current state top-middle应放入TopMiddle位置。

f13026

图 13-26: 确保正确匹配区块名称。

测试你的游戏

现在是时候测试你的项目了!

因为你已经编写了让计算机在游戏中学习的项目代码,你应该看到计算机随着时间的推移变得越来越擅长这个游戏。但你怎么验证这一点是否发生呢?

一种方法是玩很多游戏,记录计算机获胜的次数,并绘制随着训练量增加,计算机获胜次数是否增加的图表。

我玩了 300 场井字棋游戏,并统计了我赢、输、平的场次。我将结果绘制在 图 13-27 中的柱状图中。每一列代表 10 场井字棋游戏。绿色表示我赢得的游戏。橙色表示平局的游戏。红色表示机器学习系统赢得的游戏。

最左侧的柱状图代表我玩过的前 10 场游戏。我赢了所有这 10 场游戏。

下一根柱状图代表我接下来的 10 场游戏。我同样赢了所有 10 场。

最右侧的柱状图代表我玩过的最后 10 场游戏。我赢了 2 场,打平了 4 场,输了 4 场。

f13027

图 13-27: 我玩过的井字棋游戏的结果

我的前 10 场游戏非常容易赢。计算机做出了愚蠢的举动,我不需要费力就能获胜。然而,到我最后的 10 场游戏时,获胜变得更加困难。我必须集中精力,避免犯任何错误才能赢得比赛。虽然图表上无法显示我的感受,但我感觉计算机在我玩的时候变得越来越强。

每个机器学习项目的进展都会有所不同,因此尝试训练自己的模型并衡量您的项目是如何学习和改进的。希望你会发现,收集的训练样本越多,机器学习模型的表现越好。但你几乎肯定会看到一些变化,正如我所经历的那样。

审查并改进您的项目

你创建了一个机器学习系统,通过与您对弈来学习玩井字棋。训练这个系统的最大挑战是需要花费大量时间玩数百场训练游戏。是否有更高效的方法来获取更多的训练样本?

一种常见的方法是让更多的人帮忙。想象一下,如果不是自己玩 300 场游戏,而是保存了我的 Scratch 项目并将项目文件交给 30 个朋友,让他们每人玩 10 场游戏。分担工作会使训练变得更加轻松,因为每个人只需要玩 10 场游戏就能很快完成。

现在想象一下,如果我能找到 300 个人来帮忙,或者 3,000 个人!

希望你能看到将机器学习模型的训练工作分摊给大量人群的好处。这有时被称为 众包。当然,这也有一些挑战,比如如何找到一大群人,协调他们,向他们解释你想要的内容,确保他们都按照要求完成任务,并且不会让你的机器学习模型做出你不希望它做的事情,等等。但即便如此,对于很多复杂项目来说,使用大量人力进行训练仍然是最好的选择。

你学到了什么

在这一章,你了解到井字棋(Tic Tac Toe),也叫圈圈叉叉(Noughts and Crosses),已经被用来帮助人们理解机器学习数十年了。你训练了一个机器学习模型来识别数字,并构建了一个井字棋棋盘,棋盘上的编号单元格代表每一次走法。这个项目基于 1960 年英国人工智能研究员唐纳德·米奇(Donald Michie)的工作,他在 MENACE 项目中使用了火柴盒和玻璃珠。每个火柴盒代表游戏棋盘的一个可能状态,类似于你在训练数据中收集的示例。火柴盒中的玻璃珠数量就像一个示例出现在训练桶中的次数。

你还看到了拥有大量训练示例在随着时间推移提高机器学习模型性能方面的重要性。因为每场比赛后,训练集会更新赢家的走法,所以模型逐渐变得更强大,越来越难以击败。你了解到,众包或将训练模型的工作分配给一大群人,可以节省一些时间和精力,十分有用。

在下一章,你将开始学习机器学习项目可能出错的原因。*

第十二章:混淆计算机

Alphabet-U直到现在,我们一直专注于机器学习能做的伟大事情,以及它在现实世界应用中如何被很好地使用。但是,正如你在整本书中所看到的,机器学习系统并不完美,也不是全知的。它们的行为取决于我们给它们的训练。我们如何训练我们的机器学习系统将会影响它们的反应,而不总是以积极的方式。在这一章中,我们将探讨创建人工智能系统时最常见的挑战之一:偏见

本章中的项目基于一个旧故事,有时被称为俄罗斯坦克问题,这个故事经常讲给人工智能学生听。它可能不是真的,但它说明了偏见在机器学习训练数据集中的影响。***

*这里有一个故事的例子:

很久以前,美国军方决定使用机器学习识别隐藏在树林中树木后面的坦克。研究人员使用没有坦克的树林照片和同样树林中隐藏着坦克的照片来训练机器学习模型。

该模型似乎在研究人员的图片上表现良好,但当美国军方测试他们的系统时,它的表现与随机猜测没有区别。

事实证明,在研究人员的训练数据中,伪装坦克的照片是在多云的天气下拍摄的,而平原森林的照片是在阳光明媚的日子里拍摄的。机器学习模型学会了区分多云天气和晴天,而不是识别伪装的坦克。

这是另一个版本:

很久以前,美国军方曾尝试训练计算机识别俄美坦克的区别。研究人员使用他们拍摄的美国坦克照片和他们收集的俄罗斯坦克间谍照片来训练机器学习模型。

该模型似乎在研究人员的图片上表现良好,但当美国军方测试他们的系统时,该机器学习模型的表现与随机猜测没有区别。

结果发现,研究人员拍摄的美国坦克照片大多是大尺寸、高分辨率、高质量的,而他们能够获取的俄罗斯坦克间谍照片则全是模糊的、低分辨率的和颗粒感强的。

机器学习模型学会了区分颗粒感照片和高质量照片,而不是区分俄罗斯和美国坦克。

作为另一个例子,当斯坦福大学的研究人员开发一种通过照片识别皮肤癌的机器学习系统时,他们不小心创建了一个识别尺子的机器学习模型,因为医学照片中通常会有尺子来显示病变或肿瘤的大小。

关键在于,由于无意的偏见,机器学习系统可能会学会识别出其创建者可能没有意识到的模式,或者并非故意作为模式处理的内容。

在本章中,你将训练一个图像分类器来识别物体的照片,但你会引入偏差让它出错。我们将亲眼看到哪些问题会导致机器学习模型出错,然后讨论如何避免这些问题并修正模型。

构建你的项目

选择两个你想让计算机识别的物体,挑选那些明显不同的物体。不要选择过于私人的物品,因为你需要将这些照片上传到互联网以完成这个项目。

对于我的截图,我选择了一个柠檬和一个葡萄柚,它们都在我的厨房里。你可以选择任何你喜欢的物体。

把第一件物体放在某个地方,拍摄 10 张看起来相似的照片。你不需要高分辨率的照片。小尺寸的照片(宽度小于 800 像素)效果最佳。

我把葡萄柚放在一个昏暗的房间的木地板上,拍摄了图 14-1 中显示的照片。

f14001

图 14-1: 我的第一件物体——葡萄柚的照片

把第二件物体放在不同的地方,拍摄 10 张照片。

我把柠檬放在一个奶油色的地毯上,拍摄了图 14-2 中显示的照片。

f14002

图 14-2: 我的第二件物体——一颗柠檬的照片

不要让物体在照片中显得太大。尽量保持每张照片中的物体位置一致,如图 14-1 和图 14-2 所示。

目的是让每组中的 10 张照片非常相似,但让一切——物体、背景、光线——在两组之间有所不同。例如,如果你拍摄的第一件物体的照片是在昏暗的背景下,那么拍摄第二件物体的照片时就要选择明亮的背景。但第一件物体的所有照片都应该是在昏暗的背景下拍摄,而第二件物体的所有照片都应该是在明亮的背景下拍摄。

这里有一些其他的建议,帮助你让两组照片有所不同。

如果你的第一件物体的照片全是… 拍摄第二件物体的所有照片…
昏暗的背景下 明亮的背景下
瓷砖 草地
明亮照明 昏暗的地方
清晰明锐聚焦 模糊不清晰
背景是户外花园 背景是室内同一房间

再看看我的照片。图 14-1 中的照片有共同点:昏暗的光线、深棕色的表面和木质纹理的背景。图 14-2 中的照片有共同点:明亮的光线、奶油色的表面和斑点地毯的背景。

你不必完全复制我的照片。发挥创意吧!

一旦你拍摄了 20 张照片,你需要将它们上传到某个地方,使其可供训练使用。选择任何一个允许你免费将照片上传到互联网的照片托管服务。(如果你已经有一个照片分享服务的账户,你可能会想为这个项目创建一个新账户,因为你的这 20 张随机家庭物品的相似照片可能不太适合分享!)

最重要的是,将你的照片上传到可以无需登录即可访问的地方,这样你的机器学习系统就能访问并学习它们。

训练你的模型

  1. 访问 machinelearningforkids.co.uk/。创建一个新的机器学习项目,命名为 Confuse the computer,并设置为学习识别图像。

  2. 点击 训练,如 图 14-3 所示。f14003

    图 14-3: 点击 训练 来准备你的训练桶。

  3. 点击 添加新标签,创建两个训练桶,如 图 14-4 所示。根据你选择的两个物体命名它们。(你选择的名称不会影响训练,但对你来说很有用。)我给它们命名为葡萄柚和柠檬。f14004

    图 14-4: 为你的物体准备两个训练桶。

  4. 将训练图像添加到你的训练桶中。为此,请将两个浏览器窗口并排排列,如 图 14-5 所示。一个窗口应显示你的训练桶,另一个窗口应显示包含你照片的照片分享网站。

    将图片从照片分享网站拖拽并放入相应的训练桶中。

    f14005

    图 14-5: 将两个浏览器窗口并排排列,并将照片拖放到你的训练桶中。

  5. 重复步骤 4,直到你把所有 20 张照片都放入训练桶中,如 图 14-6 所示。f14006

    图 14-6: 将所有照片拖入训练桶中。

  6. 点击屏幕左上角的 返回项目

  7. 点击 学习与测试

  8. 点击 训练新机器学习模型,如 图 14-7 所示。

f14007

图 14-7: 开始训练一个机器学习模型。

训练你的机器学习模型需要几分钟时间。在等待的过程中,继续执行下一步来准备你的项目。

准备你的项目

给你的两个物体拍另一张照片,但这次要交换背景**。

换句话说,在你拍摄第二个物体照片的地方拍摄第一个物体的照片;在你拍摄第一个物体照片的地方拍摄第二个物体的照片。

对我来说,这意味着我拍摄了柠檬放在深色木地板上的照片,以及葡萄柚放在明亮的奶油色地毯上的照片。比较图 14-8 中我拍的测试照片和图 14-1 和图 14-2 中的训练照片。

f14008

图 14-8: 为你的测试照片更换背景。

你不需要将这些照片上传到任何地方。只需要在你的计算机上访问它们,就能用来进行测试。

  1. 点击返回项目,然后点击制作,如图 14-9 所示。f14009

    图 14-9: 现在开始你的测试!

  2. 点击Scratch 3,如图 14-10 所示。f14010

    图 14-10: 点击Scratch 3以测试你的模型。

  3. 点击在 Scratch 3 中打开

  4. 将鼠标指针移动到右下角的“选择角色”图标(猫脸图标)。点击上传角色,如图 14-11 所示。上传你两张新测试照片中的一张。f14011

    图 14-11: 上传一个新的角色。

  5. 复制图 14-12 中显示的脚本。这个脚本尝试识别角色服装图像,并显示你的机器学习模型所识别的照片内容。f14012

    图 14-12: 编写一个简短的测试脚本。

  6. 再次点击上传角色以上传你的第二张测试照片。为你的第二个角色创建与之前相同的脚本,如图 14-13 所示。

f14013

图 14-13: 上传第二个角色并添加另一个测试脚本。

测试你的项目

现在是时候运行你的测试了!你的脚本应该能够分类你的两张新测试照片,并显示你的机器学习模型所识别的内容。点击绿色旗帜开始测试你的机器学习模型。

我的结果显示在图 14-14 中。

正如你所料,你的机器学习模型可能会给出错误的答案。

f14014

图 14-14: 我的机器学习模型的测试结果

我使用最先进的技术训练了一个机器学习模型,但它无法区分柠檬和葡萄柚——这是人类可以轻松做到的。

你认为为什么会出错呢?

审查并修复你的项目

我的机器学习模型给出错误答案的原因有几个。

想一想照片中占据的区域。物体大约占我照片总体面积的 5%。每张照片约 95%的面积是背景,如图 14-15 所示。

f14015

图 14-15: 我的照片大部分是背景。

当你收集训练样本以创建一个机器学习模型时,你要求计算机识别这些样本的共同点,以便它能够在未来遇到相似特征的东西时进行识别。

当我用柠檬的照片测试我的模型时,照片的 95%非常相似于图 14-1 中所有葡萄柚的训练照片的 95%。在我们训练 ML 模型的方式中,没有明确表明我们感兴趣的部分只是照片中间的那 5%,而不是其余部分。

当你把训练照片和测试照片并排放在一起时,你可以看到模型为什么做出了它的选择。

f14016

图 14-16: 比较测试和训练照片,了解为什么 ML 模型出错了。

将照片作为一个整体来看,我的测试照片中最大的部分(见图 14-16 右侧)与我标记为“葡萄柚”的每个训练照片中最大的部分非常相似。

ML 系统被设计用来识别和识别你给它们的示例中的模式,但这些模式不一定是你打算的或者你会识别的模式

你能想到一种方法来修复你的项目吗?

有几件事情你可以做。例如,如果你的对象在整体图像中占据了更大的比例,就像图 14-17 所示,这可能会有所帮助。

f14017

图 14-17: 尝试在照片中放大你的物体。

但这个解决方案只对你能确保所有测试图像显示相同大对象的项目有用。

对于这个项目,确保这一点的最佳方法是用不同的地方、背景、光线、大小、角度和方向拍摄你两个对象的大量照片。改变你能想到的每一件事情,使它们唯一的共同点只有物体本身。

例如,图 14-18 展示了一组更好的我的葡萄柚训练图像。

f14018

图 14-18: 训练 ML 模型的更好方法

改变训练图像的背景、光照和焦点水平是训练 ML 模型的一个良好起点,以便仅识别图像中的葡萄柚本身作为这些图像之间的共同因素。

我们甚至可以使训练变得更好。例如,这些训练图像中所有的葡萄柚都处于相同的位置和相同的大小。如果我能保证在测试模型时测试照片中的对象大小和位置相同,那就没问题了。但对于一个真正灵活的模型,我也可以添加葡萄柚在不同大小和位置的照片。

尝试改进你两个物体的训练示例,并训练一个新的 ML 模型。

如果你改变训练示例,模型能通过你的测试吗?

你学到了什么

在这一章中,你已经了解了在训练集里保持变异性的重要性。无论是一个军事项目,误将天气识别为伪装的坦克,还是一个大学研究项目,发明了一个卷尺检测器而不是皮肤癌分类器,或者只是一个无法区分葡萄柚和柠檬的系统,你已经看到了在用于训练机器学习模型的数据集中存在无意偏差的影响。

在下一章中,你将看到在机器学习项目中引入刻意偏差的风险。

第十三章:偏见计算机

Alphabet-I在上一章中,你看到了一种可能的情况:通过在训练示例中引入偏见,不小心训练出一个错误的 ML 系统,导致它给出错误的答案。

在这一章中,你将看到如何有时故意引入偏见,以影响 ML 系统给出的答案。你将创建一个应用,根据人们喜欢的电影类型推荐电影。但你会以一种让你能影响推荐结果的方式训练模型。

构建你的项目

选择三部电影来开始建立你的推荐应用将从中选择的电影库。

我希望我的推荐应用能够帮助人们找到经典电影,所以我选择了三部 1920 年代的电影,如图 15-1 所示,不过你可以根据你的项目选择更新的电影。

f15001

图 15-1: 我选择的三部电影来开始我的项目

选择三部完全不同的电影,吸引不同类型的人群。

我选择了科幻电影大都会,喜剧电影淘金记和恐怖片诺斯费拉图

训练你的模型

  1. 访问 machinelearningforkids.co.uk/。创建一个新的 ML 项目,命名为Bias,并设置为学习识别你首选语言中的文本。

  2. 点击训练,如图 15-2 所示。f15002

    图 15-2: 训练是 ML 项目的第一阶段。

  3. 点击添加新标签,如图 15-3 所示,为每部电影添加一个训练桶。f15003

    图 15-3: 为每部电影创建一个训练桶。

  4. 点击添加示例,如图 15-4 所示,在你第一个电影训练桶中。输入你认为喜欢第一部电影的人可能会说的话。

    比如,我的第一部电影,大都会,是一部设定在未来的科幻电影,所以我输入了我喜欢未来题材的电影

    f15004

    图 15-4: 添加一个喜欢第一部电影的人可能会说的例子。

  5. 点击添加

  6. 重复步骤 4 和 5,直到每部电影都有五个示例语句,如图 15-5 所示。f15005

    图 15-5: 为每部电影添加五个示例。

  7. 点击屏幕左上角的返回项目

  8. 点击学习与测试

  9. 点击训练新的机器学习模型,如图 15-6 所示。

    计算机需要一分钟时间从你的示例中学习并创建一个新的 ML 模型,但你可以在等待的同时继续进行下一步。

f15006

图 15-6: 创建一个 ML 模型。

准备你的项目

现在你有了一个 ML 模型,是时候创建一个将使用它的推荐应用了。

  1. 点击屏幕左上角的返回项目

  2. 点击制作

  3. 点击Scratch 3,然后点击在 Scratch 3 中打开,以在新窗口中打开 Scratch。

  4. 点击服装标签,将鼠标指针移动到左下角的选择服装图标(猫脸图标),然后点击上传服装以上传你的电影海报,如图 15-7 所示。f15007

    图 15-7: 上传一个服装。

  5. 上传你第一部电影的海报,如图 15-8 所示。f15008

    图 15-8: 创建一个服装来代表你的第一部电影。

  6. 重复步骤 4 和 5,为你的所有三部电影添加海报作为同一精灵的服装,这样它看起来像图 15-9。

    为每个服装命名,使其与电影标题相匹配。

    f15009

    图 15-9: 为每部电影创建一个服装。

  7. 点击代码标签并复制图 15-10 中显示的脚本。你需要更新它,使用你三部电影的名称。

    这个脚本会询问某人喜欢什么类型的电影,然后使用你的机器学习模型从你的三部电影库中做出推荐。

    f15010

    图 15-10: 创建这个脚本。

  8. 设计你的项目,使其看起来像你认为电影推荐应用应该有的样子。你可以使用绘画编辑器(第三章)、用网络摄像头拍照(第四章)、上传你保存到计算机中的图片(第五章),或者从 Scratch 库中选择一个现成的设计(第五章)来更新背景和精灵。发挥创意!图 15-11 展示了我的应用。f15011

    图 15-11: 设计你的电影推荐应用。

  9. 点击文件保存到计算机以保存你的项目。

测试你的项目

点击绿色旗帜,测试你的项目。

尝试输入描述你喜欢的电影的各种句子,看看你的项目推荐了什么。避免使用你在原始训练集中放入的词语或短语,以查看你的机器学习模型是否已学会识别新的句子。

引入偏差

点击返回项目,然后点击训练以返回训练阶段。

现在选择第四部与前三部电影稍微相似的电影。对于我的项目,我选择了弗兰肯斯坦,这是一部与诺斯费拉图有些相似的恐怖片。

点击添加新标签,为你的第四部电影添加一个新的训练集。

删除一些来自第一部电影的训练示例(在我的例子中是诺斯费拉图),并将它们添加到你的新电影(对我来说是弗兰肯斯坦)中。

你应该会得到类似图 15-12 的结果。

f15012

图 15-12: 将一些示例移动到新电影中。

为你的新电影添加另外 12 个示例。你应该会得到类似图 15-13 的结果。

f15013

图 15-13: 新电影的训练示例

点击返回项目,然后学习与测试。使用更新后的训练示例训练一个新的机器学习模型。

当训练完成后,点击返回项目制作,然后重新打开Scratch 3

点击文件从你的计算机加载,打开你之前保存的 Scratch 项目。更新它以添加你的新电影。这意味着添加一张新电影的海报服装,并更新脚本,加入第四个if块,以识别并推荐你的新电影,如图 15-14 所示。

f15014

图 15-14: 更新项目以添加第四部电影。

测试你的偏向项目

尝试再次测试你的项目。你应该会发现它更倾向于推荐新的第四部电影,尤其是与类似电影相比。

对于我的项目,这意味着如果我提到任何关于恐怖片、让我心跳加速或肾上腺素激增的内容,或是怪物,我的机器学习模型现在总是会推荐弗兰肯斯坦——而不是之前的诺斯费拉图。它并没有在有时推荐一个、而有时推荐另一个之间保持平衡。它似乎对弗兰肯斯坦有偏好或倾向。事实上,除非我输入与我的训练示例完全相同的句子,否则很难让它推荐诺斯费拉图

对你的项目进行实验,看看它的表现如何。每个机器学习模型的行为略有不同,因此尝试了解你训练的模型是如何工作的。

回顾你的项目

我们在第八章中讨论了衡量机器学习模型性能的方法,例如精准度召回率。如果你在故意偏向你的机器学习模型之前和之后计算这些值,你可以衡量偏见对你的项目的影响。

当你认为已经识别出你的机器学习模型行为的方式时,下一步是理解原因。再次查看图 15-13。为什么我的机器学习模型更频繁地推荐弗兰肯斯坦

当你收集训练样本时,你是在让计算机识别这些样本中的模式,计算机使用这些模式来学习如何在未来识别新样本。你将每个桶中放入的样本数量是计算机寻找模式的一个方面。通过将更多样本放入弗兰肯斯坦训练桶,我在一定程度上影响了机器学习模型,这种影响超出了单个训练样本的范围。

假设你在教一个孩子推荐电影。假设你告诉他们 5 次应该推荐电影 A,而告诉他们 1,000 次应该推荐电影 B。这会对他们的期望产生什么影响?如果你一次又一次地告诉他们正确的答案是电影 B,他们很可能会学到应该推荐的电影几乎总是电影 B。

这类似于机器学习系统的行为方式。计算机会从你的所有训练示例中以许多方式寻找模式。你的训练告诉它应该更多信任哪些方式。如果训练示例一遍又一遍地告诉它,导致答案电影 B 的模式、技巧和过程是正确的,它就会学会信任这些模式、技巧和过程。如果训练示例一遍又一遍地告诉它,导致答案电影 A 的模式、技巧和过程是错误的,它就学会不信任它们。

即使它识别出导致将来答案为电影 A 的模式、技巧和过程,你的训练示例却让它学会不信任这些模式,而是更倾向于信任那些暗示电影 B 的模式。

正如你所看到的,每个桶中的训练数据量是创建机器学习系统的重要因素。不同桶中训练样本数量的不平衡可能会导致我们所说的有偏见系统。

偏见的论点

在本书中的大多数项目中,我们试图保持每个桶中训练样本数量大致相同。这是许多机器学习项目中的一个常见原则,目的是尽量减少偏见。

尽管偏见是需要牢记的重要因素,但它并不一定总是坏事。

假设你正在训练一台计算机来区分三种可能的结果:X、Y 和 Z。假设 X 和 Y 非常常见;它们几乎总是正确答案。结果 Z 是可能的,但它非常非常罕见。即使 Z 几乎从未发生,你也希望训练计算机在 Z 发生时能识别出来。

在这里,一个平衡的训练样本集,其中 X、Y 和 Z 的示例数量相同,可能并不合适。如果 X 和 Y 的训练样本更多,而 Z 的样本更少,可能会训练出机器学习模型,使得 X 和 Y 更可能发生,而这种情况实际上是正确的。X 和 Y 的结果更常见,而 Z 是罕见的。这样的系统仍然是有偏见的,但这种偏见反映了不同结果的统计概率,因此它可能是合适且有益的。

人工智能与伦理

在本章中,我们已经看到,提供给机器学习系统的训练将会极大地影响其给出的答案。你认为这对创建人工智能系统的人的责任意味着什么?你认为人工智能开发者有道德责任平衡他们的训练数据,或避免创建有偏见的系统吗?

意图是否有影响?如果某人无意中开发了一个有偏见的系统,这比某人故意影响其系统输出并故意扭曲训练数据更道德,还是更不道德?

钱会产生影响吗?换句话说,如果我第四部电影的制作方支付了我大量资金,让我的电影推荐应用程序偏向他们的电影而非竞争对手的电影,这种做法是否比我制作一个没有个人利益的偏向性应用程序更不道德?

这个主题重要吗?换句话说,你认为偏向性的 AI 电影推荐应用比给医生做医疗治疗推荐的 AI 应用更不具有伦理问题吗?

想象一个机器学习推荐应用程序,它推荐应该给患者开哪些药物。每个训练类别代表一种药物,所包含的训练示例是患者的病历,这些患者在使用该药物时获得了最好的治疗效果。类似的系统现在已经在使用。机器学习系统可以学习识别大量详细病历中的模式,并将其与从同样大量的医学研究和文献中提取的证据结合起来。对于这种医疗人工智能助手应用来说,仍然处于初期阶段,但未来几年内其使用量将显著增加。

现在你亲眼看到了这样一个系统很容易受到影响,从而偏向某一个答案,这是否影响了你对这些系统应用方式的看法?理论上,某个药物的制造商可能会奖励医疗人工智能应用程序的开发者,以便通过偏向其机器学习模型,使该药物优先于其他制造商的药物。

我们越来越依赖机器学习系统来做出影响人们生活的重要决策。这不仅仅是在医疗保健领域。机器学习系统还做出金融推荐,银行和贷款公司使用它们来判断是否应该向某人提供保险,是否可以获得贷款,或者应该收取多少利率。机器学习系统很快就会驾驶我们道路上的汽车和卡车。还有很多其他例子。

强制公司透明化并披露它们的机器学习系统是如何训练的,可能是防止伦理问题的一种方式。但你已经看到了准备训练数据的艰难程度。公司在收集训练数据时投入了大量时间和金钱,以使它们的机器学习系统优于竞争对手,因此很多公司更愿意将它们的训练数据保密。你如何平衡这些伦理问题与公司的商业利益?

你认为是否需要对人工智能系统的训练或应用进行保护?如果需要,应该由单个公司还是政府制定人工智能伦理政策?

本章以更多的问题而非答案结束,这反映了当前人工智能伦理的现状。机器学习系统有潜力通过训练计算机执行我们原本无法做到的事情,从而改善我们的生活。然而,作为一个社会,我们需要解决许多问题,思考在应用这项技术时,我们有多舒适。

你所学到的

在这个最终项目中,你基于第十四章中关于偏差的知识,创建了一个电影推荐应用的机器学习模型,该模型偏好某个结果而非其他结果。你发现,训练机器学习模型时,样本数量的不平衡是故意将偏差引入系统的另一种方式。你还了解到,偏差不一定是坏事——在某些情况下甚至可能是合适的——但重要的是要意识到围绕偏差的伦理问题,尤其是在人工智能系统日益普及的背景下。**

第十四章:后记

Alphabet-F 对许多人来说,人工智能带来的联想是机器人和科幻小说。希望你通过本书中的项目已经了解,人工智能已经到来,且无处不在。

了解机器学习系统的创建方式有助于你更好地理解周围的世界。这种理解让你明白公司如何知道你的想法,并推荐你可能喜欢的产品。同时,它也帮助你意识到,当你被要求评价某些内容,或证明你是人类,或在照片中标记一个面孔时,你可能正在为某人的机器学习系统提供训练数据。

未来

如果未来我们的生活都将受到机器学习系统的影响,我们可能会对它们的训练和应用方式有一些看法。

例如,哪些应用适合机器学习系统,哪些决策应该由人类来做?

机器应该做出涉及你医疗保健的决策吗?还是如何执法?又或者决定谁能获得信用卡或贷款?

谁应该负责收集用于创建最重要机器学习系统的训练数据?又该由谁来检查训练过程?机器学习系统应该如何进行测试,你是否应该能够看到你使用的机器学习系统的测试结果?

你在本书中学到的基础知识——例如训练数据的数量和均衡对机器学习模型的影响、我们用来描述机器学习模型性能的度量标准以及可能出现的各种问题——都将帮助你思考这些重要问题。

如果你选择进一步学习机器学习并了解不同机器学习系统的实现方式,这些也是至关重要的起点。希望本书能鼓励你进一步探索。

下一步

如果你想深入了解,一个选择是构建你自己的机器学习项目。全球许多公司创建的人工智能项目都是通过“云端”在线机器学习服务构建的,正如你目前所做的那样。通过这些服务,你提供训练数据,云服务利用这些数据创建机器学习模型,然后你测试该模型,确保它能够完成你需要的任务。你可以继续使用 Scratch,也可以进阶使用像 Python 这样的文本编程语言。

或者,如果你想了解更多关于机器学习(ML)如何工作的知识,你可以从使用托管在云端的现成 ML 模型,转变为构建和运行你自己的 ML 模型。这将使你更好地控制你的 ML 系统的行为,同时帮助你理解它们的内部工作原理。你需要开始使用基于文本的编程语言,例如 Python,但如果你愿意这么做,市面上有很多免费的 ML 技术框架可以帮助你入门。TensorFlow 是最广泛使用的框架之一,并且 TensorFlow 官网上有免费的教程(www.tensorflow.org/),可以帮助你构建你的第一个 ML 模型。

我希望这本书只是你机器学习旅程的开始。无论你是将所学的 ML 知识用来创建自己的 AI 项目和应用,还是自己构建 ML 模型,抑或是更深入地了解你每天使用的在线服务如何运作,我都祝愿你在接下来的步骤中好运。

posted @ 2025-11-30 19:37  绝不原创的飞龙  阅读(0)  评论(0)    收藏  举报