老金出海AI · GO GLOBAL
返回教程系列
Microsoft AI for Beginners:27 节官方课程全文(简体中文版)
Microsoft全阶段2026-07-31

Microsoft AI for Beginners:27 节官方课程全文(简体中文版)

微软官方开源 AI 入门课程简体中文全文:符号推理、神经网络、计算机视觉、NLP、Transformer、强化学习、多智能体与 AI 伦理,27 节课一次读透,附每节原文链接。

打开官方原教程

关于本课程

Microsoft AI for Beginners 是微软官方开源的 AI 入门课程(MIT 许可),由 Dmitry Soshnikov 等微软工程师编写,GitHub 上超过 3 万 star,是全球最受欢迎的 AI 学习路径之一。

本站已获得转载许可(MIT License),将 27 节课程正文完整收录于本文。中文版采用微软官方简体中文翻译(zh-CN),图片与内链均指向 GitHub 原仓库。每节附原文链接,方便对照学习。

为什么值得学

市面上 AI 教程很多,这套课程有三个不可替代的特点:

  1. 体系完整:从符号推理(Symbolic AI)到神经网络、计算机视觉、NLP、强化学习、多智能体系统,再到 AI 伦理——覆盖 AI 的全景,而不只是"怎么调 API"。
  2. 代码驱动:每节都有可运行的 Jupyter Notebook(含 PyTorch 实现),课程配套 quizzes 可以自测。
  3. 免费且官方:微软出品、MIT 许可,可自由学习、转载、商用。

课程地图(27 节)

章节内容难度
0 · 课程准备环境搭建、Notebook 运行方式入门
1 · AI 导论什么是 AI、强/弱 AI、图灵测试、符号与神经两种路线入门
2 · 符号推理知识表示、专家系统、推理引擎入门
3 · 神经网络感知机、多层感知机、自建框架、PyTorch 框架入门→进阶
4 · 计算机视觉CNN、迁移学习、自编码器、GAN、目标检测、图像分割进阶
5 · NLP文本张量表示、Embedding、语言模型、RNN、生成网络、Transformer、NER、预训练 LLM进阶
6 · 其他遗传算法、深度强化学习、多智能体系统进阶
7 · AI 伦理负责任 AI、偏见、公平性入门
X · 拓展多模态网络进阶

推荐学习路径

  • 只想了解 AI 是什么:学 0、1、2、7 四节即可建立全景认知。
  • 想上手机器学习:学 0、1、3,配合官方 Notebook 跑通感知机与 PyTorch。
  • 想做视觉/语音产品:重点学 4(计算机视觉)+ X(多模态)。
  • 想深入大模型:学 5 的 18(Transformer)、19(NER)、20(预训练 LLM),再结合本站的 GPT/Claude/Gemini API 教程实践。
  • 想研究 Agent:学 23(多智能体系统),结合本站 CodexLoom《从 Multi-Agent 到 Agent Team》一文。

正文说明

以下正文为微软官方简体中文翻译(zh-CN,MIT License),仅做了链接本地化处理。英文原文链接已标注在每节标题下。

---

---

第 0-course-setup 课:开始学习本课程

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/0-course-setup/setup.md

开始学习本课程

你是学生吗?

以下资源可以帮助你入门:

  • 学生中心页面 在这个页面,你可以找到初学者资源、学生礼包,甚至获取免费认证券的方法。建议你将此页面加入书签,并定期查看,因为我们至少每月更新内容。
  • 微软学生学习大使 加入全球学生大使社区,这可能是你进入微软的途径。

学生们,有几种方式可以使用本课程。首先,你可以直接阅读文本并在 GitHub 上查看代码。如果你想运行任何笔记本中的代码,请阅读我们的说明,并在这篇博客文章中找到更多建议。

注意: 如何运行本课程代码的说明

自学

如果你想将课程作为自学项目,我们建议你将整个仓库 fork 到自己的 GitHub 账户,并独立或与小组一起完成练习:

  • 从课前测验开始。
  • 阅读课程的介绍文本。
  • 如果课程有额外的笔记本,逐步阅读并运行代码。如果同时提供了 TensorFlow 和 PyTorch 的笔记本,你可以专注于其中一个——选择你喜欢的框架。
  • 笔记本通常包含一些需要你稍作修改代码以进行实验的挑战。
  • 完成课后测验。
  • 如果模块附带实验室,请完成相关任务。
  • 访问讨论板进行“公开学习”。
对于进一步学习,我们推荐以下微软学习模块和学习路径。

教师们,我们提供了一些建议供您参考如何使用本课程。

---

教学法

在设计本课程时,我们选择了两个教学原则:确保课程是基于项目的动手实践,并且包含频繁的测验

通过确保内容与项目相结合,学习过程变得更具吸引力,同时也能增强概念的记忆。此外,课前的低压力测验可以让学生专注于学习主题,而课后的测验则进一步巩固记忆。本课程设计灵活有趣,可以完整学习,也可以部分学习。项目从简单开始,到12周周期结束时逐渐变得复杂。

关于测验的说明: 所有测验都包含在这个应用程序中,共有50个测验,每个测验包含三个问题。测验链接嵌入在课程中,但测验应用程序可以在本地运行;请按照 etc/quiz-app 文件夹中的说明操作。

离线访问

你可以使用 Docsify 离线运行此文档。Fork 此仓库,在本地机器上安装 Docsify,然后在此仓库的根文件夹中输入 docsify serve。网站将在本地的端口3000上运行:localhost:3000。课程的 PDF 可通过此链接获取。

---

<!-- CO-OP TRANSLATOR DISCLAIMER START --> 免责声明: 本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。 <!-- CO-OP TRANSLATOR DISCLAIMER END -->

---

第 1-Intro 课:人工智能简介

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/1-Intro/README.md

人工智能简介

!人工智能内容简介的涂鸦

涂鸦作者:Tomomi Imura

课前测验

人工智能是一门令人兴奋的科学学科,研究如何让计算机表现出智能行为,例如完成那些人类擅长的事情。

最初,计算机是由查尔斯·巴贝奇发明的,用于按照明确的程序(算法)对数字进行操作。尽管现代计算机比19世纪提出的原始模型先进得多,但它们仍然遵循受控计算的基本理念。因此,如果我们知道实现目标所需的确切步骤序列,就可以编程让计算机完成某项任务。

!一个人的照片

照片由 Vickie Soshnikova 提供
✅ 从一张照片中判断一个人的年龄是无法通过明确编程实现的,因为我们并不知道在脑海中得出这个数字的具体过程。

---

然而,有些任务我们并不知道如何明确解决。比如,从一张照片中判断一个人的年龄。我们之所以能做到,是因为我们见过许多不同年龄段的人的例子,但我们无法明确解释自己是如何做到的,也无法编程让计算机完成这项任务。这正是人工智能(简称AI)感兴趣的任务类型。

✅ 想一想有哪些任务可以交给计算机完成,并且可以从AI中受益。考虑金融、医疗和艺术领域——这些领域今天是如何从AI中受益的?

弱人工智能与强人工智能

弱人工智能强人工智能
弱人工智能指的是为特定任务或一组狭窄任务设计和训练的AI系统。强人工智能,或称通用人工智能(AGI),指的是具有与人类相当的智能和理解能力的AI系统。
这些AI系统并不具备普遍的智能;它们擅长执行预定义的任务,但缺乏真正的理解或意识。这些AI系统能够执行人类可以完成的任何智力任务,适应不同领域,并具备某种形式的意识或自我意识。
弱人工智能的例子包括像Siri或Alexa这样的虚拟助手、流媒体服务使用的推荐算法,以及为特定客户服务任务设计的聊天机器人。实现强人工智能是AI研究的长期目标,需要开发能够在广泛任务和情境中推理、学习、理解和适应的AI系统。
弱人工智能高度专业化,不具备超出其狭窄领域的人类认知能力或通用问题解决能力。强人工智能目前是一个理论概念,还没有AI系统达到这种通用智能的水平。

有关更多信息,请参考**通用人工智能** (AGI)。

智能的定义与图灵测试

在讨论**智能这个术语时,一个问题是我们并没有对其明确的定义。有人认为智能与抽象思维自我意识**相关,但我们无法准确定义它。

!一只猫的照片

照片Amber Kipp 提供,来自Unsplash

为了说明“智能”这个术语的模糊性,试着回答一个问题:“猫是智能的吗?”不同的人往往会给出不同的答案,因为没有普遍接受的测试可以证明这一说法的真伪。如果你认为有——试着让你的猫参加智商测试……

✅ 花一分钟思考你如何定义智能。一只能够解决迷宫并获取食物的乌鸦是智能的吗?一个孩子是智能的吗?

---

在讨论AGI时,我们需要某种方法来判断是否创造了一个真正智能的系统。艾伦·图灵提出了一种方法,称为**图灵测试**,这也可以看作是智能的定义。该测试将一个给定系统与某种本质上智能的东西——一个真实的人类进行比较。由于任何自动化比较都可能被计算机程序绕过,我们使用人类审问者。如果一个人类无法在基于文本的对话中区分真实的人和计算机系统,那么该系统就被认为是智能的。

一个名为 Eugene Goostman 的聊天机器人于2014年在圣彼得堡开发,利用了一个巧妙的个性技巧,接近通过图灵测试。它一开始就声明自己是一个13岁的乌克兰男孩,这可以解释知识的缺乏和文本中的一些不一致之处。该机器人在5分钟的对话中说服了30%的评委相信它是人类,这是图灵认为机器到2000年能够通过的指标。然而,我们应该明白,这并不意味着我们已经创造了一个智能系统,或者计算机系统欺骗了人类审问者——实际上是机器人开发者欺骗了人类!

✅ 你是否曾被聊天机器人欺骗,以为自己在与人类对话?它是如何让你相信的?

人工智能的不同方法

如果我们希望计算机像人类一样行为,我们需要在计算机中某种程度上模拟人类的思维方式。因此,我们需要尝试理解是什么让人类具有智能。

为了能够将智能编程到机器中,我们需要理解我们自身的决策过程是如何运作的。如果你稍加自我反思,你会意识到有些过程是潜意识发生的——例如,我们可以在不思考的情况下区分猫和狗——而另一些过程则涉及推理。

解决这个问题有两种可能的方法:

自上而下方法(符号推理)自下而上方法(神经网络)
自上而下的方法模拟人类解决问题的推理方式。它涉及从人类中提取知识,并以计算机可读的形式表示出来。我们还需要开发一种方法在计算机中建模推理自下而上的方法模拟人类大脑的结构,由大量简单单元组成,称为神经元。每个神经元的作用类似于其输入的加权平均值,我们可以通过提供训练数据来训练神经网络解决有用的问题。

此外,还有一些其他可能的智能方法:

  • 涌现式协同式多代理方法基于这样一个事实:复杂的智能行为可以通过大量简单代理的交互获得。根据进化控制论,智能可以在*元系统转变*的过程中从更简单的反应行为中*涌现*。
  • 进化方法遗传算法是一种基于进化原理的优化过程。

我们将在课程后续部分讨论这些方法,但现在我们将重点关注两种主要方向:自上而下和自下而上。

自上而下方法

自上而下方法中,我们尝试模拟我们的推理过程。因为我们可以在推理时跟随自己的思路,我们可以尝试将这一过程形式化并编程到计算机中。这被称为符号推理

人们往往在头脑中有一些指导决策过程的规则。例如,当医生诊断病人时,他或她可能意识到病人发烧,因此可能存在某种炎症。通过将大量规则应用于特定问题,医生可能得出最终诊断。

这种方法高度依赖于知识表示推理。从人类专家那里提取知识可能是最困难的部分,因为医生在许多情况下并不确切知道为什么会得出某个诊断。有时,解决方案只是突然出现在他的脑海中,而没有明确的思考。有些任务,例如从照片中判断一个人的年龄,根本无法简化为知识的操作。

自下而上方法

另一种方法是尝试模拟我们大脑中最简单的元素——神经元。我们可以在计算机中构建一个所谓的人工神经网络,然后通过提供示例来教它解决问题。这一过程类似于新生儿通过观察学习周围环境的方式。

✅ 研究一下婴儿是如何学习的。婴儿大脑的基本元素是什么?

| 那机器学习呢? | |
|--------------|-----------|
| 人工智能的一部分是基于计算机通过一些数据学习解决问题的,这被称为机器学习。我们不会在本课程中讨论经典的机器学习——请参考单独的机器学习初学者课程。 | !机器学习初学者 |

人工智能简史

人工智能作为一个领域始于20世纪中期。最初,符号推理是一种流行的方法,并取得了一些重要的成功,例如专家系统——能够在某些有限问题领域中充当专家的计算机程序。然而,很快就发现这种方法并不具有良好的扩展性。从专家那里提取知识、在计算机中表示这些知识并保持知识库的准确性,结果证明是一项非常复杂且在许多情况下成本过高的任务。这导致了20世纪70年代所谓的人工智能寒冬

<img alt="人工智能简史" src="../../../../translated_images/zh-CN/history-of-ai.7e83efa70b537f5a.webp" width="70%"/>

图片由 Dmitry Soshnikov 提供

随着时间的推移,计算资源变得更便宜,数据也变得更加丰富,因此神经网络方法在许多领域(如计算机视觉或语音理解)中开始表现出色。在过去十年中,“人工智能”一词大多被用作神经网络的同义词,因为我们听到的大多数AI成功案例都基于它们。

我们可以观察到方法的变化,例如在创建国际象棋程序时:

  • 早期的国际象棋程序基于搜索——程序明确尝试估计对手在给定的几个下一步中的可能走法,并根据几步内可以达到的最佳位置选择最佳走法。这导致了所谓的α-β剪枝搜索算法的发展。
  • 搜索策略在游戏后期效果很好,因为搜索空间被少量可能的走法限制。然而,在游戏开始时,搜索空间非常大,算法可以通过学习人类玩家之间的现有比赛来改进。后续实验采用了所谓的基于案例的推理,程序在知识库中寻找与当前棋局非常相似的案例。
  • 能够战胜人类玩家的现代程序基于神经网络和强化学习,程序通过长时间与自己对弈并从自己的错误中学习来学会下棋——这与人类学习下棋的方式非常相似。然而,计算机程序可以在更短的时间内进行更多的对弈,因此可以学习得更快。

✅ 研究一下其他由AI参与的游戏。

同样,我们可以看到创建“会说话的程序”(可能通过图灵测试)的方法的变化:

  • 早期此类程序(如Eliza)基于非常简单的语法规则和将输入句子重新表述为问题。
  • 现代助手,如Cortana、Siri或Google Assistant,都是混合系统,使用神经网络将语音转换为文本并识别我们的意图,然后采用一些推理或明确的算法来执行所需的操作。
  • 未来,我们可能会期待一个完全基于神经网络的模型能够自行处理对话。最近的GPT和Turing-NLG系列神经网络在这方面表现出色。

<img alt="图灵测试的演变" src="../../../../translated_images/zh-CN/turing-test-evol.4184696701293ead.webp" width="70%"/>

图片由 Dmitry Soshnikov 提供,照片Marina Abrosimova 提供,来源于 Unsplash

最近的人工智能研究

神经网络研究的巨大增长始于2010年左右,当时大型公共数据集开始变得可用。一组名为 ImageNet 的庞大图像集合,其中包含约1400万张带注释的图像,催生了 ImageNet 大规模视觉识别挑战赛

!ILSVRC 准确率

图片由 Dmitry Soshnikov 提供

2012年,卷积神经网络首次用于图像分类,导致分类错误率显著下降(从接近30%降至16.4%)。2015年,微软研究院的 ResNet 架构达到了人类级别的准确率

从那时起,神经网络在许多任务中表现出了非常成功的效果:

---

年份达到人类水平
2015图像分类
2016对话语音识别
2018自动机器翻译(中译英)
2020图像描述生成

在过去几年中,我们见证了大型语言模型的巨大成功,例如 BERT 和 GPT-3。这主要是因为有大量的通用文本数据可用,使我们能够训练模型以捕捉文本的结构和意义,在通用文本集合上进行预训练,然后将这些模型专门化用于更具体的任务。我们将在本课程后续部分中学习更多关于自然语言处理的内容。

🚀 挑战

在互联网上进行探索,找出你认为人工智能最有效的应用领域。是地图应用程序、语音转文字服务还是视频游戏?研究该系统是如何构建的。

课后测验

复习与自学

通过阅读这节课来复习人工智能和机器学习的历史。从该课程顶部的手绘笔记或本课程中选取一个元素,深入研究以了解其演变背后的文化背景。

作业游戏开发挑战

---

<!-- CO-OP TRANSLATOR DISCLAIMER START --> 免责声明: 本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。 <!-- CO-OP TRANSLATOR DISCLAIMER END -->

---

第 2-Symbolic 课:知识表示与专家系统

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/README.md

知识表示与专家系统

!符号人工智能内容摘要

草图由 Tomomi Imura 绘制

人工智能的追求是基于对知识的探索,以类似人类的方式理解世界。但你该如何实现这一点呢?

课前测验

在人工智能的早期阶段,自顶向下创建智能系统的方法(在上一课中讨论)很流行。其想法是从人类身上提取知识,转换成机器可读的形式,然后用它来自动解决问题。这种方法基于两个重要理念:

  • 知识表示
  • 推理

知识表示

符号人工智能中的一个重要概念是知识。必须区分知识与*信息*或*数据*。例如,可以说书中包含知识,因为学习书籍可以成为专家。然而,书中实际上包含的是*数据*,通过阅读书籍并将这些数据整合进我们的世界模型,我们把数据转化为知识。

知识是我们头脑中包含的东西,代表我们对世界的理解。它是通过主动的学习过程获得的,将我们接收到的信息片段整合进我们的活动世界模型。

通常,我们不会严格定义知识,而是通过DIKW金字塔将其与其他相关概念对齐。它包含以下概念:

  • 数据是以物理媒介表示的事物,如书面文字或口语。数据独立于人类存在,可以在人与人之间传递。
  • 信息是我们头脑中对数据的解释。例如,当我们听到“计算机”这个词时,我们对它有一定理解。
  • 知识是信息被整合进我们的世界模型。例如,一旦我们了解计算机是什么,我们便开始对它的工作原理、价格及用途有一些想法。这些相互关联的概念网络构成了我们的知识。
  • 智慧是我们对世界理解的更高层次,代表*元知识*,例如关于知识何时及如何使用的某种认知。

<img src="../../../../translated_images/zh-CN/DIKW_Pyramid.94126f7d2bd8db5b.webp" width="30%"/>

*图片来自维基百科,作者Longlivetheux,CC BY-SA 4.0*

因此,知识表示的问题是找到一种有效方式,将知识以数据形式表示于计算机内部,使其能被自动使用。这可以看作一个光谱:

!知识表示光谱

图片来自 Dmitry Soshnikov
  • 在左侧,是计算机能够有效使用的非常简单的知识表示类型。最简单的是算法式,知识由计算机程序表示。然而,这不是最佳的知识表示方式,因为它不够灵活。我们头脑中的知识往往是非算法的。
  • 在右侧,是自然文本这类表示手段。它最强大,但无法用于自动推理。
✅ 花一分钟思考你是如何在头脑中表示知识并转化为笔记的。有哪种格式对你来说特别有效,有助于记忆?

计算机知识表示分类

我们可以将不同的计算机知识表示方法分为以下几类:

  • 网络表示基于我们头脑中存在一个相互关联的概念网络。我们可以尝试在计算机中以图的形式重现同样的网络——所谓的语义网络
  1. 对象-属性-值三元组属性-值对。由于图可以被表示为计算机中的节点和边列表,我们可以用一个三元组列表表示语义网络,三元组包含对象、属性和值。例如,我们构建以下关于编程语言的三元组:
对象属性
PythonisUntyped-Language
Pythoninvented-byGuido van Rossum
Pythonblock-syntaxindentation
Untyped-Languagedoesn't havetype definitions
✅ 思考三元组如何用来表示其他类型的知识。
  1. 层次表示强调我们头脑中常常构建一个对象层次。例如,我们知道金丝雀是鸟,而所有鸟都有翅膀。我们还对金丝雀通常的颜色和飞行速度有所了解。

- 框架表示基于将每个对象或对象类表示为包含槽位框架。槽位有可能的默认值、值的限制或可以调用的存储过程以获得槽位的值。所有框架形成一个类似面向对象编程语言中的对象层次。 - 场景是一种特殊的框架,表示可以随时间展开的复杂情境。

Python

槽位默认值范围
名称Python
类别Untyped-Language
变量大小写CamelCase
程序长度5-5000 行
块语法缩进
  1. 过程表示基于通过一系列条件发生时可执行的动作列表来表示知识。

- 产生规则是允许我们得出结论的 if-then 语句。例如,医生可能有规则说如果病人有高烧血液检测中C-反应蛋白含量高**,那么病人有炎症。一旦遇到其中一个条件,我们就可以得出炎症结论,并在进一步推理中使用。 - 算法可以被认为是过程表示的另一种形式,尽管它们几乎从不直接用于基于知识的系统。

  1. 逻辑最初由亚里士多德提出,作为表示普遍人类知识的方法。

- 谓词逻辑作为数学理论过于丰富,无法计算,因此通常使用其某个子集,如在Prolog中使用的Horn子句。 - 描述逻辑是一族逻辑系统,用于表示和推理对象层次及分布式知识表示,如*语义网*。

专家系统

符号人工智能的早期成功之一是所谓的专家系统——设计用来在有限问题领域充当专家的计算机系统。它们基于从一个或多个专家处提取的知识库,并包含一个在其上执行推理的推理引擎

!人类结构!基于知识的系统
人类神经系统简化结构基于知识的系统架构

专家系统构建类似人类推理系统,包含短期记忆长期记忆。类似地,在基于知识的系统中我们区分以下组成部分:

  • 问题记忆:包含当前正在解决问题的知识,即患者的体温或血压、是否有炎症等。这也称为静态知识,因为它包含我们当前对问题的快照——所谓的*问题状态*。
  • 知识库:代表问题领域的长期知识。它从人类专家手动提取,在每次咨询间不变。由于它允许我们从一个问题状态导航到另一个状态,也称为动态知识
  • 推理引擎:协调整个在问题状态空间的搜索过程,必要时向用户提问。它还负责找到适用于每个状态的规则。

例如,考虑一个基于动物物理特征决定动物种类的专家系统:

!与-或树

图片来自 Dmitry Soshnikov

该图称为与-或树,是产生规则集合的图形表示。绘制树在提取专家知识初期十分有用。为了在计算机内表示知识,更方便用规则表示:

IF the animal eats meat OR (animal has sharp teeth AND animal has claws AND animal has forward-looking eyes ) THEN the animal is a carnivore

你可以注意到,规则左侧的每一个条件和动作本质上是对象-属性-值(OAV)三元组。工作内存包含与当前解决问题相关的OAV三元组集合。规则引擎寻找满足条件的规则并应用它们,向工作内存添加新的三元组。

✅ 自己绘制一个你喜欢主题的与-或树吧!

前向推理与后向推理

上述过程称为前向推理。它从工作内存中关于问题的初始数据开始,然后执行以下推理循环:

  1. 如果目标属性已在工作内存中——停止并给出结果
  2. 找出所有条件当前满足的规则——获得冲突集规则
  3. 执行冲突解决——选出本步将执行的一条规则。冲突解决有不同策略:

- 选择知识库中第一个适用规则 - 随机选择规则 - 选择*更具体*规则,即“左侧”(LHS)条件满足最多的规则

  1. 应用选中规则,向问题状态插入新知识
  2. 从步骤1重复

但在某些情况下,我们可能希望以对问题一无所知开始,提出帮助得出结论的问题。例如,在医学诊断中,一般不会先做完所有检查再诊断患者,而是在需要决策时做检查。

该过程可用后向推理建模。它由目标驱动——我们想找到的属性值:

  1. 选择所有能给出目标值的规则(即目标在右侧,RHS)——冲突集
  2. 如果该属性无规则或有规则指出需向用户询问值——则询问,否则:
  3. 使用冲突解决策略选择一条将用作*假设*的规则——尝试证明该规则
  4. 递归地对规则左侧所有属性重复该过程,尝试将它们视为目标证明
  5. 如果任何步骤失败——回到步骤3选用另一规则
✅ 何种情形下前向推理更合适?后向推理呢?

实现专家系统

专家系统可使用不同工具实现:

  • 直接用某高级编程语言编写。通常不是最佳选择,因为知识库系统的主要优势是知识和推理分离,领域专家理应能编写规则而不必懂推理细节。
  • 使用专家系统壳,即专门设计用于通过某些知识表示语言填充知识的系统。

✍️ 练习:动物推理

参见 Animals.ipynb ,示例实现了前向和后向推理专家系统。

备注:本例较为简单,仅展示专家系统基本样貌。只有当规则数量达到一定量(约200条以上)时,系统才会表现出某种*智能*行为。规则过多时,难以一一记住,此时你可能开始怀疑系统为何做出某些决策。但基于知识系统的关键特点是你总能*解释*任何决策是如何作出的。

本体论与语义网

20世纪末,曾有一项倡议利用知识表示对互联网资源进行注释,以便能够找到符合非常具体查询的资源。该倡议称为语义网,依赖以下几个概念:

  • 基于**描述逻辑**(DL)的一种特殊知识表示。它类似框架知识表示,因为它建立含属性对象的层次,但具有形式逻辑语义和推理。存在一整个DL家族,在表达能力与推理算法复杂度之间进行平衡。
  • 分布式知识表示,其中所有概念由全局URI标识符表示,能够创建跨互联网的知识层次。
  • 一个基于 XML 的知识描述语言家族:RDF(资源描述框架)、RDFS(RDF 词汇表)、OWL(本体网络语言)。

语义网的核心概念之一是本体。它指的是使用某种形式化知识表示对问题领域的明确说明。最简单的本体可以只是问题领域中对象的层次结构,但更复杂的本体会包含可用于推理的规则。

在语义网中,所有表示均基于三元组。每个对象和每个关系都由 URI 唯一标识。例如,如果我们想陈述这个 AI 课程是由 Dmitry Soshnikov 于 2022 年 1 月 1 日开发的事实——我们可以使用以下三元组:

<img src="../../../../translated_images/zh-CN/triplet.4b9b332587593298.webp" width="30%"/>

http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date “Jan 1, 2022” http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com

✅ 这里 http://www.example.com/terms/creation-datehttp://purl.org/dc/elements/1.1/creator 是表达*创建者*和*创建日期*概念的一些广为人知且被普遍接受的 URI。

在更复杂的情况下,如果我们想定义一个创建者列表,可以使用 RDF 中定义的一些数据结构。

<img src="../../../../translated_images/zh-CN/triplet-complex.32094972c7b4441b.webp" width="40%"/>

上图由 Dmitry Soshnikov 绘制

语义网建设的进展在某种程度上被搜索引擎和自然语言处理技术的发展减缓了,这些技术可以从文本中提取结构化数据。然而,在某些领域,仍然有大量工作致力于维护本体和知识库。一些值得关注的项目:

  • WikiData 是一个与维基百科关联的机器可读知识库集合。大部分数据来自维基百科的 *信息框*,即维基百科页面内的结构化内容。你可以用专门为语义网设计的查询语言 SPARQL 来查询 wikidata。这里是一个示例查询,显示人类中最常见的眼睛颜色:

sparql #defaultView:BubbleChart SELECT ?eyeColorLabel (COUNT(?human) AS ?count) WHERE { ?human wdt:P31 wd:Q5. # human instance-of homo sapiens ?human wdt:P1340 ?eyeColor. # human eye-color ?eyeColor SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } } GROUP BY ?eyeColorLabel

  • DBpedia 是另一个类似 WikiData 的项目。
✅ 如果你想试验构建自己的本体,或者打开已有本体,有一个很棒的图形化本体编辑器叫做 Protégé。下载它,或者在线使用。

<img src="../../../../translated_images/zh-CN/protege.274177ceeac13b38.webp" width="70%"/>

*Web Protégé 编辑器打开了罗曼诺夫家族的本体。截屏来自 Dmitry Soshnikov*

✍️ 练习:家族本体

参见 FamilyOntology.ipynb,该示例演示了如何使用语义网技术对家庭关系进行推理。我们将使用常见的 GEDCOM 格式表示的家谱和家族关系本体,构建给定个体集合的所有家族关系图。

微软概念图

大多数情况下,本体都是精心手工创建的。然而,也可以从非结构化数据中挖掘本体,例如来自自然语言文本。

微软研究院曾做过这样的尝试,产出了微软概念图

它是一个以 is-a 继承关系分组的大型实体集合。它可以回答诸如“微软是什么?”的问题——答案类似于“微软是一家公司,概率为 0.87,同时也是一个品牌,概率为 0.75”。

该图谱既可通过 REST API 访问,也可以作为一个大型可下载文本文件列出所有实体对。

✍️ 练习:概念图

尝试 MSConceptGraph.ipynb 笔记本,看看我们如何使用微软概念图将新闻文章分到几个类别中。

结论

如今,人工智能常被认为是*机器学习*或*神经网络*的同义词。然而,人类也表现出明确的推理能力,而这正是当前神经网络尚未处理的内容。在实际项目中,明确推理仍然用于执行需要解释或能控制修改系统行为的任务。

🚀 挑战

本节课对应的家族本体笔记本中,提供了试验其他家族关系的机会。尝试发现家谱中人们之间的新联系。

课后测验

复习与自学

在网上做些研究,了解人类尝试量化和编码知识的领域。看看布鲁姆的认知分类法,回顾人类历史上如何试图理解他们的世界。探索林奈创建生物分类法的工作,观察门捷列夫如何创建化学元素的描述和分类方法。你还能发现哪些有趣的例子?

作业: 构建本体

---

<!-- CO-OP TRANSLATOR DISCLAIMER START --> 免责声明: 本文件已使用AI翻译服务Co-op Translator进行翻译。虽然我们努力保证准确性,但请注意自动翻译可能存在错误或不准确之处。原始文件的母语版本应被视为权威来源。对于重要信息,建议采用专业人工翻译。我们不对因使用本翻译而产生的任何误解或误释承担责任。 <!-- CO-OP TRANSLATOR DISCLAIMER END -->

---

第 3-NeuralNetworks 课:神经网络简介

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/README.md

神经网络简介

!神经网络内容总结涂鸦

正如我们在介绍中讨论的那样,实现智能的一种方法是训练一个计算机模型或一个人工大脑。自20世纪中期以来,研究人员尝试了各种数学模型,直到近年来,这一方向取得了巨大的成功。这些大脑的数学模型被称为神经网络

有时神经网络被称为*人工神经网络*(Artificial Neural Networks,ANNs),以表明我们讨论的是模型,而不是真实的神经元网络。

机器学习

神经网络属于一个更大的学科,称为机器学习,其目标是利用数据训练计算机模型,使其能够解决问题。机器学习是人工智能的重要组成部分,但我们在本课程中不涉及经典的机器学习内容。

请访问我们的独立课程 **机器学习入门**,了解更多关于经典机器学习的内容。

在机器学习中,我们假设有一些示例数据集 X 和对应的输出值 Y。示例通常是由特征组成的N维向量,而输出被称为标签

我们将讨论两种最常见的机器学习问题:

  • 分类:需要将输入对象分类到两个或多个类别中。
  • 回归:需要为每个输入样本预测一个数值。
当将输入和输出表示为张量时,输入数据集是一个大小为 M&times;N 的矩阵,其中 M 是样本数量,N 是特征数量。输出标签 Y 是一个大小为 M 的向量。

在本课程中,我们将仅关注神经网络模型。

神经元的模型

从生物学中我们知道,大脑由神经细胞(神经元)组成,每个神经元有多个“输入”(树突)和一个“输出”(轴突)。树突和轴突都可以传导电信号,它们之间的连接——称为突触——可以表现出不同程度的导电性,这种导电性由神经递质调节。

!神经元模型!神经元模型
真实神经元 *(图片来自维基百科)*人工神经元 *(作者提供图片)*

因此,神经元的最简单数学模型包含若干输入 X<sub>1</sub>, ..., X<sub>N</sub> 和一个输出 Y,以及一系列权重 W<sub>1</sub>, ..., W<sub>N</sub>。输出的计算公式为:

<img src="../../../../translated_images/zh-CN/netout.1eb15eb76fd76731.webp" alt="Y = f\left(\sum_{i=1}^N X_iW_i\right)" width="131" height="53" align="center"/>

其中 f 是某种非线性的激活函数

早期的神经元模型在 Warren McCullock 和 Walter Pitts 于1943年发表的经典论文 《A logical calculus of the ideas immanent in nervous activity》 中被描述。Donald Hebb 在他的书《The Organization of Behavior: A Neuropsychological Theory》中提出了训练这些网络的方法。

本节内容

在本节中,我们将学习以下内容:

---

免责声明: 本文档使用AI翻译服务 Co-op Translator 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

---

第 3-NeuralNetworks 课:神经网络入门:感知机

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/03-Perceptron/README.md

神经网络入门:感知机

课前测验

1957年,康奈尔航空实验室的Frank Rosenblatt首次尝试实现类似现代神经网络的模型。这是一种名为“Mark-1”的硬件实现,设计用于识别简单的几何图形,例如三角形、正方形和圆形。

<img src='../../../../../translated_images/zh-CN/Rosenblatt-wikipedia.294821b285ac796d.webp' alt='Frank Rosenblatt'/><img src='../../../../../translated_images/zh-CN/Mark_I_perceptron_wikipedia.1f84eaa2d4b76ec9.webp' alt='The Mark 1 Perceptron' />
图片来源:维基百科

输入图像由20x20的光电池阵列表示,因此神经网络有400个输入和一个二进制输出。一个简单的网络包含一个神经元,也称为阈值逻辑单元。神经网络的权重类似于电位器,在训练阶段需要手动调整。

✅ 电位器是一种允许用户调整电路电阻的设备。
《纽约时报》当时对感知机的报道是:*一种电子计算机的胚胎,[海军]期望它能够行走、说话、看见、写作、自我复制并意识到自己的存在。*

感知机模型

假设我们的模型有N个特征,那么输入向量将是一个大小为N的向量。感知机是一种二分类模型,即它可以区分两类输入数据。我们假设对于每个输入向量x,感知机的输出将是+1或-1,具体取决于类别。输出通过以下公式计算:

y(x) = f(w<sup>T</sup>x)

其中f是一个阶跃激活函数

<!-- img src="http://www.sciweavers.org/tex2img.php?eq=f%28x%29%20%3D%20%5Cbegin%7Bcases%7D%0A%20%20%20%20%20%20%20%20%20%2B1%20%26%20x%20%5Cgeq%200%20%5C%5C%0A%20%20%20%20%20%20%20%20%20-1%20%26%20x%20%3C%200%0A%20%20%20%20%20%20%20%5Cend%7Bcases%7D%20%5C%5C%0A&bc=White&fc=Black&im=jpg&fs=12&ff=arev&edit=0" align="center" border="0" alt="f(x) = \begin{cases} +1 & x \geq 0 \\ -1 & x < 0 \end{cases} \\" width="154" height="50" / --> <img src="../../../../../translated_images/zh-CN/activation-func.b4924007c7ce7764.webp"/>

训练感知机

为了训练感知机,我们需要找到一个权重向量w,使得大多数值能够被正确分类,即使误差最小化。这个误差E通过感知机准则定义如下:

E(w) = -&sum;w<sup>T</sup>x<sub>i</sub>t<sub>i</sub>

其中:

  • 求和是在那些导致错误分类的训练数据点i上进行的
  • x<sub>i</sub>是输入数据,t<sub>i</sub>对于负样本是-1,对于正样本是+1。

这个准则被视为权重w的函数,我们需要对其进行最小化。通常使用一种称为梯度下降的方法,我们从一些初始权重w<sup>(0)</sup>开始,然后在每一步根据以下公式更新权重:

w<sup>(t+1)</sup> = w<sup>(t)</sup> - &eta;&nabla;E(w)

这里&eta;是所谓的学习率,&nabla;E(w)表示E的梯度。计算梯度后,我们得到:

w<sup>(t+1)</sup> = w<sup>(t)</sup> + &sum;&eta;x<sub>i</sub>t<sub>i</sub>

Python中的算法如下:

```python def train(positive_examples, negative_examples, num_iterations = 100, eta = 1):

weights = [0,0,0] # Initialize weights (almost randomly :)

for i in range(num_iterations): pos = random.choice(positive_examples) neg = random.choice(negative_examples)

z = np.dot(pos, weights) # compute perceptron output if z < 0: # positive example classified as negative weights = weights + eta*weights.shape

z = np.dot(neg, weights) if z >= 0: # negative example classified as positive weights = weights - eta*weights.shape

return weights ```

总结

在本课中,你学习了感知机,这是一种二分类模型,并了解了如何通过使用权重向量来训练它。

🚀 挑战

如果你想尝试构建自己的感知机,可以试试Microsoft Learn上的这个实验,它使用了Azure ML设计器

课后测验

复习与自学

要了解如何使用感知机解决一个简单问题以及实际问题,并继续学习,请查看感知机笔记本。

这里还有一篇有趣的关于感知机的文章

作业

在本课中,我们实现了一个用于二分类任务的感知机,并使用它来区分两个手写数字。在本实验中,你需要完全解决数字分类问题,即确定给定图像最可能对应的数字。

---

---

第 3-NeuralNetworks 课:神经网络简介:多层感知机

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/04-OwnFramework/README.md

神经网络简介:多层感知机

在上一节中,你学习了最简单的神经网络模型——单层感知机,这是一种线性二分类模型。

在本节中,我们将扩展这一模型,构建一个更灵活的框架,使我们能够:

  • 除了二分类,还能进行多分类
  • 除了分类问题,还能解决回归问题
  • 区分那些非线性可分的类别

我们还将开发一个基于 Python 的模块化框架,用于构建不同的神经网络架构。

课前测验

机器学习的形式化定义

让我们从形式化定义机器学习问题开始。假设我们有一个训练数据集 X 和对应的标签 Y,我们需要构建一个模型 *f*,以实现最准确的预测。预测的质量通过损失函数 &lagran; 来衡量。以下是常用的损失函数:

  • 对于回归问题(需要预测一个数值),可以使用绝对误差 &sum;<sub>i</sub>|f(x<sup>(i)</sup>)-y<sup>(i)</sup>|,或平方误差 &sum;<sub>i</sub>(f(x<sup>(i)</sup>)-y<sup>(i)</sup>)<sup>2</sup>
  • 对于分类问题,可以使用0-1损失(本质上等同于模型的准确率),或对数损失

对于单层感知机,函数 *f* 定义为线性函数 *f(x)=wx+b*(其中 *w* 是权重矩阵,*x* 是输入特征向量,*b* 是偏置向量)。对于不同的神经网络架构,这个函数可以具有更复杂的形式。

在分类问题中,通常希望网络输出的是类别的概率。为了将任意数值转换为概率(例如对输出进行归一化),我们通常使用softmax 函数 &sigma;,此时函数 *f* 变为 *f(x)=&sigma;(wx+b)*。

在上述 *f* 的定义中,*w* 和 *b* 被称为参数 &theta;=⟨*w,b*⟩。给定数据集 ⟨X,Y⟩,我们可以将整个数据集上的总误差表示为参数 &theta; 的函数。

神经网络训练的目标是通过调整参数 &theta; 来最小化误差

梯度下降优化

梯度下降是一种著名的函数优化方法。其核心思想是,我们可以计算损失函数相对于参数的导数(在多维情况下称为梯度),并调整参数以减少误差。其形式化过程如下:

  • 用一些随机值初始化参数 w<sup>(0)</sup>, b<sup>(0)</sup>
  • 重复以下步骤多次:

- w<sup>(i+1)</sup> = w<sup>(i)</sup>-&eta;&part;&lagran;/&part;w - b<sup>(i+1)</sup> = b<sup>(i)</sup>-&eta;&part;&lagran;/&part;b

在训练过程中,优化步骤通常是基于整个数据集计算的(记住,损失是通过所有训练样本的总和计算的)。然而,在实际操作中,我们会取数据集的小部分,称为小批量(minibatches),并基于数据的子集计算梯度。由于每次随机选取子集,这种方法被称为随机梯度下降(SGD)

多层感知机与反向传播

如上所述,单层网络能够对线性可分的类别进行分类。为了构建更复杂的模型,我们可以将多个网络层组合起来。从数学上讲,这意味着函数 *f* 将具有更复杂的形式,并通过以下几个步骤计算:

  • z<sub>1</sub>=w<sub>1</sub>x+b<sub>1</sub>
  • z<sub>2</sub>=w<sub>2</sub>&alpha;(z<sub>1</sub>)+b<sub>2</sub>
  • f = &sigma;(z<sub>2</sub>)

这里,&alpha; 是一个非线性激活函数,&sigma; 是 softmax 函数,参数为 &theta;=<*w<sub>1</sub>,b<sub>1</sub>,w<sub>2</sub>,b<sub>2</sub>*>。

梯度下降算法保持不变,但计算梯度会更加复杂。根据链式求导法则,我们可以计算导数如下:

  • &part;&lagran;/&part;w<sub>2</sub> = (&part;&lagran;/&part;&sigma;)(&part;&sigma;/&part;z<sub>2</sub>)(&part;z<sub>2</sub>/&part;w<sub>2</sub>)
  • &part;&lagran;/&part;w<sub>1</sub> = (&part;&lagran;/&part;&sigma;)(&part;&sigma;/&part;z<sub>2</sub>)(&part;z<sub>2</sub>/&part;&alpha;)(&part;&alpha;/&part;z<sub>1</sub>)(&part;z<sub>1</sub>/&part;w<sub>1</sub>)
✅ 链式求导法则用于计算损失函数相对于参数的导数。

注意,这些表达式的最左部分是相同的,因此我们可以从损失函数开始,沿着计算图“向后”计算导数。因此,多层感知机的训练方法被称为反向传播(backpropagation),简称“反向传播”。

<img alt="计算图" src="../../../../../translated_images/zh-CN/ComputeGraphGrad.4626252c0de03507.webp"/>

TODO: 图片引用
✅ 我们将在随后的 notebook 示例中更详细地讲解反向传播。

总结

在本节课中,我们构建了自己的神经网络库,并将其用于一个简单的二维分类任务。

🚀 挑战

在配套的 notebook 中,你将实现自己的框架,用于构建和训练多层感知机。你将能够详细了解现代神经网络的运行方式。

请前往 OwnFramework notebook 并完成相关内容。

课后测验

复习与自学

反向传播是人工智能和机器学习中常用的算法,值得深入学习

作业

在本次实验中,你需要使用本节课中构建的框架来解决 MNIST 手写数字分类问题。

---

---

第 3-NeuralNetworks 课:神经网络框架

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/3-NeuralNetworks/05-Frameworks/README.md

神经网络框架

正如我们已经学习到的,为了高效地训练神经网络,我们需要做到以下两点:

  • 操作张量,例如进行乘法、加法,以及计算一些函数如 sigmoid 或 softmax。
  • 计算所有表达式的梯度,以便执行梯度下降优化。

课前测验

虽然 numpy 库可以完成第一部分,但我们还需要某种机制来计算梯度。在我们之前开发的框架中,我们必须手动在 backward 方法中编写所有的导数函数来实现反向传播。理想情况下,一个框架应该能够让我们计算*任何表达式*的梯度。

另一个重要的事情是能够在 GPU 或其他专用计算单元(如 TPU)上进行计算。深度神经网络的训练需要*大量*的计算,因此能够在 GPU 上并行化这些计算非常重要。

✅ “并行化”一词指的是将计算分配到多个设备上。

目前最流行的两个神经网络框架是:TensorFlowPyTorch。它们都提供了一个低级 API,用于在 CPU 和 GPU 上操作张量。在低级 API 之上,还有高级 API,分别是 KerasPyTorch Lightning

低级 API 允许你构建所谓的计算图。这个图定义了如何通过给定的输入参数计算输出(通常是损失函数),并且可以在 GPU 上运行计算(如果可用)。这些框架提供了对计算图进行微分以计算梯度的功能,这些梯度可以用于优化模型参数。

高级 API 将神经网络视为层的序列,使得构建大多数神经网络变得更加简单。训练模型通常只需要准备数据,然后调用一个 fit 函数即可完成。

高级 API 允许你快速构建典型的神经网络,而无需担心许多细节。同时,低级 API 提供了对训练过程的更多控制,因此在研究新型神经网络架构时经常使用。

需要注意的是,你可以同时使用这两种 API。例如,你可以使用低级 API 开发自己的网络层架构,然后将其嵌入到使用高级 API 构建和训练的更大网络中。或者,你可以使用高级 API 将网络定义为层的序列,然后使用自己的低级训练循环进行优化。这两种 API 使用相同的基本概念,并且设计为能够很好地协同工作。

学习

在本课程中,我们为 PyTorch 和 TensorFlow 提供了大部分内容。你可以选择自己喜欢的框架,只学习对应的笔记本。如果你不确定选择哪个框架,可以在网上查阅一些关于 PyTorch vs. TensorFlow 的讨论。你也可以同时了解这两个框架以获得更好的理解。

在可能的情况下,我们会为了简化使用高级 API。然而,我们认为从基础上理解神经网络的工作原理非常重要,因此在开始时我们会从低级 API 和张量操作入手。不过,如果你想快速入门,不想花太多时间学习这些细节,可以直接跳到高级 API 的笔记本。

✍️ 练习:框架

通过以下笔记本继续学习:

低级 APITensorFlow+Keras 笔记本PyTorch
高级 APIKeras*PyTorch Lightning*

掌握这些框架后,我们将回顾过拟合的概念。

过拟合

过拟合是机器学习中一个极其重要的概念,理解它至关重要!

考虑以下拟合 5 个点的问题(图中的 x 表示点):

!线性模型!过拟合模型
线性模型,2 个参数非线性模型,7 个参数
训练误差 = 5.3训练误差 = 0
验证误差 = 5.1验证误差 = 20
  • 左图展示了一个良好的直线拟合。由于参数数量适当,模型正确捕捉了点的分布规律。
  • 右图中,模型过于强大。由于只有 5 个点,而模型有 7 个参数,它可以调整到通过所有点,使得训练误差为 0。然而,这阻止了模型理解数据背后的正确模式,因此验证误差非常高。

在模型的复杂度(参数数量)和训练样本数量之间找到正确的平衡非常重要。

为什么会发生过拟合

* 训练数据不足 * 模型过于强大 * 输入数据中噪声过多

如何检测过拟合

从上图可以看出,过拟合可以通过非常低的训练误差和非常高的验证误差来检测。通常在训练过程中,我们会看到训练误差和验证误差都开始下降,但在某个点之后,验证误差可能停止下降并开始上升。这是过拟合的信号,表明我们可能应该停止训练(或者至少保存模型的快照)。

!过拟合

如何防止过拟合

如果你发现发生了过拟合,可以采取以下措施:

* 增加训练数据量 * 降低模型的复杂度 * 使用一些正则化技术,例如 Dropout,我们将在后面讨论。

过拟合与偏差-方差权衡

过拟合实际上是统计学中一个更通用问题的特例,称为偏差-方差权衡。如果我们考虑模型中可能的误差来源,可以看到两种类型的误差:

  • 偏差误差 是由于算法无法正确捕捉训练数据之间的关系而引起的。这可能是因为模型不够强大(欠拟合)。
  • 方差误差 是由于模型拟合了输入数据中的噪声而不是有意义的关系(过拟合)。

在训练过程中,偏差误差会减少(因为模型学会了拟合数据),而方差误差会增加。为了防止过拟合,重要的是在适当的时候停止训练——可以手动(当我们检测到过拟合时)或自动(通过引入正则化)。

总结

在本课中,你学习了两个最流行的 AI 框架 TensorFlow 和 PyTorch 的不同 API。此外,你还学习了一个非常重要的话题——过拟合。

🚀 挑战

在配套的笔记本中,你会发现底部有“任务”;完成这些笔记本并完成任务。

课后测验

复习与自学

研究以下主题:

  • TensorFlow
  • PyTorch
  • 过拟合

问自己以下问题:

  • TensorFlow 和 PyTorch 有什么区别?
  • 过拟合和欠拟合有什么区别?

作业

在本实验中,你需要使用 PyTorch 或 TensorFlow 解决两个分类问题,分别使用单层和多层全连接网络。

---

---

第 4-ComputerVision 课:计算机视觉简介

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/06-IntroCV/README.md

计算机视觉简介

计算机视觉 是一个旨在让计算机能够对数字图像进行高层次理解的学科。这是一个非常广泛的定义,因为*理解*可以有很多不同的含义,包括在图片中找到一个物体(目标检测)、理解发生了什么(事件检测)、用文字描述图片,或者重建3D场景。此外,还有一些与人类图像相关的特殊任务:年龄和情绪估计、人脸检测与识别,以及3D姿态估计等。

课前测验

计算机视觉最简单的任务之一是图像分类

计算机视觉通常被认为是人工智能的一个分支。如今,大多数计算机视觉任务都是通过神经网络解决的。我们将在本节中学习一种专门用于计算机视觉的神经网络类型,卷积神经网络

然而,在将图像传递给神经网络之前,许多情况下使用一些算法技术来增强图像是有意义的。

以下是一些可用于图像处理的Python库:

  • imageio** 可用于读取/写入不同的图像格式。它还支持ffmpeg,一个将视频帧转换为图像的有用工具。
  • Pillow**(也称为PIL)功能更强大,还支持一些图像操作,如变形、调色板调整等。
  • OpenCV** 是一个用C++编写的强大的图像处理库,已成为图像处理的*事实标准*。它有一个方便的Python接口。
  • dlib** 是一个C++库,实施了许多机器学习算法,包括一些计算机视觉算法。它也有一个Python接口,可用于诸如人脸和面部标志检测等具有挑战性的任务。

OpenCV

OpenCV 被认为是图像处理的*事实标准*。它包含许多有用的算法,用C++实现。你也可以通过Python调用OpenCV。

学习OpenCV的一个好地方是这个Learn OpenCV课程。在我们的课程中,我们的目标不是学习OpenCV,而是向你展示一些使用它的例子,以及如何使用它。

加载图像

在Python中,图像可以方便地表示为NumPy数组。例如,大小为320x200像素的灰度图像将存储在一个200x320的数组中,而相同尺寸的彩色图像将具有200x320x3的形状(对应3个颜色通道)。要加载图像,可以使用以下代码:

```python import cv2 import matplotlib.pyplot as plt

im = cv2.imread('image.jpeg') plt.imshow(im) ```

传统上,OpenCV使用BGR(蓝-绿-红)编码来表示彩色图像,而Python中的其他工具则使用更传统的RGB(红-绿-蓝)。为了使图像显示正确,你需要将其转换为RGB颜色空间,可以通过交换NumPy数组中的维度或调用OpenCV函数来实现:

python im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)

同样的cvtColor函数也可以用于执行其他颜色空间转换,例如将图像转换为灰度或HSV(色调-饱和度-亮度)颜色空间。

你还可以使用OpenCV逐帧加载视频——在练习OpenCV Notebook中有一个示例。

图像处理

在将图像传递给神经网络之前,你可能需要应用几个预处理步骤。OpenCV可以做很多事情,包括:

  • 使用im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS)对图像进行调整大小
  • 使用im = cv2.medianBlur(im,3)im = cv2.GaussianBlur(im, (3,3), 0)对图像进行模糊处理
  • 通过NumPy数组操作来改变图像的亮度和对比度,具体方法可参考这个Stackoverflow帖子
  • 使用阈值处理,通过调用cv2.thresholdcv2.adaptiveThreshold函数,这通常比调整亮度或对比度更优。
  • 对图像应用不同的变换

- **仿射变换 如果你需要对图像进行旋转、调整大小和倾斜,并且知道图像中三个点的源位置和目标位置,仿射变换会保持平行线的平行性。 - 透视变换** 如果你知道图像中四个点的源位置和目标位置,这会很有用。例如,如果你用智能手机从某个角度拍摄了一张矩形文档的照片,并希望将文档本身变成一个矩形图像。

  • 使用**光流**来理解图像中的运动。

使用计算机视觉的示例

在我们的OpenCV Notebook中,我们提供了一些使用计算机视觉执行特定任务的示例:

  • 对盲文书籍的照片进行预处理。我们重点介绍如何使用阈值处理、特征检测、透视变换和NumPy操作来分离单个盲文符号,以便神经网络进一步分类。
图片来源:OpenCV.ipynb
  • 使用帧差检测视频中的运动。如果摄像机是固定的,那么摄像机画面中的帧应该彼此非常相似。由于帧被表示为数组,只需对两个连续帧的数组进行减法运算,就可以得到像素差异,对于静态帧来说差异应该很小,而当图像中有显著运动时差异会变大。

!视频帧和帧差异图像

图片来源:OpenCV.ipynb
  • 使用光流检测运动光流允许我们理解视频帧中单个像素的运动方式。光流有两种类型:

- 密集光流计算每个像素的运动向量场。 - 稀疏光流基于图像中的一些显著特征(例如边缘),并从帧到帧构建它们的轨迹。

!光流图像

图片来源:OpenCV.ipynb

✍️ 示例笔记本: OpenCV 尝试OpenCV实践

让我们通过探索OpenCV Notebook来进行一些OpenCV实验。

结论

有时,像运动检测或指尖检测这样相对复杂的任务可以完全通过计算机视觉来解决。因此,了解计算机视觉的基本技术以及像OpenCV这样的库能做什么是非常有帮助的。

🚀 挑战

观看这个视频,了解Cortic Tigers项目以及他们如何通过机器人构建一个基于模块的解决方案来普及计算机视觉任务。研究其他类似项目,这些项目帮助新学习者进入该领域。

课后测验

复习与自学

阅读更多关于光流的内容,请参考这个优秀教程

作业

在这个实验中,你将拍摄一个带有简单手势的视频,你的目标是使用光流提取上下左右的运动。

<img src="../../../../../translated_images/zh-CN/palm-movement.341495f0e9c47da3.webp" width="30%" alt="手掌运动帧"/>

---

---

第 4-ComputerVision 课:卷积神经网络

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/07-ConvNets/README.md

卷积神经网络

我们之前已经看到,神经网络在处理图像方面表现得非常出色,甚至单层感知机也能够以较高的准确率识别 MNIST 数据集中的手写数字。然而,MNIST 数据集非常特殊,所有数字都被居中放置在图像中,这使得任务变得更简单。

课前测验

在现实生活中,我们希望能够识别图像中的物体,而不受其具体位置的影响。计算机视觉与普通分类不同,因为当我们试图在图像中找到某个特定物体时,我们实际上是在扫描图像,寻找某些特定的模式及其组合。例如,当寻找一只猫时,我们可能首先寻找水平线,这些线可以形成猫的胡须,然后某种胡须的组合可以告诉我们这确实是一张猫的图片。某些模式的相对位置和存在是重要的,而不是它们在图像中的确切位置。

为了提取模式,我们将使用卷积滤波器的概念。正如你所知,图像可以用二维矩阵或带有颜色深度的三维张量来表示。应用滤波器意味着我们使用一个相对较小的滤波核矩阵,并对原始图像中的每个像素与其邻近点进行加权平均计算。我们可以将其视为一个小窗口在整个图像上滑动,并根据滤波核矩阵中的权重对所有像素进行平均。

图片来源:Dmitry Soshnikov

例如,如果我们对 MNIST 数字应用 3x3 的垂直边缘和水平边缘滤波器,我们可以在原始图像中存在垂直和水平边缘的地方获得高亮(例如高值)。因此,这两个滤波器可以用来“寻找”边缘。同样,我们可以设计不同的滤波器来寻找其他低级模式:

<img src="../../../../../translated_images/zh-CN/lmfilters.ea9e4868a82cf74c.webp" width="500" align="center"/>

图片来源:Leung-Malik 滤波器组

然而,虽然我们可以手动设计滤波器来提取某些模式,我们也可以设计网络,使其能够自动学习这些模式。这是 CNN 背后的主要思想之一。

CNN 的主要思想

CNN 的工作方式基于以下重要思想:

  • 卷积滤波器可以提取模式
  • 我们可以设计网络,使滤波器能够自动训练
  • 我们可以使用相同的方法来发现高级特征中的模式,而不仅仅是原始图像中的模式。因此,CNN 的特征提取在特征的层次结构中工作,从低级像素组合开始,到更高级的图像部分组合。

!层次特征提取

图片来源:Hislop-Lynch 的论文,基于他们的研究

✍️ 练习:卷积神经网络

让我们继续探索卷积神经网络的工作原理,以及如何通过相关的笔记本实现可训练的滤波器:

金字塔架构

大多数用于图像处理的 CNN 都遵循所谓的金字塔架构。应用于原始图像的第一层卷积通常具有相对较少的滤波器(8-16),这些滤波器对应于不同的像素组合,例如水平/垂直线条或笔画。在下一层,我们减少网络的空间维度,并增加滤波器的数量,这对应于更多简单特征的可能组合。随着每一层的推进,空间维度逐渐减小,而滤波器的数量逐渐增加,最终到达分类器。

例如,让我们看看 VGG-16 的架构,这是一种在 2014 年 ImageNet 的 top-5 分类中实现了 92.7% 准确率的网络:

!ImageNet 层次结构

!ImageNet 金字塔

图片来源:Researchgate

最著名的 CNN 架构

继续学习最著名的 CNN 架构

---

---

第 4-ComputerVision 课:预训练网络与迁移学习

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/08-TransferLearning/README.md

预训练网络与迁移学习

训练 CNN 需要耗费大量时间,并且需要大量数据。然而,大部分时间都花在学习网络可以用来从图像中提取模式的最佳低级滤波器上。一个自然的问题是:我们是否可以使用一个在某个数据集上训练过的神经网络,并将其适配到不同的图像分类任务,而无需完整的训练过程?

课前测验

这种方法被称为迁移学习,因为我们将一个神经网络模型的一些知识转移到另一个模型中。在迁移学习中,我们通常从一个预训练模型开始,该模型已经在某个大型图像数据集(例如 ImageNet)上进行了训练。这些模型已经能够很好地从通用图像中提取不同的特征,在许多情况下,仅仅在这些提取的特征之上构建一个分类器就可以取得不错的效果。

✅ 迁移学习是一个在其他学术领域(如教育)中也会遇到的术语,它指的是将一个领域的知识应用到另一个领域的过程。

预训练模型作为特征提取器

我们在上一节中讨论的卷积网络包含多个层,每一层都旨在从图像中提取一些特征,从低级像素组合(例如水平/垂直线或笔画)到高级特征组合(例如火焰的眼睛)。如果我们在足够大的通用和多样化图像数据集上训练 CNN,网络应该能够学习提取这些常见特征。

Keras 和 PyTorch 都包含函数,可以轻松加载一些常见架构的预训练神经网络权重,这些权重大多是在 ImageNet 图像上训练的。最常用的架构在上一课的 CNN Architectures 页面中有描述。特别是,你可以考虑使用以下模型之一:

  • VGG-16/VGG-19 是相对简单的模型,但仍然具有良好的准确性。通常使用 VGG 作为初步尝试是一个不错的选择,可以看看迁移学习的效果如何。
  • ResNet 是微软研究院在 2015 年提出的一系列模型。它们有更多的层,因此需要更多资源。
  • MobileNet 是一系列尺寸较小的模型,适合移动设备。如果资源有限并且可以牺牲一些准确性,可以使用它们。

以下是 VGG-16 网络从一张猫的图片中提取的示例特征:

!VGG-16 提取的特征

猫与狗数据集

在这个例子中,我们将使用一个猫与狗数据集,这非常接近真实的图像分类场景。

✍️ 练习:迁移学习

让我们在相关的笔记本中看看迁移学习的实际应用:

可视化对抗性猫

预训练的神经网络在其“脑海”中包含了不同的模式,包括理想猫(以及理想狗、理想斑马等)的概念。我们可以尝试以某种方式可视化这个图像。然而,这并不简单,因为这些模式分布在网络权重的各个部分,并且以层次结构组织。

我们可以采取的一种方法是从一个随机图像开始,然后尝试使用梯度下降优化技术调整该图像,使网络认为它是一只猫。

!图像优化循环

然而,如果我们这样做,我们会得到一些非常类似于随机噪声的东西。这是因为*有很多方法可以让网络认为输入图像是一只猫*,包括一些在视觉上没有意义的方式。虽然这些图像包含了许多典型的猫的模式,但没有任何约束使它们在视觉上具有辨识度。

为了改善结果,我们可以在损失函数中添加另一个项,称为变化损失。它是一种度量,显示图像中相邻像素的相似程度。最小化变化损失可以使图像更平滑,并消除噪声,从而揭示更具视觉吸引力的模式。以下是一些这样的“理想”图像示例,它们被高概率分类为猫和斑马:

!理想猫!理想斑马
*理想猫**理想斑马*

类似的方法可以用来对神经网络进行所谓的对抗性攻击。假设我们想欺骗一个神经网络,让一只狗看起来像一只猫。如果我们拿一张被网络识别为狗的狗的图片,然后稍微调整它,直到网络开始将其分类为猫:

!狗的图片!被分类为猫的狗的图片
*狗的原始图片**被分类为猫的狗的图片*

查看以下笔记本中的代码以重现上述结果:

总结

通过迁移学习,你可以快速构建一个用于自定义对象分类任务的分类器,并获得较高的准确性。可以看到,我们现在解决的更复杂任务需要更高的计算能力,无法轻松在 CPU 上完成。在下一单元中,我们将尝试使用更轻量化的实现来训练相同的模型,使用较低的计算资源,结果仅稍微降低准确性。

🚀 挑战

在配套的笔记本中,底部有关于迁移知识在某些相似训练数据(例如新类型的动物)中效果最佳的注释。尝试使用完全不同类型的图像进行实验,看看你的迁移知识模型表现得如何。

课后测验

复习与自学

阅读 TrainingTricks.md,深入了解其他训练模型的方法。

作业

在这个实验中,我们将使用真实的 Oxford-IIIT 宠物数据集,其中包含 35 种猫和狗的品种,并构建一个迁移学习分类器。

---

---

第 4-ComputerVision 课:自动编码器

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/09-Autoencoders/README.md

自动编码器

在训练 CNN 时,一个问题是我们需要大量的标注数据。在图像分类的情况下,我们需要将图像分成不同的类别,这通常需要手动完成。

课前测验

然而,我们可能希望使用原始(未标注)数据来训练 CNN 特征提取器,这被称为自监督学习。在这种情况下,我们将训练图像同时作为网络的输入和输出。自动编码器的核心思想是,我们会有一个编码器网络,将输入图像转换为某种潜在空间(通常是一个较小尺寸的向量),然后通过解码器网络来重建原始图像。

自动编码器 是“一种用于学习未标注数据高效编码的人工神经网络。”

由于我们训练自动编码器的目标是尽可能捕捉原始图像的信息以实现准确的重建,网络会尝试找到输入图像的最佳嵌入以捕捉其意义。

!自动编码器示意图

图片来源:Keras 博客

自动编码器的应用场景

虽然重建原始图像本身似乎没有太大的实际用途,但在以下场景中,自动编码器特别有用:

  • 降低图像维度以便可视化训练图像嵌入。通常,自动编码器比 PCA 效果更好,因为它考虑了图像的空间特性和层次化特征。
  • 去噪,即去除图像中的噪声。由于噪声包含了大量无用信息,自动编码器无法将所有噪声信息压缩到相对较小的潜在空间中,因此它只捕捉图像的重要部分。在训练去噪器时,我们以原始图像为目标,并使用人工添加噪声的图像作为自动编码器的输入。
  • 超分辨率,即提高图像分辨率。我们以高分辨率图像为目标,并使用低分辨率图像作为自动编码器的输入。
  • 生成模型。一旦我们训练了自动编码器,解码器部分可以用来从随机潜在向量生成新对象。

变分自动编码器 (VAE)

传统的自动编码器通过某种方式降低输入数据的维度,从而提取输入图像的重要特征。然而,潜在向量通常没有太多意义。换句话说,以 MNIST 数据集为例,确定哪些数字对应于不同的潜在向量并不容易,因为相近的潜在向量不一定对应于相同的数字。

另一方面,要训练生成模型,最好对潜在空间有一定的理解。这一想法引导我们进入变分自动编码器 (VAE)。

VAE 是一种自动编码器,它学习预测潜在参数的统计分布,即所谓的潜在分布。例如,我们可能希望潜在向量呈正态分布,具有某个均值 z<sub>mean</sub> 和标准差 z<sub>sigma</sub>(均值和标准差都是某个维度 d 的向量)。VAE 的编码器学习预测这些参数,然后解码器从该分布中随机抽取一个向量以重建对象。

总结如下:

  • 从输入向量预测 z_meanz_log_sigma(我们预测的是标准差的对数而不是标准差本身)
  • 从分布 N(z<sub>mean</sub>,exp(z<sub>log\_sigma</sub>)) 中抽取一个向量 sample
  • 解码器尝试使用 sample 作为输入向量解码原始图像

<img src="../../../../../translated_images/zh-CN/vae.464c465a5b6a9e25.webp" width="50%">

图片来源:Isaak Dykeman 的博客文章

变分自动编码器使用一个复杂的损失函数,该损失函数由两部分组成:

  • 重建损失是一个损失函数,用于衡量重建图像与目标图像的接近程度(可以是均方误差,MSE)。它与普通自动编码器的损失函数相同。
  • KL 损失确保潜在变量分布接近正态分布。它基于 Kullback-Leibler 散度 的概念——一种估计两个统计分布相似程度的度量。

VAE 的一个重要优势是它可以相对轻松地生成新图像,因为我们知道从哪个分布中抽取潜在向量。例如,如果我们在 MNIST 数据集上用 2D 潜在向量训练 VAE,我们可以通过改变潜在向量的分量来获得不同的数字:

<img alt="vaemnist" src="../../../../../translated_images/zh-CN/vaemnist.cab9e602dc08dc50.webp" width="50%"/>

图片来源:Dmitry Soshnikov

观察图像如何相互融合,当我们从潜在参数空间的不同部分获取潜在向量时,图像开始逐渐变化。我们还可以将这个空间可视化为二维:

<img alt="vaemnist cluster" src="../../../../../translated_images/zh-CN/vaemnist-diag.694315f775d5d666.webp" width="50%"/>

图片来源:Dmitry Soshnikov

✍️ 练习:自动编码器

通过以下笔记本了解更多关于自动编码器的内容:

自动编码器的特性

  • 数据特定性 - 它们只对训练时使用的图像类型效果良好。例如,如果我们在花卉图像上训练一个超分辨率网络,它在肖像图像上效果可能不佳。这是因为网络通过从训练数据集中学习的特征中提取细节来生成高分辨率图像。
  • 有损性 - 重建的图像与原始图像并不完全相同。损失的性质由训练期间使用的损失函数定义。
  • 适用于未标注数据

课后测验

总结

在本课中,您学习了 AI 科学家可用的各种类型的自动编码器。您学习了如何构建它们,以及如何使用它们重建图像。您还学习了 VAE 以及如何使用它生成新图像。

🚀 挑战

在本课中,您学习了如何将自动编码器用于图像。但它们也可以用于音乐!查看 Magenta 项目的 MusicVAE 项目,该项目使用自动编码器学习重建音乐。使用该库进行一些实验,看看您能创造出什么。

课后测验

复习与自学

参考以下资源,了解更多关于自动编码器的内容:

作业

使用 TensorFlow 的自动编码器笔记本 的末尾,您会发现一个“任务”——将其作为您的作业。

---

---

第 4-ComputerVision 课:生成对抗网络

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/10-GANs/README.md

生成对抗网络

在上一节中,我们学习了生成模型:可以生成与训练数据集中的图像相似的新图像的模型。VAE是生成模型的一个很好的例子。

课前测验

然而,如果我们尝试生成一些真正有意义的内容,比如一幅分辨率合理的画作,使用VAE时会发现训练效果并不理想。针对这种情况,我们需要学习另一种专门用于生成模型的架构——生成对抗网络,简称GAN。

GAN的核心思想是使用两个神经网络相互对抗进行训练:

<img src="../../../../../translated_images/zh-CN/gan_architecture.8f3a5ab62b8d5d69.webp" width="70%"/>

图片来源:Dmitry Soshnikov
✅ 一些术语:
* 生成器是一个网络,它接收一个随机向量,并生成图像作为输出。
* 判别器是一个网络,它接收一张图像,并判断该图像是来自训练数据集的真实图像,还是由生成器生成的虚假图像。它本质上是一个图像分类器。

判别器

判别器的架构与普通的图像分类网络没有区别。最简单的情况下,它可以是一个全连接分类器,但更常见的是一个卷积网络

✅ 基于卷积网络的GAN被称为DCGAN

一个CNN判别器由以下层组成:几个卷积+池化层(空间尺寸逐渐减小),以及一个或多个全连接层以获得“特征向量”,最后是一个二分类器。

✅ “池化”是一种减少图像尺寸的技术。“池化层通过将一个层中神经元簇的输出合并为下一层中的单个神经元来减少数据的维度。” - 来源

生成器

生成器稍微复杂一些。可以将其视为一个反向的判别器。从一个潜在向量(代替特征向量)开始,它通过一个全连接层将其转换为所需的尺寸/形状,然后进行反卷积+上采样。这类似于自动编码器的*解码器*部分。

✅ 由于卷积层是通过线性滤波器遍历图像实现的,反卷积本质上与卷积类似,可以使用相同的层逻辑实现。

<img src="../../../../../translated_images/zh-CN/gan_arch_detail.46b95fd366f8e543.webp" width="70%"/>

图片来源:Dmitry Soshnikov

GAN的训练

GAN被称为对抗性网络,因为生成器和判别器之间存在持续的竞争。在这种竞争中,生成器和判别器都会不断改进,从而使网络能够生成越来越好的图像。

训练分为两个阶段:

  • 训练判别器。这个任务相对简单:我们通过生成器生成一批图像,将其标记为0(代表虚假图像),然后从输入数据集中取一批图像(标记为1,真实图像)。我们计算出判别器的*损失*,并进行反向传播。
  • 训练生成器。这稍微复杂一些,因为我们无法直接知道生成器的期望输出。我们将整个GAN网络(由生成器和判别器组成)输入一些随机向量,并期望输出为1(对应真实图像)。然后我们冻结判别器的参数(此步骤不对判别器进行训练),并进行反向传播。

在这个过程中,生成器和判别器的损失不会显著下降。在理想情况下,它们应该呈现振荡状态,表明两个网络都在不断提高性能。

✍️ 练习:GANs

GAN训练中的问题

GAN训练尤其困难,以下是一些常见问题:

  • 模式崩溃。指生成器学会生成一种成功欺骗判别器的图像,而不是生成多样化的图像。
  • 对超参数的敏感性。经常会发现GAN完全无法收敛,但突然降低学习率后可能会收敛。
  • 保持生成器和判别器之间的平衡。在许多情况下,判别器的损失可能会迅速降到零,导致生成器无法继续训练。为了解决这个问题,可以尝试为生成器和判别器设置不同的学习率,或者在判别器损失已经很低时跳过判别器的训练。
  • 高分辨率训练。与自动编码器类似的问题,重建卷积网络的过多层会导致伪影。通常通过所谓的渐进式增长来解决这一问题,先用低分辨率图像训练几层,然后逐步“解锁”或添加层。另一种解决方案是增加层之间的额外连接,同时训练多个分辨率——详情请参阅这篇多尺度梯度GAN论文

风格迁移

GAN是生成艺术图像的绝佳工具。另一种有趣的技术是所谓的风格迁移,它将一个内容图像重新绘制为另一种风格,应用来自风格图像的滤镜。

其工作原理如下:

  • 我们从一个随机噪声图像开始(或者从内容图像开始,但为了便于理解,通常从随机噪声开始)。
  • 我们的目标是生成一个图像,使其同时接近内容图像和风格图像。这通过两个损失函数来确定:

- 内容损失基于CNN在某些层从当前图像和内容图像中提取的特征计算。 - 风格损失通过一种巧妙的方法使用Gram矩阵在当前图像和风格图像之间计算(更多细节请参阅示例笔记本)。

  • 为了使图像更平滑并去除噪声,我们还引入了变化损失,它计算相邻像素之间的平均距离。
  • 主要的优化循环通过梯度下降(或其他优化算法)调整当前图像,以最小化总损失,总损失是所有三种损失的加权和。

✍️ 示例:风格迁移

课后测验

总结

在本课中,您学习了GAN及其训练方法。您还了解了这种类型的神经网络可能面临的特殊挑战,以及一些解决这些问题的策略。

🚀 挑战

运行风格迁移笔记本,使用您自己的图像进行实验。

复习与自学

参考以下资源,了解更多关于GAN的信息:

作业

重新访问本课相关的两个笔记本之一,并使用您自己的图像重新训练GAN。您能创造出什么?

---

---

第 4-ComputerVision 课:目标检测

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/11-ObjectDetection/README.md

目标检测

我们之前处理的图像分类模型会接收一张图片并输出一个类别结果,例如在 MNIST 问题中输出类别“数字”。然而,在许多情况下,我们不仅仅想知道图片中有物体,还希望能够确定它们的具体位置。这正是目标检测的核心所在。

课前测验

!目标检测

图片来源:YOLO v2 网站

一种简单的目标检测方法

假设我们想在一张图片中找到一只猫,一种非常简单的目标检测方法如下:

  1. 将图片分割成多个小块。
  2. 对每个小块进行图像分类。
  3. 对于分类结果激活值足够高的小块,可以认为其中包含目标物体。

!简单目标检测

*图片来源:练习笔记本*

然而,这种方法远非理想,因为它只能非常粗略地定位物体的边界框。为了更精确地定位,我们需要进行某种回归来预测边界框的坐标——这需要特定的数据集。

用回归进行目标检测

这篇博客文章对检测形状进行了很好的入门介绍。

目标检测数据集

在进行目标检测任务时,你可能会遇到以下数据集:

  • PASCAL VOC - 包含20个类别
  • COCO - 常见物体上下文数据集。包含80个类别、边界框和分割掩码

!COCO

目标检测评估指标

交并比(Intersection over Union)

对于图像分类来说,评估算法性能相对简单;但对于目标检测,我们需要同时评估类别的正确性以及推断出的边界框位置的精确性。后者通常使用交并比(IoU)来衡量两个框(或任意两个区域)的重叠程度。

!IoU

*图片来源:这篇关于IoU的优秀博客文章*

其思想很简单——将两个图形的交集面积除以它们的并集面积。对于两个完全相同的区域,IoU值为1;对于完全不相交的区域,IoU值为0。其他情况下,IoU值介于0到1之间。我们通常只考虑IoU值超过某个阈值的边界框。

平均精度(Average Precision)

假设我们想评估某个类别$C$的识别效果。为此,我们使用平均精度(AP)指标,其计算方法如下:

  1. 绘制精度-召回曲线,显示检测阈值(从0到1)变化时的准确性。
  2. 根据阈值,我们会检测到图片中的更多或更少的物体,并得到不同的精度和召回值。
  3. 曲线如下所示:

<img src="https://github.com/shwars/NeuroWorkshop/raw/master/images/ObjDetectionPrecisionRecall.png"/>

*图片来源:NeuroWorkshop*

类别$C$的平均精度是该曲线下的面积。更具体地说,召回轴通常分为10个部分,精度在这些点上取平均值:

$$ AP = {1\over11}\sum_{i=0}^{10}\mbox{Precision}(\mbox{Recall}={i\over10}) $$

AP与IoU

我们只考虑IoU超过某个阈值的检测结果。例如,在PASCAL VOC数据集中,通常假设$\mbox{IoU Threshold} = 0.5$,而在COCO数据集中,AP会针对不同的$\mbox{IoU Threshold}$值进行测量。

<img src="https://github.com/shwars/NeuroWorkshop/raw/master/images/ObjDetectionPrecisionRecallIoU.png"/>

*图片来源:NeuroWorkshop*

平均平均精度(Mean Average Precision - mAP)

目标检测的主要评估指标是平均平均精度(mAP)。它是所有类别的平均精度值,有时也会对$\mbox{IoU Threshold}$进行平均。更详细的mAP计算过程可以参考 这篇博客文章,以及这里的代码示例

不同的目标检测方法

目标检测算法主要分为两大类:

  • 区域提议网络(R-CNN, Fast R-CNN, Faster R-CNN)。其核心思想是生成兴趣区域(ROI),并对其运行CNN以寻找最大激活值。这种方法与简单方法有些类似,但ROI的生成方式更为智能。这类方法的主要缺点是速度较慢,因为需要对图像进行多次CNN分类器的处理。
  • 单次检测(YOLO, SSD, RetinaNet)方法。这些架构设计的网络能够在一次处理过程中同时预测类别和ROI。

R-CNN:基于区域的CNN

R-CNN使用选择性搜索生成ROI区域的层次结构,然后通过CNN特征提取器和SVM分类器确定物体类别,并通过线性回归确定*边界框*坐标。官方论文

!RCNN

*图片来源:van de Sande et al. ICCV’11*

!RCNN-1

*图片来源:这篇博客*

F-RCNN - 快速R-CNN

这种方法与R-CNN类似,但区域是在应用卷积层之后定义的。

!FRCNN

图片来源:官方论文arXiv,2015

Faster R-CNN

这种方法的核心思想是使用神经网络预测ROI——即所谓的*区域提议网络*。论文,2016

!FasterRCNN

图片来源:官方论文

R-FCN:基于区域的全卷积网络

这种算法比Faster R-CNN更快。其核心思想如下:

  1. 使用ResNet-101提取特征。
  2. 特征通过位置敏感得分图处理。每个类别$C$的物体被划分为$k\times k$区域,并训练预测物体的各部分。
  3. 对于$k\times k$区域中的每个部分,所有网络对物体类别进行投票,选择投票最多的类别。

!r-fcn image

图片来源:官方论文

YOLO - 只看一次

YOLO是一种实时单次检测算法。其核心思想如下:

* 将图像划分为$S\times S$区域。 * 对每个区域,CNN预测$n$个可能的物体、*边界框*坐标和*置信度*=*概率* * IoU。

!YOLO

图片来源:官方论文

其他算法

- Torchvision中的PyTorch实现 - Keras实现 - Keras示例中的RetinaNet目标检测

✍️ 练习:目标检测

通过以下笔记本继续学习:

ObjectDetection.ipynb

总结

在本课中,你快速了解了实现目标检测的各种方法!

🚀 挑战

阅读以下关于YOLO的文章和笔记本,并尝试自己动手实践:

* 官方网站 * YOLO:Keras实现逐步讲解笔记本 * YOLO v2:Keras实现逐步讲解笔记本

课后测验

复习与自学

作业:目标检测

---

---

第 4-ComputerVision 课:分割

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/4-ComputerVision/12-Segmentation/README.md

分割

我们之前学习了目标检测,它可以通过预测*边界框*来定位图像中的对象。然而,对于某些任务,我们不仅需要边界框,还需要更精确的对象定位。这项任务被称为分割

课前测验

分割可以看作是像素分类,即对于图像中的每个像素,我们必须预测其类别(*背景*是其中一个类别)。主要有两种分割算法:

  • 语义分割只告诉像素的类别,不区分同一类别的不同对象。
  • 实例分割将类别划分为不同的实例。

例如,对于实例分割,这些羊是不同的对象;而对于语义分割,所有的羊都被表示为一个类别。

<img src="../../../../../translated_images/zh-CN/instance_vs_semantic.eee9812bebf8cd45.webp" width="50%">

图片来源于这篇博客文章

分割有不同的神经网络架构,但它们的结构都相同。从某种意义上说,它类似于你之前学习过的自动编码器,但不是解构原始图像,而是解构一个掩码。因此,分割网络包括以下部分:

  • 编码器从输入图像中提取特征
  • 解码器将这些特征转换为掩码图像,其大小与通道数对应于类别数量。

<img src="../../../../../translated_images/zh-CN/segm.92442f2cb42ff4fa.webp" width="80%">

图片来源于这篇论文

我们特别需要提到分割中使用的损失函数。在使用经典自动编码器时,我们需要测量两张图像之间的相似性,可以使用均方误差(MSE)来实现。在分割中,目标掩码图像中的每个像素表示类别编号(在第三维度上进行独热编码),因此我们需要使用特定于分类的损失函数——交叉熵损失,并对所有像素进行平均。如果掩码是二值的,则使用二值交叉熵损失(BCE)。

✅ 独热编码是一种将类别标签编码为长度等于类别数量的向量的方法。可以查看这篇文章了解这一技术。

医学影像中的分割

在本课中,我们将通过训练网络识别医学图像中的人类痣(也称为黑痣)来实际应用分割技术。我们将使用<a href="https://www.fc.up.pt/addi/ph2%20database.html">PH<sup>2</sup>数据库</a>的皮肤镜图像作为图像来源。该数据集包含200张图像,分为三类:典型痣、非典型痣和黑色素瘤。所有图像还包含一个对应的掩码,用于勾勒痣的轮廓。

✅ 这种技术特别适用于这种类型的医学影像,但你还能想到哪些其他的实际应用场景?

<img alt="navi" src="../../../../../translated_images/zh-CN/navi.2f20b727910110ea.webp"/>

图片来源于PH<sup>2</sup>数据库

我们将训练一个模型,将任何痣从背景中分割出来。

✍️ 练习:语义分割

打开以下笔记本,了解不同的语义分割架构,练习使用它们,并观察它们的实际效果。

课后测验

总结

分割是一种非常强大的图像分类技术,它超越了边界框,实现了像素级分类。这项技术在医学影像等领域有广泛应用。

🚀 挑战

人体分割只是我们可以对人物图像进行的常见任务之一。其他重要任务包括骨架检测姿态检测。试试OpenPose库,看看姿态检测的实际应用。

复习与自学

这篇维基百科文章提供了关于该技术各种应用的良好概述。自行学习实例分割和全景分割领域的相关知识。

作业

在本实验中,尝试使用Segmentation Full Body MADS Dataset数据集进行人体分割

---

---

第 5-NLP 课:将文本表示为张量

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/13-TextRep/README.md

将文本表示为张量

课前测验

文本分类

在本节的第一部分中,我们将专注于文本分类任务。我们将使用 AG News 数据集,该数据集包含如下新闻文章:

  • 类别:科技
  • 标题:Ky.公司获得研究肽类的资助(美联社)
  • 正文:美联社 - 一家由路易斯维尔大学化学研究员创立的公司获得了一项开发资助...

我们的目标是根据文本将新闻项目分类到某个类别中。

表示文本

如果我们想用神经网络解决自然语言处理(NLP)任务,我们需要一种方法将文本表示为张量。计算机已经通过诸如 ASCII 或 UTF-8 等编码将文本字符表示为数字,这些数字映射到屏幕上的字体。

<img alt="显示字符映射到 ASCII 和二进制表示的图示" src="../../../../../translated_images/zh-CN/ascii-character-map.18ed6aa7f3b0a7ff.webp" width="50%"/>

图片来源

作为人类,我们理解每个字母代表什么,以及所有字符如何组合形成句子的单词。然而,计算机本身并没有这样的理解,神经网络需要在训练过程中学习这些含义。

因此,我们可以使用不同的方法来表示文本:

  • 字符级表示,即将文本中的每个字符表示为一个数字。假设我们的文本语料库中有 *C* 个不同的字符,那么单词 *Hello* 将被表示为一个 5x*C* 的张量。每个字母对应于一个独热编码的张量列。
  • 词级表示,即我们创建一个包含文本中所有单词的词汇表,然后使用独热编码表示单词。这种方法更好一些,因为单个字母本身没有太多意义,因此通过使用更高级的语义概念——单词——我们简化了神经网络的任务。然而,由于词汇表的规模较大,我们需要处理高维稀疏张量。

无论采用哪种表示方式,我们首先需要将文本转换为标记序列,一个标记可以是字符、单词,甚至是单词的一部分。然后,我们使用词汇表将标记转换为数字,这个数字可以通过独热编码输入到神经网络中。

N-Grams

在自然语言中,单词的确切含义只能在上下文中确定。例如,*神经网络* 和 *捕鱼网络* 的含义完全不同。考虑上下文的一种方法是基于单词对构建模型,并将单词对视为单独的词汇标记。这样,句子 *I like to go fishing* 将被表示为以下标记序列:*I like*,*like to*,*to go*,*go fishing*。这种方法的问题在于词汇表的规模显著增长,并且像 *go fishing* 和 *go shopping* 这样的组合被表示为不同的标记,尽管它们使用了相同的动词,但并没有共享任何语义相似性。

在某些情况下,我们可能会考虑使用三元组(tri-grams)——三个单词的组合。因此,这种方法通常被称为n-grams。此外,使用字符级表示时,n-grams 通常大致对应于不同的音节。

词袋模型和 TF/IDF

在解决文本分类等任务时,我们需要能够用一个固定大小的向量表示文本,这个向量将作为最终密集分类器的输入。最简单的方法之一是组合所有单个单词的表示,例如通过将它们相加。如果我们将每个单词的独热编码相加,我们将得到一个频率向量,显示每个单词在文本中出现的次数。这种文本表示被称为词袋模型(BoW)。

<img src="../../../../../translated_images/zh-CN/bow.3811869cff59368d.webp" width="90%"/>

图片由作者提供

词袋模型本质上表示了文本中出现了哪些单词以及它们的数量,这确实可以很好地指示文本的内容。例如,关于政治的新闻文章可能包含 *总统* 和 *国家* 等词,而科学出版物可能包含 *对撞机*、*发现* 等词。因此,单词频率在许多情况下可以很好地指示文本内容。

词袋模型的问题在于某些常见单词,例如 *and*、*is* 等,出现在大多数文本中,并且它们的频率最高,从而掩盖了真正重要的单词。我们可以通过考虑单词在整个文档集合中出现的频率来降低这些单词的重要性。这就是 TF/IDF 方法的主要思想,该方法在本课附带的笔记本中有更详细的介绍。

然而,这些方法都无法完全考虑文本的语义。我们需要更强大的神经网络模型来实现这一点,我们将在本节后续内容中讨论。

✍️ 练习:文本表示

通过以下笔记本继续学习:

总结

到目前为止,我们已经学习了可以为不同单词添加频率权重的技术。然而,这些技术无法表示单词的含义或顺序。正如著名语言学家 J. R. Firth 在1935年所说:“单词的完整意义总是与上下文相关,任何脱离上下文的意义研究都不能被认真对待。”我们将在课程后续内容中学习如何通过语言建模从文本中捕获上下文信息。

🚀 挑战

尝试使用词袋模型和不同的数据模型完成一些其他练习。你可以参考这个 Kaggle 比赛 来获得灵感。

课后测验

复习与自学

Microsoft Learn 上练习你的文本嵌入和词袋模型技术。

作业:笔记本

---

---

第 5-NLP 课:嵌入

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/14-Embeddings/README.md

嵌入

课前测验

在基于 BoW 或 TF/IDF 训练分类器时,我们使用的是长度为 vocab_size 的高维词袋向量,并且我们显式地将低维位置表示向量转换为稀疏的独热表示。然而,这种独热表示并不节省内存。此外,每个单词都被独立对待,即独热编码的向量无法表达单词之间的语义相似性。

嵌入的想法是用低维密集向量来表示单词,这些向量能够以某种方式反映单词的语义含义。稍后我们会讨论如何构建有意义的词嵌入,但现在我们只需将嵌入理解为一种降低单词向量维度的方法。

嵌入层会将一个单词作为输入,并生成指定 embedding_size 的输出向量。从某种意义上说,它与 Linear 层非常相似,但它不需要独热编码向量,而是可以直接接受单词编号作为输入,从而避免创建大型独热编码向量。

通过在分类器网络中使用嵌入层作为第一层,我们可以从词袋模型切换到 嵌入袋 模型。在嵌入袋模型中,我们首先将文本中的每个单词转换为对应的嵌入,然后对所有这些嵌入计算某种聚合函数,例如 sumaveragemax

!展示五个序列单词的嵌入分类器的图片。

图片由作者提供

✍️ 练习:嵌入

通过以下笔记本继续学习:

语义嵌入:Word2Vec

虽然嵌入层可以学习将单词映射到向量表示,但这种表示不一定具有很强的语义意义。如果我们能学习一种向量表示,使得相似单词或同义词在某种向量距离(例如欧几里得距离)上彼此接近,那就更好了。

为此,我们需要以特定方式在大量文本上预训练嵌入模型。一种训练语义嵌入的方法叫做 Word2Vec。它基于两种主要架构来生成单词的分布式表示:

- 连续词袋 (CBoW) —— 在这种架构中,我们训练模型根据上下文预测单词。给定 ngram $(W_{-2},W_{-1},W_0,W_1,W_2)$,模型的目标是根据 $(W_{-2},W_{-1},W_1,W_2)$ 预测 $W_0$。 - 连续跳词模型 (Skip-Gram) —— 与 CBoW 相反,模型使用上下文窗口中的单词来预测当前单词。

CBoW 速度更快,而 Skip-Gram 虽然较慢,但在表示不常见单词方面表现更好。

!展示 CBoW 和 Skip-Gram 算法将单词转换为向量的图片。

图片来源于 这篇论文

Word2Vec 预训练嵌入(以及其他类似模型,例如 GloVe)也可以替代神经网络中的嵌入层使用。然而,我们需要处理词汇表问题,因为用于预训练 Word2Vec/GloVe 的词汇表可能与我们文本语料库中的词汇表不同。查看上述笔记本,了解如何解决这个问题。

上下文嵌入

传统的预训练嵌入表示(如 Word2Vec)的一个主要限制是词义消歧问题。虽然预训练嵌入可以捕捉单词在上下文中的部分含义,但每个单词的所有可能含义都被编码到同一个嵌入中。这可能会在下游模型中引发问题,因为许多单词(例如“play”)的含义会根据使用的上下文而有所不同。

例如,“play”在以下两个句子中的含义完全不同:

  • 我去剧院看了一场戏剧
  • 约翰想和朋友们玩耍

上述预训练嵌入将“play”的这两种含义表示为同一个嵌入。为了克服这一限制,我们需要基于语言模型构建嵌入,该模型在大量文本语料库上进行训练,并且*了解*单词在不同上下文中的组合方式。讨论上下文嵌入超出了本教程的范围,但我们将在课程后续讨论语言模型时回到这个话题。

总结

在本课中,你学习了如何在 TensorFlow 和 PyTorch 中构建和使用嵌入层,以更好地反映单词的语义含义。

🚀 挑战

Word2Vec 已被用于一些有趣的应用,包括生成歌词和诗歌。看看这篇文章,作者在其中介绍了如何使用 Word2Vec 生成诗歌。还可以观看Dan Shiffmann 的这个视频,了解该技术的另一种解释。然后尝试将这些技术应用到你自己的文本语料库中,可以从 Kaggle 获取数据。

课后测验

复习与自学

阅读这篇关于 Word2Vec 的论文:Efficient Estimation of Word Representations in Vector Space

作业:笔记本

---

---

第 5-NLP 课:语言建模

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/15-LanguageModeling/README.md

语言建模

语义嵌入(如 Word2Vec 和 GloVe)实际上是迈向语言建模的第一步——创建某种能够*理解*(或*表示*)语言本质的模型。

课前测验

语言建模的核心思想是通过无监督方式在未标注的数据集上进行训练。这非常重要,因为我们拥有大量未标注的文本,而标注文本的数量总是受到标注工作量的限制。通常,我们可以构建能够预测文本中缺失单词的语言模型,因为在文本中随机遮盖一个单词并将其作为训练样本是非常容易的。

嵌入训练

在之前的例子中,我们使用了预训练的语义嵌入,但了解这些嵌入是如何训练的也很有趣。有几种可能的思路可以用来训练嵌入:

  • N-Gram语言建模,通过查看前 N 个标记(N-gram)来预测一个标记。
  • 连续词袋模型 (CBoW),通过预测标记序列 $W_{-N}$, ..., $W_N$ 中的中间标记 $W_0$。
  • Skip-gram,通过中间标记 $W_0$ 来预测一组邻近标记 {$W_{-N},\dots, W_{-1}, W_1,\dots, W_N$}。

!论文中关于将单词转换为向量的算法示例

图片来源于这篇论文

✍️ 示例笔记本:训练 CBoW 模型

通过以下笔记本继续学习:

总结

在上一节课中,我们看到单词嵌入的效果非常神奇!现在我们知道训练单词嵌入并不是一项非常复杂的任务,如果需要,我们应该能够为特定领域的文本训练自己的单词嵌入。

课后测验

复习与自学

🚀 作业:训练 Skip-Gram 模型

在实验中,我们挑战你修改本课的代码以训练 Skip-Gram 模型而不是 CBoW。阅读详情

---

---

第 5-NLP 课:循环神经网络

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/16-RNN/README.md

循环神经网络

课前测验

在之前的章节中,我们使用了丰富的文本语义表示,并在嵌入层之上使用了一个简单的线性分类器。这种架构能够捕捉句子中词语的整体意义,但它没有考虑到词语的顺序,因为嵌入层上的聚合操作会丢失原始文本中的顺序信息。由于这些模型无法建模词语的顺序,它们无法解决更复杂或更模糊的任务,例如文本生成或问答。

为了捕捉文本序列的意义,我们需要使用另一种神经网络架构,称为循环神经网络(Recurrent Neural Network,RNN)。在 RNN 中,我们将句子逐个符号输入网络,网络会生成某种状态,然后将该状态与下一个符号一起再次输入网络。

!RNN

图片由作者提供

给定输入序列的标记 X<sub>0</sub>,...,X<sub>n</sub>,RNN 会创建一个神经网络块的序列,并通过反向传播对该序列进行端到端训练。每个网络块以 (X<sub>i</sub>,S<sub>i</sub>) 为输入,并生成 S<sub>i+1</sub> 作为结果。最终状态 S<sub>n</sub> 或 (输出 Y<sub>n</sub>) 会进入线性分类器以生成结果。所有网络块共享相同的权重,并通过一次反向传播训练端到端。

由于状态向量 S<sub>0</sub>,...,S<sub>n</sub> 会通过网络传递,RNN 能够学习词语之间的顺序依赖关系。例如,当单词 *not* 出现在序列中的某处时,它可以学习在状态向量中否定某些元素,从而实现否定。

✅ 由于上图中所有 RNN 块的权重是共享的,因此可以将整个图表示为一个带有循环反馈的单块(右侧),将网络的输出状态反馈到输入。

RNN 单元的结构

让我们看看一个简单的 RNN 单元是如何组织的。它接受前一个状态 S<sub>i-1</sub> 和当前符号 X<sub>i</sub> 作为输入,并生成输出状态 S<sub>i</sub>(有时我们也对其他输出 Y<sub>i</sub> 感兴趣,例如在生成网络中)。

一个简单的 RNN 单元内部有两个权重矩阵:一个用于转换输入符号(我们称之为 W),另一个用于转换输入状态(H)。在这种情况下,网络的输出计算公式为 &sigma;(W&times;X<sub>i</sub>+H&times;S<sub>i-1</sub>+b),其中 &sigma; 是激活函数,b 是额外的偏置。

<img alt="RNN 单元结构" src="../../../../../translated_images/zh-CN/rnn-anatomy.79ee3f3920b3294b.webp" width="50%"/>

图片由作者提供

在许多情况下,输入标记会在进入 RNN 之前通过嵌入层以降低维度。在这种情况下,如果输入向量的维度为 *emb_size*,状态向量的维度为 *hid_size*,那么 W 的大小为 *emb_size*&times;*hid_size*,H 的大小为 *hid_size*&times;*hid_size*。

长短时记忆网络(LSTM)

经典 RNN 的主要问题之一是所谓的梯度消失问题。由于 RNN 是通过一次反向传播端到端训练的,它很难将误差传播到网络的第一层,因此无法学习远距离标记之间的关系。解决这一问题的一种方法是通过使用所谓的门控机制引入显式状态管理。有两种著名的架构:长短时记忆网络(Long Short Term Memory,LSTM)和门控循环单元(Gated Relay Unit,GRU)。

!显示长短时记忆单元示例的图片

图片来源待定

LSTM 网络的组织方式与 RNN 类似,但有两个状态会从层到层传递:实际状态 C 和隐藏向量 H。在每个单元中,隐藏向量 H<sub>i</sub> 与输入 X<sub>i</sub> 连接在一起,它们通过门控机制控制状态 C 的变化。每个门控机制都是一个带有 sigmoid 激活(输出范围为 [0,1])的神经网络,可以通过与状态向量相乘来视为逐位掩码。以下是这些门控机制(从左到右):

  • 遗忘门:接收隐藏向量并决定状态向量 C 的哪些部分需要遗忘,哪些需要保留。
  • 输入门:从输入和隐藏向量中提取信息并插入状态。
  • 输出门:通过带有 *tanh* 激活的线性层转换状态,然后使用隐藏向量 H<sub>i</sub> 选择状态的某些部分以生成新状态 C<sub>i+1</sub>。

状态 C 的各个组成部分可以被视为一些可以打开或关闭的标志。例如,当我们在序列中遇到名字 *Alice* 时,我们可能会假设它指代一个女性角色,并在状态中设置一个标志,表示句子中有一个女性名词。当我们进一步遇到短语 *and Tom* 时,我们会设置一个标志,表示句子中有复数名词。因此,通过操控状态,我们可以跟踪句子部分的语法属性。

✅ 理解 LSTM 内部机制的一个优秀资源是 Christopher Olah 的这篇文章 Understanding LSTM Networks

双向和多层 RNN

我们已经讨论了单向运行的循环网络,从序列的开头到结尾。这看起来很自然,因为它类似于我们阅读和听语音的方式。然而,由于在许多实际情况下我们可以随机访问输入序列,因此同时进行双向循环计算可能更有意义。这种网络称为双向 RNN。在处理双向网络时,我们需要两个隐藏状态向量,每个方向一个。

循环网络,无论是单向还是双向,都能捕捉序列中的某些模式,并将其存储到状态向量中或传递到输出中。与卷积网络类似,我们可以在第一层之上构建另一层循环网络,以捕捉更高级的模式,并从第一层提取的低级模式中构建。这引出了多层 RNN 的概念,它由两个或更多循环网络组成,其中前一层的输出作为输入传递到下一层。

!显示多层长短时记忆 RNN 的图片

*图片来自 Fernando López 的这篇精彩文章*

✍️ 练习:嵌入

通过以下笔记本继续学习:

总结

在本单元中,我们了解到 RNN 可用于序列分类,但实际上它们可以处理更多任务,例如文本生成、机器翻译等。我们将在下一单元中讨论这些任务。

🚀 挑战

阅读一些关于 LSTM 的文献并思考它们的应用:

课后测验

复习与自学

作业:笔记本

---

---

第 5-NLP 课:生成网络

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/17-GenerativeNetworks/README.md

生成网络

课前测验

循环神经网络(RNN)及其门控单元变体(如长短时记忆单元 LSTM 和门控循环单元 GRU)提供了一种语言建模机制,它们可以学习单词的顺序并预测序列中的下一个单词。这使得我们可以使用 RNN 执行生成任务,例如普通文本生成、机器翻译,甚至图像描述。

✅ 想想你在输入时受益于文本补全等生成任务的所有场景。研究一下你喜欢的应用程序,看看它们是否使用了 RNN。

在我们上一单元讨论的 RNN 架构中,每个 RNN 单元会生成下一个隐藏状态作为输出。然而,我们也可以为每个循环单元添加另一个输出,这样就可以输出一个序列(与原始序列长度相等)。此外,我们可以使用不在每一步接受输入的 RNN 单元,只接受一些初始状态向量,然后生成一系列输出。

这使得可以构建不同的神经网络架构,如下图所示:

!展示常见循环神经网络模式的图片。

图片来源于 Andrej Karpaty 的博客文章 循环神经网络的非凡有效性
  • 一对一是传统的神经网络,具有一个输入和一个输出
  • 一对多是一种生成架构,接受一个输入值并生成一系列输出值。例如,如果我们想训练一个图像描述网络来生成图片的文本描述,可以将图片作为输入,通过 CNN 获得其隐藏状态,然后通过循环链逐字生成描述
  • 多对一对应于我们在上一单元中描述的 RNN 架构,例如文本分类
  • 多对多序列到序列对应于任务如机器翻译,其中第一个 RNN 收集输入序列中的所有信息到隐藏状态,另一个 RNN 链将该状态展开为输出序列。

在本单元中,我们将重点关注帮助生成文本的简单生成模型。为了简化,我们将使用字符级标记化。

我们将训练这个 RNN 逐步生成文本。在每一步中,我们将取长度为 nchars 的字符序列,并要求网络为每个输入字符生成下一个输出字符:

!展示 RNN 生成单词 'HELLO' 的示例图片。

在生成文本(推理阶段)时,我们从某个提示开始,将其传递给 RNN 单元以生成中间状态,然后从该状态开始生成。我们一次生成一个字符,并将状态和生成的字符传递给另一个 RNN 单元以生成下一个字符,直到生成足够的字符。

<img src="../../../../../translated_images/zh-CN/rnn-generate-inf.5168dc65e0370eea.webp" width="60%"/>

图片由作者提供

✍️ 练习:生成网络

通过以下笔记本继续学习:

软文本生成与温度

每个 RNN 单元的输出是一个字符的概率分布。如果我们总是选择概率最高的字符作为生成文本的下一个字符,文本可能会出现“循环”现象,重复相同的字符序列,如以下示例:

today of the second the company and a second the company ...

然而,如果我们查看下一个字符的概率分布,可能会发现几个最高概率之间的差异并不大,例如一个字符的概率为 0.2,另一个为 0.19 等。例如,在寻找序列 '*play*' 的下一个字符时,下一个字符可能是空格,也可能是 e(如单词 *player*)。

这让我们得出结论:选择概率最高的字符并不总是“公平”的,因为选择第二高的字符仍可能生成有意义的文本。更明智的做法是从网络输出的概率分布中采样字符。我们还可以使用一个参数 温度,来平滑概率分布,以增加随机性,或者使分布更陡峭,以更倾向于选择最高概率的字符。

在上述链接的笔记本中探索软文本生成的实现方式。

总结

虽然文本生成本身可能很有用,但其主要优势在于能够从某些初始特征向量使用 RNN 生成文本。例如,文本生成可以作为机器翻译的一部分(序列到序列,在这种情况下,来自*编码器*的状态向量用于生成或*解码*翻译后的消息),或者生成图像的文本描述(在这种情况下,特征向量来自 CNN 提取器)。

🚀 挑战

在 Microsoft Learn 上学习相关课程:

课后测验

复习与自学

以下文章可以扩展你的知识:

  • 使用马尔可夫链、LSTM 和 GPT-2 进行文本生成的不同方法:博客文章
  • Keras 文档中的文本生成示例

作业

我们已经了解了如何逐字符生成文本。在实验中,你将探索逐词生成文本。

---

---

第 5-NLP 课:注意机制与Transformer

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/18-Transformers/README.md

注意机制与Transformer

课前测验

在自然语言处理领域中,机器翻译是一个非常重要的问题,它是像谷歌翻译这样的工具的核心任务。在本节中,我们将重点讨论机器翻译,或者更广泛地说,任何*序列到序列*任务(也称为句子转换)。

使用RNN时,序列到序列任务通过两个循环网络实现,其中一个网络,即编码器,将输入序列压缩为一个隐藏状态,而另一个网络,即解码器,将隐藏状态展开为翻译结果。这种方法存在一些问题:

  • 编码器网络的最终状态难以记住句子的开头,从而导致模型在处理长句子时质量较差。
  • 序列中的所有词对结果的影响相同。然而在实际中,输入序列中的某些词对输出序列的影响往往比其他词更大。

注意机制提供了一种方法,可以对每个输入向量对RNN输出预测的上下文影响进行加权。其实现方式是创建输入RNN的中间状态与输出RNN之间的快捷路径。这样,在生成输出符号y<sub>t</sub>时,我们会考虑所有输入隐藏状态h<sub>i</sub>,并赋予不同的权重系数&alpha;<sub>t,i</sub>。

!显示带有加性注意层的编码器/解码器模型的图像

Bahdanau等人,2015中的加性注意机制编码器-解码器模型,图片来源于这篇博客

注意矩阵{&alpha;<sub>i,j</sub>}表示某些输入词在生成输出序列中某个词时的影响程度。下面是一个这样的矩阵示例:

!显示由RNNsearch-50找到的样本对齐的图像,取自Bahdanau - arviz.org

图片来自Bahdanau等人,2015(图3)

注意机制是当前或接近当前自然语言处理领域的最先进技术的关键所在。然而,添加注意机制会显著增加模型参数的数量,从而导致RNN的扩展问题。RNN扩展的一个关键限制是模型的循环性质使得训练难以批量化和并行化。在RNN中,序列的每个元素都需要按顺序处理,这意味着它无法轻松并行化。

!带有注意机制的编码器解码器

图片来源于谷歌博客

注意机制的采用结合了这一限制,促成了如今我们所熟知和使用的最先进的Transformer模型的诞生,例如BERT和Open-GPT3。

Transformer模型

Transformer的核心思想之一是避免RNN的顺序处理特性,并创建一个在训练过程中可并行化的模型。这通过以下两个想法实现:

  • 位置编码
  • 使用自注意机制捕捉模式,而不是使用RNN(或CNN)(这也是为什么介绍Transformer的论文被称为*Attention is all you need*)

位置编码/嵌入

位置编码的思想如下:

  1. 使用RNN时,标记的相对位置由步数表示,因此不需要显式表示。
  2. 然而,一旦我们切换到注意机制,我们需要知道序列中标记的相对位置。
  3. 为了获得位置编码,我们将标记序列与序列中的标记位置序列(即数字序列0,1, ...)结合起来。
  4. 然后我们将标记位置与标记嵌入向量混合。为了将位置(整数)转换为向量,我们可以使用不同的方法:
  • 可训练嵌入,类似于标记嵌入。这是我们在这里考虑的方法。我们在标记和它们的位置上应用嵌入层,生成维度相同的嵌入向量,然后将它们相加。
  • 固定位置编码函数,如原始论文中提出的。

<img src="../../../../../translated_images/zh-CN/pos-embedding.e41ce9b6cf6078af.webp" width="50%"/>

图片由作者提供

通过位置嵌入,我们可以同时嵌入原始标记及其在序列中的位置。

多头自注意机制

接下来,我们需要捕捉序列中的一些模式。为此,Transformer使用了自注意机制,即将注意机制同时应用于输入和输出的同一序列。应用自注意机制使我们能够考虑句子中的上下文,并查看哪些词是相互关联的。例如,它可以帮助我们识别代词*it*所指代的词,并考虑上下文:

![](https://raw.githubusercontent.com/microsoft/AI-For-Beginners/main/translated_images/zh-CN/CoreferenceResolution.861924d6d384a7d6.webp)

图片来源于谷歌博客

在Transformer中,我们使用多头注意机制,以赋予网络捕捉多种依赖关系的能力,例如长期与短期词关系、共指关系与其他关系等。

TensorFlow Notebook中包含有关Transformer层实现的更多细节。

编码器-解码器注意机制

在Transformer中,注意机制用于两个地方:

  • 使用自注意机制捕捉输入文本中的模式
  • 执行序列翻译——这是编码器和解码器之间的注意层。

编码器-解码器注意机制与RNN中使用的注意机制非常相似,如本节开头所述。以下动画图解释了编码器-解码器注意机制的作用。

!显示Transformer模型中评估过程的动画GIF

由于每个输入位置独立映射到每个输出位置,Transformer比RNN更容易并行化,这使得能够构建更大、更具表现力的语言模型。每个注意头可以用于学习词之间的不同关系,从而改善下游自然语言处理任务。

BERT

BERT(Bidirectional Encoder Representations from Transformers,双向编码器表示)是一个非常大的多层Transformer网络,*BERT-base*有12层,*BERT-large*有24层。模型首先在大规模文本数据(维基百科+书籍)上进行无监督训练(预测句子中的被遮蔽词)。在预训练过程中,模型吸收了大量的语言理解能力,这些能力可以通过微调其他数据集来利用。这一过程称为迁移学习

!图片来源于http://jalammar.github.io/illustrated-bert/

图片来源

✍️ 练习:Transformer

通过以下笔记本继续学习:

总结

在本课中,你学习了Transformer和注意机制,它们是自然语言处理工具箱中的重要工具。Transformer架构有许多变体,包括BERT、DistilBERT、BigBird、OpenGPT3等,这些模型可以进行微调。HuggingFace包提供了一个库,可以使用PyTorch和TensorFlow训练许多这些架构。

🚀 挑战

课后测验

复习与自学

作业

---

---

第 5-NLP 课:命名实体识别

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/19-NER/README.md

命名实体识别

到目前为止,我们主要集中在一个自然语言处理(NLP)任务——分类。然而,神经网络还可以完成其他的NLP任务,其中之一就是**命名实体识别**(NER),它处理的是识别文本中的特定实体,例如地点、人物姓名、日期时间区间、化学式等等。

课前测验

使用NER的示例

假设你想开发一个类似于亚马逊Alexa或谷歌助手的自然语言聊天机器人。智能聊天机器人的工作方式是通过对输入句子进行文本分类来“理解”用户的需求。分类的结果是所谓的意图,它决定了聊天机器人应该执行什么操作。

<img alt="Bot NER" src="../../../../../translated_images/zh-CN/bot-ner.4b09235dbb0ad275.webp" width="50%"/>

图片由作者提供

然而,用户可能会在短语中提供一些参数。例如,当询问天气时,她可能会指定一个地点或日期。机器人应该能够理解这些实体,并在执行操作之前相应地填充参数槽。这正是NER的作用所在。

✅ 另一个例子是分析科学医学论文。我们需要寻找的主要内容是特定的医学术语,例如疾病和药物成分。虽然少量疾病可能可以通过子字符串搜索提取,但更复杂的实体,例如化学化合物和药物名称,则需要更复杂的方法。

NER作为标记分类

NER模型本质上是标记分类模型,因为对于每个输入标记,我们需要决定它是否属于某个实体,如果属于,则属于哪个实体类别。

考虑以下论文标题:

三尖瓣反流碳酸锂在新生儿中的毒性

这里的实体是:

  • 三尖瓣反流是一种疾病(DIS
  • 碳酸锂是一种化学物质(CHEM
  • 毒性也是一种疾病(DIS

注意,一个实体可能跨越多个标记。而且,如本例所示,我们需要区分两个连续的实体。因此,通常为每个实体使用两个类别——一个指定实体的第一个标记(通常使用B-前缀,表示开始),另一个表示实体的延续部分(I-,表示内部标记)。我们还使用O作为类别来表示所有其他标记。这种标记标注称为BIO标注)(或IOB)。标注后的标题如下所示:

标记标签
三尖瓣B-DIS
反流I-DIS
O
碳酸B-CHEM
I-CHEM
毒性B-DIS
O
新生儿O
O
O
毒性O
O

由于我们需要在标记和类别之间建立一一对应关系,我们可以从下图中训练一个最右侧的多对多神经网络模型:

!展示常见循环神经网络模式的图片。

*图片来自这篇博客文章作者为Andrej Karpathy。NER标记分类模型对应于此图片中最右侧的网络架构。*

训练NER模型

由于NER模型本质上是一个标记分类模型,我们可以使用我们已经熟悉的RNN来完成这个任务。在这种情况下,每个循环网络块将返回标记ID。以下示例笔记本展示了如何训练用于标记分类的LSTM。

✍️ 示例笔记本:NER

通过以下笔记本继续学习:

总结

NER模型是一种标记分类模型,这意味着它可以用于执行标记分类。这是NLP中非常常见的任务,帮助识别文本中的特定实体,包括地点、姓名、日期等。

🚀 挑战

完成以下链接的作业,训练一个用于医学术语的命名实体识别模型,然后尝试在不同的数据集上使用它。

课后测验

复习与自学

阅读博客循环神经网络的非凡有效性,并按照文章中的进一步阅读部分加深你的知识。

作业

在本课的作业中,你需要训练一个医学实体识别模型。你可以从本课中描述的LSTM模型训练开始,然后使用BERT变换器模型。阅读说明以获取所有详细信息。

---

---

第 5-NLP 课:预训练大型语言模型

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/5-NLP/20-LangModels/README.md

预训练大型语言模型

在我们之前的所有任务中,我们都使用带标签的数据集训练神经网络来完成特定任务。而对于像 BERT 这样的大型 Transformer 模型,我们通过自监督的方式进行语言建模来构建语言模型,然后通过进一步的领域特定训练使其专注于特定的下游任务。然而,研究表明,大型语言模型也可以在没有任何领域特定训练的情况下解决许多任务。这类能够实现这一目标的模型家族被称为 GPT:生成式预训练 Transformer。

课前测验

文本生成与困惑度

神经网络能够在没有下游训练的情况下完成通用任务的理念在论文 Language Models are Unsupervised Multitask Learners 中提出。其核心思想是许多其他任务可以通过 文本生成 来建模,因为理解文本本质上意味着能够生成文本。由于模型在包含人类知识的大量文本上进行了训练,它也因此对广泛的主题有了深入的了解。

理解并能够生成文本也意味着对周围世界有所了解。人类在很大程度上也是通过阅读来学习的,而 GPT 网络在这方面与人类类似。

文本生成网络通过预测下一个词的概率 $$P(w_N)$$ 来工作。然而,下一个词的无条件概率等于该词在文本语料库中的出现频率。GPT 能够提供下一个词的 条件概率,即基于前面的词:$$P(w_N | w_{n-1}, ..., w_0)$$

您可以在我们的 数据科学初学者课程 中了解更多关于概率的内容。

语言生成模型的质量可以通过 困惑度 来定义。这是一种内在指标,可以在没有任何任务特定数据集的情况下衡量模型质量。它基于 *句子的概率* 的概念——模型对可能是真实的句子赋予高概率(即模型对其不 困惑),而对不太合理的句子(例如 *Can it does what?*)赋予低概率。当我们给模型提供真实文本语料库中的句子时,我们希望它们具有高概率和低 困惑度。数学上,困惑度定义为测试集的归一化逆概率: $$ \mathrm{Perplexity}(W) = \sqrt[N]{1\over P(W_1,...,W_N)} $$

**您可以使用 Hugging Face 的 GPT 驱动文本编辑器 进行文本生成实验。在这个编辑器中,您开始编写文本,按下 [TAB]** 键后会提供几个补全选项。如果选项太短或您不满意,可以再次按下 [TAB] 键,您将获得更多选项,包括更长的文本片段。

GPT 是一个家族

GPT 不是单一模型,而是由 OpenAI 开发和训练的一系列模型。

在 GPT 模型家族中,我们有:

GPT-2GPT-3GPT-4
语言模型,参数量高达 15 亿。语言模型,参数量高达 1750 亿。参数量达 100 万亿,支持图像和文本输入,并输出文本。

GPT-3 和 GPT-4 模型可以通过 Microsoft Azure 的认知服务OpenAI API 使用。

提示工程

由于 GPT 在大量数据上进行了训练以理解语言和代码,它能够根据输入(提示)生成输出。提示是 GPT 的输入或查询,用户通过提示向模型提供任务指令以完成后续任务。为了获得期望的结果,您需要最有效的提示,这涉及选择合适的词语、格式、短语甚至符号。这种方法被称为 提示工程

此文档 提供了有关提示工程的更多信息。

✍️ 示例笔记本:使用 OpenAI-GPT 进行实验

通过以下笔记本继续学习:

结论

新的通用预训练语言模型不仅能够建模语言结构,还包含大量自然语言知识。因此,它们可以在零样本或少样本设置中有效地解决一些 NLP 任务。

课后测验

---

---

第 6-Other 课:遗传算法

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/21-GeneticAlgorithms/README.md

遗传算法

课前测验

遗传算法 (GA) 基于一种进化式方法,通过模拟种群的进化过程来为给定问题找到最优解。这种方法由 John Henry Holland 于1975年提出。

遗传算法基于以下理念:

  • 问题的有效解可以表示为基因
  • 交叉允许我们将两个解结合起来,生成一个新的有效解
  • 使用某种适应度函数进行选择,以筛选出更优的解
  • 引入变异以打破优化过程的稳定性,从而摆脱局部最小值

如果你想实现遗传算法,需要以下步骤:

* 找到一种方法,用基因 g&in;&Gamma; 编码问题的解 * 在基因集合 &Gamma; 上定义适应度函数 fit: &Gamma;&rightarrow;R,函数值越小表示解越优。 * 定义交叉机制,将两个基因结合生成一个新的有效解 crossover: &Gamma;<sup>2</sub>&rightarrow;&Gamma;。 * 定义变异机制 mutate: &Gamma;&rightarrow;&Gamma;。

在许多情况下,交叉和变异是操作基因的简单算法,比如处理数字序列或位向量。

遗传算法的具体实现可能因情况而异,但总体结构如下:

  1. 选择初始种群 G&subset;&Gamma;
  2. 随机选择将在此步骤执行的操作:交叉或变异
  3. 交叉

* 随机选择两个基因 g<sub>1</sub>, g<sub>2</sub> &in; G * 计算交叉结果 g=crossover(g<sub>1</sub>,g<sub>2</sub>) * 如果 fit(g)<fit(g<sub>1</sub>) 或 fit(g)<fit(g<sub>2</sub>),用 g 替换种群中的对应基因。

  1. 变异 - 随机选择一个基因 g&in;G,并用 mutate(g) 替换它
  2. 从步骤2开始重复,直到适应度函数值足够小,或达到步骤数限制。

常见任务

遗传算法通常解决以下任务:

  1. 排程优化
  2. 最优装箱
  3. 最优切割
  4. 加速穷举搜索

✍️ 练习:遗传算法

通过以下笔记本继续学习:

访问这个笔记本,查看两个使用遗传算法的示例:

  1. 公平分配宝藏
  2. 八皇后问题

总结

遗传算法被用于解决许多问题,包括物流和搜索问题。这个领域的灵感来源于心理学和计算机科学的交叉研究。

🚀 挑战

“遗传算法易于实现,但其行为难以理解。” 来源 进行一些研究,找到一个遗传算法的实现,例如解决数独问题,并以草图或流程图的形式解释其工作原理。

课后测验

复习与自学

观看这个精彩视频,了解计算机如何通过遗传算法训练的神经网络学习玩超级马里奥。我们将在下一节中学习更多关于计算机学习玩游戏的内容。

作业:丢番图方程

你的目标是解决所谓的丢番图方程——一个具有整数根的方程。例如,考虑方程 a+2b+3c+4d=30。你需要找到满足该方程的整数根。

*此作业的灵感来源于这篇文章。*

提示:

  1. 可以考虑根的范围为 [0;30]
  2. 作为基因,可以使用根值列表

使用 Diophantine.ipynb 作为起点。

---

---

第 6-Other 课:深度强化学习

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/22-DeepRL/README.md

深度强化学习

强化学习(RL)被认为是机器学习的基本范式之一,与监督学习和无监督学习并列。在监督学习中,我们依赖于具有已知结果的数据集,而强化学习则基于通过实践学习。例如,当我们第一次看到一个电脑游戏时,即使不知道规则,我们也会开始玩,并通过玩游戏和调整行为逐渐提高自己的技能。

课前测验

要进行强化学习,我们需要:

  • 一个环境模拟器,它定义了游戏规则。我们应该能够在模拟器中运行实验并观察结果。
  • 某种奖励函数,它指示我们的实验是否成功。例如,在学习玩电脑游戏时,奖励可以是我们的最终得分。

基于奖励函数,我们应该能够调整自己的行为并提高技能,以便下一次表现更好。强化学习与其他类型的机器学习的主要区别在于,在强化学习中,我们通常不知道自己是否赢了或输了,直到游戏结束。因此,我们无法判断单独的某个动作是否是好的——我们只有在游戏结束时才会收到奖励。

在强化学习过程中,我们通常会进行许多实验。在每次实验中,我们需要在遵循迄今为止学到的最佳策略(利用)和探索新的可能状态(探索)之间找到平衡。

OpenAI Gym

一个非常适合强化学习的工具是 OpenAI Gym——一个模拟环境,它可以模拟许多不同的环境,从 Atari 游戏到物理学中的杆平衡问题。它是训练强化学习算法最流行的模拟环境之一,由 OpenAI 维护。

Note: 你可以在 这里 查看 OpenAI Gym 提供的所有环境。

CartPole 平衡

你可能都见过现代平衡设备,比如 *Segway* 或 *Gyroscooters*。它们能够通过调整轮子来响应加速度计或陀螺仪的信号,从而自动保持平衡。在本节中,我们将学习如何解决一个类似的问题——杆平衡。这类似于马戏团表演者需要在手上平衡杆的情况——但这种杆平衡仅发生在一维空间中。

一种简化的平衡问题被称为 CartPole 问题。在 CartPole 世界中,我们有一个可以左右移动的水平滑块,目标是在滑块上方保持一个垂直杆的平衡。

<img alt="a cartpole" src="../../../../../translated_images/zh-CN/cartpole.f52a67f27e058170.webp" width="200"/>

要创建和使用这个环境,我们需要几行 Python 代码:

```python import gym env = gym.make("CartPole-v1")

env.reset() done = False total_reward = 0 while not done: env.render() action = env.action_space.sample() observaton, reward, done, info = env.step(action) total_reward += reward

print(f"Total reward: {total_reward}") ```

每个环境都可以通过以下方式访问:

  • env.reset 开始一个新的实验
  • env.step 执行一个模拟步骤。它接收来自动作空间的一个动作,并返回一个观察值(来自观察空间),以及奖励和终止标志。

在上面的示例中,我们在每一步执行随机动作,因此实验的持续时间非常短:

!non-balancing cartpole

强化学习算法的目标是训练一个模型——所谓的策略 &pi;——它会根据给定状态返回动作。我们也可以将策略视为概率性的,例如,对于任何状态 *s* 和动作 *a*,它会返回我们在状态 *s* 下采取动作 *a* 的概率 &pi;(*a*|*s*)。

策略梯度算法

建模策略的最明显方法是创建一个神经网络,该网络将状态作为输入,并返回相应的动作(或者更确切地说是所有动作的概率)。从某种意义上说,它类似于普通的分类任务,但有一个主要区别——我们事先不知道在每一步应该采取哪些动作。

这里的想法是估计这些概率。我们构建一个累计奖励向量,显示实验中每一步的总奖励。我们还通过乘以某个系数 &gamma;=0.99 对早期奖励进行奖励折扣,以减小早期奖励的影响。然后,我们强化实验路径中产生较大奖励的步骤。

了解更多关于策略梯度算法的信息,并在示例笔记本中查看其实际应用。

Actor-Critic 算法

策略梯度方法的改进版本被称为 Actor-Critic。其核心思想是神经网络将被训练以返回两件事:

  • 策略,决定采取的动作。这部分称为 actor
  • 对当前状态下可以获得的总奖励的估计——这部分称为 critic

从某种意义上说,这种架构类似于 GAN,其中有两个网络相互对抗进行训练。在 Actor-Critic 模型中,actor 提出我们需要采取的动作,而 critic 尝试进行批判并估计结果。然而,我们的目标是让这两个网络协同训练。

因为我们在实验过程中同时知道真实的累计奖励和 critic 返回的结果,因此构建一个损失函数以最小化它们之间的差异相对容易。这将产生critic 损失。我们可以使用与策略梯度算法相同的方法计算actor 损失

运行这些算法后,我们可以期待我们的 CartPole 表现如下:

!a balancing cartpole

✍️ 练习:策略梯度和 Actor-Critic 强化学习

通过以下笔记本继续学习:

其他强化学习任务

如今,强化学习是一个快速发展的研究领域。一些有趣的强化学习示例包括:

  • 教电脑玩 Atari 游戏。这个问题的挑战在于我们没有简单的状态表示为向量,而是一个截图——我们需要使用 CNN 将屏幕图像转换为特征向量或提取奖励信息。Atari 游戏可以在 Gym 中找到。
  • 教电脑玩棋盘游戏,比如国际象棋和围棋。最近,像 Alpha Zero 这样的最先进程序通过两个代理相互对战并在每一步中不断改进,从零开始进行训练。
  • 在工业中,强化学习用于从模拟中创建控制系统。一个名为 Bonsai 的服务专门为此设计。

总结

我们现在已经学习了如何通过提供定义游戏期望状态的奖励函数,并让代理智能地探索搜索空间,来训练代理以获得良好的结果。我们成功尝试了两种算法,并在相对较短的时间内取得了良好的结果。然而,这只是你强化学习旅程的开始,如果你想深入研究,应该考虑参加专门的课程。

🚀 挑战

探索“其他强化学习任务”部分列出的应用,并尝试实现其中一个!

课后测验

复习与自学

在我们的初学者机器学习课程中了解更多关于经典强化学习的内容。

观看这个精彩视频,了解电脑如何学习玩超级马里奥。

作业:训练一个山地车

在这个作业中,你的目标是训练一个不同的 Gym 环境——山地车

---

---

第 6-Other 课:多智能体系统

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/6-Other/23-MultiagentSystems/README.md

多智能体系统

实现智能的一种可能方法是所谓的涌现(或协同)方法,其基于这样一个事实:许多相对简单的智能体的组合行为可以导致整个系统表现出更复杂(或更智能)的行为。从理论上讲,这种方法基于集体智能涌现论进化控制论的原则,这些理论认为,当低级系统被适当地组合成高级系统时,高级系统会获得某种附加价值(即所谓的*元系统转变原则*)。

课前测验

多智能体系统这一方向在1990年代随着互联网和分布式系统的发展在人工智能领域兴起。经典的人工智能教材之一《人工智能:现代方法》从多智能体系统的角度探讨了经典人工智能的观点。

多智能体方法的核心是智能体的概念——一个生活在某种环境中的实体,它可以感知环境并对其采取行动。这是一个非常广泛的定义,智能体可以有许多不同的类型和分类:

  • 按其推理能力:

- 反应型智能体通常具有简单的请求-响应行为 - 推理型智能体采用某种逻辑推理和/或规划能力

  • 按智能体代码执行的位置:

- 静态智能体在专用网络节点上工作 - 移动智能体可以在网络节点之间移动其代码

  • 按其行为:

- 被动智能体没有具体目标。这类智能体可以对外部刺激做出反应,但不会主动采取行动。 - 主动智能体有一些目标并努力实现这些目标 - 认知智能体涉及复杂的规划和推理

如今,多智能体系统被应用于许多领域:

  • 在游戏中,许多非玩家角色使用某种人工智能,可以被视为智能体
  • 在视频制作中,渲染涉及人群的复杂3D场景通常使用多智能体模拟
  • 在系统建模中,多智能体方法用于模拟复杂模型的行为。例如,多智能体方法已成功用于预测COVID-19疾病在全球的传播。类似的方法可以用于模拟城市交通,并观察其对交通规则变化的反应。
  • 在复杂的自动化系统中,每个设备可以作为一个独立的智能体,这使得整个系统不那么单一且更具鲁棒性。

我们不会深入探讨多智能体系统,但会考虑一个多智能体建模的示例。

NetLogo

NetLogo是一个基于修改版Logo)编程语言的多智能体建模环境。这种语言是为教授编程概念给孩子而开发的,它允许你控制一个名为乌龟的智能体,该智能体可以移动并留下痕迹。这使得创建复杂的几何图形成为可能,这是一种非常直观的方式来理解智能体的行为。

在NetLogo中,我们可以使用create-turtles命令创建许多乌龟。然后我们可以命令所有乌龟执行一些动作(例如下面的例子中向前移动10点):

create-turtles 10 ask turtles [ forward 10 ]

当然,如果所有乌龟都做同样的事情就没什么意思了,所以我们可以ask某些乌龟群体,例如那些在某个点附近的乌龟。我们还可以使用breed [cats cat]命令创建不同*种类*的乌龟。这里cat是种类的名称,我们需要同时指定单数和复数形式,因为不同的命令使用不同的形式以提高清晰度。

✅ 我们不会深入学习NetLogo语言本身——如果你感兴趣,可以访问优秀的初学者互动NetLogo词典资源。

你可以下载并安装NetLogo来尝试。

模型库

NetLogo的一个优点是它包含一个可供尝试的工作模型库。进入File &rightarrow; Models Library,你会发现许多类别的模型可供选择。

<img alt="NetLogo模型库" src="../../../../../translated_images/zh-CN/NetLogo-ModelLib.efe023afb4763c05.webp" width="60%"/>

Dmitry Soshnikov提供的模型库截图

你可以打开其中一个模型,例如Biology &rightarrow; Flocking

主要原则

打开模型后,你会进入NetLogo的主界面。以下是一个描述狼和羊种群的示例模型,考虑到有限资源(草地)。

!NetLogo主界面

Dmitry Soshnikov提供的截图

在这个界面上,你可以看到:

  • 界面部分包含:

- 智能体生活的主场地 - 不同的控件:按钮、滑块等 - 用于显示模拟参数的图表

  • 代码标签包含编辑器,你可以在其中编写NetLogo程序

在大多数情况下,界面会有一个Setup按钮,用于初始化模拟状态,以及一个Go按钮,用于启动执行。这些按钮由代码中的相应处理程序处理,代码如下所示:

to go [ ... ]

NetLogo的世界由以下对象组成:

  • 智能体(乌龟),可以在场地上移动并执行某些操作。你可以使用ask turtles [...]语法命令智能体,括号中的代码由所有智能体以*乌龟模式*执行。
  • 补丁是场地上的方块区域,智能体生活在其上。你可以引用同一补丁上的所有智能体,或者更改补丁的颜色和其他属性。你也可以ask patches执行某些操作。
  • 观察者是一个独特的智能体,控制整个世界。所有按钮处理程序都以*观察者模式*执行。
✅ 多智能体环境的美妙之处在于,以乌龟模式或补丁模式运行的代码会由所有智能体同时并行执行。因此,通过编写少量代码并编程单个智能体的行为,你可以创建整个模拟系统的复杂行为。

群体行为

作为多智能体行为的一个示例,我们来看看**群体行为)**。群体行为是一种复杂模式,非常类似于鸟群飞行的方式。观察它们飞行时,你可能会认为它们遵循某种集体算法,或者它们拥有某种形式的*集体智能*。然而,这种复杂行为的产生仅仅是因为每个单独的智能体(在这种情况下是*鸟*)只观察短距离内的其他智能体,并遵循三个简单规则:

  • 对齐 - 朝邻近智能体的平均方向转向
  • 凝聚 - 尝试朝邻居的平均位置转向(*远距离吸引*)
  • 分离 - 当与其他鸟靠得太近时,尝试远离(*短距离排斥*)

你可以运行群体行为示例并观察其行为。你还可以调整参数,例如*分离程度*或*视距*,定义每只鸟能看到的范围。注意,如果你将视距减少到0,所有鸟都会变得“盲目”,群体行为会停止。如果你将分离减少到0,所有鸟会聚集成一条直线。

✅ 切换到代码标签,查看群体行为的三个规则(对齐、凝聚和分离)如何在代码中实现。注意我们如何仅引用视野范围内的智能体。

其他可查看的模型

还有一些有趣的模型可以供你实验:

  • Art &rightarrow; Fireworks展示了烟花如何被视为单个火流的集体行为
  • Social Science &rightarrow; Traffic BasicSocial Science &rightarrow; Traffic Grid展示了城市交通在1D和2D网格中有或没有交通灯的模型。模拟中的每辆车遵循以下规则:

- 如果前方空间为空——加速(直到某个最大速度) - 如果看到前方有障碍物——刹车(你可以调整司机的视距)

  • Social Science &rightarrow; Party展示了人们在鸡尾酒会上如何聚集。你可以找到导致群体幸福度最快提升的参数组合。

从这些示例中可以看出,多智能体模拟可以成为理解由遵循相同或类似逻辑的个体组成的复杂系统行为的一种有用方式。它还可以用于控制虚拟智能体,例如计算机游戏中的NPC,或3D动画世界中的智能体。

推理型智能体

上述智能体非常简单,通过某种算法对环境变化做出反应。因此它们是反应型智能体。然而,有时智能体可以进行推理和规划其行动,这种情况下它们被称为推理型智能体

一个典型的例子是个人智能体,它接收到人类的指令去预订一个度假行程。假设互联网上有许多智能体可以帮助它。它需要联系其他智能体以查看哪些航班可用,不同日期的酒店价格是多少,并尝试协商最佳价格。当度假计划完成并得到主人确认后,它可以继续预订。

为了实现这一点,智能体需要通信。为了成功通信,它们需要:

  • 一些标准语言来交换知识,例如知识交换格式(KIF)和知识查询与操作语言(KQML)。这些语言基于言语行为理论设计。
  • 这些语言还应包括一些协商协议,基于不同的拍卖类型
  • 一个通用本体,以便它们引用相同的概念并了解其语义
  • 一种发现不同智能体功能的方法,也基于某种本体

推理型智能体比反应型智能体复杂得多,因为它们不仅对环境变化做出反应,还需要能够*主动*采取行动。一种提出的推理型智能体架构是所谓的信念-愿望-意图(BDI)智能体:

  • 信念构成了智能体对环境的知识集合。它可以被结构化为知识库或智能体可以应用于环境中特定情况的一组规则。
  • 愿望定义了智能体想要做什么,即它的目标。例如,上述个人助理智能体的目标是预订旅行,而酒店智能体的目标是最大化利润。
  • 意图是智能体为实现其目标而计划的具体行动。行动通常会改变环境并导致与其他智能体的通信。

有一些平台可用于构建多智能体系统,例如JADE这篇论文包含了多智能体平台的综述,以及多智能体系统的简史及其不同的使用场景。

结论

多智能体系统可以采取非常不同的形式,并应用于许多不同的领域。 它们通常专注于单个智能体的简单行为,并通过协同效应实现整个系统的更复杂行为。

🚀 挑战

将本课内容应用于现实世界,尝试构思一个可以解决问题的多智能体系统。例如,多智能体系统需要做些什么来优化校车路线?它如何在面包店中工作?

课后测验

复习与自学

复习这种系统在工业中的应用。选择一个领域,例如制造业或视频游戏行业,探索多智能体系统如何用于解决独特问题。

NetLogo作业

---

---

第 7-Ethics 课:伦理与负责任的人工智能

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/7-Ethics/README.md

伦理与负责任的人工智能

你已经快完成这门课程了,希望到现在为止,你已经清楚地了解到人工智能是基于一系列正式的数学方法,这些方法使我们能够发现数据中的关系,并训练模型以复制人类行为的某些方面。在当下,我们认为人工智能是一种非常强大的工具,可以从数据中提取模式,并将这些模式应用于解决新的问题。

课前测验

然而,在科幻作品中,我们经常看到人工智能对人类构成威胁的故事。这些故事通常围绕某种人工智能叛变展开,即人工智能决定与人类对抗。这暗示人工智能具有某种情感或能够做出开发者未曾预料的决定。

我们在这门课程中学习的人工智能仅仅是大型矩阵运算。它是一种非常强大的工具,可以帮助我们解决问题,但和其他任何强大的工具一样——它既可以被用于好的目的,也可以被用于坏的目的。重要的是,它可能会被*滥用*。

负责任人工智能的原则

为了避免人工智能的意外或故意滥用,微软提出了重要的负责任人工智能原则。以下概念是这些原则的基础:

  • 公平性与*模型偏差*这一重要问题相关,这种偏差可能是由于使用了有偏的数据进行训练。例如,当我们试图预测一个人获得软件开发职位的概率时,模型可能会更倾向于男性——仅仅因为训练数据集可能偏向男性群体。我们需要仔细平衡训练数据并调查模型以避免偏差,并确保模型考虑到更相关的特征。
  • 可靠性与安全性。人工智能模型本质上可能会犯错。神经网络返回的是概率,我们需要在做决策时考虑到这一点。每个模型都有一定的精确度和召回率,我们需要理解这些指标,以防止错误建议可能造成的伤害。
  • 隐私与安全性具有一些人工智能特定的影响。例如,当我们使用某些数据训练模型时,这些数据会以某种方式“整合”到模型中。一方面,这提高了安全性和隐私性,另一方面,我们需要记住模型是基于哪些数据训练的。
  • 包容性意味着我们不是在构建人工智能来取代人类,而是为了增强人类的能力,使我们的工作更具创造性。这也与公平性相关,因为在处理代表性不足的群体时,我们收集的大多数数据集可能会存在偏差,我们需要确保这些群体被包括在内并被人工智能正确处理。
  • 透明性。这包括确保我们始终明确人工智能的使用。此外,在可能的情况下,我们希望使用*可解释*的人工智能系统。
  • 问责性。当人工智能模型做出某些决定时,责任归属并不总是清晰的。我们需要确保理解人工智能决策的责任归属。在大多数情况下,我们希望将人类纳入重要决策的环节,以便实际的人类承担责任。

负责任人工智能的工具

微软开发了负责任人工智能工具箱,其中包含一系列工具:

  • 可解释性仪表板 (InterpretML)
  • 公平性仪表板 (FairLearn)
  • 错误分析仪表板
  • 负责任人工智能仪表板,包括:

- EconML - 用于因果分析的工具,专注于假设性问题 - DiCE - 用于反事实分析的工具,允许你查看需要更改哪些特征以影响模型的决策

关于人工智能伦理的更多信息,请访问机器学习课程中的这一课,其中包括相关作业。

复习与自学

通过这个学习路径了解更多关于负责任人工智能的内容。

课后测验

免责声明: 本文档使用AI翻译服务 Co-op Translator 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而引起的任何误解或误读不承担责任。

---

第 X-Extras 课:多模态网络

原文:https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/X-Extras/X1-MultiModal/README.md

多模态网络

在Transformer模型成功解决NLP任务后,相同或类似的架构也被应用于计算机视觉任务。越来越多的人开始关注构建能够*结合*视觉和自然语言能力的模型。其中一个尝试是由OpenAI完成的,称为CLIP和DALL.E。

对比图像预训练(CLIP)

CLIP的核心思想是能够比较文本提示与图像,并确定图像与提示的匹配程度。

!CLIP架构

*图片来源于这篇博客*

该模型通过从互联网获取的图像及其标题进行训练。对于每个批次,我们获取N对(图像,文本),并将它们转换为一些向量表示I,..., I / T,..., T。这些表示随后进行匹配。损失函数的定义是最大化对应一对(例如I和T)的向量之间的余弦相似度,同时最小化所有其他对之间的余弦相似度。这就是为什么这种方法被称为对比学习

CLIP模型/库可以从OpenAI GitHub获取。该方法在这篇博客中有所描述,并在这篇论文中有更详细的说明。

一旦该模型被预训练,我们可以给它一批图像和一批文本提示,它将返回一个概率张量。CLIP可以用于以下任务:

图像分类

假设我们需要将图像分类为猫、狗和人类。在这种情况下,我们可以给模型一个图像,以及一系列文本提示:“*一张猫的图片*”、“*一张狗的图片*”、“*一张人类的图片*”。在结果的3个概率向量中,我们只需选择值最高的索引。

!CLIP用于图像分类

*图片来源于这篇博客*

基于文本的图像搜索

我们也可以反过来操作。如果我们有一组图像,我们可以将这组图像传递给模型,并提供一个文本提示——这将返回与给定提示最相似的图像。

✍️ 示例:使用CLIP进行图像分类和图像搜索

打开Clip.ipynb笔记本,查看CLIP的实际应用。

使用VQGAN+CLIP进行图像生成

CLIP还可以用于从文本提示生成图像。为了实现这一点,我们需要一个生成器模型,能够根据某些向量输入生成图像。其中一个这样的模型称为VQGAN(向量量化GAN)。

VQGAN与普通GAN的主要区别在于以下几点:

  • 使用自回归Transformer架构生成一系列上下文丰富的视觉部分,这些部分组成图像。这些视觉部分由卷积神经网络(CNN)学习。
  • 使用子图像判别器来检测图像的部分是“真实”还是“伪造”(与传统GAN的“全或无”方法不同)。

可以在Taming Transformers网站上了解更多关于VQGAN的信息。

VQGAN与传统GAN的一个重要区别在于,后者可以从任何输入向量生成一个不错的图像,而VQGAN可能生成一个不连贯的图像。因此,我们需要进一步引导图像创建过程,这可以通过CLIP来实现。

!VQGAN+CLIP架构

为了生成与文本提示相对应的图像,我们从一些随机编码向量开始,将其传递给VQGAN以生成图像。然后使用CLIP生成一个损失函数,显示图像与文本提示的匹配程度。目标是通过反向传播调整输入向量参数以最小化该损失。

一个实现VQGAN+CLIP的优秀库是Pixray

!Pixray生成的图片!Pixray生成的图片!Pixray生成的图片
从提示*一张年轻男性文学教师拿着书的水彩特写肖像*生成的图片从提示*一张年轻女性计算机科学教师拿着电脑的油画特写肖像*生成的图片从提示*一张老年男性数学教师站在黑板前的油画特写肖像*生成的图片
图片来自人工教师系列,由Dmitry Soshnikov创作

DALL-E

DALL-E 1

DALL-E是一个基于GPT-3的版本,能够根据提示生成图像。它使用了120亿参数进行训练。

与CLIP不同,DALL-E将文本和图像作为一个单一的令牌流输入。因此,可以根据多个提示生成图像。

DALL-E 2

DALL-E 1和2的主要区别在于,后者能够生成更真实的图像和艺术作品。

以下是使用DALL-E生成图像的示例:

!DALL-E生成的图片!DALL-E生成的图片!DALL-E生成的图片
从提示*一张年轻男性文学教师拿着书的水彩特写肖像*生成的图片从提示*一张年轻女性计算机科学教师拿着电脑的油画特写肖像*生成的图片从提示*一张老年男性数学教师站在黑板前的油画特写肖像*生成的图片

参考文献

免责声明: 本文档使用AI翻译服务 Co-op Translator 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而引起的任何误解或误读不承担责任。

说明:本文是老金出海对官方教程的原创导读与工程化补充,不替代厂商文档。模型名称、SDK、价格、配额和安全政策请以官方链接为准。