diff --git a/README.md b/README.md index 3f22ddce..bcdad0ad 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ [![Gitter](https://badges.gitter.im/Microsoft/ai-for-beginners.svg)](https://gitter.im/Microsoft/ai-for-beginners?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) # Artificial Intelligence for Beginners - A Curriculum - +## Available in Multiple Languages +- [中文](translations/README.zho.md) + |![ Sketchnote by [(@girlie_mac)](https://twitter.com/girlie_mac) ](./lessons/sketchnotes/ai-overview.png)| |:---:| | AI For Beginners - _Sketchnote by [@girlie_mac](https://twitter.com/girlie_mac)_ | diff --git a/lessons/1-Intro/README.md b/lessons/1-Intro/README.md index 5601c824..bab4a53a 100644 --- a/lessons/1-Intro/README.md +++ b/lessons/1-Intro/README.md @@ -1,5 +1,8 @@ # Introduction to AI +## Available in Multiple Languages +- [中文](translations/README.zho.md) + ![Summary of Introduction of AI content in a doodle](../sketchnotes/ai-intro.png) > Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac) diff --git a/lessons/1-Intro/translations/README.zho.md b/lessons/1-Intro/translations/README.zho.md new file mode 100644 index 00000000..20f47826 --- /dev/null +++ b/lessons/1-Intro/translations/README.zho.md @@ -0,0 +1,155 @@ +# 人工智能简介 + +![涂鸦中的人工智能内容介绍摘要](../../sketchnotes/ai-intro.png) + +> 速写 [Tomomi Imura](https://twitter.com/girlie_mac) + +## [课前测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/101) + +**人工智能**是一门令人兴奋的科学学科,它研究我们如何让计算机表现出智能行为,例如做那些人类擅长做的事情。 + +最初,计算机是由 [Charles Babbage](https://en.wikipedia.org/wiki/Charles_Babbage) 按照明确定义的程序--算法--对数字进行运算。现代计算机虽然比 19 世纪提出的原始模型先进得多,但仍然遵循相同的受控计算理念。因此,如果我们知道实现目标所需的确切步骤顺序,就有可能对计算机进行编程。 + +![人脸照片](../images/dsh_age.png) + +> 摄影师 [Vickie Soshnikova](http://twitter.com/vickievalerie) + +>✅ 根据照片确定一个人的年龄是一项无法明确编程的任务,因为我们不知道自己在做这件事时是如何在脑海中得出一个数字的。 + +--- + +然而,有些任务我们并不明确知道如何解决。例如,从一个人的照片判断他/她的年龄。因为我们见过很多不同年龄的人的例子,所以我们学会了这样做,但我们无法明确解释我们是如何做到的,也无法给计算机编程来做到这一点。这正是**人工智能**(简称 AI)感兴趣的任务。 + +✅ 想一想,你可以把哪些任务卸载给计算机,从而受益于人工智能。考虑一下金融、医学和艺术领域--这些领域如今是如何从人工智能中受益的? + +## 弱人工智能 vs. 强人工智能 + +弱人工智能 | 强人工智能 +---------------------------------------|------------------------------------- +弱人工智能指的是针对特定任务或范围较小的任务设计和训练的人工智能系统。|强人工智能或人工通用智能(AGI)是指具有人类水平的智能和理解能力的人工智能系统。 +这些人工智能系统一般没有智能;它们擅长执行预定任务,但缺乏真正的理解或意识。|这些人工智能系统有能力完成人类能够完成的任何智力任务,适应不同领域,并拥有某种形式的意识或自我意识。 +弱人工智能的例子包括 Siri 或 Alexa 等虚拟助手、流媒体服务使用的推荐算法,以及专为特定客户服务任务设计的聊天机器人。|实现 "强人工智能 "是人工智能研究的一个长期目标,需要开发出能够在各种任务和环境中进行推理、学习、理解和适应的人工智能系统。 +弱人工智能高度专业化,不具备类似人类的认知能力或超越其狭隘领域的一般问题解决能力。|目前,强人工智能还只是一个理论概念,还没有任何人工智能系统达到这种通用智能水平。 + + +更多信息请参阅 **[人工智能](https://en.wikipedia.org/wiki/Artificial_general_intelligence)** (AGI). +## 智力的定义和图灵测试 + +在处理 **[智力](https://en.wikipedia.org/wiki/Intelligence)** 一词时,其中一个问题是 这个词没有明确的定义。人们可以说智力与**抽象思维**或**自我意识**有关,但我们无法给它下一个恰当的定义。 + +![猫](../images/photo-cat.jpg) + +> 由 [Amber Kipp]拍摄的[照片](https://unsplash.com/photos/75715CVEJhI) (https://unsplash.com/@sadmax) 来自 Unsplash + +要想知道 "智能 "一词的歧义,可以试着回答一个问题: "猫聪明吗?对于这个问题,不同的人往往会给出不同的答案,因为并没有一个公认的测试方法来证明这一说法的真假。如果你认为有,那就试着对你的猫进行智商测试...... + +✅ 想一想你是如何定义智力的。能解开迷宫并获得食物的乌鸦聪明吗?孩子聪明吗? + +--- + +在谈论 AGI 时,我们需要有一些方法来判断我们是否创造了一个真正的智能系统。 [艾伦-图灵](https://en.wikipedia.org/wiki/Alan_Turing) 提出了一种叫做 **[图灵测试](https://en.wikipedia.org/wiki/Turing_test)**方法, 这也是对智力的定义. 由于计算机程序可以绕过任何自动比较,因此我们使用了人类询问者。因此,如果人类无法在基于文本的对话中区分真人和计算机系统,那么该系统就被认为是智能系统。 + +> 一个叫做 [Eugene Goostman](https://en.wikipedia.org/wiki/Eugene_Goostman)的聊天机器人, 2014年,这款在圣彼得堡开发的 "机器人 "通过巧妙的人格测试,险些通过图灵测试。它事先宣布自己是一名 13 岁的乌克兰男孩,这就解释了文本中知识的缺乏和一些差异。经过 5 分钟的对话,该机器人让 30% 的评委相信它是人类,而图灵认为到 2000 年机器就能通过这一指标。不过,我们应该明白,这并不表明我们已经创造出了一个智能系统,也不表明计算机系统骗过了人类审问者--不是系统骗过了人类,而是机器人的创造者骗过了人类! + +✅ 您有没有被聊天机器人骗过,以为您是在和人类交谈?它是如何说服你的? + +## 人工智能的不同方法 + +如果我们想让计算机的行为像人一样,我们就需要以某种方式在计算机中模拟我们的思维方式。因此,我们需要了解是什么让人类变得聪明。 + +> 要想为机器编写智能程序,我们需要了解人类自身的决策过程。如果你稍微自我反省一下,就会发现有些过程是下意识的,比如我们可以不假思索地分辨出猫和狗,而另一些过程则涉及推理。 + +解决这个问题有两种可能的方法: + +自上而下法(符号推理) | 自下而上法(神经网络) +---------------------------------------|------------------------------------- +自上而下的方法是模拟人解决问题的推理方式。它涉及从人的**知识中提取**,并以计算机可读的形式表示出来。我们还需要开发一种方法来模拟计算机内部的**推理**。| 自下而上的方法以人脑结构为模型,人脑由大量称为**神经元**的简单单元组成。每个神经元就像其输入的加权平均值,我们可以通过提供**训练数据**来训练神经元网络,以解决有用的问题。 + +还有其他一些可能的智能方法: + +**新兴**、**协同**或**多代理方法**的基础是,复杂的智能行为可以通过大量简单代理的相互作用而获得。根据[进化控制论](https://en.wikipedia.org/wiki/Global_brain#Evolutionary_cybernetics),在**元系统过渡**过程中,智能可以从较为简单的反应行为中**产生。 + +**进化方法**或**遗传算法**是一种基于进化原理的优化过程。 + +我们将在课程的稍后部分考虑这些方法,但现在我们将重点关注两个主要方向:自上而下和自下而上。 + +### 自上而下的方法 + +在**自上而下的方法**中,我们试图模拟我们的推理。 因为我们在推理时可以跟随自己的思维,所以我们可以尝试将这一过程形式化,并在计算机中进行编程。这就是**符号推理**。 + +人们的头脑中往往有一些规则来指导他们的决策过程。例如,当医生诊断病人时,他或她可能会意识到一个人发烧了,因此身体内部可能有一些炎症。通过将大量规则应用于特定问题,医生可能会得出最终诊断结果。 + +这种方法在很大程度上依赖于**知识表示**和**推理**。从人类专家那里提取知识可能是最困难的部分,因为在很多情况下,医生并不清楚自己得出特定诊断结果的确切原因。有时,他(她)不需要经过明确的思考,脑子里就会浮现出解决方案。有些任务,例如从照片上判断一个人的年龄,根本无法简化为对知识的操作。 + +### 自下而上法 + +或者,我们可以尝试模拟大脑内部最简单的元素--神经元。我们可以在计算机中构建一个所谓的**人工神经网络**,然后通过举例来教它解决问题。这个过程类似于新生儿通过观察了解周围环境的过程。 + +✅ 对婴儿的学习方式做一些研究。婴儿大脑的基本要素是什么? + +> | 什么是机器学习? | | +> |---------------|-----------| +> | 人工智能的一部分是基于计算机学习来解决基于某些数据的问题,这部分被称为**机器学习**。在本课程中,我们将不考虑经典的机器学习--我们建议您参考单独的[机器学习入门](http://aka.ms/ml-beginners)课程。 | ![机器学习入门](../images/ml-for-beginners.png) | ! + +## 人工智能简史 + +人工智能作为一个领域始于二十世纪中叶。最初,符号推理是一种流行的方法,并取得了一些重要的成功,如专家系统--能够在某些有限的问题领域充当专家的计算机程序。然而,人们很快就发现,这种方法并不能很好地扩展。从专家那里提取知识,用计算机将其表示出来,并保持知识库的准确性,是一项非常复杂的任务,而且成本太高,在很多情况下并不实用。因此,20 世纪 70 年代出现了所谓的[人工智能冬季](https://en.wikipedia.org/wiki/AI_winter)。 + + + +> 图片来自于 [Dmitry Soshnikov](http://soshnikov.com) + +随着时间的推移,计算资源变得越来越便宜,可用的数据也越来越多,因此神经网络方法开始在计算机视觉或语音理解等许多领域展现出与人类竞争的卓越性能。在过去十年中,人工智能一词大多被用作神经网络的同义词,因为我们听到的大多数人工智能成功案例都是基于神经网络。 + +例如,在创建下棋计算机程序的过程中,我们可以观察到方法是如何变化的: + +* 早期的国际象棋程序是以搜索为基础的--程序明确地尝试估计对手在给定的下一步棋数中可能走的棋步,并根据几步棋所能达到的最佳位置选择最佳棋步。这导致了所谓的[阿尔法-贝塔剪枝](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) 搜索算法的发展。 +* 搜索策略在对局结束时效果很好,因为在对局结束时,搜索空间受到了少量可能棋步的限制。然而,在对局开始时,搜索空间是巨大的,可以通过学习人类棋手之间的现有对局来改进算法。随后的实验采用了所谓的[基于案例的推理](https://en.wikipedia.org/wiki/Case-based_reasoning),即程序在知识库中寻找与当前对局位置非常相似的案例。 +* 现代战胜人类棋手的程序是基于神经网络和[强化学习](https://en.wikipedia.org/wiki/Reinforcement_learning),即程序完全通过长时间与自己对弈并从自己的错误中学习来学会下棋--就像人类学习下棋一样。不过,计算机程序可以在更短的时间内玩更多的游戏,因此学习速度更快。 + +✅ 稍微研究一下人工智能玩过的其他游戏。 + +同样,我们可以看到创建 "会说话的程序"(可能通过图灵测试)的方法是如何变化的: + +* 早期的此类程序,如[Eliza](https://en.wikipedia.org/wiki/ELIZA),基于非常简单的语法规则,并将输入的句子重新表述为一个问题。 +* 现代助手,如 Cortana、Siri 或谷歌助手,都是混合系统,使用神经网络将语音转换为文本,并识别我们的意图,然后采用一些推理或明确的算法来执行所需的操作。 +* 未来,我们可能会期待一个完整的基于神经网络的模型来处理对话。最近的 GPT 和 [Turing-NLG](https://turing.microsoft.com/)系列神经网络在这方面取得了巨大成功。 + + + +>图片由 Dmitry Soshnikov提供, [图片](https://unsplash.com/photos/r8LmVbUKgns) 来自于 [Marina Abrosimova](https://unsplash.com/@abrosimova_marina_foto), Unsplash + +## 最新的人工智能研究 + +近期神经网络研究的巨大发展始于 2010 年左右,当时大型公共数据集开始可用。一个名为[ImageNet](https://en.wikipedia.org/wiki/ImageNet)的巨大图像集合包含了约 1,400 万张注释图像,它催生了[ImageNet 大规模视觉识别挑战赛](https://image-net.org/challenges/LSVRC/)。 + +![ILSVRC Accuracy](../images/ilsvrc.gif) + +> 图片来自于 [Dmitry Soshnikov](http://soshnikov.com) + +在2012年, [卷积神经网络](../../4-ComputerVision/07-ConvNets/README.md) 首次用于图像分类,使分类错误率大幅下降(从近 30% 降至 16.4%)。2015 年,微软研究院的 ResNet 架构[达到了人类级别的准确率](https://doi.org/10.1109/ICCV.2015.123)。 + +从那时起,神经网络在许多任务中都表现得非常成功: + +--- + +年份 | 人类水准 +-----|-------- +2015 | [图像分类](https://doi.org/10.1109/ICCV.2015.123) +2016 | [会话语音识别](https://arxiv.org/abs/1610.05256) +2018 | [自动机器翻译](https://arxiv.org/abs/1803.05567) (汉译英) +2020 | [图像字幕](https://arxiv.org/abs/2009.13682) + +在过去几年中,我们见证了大型语言模型的巨大成功,如 BERT 和 GPT-3。这主要归功于有大量可用的通用文本数据,使我们可以训练模型来捕捉文本的结构和含义,在通用文本集合上对它们进行预训练,然后针对更具体的任务对这些模型进行专门化。我们将在本课程的后半部分学习更多有关 [自然语言处理](../5-NLP/README.md)的内容。 + +## 🚀 挑战 + +浏览一下互联网,看看在你看来,人工智能在哪里得到了最有效的应用。是在地图应用程序中,还是在语音转文字服务或视频游戏中?研究系统是如何构建的。 + +## [课后测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/201) + +## 回归 & 自学 + +通过 [this lesson]回顾机器学习的历史(https://github.com/microsoft/ML-For-Beginners/tree/main/1-Introduction/2-history-of-ML). 从这一课或这一课最前面的简笔画中选取一个元素,对其进行更深入的研究,以了解其演变的文化背景。 + +**任务**: [Game Jam](../assignment.md) diff --git a/lessons/2-Symbolic/README.md b/lessons/2-Symbolic/README.md index 0a8ed834..8de78024 100644 --- a/lessons/2-Symbolic/README.md +++ b/lessons/2-Symbolic/README.md @@ -1,5 +1,8 @@ # Knowledge Representation and Expert Systems +## Available in Multiple Languages +- [中文](./translations/README.zho.md) + ![Summary of Symbolic AI content](../sketchnotes/ai-symbolic.png) > Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac) diff --git a/lessons/2-Symbolic/translations/README.zho.md b/lessons/2-Symbolic/translations/README.zho.md new file mode 100644 index 00000000..8acf3549 --- /dev/null +++ b/lessons/2-Symbolic/translations/README.zho.md @@ -0,0 +1,243 @@ +# 知识表示和专家系统 + +![Summary of Symbolic AI content](../../sketchnotes/ai-symbolic.png) + +> Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac) + +对人工智能的追求基于对知识的探求,即像人类一样理解世界。但如何才能做到这一点呢? + +## [课前测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/102) + +在人工智能的早期,自上而下创建智能系统的方法(在上一课中讨论过)很流行。当时的想法是从人身上提取知识,转化为机器可读的形式,然后利用这些知识自动解决问题。这种方法基于两大理念: + +* 知识表示 +* 推理 + +## 知识表示 + +符号人工智能的一个重要概念是**知识**。必须将知识与*信息*或*数据*区分开来。例如,我们可以说书籍包含知识,因为人们可以通过学习书籍成为专家。然而,书籍所包含的内容实际上被称为*数据*,通过阅读书籍并将这些数据整合到我们的世界模型中,我们就将这些数据转换成了知识。 + +> ✅ **知识**是包含在我们头脑中的东西,代表了我们对世界的理解。它是通过一个主动的**学习**过程获得的,这个过程将我们接收到的信息碎片整合到我们的主动世界模型中。 + +大多数情况下,我们并不严格定义知识,而是使用[DIKW 金字塔](https://en.wikipedia.org/wiki/DIKW_pyramid)将知识与其他相关概念相联系。它包含以下概念: + +** 数据**是用物理介质表示的东西,如书面文字或口头语言。数据独立于人类而存在,可以在人与人之间传递。 +**信息**是我们如何在头脑中解释数据。例如,当我们听到 "计算机 "这个词时,就会对它有一定的理解。 +**知识**是将信息整合到我们的世界模型中。例如,一旦我们知道了电脑是什么,我们就会开始对它的工作原理、价格以及用途有一些概念。这个相互关联的概念网络构成了我们的知识。 +* 智慧**是我们理解世界的另一个层面,它代表了*元知识*,例如,关于如何以及何时使用这些知识的一些概念。 + + + +*Image [from Wikipedia](https://commons.wikimedia.org/w/index.php?curid=37705247), By Longlivetheux - Own work, CC BY-SA 4.0* + +因此,**知识表示**的问题是找到某种有效的方法,在计算机内以数据的形式表示知识,使其自动可用。这可以看作是一个范围: + +![Knowledge representation spectrum](../images/knowledge-spectrum.png) + +> Image by [Dmitry Soshnikov](http://soshnikov.com) + +* 在左侧,有几种非常简单的知识表示法可以被计算机有效利用。最简单的是算法,即用计算机程序来表示知识。然而,这并不是表示知识的最佳方式,因为它不够灵活。我们头脑中的知识往往是非算法性的。 +* 右边是自然文本等表征方式。它的功能最强大,但不能用于自动推理。 + +> ✅想一想,你是如何表述头脑中的知识并将其转换为笔记的?是否有一种特定的格式对你的记忆很有帮助? + +## 计算机知识表示法的分类 + +我们可以将不同的计算机知识表示方法分为以下几类: + +* 网络表示法**基于这样一个事实,即我们的头脑中有一个由相互关联的概念组成的网络。我们可以尝试在计算机中以图形的形式再现同样的网络--即所谓的**语义网络**。 + +1. **对象-属性-值三元组**或**属性-值对**。既然在计算机中可以用节点和边的列表来表示图,我们就可以用包含对象、属性和值的三元组列表来表示语义网络。例如,我们可以建立以下有关编程语言的三元组: + +对象 | 属性 | 值 +-------|-----------|------ +Python | 是 | 无类型语言 +Python | 的发明者 | 是Guido van Rossum +Python | 是块语法 | 缩进 +无类型语言 | 没有 | 类型定义 + +> ✅ 思考如何用三元组表示其他类型的知识。 + +2. **分层表示法** 强调我们经常在头脑中创建一个对象的层次结构。例如,我们知道金丝雀是一种鸟,所有的鸟都有翅膀。我们还知道金丝雀通常是什么颜色,它们的飞行速度是多少。 + + - 框架表示法**基于将每个对象或对象类别表示为一个包含**槽**的**框架。槽具有可能的默认值、值限制或可调用的存储过程,以获取槽的值。所有框架形成的层次结构类似于面向对象编程语言中的对象层次结构。 + - **情景**是一种特殊的框架,它表示可以在时间中展开的复杂情况。 + +## 译者注:下面表格原本打算翻译,但是效果不好。原文是用python语法的一些知识做例子,如果你懂python语法,相信看懂例子不是问题,如果你不懂语法,翻译了也看不懂。 + +**Python** + +Slot | Value | Default value | Interval | +-----|-------|---------------|----------| +Name | Python | | | +Is-A | Untyped-Language | | | +Variable Case | | CamelCase | | +Program Length | | | 5-5000 lines | +Block Syntax | Indent | | | + +3. **程序化表示法**是通过一系列动作来表示知识的,这些动作在出现特定条件时可以执行。 + - 生产规则是允许我们得出结论的 "如果-那么 "语句。例如,医生可以制定一条规则,规定如果***病人发高烧***或***血液检测中的 C 反应蛋白水平较高,那么***他患有炎症。一旦遇到其中一种情况,我们就能对炎症做出结论,然后在进一步的推理中使用它。 + - 算法可以被视为另一种形式的程序表示法,尽管它们几乎从未直接用于基于知识的系统中。 + +4. **逻辑**最初是由亚里士多德提出的,用来表示人类的普遍知识。 + - 谓词逻辑作为一种数学理论,其内容过于丰富,无法计算,因此通常使用它的某些子集,如 Prolog 中使用的 Horn 子句。 + - 描述逻辑(Descriptive Logic)是逻辑系统的一个系列,用于表示和推理分布式知识表示(如语义网*)的对象层次。 + +## 专家系统 + +符号人工智能的早期成功之一是所谓的**专家系统**--计算机系统被设计为在某些有限的问题领域充当专家。它们基于从一个或多个人类专家那里提取的**知识库,并包含一个**推理引擎**,在此基础上进行推理。 + +![Human Architecture](../images/arch-human.png) | ![Knowledge-Based System](../images/arch-kbs.png) +---------------------------------------------|------------------------------------------------ +人类神经系统的简化结构 | 基于知识的系统结构 + +专家系统的构造与人类的推理系统类似,都包含**短期记忆**和**长期记忆**。同样,在以知识为基础的系统中,我们将其分为以下几个部分: + +** 问题记忆**:包含与当前要解决的问题有关的知识,如病人的体温或血压、是否有炎症等。这些知识也被称为**静态知识**,因为它包含了我们当前对问题了解的快照--即所谓的*问题状态*。 +* 知识库**:代表有关问题领域的长期知识。它是从人类专家那里人工提取的,不会因咨询的不同而改变。由于它允许我们从一个问题状态浏览到另一个问题状态,因此也被称为**动态知识**。 +* 推理引擎**:协调在问题状态空间中搜索的整个过程,必要时向用户提问。它还负责找到适用于每种状态的正确规则。 + +举例来说,让我们考虑下面这个根据动物的物理特征来判断动物的专家系统: + +![AND-OR Tree](../images/AND-OR-Tree.png) + +> Image by [Dmitry Soshnikov](http://soshnikov.com) + +这种图被称为 **AND-OR 树**,是一组生产规则的图形表示。在从专家那里提取知识之初,绘制树形图非常有用。要在计算机中表示知识,使用规则更为方便: + +``` +如果动物吃肉 +OR (动物有锋利的牙齿 + 动物有爪子 + 动物有向前看的眼睛 +) +则该动物是肉食动物 +``` + +您可以注意到,规则左侧的每个条件和操作本质上都是对象-属性-值(OAV)三元组。**工作内存**包含与当前要解决的问题相对应的 OAV 三元组集合。**规则引擎**会查找满足条件的规则,并应用这些规则,将另一个三元组添加到工作内存中。 + +>✅ 就你喜欢的主题编写自己的 AND-OR 树! + +### 前向推理与后向推理 + +上述过程称为**前向推理**。它以工作记忆中有关问题的一些初始数据为起点,然后执行以下推理循环: + +1. 如果工作记忆中存在目标属性--停止并给出结果 +2. 查找当前条件满足的所有规则--得到**冲突规则集**。 +3. 执行**冲突解决**--选择一条将在本步骤中执行的规则。可能有不同的冲突解决策略: + - 选择知识库中第一条适用的规则 + - 随机选择一条规则 + - 选择一条*具体*的规则,即满足 "左侧"(LHS)条件最多的规则 +4. 应用选定的规则,在问题状态中插入新知识 5. +5. 重复步骤 1。 + +不过,在某些情况下,我们可能希望从有关问题的空白知识开始,提出有助于得出结论的问题。例如,在进行医学诊断时,我们通常不会在开始诊断病人之前提前进行所有医学分析。我们更希望在需要做出决定时进行分析。 + +这个过程可以用**后向推理**来建模。它由**目标**驱动,即我们希望找到的属性值: + +1. 选择所有能给出目标值的规则(即目标在 RHS("右侧"))--冲突集 +1. 如果没有关于该属性的规则,或者有规则规定我们应该向用户询问该值--则询问该值,否则: +1. 使用冲突解决策略选择一条规则作为*假设*--我们将尝试证明它 +1. 对规则左侧的所有属性重复上述过程,尝试将它们证明为目标 +1. 如果该过程在任何时候失败,则在第 3 步使用另一条规则。 + +> ✅ 在哪些情况下,前向推理更合适?后向推理如何? + +### 实施专家系统 + +专家系统可以用不同的工具来实现: + +* 直接用高级编程语言编程。这不是最好的主意,因为基于知识的系统的主要优点是知识与推理分离,问题领域专家应该能够在不了解推理过程细节的情况下编写规则。 +* 使用**专家系统外壳**,即专门为使用某种知识表示语言填充知识而设计的系统。 + +## ✍️ 练习: 动物推理 + +请参阅 [Animals.ipynb](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/Animals.ipynb),了解实施前向和后向推理专家系统的示例。 + +> **注意**: 这个例子非常简单,只是提供了一个专家系统的概念。一旦你开始创建这样一个系统,只有当规则达到一定数量(大约 200 多条)时,你才会注意到它的一些*智能*行为。在某些时候,规则会变得过于复杂,以至于无法将所有规则都牢记在心,这时你可能会开始怀疑系统为什么会做出某些决定。不过,基于知识的系统的重要特点是,你总能*准确地解释*任何决定是如何做出的。 + +## 本体论和语义网 + +20世纪末,有人倡议使用知识表示法来注释互联网资源,以便能够找到与非常具体的查询相对应的资源。这一倡议被称为**语义网**,它依赖于几个概念: + +- 基于**[描述逻辑学](https://en.wikipedia.org/wiki/Description_logic)** (DL)的特殊知识表示法。它类似于框架知识表示法,因为它建立了一个具有属性的对象层次结构,但它具有正式的逻辑语义和推理。有一整套 DL,它们在表达能力和推理算法复杂性之间取得了平衡。 +- 分布式知识表示法:所有概念都用一个全局 URI 标识符表示,这样就有可能创建跨越互联网的知识层次结构。 +- 基于 XML 的知识描述语言系列: RDF(资源描述框架)、RDFS(RDF 模式)、OWL(本体网络语言)。 + +语义网的一个核心概念是**本体**。它指的是使用某种形式化的知识表示法对问题领域进行的明确规范。最简单的本体可能只是问题领域中对象的层次结构,但更复杂的本体将包括可用于推理的规则。 + +在语义网络中,所有表征都基于三元组。每个对象和每个关系都由 URI 唯一标识。例如,如果我们想说明本人工智能课程是由德米特里-索什尼科夫于 2022 年 1 月 1 日开发的,我们可以使用以下三元组: + + + +``` +http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date “Jan 13, 2007” +http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com +``` + +> ✅ 这里的 `http://www.example.com/terms/creation-date` 和 `http://purl.org/dc/elements/1.1/creator` 是一些众所周知、被普遍接受的 URI,用来表达 * 创建者* 和 * 创建日期* 的概念。 + +更复杂的情况是,如果我们想定义创建者列表,可以使用 RDF 中定义的一些数据结构。 + + + +> Diagrams above by [Dmitry Soshnikov](http://soshnikov.com) + +搜索引擎和自然语言处理技术可以从文本中提取结构化数据,它们的成功在某种程度上减缓了语义网的建设进度。不过,在某些领域,人们仍在为维护本体和知识库做出巨大努力。其中有几个项目值得一提: + +* [WikiData](https://wikidata.org/)是与维基百科相关的机器可读知识库的集合。大部分数据都是从维基百科的*InfoBoxes*(维基百科页面内的结构化内容)中挖掘出来的。您可以使用SPARQL(一种用于语义网的特殊查询语言)对维基数据进行[查询](https://query.wikidata.org/)。下面是一个示例查询,显示人类最流行的眼睛颜色: + +```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](https://www.dbpedia.org/)是与 WikiData 类似的另一项工作。 + +> ✅ 如果你想尝试构建自己的本体或打开已有的本体,有一个很棒的可视化本体编辑器,名为[Protégé](https://protege.stanford.edu/)。下载或在线使用。 + + + +*Web Protégé editor open with the Romanov Family ontology. Screenshot by Dmitry Soshnikov* + +## ✍️ 练习: 家庭本体论(家庭关系网) + + +有关使用语义网技术推理家庭关系的示例,请参阅[FamilyOntology.ipynb](https://github.com/Ezana135/AI-For-Beginners/blob/main/lessons/2-Symbolic/FamilyOntology.ipynb)。我们将采用以普通 GEDCOM 格式表示的家庭树和家庭关系本体,并为给定的个人集合构建一个包含所有家庭关系的图。 + +## 微软概念图 + +在大多数情况下,本体都是手工创建的。不过,从非结构化数据(如自然语言文本)中挖掘本体也是可能的。 + +微软研究院(Microsoft Research)就做过这样的尝试,并产生了[微软概念图](https://blogs.microsoft.com/ai/microsoft-researchers-release-graph-that-helps-machines-conceptualize/?WT.mc_id=academic-77998-cacaste)。 + +这是一个使用 "是-一个 "继承关系组合在一起的实体大集合。它可以回答诸如 "微软是什么?- 之类的问题,答案可能是 "一个概率为 0.87 的公司和一个概率为 0.75 的品牌"。 + +该图表可通过 REST API 或可下载的大型文本文件获得,其中列出了所有实体对。 + +## ✍️ 练习: 概念图 + +试试[MSConceptGraph.ipynb](https://github.com/microsoft/AI-For-Beginners/blob/main/lessons/2-Symbolic/MSConceptGraph.ipynb) 笔记本,看看我们如何使用微软概念图将新闻文章分成几类。 + +### 结论 + +如今,人工智能通常被认为是*机器学习*或*神经网络*的同义词。然而,人类也会进行显式推理,这是神经网络目前无法处理的。在现实世界的项目中,显式推理仍被用于执行需要解释的任务,或以可控方式修改系统行为。 + +## 🚀 挑战 + +在与本课相关的家庭本体笔记本中,有机会尝试其他家庭关系。尝试发现家族树中人物之间的新联系。 + +## [课后测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/202) + +## 复习与自学 + +在互联网上做一些研究,发现人类试图量化和编纂知识的领域。看看布鲁姆的分类法,回顾历史,了解人类是如何试图理解他们的世界的。探索林奈创建生物分类法的工作,观察德米特里-门捷列夫创建描述和分组化学元素的方法。你还能找到哪些有趣的例子? + +**作业**: [构建本体论](../assignment.md) diff --git a/lessons/3-NeuralNetworks/03-Perceptron/README.md b/lessons/3-NeuralNetworks/03-Perceptron/README.md index 48d9fcb6..8470e91e 100644 --- a/lessons/3-NeuralNetworks/03-Perceptron/README.md +++ b/lessons/3-NeuralNetworks/03-Perceptron/README.md @@ -1,5 +1,7 @@ # Introduction to Neural Networks: Perceptron - +## Available in Multiple Languages +- [中文](./translations/README.zho.md) + ## [Pre-lecture quiz](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/103) One of the first attempts to implement something similar to a modern neural network was done by Frank Rosenblatt from Cornell Aeronautical Laboratory in 1957. It was a hardware implementation called "Mark-1", designed to recognize primitive geometric figures, such as triangles, squares and circles. diff --git a/lessons/3-NeuralNetworks/03-Perceptron/translations/README.zho.md b/lessons/3-NeuralNetworks/03-Perceptron/translations/README.zho.md new file mode 100644 index 00000000..2df76581 --- /dev/null +++ b/lessons/3-NeuralNetworks/03-Perceptron/translations/README.zho.md @@ -0,0 +1,92 @@ +# 神经网络简介: 感知器 + +## [课前测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/103) + +1957 年,康奈尔航空实验室的弗兰克-罗森布拉特(Frank Rosenblatt)首次尝试实现与现代神经网络类似的功能。这是一种名为 "Mark-1 "的硬件实现,旨在识别三角形、正方形和圆形等原始几何图形。 + +| | | +|--------------|-----------| +| | | + +> Images [from Wikipedia](https://en.wikipedia.org/wiki/Perceptron) + +输入图像由 20x20 光电池阵列表示,因此神经网络有 400 个输入和一个二进制输出。一个简单的网络包含一个神经元,也称为**阈值逻辑单元**。神经网络的权重就像电位器,在训练阶段需要手动调整。 + +> ✅ 电位器是一种允许用户调节电路电阻的装置。 + +> 《纽约时报》当时对感知器进行了报道: *[海军]希望这种电子计算机的雏形能够行走、说话、看东西、写字、自我复制并意识到自己的存在。 + +## 感知器模型 + +假设我们的模型有 N 个特征,那么输入向量就是一个大小为 N 的向量。感知器是一个**二元分类**模型,即它可以区分输入数据的两个类别。我们假定,对于每个输入向量 x,感知器的输出都是+1或-1,具体取决于类别。输出的计算公式为 + +y(x) = f(wTx) + +其中,f 是阶跃激活函数 + + + + +## 训练感知器 + +要训练感知器,我们需要找到一个权重向量 w,它能正确地对大部分数值进行分类,即产生最小的**误差**。这个误差由**感知器准则**定义,其方式如下: + +E(w) = -∑wTxiti + +也就是: + +* 对导致错误分类的训练数据点 i 求和 +* xi s 为输入数据,ti 根据负相关或者正相关相应的的"-1 "或 "+1"。 + +这个标准被视为权重 w 的函数,我们需要将其最小化。通常情况下,我们会使用一种名为**梯度下降**的方法,即从一些初始权重开始计算 w(0), 然后每一步都根据公式更新权重: + +w(t+1) = w(t) - η∇E(w) + + η 即所谓的**学习率**, 并且 ∇E(w) 表示 E 的**梯度**。 计算梯度后,我们得出 + +w(t+1) = w(t) + ∑ηxiti + +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 +``` + +## 结论 + +在这一课中,你了解了二元分类模型感知器,以及如何使用权重向量来训练感知器。 + +## 🚀 挑战 + +如果你想建立自己的感知器,请尝试 [this lab on Microsoft Learn](https://docs.microsoft.com/en-us/azure/machine-learning/component-reference/two-class-averaged-perceptron?WT.mc_id=academic-77998-cacaste) 基于 [Azure ML designer](https://docs.microsoft.com/en-us/azure/machine-learning/concept-designer?WT.mc_id=academic-77998-cacaste). + +## [课后测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/203) + +## 复习与自学 + +要了解我们如何使用感知器解决玩具问题和现实问题,并继续学习--请访问 [Perceptron](../Perceptron.ipynb) 笔记本。 + +这里还有一篇有趣的[关于感知器的文章](https://towardsdatascience.com/what-is-a-perceptron-basics-of-neural-networks-c4cfea20c590)。 + +### [作业](lab/README.md) + +在本课中,我们为二进制分类任务实现了一个感知器,并用它对两个手写数字进行了分类。在本实验中,我们要求你完全解决数字分类问题,即确定哪个数字最有可能与给定图像相对应。 + +* [Instructions](../lab/README.md) +* [Notebook](../lab/PerceptronMultiClass.ipynb) diff --git a/lessons/3-NeuralNetworks/04-OwnFramework/README.md b/lessons/3-NeuralNetworks/04-OwnFramework/README.md index 5afddc6a..22c6a074 100644 --- a/lessons/3-NeuralNetworks/04-OwnFramework/README.md +++ b/lessons/3-NeuralNetworks/04-OwnFramework/README.md @@ -1,4 +1,6 @@ # Introduction to Neural Networks. Multi-Layered Perceptron +## Available in Multiple Languages +- [中文](./translations/README.zho.md) In the previous section, you learned about the simplest neural network model - one-layered perceptron, a linear two-class classification model. diff --git a/lessons/3-NeuralNetworks/04-OwnFramework/translations/README.zho.md b/lessons/3-NeuralNetworks/04-OwnFramework/translations/README.zho.md new file mode 100644 index 00000000..06435e88 --- /dev/null +++ b/lessons/3-NeuralNetworks/04-OwnFramework/translations/README.zho.md @@ -0,0 +1,84 @@ +# 神经网络简介。多层感知器 + +在上一节中,我们学习了最简单的神经网络模型--单层感知器,这是一种线性两类分类模型。 + +在本节中,我们将把这一模型扩展到一个更灵活的框架中,使我们能够 + +* 除两级分类外,还能进行**多级分类**。 +* 除了分类,还能解决**回归问题 +* 分离不可线性分离的类别 + +我们还将用 Python 开发自己的模块化框架,以便构建不同的神经网络架构。 + +## [课前测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/104) + +## 机器学习的形式化 + +让我们从机器学习问题的形式化开始。假设我们有一个标有**Y**的训练数据集**X**,我们需要建立一个能做出最准确预测的模型*f*。预测的质量由**损失函数** ℒ来衡量。通常会用到以下损失函数: + +* 对于回归问题,当我们需要预测一个数字时,我们可以使用**绝对误差**。 ∑i|f(x(i))-y(i)|, 或**平方误差** ∑i(f(x(i))-y(i))2 +* 对于分类,我们使用**0-1损失**(与模型的**准确率**基本相同)或**逻辑损失**。 + +对于单级感知器,函数 *f* 被定义为线性函数 *f(x)=wx+b*(此处 *w* 为权重矩阵,*x* 为输入特征向量,*b* 为偏置向量)。对于不同的神经网络架构,该函数的形式可能更为复杂。 + +> 在分类的情况下,通常希望得到相应类别的概率作为网络输出。为了将任意数字转换为概率(例如,对输出进行归一化处理),我们经常使用 **softmax**函数 σ,函数 *f* 变为 *f(x)=σ(wx+b)* + +在上面*f*的定义中,*w*和*b*被称为**参数** θ=⟨*w,b*⟩。给定数据集⟨**X**,**Y**⟩,我们可以计算出整个数据集的总体误差作为参数 θ 的函数。 + +> ✅ **神经网络训练的目标是通过改变参数 θ** 使误差最小化。 + +## 梯度下降优化法 + +有一种众所周知的函数优化方法叫**梯度下降**。其原理是,我们可以计算损失函数相对于参数的导数(在多维情况下称为**梯度**),并通过改变参数来减少误差。具体方法如下 + +* 用一些随机值初始化参数 w(0), b(0) +* 重复以下步骤多次: + - w(i+1) = w(i)-η∂ℒ/∂w + - b(i+1) = b(i)-η∂ℒ/∂b + +在训练过程中,优化步骤的计算应该考虑整个数据集(请记住,损失的计算是所有训练样本的总和)。然而,在现实生活中,我们会从数据集中抽取一小部分数据,称为**小批量**,然后根据数据子集计算梯度。由于每次都是随机抽取子集,因此这种方法被称为随机梯度下降**(SGD)。 + +## 多层感知器和反向传播 + +如上所述,单层网络能够对线性可分离的类别进行分类。为了建立更丰富的模型,我们可以将多层网络结合起来。从数学上讲,这意味着函数 *f* 的形式将更加复杂,并将分几步进行计算: +* z1=w1x+b1 +* z2=w2α(z1)+b2 +* f = σ(z2) + +这里,α是一个**非线性激活函数**,σ是一个软最大函数,参数为 θ=<*w1,b1,w2,b2*>. + +梯度下降算法将保持不变,但计算梯度将更加困难。根据链微分法则,我们可以计算出导数: + +* ∂ℒ/∂w2 = (∂ℒ/∂σ)(∂σ/∂z2)(∂z2/∂w2) +* ∂ℒ/∂w1 = (∂ℒ/∂σ)(∂σ/∂z2)(∂z2/∂α)(∂α/∂z1)(∂z1/∂w1) + +> ✅链微分法则用于计算损失函数相对于参数的导数。 + +请注意,所有这些表达式的最左侧部分都是相同的,因此我们可以有效地从损失函数开始计算导数,并在计算图中 "倒推"。因此,训练多层感知器的方法被称为**反向推导**,或 "反向推导"。 + + + +> ✅我们将在笔记本范例中更详细地介绍 backprop。 + +## 结论 + +在本课中,我们建立了自己的神经网络库,并用它完成了一个简单的二维分类任务。 + +## 挑战 + +在随附的笔记本中,你将实现自己的多层感知器构建和训练框架。您将能够详细了解现代神经网络是如何运行的。 + +进入 [OwnFramework](../OwnFramework.ipynb) 笔记本并完成它。 + +## [课后测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/204) + +## 复习与自学 + +反向传播是人工智能和 ML 中常用的算法,值得 [详细] 学习(https://wikipedia.org/wiki/Backpropagation) + +## [Assignment](../lab/README.md) + +本实验要求您使用本课构建的框架来解决 MNIST 手写数字分类问题。 + +* [说明](../lab/README.md) +* [笔记](../lab/MyFW_MNIST.ipynb) diff --git a/lessons/3-NeuralNetworks/05-Frameworks/README.md b/lessons/3-NeuralNetworks/05-Frameworks/README.md index 7cdc2819..c95d0d95 100644 --- a/lessons/3-NeuralNetworks/05-Frameworks/README.md +++ b/lessons/3-NeuralNetworks/05-Frameworks/README.md @@ -1,5 +1,7 @@ # Neural Network Frameworks - +## Available in Multiple Languages +- [中文](./translations/README.zho.md) + As we have learned already, to be able to train neural networks efficiently we need to do two things: * To operate on tensors, eg. to multiply, add, and compute some functions such as sigmoid or softmax diff --git a/lessons/3-NeuralNetworks/05-Frameworks/translations/README.zho.md b/lessons/3-NeuralNetworks/05-Frameworks/translations/README.zho.md new file mode 100644 index 00000000..73c1f04f --- /dev/null +++ b/lessons/3-NeuralNetworks/05-Frameworks/translations/README.zho.md @@ -0,0 +1,120 @@ +# 神经网络框架 + +正如我们已经学到的,要想高效地训练神经网络,我们需要做两件事: + +* 对张量进行操作,如乘法、加法和计算一些函数,如 sigmoid 或 softmax。 +* 计算所有表达式的梯度,以便进行梯度下降优化 + +## [课前测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/105) + +虽然 "numpy "库可以完成第一部分,但我们需要一些机制来计算梯度。在上一节我们开发的[我们的框架](../../04-OwnFramework/OwnFramework.ipynb)中,我们不得不手动将所有导数函数编入 "backward "方法中,该方法进行反向传播。理想情况下,一个框架应该让我们有机会计算我们可以定义的*任何表达式*的梯度。 + +还有一点很重要,那就是能够在 GPU 或任何其他专用计算单元上执行计算,例如 [TPU](https://en.wikipedia.org/wiki/Tensor_Processing_Unit)。深度神经网络训练需要*大量*的计算,能够在 GPU 上并行处理这些计算非常重要。 + +> ✅"并行化 "一词的意思是将计算分配到多个设备上。 + +目前,最流行的两个神经框架是 [TensorFlow](http://TensorFlow.org)和[PyTorch](https://pytorch.org/)。两者都提供了底层应用程序接口,可在 CPU 和 GPU 上对张量进行操作。在底层 API 的基础上,还有更高层次的 API,分别称为 [Keras](https://keras.io/) 和 [PyTorch Lightning](https://pytorchlightning.ai/)。 + +低级 API | [TensorFlow](http://TensorFlow.org) | [PyTorch](https://pytorch.org/) +--------------|-------------------------------------|-------------------------------- +高级 API| [Keras](https://keras.io/) | [PyTorch Lightning](https://pytorchlightning.ai/) + +这两个框架中的**低级应用程序接口**允许您构建所谓的**计算图**。该图定义了如何在给定输入参数的情况下计算输出(通常是损失函数),如果 GPU 可用,还可以推送到 GPU 上进行计算。有一些函数可以区分这种计算图并计算梯度,然后用于优化模型参数。 + +**高级应用程序接口**几乎将神经网络视为**层序列**,使大部分神经网络的构建变得更加容易。训练模型通常需要准备数据,然后调用 "fit "函数来完成这项工作。 + +高级应用程序接口允许您快速构建典型的神经网络,而无需担心大量细节。同时,低级 API 对训练过程的控制能力更强,因此在研究新的神经网络架构时,低级 API 被大量使用。 + +同样重要的是,你可以同时使用这两种应用程序接口,例如,你可以使用低级应用程序接口开发自己的网络层架构,然后在使用高级应用程序接口构建和训练的大型网络中使用它。或者,你也可以使用高级 API 将网络定义为一个层序列,然后使用自己的低级训练循环来执行优化。这两种应用程序接口使用相同的基本概念,而且可以很好地协同工作。 + +## 学习 + +在本课程中,我们提供了 PyTorch 和 TensorFlow 的大部分内容。您可以选择自己喜欢的框架,然后只浏览相应的笔记本。如果您不确定选择哪种框架,可以阅读互联网上关于 **PyTorch 与 TensorFlow 的讨论。你也可以看看这两个框架,以便更好地理解。 + +为了简单起见,我们将尽可能使用高级应用程序接口。不过,我们认为从基础开始了解神经网络的工作原理非常重要,因此一开始我们会使用底层 API 和张量。不过,如果你想快速入门,不想花大量时间学习这些细节,可以跳过这些内容,直接进入高级 API 笔记本。 + +## ✍️ 练习: 框架 + +在以下笔记本中继续学习: + +低级 API | [TensorFlow+Keras Notebook](../IntroKerasTF.ipynb) | [PyTorch](../IntroPyTorch.ipynb) +--------------|-------------------------------------|-------------------------------- +高级 API| [Keras](../IntroKeras.ipynb)| *PyTorch Lightning* + +掌握了框架之后,让我们来回顾一下过度拟合的概念。 + +# 过度拟合 + +过拟合是机器学习中一个极其重要的概念,正确理解它非常重要! + +请看下面这个近似 5 个点(在下图中用 `x` 表示)的问题: + +![linear](../../images/overfit1.jpg) | ![overfit](../../images/overfit2.jpg) +-------------------------|-------------------------- +**线性模型,2 个参数** | **线性模型,7 个参数** +训练误差 = 5.3 | 训练误差 = 0 +验证误差 = 5.1 | 验证误差 = 20 + +* 在左边,我们看到了一个很好的直线近似值。由于参数数量足够,该模型正确地表达了点分布的概念。 +* 右边的模型过于强大。因为我们只有 5 个点,而模型有 7 个参数,所以它可以调整到通过所有点,使训练误差为 0。 + +在模型的丰富度(参数数量)和训练样本数量之间取得正确的平衡非常重要。 + +## 为何会出现过拟合 + + * 训练数据不足 + * 模型太强大 + * 输入数据中噪音太大 + +## 如何检测过度拟合 + +从上图可以看出,过度拟合可以通过很低的训练误差和很高的验证误差检测出来。通常在训练过程中,我们会看到训练误差和验证误差都开始下降,然后在某个时刻验证误差可能会停止下降并开始上升。这就是过拟合的迹象,表明我们可能应该在此时停止训练(或至少对模型进行快照)。 + +![overfitting](../../images/Overfitting.png) + +## 如何防止过度拟合 + +如果发现过度拟合现象,可以采取以下措施之一: + + * 增加训练数据量 + * 降低模型的复杂度 + * 使用一些[正则化技术](.../.../4-ComputerVision/08-TransferLearning/TrainingTricks.md),例如[Dropout](.../../4-ComputerVision/08-TransferLearning/TrainingTricks.md#Dropout),我们稍后会考虑它。 + +## 过度拟合与偏差-方差权衡 + +过度拟合实际上是统计学中一个更普遍的问题的一种情况,称为[偏差-方差权衡](https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff)。如果我们考虑模型中可能的误差来源,我们可以看到两种类型的误差: + +* 偏差错误***是由于我们的算法无法正确捕捉训练数据之间的关系造成的。这可能是由于我们的模型不够强大(**拟合不足**)。 +**方差误差**,是由于模型逼近输入数据中的噪声而不是有意义的关系(**过拟合**)造成的。 + +在训练过程中,偏差误差会减小(因为我们的模型学会了逼近数据),而方差误差会增大。重要的是要手动(当我们检测到过拟合时)或自动(通过引入正则化)停止训练,以防止过拟合。 + +## 结论 + +在本课中,您了解了两个最流行的人工智能框架 TensorFlow 和 PyTorch 的各种 API 之间的差异。此外,你还了解了一个非常重要的话题--过度拟合。 + +## 🚀 挑战 + +在随附的笔记本中,您会发现底部有 "任务";请阅读笔记本并完成任务。 + +## [课后测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/205) + +### 复习与自学 + +就以下主题做一些研究: + +- TensorFlow +- PyTorch +- Overfitting + +问自己以下问题 + +- TensorFlow 和 PyTorch 有什么区别? +- 过度拟合和欠拟合有什么区别? + +## [作业](../lab/README.md) + +在本实验中,要求你使用 PyTorch 或 TensorFlow,使用单层和多层全连接网络解决两个分类问题。 + +* [Instructions](../lab/README.md) +* [Notebook](../lab/LabFrameworks.ipynb) diff --git a/lessons/3-NeuralNetworks/README.md b/lessons/3-NeuralNetworks/README.md index 144ea748..3c6fab3a 100644 --- a/lessons/3-NeuralNetworks/README.md +++ b/lessons/3-NeuralNetworks/README.md @@ -1,5 +1,8 @@ # Introduction to Neural Networks +## Available in Multiple Languages +- [中文](./translations/README.zho.md) + ![Summary of Intro Neural Networks content in a doodle](../sketchnotes/ai-neuralnetworks.png) As we discussed in the introduction, one of the ways to achieve intelligence is to train a **computer model** or an **artificial brain**. Since the middle of 20th century, researchers tried different mathematical models, until in recent years this direction proved to by hugely successful. Such mathematical models of the brain are called **neural networks**. diff --git a/lessons/3-NeuralNetworks/translations/README.zho.md b/lessons/3-NeuralNetworks/translations/README.zho.md new file mode 100644 index 00000000..14d789f0 --- /dev/null +++ b/lessons/3-NeuralNetworks/translations/README.zho.md @@ -0,0 +1,47 @@ +# 神经网络简介 + +![Summary of Intro Neural Networks content in a doodle](../../sketchnotes/ai-neuralnetworks.png) + +正如我们在导言中所讨论的,实现智能的方法之一是训练**计算机模型**或**人工大脑**。自 20 世纪中叶以来,研究人员尝试了不同的数学模型,直到近年来,这一方向被证明是非常成功的。这种大脑数学模型被称为**神经网络。 + +> 有时,神经网络被称为**人工神经网络*,ANNs,以表明我们谈论的是模型,而不是真正的神经元网络。 + +## 机器学习 + +神经网络是机器学习(**Machine Learning)这门更大学科的一部分,其目标是利用数据来训练能够解决问题的计算机模型。机器学习是人工智能的重要组成部分,但本课程并不涉及经典的机器学习。 + +> 请访问我们单独的 **[机器学习入门](http://github.com/microsoft/ml-for-beginners)** 课程,了解有关经典机器学习的更多信息。 + +在机器学习中,我们假设有一些示例数据集**X**和相应的输出值**Y**。示例通常是由**特征**组成的 N 维向量,输出称为**标签**。 + +我们将考虑两个最常见的机器学习问题: + +* 分类**,我们需要将输入对象分为两个或多个类别。 +**回归**,我们需要对每个输入样本预测一个数字。 + +> 以张量表示输入和输出时,输入数据集是一个大小为 M×N 的矩阵,其中 M 是样本数,N 是特征数。输出标签 Y 是大小为 M 的向量。 + +在本课程中,我们将只关注神经网络模型。 + +## 神经元模型 + +从生物学角度,我们知道大脑由神经细胞组成,每个神经细胞都有多个 "输入"(轴突)和一个输出(树突)。轴突和树突可以传导电信号,轴突和树突之间的连接可以表现出不同程度的传导性(由神经介质控制)。 + +![Model of a Neuron](../images/synapse-wikipedia.jpg) | ![Model of a Neuron](../images/artneuron.png) +----|---- +Real Neuron *([Image](https://en.wikipedia.org/wiki/Synapse#/media/File:SynapseSchematic_lines.svg) from Wikipedia)* | Artificial Neuron *(Image by Author)* + +因此,神经元最简单的数学模型包含几个输入端 X1, ..., XN 和输出 Y,以及一系列权重 W1, ..., WN. 输出计算公式为 +: + + +其中,f 是某个非线性**激活函数**。 + +> 沃伦-麦卡洛克(Warren McCullock)和沃尔特-皮茨(Walter Pitts)在 1943 年发表的经典论文[神经活动中蕴含的思想的逻辑演算](http://www.springerlink.com/content/61446605110620kg/fulltext.pdf)中描述了神经元的早期模型。唐纳德-赫伯(Donald Hebb)在其著作《行为的组织:神经心理学理论》(https://books.google.com/books?id=VNetYrB8EBoC)中提出了训练这些网络的方法。 +## 在本节中 + +在本节中,我们将了解 +* [感知器](../03-Perceptron/README.md),最早的两类分类神经网络模型之一 +* [多层网络](../04-OwnFramework/README.md),配对笔记[如何构建我们自己的框架](../04-OwnFramework/OwnFramework.ipynb) +* [神经网络框架](../05-Frameworks/README.md),以及这些笔记: [PyTorch](../05-Frameworks/IntroPyTorch.ipynb) 和 [Keras/Tensorflow](../05-Frameworks/IntroKerasTF.ipynb) +* [Overfitting](../05-Frameworks/Overfitting.md) diff --git a/lessons/4-ComputerVision/06-IntroCV/README.md b/lessons/4-ComputerVision/06-IntroCV/README.md index d958437b..c189f0d2 100644 --- a/lessons/4-ComputerVision/06-IntroCV/README.md +++ b/lessons/4-ComputerVision/06-IntroCV/README.md @@ -1,4 +1,6 @@ # Introduction to Computer Vision +## Available in Multiple Languages +- [中文](./translations/README.zho.md) [Computer Vision](https://wikipedia.org/wiki/Computer_vision) is a discipline whose aim is to allow computers to gain high-level understanding of digital images. This is quite a broad definition, because *understanding* can mean many different things, including finding an object on a picture (**object detection**), understanding what is happening (**event detection**), describing a picture in text, or reconstructing a scene in 3D. There are also special tasks related to human images: age and emotion estimation, face detection and identification, and 3D pose estimation, to name a few. @@ -106,4 +108,4 @@ Read more on optical flow [in this great tutorial](https://learnopencv.com/optic In this lab, you will take a video with simple gestures, and your goal is to extract up/down/left/right movements using optical flow. - \ No newline at end of file + diff --git a/lessons/4-ComputerVision/06-IntroCV/translations/README.zho.md b/lessons/4-ComputerVision/06-IntroCV/translations/README.zho.md new file mode 100644 index 00000000..1bb7463b --- /dev/null +++ b/lessons/4-ComputerVision/06-IntroCV/translations/README.zho.md @@ -0,0 +1,109 @@ +# 计算机视觉入门 + +[计算机视觉](https://wikipedia.org/wiki/Computer_vision) 是一门学科,其目标是让计算机获得对数字图像的高级理解。这是一个相当宽泛的定义,因为 "理解 "可以有许多不同的含义,包括在图片上找到一个对象(**对象检测**)、理解正在发生的事情(**事件检测**)、用文字描述图片或重建三维场景。此外,还有一些与人类图像相关的特殊任务:年龄和情感估计、人脸检测和识别以及三维姿态估计等等。 + +## [课前测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/106) + +计算机视觉最简单的任务之一就是**图像分类**。 + +计算机视觉通常被认为是人工智能的一个分支。如今,大多数计算机视觉任务都是通过神经网络来解决的。在本节中,我们将进一步了解用于计算机视觉的特殊神经网络--[卷积神经网络](../../07-ConvNets/README.md)。 + +不过,在将图像传递给神经网络之前,很多情况下都需要使用一些算法技术来增强图像。 + +有几个 Python 库可以用于图像处理: + +* **[imageio](https://imageio.readthedocs.io/en/stable/)** 可用于读取/写入不同的图像格式。它还支持 ffmpeg,这是一种将视频帧转换为图像的实用工具。 +* **[Pillow](https://pillow.readthedocs.io/en/stable/index.html)** (也称为 PIL)功能更强大一些,还支持一些图像处理功能,如变形、调色板调整等。 +* **[OpenCV](https://opencv.org/)** 是一个用 C++ 编写的功能强大的图像处理库,已成为图像处理的*事实*标准。它有一个方便的 Python 接口。 +* **[dlib](http://dlib.net/)** 是一个 C++ 库,可以实现许多机器学习算法,包括一些计算机视觉算法。它还有一个 Python 接口,可用于人脸和面部地标检测等具有挑战性的任务。 + +## 开放式计算机辅助设计(OpenCV) + +[OpenCV](https://opencv.org/) 被认为是图像处理的*事实*标准。它包含大量有用的算法,用 C++ 实现。你也可以从 Python 中调用 OpenCV。 + +学习 OpenCV 的好地方是 [学习 OpenCV 课程](https://learnopencv.com/getting-started-with-opencv/). 在我们的课程中,我们的目标不是学习 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(红-绿-蓝)编码。为了使图像看起来正确,您需要通过交换 NumPy 数组中的维数或调用 OpenCV 函数,将图像转换为 RGB 色彩空间: + +```python +im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) +``` + +同样的 `cvtColor` 函数可用于执行其他色彩空间转换,如将图像转换为灰度或 HSV(色相-饱和度-值)色彩空间。 + +您还可以使用 OpenCV 逐帧加载视频 - [OpenCV Notebook](OpenCV.ipynb) 习题中给出了一个示例。 + +### 图像处理 + +在将图像输入神经网络之前,您可能需要应用几个预处理步骤。OpenCV 可以做很多事情,包括 + +* **调整大小** 使用 `im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS)` +* **模糊化** 使用 `im = cv2.medianBlur(im,3)` or `im = cv2.GaussianBlur(im, (3,3), 0)` +* 改变图像的**亮度和对比度**可通过 NumPy 数组操作完成,如以下所述 [在此 Stackoverflow 说明中](https://stackoverflow.com/questions/39308030/how-do-i-increase-the-contrast-of-an-image-in-python-opencv). +* 使用 [阈值](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) 调用 `cv2.threshold`/`cv2.adaptiveThreshold`函数,这通常比调整亮度或对比度更好。 +* 对这个图片应用不同的 [transformations](https://docs.opencv.org/4.5.5/da/d6e/tutorial_py_geometric_transformations.html) : + - **[Affine transformations](https://docs.opencv.org/4.5.5/d4/d61/tutorial_warp_affine.html)** 如果需要对图像进行旋转、大小调整和倾斜,并且知道图像中三个点的源点和目标点位置,那么 Affine 变换就会非常有用。仿射变换使平行线保持平行。 + - **[Perspective transformations](https://medium.com/analytics-vidhya/opencv-perspective-transformation-9edffefb2143)** 当你知道图像中 4 个点的源位置和目标位置时,该功能就会派上用场。例如,如果您通过智能手机摄像头从某个角度拍摄了一张矩形文件的照片,并希望制作出该文件本身的矩形图像,您可以使用以下方法来制作矩形图像。 +* 使用 **[optical flow](https://docs.opencv.org/4.5.5/d4/dee/tutorial_optical_flow.html)**. + +## 使用计算机视觉的例子 + +在我们的 [OpenCV Notebook](.../OpenCV.ipynb)中,我们列举了一些计算机视觉可用于执行特定任务的例子: + +* 对盲文书籍的照片进行预处理**。我们的重点是如何使用阈值处理、特征检测、透视变换和 NumPy 操作来分离单个盲文符号,以便神经网络进行进一步分类。 + +![盲文图像](../data/braille.jpeg) | ![盲文图像预处理](../images/braille-result.png) | ![盲文符号](../images/braille-symbols.png) +----|-----|----- + +> 图片来自于 [OpenCV.ipynb](../OpenCV.ipynb) + +* 利用帧差检测视频中的运动**。如果摄像机是固定的,那么摄像机馈送的帧应该非常相似。由于帧是以数组表示的,因此只需减去随后两个帧的数组,就能得到像素差,静态帧的像素差应该较小,而一旦图像中出现大量运动,像素差就会变大。 + +![视频帧图像和帧差](../images/frame-difference.png) + +> Image from [OpenCV.ipynb](OpenCV.ipynb) + +** 利用光学流检测运动**。通过[光学流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html),我们可以了解视频帧上的单个像素是如何移动的。光流有两种类型: + + - 密集光流**计算矢量场,显示每个像素的移动位置。 + - 稀疏光学流***基于图像中的一些显著特征(如边缘),并建立其从一帧到另一帧的轨迹。 + +![光流图像](../images/optical.png) + +> 图片来自于 [OpenCV.ipynb](../OpenCV.ipynb) + +## ✍️ 笔记本范例: OpenCV [体验 OpenCV 操作](../OpenCV.ipynb) + +让我们通过探索 [OpenCV Notebook](../OpenCV.ipynb)用 OpenCV 做一些实验吧 + +## 结论 + +有时,一些相对复杂的任务,如运动检测或指尖检测,完全可以通过计算机视觉来解决。因此,了解计算机视觉的基本技术以及 OpenCV 等库的功能非常有帮助。 + +## 🚀 挑战 + +观看 [这个视频](https://docs.microsoft.com/shows/ai-show/ai-show--2021-opencv-ai-competition--grand-prize-winners--cortic-tigers--episode-32?WT.mc_id=academic-77998-cacaste) 从人工智能展上了解 Cortic Tigers 项目,以及他们如何通过机器人构建一个基于块的解决方案来实现计算机视觉任务的民主化。对类似的其他项目进行一些研究,以帮助新学员进入这一领域。 + +## [课后测验](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/206) + +## 回顾 & 自学 + +了解有关光流的更多信息 [在这个伟大的教程中](https://learnopencv.com/optical-flow-in-opencv/). + +## [任务](../lab/README.md) + +在本实验室中,您将拍摄一段带有简单手势的视频,目标是使用光学流提取上/下/左/右的动作。 + + diff --git a/translations/README.zho.md b/translations/README.zho.md new file mode 100644 index 00000000..962c3b66 --- /dev/null +++ b/translations/README.zho.md @@ -0,0 +1,194 @@ +[![GitHub license](https://img.shields.io/github/license/microsoft/AI-For-Beginners.svg)](https://github.com/microsoft/AI-For-Beginners/blob/main/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/AI-For-Beginners.svg)](https://GitHub.com/microsoft/AI-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/AI-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/AI-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/AI-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/AI-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/AI-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/AI-For-Beginners/stargazers/) +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD) +[![Gitter](https://badges.gitter.im/Microsoft/ai-for-beginners.svg)](https://gitter.im/Microsoft/ai-for-beginners?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +# 人工智能入门--一门课程 + +|![ Sketchnote by [(@girlie_mac)](https://twitter.com/girlie_mac) ](../lessons/sketchnotes/ai-overview.png)| +|:---:| +| AI For Beginners - _Sketchnote by [@girlie_mac](https://twitter.com/girlie_mac)_ | + +通过微软 12 周 24 课时的课程,探索**人工智能**(AI)的世界!深入学习符号 AI、神经网络、计算机视觉、自然语言处理等内容。实践课程、小测验和实验室可增强您的学习效果。这本由专家设计的综合指南非常适合初学者,涵盖了 TensorFlow、PyTorch 和人工智能伦理原则。今天就开始您的人工智能之旅吧 + +在本课程中,您将学习到: + +* 人工智能的不同方法,包括**知识表示**和推理的 "古老 "符号方法([GOFAI](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence))。 +* 神经网络**和深度学习**,它们是现代人工智能的核心。我们将使用两个最流行的框架--[TensorFlow](http://Tensorflow.org) 和 [PyTorch](http://pytorch.org)--中的代码来说明这些重要主题背后的概念。 +* 用于处理图像和文本的**神经架构**。我们将介绍最新的模型,但可能会对最先进的模型有所欠缺。 +* 不太流行的人工智能方法,如**遗传算法**和**多代理系统**。 + +本课程不包括的内容: + +* 在企业中使用**人工智能的商业案例**。考虑参加 Microsoft Learn 上的 [Introduction to AI for business users](https://docs.microsoft.com/learn/paths/introduction-ai-for-business-users/?WT.mc_id=academic-77998-cacaste)学习路径,或与 [INSEAD](https://www.insead.edu/) 合作开发的 [AI Business School](https://www.microsoft.com/ai/ai-business-school/?WT.mc_id=academic-77998-cacaste)。 + **经典机器学习**,我们的[机器学习入门课程](http://github.com/Microsoft/ML-for-Beginners)对此有详细介绍。 +* 使用 **[认知服务](https://azure.microsoft.com/services/cognitive-services/?WT.mc_id=academic-77998-cacaste)**构建的实用人工智能应用。为此,我们建议您从 Microsoft Learn 的 [视觉](https://docs.microsoft.com/learn/paths/create-computer-vision-solutions-azure-cognitive-services/?WT.mc_id=academic-77998-cacaste)、[自然语言处理](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77998-cacaste)、**[使用 Azure OpenAI 服务的生成式人工智能](https://learn.microsoft.com/en-us/training/paths/develop-ai-solutions-azure-openai/?WT.mc_id=academic-77998-bethanycheum)** 等模块开始学习。 +* 特定的 ML **云框架**,如[Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste)、[Microsoft Fabric](https://learn.microsoft.com/en-us/training/paths/get-started-fabric/?WT.mc_id=academic-77998-bethanycheum)或[Azure Databricks](https://docs.microsoft.com/learn/paths/data-engineer-azure-databricks?WT.mc_id=academic-77998-cacaste)。考虑使用 [使用 Azure Machine Learning 构建和运行机器学习解决方案](https://docs.microsoft.com/learn/paths/build-ai-solutions-with-azure-ml-service/?WT.mc_id=academic-77998-cacaste) 和 [Azure Databricks 构建和运行机器学习解决方案](https://docs.microsoft.com/learn/paths/build-operate-machine-learning-solutions-azure-databricks/?WT.mc_id=academic-77998-cacaste) 学习路径。 + **对话式人工智能**和**聊天机器人**。有一个单独的[创建对话式人工智能解决方案](https://docs.microsoft.com/learn/paths/create-conversational-ai-solutions/?WT.mc_id=academic-77998-cacaste)学习路径,你也可以参考[本博文](https://soshnikov.com/azure/hello-bot-conversational-ai-on-microsoft-platform/)了解更多详情。 +* 深度学习背后的**深奥数学**。关于这一点,我们推荐 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 所著的《深度学习》[Deep Learning](https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618),该书也可在线阅读[https://www.deeplearningbook.org/](https://www.deeplearningbook.org/)。 + +如果想了解云中*人工智能*主题的简要介绍,您可以考虑参加[在Azure上开始学习人工智能](https://docs.microsoft.com/learn/paths/get-started-with-artificial-intelligence-on-azure/?WT.mc_id=academic-77998-cacaste) 学习路径。 + + +## 公告--关于生成式人工智能的新课程刚刚发布! + +我们刚刚发布了 12 课时的生成式人工智能课程。快来学习 + +- 提示和提示工程 +- 文本和图像应用程序生成 +- 搜索应用程序 + +和往常一样,这里有课程、需要完成的作业、知识检查和挑战。 + +快来看看吧 + +> https://aka.ms/genai-beginners + +--- +# 内容 + +