人工智能的数学基础-一-

434 阅读1小时+

人工智能的数学基础(一)

原文:zh.annas-archive.org/md5/2493e49e788325932f4968ea203e1f3d

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

我为什么写这本书

人工智能是建立在数学模型上的。我们需要知道它是如何建立的。

我用纯粹的口语写了这本书,把大部分技术细节都留在了外面。这是一本关于人工智能的数学书,但是几乎没有数学公式和方程式,没有定理,没有证明,也没有编码。我的目标不是让这些重要的知识只留在少数精英手中,而是吸引更多的人进入技术领域。我相信很多人在有机会了解并可能喜欢数学并且天生擅长它之前就对数学产生了厌恶。这种情况也发生在大学或研究生阶段,很多学生从数学专业转到其他专业,或者开始攻读博士学位却没有完成。原因不是因为他们没有能力,而是因为他们看不到学习那些看似无用的艰难方法和技巧的动机或目标。这就好像每天去大脑健身房只是为了去那里一样。没有人每天都想去健身房(这是一个有偏见的说法,但你懂我的意思)。在数学中,将对象形式化为函数、空间、测度空间和整个数学领域是在动机之后,而不是之前。不幸的是,它被反过来教授,先是形式化,然后,如果我们幸运的话,会有一些动机。

数学最美妙的地方在于它有表达能力,可以把看似不相关的事物联系在一起。像人工智能这样大而重要的领域不仅建立在数学基础上,这是理所当然的,而且它需要数学所能提供的联系能力,以便简洁地讲述它的大故事。在这本书中,我将以不偏离真实人工智能应用的数学方式提取所需的数学知识。详细介绍现有工具是不可行的,会导致百科全书式的压倒性介绍。我所做的是尝试教会你如何思考这些工具,并从更高的角度来看待它们,作为我们可以在需要时调整和改进的手段。我希望你从这本书中得到的是一种看待事物之间关系的方式,以及我们为什么会开发或使用某些方法而不是其他方法。在某种程度上,这本书提供了一个平台,让你进入你感兴趣或想专攻的领域。

这本书的另一个目标是民主化数学,并增强更多人询问事物如何运作的信心。常见的回答,比如“这是复杂的数学”、“这是复杂的技术”或“这是复杂的模型”,已经不再令人满意,尤其是建立在数学模型上的技术目前影响着我们生活的方方面面。我们不需要成为数学的每个领域的专家(没有人能做到这一点)才能理解事物是如何构建的,以及它们为什么以这种方式运作。关于数学模型,每个人都需要知道一件事:它们总是会给出一个答案。它们总是会输出一个数字。一个经过验证、有理论支持的模型会给出一个答案。同样,一个完全垃圾的模型也会给出一个答案。两者都会计算数学函数。说我们的决策是基于数学模型和算法的并不意味着它们是神圣的。这些模型是基于什么构建的?它们的假设是什么?有什么限制?它们是在哪些数据上进行训练的?进行了哪些测试?它们考虑了哪些变量?又忽略了哪些?它们有改进的反馈循环吗?有地面真相来进行比较和改进吗?有没有理论支持它们?当这些模型是我们自己的时候,我们需要对这些信息透明,当这些模型是决定我们生计的时候,我们需要询问这些信息。

本书中主题的非正统组织是有意为之的。我希望避免在涉及实际应用之前陷入数学细节中。我的立场是,除非我们个人正在实践某些事情并且背景材料成为我们知识中的一个未填补的空白,阻碍我们取得进展,否则我们永远不需要深入研究背景材料。只有在这种情况下,值得投入大量时间学习事物的复杂细节。更重要的是要看到一切是如何联系在一起的,以及一切如何相互配合。换句话说,这本书提供了数学和人工智能之间相互交互的地图。

我还想向新手们指出大数据时代。在处理大数据之前,无论是真实的还是模拟的,结构化的还是非结构化的,我们可能认为计算机和互联网理所当然。如果我们需要建立模型或对小型和策划好的数据集进行分析,我们可能会假设我们的机器硬件可以处理计算,或者互联网会在我们需要时提供更多策划好的数据,或者提供更多关于类似模型的信息。然而,我们真正面对的是数据获取的现实和限制、数据中的错误、查询结果中的错误、硬件的限制、存储、设备之间的数据流以及向量化非结构化数据(如自然语言或图像和视频)。这时,我们开始涉足并行计算、云计算、数据管理、数据库、数据结构、数据架构和数据工程,以了解允许我们运行模型的基础设施。我们拥有什么样的基础设施?它的结构是怎样的?它是如何发展的?它的发展方向是什么?它使用了什么材料?这些材料是如何工作的?量子计算到底是怎么回事?我们不应将软件视为与硬件分离,也不应将我们的模型视为与允许我们模拟它们的基础设施分离。这本书只关注数学、人工智能模型和一些数据。没有练习题,也没有编程。换句话说,我们关注的是软性、智力性我不需要触碰任何东西的一面。但我们需要不断学习,直到能够理解支撑我们生活许多方面的技术实际上是一个相互关联的整体:硬件、软件、传感器和测量设备、数据仓库、连接电缆、无线中心、卫星、通信中心、物理和软件安全措施以及数学模型。

这本书适合谁?

  • 对于懂数学但想进入人工智能、机器学习和数据科学领域的人。

  • 对于从事人工智能、数据科学和机器学习的人,但希望提高数学思维,并了解最新模型背后的数学理念。

  • 对于数学、数据科学、计算机科学、运筹学、科学、工程或其他领域的本科生或研究生早期学生,他们对人工智能感兴趣。

  • 对于管理岗位的人,他们希望将人工智能和数据分析整合到业务中,但希望更深入地了解他们可能基于的模型实际上是如何工作的。

  • 对于主要从事商业智能的数据分析师,现在像世界其他地方一样,被推向由人工智能驱动的商业智能,因此他们希望在将其纳入业务决策之前了解这究竟意味着什么。

  • 对于关心人工智能可能给世界带来的伦理挑战,并希望了解模型的内部运作方式,以便就自主武器、定向广告、数据管理等问题进行辩论的人。

  • 对于想要开设数学和人工智能课程的教育工作者。

  • 对于任何对人工智能感到好奇的人。

这本书不适合谁?

一个喜欢坐下来做很多练习来掌握特定数学技巧或方法的人,一个喜欢写作和证明定理的人,或者一个想要学习编码和开发的人。这不是一本数学教科书。有许多优秀的教科书教授微积分、线性代数和概率(但很少有书将这些数学与 AI 联系起来)。也就是说,这本书在文中有很多指向相关书籍和科学出版物的指针,供那些想深入技术细节、严格的陈述和证明的读者参考。这也不是一本编码书。重点是概念、直觉和一般理解,而不是实施和开发技术。

这本书中的数学将如何呈现?

写一本书最终是一个决策过程:如何以最有洞察力的方式组织主题材料,以及如何选择详细阐述和不详细阐述的内容。我会在一些地方详细介绍一些数学知识,在其他地方则会省略细节。这是有意为之的,因为我的目标不是让自己分心,而是讲述一个故事:

我们使用哪些数学,为什么我们需要它,以及我们在 AI 中具体在哪里使用它?

  1. 我总是定义 AI 的背景,有许多应用。

  2. 然后我谈论相关的数学,有时详细说明,有时只是一般性的思考方式。每当我跳过细节时,我会指出我们应该提出的相关问题以及如何去找到它们的答案。

  3. 我展示数学、AI 和模型作为一个相互联系的整体。

  4. 只有当数学必须成为基础的一部分时,我才会深入研究数学。即使如此,我更偏向直觉而不是形式化。我在这里付出的代价是,在极少数情况下,我可能会在定义之前使用一些技术术语,暗中希望你之前遇到过这些术语。在这方面,我采用了 AI 的transformer (Google Brain, 2017)对自然语言理解的哲学:模型从上下文中学习单词的含义。因此,当你遇到一个我之前没有定义的技术术语时,专注于术语周围的环境。在它出现的章节中,你会对它的含义有很好的直觉。另一个选择当然是google 它。总的来说,我避免使用行话,也不使用任何缩写词。

  5. 由于这本书处于数学、数据科学、人工智能、机器学习和哲学的交叉点上,我写这本书时期望有一个技能和背景迥异的多样化受众。因此,根据主题的不同,相同的材料对一些人来说可能感觉平凡,但对其他人来说可能很复杂。我希望在这个过程中不会冒犯任何人的思想。也就是说,这是我愿意冒的风险,以便所有读者都能从这本书中学到有用的东西。例如,数学家将学习 AI 的应用,数据科学家和 AI 从业者将学到更深层次的数学知识。

各个章节的技术难度不断变化,所以如果某一章节变得太令人困惑,可以心里记下它的存在,然后跳到下一章节。你可以在以后回到你跳过的部分。

大多数章节彼此独立,所以读者可以直接跳到他们感兴趣的主题。当章节与其他章节相关时,我会指出这一点。由于我尽量使每一章尽可能独立,所以可能会在不同的章节中重复一些解释。我将概率章节一直推迟到最后(第十一章),但我一直在使用和讨论概率分布(特别是数据集特征的联合概率分布)。我的想法是在学习语法之前,先习惯概率的语言以及它与 AI 模型的关系,这样当我们开始学习语法时,我们就对它适用的背景有了很好的理解。

我相信有两种类型的学习者:那些先学习具体细节,然后慢慢开始构想一个更大的图景和事物如何相互关联的人;以及那些首先需要理解大局和事物如何相互关联,然后只在需要时才深入细节的人。两者同样重要,区别只在于某人的大脑类型和自然倾向。我更倾向于第二种类型,这本书就是这种倾向的反映:从上面看,一切是什么样的,数学和人工智能如何相互作用?结果可能感觉像一场旋风般的主题,但你最终会拥有丰富的数学和人工智能知识基础,以及一定的自信心。

当我爸爸教我开车时,他坐在副驾驶座上让我开车。十分钟后,路变成了悬崖边的路。他让我停下车,下车后说:现在开车,尽量不要掉下悬崖,不要害怕,我在看着(好像那会有帮助一样)。我没有掉下悬崖,事实上我最喜欢悬崖边的路。现在把这个比作通过强化学习训练自动驾驶汽车,不同之处在于对我来说掉下悬崖的代价将是负无穷。我承受不起,我是一个真实的人在一辆真实的汽车上,而不是一个模拟。

这本书中你将如何学习数学和人工智能。没有引言、结论、定义、定理、练习或类似的内容。只有沉浸。

你已经在其中。你知道的。现在开车吧。

信息图表

我用信息图表来陪伴这本书,将所有的主题以视觉方式联系在一起。你可以在这本书的 github 页面上找到它:https://github.com/halanelson/Essential-Math-For-AI

你需要具备怎样的数学背景才能阅读这本书?

这本书是自包含的,我们会激发我们需要使用的一切。我希望你已经接触过微积分和一些线性代数,包括向量和矩阵运算,比如加法、乘法和一些矩阵分解。我也希望你知道什么是函数以及它是如何将输入映射到输出的。在人工智能中,我们大部分的数学工作都涉及构建函数、评估函数、优化函数或组合一系列函数。你需要了解导数(它们衡量事物变化的速度)和导数的链式法则。你不一定需要知道如何为每个函数计算它们,因为现在计算机、Desmos 和 MathWolfram Alpha 都可以为我们做这一切,但你需要知道它们的含义。对概率和统计思维的一些了解也是有帮助的。如果你对以上任何一点都不了解,那也完全没关系。你可能需要坐下来自己做一些例子(来自其他书籍)来熟悉某些概念。关键在于你应该知道什么时候查找你不了解的东西:只有在你需要它们时,也就是说只有当你遇到一个你不理解的术语,并且你对它出现的背景有一个很好的理解时。如果你真的是从零开始,那也没关系。这本书尽量避免技术性的内容。

章节概述

我们总共有十四章。

如果你是一个关心数学和人工智能技术与伦理、政策、社会影响以及各种影响、机遇和挑战的人,那么首先阅读第一章和第十四章。如果你不关心这些,那么我们会提出你应该关心的理由。在这本书中,我们将数学视为看似不相关主题的粘合剂,而不是数学通常呈现的一堆复杂公式、定理和希腊字母的绿洲。

第十三章可能会让你觉得与本书无关,如果你从未接触过微分方程(ODE 和 PDE),但如果你对数学建模、物理和自然科学、模拟或数学分析感兴趣,你会欣赏它,并且想知道 AI 如何有益于你的领域,以及微分方程如何有益于 AI。无数的科学成就都建立在微分方程之上,因此当我们处于一个有潜力解决该领域许多长期存在问题的计算技术的黎明时,我们不能忽略它们。这一章并不是AI 的必需品,但它对我们对数学的整体理解至关重要,对于建立 AI 和神经运算符的理论基础也是必不可少的。

其余的章节对于 AI、机器学习和数据科学至关重要。对于奇异值分解(主成分分析和潜在语义分析的基本数学,以及维度缩减的一个很好的方法)来说,没有最佳的位置。让你的自然好奇心决定你何时阅读这一章:在你觉得最合适的章节之前或之后。这完全取决于你的背景以及你所来自的行业或学术学科。

让我们简要回顾一下第一章,“为什么学习 AI 的数学”和第十四章:

第一章,“为什么学习 AI 的数学”

人工智能已经到来。它已经渗透到我们生活的许多领域,参与了重要的决策,并很快将被应用于我们社会和运营的每个领域。这项技术发展非常迅速,其投资也在飙升。什么是人工智能?它能做什么?它的局限性是什么?它的发展方向是什么?最重要的是,它是如何工作的,为什么我们真的应该关心知道它是如何工作的?在这个介绍性的章节中,我们简要调查了重要的 AI 应用,公司在尝试将 AI 整合到其系统中时通常遇到的问题,系统未能很好实施时发生的事件,以及 AI 解决方案中通常使用的数学。

第二章,“数据,数据,数据”

这一章强调了数据对 AI 的重要性。它解释了通常会引起混淆的概念之间的区别:结构化和非结构化数据,线性和非线性模型,真实和模拟数据,确定性函数和随机变量,离散和连续分布,先验概率,后验概率和似然函数。它还提供了 AI 所需的概率和统计的地图,而不深入任何细节,并介绍了最流行的概率分布。

第三章,“将函数拟合到数据”

在许多流行的机器学习模型的核心,包括自 2012 年以来重新引起人工智能关注的非常成功的神经网络,都存在一个非常简单的数学问题:将给定的数据点拟合到一个合适的函数中,然后确保这个函数在新数据上表现良好。这一章通过一个真实的数据集和其他简单的例子突出了这个广泛有用的事实。回归、逻辑回归和一些流行的机器学习技术在这里讨论,有一个统一的主题:训练函数、损失函数和优化。

第四章,“神经网络的优化”

神经网络是模仿大脑皮层的,它涉及数百万个神经元排列成分层结构。大脑通过在面对之前见过的概念时加强神经元连接来学习,并在学习到否定或矛盾于先前学到的概念的新信息时削弱连接。机器只能理解数字。在数学上,更强的连接对应于更大的数字,而更弱的连接对应于更小的数字。本章解释了训练神经网络时使用的优化和反向传播步骤,类似于我们大脑中学习的方式(尽管我们尚未完全理解这一点)。它还介绍了各种正则化技术,解释了它们的优点、缺点和用例。此外,我们解释了逼近理论和神经网络的普适逼近定理背后的直觉。

第五章,“卷积神经网络和计算机视觉”

卷积神经网络在计算机视觉和自然语言处理中广受欢迎。在本章中,我们从卷积和交叉相关操作开始,然后调查它们在系统设计和信号图像滤波中的用途。然后我们将卷积与神经网络整合,以从图像中提取高阶特征。

第六章,“奇异值分解:图像处理、自然语言处理和社交媒体”

对角矩阵的行为类似于标量,因此非常理想。奇异值分解是线性代数中至关重要的数学方法,它将密集矩阵转换为对角矩阵。在这个过程中,它揭示了矩阵对空间本身的作用:旋转、拉伸和挤压。我们可以将这个简单的过程应用于任何数字矩阵。这种广泛的适用性,以及它能够显著减少维度同时保留基本信息的能力,使奇异值分解在数据科学、人工智能和机器学习领域备受欢迎。它是主成分分析和潜在语义分析背后的基本数学。本章详细介绍了奇异值分解以及它最相关和最新的应用。

第七章,“自然语言和金融人工智能:向量化和时间序列”

我们在本章中提出了自然语言模型的数学概念,比如识别主题、机器翻译和注意力模型。要克服的主要障碍是从携带意义的单词和句子转移到机器可以处理的低维向量。我们讨论了谷歌大脑的变压器等最先进的模型(从 2017 年开始),同时我们只关注相关的数学。时间序列数据和模型(如循环神经网络)在这里自然而然地出现。我们简要介绍了金融人工智能,因为它在建模和两个领域相互影响方面与自然语言有重叠。

第八章,“概率生成模型”

生成的图像,包括人类的图像,变得越来越逼真。如今很难分辨时尚界模特的图像是真实人物还是计算机生成的图像。我们要感谢生成对抗网络取得的进展,使得虚拟和真实之间的界限变得更加模糊。这些网络的设计方式是使用两个神经网络重复一个简单的数学过程,直到机器本身无法区分真实图像和计算机生成的图像,因此取得了“非常接近现实”的成功。博弈论和零和游戏在这里自然而然地发生,因为两个神经网络相互“竞争”。本章调查了生成模型,这是人类思维中的想象力。这些网络有着广泛的应用,从扩充数据集到完成遮挡的人脸,再到高能物理,比如模拟类似于 CERN 大型强子对撞机产生的数据集。

第九章,“图模型”

图和网络无处不在:城市和道路图、机场和航班连接、全球网络、云(计算中)、分子网络、我们的神经系统、社交网络、恐怖组织网络,甚至各种机器学习模型和人工神经网络。具有自然图结构的数据可以通过利用和保留该结构的机制更好地理解,构建直接在图上操作的函数,而不是将图数据嵌入现有的机器学习模型中,然后再进行分析。这与卷积神经网络成功处理图像数据、循环神经网络成功处理序列数据等原因相同。图神经网络背后的数学是图论、计算和神经网络的结合。本章在许多应用的背景下调查了这些数学。

第十章,“运筹学”

运筹学的另一个合适的名称可能是“物流优化”。本章向读者介绍了人工智能和运筹学交叉的问题,如供应链、旅行推销员、调度和人员配备、排队等问题,其特征是高维度、复杂性和平衡竞争利益和有限资源。解决这些问题所需的数学知识来自于优化、博弈论、对偶性、图论、动态规划和算法。

第十一章,“概率”

概率理论提供了一种系统化的方法来量化随机性和不确定性。它将逻辑推广到在人工智能中至关重要的情况:当信息和知识不确定时。本章重点介绍了人工智能应用中使用的基本概率:贝叶斯网络和因果建模、悖论、大型随机矩阵、随机过程、马尔可夫链和强化学习。最后介绍了严格的概率理论,揭开了测度论的神秘面纱,并向感兴趣的读者介绍了神经网络的普遍逼近定理的证明。

第十二章,“数理逻辑”

这个重要的主题放在最后,以免打断书本的自然流程。设计能够收集知识、对其所处的环境进行逻辑推理,并根据这种逻辑推理做出推断和良好决策的代理人,是人工智能的核心。本章简要介绍了命题逻辑、一阶逻辑、概率逻辑、模糊逻辑和时间逻辑,以及智能知识型代理人。

第十三章,“人工智能和偏微分方程”

微分方程模拟了现实世界中无数的现象,从空气湍流到星系、股票市场到材料和人口增长的行为。现实模型通常非常难以解决,并且在依赖传统的数值技术时需要大量的计算能力。最近,人工智能已经开始加速求解偏微分方程。本章的第一部分充当了微分方程的速成课程,突出了最重要的主题,并为读者提供了一个鸟瞰图。第二部分探讨了基于人工智能的新方法,简化了解微分方程的整个过程。这些方法有潜力解决科学、金融和其他领域长期存在的问题。

第十四章,“人工智能、伦理、数学和政策”

我相信这一章应该是任何一本关于人工智能的书的第一章,然而,这个主题是如此广泛和深刻,以至于需要多本书来覆盖。这一章只是触及了表面,并总结了与人工智能相关的各种伦理问题,包括:公平、公正、偏见、包容性、透明度、政策、监管、隐私、武器化和安全。它提出了每个问题以及可能的解决方案(数学或政策和监管)。

我最喜欢的 AI 书籍

关于 AI 和与该领域密切相关的主题,有许多优秀而极具洞察力的书籍。以下列表并不全面。有些是数学重的技术书籍,有些是介绍性的或完全非技术性的。有些是代码导向(Python 3),有些则不是。我从中学到了很多:

  • 《使用 Scikit-Learn、Keras 和 TensorFlow 进行实践机器学习》,作者奥雷利安·杰龙,奥莱利,2019 年

  • 《线性代数与数据学习》,作者吉尔伯特·斯特朗,韦尔斯利剑桥出版社,2019 年

  • 《随机图和复杂网络》,作者雷姆科·范德霍夫斯塔德,剑桥,2017 年

  • 《机器学习设计模式》,作者瓦利亚帕·拉克什马南、萨拉·罗宾逊和迈克尔·蒙,奥莱利,2020 年

  • 《使用 TensorFlow2 进行计算机视觉》,Packt,2019 年

  • 《智能的建筑师》,作者马丁·福特,Packt,2018 年

  • 《物联网人工智能食谱》,作者迈克尔·罗沙克,Packt,2021 年

  • 《进阶分析:从 Excel 到 Python 和 R》,作者乔治·芒特,奥莱利媒体,2021 年。

  • 《贝叶斯定理,贝叶斯分析教程导论》,作者詹姆斯·V·斯通,Sebtel 出版社,2013 年

  • 《信息理论:教程导论》,作者詹姆斯·V·斯通,Sebtel 出版社,2015 年

  • 《AI 地图》,作者凯特·克劳福德,耶鲁大学出版社,2021 年

  • 《千个大脑》,作者杰夫·霍金斯,纽约基本书籍,2021 年

  • 《面向程序员的 AI 和机器学习》,作者劳伦斯·莫罗尼,奥莱利,2021 年

  • 《物理学家、工程师和数据科学家的随机矩阵理论初级课程》,作者马克·波特斯和让-菲利普·布沙尔,剑桥大学出版社,2021 年

  • 《高维概率,数据科学应用导论》,作者罗曼·维尔申因,剑桥大学出版社,2018 年

  • 《实用自然语言处理》,作者索米娅·瓦贾拉、博迪萨特瓦·马朱姆德、阿努吉普塔和哈希特·苏拉纳,奥莱利,2020 年

  • 《人工智能:现代方法》,作者斯图尔特·拉塞尔和彼得·诺维格,皮尔逊,2020 年

  • 《实践中的人工智能》,作者伯纳德·马尔,马特·沃德-贡献者,吉尔丹传媒,2019 年

  • 《AI 超级大国》,作者李开复,霍顿米夫林哈考特,2018 年

  • 《自然语言处理实战》,作者霍布森·莱恩、汉内斯·哈普克和科尔·霍华德,曼宁出版社,2019 年

  • 《深度学习https://www.deeplearningbook.org》,作者伊恩·古德费洛、约书亚·本吉奥和亚伦·库尔维尔,麻省理工学院出版社,2016 年。

  • 《数据科学:数据分析、数据挖掘、数据仓库、数据可视化、回归分析、数据库查询、商业大数据和机器学习的终极指南》,作者赫伯特·琼斯,2018 年

  • 《数据驱动科学与工程,机器学习,动力系统与控制》,作者 Steven L. Brunton 和 J. Nathan Kutz,剑桥大学出版社,2019 年

  • 《从零开始的数据科学》,作者 Joel Grus,O’Reilly,2019 年

  • 《每个数据工程师都应该知道的 97 件事》,编辑 Tobias Macey,O’Reilly,2021 年

  • 《现代多元统计技术》,作者 Alan Julian Izenman,斯普林格,2013 年

  • 《严格的概率论第二版》,作者 Jeffrey S. Rosenthal,世界科学出版社,2016 年

  • 《设计数据密集型应用》,作者 Martin Kleppmann,O’Reilly,2017 年

本书中使用的约定

本书中使用以下排版约定:

斜体

指示新术语、URL、电子邮件地址、文件名和文件扩展名。

等宽

用于程序清单,以及段落内引用程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。

等宽粗体

显示用户应按字面输入的命令或其他文本。

等宽斜体

显示应由用户提供值或由上下文确定的值替换的文本。

此元素表示提示或建议。

此元素表示一般说明。

此元素表示警告或注意。

使用代码示例

我们在本书中仅有的一些代码示例可在https://github.com/halanelson/Essential-Math-For-AI下载。

如果您有技术问题或在使用代码示例时遇到问题,请发送电子邮件至bookquestions@oreilly.com

本书旨在帮助您完成工作。一般来说,如果本书提供示例代码,您可以在程序和文档中使用它。除非您复制了代码的大部分,否则无需征得我们的许可。例如,编写一个使用本书中几个代码块的程序不需要许可。出售或分发 O’Reilly 图书中的示例需要许可。引用本书并引用示例代码来回答问题不需要许可。将本书中大量示例代码合并到产品文档中需要许可。

我们感谢但通常不需要署名。署名通常包括标题,作者,出版商和 ISBN。例如:“Essential Math for AI by Hala Nelson (O’Reilly). Copyright 2023 Hala Nelson, 978-1-098-10763-5.”

如果您认为您使用的代码示例超出了合理使用范围或上述给出的许可,请随时与我们联系permissions@oreilly.com

O’Reilly 在线学习

40 多年来,O’Reilly Media提供技术和商业培训,知识和见解,帮助公司取得成功。

我们独特的专家和创新者网络通过书籍、文章和我们的在线学习平台分享他们的知识和专长。O’Reilly 的在线学习平台为您提供按需访问实时培训课程、深入学习路径、交互式编码环境以及来自 O’Reilly 和其他 200 多家出版商的大量文本和视频。有关更多信息,请访问https://oreilly.com

如何联系我们

请将有关本书的评论和问题发送至出版商:

  • O’Reilly Media,Inc.

  • 1005 Gravenstein Highway North

  • Sebastopol, CA 95472

  • 800-998-9938(美国或加拿大)

  • 707-829-0515(国际或本地)

  • 707-829-0104(传真)

我们为本书创建了一个网页,列出勘误、示例和任何其他信息。您可以在https://oreil.ly/essentialMathAI访问此页面。

发送电子邮件至bookquestions@oreilly.com发表评论或提出有关本书的技术问题。

有关我们的书籍和课程的新闻和信息,请访问https://oreilly.com

在 LinkedIn 上找到我们:https://linkedin.com/company/oreilly-media

在 Twitter 上关注我们:https://twitter.com/oreillymedia

在 YouTube 上观看我们:https://www.youtube.com/oreillymedia

致谢

我的父亲尤素夫·赛因,教会了我数学,并始终提醒我:*不要认为我们在这个生活中给你最好的东西是土地或金钱,这些都会来来去去,人类创造金钱,购买资产,创造更多的金钱。我们给你的是大脑,一个非常好的大脑,这才是你真正的资产,所以出去利用它吧。*我爱你的大脑,这本书是为你写的,爸爸。

我的母亲萨米拉·哈姆丹,教会了我英语和哲学,并放弃了一切来确保我们幸福和成功。我用英语写了这本书,而不是我的母语,多亏了你,妈妈。

我的女儿萨瑞,在我最脆弱的时候让我活下来,是我生活的快乐。

我的丈夫基思,他给了我爱、激情和稳定,让我可以做自己,做很多事情,其中一些是不明智的,比如写一本关于数学和人工智能的五百页书。我爱你。

我的妹妹拉莎,她是我的灵魂伴侣。这就是全部。

我的兄弟海瑟姆,违背了我们所有的文化规范和传统来支持我。

我的叔叔奥马尔·赛因,他也教会了我哲学,让我爱上了人类思想的奥秘。

我的朋友莎朗和杰米,让我在他们家写了这本书的大部分内容,并且每次我提出要求时都是很好的编辑。

我一生的朋友奥伦,不仅是任何人都希望拥有的最好的朋友之一,还同意阅读和审阅这本书。

我的朋友阮欢,他的故事应该成为一本书,还抽出时间来阅读和审阅这本书。谢谢你,上将。

我的朋友和同事约翰·韦伯,逐字阅读了每一章,并提供了他宝贵的纯数学观点。

我美妙的朋友黛布、潘卡吉、杰米、塔玛尔、萨吉达、贾米拉、珍、马蒂亚斯和卡伦,你们是我的家人。有你们的生活我很爱。

我的导师罗伯特·科恩(纽约大学)和约翰·斯科特兰(耶鲁大学),我在职业生涯中达到了许多里程碑都要归功于他们。我从你们那里学到了很多。

这本书的审阅者,尽管时间紧张,还是花时间和精力让它变得更好。感谢你们的专业知识,慷慨地给我提供了你们不同领域的独特观点。

彼得的记忆,他的影响是巨大的,将永远激励着我。

世界上许多城市的服务员,容忍我在他们的餐馆里坐着写这本书,写了很多个小时。我从你们那里得到了很多能量和快乐。

我的不可思议、耐心、开朗,总是支持我的编辑安吉拉·鲁菲诺。

第一章:为什么学习人工智能的数学

直到有人说,“这是智能的”,我才停止搜索,开始关注。

人工智能,即 AI,已经出现。它已经渗透到我们生活的多个方面,并越来越多地参与做出非常重要的决策。很快它将被应用到我们社会的每个领域,推动我们大部分日常运营。这项技术发展非常迅速,投资也在飙升。与此同时,我们似乎正处于人工智能的狂热之中。每天我们都听到新的人工智能成就:AI 击败了围棋比赛中最优秀的人类选手。AI 在分类任务中表现优于人类视觉。AI 制作深度伪造视频。AI 生成高能物理数据。AI 解决了模拟世界自然现象的困难偏微分方程。自动驾驶汽车在路上行驶。送货无人机在世界某些地区盘旋。我们还听说了 AI 看似无限的潜力:AI 将彻底改变医疗保健和教育。AI 将消除全球饥饿。AI 将对抗气候变化。AI 将拯救濒危物种。AI 将与疾病作斗争。AI 将优化供应链。AI 将揭示生命的起源。AI 将绘制可观测宇宙。我们的城市和家园将变得智能。最终,我们进入了科幻领域:人类将把他们的大脑上传到计算机中。人类将被 AI增强。最后,恐惧和怀疑的声音出现了:AI 将接管并摧毁人类。

在这种狂热中,现实、猜测、夸大、愿望和纯虚构之间的界限变得模糊,我们首先必须至少在本书的背景下定义人工智能。然后我们将讨论一些它的局限性,它的发展方向,并为当今人工智能中使用的数学做好准备。我希望当你理解数学时,你将能够从一个相对深入的角度来看待这个主题,虚构、现实和介于两者之间的界限将变得更加清晰。你还将学习人工智能中最先进数学的主要思想,为你提供使用、改进甚至创造全新人工智能系统所需的信心。

什么是人工智能?

我还没有找到一个统一的人工智能定义。如果我们问两个人工智能专家,我们会听到两个不同的答案。即使我们在两个不同的日子问同一个专家,他们可能会提出两个不同的定义。这种不一致和似乎无法定义AI的原因是,直到现在还不清楚智能的定义是什么。什么是智能?是什么使我们成为人类和独特的?是什么让我们意识到自己的存在?我们的大脑如何聚集微小的电脉冲并将它们转化为图像、声音、感觉和思想?这些是几个世纪以来一直让哲学家、人类学家和神经科学家着迷的广泛话题。我不打算在这本书中深入探讨这些问题。然而,我将根据 AI 代理来讨论人工智能,并列出本书的以下定义原则。在 2021 年,AI 代理可以是以下一种或多种:

  1. AI 代理可以是纯软件,也可以有一个物理机器人身体。

  2. AI 代理可以针对特定任务,也可以是一个灵活的代理,探索和操纵其环境,无论是否有特定目的都在建立知识。

  3. AI 代理通过经验学习,也就是说,通过更多的练习,它在执行任务时变得更加熟练。

  4. AI 代理感知其环境,然后为这个环境构建、更新和/或演化模型。

  5. AI 代理感知、建模、分析并做出决策,以实现其目标。这个目标可以是预定义和固定的,也可以是随着更多输入而变化的。

  6. AI 代理理解因果关系,并能区分模式和原因。

每当人工智能的数学模型受到我们大脑工作方式的启发时,我会指出这种类比,因此在不必定义任何一种情况下,保持人工智能和人类智能的比较。尽管今天的人工智能与人类智能相去甚远,除了特定任务的人工智能,如图像分类、AlphaGo 等,最近有如此多的人类大脑汇聚在一起发展人工智能,这个领域注定会在未来几年取得突破并发展壮大。

还需要注意的是,有些人将人工智能、机器学习和数据科学这些术语互换使用。这些领域有重叠,但它们并不相同。第四个非常重要但稍微不那么被炒作的领域是机器人技术,其中必须将物理部件和运动技能整合到学习和推理过程中,将机械工程、电气工程、生物工程与信息和计算机工程融合在一起。思考这些领域之间的相互关联的一种快速方法是:数据推动机器学习算法,进而为许多流行的人工智能和/或机器人系统提供动力。本书中的数学对所有四个领域都有用,只是比例不同。

为什么人工智能现在如此受欢迎?

在过去的十年里,人工智能之所以引起全球关注,是因为成功结合了以下因素:

  • 大量数据的生成和数字化,如文本数据、图像、视频、健康记录、电子商务、网络和传感器数据。社交媒体和物联网在这方面发挥了非常重要的作用,不断地传输大量数据。

  • 计算能力的进步,通过并行和分布式计算以及硬件创新,使得能够高效且相对廉价地处理大量复杂的结构化和非结构化数据。

  • 神经网络在理解大数据方面取得了最近的成功,超越了人类在某些任务上的表现,比如图像识别和围棋。2012 年,当AlexNet赢得了ImageNet Large Scale Visual Recognition Challenge时,它激发了对卷积神经网络(由图形处理单元支持)的大量活动,而在 2015 年,PReLU-Net(ResNet)首次在图像分类方面超越了人类。

当我们审视以上观点时,我们意识到今天的人工智能并不同于科幻小说中的人工智能。今天的人工智能以大数据(各种数据)、机器学习算法为中心,并且在很大程度上致力于非常出色地执行一项任务,而不是根据周围环境的响应来发展和适应各种智能类型和目标。

人工智能能做什么?

AI 可以成功应用的领域和行业比适合应对这一不断增长需求的 AI 专家要多得多。人类一直致力于自动化流程,而 AI 正好有望在大规模上实现这一目标。大大小小的公司都有大量的原始数据,他们希望分析并将其转化为利润、最佳策略和资源分配的见解。医疗行业面临着医生严重短缺的问题,而 AI 在那里有无数的应用和无限的潜力。全球金融系统、股票市场和银行业一直严重依赖我们做出良好预测的能力,当这些预测失败时,它们遭受了巨大的损失。随着我们计算能力的不断提高,科学研究取得了显著进展,如今我们正处于 AI 进步的黎明,这种进步使得计算能力达到了几十年前认为不可能的规模。从电网到交通运输再到供应链以及森林和野生动物保护,对于高效的系统和运营需求无处不在,还有对抗世界饥饿、疾病和气候变化。甚至在 AI 本身,人们也在寻求自动化,AI 系统自发地决定最佳的管道、算法和参数,轻松地为给定任务产生期望的结果,从而完全消除了对人类监督的需求。

AI 代理的具体任务

在本书中,当我研究数学时,我将专注于 AI 的流行应用领域,以 AI 代理指定的任务为背景。然而,有益的数学思想和技术很容易在不同的应用领域之间转移。这种看似容易和广泛适用的原因是,我们恰好处于 AI实施的时代,因为解决某些任务的主要思想已经被开发出来,只需稍加调整,它们就可以在各个行业和领域实施。我们的 AI 主题和/或任务包括:

模拟和真实数据

我们的 AI 代理处理数据,提供见解,并基于该数据做出决策。

大脑新皮层

AI 中的神经网络是模仿新皮层或新大脑的。这是我们大脑负责高级功能的部分,如感知、记忆、抽象思维、语言、自愿的身体行动、决策、想象和意识。新皮层有许多层,其中有六层大部分是可区分的。它是灵活的,具有巨大的学习能力。旧大脑爬行动物大脑位于新皮层下方,负责情感以及更基本和原始的生存功能,如呼吸、调节心跳、恐惧、攻击性、性冲动等。旧大脑记录了导致有利或不利感觉的行动和经验,形成了影响我们行为和未来行动的情感记忆。我们的 AI 代理在非常基本的方式上模拟了新皮层,有时也模拟了旧大脑。

计算机视觉

我们的 AI 代理感知并识别其环境。它窥探一切,从我们日常的图片和视频,到我们的 MRI 扫描,一直到遥远星系的图像。

自然语言处理

我们的 AI 代理与其环境进行通信,并自动化繁琐和耗时的任务,如文本摘要、语言翻译、情感分析、文档分类和排名、图像标题和与用户的聊天。

金融系统

我们的 AI 代理检测我们日常交易中的欺诈,评估贷款风险,并提供有关我们财务习惯的 24 小时反馈和见解。

网络和图

我们的 AI 代理处理网络和图数据,如动物社交网络、基础设施网络、专业合作网络、经济网络、交通网络、生物网络等。

社交媒体

我们的 AI 代理要感谢社交媒体提供了学习所需的大量数据。作为回报,我们的 AI 代理试图表征社交媒体用户,识别他们的模式、行为和活跃网络。

供应链

我们的 AI 代理是一个优化专家。它帮助我们预测每个生产链级别的最佳资源需求和分配策略。它还找到了结束世界饥饿的方法。

排程和人员安排

我们的 AI 代理促进了我们的日常运营。

天气预报

我们的 AI 代理解决了天气预报和预测中使用的偏微分方程。

气候变化

我们的 AI 代理试图对抗气候变化。

教育

我们的 AI 代理提供个性化的学习体验。

伦理

我们的 AI 代理致力于公平、公正、包容、透明、无偏见,并保护数据安全和隐私。

AI 的限制是什么?

除了 AI 的令人印象深刻的成就和它在增强或彻底改变整个行业方面的巨大承诺,还有一些真正的限制需要克服。一些最紧迫的限制包括:

  • 当前的 AI 在我们人类认为自己独特聪明的意义上甚至远远不接近智能。尽管 AI 在无数任务中表现优于人类,但它不能自然地切换和适应新任务。例如,一个训练用于识别图像中的人类的 AI 系统不能在不重新训练的情况下识别猫,也不能在不改变其架构和算法的情况下生成文本。在三种类型的 AI 的背景下,到目前为止我们只部分实现了人工狭窄智能,它具有狭窄范围的能力。我们既没有实现人工通用智能,也没有实现比人类更有能力的人工超级智能。此外,今天的机器无法体验任何美丽的人类情感,比如爱、亲近、幸福、自豪、尊严、关怀、悲伤、失落等。模仿情感与体验和真正提供情感是不同的。在这个意义上,机器远远不能取代人类。

  • 大多数流行的 AI 应用需要大量标记数据,例如 MRI 图像可以标记为癌症或非癌症,YouTube 视频可以标记为适合儿童观看或不安全,或者房屋价格可以与房屋区域、卧室数量、家庭收入中位数等特征一起提供-在这种情况下,房屋价格就是标签。限制在于训练系统所需的数据通常不容易获得,获取、标记、维护或存储数据也不便宜。大量数据是机密的、无组织的、无结构的、有偏见的、不完整的和未标记的。获取数据、清理数据、预处理数据和标记数据成为需要大量时间和资源投入的主要障碍。

  • 对于某个 AI 任务,有时会有许多方法或算法来完成它。每个任务、数据集和/或算法都有可以在实施过程中进行调整的参数,称为超参数,并不总是清楚这些超参数的最佳值是什么。可用于解决特定 AI 任务的方法和超参数的多样性意味着不同的方法可能会产生非常不同的结果,人们需要评估依赖哪种方法的决定。在某些应用中,例如为某个客户推荐哪种服装风格,这些差异可能是微不足道的。在其他领域,基于 AI 的决策可能会改变生活:患者被告知他们没有某种疾病,而实际上他们确实患有;一个人被错误地标记为极有可能再次犯罪,并因此被拒绝假释;或者一个合格的人被拒绝贷款。关于如何解决这些问题的研究正在进行中,随着我们在整本书中的进展,我将对这些问题进行更多的扩展。

  • 人类的能力和潜力受限于他们大脑的力量和容量,他们的生物体,地球和宇宙中可利用的资源,他们能够操纵的资源。这些再次受到他们大脑的力量和容量的限制。人工智能系统同样受到支持人工智能软件的系统的计算能力和硬件能力的限制。最近的研究表明,计算密集型的深度学习正接近其计算极限,需要新的想法来提高算法和硬件的效率,或者发现全新的方法。人工智能的进步在很大程度上取决于计算能力的大幅增加。然而,这种能力并不是无限的,对于处理大规模数据集的大型系统来说成本极高,并且具有无法忽视的巨大碳足迹。此外,数据和算法软件并不是孤立存在的。诸如计算机、手机、平板电脑、电池以及存储、传输和处理数据和算法所需的仓库和系统等设备都是由地球上采集的真实物质制成的。地球花了数百万年时间才制造出其中一些材料,而永远维持这些技术所需的无限供应是不存在的。

  • 安全、隐私和对抗性攻击仍然是人工智能的主要关注点,特别是随着互联系统的出现。大量的研究和资源正在被用于解决这些重要问题。由于当前大部分人工智能是软件,大部分数据是数字化的,这一领域的竞争从未停止。这意味着人工智能系统需要不断监控和更新,这需要更多昂贵的人工智能专家,可能会造成成本上的浪费,这反而违背了自动化的初衷。

  • 到目前为止,人工智能研究和实施行业一直把自己视为与其不断发展的技术的经济、社会和安全后果略有关联的。通常,这些人工智能工作的伦理、社会和安全影响被认为是重要的,需要得到关注,但超出了工作本身的范围。随着人工智能的广泛部署,其对社会、市场和潜在威胁的影响越来越强烈地被感知,整个领域必须更加有意识地关注这些至关重要的问题。在这方面,人工智能发展社区在分配资源以解决实施和部署新技术的更广泛影响方面存在局限。

当人工智能系统失败时会发生什么?

了解人工智能的一个非常重要的部分就是了解它的事件和失败。这有助于我们在设计自己的人工智能并将其部署到现实世界之前,预见并避免类似的结果。如果人工智能在部署后失败,后果可能是极其不良的,危险的,甚至是致命的。

一个名为 AI 事故数据库的在线知识库包含了一千多起此类事件。该网站上的例子包括:一辆自动驾驶汽车撞死了行人,自动驾驶汽车与公司服务器失联整整 20 分钟,同时在旧金山街头全部熄火(2022 年 6 月 28 日和 5 月 18 日),一个交易算法导致市场发生“闪崩”,数十亿美元自动在各方之间转移,一个面部识别系统导致一个无辜的人被逮捕,以及微软臭名昭著的聊天机器人 Tay,在发布仅 16 小时后就被关闭,因为它迅速学会并发布了冒犯性、种族主义和极具煽动性的言论。

这些不良结果可以得到缓解,但需要深刻理解这些系统在所有生产层面的工作方式,以及它们被部署的环境和用户。了解人工智能背后的数学是这个辨别过程中的一个至关重要的步骤。

人工智能的前景在哪里?

要能够回答或推测人工智能的前景,最好回顾该领域自诞生以来的最初目标:复制人类智能。这个领域是在五十年代构想出来的。研究该领域在过去七十年的发展可能会告诉我们一些关于其未来方向的信息。此外,研究该领域的历史和趋势使我们能够以鸟瞰的视角看待人工智能,将一切放在背景中并提供更好的视角。这也使得学习人工智能涉及的数学变得不那么令人畏惧。以下是人工智能演变及其最近由于深度学习的令人印象深刻的进展而受到关注的非常简要和非技术性的概述。

  • 起初,人工智能研究试图使用规则和逻辑来模仿智能。当时的想法是,我们只需要向机器输入事实和逻辑推理的规则。学习过程并不受重视。挑战在于,为了获取人类知识,编码人员需要处理太多的规则和约束,这似乎是不可行的。

  • 在 20 世纪 90 年代末和 21 世纪初,各种机器学习方法变得流行。机器学习不是通过编程规则来得出结论和决策,而是从数据中推断规则。机器学习系统处理和处理数据的能力越强,性能就越好。数据和从大量数据中经济高效地处理和学习成为中心目标。那个时期流行的机器学习算法包括支持向量机、贝叶斯网络、进化算法、决策树、随机森林、回归、逻辑回归等。这些算法现在仍然很受欢迎。

  • 2010 年后,特别是在 2012 年,神经网络和深度学习的浪潮席卷而来,之后 AlexNet 的卷积神经网络在图像识别方面取得成功。

  • 最近五年来,强化学习在 DeepMind 的 AlphaGo 击败世界冠军后变得流行,这是一个非常复杂的古老中国游戏。

需要注意的是,前面对历史的描述非常粗糙:回归分析自从 19 世纪初由勒让德和高斯提出以来就一直存在,第一个人工神经元和神经网络是在 20 世纪 40 年代末和 50 年代初由神经生理学家沃伦·麦卡洛克、数学家沃尔特·皮茨、心理学家唐纳德·赫布和弗兰克·罗森布拉特提出的。图灵测试最初被艾伦·图灵引入,他在 1950 年的论文《计算机器械与智能》中提出。图灵提出,如果机器的回答与人类的回答无法区分,那么这台机器就具有人工智能。因此,如果机器能够模仿人类的回答,就被认为具有智能。然而,对于计算机科学领域之外的人来说,图灵测试在定义智能方面似乎有所限制,我想知道图灵测试是否无意中限制了人工智能研究的目标或方向。

尽管机器能够在某些特定任务中模仿人类智能,但复制人类智能的最初目标尚未实现,因此可以安全地假设这是该领域的发展方向,即使这可能涉及重新发现旧观念或发明全新的观念。当前对该领域的投资水平,加上研究和公众兴趣的激增,必将产生新的突破。然而,最近人工智能进展带来的突破已经在整个行业中引起了革命,这些行业急于实施这些技术。这些当代人工智能进展涉及许多重要的数学内容,我们将在本书中进行探讨。

目前谁是人工智能领域的主要贡献者?

主要的人工智能竞争者是美国、欧洲和中国。一些世界领先的科技公司包括谷歌及其母公司 Alphabet、亚马逊、Facebook、微软、英伟达和 IBM 在美国,DeepMind 在英国和美国(由 Alphabet 拥有),百度和腾讯在中国。学术界也有许多重要的贡献者,但这些太多了无法一一列举。如果您是该领域的新手,了解这些大公司的名称、历史和贡献以及它们目前正在追求的目标是很有价值的。了解他们的工作是否存在争议也是有价值的。这些一般知识在您在人工智能领域中获得更多经验时会派上用场。

在人工智能中通常涉及哪些数学?

问题:当我说数学这个词时,您会想到哪些主题和学科?

无论您是数学专家还是初学者,您所想到的数学主题很可能涉及人工智能。以下是一个常用的最有用的数学学科列表,用于人工智能实施,但您不需要成为所有这些领域的专家才能在人工智能领域取得成功。您所需要的是对以下数学学科中的某些有用主题有深入的理解:微积分、线性代数、优化、概率和统计学。根据您的特定应用领域,您可能需要来自以下数学学科的特殊主题:随机矩阵理论、图论、博弈论、微分方程和运筹学。

在本书中,我们将在不提供每个主题的教科书的情况下讨论上述主题。人工智能应用和实施是这些不同且密切相互作用的数学主题的统一主题。采用这种方法,我可能会冒犯一些数学专家,简化许多技术定义或省略整个定理和细节,我也可能会冒犯人工智能或专业行业专家,再次省略某些应用和实施中涉及的细节。然而,目标是保持本书简单易读,同时涵盖大部分对人工智能应用重要的数学主题。有兴趣的读者可以深入研究数学或人工智能领域,然后阅读更深入的关于他们感兴趣的特定领域的书籍。我希望本书是一个简洁的总结和全面的概述,因此读者可以自信地进入他们感兴趣的任何人工智能数学领域或人工智能应用领域。

总结和展望

人类智能表现在感知、视觉、通过自然语言进行交流、推理、决策、合作、共情、对周围环境进行建模和操纵、技能和知识在人群和世代之间的传递,以及将天生和学到的技能推广到新的和未知的领域。人工智能渴望复制人类智能的所有方面。在目前的状态下,人工智能一次只能处理一种或少数几种智能方面。即使有这种局限性,人工智能已经能够完成令人印象深刻的壮举,比如对蛋白质折叠进行建模和预测蛋白质结构,这些是生命的基本组成部分。这一人工智能应用(众多应用之一)对于理解生命的本质和对抗各种疾病的意义是无限的。

当你进入人工智能领域时,重要的是要注意你正在开发或使用智能的哪个方面。是感知?视觉?自然语言?导航?控制?推理?然后自然而然地会知道要关注哪些数学,以及为什么,因为你已经知道自己在人工智能领域的哪个方面。然后就会很容易关注社区开发该特定人工智能方面所使用的数学方法和工具。本书的方法也类似:首先是人工智能类型和应用,然后是数学。

在本章中,我们讨论了一般性问题,比如:什么是人工智能?人工智能能做什么?人工智能的局限性是什么?人工智能的发展方向是什么?人工智能是如何工作的?我们还简要调查了重要的人工智能应用、公司在尝试将人工智能整合到其系统中时通常遇到的问题、系统实施不良时发生的事件,以及通常需要用于人工智能实施的数学学科。

在下一章中,我们将深入探讨数据,并确认其与人工智能的密切关系。当我们谈论数据时,我们也谈论数据分布,这直接将我们带入了概率论和统计学。

第二章:数据,数据,数据

也许如果我知道一切的来龙去脉,我就会知道一切的发展方向和原因。

数据是大多数 AI 系统的动力源。在本章中,我们将了解数据以及设计从数据中提取有用和可操作信息的方法,这是感知 AI 的核心。

感知 AI基于从数据中进行统计学习,其中 AI 代理或机器从其环境中感知数据,然后检测数据中的模式,使其能够得出结论和/或做出决策。

感知 AI 不同于其他三种类型的 AI:

  1. 理解 AI,AI 系统理解将图像分类为椅子意味着它可以用来坐,将图像分类为癌症意味着人生病需要进一步的医疗关注,或者它读过的线性代数教科书可以用来从数据中提取有用的信息。

  2. 控制 AI,涉及控制 AI 代理的物理部分,以便在空间中导航,打开门,倒咖啡等。机器人在这个领域取得了重大进展。我们需要用包括感知 AI 和理解 AI 的大脑来增强机器人,并将其连接到控制 AI。理想情况下,像人类一样,控制 AI 然后从其与环境的物理交互中学习,通过将该信息传递给其感知和理解系统,然后将控制命令传递给代理的控制系统。

  3. 意识 AI,其中 AI 代理具有类似于人类经历的内在体验。由于我们还不知道如何在数学上定义意识,因此在本书中我们根本不讨论这个概念。

理想情况下,真正类似于人类的智能结合了上述四个方面:感知,理解,控制和意识。本章和接下来的几章的主要重点是感知 AI。AI 和数据已经紧密结合,以至于现在常见的,尽管错误的,是将数据科学和 AI 视为同义词。

AI 的数据

在许多流行的机器学习模型的核心,包括自 2012 年 AlexNet 以来重新引起人们关注的高度成功的神经网络,存在一个非常简单的数学问题:

将给定的数据点拟合到适当的函数中(将输入映射到输出),从数据中捕捉重要信号并忽略噪音,然后确保该函数在新数据上表现良好。

然而,复杂性和挑战来自各种来源。

假设和特征

生成数据的真实函数以及它实际依赖的所有特征都是未知的。我们只是观察数据,然后尝试估计生成它的假设函数。我们的函数试图学习数据中哪些特征对我们的预测、分类、决策或一般目的很重要。它还学习这些特征如何相互作用以产生观察到的结果。在这种情况下,人工智能的一个巨大潜力是它能够捕捉到人类通常不会注意到的数据特征之间的微妙相互作用,因为我们非常擅长观察强特征,但忽略更微妙的特征。例如,我们作为人类可以知道一个人的月收入影响他们偿还贷款的能力,但我们可能不会观察到他们的日常通勤或早晨例行公事对此也可能有非常重要的影响。一些特征之间的相互作用比其他的简单得多,比如线性相互作用。其他的则更复杂,是非线性的。从数学角度来看,无论我们的特征相互作用是简单的(线性)还是复杂的(非线性),我们的目标仍然是相同的:找到一个适合你的数据并能够在新数据上做出良好预测的假设函数。这里还有一个额外的复杂性:有许多假设函数可以拟合相同的数据集,我们如何知道选择哪一个?

性能

即使计算出一个适合我们数据的假设函数,我们如何知道它在新的未知数据上表现良好呢?我们如何知道选择哪种性能度量,并且在部署到真实世界后如何监控这种性能?真实世界的数据和场景并不都带有地面真相的标签,所以我们不能轻易衡量我们的人工智能系统是否表现良好并做出正确或适当的预测和决策。我们不知道如何衡量人工智能系统的结果。如果真实世界的数据和场景都带有地面真相的标签,那么我们都会失业,因为我们会知道在每种情况下该做什么,地球上会和平,我们会幸福地生活下去(实际上并非如此,我希望事情能够如此简单)。

数量

人工智能领域几乎所有的东西都是非常高维的!数据实例的数量、观察到的特征以及需要计算的未知权重可能都在百万级别,所需的计算步骤则在十亿级别。在这样大量数据上的高效存储、传输、探索、预处理、结构化和计算成为中心目标。此外,探索涉及高维数学函数的景观是一项非常艰巨的任务。

结构

现代世界创造的绝大部分数据都是非结构化的。它不是以易于查询的表格形式组织的,其中包含有标记的字段,比如姓名,电话号码,性别,年龄,邮政编码,房价,收入水平,等等。非结构化数据无处不在:社交媒体上的帖子,用户活动,文字文档,PDF 文件,图像,音频和视频文件,协作软件数据,交通,地震和天气数据,GPS,军事行动,电子邮件,即时通讯软件,移动聊天数据等等。其中一些例子,比如电子邮件数据,可以被视为半结构化的,因为电子邮件带有包括邮件元数据的标题:发件人,收件人,日期,时间,主题,内容类型,垃圾邮件状态,等等。此外,大量重要数据并不以数字格式可用,并且分散在多个不相互通信的数据库中。这里的例子包括历史军事数据,博物馆和医院记录。目前,我们正努力将我们的世界和城市数字化,以利用更多的人工智能应用。总的来说,从结构化和标记的数据中获得见解比从非结构化数据中获得见解更容易。挖掘非结构化数据需要创新技术,这些技术目前是数据科学,机器学习和人工智能领域的推动力。

真实数据*vs.*模拟数据

当我们处理数据时,非常重要的是要知道真实数据和模拟数据之间的区别。这两种类型的数据对于人类的发现和进步都非常宝贵。

真实数据

这些数据是通过真实世界观察收集的,使用测量设备,传感器,调查,结构化表格(如医学问卷),望远镜,成像设备,网站,股票市场,受控实验,等等。这些数据通常是不完美和嘈杂的,因为测量方法和仪器的不准确性和故障。从数学上讲,我们不知道生成真实数据的确切函数或概率分布,但我们可以使用模型,理论和模拟来假设它们。然后我们可以测试我们的模型,最终使用它们进行预测。

模拟数据

这是使用已知函数生成的数据,或者从已知概率分布中随机抽样得到的数据。在这里,我们有我们已知的数学函数(们),或者模型,我们将数值代入模型中以生成我们的数据点。例子很多:数值解决了模拟各种自然现象的偏微分方程,涵盖了各种规模,比如湍流流动,蛋白质折叠,热扩散,化学反应,行星运动,断裂材料,交通,甚至迪士尼电影动画(《冰雪奇缘》,《海洋奇缘》,等等)。

在本章中,我们提供了两个关于人类身高和体重数据的例子,以演示真实数据和模拟数据之间的区别。在第一个例子中,我们访问一个在线公共数据库,然后下载并探索两个包含真实个体身高和体重测量的真实数据集。在第二个例子中,我们根据我们假设的函数模拟了自己的身高和体重数据集:我们假设一个人的体重在数值上取决于他们的身高,这意味着当我们将体重数据与身高数据绘制在一起时,我们期望看到一个直线或平坦的视觉模式。

数学模型:线性*vs.*非线性

线性依赖模拟了世界上的平坦,比如一维直线、二维平面(称为平面)和更高维的超平面。线性函数的图形,它模拟了线性依赖,永远是平的,不会弯曲。每当你看到一个平的物体,比如桌子、杆、天花板,或者一堆数据点聚集在一条直线或一个平面周围,知道它们代表的函数是线性的。除了平的东西是非线性的,所以图形弯曲的函数是非线性的,而聚集在弯曲曲线或曲面周围的数据点必须是由非线性函数生成的。

线性函数的公式,代表了函数输出对特征变量的线性依赖,非常容易写下来。这些特征在公式中只是它们自己,没有幂或根,并且没有嵌入在任何其他函数中,比如分数的分母、正弦、余弦、指数、对数或其他微积分函数。它们只能被标量(实数或复数,而不是向量或矩阵)相乘,并且可以相互加减。例如,一个依赖于三个特征<x 1,x 2>和<x 3>的线性函数可以写成:

f ( x 1 , x 2 , x 3 ) = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 ,

其中参数ω 0 , ω 1 , ω 2和ω 3是标量数。这些参数,或权重ω 1 , ω 2和ω 3 线性组合特征,并在添加偏置项ω 0后产生f ( x 1 , x 2 , x 3 )的结果。换句话说,结果是由特征之间的线性相互作用x 1 , x 2和x 3以及偏置产生的。

非线性函数的公式,表示函数输出对特征的非线性依赖,也很容易识别:一个或多个特征以非一次幂出现在函数公式中,或者与其他特征相乘或相除,或者嵌入在其他微积分函数中,如正弦、余弦、指数、对数等。以下是三个关于三个特征 x1,x2 和 x3 非线性依赖的函数的例子:

1 。 f ( x 1 , x 2 , x 3 ) = ω 0 + ω 1 x 1 + ω 2 x 2 x 3 。2 。 f ( x 1 , x 2 , x 3 ) = ω 0 + ω 1 x 1 2 + ω 2 x 2 2 + ω 3 x 3 2 。3 。 f ( x 1 , x 2 , x 3 ) = ω 1 e x 1 + ω 2 e x 2 + ω 3 cos ( x 3 ) 。

正如您所看到的,我们可以提出各种各样的非线性函数,以及与非线性交互相关的可能性是无限的。事实上,神经网络之所以成功,是因为它们能够捕捉数据特征之间的相关非线性交互。

我们将在整本书中使用上述符号和术语,因此您将非常熟悉线性组合、权重、特征以及特征之间的线性和非线性交互等术语。

一个真实数据的例子

您可以在第二章的链接 Jupyter 笔记本中找到调查数据并生成图表的 Python 代码的两个示例。

注意:结构化数据

我们将在这里使用的身高、体重和性别的两个数据集是结构化数据集的示例。它们以行和列的形式组织。列包含特征,如体重、身高、性别、健康指数,等等。行包含每个数据实例的特征分数,也就是每个人的情况。另一方面,一堆音频文件、Facebook 帖子、图像或视频都是非结构化数据集的示例。

我从数据科学家的Kaggle 网站下载了两个数据集。这两个数据集都包含了一定数量的个体的身高、体重和性别信息。我的目标是了解一个人的体重如何取决于他们的身高。从数学上讲,我想要写出一个公式,将体重作为一个特征,即身高的函数:

数学符号“美元符号重量等于 f 左括号高度右括号逗号美元符号”

因此,如果我得到一个人的身高,我将能够预测他们的体重。当然,人的体重除了身高之外还取决于其他特征,比如他们的性别、饮食习惯、锻炼习惯、遗传倾向,等等。但是,对于我下载的数据集,我们只有身高、体重和性别数据可用。除非我们想要寻找更详细的数据集,或者出去收集新数据,我们必须使用我们手头的数据。此外,这个例子的目标只是为了说明真实数据和模拟数据之间的差异。当我们有更深入的目标时,我们将使用更多特征的更复杂的数据集。

对于第一个数据集,我在图 2-1 中绘制了体重列与身高列,得到了似乎完全没有模式的结果!

250

图 2-1。当绘制第一个数据集的体重与身高时,我们无法检测到模式。散点图上方和右侧的图显示了身高和体重数据的直方图和经验分布。

对于第二个数据集,我做了同样的事情,我可以在图 2-2 中明显观察到线性依赖。数据点似乎聚集在一条直线周围!

250

图 2-2。当绘制第二个数据集的体重与身高时,我们观察到线性模式。请注意,体重数据的经验分布绘制在图的右侧,身高数据的经验分布绘制在图的顶部。两者似乎都有两个峰值(双峰),表明存在混合分布。实际上,身高和体重数据集都可以使用两个正态分布的混合来建模,称为高斯混合,代表混合男性和女性数据的基础分布。因此,如果我们单独绘制女性或男性亚群的数据,就像图 2-6 中那样,我们会观察到身高和体重数据呈正态分布(钟形)。

发生了什么?为什么我的第一个真实数据集完全没有反映出人的身高和体重之间的任何依赖关系,但我的第二个数据集反映出了线性依赖?我们需要深入研究数据。

这是处理真实数据时面临的许多挑战之一。我们不知道是什么函数生成了数据,以及为什么数据看起来是这个样子。我们调查、获得洞察力、检测模式(如果有的话),并提出一个假设函数。然后我们测试我们的假设,如果根据我们的性能指标表现良好,我们就将其部署到现实世界中。我们使用我们部署的模型进行预测,直到新数据告诉我们我们的假设不再有效为止,在这种情况下,我们调查更新的数据,并提出一个新的假设。只要我们的模型在运行,这个过程和反馈循环就会继续下去。

在转向模拟数据之前,让我们解释一下为什么第一个数据集似乎对个体的身高和体重之间的关系没有任何见解。经过进一步检查,我们注意到数据集中有过多指数分数为 4 和 5 的个体,指的是肥胖和极度肥胖。因此,我决定按指数分数拆分数据,并为所有具有相似指数分数的个体绘制体重与身高的图。这一次,在图 2-3 中明显地显示了身高和体重之间的线性依赖关系,谜团得到了解决。这可能会让人觉得我们在通过个体的指数分数进行条件处理来获得线性关系,但在数据探索的名义下,一切都是公平竞争。

250

图 2-3。当为第一个数据集中具有相似指数分数的个体绘制体重与身高时,我们观察到了线性模式。这张图显示了指数分数为 3 的个体的体重与身高。

现在我们可以放心地假设体重是线性依赖于身高的:

w e i g h t = ω 0 + ω 1 × h e i g h t .

当然,我们还需要找到参数ω 0和ω 1的适当值。下一章将教会我们如何做到这一点。事实上,机器学习,包括深度学习,的大部分活动都是关于从数据中学习这些ω。在我们非常简单的例子中,我们只需要学习两个ω,因为我们只有一个特征,身高,并且在观察到真实数据中的线性模式后,我们假设了线性依赖关系。在接下来的几章中,我们将遇到一些有数百万个ω需要学习的深度学习网络,然而,我们将看到问题的数学结构实际上与我们将在第三章中学到的完全相同的结构。

模拟数据的一个例子

在这个例子中,我模拟了自己的身高-体重数据集。模拟我们自己的数据可以避免在网上搜索数据、现实世界中寻找数据,甚至建立实验室以获得受控的测量数据的麻烦。当所需数据不可用或非常昂贵时,这是非常有价值的。它还可以通过只改变函数中的数字来测试不同的场景,而不是创建新材料、建立实验室并进行新实验。模拟数据非常方便,因为我们只需要一个数学函数,如果我们想要涉及随机性和/或噪声,还需要一个概率分布,以及一台计算机。

让我们再次假设身高和体重之间存在线性依赖关系,因此我们将使用的函数是:

w e i g h t = ω 0 + ω 1 × h e i g h t .

为了能够模拟数值( h e i g h t , w e i g h t )对,或者数据点,我们必须假设参数ω 0和ω 1的数值。在没有来自真实数据的见解来选择这些ω的正确值时,我们只能根据问题的背景做出合理的猜测并尝试不同的数值。请注意,在本例中的身高体重情况下,我们碰巧有真实数据可以用来学习ω的适当值,第三章的一个目标就是学习如何做到这一点。然而,在许多其他情况下,我们没有真实数据,所以唯一的方法就是尝试不同的ω的数值。

在以下模拟中,我们设置ω 0 = - 314 . 5和ω 1 = 7 . 07,所以函数变为:

w e i g h t = - 314 . 5 + 7 . 07 × h e i g h t .

现在我们可以生成尽可能多的数值( h e i g h t , w e i g h t )对,我们想要。例如,将h e i g h t = 60插入重量函数的公式中,我们得到w e i g h t = - 314 . 5 + 7 . 07 × 60 = 109 . 7。因此,我们的线性模型预测,身高为 60 英寸的人体重为109 . 7磅,我们可以在身高体重图上绘制的数据点的坐标为( 60 , 109 . 7 )。在图 2-4 中,我们生成了 5000 个这些数据点:我们选择了身高在 54 至 79 英寸之间的 5000 个值,并将它们代入重量函数。我们注意到图 2-4 中的图是一条完美的直线,模拟数据中没有噪音或变化,因为我们没有将这些因素纳入我们的线性模型中。这是模拟数据的特点:它做了生成它的函数所做的事情。如果我们了解我们用来构建模拟的函数(称为模型)以及我们的计算没有积累太多的数值误差和/或非常大的数值,那么我们就了解了我们的模型生成的数据,并且我们可以以任何我们认为合适的方式使用这些数据。这里没有太多的惊喜。在我们的例子中,我们提出的函数是线性的,因此它的方程式是一条直线的方程式,正如你在图 2-4 中看到的,生成的数据完全位于这条直线上。

200

图 2-4。模拟数据:我们使用线性函数w e i g h t = - 314 . 5 + 7 . 07 × h e i g h t生成了五千个(身高,体重)点。

如果我们想要模拟更真实的身高和体重数据呢?那么我们可以从更真实的人类身高分布中对身高值进行抽样:钟形正态分布!同样,我们知道我们正在抽样的概率分布,这与真实数据的情况不同。在我们抽样身高值之后,我们将其代入体重的线性模型中,然后添加一些噪音,因为我们希望我们的模拟数据更加真实。由于噪音具有随机性质,因此我们还必须选择它将从哪个概率分布中抽样。我们再次选择钟形正态分布,但我们也可以选择均匀分布来模拟均匀的随机波动。我们更真实的身高体重模型变为:

w e i g h t = - 314 . 5 + 7 . 07 × h e i g h t + n o i s e .

我们获得图 2-5。

200

图 2-5。模拟数据:我们使用线性函数w e i g h t = - 314 . 5 + 7 . 07 × h e i g h t生成了五千个(身高,体重)点。身高点是正态分布的,我们也添加了正态分布的噪声。请注意图的右侧和顶部分别的体重和身高数据的分布都是正态分布的。这并不奇怪,因为我们在模拟中就是这样设计的。

现在比较包含我们模拟的身高体重数据的图 2-5 和包含来自我们使用的第二个 Kaggle 数据集中 5000 名女性真实身高体重数据的图 2-6。考虑到只花了五分钟的代码编写来生成这些数据,情况还不错,而不是收集真实数据!如果我们花更多时间调整我们的ω的值,以及我们添加的正态分布噪声的参数(均值和标准差),我们将获得一个看起来更好的模拟数据集。然而,我们将在这里结束这个模拟,因为很快我们的整个重点将是学习我们假设模型的适当参数值。

200

图 2-6。真实数据:第二个 Kaggle 数据集中 5000 名女性的体重数据与身高数据的图。请注意图的右侧和顶部分别的女性体重和身高数据的分布都是正态分布的。请查看链接的 Jupyter 笔记本以获取更多详细信息。

数学模型:模拟和人工智能

我们总是可以调整我们的数学模型使其更加现实。我们是设计者,所以我们决定这些模型中包含什么。通常情况下,模型越接近自然,其中包含的数学对象就越多。因此,在构建数学模型时,通常需要在接近现实和模型的简单性以及数学分析和计算的可访问性之间进行权衡。不同的设计者提出不同的数学模型,有些模型比其他模型更好地捕捉了某些现象。随着捕捉自然行为的探索不断进行,这些模型不断改进和演变。值得庆幸的是,过去几十年中我们的计算能力已经大大提高,使我们能够创建和测试更复杂和更现实的数学模型。

自然同时非常细致和巨大。自然界的相互作用范围从亚原子量子领域一直到星系间的相互作用。我们作为人类,永远试图理解自然,并捕捉其复杂的组成部分及其众多的相互联系和相互作用。我们这样做的原因是多种多样的。它们从对生命和宇宙起源的纯好奇,到创造新技术,增强通信系统,设计药物和发现治疗方法,建造武器和防御系统,到未来可能前往遥远行星并在那里居住。数学模型以仅仅使用数字、函数、方程式来描述自然的所有细节的方式,以及在面对不确定性时通过概率引入量化的随机性,提供了一种极好而几乎奇迹般的方式。这些数学模型的计算机模拟使我们能够研究和可视化所建模系统或现象的各种简单和复杂行为。反过来,来自计算机模拟的见解有助于模型的增强和设计,除了提供更深入的数学见解。这种令人难以置信的积极反馈循环使数学建模和模拟成为一种不可或缺的工具,而我们的计算能力的增强使其得到了极大的增强。

宇宙的奥秘在于,它的各种现象可以用数学的抽象语言准确地建模,而人类的头脑之所以了解和理解数学,并构建强大的技术设备,对各种应用都有用,这也是一个奇迹。同样令人印象深刻的是,这些设备在其核心上所做的无非是计算或传输数学,更具体地说,就是一堆零和一。

人类能够将对简单数字的理解推广到建立和应用各种规模的自然现象的数学模型,这是学习知识的泛化的一个壮观例子,也是人类智慧的标志。在人工智能领域,通用人工智能(类似人类)和狭义人工智能(特定任务导向)的一个共同目标是泛化:人工智能代理能够将学到的能力推广到新的和未知的情况。在下一章中,我们将了解狭义和任务导向人工智能的这一原则:人工智能代理从数据中学习,然后为新的和未见过的数据产生良好的预测

人工智能以三种方式与数学模型和模拟进行交互:

  1. 数学模型和模拟产生数据,供人工智能系统进行训练:自动驾驶汽车被一些人认为是人工智能的一个基准。让智能汽车原型车在没有人工智能系统学会这些不利事件必须避免之前,开车冲下悬崖,撞到行人,或者撞上新的工作区域,这将是不方便的。在这里,模拟数据的训练尤其有价值,因为模拟可以为汽车创造各种危险的虚拟情况,供其在上路之前进行训练。同样,模拟数据对于火星车、药物发现、材料设计、天气预报、航空、军事训练等人工智能系统的训练非常有帮助。

  2. 人工智能增强了现有的数学模型和模拟:人工智能在传统上对数学模型和模拟困难和限制的领域有很大潜力,例如学习模型中涉及的参数的适当值、适当的概率分布、在离散化方程时的网格形状和大小(细网格捕捉各种空间和时间尺度上的细节和微妙行为),以及将计算方法扩展到更长的时间或具有复杂形状的更大领域。诸如导航、航空、金融、材料科学、流体动力学、运筹学、分子和核科学、大气和海洋科学、天体物理学、物理和网络安全等领域都严重依赖数学建模和模拟。将人工智能能力整合到这些领域正在开始,并取得了非常积极的成果。在本书的后面章节中,我们将遇到人工智能增强模拟的例子。

  3. 人工智能本身是一个数学模型和模拟:人工智能的一个重要愿景是通过计算来复制人类智能。成功的机器学习系统,包括神经网络及其所有架构和变体,都是旨在模拟人类智能相关任务的数学模型,如视觉、模式识别和泛化、自然语言交流和逻辑推理。理解、情感体验、共情和合作也与智能相关,并且对人类的成功和统治做出了巨大贡献,因此如果我们想实现通用人工智能并同时更深入地了解智能的本质和人脑的运作,我们也必须找到复制它们的方法。在这些领域的努力已经在进行中。我们要记住的是,在所有这些领域,机器所做的是计算:机器计算自然语言处理文档的含义,组合和计算计算机视觉的数字图像像素,将音频信号转换为数字向量并计算人机交互的新音频,等等。因此很容易看出,软件人工智能是一个大型数学模型和模拟。随着我们在本书中的进展,这一点将变得更加明显。

我们的数据从哪里获取?

当我决定进入人工智能领域时,我想要运用我的数学知识来帮助解决我热衷的现实世界问题。我在战争中长大,看到许多问题的爆发、破坏,然后最终消散或得到解决,要么通过直接修复,要么通过人类网络的调整并最终稳定在全新的(不稳定的)平衡状态。战争中常见的问题包括对不同供应链的突然和大规模破坏,大部分电网的突然毁坏,通过有针对性的炸桥导致整个道路网络的突然瘫痪,恐怖网络的突然出现,黑市、贩卖、通货膨胀和贫困的突然出现。数学在这些情况下可以帮助解决的问题数量是无限的,包括战争战术和战略。在美国的安全环境下,我拥有数学博士学位,并在大学任教,我开始接触公司、政府机构和军方,寻找真实的项目和真实的数据来进行研究。我提出免费帮助他们解决问题。我不知道的是,我以艰难的方式学到的,获取真实数据是最大的障碍。有许多法规、隐私问题、机构审查委员会和其他障碍阻碍着我们。即使跳过了所有这些障碍,公司、机构和组织也倾向于保留他们的数据,即使他们知道他们没有充分利用它,我们几乎不得不乞求才能获取真实数据。结果证明,我遇到的经历并不是独一无二的。同样的事情也发生在这个领域的许多其他人身上。

以上故事并不是要阻止你获取训练 AI 系统所需的真实数据。重点不是要让你在遇到数据所有者的犹豫和抵抗时感到惊讶和沮丧。继续询问,总会有人愿意冒险一试。

有时你需要的数据可以在网上公开获取。在本章中,我使用了Kaggle网站的数据集来构建简单的模型。还有其他很棒的公共数据存储库,我就不一一列举了,但是简单的谷歌搜索关键词“最佳数据存储库”会返回出色的结果。一些存储库专门用于计算机视觉,其他用于自然语言处理、音频生成和转录、科学研究等等。

在网上获取数据是常见的,但你必须遵守你爬取的网站的规则。你还必须学会如何爬取(有人说数据科学家和统计学家的区别在于数据科学家知道如何“黑客”!)。有些网站要求你在爬取之前获得书面许可。例如,如果你对社交媒体用户行为或合作网络感兴趣,你可以爬取社交媒体和专业网络:Facebook、Instagram、YouTube、Flickr、LinkedIn 等等,以获取用户账户的统计数据,比如他们的朋友或联系人数量,点赞、评论以及他们在这些网站上的活动。你最终会得到包含数十万条记录的非常庞大的数据集,然后你可以进行计算。

为了直观地了解数据如何集成到人工智能中,以及进入各种系统的数据类型,同时避免被所有信息和数据所压倒,有益的是养成一个习惯,即探索成功的人工智能系统所训练的数据集,如果可以的话。你不必下载并处理这些数据。浏览数据集、其元数据、特征和标签(如果有的话)等就足以让你对数据感到舒适。例如,DeepMind 的WaveNet(2016)是一个神经网络,可以生成真实的人声或愉悦的音乐。它可以完成文本到音频的转换,甚至可以模仿特定人的声音。我们将在第七章学习 WaveNet 时了解条件的数学含义。现在,可以将其视为对问题施加的人为限制,以将结果限制在一定的结果集中。那么 WaveNet 是在哪些数据上训练的呢?对于不受文本条件限制的多说话者音频生成,WaveNet 是在包含来自 109 位不同说话者的 44 小时音频的数据集上进行训练的:英语多说话者语料库来自 CSTR Voice Cloning Toolkit(2012)。对于文本转语音,WaveNet 是在包含 24 小时语音数据的北美英语数据集和包含 34.8 小时语音数据的中文数据集上进行训练的。对于生成音乐,WaveNet 是在包含来自 YouTube 视频的 60 小时独奏钢琴音乐的数据集和包含约 200 小时音乐音频的MagnaTagATune 数据集(2009)上进行训练的。标记数据对于人工智能系统非常有价值,因为它提供了一个基准来衡量你的假设函数的输出。我们将在接下来的几节中学习这一点。

那么著名的图像分类(用于计算机视觉)AlexNet(2012)呢?它的卷积神经网络是在哪些数据上进行训练和测试的?AlexNet 是在包含数百万图像(从互联网上获取)并标记了数千个类别的ImageNet数据集上进行训练的。

请注意,上述示例都是关于非结构化数据的示例。

如果某个系统所训练的数据不是公开可用的,最好查阅该系统的发表论文或文档,并了解所需数据是如何获取的。这本身就会让你学到很多。

在继续进行数学之前,请记住以下要点:

  1. 人工智能系统需要数字数据。

  2. 有时,你需要的数据并不容易获取。

  3. 有一个数字化我们整个世界的运动。

数据分布、概率和统计的词汇

当你进入一个新的领域时,你想要学习的第一件事是该领域的词汇。这类似于学习一门新语言。你可以在课堂上学习,然后受苦,或者你可以去一个说这种语言的国家,听频繁使用的术语。你不必知道法语中的“Bonjour”是什么意思。但当你在法国时,你会注意到人们经常互相说这个词,所以你也开始说。有时候你可能不会在正确的上下文中使用它,比如当你必须说“Bonsoir”而不是“Bonjour”。但慢慢地,当你发现自己在法国呆得越来越久时,你会在正确的上下文中使用正确的词汇。

尽快学习词汇的另一个优势是,不一定要掌握任何细节,因为不同领域用不同的术语指代相同的概念,因此存在大量的词汇冲突。这最终成为混淆的一个重要来源,因此体现了语言障碍。当你学习该领域的常用词汇时,你会意识到你可能已经了解这些概念,只是现在你有了新的名称。

你想要了解的概率和统计学的词汇术语并不多。我会在我们使用它时定义每个术语,但请注意,概率论的目标是对随机或随机数量和事件做出确定性的陈述,因为人类讨厌不确定性,喜欢他们的世界是可控和可预测的。当你阅读有关人工智能、机器学习或数据科学的内容时,留意以下来自概率和统计领域的语言。再次强调,你不必立刻了解任何定义,你只需要听到以下术语,并熟悉它们在彼此之后的进展方式:

  • 一切都始于随机变量。数学家们不停地谈论函数。函数有确定的结果。当你评估一个函数时,你知道它将返回什么值:在 3 处评估函数x 2,你可以肯定会得到3 2 = 9。另一方面,随机变量没有确定的结果。它们的结果是不确定的、不可预测的或随机的。当你调用一个随机变量时,你在实际看到结果之前不知道它将返回什么值。由于你不再能够追求确定性,你可以追求的是量化得到某个结果的可能性有多大。例如,当你掷骰子时,你可以自信地说你得到 4 的机会是 1/6,假设你掷的骰子没有被篡改。你在实际掷骰子之前永远不知道你会得到什么结果。如果知道的话,赌场就会破产,金融部门就会取消其整个预测分析和风险管理部门。就像确定性函数一样,随机变量可以返回离散集合的结果(离散随机变量)或连续集合的结果(连续随机变量)。随机变量和函数之间的关键区别在于结果的随机性*vs.*确定性。

  • 在随机变量之后,我们为连续随机变量定义概率密度函数,为离散随机变量定义概率质量函数。我们都称之为分布,以增加我们的困惑。通常,一个分布代表离散还是连续随机变量是从上下文中理解的。使用这个术语,我们有时会说一个随机变量,无论是连续还是离散的,是从一个概率分布中抽样,多个随机变量是从一个联合概率分布中抽样。在实践中,我们很少知道我们数据中涉及的所有随机变量的完整联合概率分布。当我们知道,或者我们能够学习它时,这是一件强大的事情。

  • 边际概率分布就像坐落在联合概率分布的边缘上(如果我们用包含所涉变量所有组合状态的概率的表来表示联合概率分布,例如此维基百科页面上的第一个表)。在这种情况下,你很幸运能够访问多个随机变量的完整联合概率分布,并且你有兴趣找出其中一个或几个的概率分布。你可以使用概率的求和规则轻松地找到这些边际概率分布,例如:

p ( x ) = ∑ y∈allstatesofy p ( x , y )

  • 均匀分布正态分布是最受欢迎的连续分布,因此我们从它们开始。正态分布和概率论中的基本中心极限定理密切相关。在我们的数据中涉及的许多其他有用分布代表不同的随机变量,但我们不需要立即使用它们,所以我们推迟到需要使用它们时再讨论。

  • 一旦我们开始处理多个随机变量(例如我们的性别、身高、体重和健康指数数据),这几乎总是情况,我们引入条件概率贝叶斯定理或定理和条件概率的乘积或链规则

  • 还有独立和条件独立的随机变量的概念(知道一个变量的值不会改变另一个变量的概率)。

  • 条件概率和联合分布都涉及多个随机变量,因此它们之间有某种联系是有意义的:切割联合概率分布的图表(当我们固定一个变量的值时),我们得到一个条件概率分布(见图 _slice_joint)。

非常重要的一点:贝叶斯定理 vs. 联合概率分布

如果我们恰好可以访问我们设置中关心的所有多个随机变量的完整联合概率分布,那么我们就不需要贝叶斯定理。换句话说,贝叶斯定理帮助我们计算所需的条件概率当我们无法访问所涉随机变量的完整联合概率分布时。

  • 从逻辑和数学的角度来看,我们可以定义条件概率,然后顺利进行我们的计算和生活。然而,从业者根据他们是在对已观察到的数据进行条件概率还是对他们仍需要估计的权重(也称为参数)进行条件概率,给不同的条件概率赋予不同的名称。这里的词汇包括:先验分布(在观察任何数据之前,模型权重的一般概率分布),后验分布(给定观察数据的权重的概率分布),以及似然函数(编码给定特定权重分布的情况下观察数据点的概率)。所有这些都可以通过贝叶斯定理以及联合分布来联系起来。

注:我们说似然函数不是似然分布。

我们将似然性称为函数,而不是分布,因为概率分布必须加起来为一(或者如果我们处理连续随机变量,则积分为一),但似然函数不一定加起来为一(或者在连续随机变量的情况下积分为一)。

  • 我们可以混合概率分布并产生分布混合物高斯混合非常有名。上面包含男性和女性身高测量值的身高数据就是高斯混合的一个很好的例子。

  • 我们可以将从简单分布中抽样的随机变量相加或相乘,以产生具有更复杂分布的新随机变量,代表更复杂的随机事件。通常在这里调查的自然问题是:随机变量的和或积的分布是什么?

  • 最后,我们使用有向和无向图表示来有效地分解联合概率分布。这使得我们的计算生活变得更加便宜和可处理。

  • 对于概率、统计和数据科学来说,有四个关键的量:期望均值,用于量化平均值,以及方差标准差,用于量化围绕平均值的扩散,因此编码不确定性。我们的目标是控制方差,以减少不确定性。方差越大,使用平均值进行预测时可能犯的错误就越多。因此,当你探索这个领域时,你经常会注意到数学陈述、不等式和定理主要涉及对涉及随机性的任何量的期望和方差的一些控制。

  • 当我们有一个随机变量及其相应的概率分布时,我们计算期望(预期平均结果)、方差(与预期平均值的平方距离的期望)和标准差(与平均值的期望距离)。对于已经抽样或观察到的数据,例如上面的身高和体重数据,我们计算样本均值(平均值)、方差(与均值的平方距离的平均值)和标准差(与均值的平均距离,因此这测量了均值周围的扩散)。因此,如果我们关心的数据尚未被抽样或观察到,我们使用期望的语言进行推测,但如果我们已经有了观察或测量的样本,我们计算其统计量。自然地,我们对我们的推测与我们计算出的观察数据的统计量有多大偏差感兴趣,以及在极限(但理想化)情况下,我们实际上可以测量整个人口的数据。大数定律为我们解答了这个问题,并告诉我们,在这种极限情况下(样本量趋于无穷大时),我们的期望与样本均值相匹配。

  • 当我们有两个或更多的随机变量时,我们计算协方差相关性协方差矩阵。这时,线性代数领域的向量、矩阵和矩阵分解(如特征值和奇异值分解)的语言与概率和统计领域结合在一起。每个随机变量的方差都位于协方差矩阵的对角线上,每对可能的协方差都位于对角线之外。协方差矩阵是对称的。当你对其进行对角化时,使用标准线性代数技术,你会去相关涉及的随机变量。

  • 与此同时,我们暂停一下,确保我们知道独立性和零协方差之间的区别。协方差和相关性都是关于捕捉两个随机变量之间的线性关系。相关性适用于标准化的随机变量,这样我们即使随机变量或数据测量具有非常不同的尺度,仍然可以检测到线性关系。当你对数量进行标准化时,它的尺度就不再重要了。无论它是以百万为单位还是以 0.001 为单位测量都无关紧要。协方差适用于未标准化的随机变量。生活并不都是线性的。独立性比零协方差更强。

  • 马尔可夫过程对于人工智能的强化学习范式非常重要。它们的特征是系统的所有可能状态,代理可以执行的所有可能动作的集合(向左移动、向右移动,),包含所有状态之间转移概率的矩阵,或者代理在采取某个动作后将转移到哪个状态的概率分布,以及一个奖励函数,我们希望最大化。人工智能中的两个流行例子包括棋盘游戏和智能恒温器,如 NEST。我们将在强化学习章节中介绍这些内容。

注:标准化、缩放和/或标准化随机变量或数据集

这是许多情况下词汇冲突的一个例子。在各种上下文中,标准化、缩放和标准化通常是同义词。目标总是相同的。从数据或随机变量的所有可能结果中减去一个数字(偏移),然后除以一个常数(比例)。如果你从数据样本的均值(或随机变量的期望)中减去并除以它们的标准差,那么你会得到新的标准化归一化数据值(或新的标准化或归一化的随机变量),它们的均值等于零(或期望值等于零),标准差等于一。如果你减去最小值并除以范围(最大值减去最小值),那么你会得到新的数据值或新的随机变量,其结果都在零和一之间。有时我们谈论标准化数字向量。在这种情况下,我们的意思是我们将向量中的每个数字除以向量本身的长度,这样我们就得到一个长度为一的新向量。因此,无论我们说我们正在标准化、缩放还是标准化一组数字,目标都是尝试控制这些数字的值,并将它们居中在零周围,并/或限制它们的扩散小于或等于一,同时保留它们固有的变异性。

数学家喜欢用抛硬币、掷骰子、从瓮中取球、从牌组中抽牌、火车到站、顾客打电话、顾客点击广告或网站链接、疾病及其症状、刑事审判和证据,以及直到某事发生的时间等概率概念。不要感到惊讶,这些例子随处可见,因为它们很好地概括了许多其他现实生活情况。

除了上述概率理论的映射,我们还将从统计力学(例如分区函数)和信息论(例如信号vs.噪声、熵和交叉熵函数)中借用很少的术语和函数。我们将在后面的章节中遇到它们时进行解释。

连续分布*vs.离散分布(密度vs.*质量)

当我们处理连续分布时,重要的是使用诸如观察或抽样接近围绕某个值的数据点的术语,而不是观察或抽样确切的值。实际上,在这种情况下观察到确切值的概率为零。

当我们的数字处于连续状态时,一个值和下一个值之间没有离散的分隔。实数具有无限的精度。例如,如果我测量一个男性的身高,得到 6 英尺,我就不知道我的测量是精确的 6 英尺,还是 6.00000000785 英尺,或者是 5.9999111134255 英尺。最好将我的观察设置在 6 英尺左右的一个区间内,例如 5.95 < height < 6.05,然后量化在 5.95 英尺和 6.05 英尺之间观察到的概率。

对于离散随机变量,我们不必担心这种情况,因为我们可以轻松地将可能的值彼此分开。例如,当我们掷骰子时,我们的可能值是 1、2、3、4、5 或 6。因此,我们可以自信地断言掷出确切的 5 的概率为 1/6。此外,离散随机变量可以具有非数值结果,例如,当我们抛硬币时,我们的可能值是正面或反面。连续随机变量只能具有数值结果。

由于上述推理,当我们有一个连续的随机变量时,我们定义它的概率密度函数,而不是其概率质量函数,就像离散随机变量的情况一样。密度指定了在一定长度、面积或空间体积内存在多少物质(取决于我们所处的维度)。为了找到指定区域内的物质质量,我们将密度与所考虑区域的长度、面积或体积相乘。如果我们给定了每个无限小区域的密度,那么我们必须对整个区域进行积分,以便找到该区域内的质量,因为积分类似于对无限多个无限小区域进行求和。

我们将在概率章节中详细阐述这些想法,并在数学上对其进行形式化。目前,我们强调以下几点:

  • 如果我们只有一个连续的随机变量,比如某一人口中男性的身高,那么我们使用一维概率密度函数来表示其概率分布:f ( x 1 )。为了找到身高在 5.95 < height < 6.05 之间的概率,我们对区间(5.95,6.05)上的概率密度函数f ( x 1 )进行积分,我们写成:

P ( 5 . 95 < h e i g h t < 6 . 05 ) = ∫ 5.95 6.05 f ( x 1 ) d x 1 .

  • 如果我们有两个连续随机变量,比如某一人群中男性的身高和体重,或者一个人的真实身高和测量身高(通常包括随机噪声),那么我们使用一个二维概率密度函数来表示它们的联合概率分布:f ( x 1 , x 2 )。因此,为了找到身高在 5.95 < height < 6.05 体重在 160 < weight < 175 之间的联合概率,我们对联合概率密度函数f ( x 1 , x 2 )进行双重积分,假设我们知道f ( x 1 , x 2 )的公式,对区间(5.95, 6.05)和(160,175)进行积分,并写成:

P ( 5 . 95 < h e i g h t < 6 . 05 , 160 < w e i g h t < 175 ) = ∫ 160 175 ∫ 5.95 6.05 f ( x 1 , x 2 ) d x 1 d x 2 .

  • 如果我们有两个以上的连续随机变量,那么我们使用更高维的概率密度函数来表示它们的联合分布。例如,如果我们有某一人群中男性的身高、体重和血压,那么我们使用一个三维联合概率分布函数:f ( x 1 , x 2 , x 3 )。类似于上述两个项目的推理,为了找到第一个随机变量在a < x 1 < b之间的联合概率,第二个随机变量在c < x 2 < d之间,第三个随机变量在e < x 3 < f之间,我们对区间(a,b)、(c,d)和(e,f)上的联合概率密度函数进行三重积分,并写成:

P ( a < x 1 < b , c < x 2 < d , e < x 3 < f ) = ∫ e f ∫ c d ∫ a b f ( x 1 , x 2 , x 3 ) d x 1 d x 2 d x 3 .

  • 我们定义了连续随机变量的概率密度函数后,我们并没有消除所有的担忧(即数学上的加法)。再次,罪魁祸首是实数的无限精度。如果我们允许所有集合都有概率,我们会遇到悖论,因为我们可以构造不相交的集合(如分形形状的集合或通过变换有理数集合而构成的集合),它们的概率总和超过了 1!必须承认,这些集合是病态的,必须由有充裕时间的人仔细构造,但是,它们存在并产生悖论。数学中的测度论提供了一个数学框架,我们可以在其中使用概率密度函数而不会遇到悖论。它定义了零测度集合(这些集合在我们工作的空间中不占体积),然后给我们提供了许多定理,允许我们在几乎所有地方进行计算,即除了零测度集合。这对我们的应用来说已经足够了。

联合概率密度函数的威力

拥有许多随机变量的联合概率分布是一件强大但罕见的事情。原因是联合概率分布中包含了每个单独随机变量的概率分布(边际分布),以及我们在这些随机变量之间遇到的所有可能的共同发生(和条件概率)。这类似于从上方看到整个城镇,而不是在城镇内部观察两条或多条小巷之间的交叉口。

如果随机变量是独立的,那么联合分布就是它们各自的分布的乘积。然而,当随机变量不独立时,例如一个人的身高和体重,或者一个人的观测身高(包括测量误差)和一个人的真实身高(不包括误差),访问联合分布就会变得更加困难和昂贵。在依赖随机变量的情况下,联合分布是不可分的,因此我们不能仅仅单独存储它的每个部分。我们需要存储两个或更多变量之间每个共同发生的每个值。随着依赖随机变量数量的增加,存储需求(以及计算或搜索空间)呈指数增长,这是臭名昭著的维度诅咒的一种体现。

当我们切割联合概率密度函数,比如f ( x 1 , x 2 ),意味着当我们固定一个随机变量(或在更高维度中固定更多)为一个确切的值时,我们会得到与后验概率分布(给定观察结果的模型参数的概率分布)成比例的分布,这通常是我们感兴趣的。例如,切割f ( x 1 , x 2 )在x 1 = a时,我们得到f ( a , x 2 ),它恰好与概率分布f ( x 2 | x 1 = a )成比例(见图 2-7)。

300

图 2-7。切割联合概率分布。

同样,这是在我们知道联合概率分布的奢侈情况下,否则,我们使用贝叶斯定理来获得相同的后验概率分布(使用先验分布和似然函数)。

在一些人工智能应用中,人工智能系统通过使用概率乘法规则将联合概率分布分解为条件概率的乘积来学习联合概率分布。一旦它学习了联合分布,它就会从中进行抽样,以生成新的有趣的数据。DeepMind 的 WaveNet 在生成原始音频的过程中就是这样做的。

接下来的部分介绍了人工智能应用中最有用的概率分布。两种普遍的连续分布是均匀分布正态分布(也称为高斯分布),因此我们从这里开始。有关复制图表和更多细节,请参阅Jupyter Notebook

数据分布:均匀分布

为了直观地理解均匀分布,让我们举一个非均匀分布的例子,我们在本章前面已经看到过。在我们上面的真实身高体重数据集中,我们不能使用均匀分布来建模身高数据。我们也不能用它来建模体重数据。原因是人类的身高和体重并不是均匀分布的。在一般人群中,遇到身高约 7 英尺的人和遇到身高约 5 英尺 6 英寸的人并不是同样可能的。

均匀分布只模拟均匀分布的数据。如果我们有一个区间( x min , x max ),其中包含我们的数据在x min和x max之间的连续值,我们的数据在我们的区间内均匀分布,那么在我们的区间内观察到接近任何特定值的数据点的概率对于该区间内的所有值来说是相同的。也就是说,如果我们的区间是( 0 , 1 ),那么选择接近 0.2 的点和选择接近 0.75 的点是同样可能的。

因此,均匀分布的概率密度函数是常数。对于区间( x min , x max )上的一个随机变量 x,连续均匀分布的概率密度函数的公式如下:

f ( x ; x min , x max ) = 1 x max -x min for x min < x < x max ,

在其他情况下为零。

让我们绘制均匀分布在区间( x min , x max )上的概率密度函数。图 2-8 中的图表是一条直线段,因为均匀分布的数据,无论是真实的还是模拟的,都在考虑的整个区间内均匀分布。区间内没有比其他更有利于出现的数据值。

300

图 2-8。概率密度函数的图表,显示了在区间[0,1]上的均匀分布。

均匀分布在计算机模拟中非常有用,用于生成来自任何其他概率分布的随机数。如果你瞥一眼 Python 使用的随机数生成器,你会看到均匀分布在底层算法中的某个地方被使用。

数据分布:钟形正态(高斯)分布

连续概率分布更适合模拟人类身高数据(当限制为一种性别时)的是钟形正态分布,也称为高斯分布。从正态分布中抽样往往聚集在分布峰值处的平均值周围,称为均值μ,然后随着远离均值而对称减少。分布在减少时扩散到离均值多远由正态分布的第二个参数控制,称为标准差σ。约 68%的数据落在均值的一个标准差范围内,95%的数据落在均值的两个标准差范围内,约 99.7%的数据落在均值的三个标准差范围内。

300

图 2-9。参数为μ = 0和σ = 1的钟形正态分布的概率密度函数图。

在从正态分布中抽取数据时,接近均值的值更有可能被选中(或发生或被观察到),而非常小(→ - ∞)或非常大(→ ∞)的值更不可能被选中。这种在分布的中心值附近出现的高峰和在分布的外围逐渐减小,使得这个分布具有其著名的钟形。请注意,还有其他钟形连续分布,但正态分布是最常见的。它有一个整洁的数学理由来解释这个当之无愧的名声,这是基于概率论中一个重要的定理,即中心极限定理

中心极限定理表明,许多独立随机变量的平均值(不一定是正态分布)通常是正态分布的。这解释了为什么正态分布在社会和自然界中随处可见。它模拟了婴儿出生体重、学生成绩分布、国家收入分布、血压测量分布等。有特殊的统计测试可以帮助我们确定真实数据集是否可以用正态分布来建模。我们将在概率章节中进一步扩展这些想法。

如果你发现自己处于一个不确定的情况,并且对于你的应用程序不知道使用哪种分布,正态分布通常是一个合理的选择。实际上,在所有具有相同方差的分布选择中,正态分布是具有最大不确定性的选择,因此它实际上将最少的先验知识编码到你的模型中。

一个随机变量 x(单变量)的正态分布的概率密度函数公式为:

g ( x ; μ , σ ) = 1 2πσ 2 e -(x-μ) 2 2σ 2 ,

参数为μ = 0和σ = 1的图在图 2-9 中绘制出来。

两个随机变量 x 和 y(双变量)的正态分布的概率密度函数公式为:

数学符号“美元符号 g 左括号 x 逗号 y 分号 μ1 逗号 σ1 逗号 μ2 逗号 σ2 逗号 ρ 右括号 等于 分数 1 除以 开方 左括号 2π 右括号 平方 行列式 2 乘 2 矩阵 1 行 1 列 σ1 平方 2 列 ρσ1σ2 2 行 1 列 ρσ1σ2 2 列 σ2 平方 结束矩阵 开方 结束分数 e 上标负号 左大括号 一半 1 乘 2 矩阵 1 行 1 列 x 减去μ1 2 列 y 减去μ2 结束矩阵 2 乘 2 矩阵 1 行 1 列 σ1 平方 2 列 ρσ1σ2 2 行 1 列 ρσ1σ2 2 列 σ2 平方 结束矩阵 上标负 1 开合式 x 减去μ1 选择 y 减去μ2 结束式 美元符号”

并且它的图在图 2-10 中绘制。

我们可以使用线性代数的语言,用更紧凑的符号表示上述双变量公式。

g ( x , y ; μ , Σ ) = 1 (2π) 2 det(Σ) e - 1 2 (u-μ) T Σ -1 ( u - μ )250

图 2-10。钟形双变量正态分布的概率密度函数图。

在图 2-11 中,我们从双变量正态分布中抽取了 6000 个点。

250

图 2-11。从双变量正态分布中抽取 6000 个点。中心附近的点更有可能被选中,而远离中心的点被选中的可能性较小。这些线大致追踪了正态分布的轮廓线,如果我们只观察样本点而不知道它们是从哪个分布中抽取的。

让我们暂停一下,比较双变量正态分布的概率密度函数公式与单变量正态分布的概率密度函数公式:

  • 当只有一个随机变量时,我们只有一个均值μ和一个标准差σ。

  • 当有两个随机变量时,我们有两个均值μ 1 μ 2,两个标准差σ 1 σ 2。乘积σ 2将被协方差矩阵Σ = σ 1 2 ρ σ 1 σ 2 ρ σ 1 σ 2 σ 2 2及其行列式所取代。ρ是两个随机变量之间的相关性,即两个随机变量的标准化版本的协方差。

双变量正态分布的概率密度函数的完全相同的公式推广到任何维度,其中我们有许多随机变量而不仅仅是两个随机变量。例如,如果我们有 100 个随机变量,代表数据集中的 100 个特征,公式中的均值向量将有 100 个条目,并且协方差矩阵的大小将为 100×100,对角线上是每个随机变量的方差,而非对角线上是 4950 对随机变量的协方差。

数据分布:其他重要和常用的分布

在本章中你不理解的几乎所有内容都将在整本书中多次重访,第十一章专门讨论概率。这些概念将在各种有趣的背景中再次出现时得到强化。我们本章的目标是接触概率和统计的词汇,并为 AI 应用中经常出现的重要思想提供一个指导图。我们还希望在不必要的情况下获得对接下来的章节有一个良好的概率直觉,而不必深入研究和延迟我们的进展。

有许多概率分布。每个模型都代表不同类型的现实世界场景。均匀分布和正态分布非常常见,但我们还有其他重要的分布经常出现在 AI 领域。回想一下,我们的目标是模拟我们周围的世界,以便进行良好的设计、预测和/或决策。概率分布帮助我们在我们的模型涉及随机性或我们对结果不确定时进行预测。

当我们研究分布时,令人沮丧的一部分是大多数分布都有奇怪的名称,对于给定分布可能有用的现象提供零直觉。这使我们要么花费额外的精力来记住这些名称,要么在口袋里放一张分布备忘单。我更喜欢备忘单。另一个令人沮丧的部分是,大多数教科书例子都涉及抛硬币、掷骰子或从瓮中取出彩色球。这使我们没有真实生活的例子或动力来理解这个主题,因为我从未见过有人在那里抛硬币并数头或尾,除了《黑暗骑士》(一部 2008 年的非常好的电影,其中小丑(希斯·莱杰)说了一些我最喜欢和深刻的关于随机性和机会的声明,比如这个,“世界是残酷的。在残酷的世界中,唯一的道德是机会。公正的。无偏见的。公平的。”)。我会尽量在这本书中修正这一点,指出尽可能多的真实世界例子,以符合我的页面限制。

以下一些分布在数学上相关,或者自然地从其他分布中得出。我们将在第十章中探讨这些关系。现在,让我们命名一个流行的分布,说明它是离散的(预测我们关心的某种数量)还是连续的(预测存在于连续中的数量,例如某事发生前需要经过的时间:注意,这不是小时数,因为小时数是离散的,而是时间段的长度),说明控制它的参数,以及对我们的 AI 应用有用的定义属性。

  • 二项分布:这是离散的。它表示在重复一次实验时,独立地多次进行时获得一定数量的成功的概率。它的控制参数是 n,我们进行的实验次数,以及p预先定义的成功概率。现实世界的例子包括预测在临床试验中接种疫苗或新药物的患者出现副作用的数量,预测广告点击将导致购买的数量,或者客户在每月信用卡付款上违约的数量。当我们使用需要试验独立性的概率分布对现实世界的例子进行建模时,这意味着即使现实世界的试验并不真正独立,我们也假设独立。指出我们模型的假设是一个良好的礼仪。

  • 泊松分布:这是离散的。它预测在一定时间内会发生的罕见事件的数量。这些事件是独立的或者弱相关的,这意味着事件的一次发生不会影响同一时间段内下一次发生的概率。它们也以已知和恒定的平均速率λ发生。因此,我们知道平均速率,并且想要预测在一定时间段内会发生多少这样的事件。泊松分布的控制参数是预先定义的罕见事件率λ。现实世界的例子包括预测在一个小时内出生的婴儿数量,一个人口中年满 98 岁以上的人数,一定时间段内从放射性系统中释放的α粒子数量,国税局发送的重复账单数量,某一天销售的不太受欢迎产品的数量,本书一页中包含的错别字数量,某一天某台机器生产的次品数量,某个小时进入商店的人数,保险公司需要在一定时间段内承担的车祸数量,以及在特定时间段内发生的地震数量。

  • 几何分布:这是离散的。它预测了在进行独立试验时,在每次成功的已知概率 p 的情况下,我们获得成功之前需要的试验次数。这里的控制参数显然是成功的概率 p。现实世界的例子包括估计一家公司在不经历网络故障的情况下能够运作的周数,一台机器在生产次品之前能够运行的小时数,或者我们需要采访多少人才能遇到反对我们想通过的某项法案的人。同样,对于这些现实世界的例子,如果使用几何分布进行建模,我们可能会假设试验是独立的,而实际上试验可能并不是独立的。

  • 指数分布:这是连续的。如果我们碰巧知道某个事件以恒定速率λ发生,那么指数分布预测了该事件发生的等待时间。它是“无记忆”的,因为属于指数分布的物品的剩余寿命也是指数分布。控制参数是恒定速率λ。现实世界的例子包括等待地震发生的时间,贷款违约的时间,机器零件失效的时间,或者恐怖袭击发生之前的时间。这对于可靠性领域非常有用,可用于计算某个机器零件的可靠性,因此会有“10 年保证”之类的说法。

  • 威布尔分布:这是连续的。它在工程领域被广泛用于预测产品的寿命(10 年保修声明也适用于这里)。在这里,一个产品由许多部分组成,如果其中任何一个部分出现故障,那么产品就停止工作。例如,如果汽车的电池故障,或者变速箱中的保险丝烧断,汽车就无法工作。威布尔分布在考虑了许多部分及其最薄弱环节后,为汽车在停止工作之前的寿命提供了一个很好的近似值(假设我们不对汽车进行维护和重置计时器)。它由三个参数控制:形状、比例和位置参数。指数分布是这个分布的特例,因为指数分布具有恒定的事件发生率,但威布尔分布可以模拟随时间增加或减少的发生率。

  • 对数正态分布:这是连续的。如果我们对该分布中提供的每个值取对数,那么我们得到的是正态分布的数据。这意味着起初你的数据可能看起来不是正态分布的,但尝试使用对数函数进行转换,然后你会看到正态分布的数据。当遇到偏斜数据、低均值、大方差和仅假设正值时,这是一个很好的分布。就像当你对一个随机变量的许多独立样本取平均值时会出现正态分布(使用中心极限定理),当你取许多正样本值的乘积时,就会出现对数正态分布。从数学上讲,这是由于对数函数的一个很棒的性质:乘积的对数是对数的和。这个分布由三个参数控制:形状、比例和位置参数。现实世界的例子包括石油储备中的气体体积,以及一天结束时证券价格与前一天结束时价格的比率。

  • 卡方分布:这是连续的。这是一种用于正态分布独立随机变量平方和的分布。你可能会想为什么我们要关心平方正态分布的随机变量,然后把它们加起来。答案是这通常是我们计算随机变量或数据样本方差的方法,而我们的主要目标之一是控制方差,以降低我们的不确定性。与这个分布相关的有三种显著性检验:拟合优度检验,衡量我们的期望与观察结果的偏差程度,以及数据特征的独立性和均匀性检验。

  • 帕累托分布:这是连续的。它对许多现实世界的应用非常有用,比如,完成分配给超级计算机的工作所需的时间(考虑机器学习计算)、特定人群的家庭收入水平、社交网络中的朋友数量以及互联网流量的文件大小。这个分布只由一个参数α控制,它是重尾的(其尾部比指数分布更重)。

在继续之前,让我们再加入一些其他分布,而不要为任何细节烦恼。这些都或多或少与前述分布相关:学生 t-分布(连续,类似于正态分布,但在样本量较小且总体方差未知时使用),贝塔分布(连续,在给定区间内产生随机值),柯西分布(连续,病态,因为它的均值和方差都未定义,可以使用随机选择的角的正切获得),伽玛分布(连续,与等待时间有关,直到发生 n 个独立事件,而不仅仅是一个事件,如指数分布),负二项分布(离散,与获得一定数量的成功所需的独立试验次数有关),超几何分布(离散,类似于二项分布,但试验不是独立的),以及负超几何分布(离散,捕捉在获得一定数量的成功之前需要的依赖试验次数)。

分布一词的各种用法

您可能已经注意到,“分布”一词根据上下文指的是许多不同(但相关)的概念。同一个词的不一致使用可能会导致混淆,并且可能会立即使一些试图进入该领域的人望而却步。

让我们列出“分布”一词所指的不同概念,以便我们可以轻松地在特定上下文中识别其预期的含义:

  • 如果您有真实数据,比如本章中的身高体重数据,并绘制数据集的一个特征的直方图,比如身高,那么您将得到身高数据的经验分布。您通常不知道整个人口身高的潜在概率密度函数,也称为分布,因为您拥有的真实数据只是该人口的样本,因此您尝试使用概率论给出的概率分布来估计它或对其进行建模。对于身高和体重特征,按性别分开时,高斯分布是合适的。

  • 如果您有一个离散随机变量,“分布”一词可能指的是其概率质量函数或其累积分布函数(指定随机变量小于或等于某个值的概率 f ( x ) = p r o b ( X ≤ x ) )。

  • 如果您有一个连续随机变量,“分布”一词可能指的是其概率密度函数或其累积分布函数,其积分给出了随机变量小于或等于某个值的概率。

  • 如果您有多个随机变量(离散、连续或两者混合),那么“分布”一词指的是它们的联合概率分布。

一个共同的目标是建立一个理想化的数学函数,比如一个具有适当分布的随机变量,与真实观察到的数据或现象之间的适当对应关系,具有观察到的经验分布。在处理真实数据时,数据集的每个特征都可以使用随机变量进行建模。因此,在某种程度上,数学随机变量及其相应的分布是我们测量或观察到的特征的理想化版本。

最后,分布在人工智能应用中随处可见。在接下来的章节中,我们将多次遇到它们,例如神经网络每一层的权重分布,以及各种机器学习模型产生的噪音和误差的分布。

A/B 测试

在离开本章之前,我们会稍微偏离一下,进入* A/B 测试的世界,也称为分割测试*,或随机单盲双盲试验。我们会偏离一下,因为这是数据科学家重要的主题,而且这个想法足够简单,可以放在一个小节里。

无数家公司依靠 A/B 测试的数据来增加参与度、收入和客户满意度。微软、亚马逊、LinkedIn、谷歌等每年都进行数千次 A/B 测试。

A/B 测试很简单:将人群分成两组。将要测试的东西的一个版本(新的网页设计、不同的字体大小、新药、新的政治广告)推出给一个组,即测试组,而将另一组作为对照组。比较两组之间的数据。

如果受试者不知道他们属于哪个组(有些人甚至不知道他们根本在测试中),但实验者知道,那么这个测试就是单盲的。如果实验者和受试者都不知道他们正在与哪个组互动,那么这个测试就是双盲的。

总结和展望

在本章中,我们强调了数据对于人工智能的重要性。我们还澄清了通常会引起混淆的概念之间的区别:结构化和非结构化数据,线性和非线性模型,真实和模拟数据,确定性函数和随机变量,离散和连续分布,后验概率和似然函数。我们还提供了概率和统计学的地图,而没有深入任何细节,并介绍了最流行的概率分布。

如果你发现自己在某个新的概率概念中迷失了方向,你可能会想要查阅本章提供的地图,看看这个概念如何融入概率论的大局,最重要的是,它如何与人工智能相关。如果不知道某个数学概念如何与人工智能相关,你就只是拥有一个你知道如何打开的工具,但你不知道它用来做什么。

我们还没有提到随机矩阵高维概率。在这些领域,概率论不断跟踪分布、期望和任何相关随机量的方差,与其对特征值和各种矩阵分解的超关注相结合。这些领域对于涉及人工智能应用中的极高维数据非常重要。我们在第十一章中讨论这些内容。

在下一章中,我们将学习如何将我们的数据拟合到一个函数中,然后使用这个函数进行预测和/或决策。从数学上讲,我们找到了表征我们数据特征之间各种相互作用强度的权重(ω)。当我们表征了涉及的相互作用类型(拟合函数的公式,称为学习训练函数)和这些相互作用的强度(ω的值)时,我们就可以进行预测。在人工智能中,这个用适当的权重值表征拟合函数的概念可以成功地用于计算机视觉、自然语言处理、预测分析(比如房价、维护时间等),以及许多其他应用。

第三章:将函数拟合到数据

今天适合。明天呢?

在本章中,我们介绍了许多人工智能应用的核心数学思想,包括神经网络的数学引擎。我们的目标是内化人工智能问题的机器学习部分的以下结构:

  • 根据具体用例识别问题:分类图像,分类文档,预测房价,检测欺诈或异常,推荐下一个产品,预测犯罪分子再次犯罪的可能性,根据外部图像预测建筑的内部结构,将语音转换为文本,生成音频,生成图像,生成视频,等等

  • 获取适当的数据,以便训练我们的模型做正确的事情。我们说我们的模型从数据中学习。确保这些数据是干净的、完整的,并且如果必要的话,根据我们正在实施的具体模型进行转换(归一化、标准化、一些特征聚合,等等)。这一步通常比实施和训练机器学习模型耗费更多时间。

  • 创建一个假设函数。我们可以互换使用假设函数、学习函数预测函数训练函数模型这些术语。我们的主要假设是,这个输入/输出的数学函数解释了观察到的数据,并且可以在以后用于对新数据进行预测。我们给我们的模型特征,比如一个人的日常习惯,它返回一个预测,比如这个人偿还贷款的可能性。在本章中,我们将给我们的模型鱼的长度测量,并且它将返回它的重量。

  • 我们将遇到许多模型(包括神经网络),其中我们的训练函数具有称为权重的未知参数。目标是使用数据找到这些权重的数值。在找到这些权重值之后,我们可以使用训练函数进行预测,将新数据点的特征插入到训练函数的公式中。

  • 为了找到未知权重的值,我们创建另一个函数,称为误差函数成本函数目标函数损失函数(人工智能领域的一切都有三个或更多的名称)。这个函数必须衡量地面真相和我们的预测之间的某种距离。自然地,我们希望我们的预测尽可能接近地面真相,因此我们寻找最小化我们损失函数的权重值。从数学上讲,我们解决了一个最小化问题。数学优化领域对人工智能至关重要。

  • 在整个过程中,我们是工程师,所以我们决定训练函数、损失函数、优化方法和计算机实现的数学公式。不同的工程师决定不同的流程,产生不同的性能结果,这是可以接受的。最终的评判是部署模型的性能,与普遍看法相反,数学模型是灵活的,可以在需要时进行调整和修改。部署后监控性能至关重要。

  • 由于我们的目标是找到最小化预测和实际值之间误差的权重数值,我们需要找到一种高效的数学方法来搜索这些最小化者:那些产生最小误差的特殊权重数值。梯度下降方法在这里起着关键作用。这种强大而简单的方法涉及计算我们误差函数的一个导数。这就是我们花了一半的微积分课程计算导数的原因之一(以及梯度:这是高维度中的一个导数)。还有其他需要计算两个导数的方法。我们将遇到它们,并评论使用高阶方法的利弊。

  • 当数据集非常庞大,而我们的模型恰好是一个分层神经网络时,我们需要一种高效的方法来计算这个导数。反向传播算法就是在这一点上发挥作用。我们将在下一章中讨论梯度下降和反向传播。

  • 如果我们的学习函数对给定数据拟合得太好,那么它在新数据上表现不佳。原因是对数据拟合得太好的函数意味着它既捕捉到了数据中的噪音,也捕捉到了信号(例如,图 3-1 左侧的函数)。我们不希望捕捉到噪音。这就是正则化发挥作用的地方。有多种数学方法可以使函数正则化,这意味着使其更加平滑和不那么振荡和不规则。一般来说,跟随数据中的噪音的函数振荡太多。我们希望更规则的函数。我们将在下一章中介绍正则化技术。

280

图 3-1。左:拟合函数完美地拟合了数据,但它不是一个很好的预测函数,因为它拟合了数据中的噪音而不是主要信号。右:一个更规则的函数拟合了相同的数据集。使用这个函数将比左侧子图中的函数给出更好的预测,即使左侧子图中的函数更好地匹配了数据点。

在接下来的章节中,我们将用真实但简单的数据集探索 AI 问题的上述结构。我们将在接下来的章节中看到相同的概念如何推广到更复杂的任务。

传统且非常有用的机器学习模型

本章中使用的所有数据都带有地面真相标签,我们模型的目标是预测新的(未见过的)和未标记的数据的标签。这是监督学习。

在接下来的几节中,我们将使用以下流行的机器学习模型将训练函数拟合到我们的标记数据中。虽然您可能会听到关于 AI 最新和最伟大发展的许多消息,但在典型的商业环境中,您可能最好从这些更传统的模型开始:

  1. 线性回归:预测数值。

  2. 逻辑回归:分类到两个类别(二元分类)。

  3. Softmax 回归:分类到多个类别。

  4. 支持向量机:分类到两个类别,或回归(预测数值)。

  5. 决策树:分类到任意数量的类别,或回归(预测数值)。

  6. 随机森林:分类到任意数量的类别,或回归(预测数值)。

  7. 模型集成:通过平均预测值、投票最受欢迎的类别或其他捆绑机制来捆绑许多模型的结果。

我们在相同的数据集上尝试多个模型以进行性能比较。在现实世界中,很少有任何模型在没有与许多其他模型进行比较的情况下部署。这是计算密集型 AI 行业的特性,这也是为什么我们需要并行计算的原因,它使我们能够同时训练多个模型(除了那些构建和改进其他模型结果的模型,比如堆叠的情况,我们不能使用并行计算)。

在我们深入研究任何机器学习模型之前,非常重要的一点是,一再有报道称,数据科学家和/或人工智能研究人员只有大约百分之五的时间用于训练机器学习模型。大部分时间都用于获取数据、清理数据、组织数据、为数据创建适当的管道,等等将数据输入机器学习模型之前。因此,机器学习只是生产过程中的一步,一旦数据准备好训练模型就变得很容易。我们将发现这些机器学习模型是如何工作的:我们需要的大部分数学知识都存在于这些模型中。人工智能研究人员一直在努力改进机器学习模型,并将它们自动适应到生产管道中。因此,对我们来说,最终学习整个流程,从原始数据(包括其存储、硬件、查询协议,等等)到部署和监控,是非常重要的。学习机器学习只是更大更有趣故事的一部分。

我们必须从回归开始,因为回归的思想对于接下来的大多数人工智能模型和应用都是如此基础。只有对于线性回归,我们才会使用解析方法找到最小化权重,直接给出所需权重的显式公式,以训练数据集及其目标标签为参数。正是线性回归模型的简单性使得这种显式解析解成为可能。大多数其他模型没有这样的显式解,我们必须使用数值方法找到它们的最小值,其中梯度下降方法非常受欢迎。

在回归和许多其他即将出现的模型中,包括接下来几章的神经网络,要注意建模过程中的以下进展:

  1. 训练函数

  2. 损失函数

  3. 优化

数值解*vs.*解析解

了解数学问题的数值解和解析解之间的区别非常重要。数学问题可以是任何东西,比如:

  • 找到某个函数的最小值。

  • 找到从目的地A到目的地B的最佳方式,预算受限。

  • 找到设计和查询数据仓库的最佳方式。

  • 寻找数学方程的解(其中左手边有数学内容等于右手边有数学内容)。这些方程可以是代数方程、常微分方程、偏微分方程、积分微分方程、方程组,或者任何类型的数学方程。它们的解可以是静态的,也可以随时间演变。它们可以模拟物理、生物、社会经济或自然世界的任何事物。

以下是词汇表:

  • 数值:与数字有关。

  • 解析:与分析有关。

一般来说,数值解比分析解容易获得得多,也更容易获得,只要我们有足够的计算能力来模拟和计算这些解。我们通常只需要离散化一些连续空间和/或函数,尽管有时需要非常巧妙的方法,并在这些离散量上评估函数。数值解的唯一问题是它们只是近似解。除非它们有估计值表明它们与真实分析解的差距有多大,以及它们收敛到这些真实解的速度有多快,而这又需要数学背景和分析,数值解并不是精确的。然而,它们确实提供了关于真实解的非常有用的见解。在许多情况下,数值解是唯一可用的解,许多科学和工程领域如果不依赖于复杂问题的数值解,就不会有任何进展。如果这些领域等待分析解和证明发生,或者换句话说,等待数学理论“赶上”,它们的进展将会非常缓慢。

另一方面,分析解是精确的、稳健的,并且有整个数学理论支持它们。它们伴随着定理和证明。当分析解可用时,它们非常强大。然而,它们并不容易获取,有时甚至是不可能的,并且确实需要在微积分、数学分析、代数、微分方程理论等领域具有深厚的知识和专业知识。然而,分析方法对于描述解的重要性质(即使明确的解不可用)、指导数值技术,并提供基本事实以比较近似数值方法(在这些分析解可用的幸运情况下)是极其有价值的。

一些研究人员纯粹是分析和理论的,另一些则是纯粹数值和计算的,而最好的存在位置是在接近交集的地方,我们对数学问题的分析和数值方面有一个良好的理解。

回归:预测一个数值

Kaggle 网站上快速搜索回归数据集会返回许多优秀的数据集和相关笔记本。我随机选择了一个简单的Fish Market数据集,我们将用它来解释我们即将介绍的数学。我们的目标是构建一个模型,根据鱼的五种不同长度测量或特征来预测鱼的重量,这些特征在数据集中标记为:Length1、Length2、Length3、Height 和 Width(见图 3-2)。为简单起见,我们选择不将分类特征 Species 纳入此模型,尽管我们可以(这样会给我们更好的预测,因为鱼的类型是其重量的良好预测因子)。如果我们选择包括 Species 特征,那么我们将不得不将其值转换为数值值,使用one hot coding,这意味着确切地说:根据其类别(类型)为每条鱼分配由一和零组成的代码。我们的 Species 特征有七个类别:鲈鱼、鲷鱼、鲫鱼、梭子鱼、胖鱼、Parkki 和白鱼。因此,如果我们的鱼是梭子鱼,那么我们将把它的种类编码为(0,0,0,1,0,0,0),如果它是鲷鱼,我们将把它的种类编码为(0,1,0,0,0,0,0)。当然,这会给我们的特征空间增加七个维度,并增加七个权重来训练。

280

图 3-2. 从 Kaggle 的Fish Market下载的鱼数据集的前五行。重量列是目标特征,我们的目标是构建一个模型,根据鱼的长度测量来预测新鱼的重量。

让我们节省墨水空间,并将我们的五个特征重新标记为:x 1 , x 2 , x 3 , x 4 , 和 x 5 , 然后将鱼的重量写成这五个特征的函数 y = f ( x 1 , x 2 , x 3 , x 4 , x 5 ) . 这样,一旦我们确定了这个函数的一个可接受的公式,我们只需要输入某条鱼的特征值,我们的函数就会输出该鱼的预测重量。

本节为即将到来的一切构建了基础,因此首先看看它是如何组织的是很重要的:

训练函数

  • 参数模型 vs. 非参数模型

损失函数

  • 预测值 vs. 真实值

  • 绝对值距离 vs. 平方距离

  • 具有奇点(尖点)的函数

  • 对于线性回归,损失函数是均方误差

  • 本书中的向量始终是列向量

  • 训练、验证和测试子集

  • 当训练数据具有高度相关的特征时

优化

  • 凸景观 vs. 非凸景观

  • 我们如何找到函数的最小值点?

  • 微积分简介

  • 一维优化示例

  • 我们一直在使用的线性代数表达式的导数

  • 最小化均方误差损失函数

  • 警告:将大矩阵相乘是非常昂贵的。应该将矩阵乘以向量。

  • 警告:我们永远不希望训练数据拟合得太好

训练函数

对数据的快速探索,例如绘制重量与各种长度特征的关系,使我们可以假设一个线性模型(即使在这种情况下非线性模型可能更好)。也就是说,我们假设重量线性地依赖于长度特征(参见图 3-3)。

280

图 3-3. 鱼市场数值特征的散点图。有关更多详细信息,请查看附加的 Jupyter 笔记本,或者与此数据集相关的一些公开的Kaggle 笔记本

这意味着鱼的重量 y 可以使用其五个不同长度测量的线性组合来计算,再加上一个偏置项 ω 0 ,得到以下训练函数

y = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 x 5

在我们在建模过程中做出的主要决定是使用线性训练函数 f(x1, x2, x3, x4, x5),我们所要做的就是找到参数ω0,ω1,ω2,ω3,ω4 和ω5 的适当值。我们将从数据中学习出ω的最佳值。利用数据找到适当的ω的过程称为训练模型。训练好的模型是指ω的值已经确定的模型。

一般来说,无论是线性还是非线性的训练函数,包括表示神经网络的函数,都有我们需要从给定数据中学习的未知参数ω。对于线性模型,每个参数在预测过程中给每个特征赋予一定的权重。因此,如果ω2 的值大于ω5 的值,那么第二个特征在我们的预测中起到比第五个特征更重要的作用,假设第二个和第五个特征具有可比较的规模。这是在训练模型之前对数据进行缩放或归一化的好处之一。另一方面,如果与第三个特征相关联的ω3 值消失,即变为零或可以忽略,那么第三个特征可以从数据集中省略,因为它在我们的预测中没有作用。因此,从数据中学习我们的ω允许我们在数学上计算每个特征对我们的预测的贡献(或者在数据准备阶段合并一些特征时,特征组合的重要性)。换句话说,模型学习数据特征如何相互作用以及这些相互作用的强度。结论是,通过训练学习函数,我们可以量化特征如何相互作用以产生已观察到的和尚未观察到的结果。

注意:参数模型与非参数模型

一个具有预先内置参数(我们称之为权重)的模型,比如我们当前的线性回归模型中的ω:

y = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 x 5

(以及神经网络的ω)被称为参数模型。这意味着我们在实际训练之前固定训练函数的公式,所有训练所做的就是解决公式中涉及的参数。提前固定公式类似于指定训练函数所属的,找到参数值指定了最能解释数据的确切成员。

非参数模型,例如我们将在本章后面讨论的决策树和随机森林,不会提前指定训练函数及其参数的公式。因此,当我们训练非参数模型时,我们不知道训练模型最终会有多少参数。模型会根据数据自适应并确定所需的参数数量。在这里要小心,过度拟合的警钟正在响!请记住,我们不希望我们的模型过度适应数据,因为它们可能无法很好地推广到未见过的数据。这些模型通常配有帮助它们避免过拟合的技术。

参数化和非参数化模型都有其他参数称为超参数,在训练过程中也需要进行调整。然而,这些参数并没有内置到训练函数的公式中(非参数化模型的公式中也没有)。我们将在本书中遇到许多超参数。

损失函数

我们已经确信,下一个逻辑步骤是找到适合训练函数(我们的线性参数模型)中出现的ω的合适值,使用我们拥有的数据。为了做到这一点,我们需要优化适当的损失函数

预测值与真实值

假设我们为我们每个未知的ω 0,ω 1,ω 2,ω 3,ω 4和ω 5分配一些随机数值,例如ω 0 = - 3,ω 1 = 4,ω 2 = 0 . 2,ω 3 = 0 . 03,ω 4 = 0 . 4,和ω 5 = 0 . 5。然后线性训练函数的公式y = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 x 5变为:

y = - 3 + 4 x 1 + 0 . 2 x 2 + 0 . 03 x 3 + 0 . 4 x 4 + 0 . 5 x 5

并准备好进行预测:为i th条鱼的长度特征插入数值,然后获得这条鱼的重量预测值。例如,我们数据集中的第一条鱼是鲱鱼,长度测量值为x 1 1 = 23 . 2,x 2 1 = 25 . 4,x 3 1 = 30,x 4 1 = 11 . 52,以及x 5 1 = 4 . 02。将这些值代入训练函数,我们得到了这条鱼的重量预测值:

y predict 1 = ω 0 + ω 1 x 1 1 + ω 2 x 2 1 + ω 3 x 3 1 + ω 4 x 4 1 + ω 5 x 5 1 = - 3 + 4 ( 23 . 2 ) + 0 . 2 ( 25 . 4 ) + 0 . 03 ( 30 ) + 0 . 4 ( 11 . 52 ) + 0 . 5 ( 4 . 02 ) = 102 . 398 grams.

通常,对于第 i 条鱼,我们有:

y predict i = ω 0 + ω 1 x 1 i + ω 2 x 2 i + ω 3 x 3 i + ω 4 x 4 i + ω 5 x 5 i

然而,考虑的鱼有一个真实重量,y true i,如果它属于标记数据集,则为其标签。对于我们数据集中的第一条鱼,真实重量是y true 1 = 242 。我们随机选择的线性模型预测了 102.398 。这当然相差甚远,因为我们根本没有校准ω值。无论如何,我们可以测量我们的模型预测的重量与真实重量之间的误差,然后找到更好的方法来选择ω。

绝对值距离vs平方距离

数学的一大优点是它有多种方法来衡量事物之间的差距,使用不同的距离度量。例如,我们可以天真地将两个量之间的距离测量为如果它们不同则为 1,如果它们相同则为 0,编码为:不同-1,相似-0。当然,使用这样一个天真的度量,我们会失去大量信息,因为两和十之间的距离将等于两和一百万之间的距离,即 1。

在机器学习中有一些流行的距离度量。我们首先介绍两种最常用的:

  • 绝对值距离:| y predict - y true |,源自微积分函数| x |。

  • 平方距离:| y predict - y true | 2,源自微积分函数|x| 2(对于标量量来说,这与x 2是相同的)。当然,这也会平方单位。

检查函数图像| x |和x 2在图 3-4 中,我们注意到在点(0,0)处函数的平滑度有很大的差异。函数| x |在该点有一个拐角,使得它在 x=0 处不可微。这种在 x=0 处的| x |的奇点使得许多从业者(包括数学家!)不愿将这个函数或具有类似奇点的函数纳入他们的模型中。然而,让我们铭记以下事实:

数学模型是灵活的。当我们遇到障碍时,我们会深入挖掘,了解发生了什么,然后我们会克服障碍。

275

图 3-4。左:图形| x |在x = 0处有一个转角,使得其在该点的导数未定义。右:图形|x| 2在x = 0处平滑,因此其导数在那里没有问题。

除了函数| x |和|x| 2的规则性之外(即它们在所有点是否都有导数),在决定是否将任一函数纳入我们的误差公式之前,我们还需要注意另一个问题:如果一个数很大,那么它的平方就更大。这个简单的观察意味着,如果我们决定使用真实值和预测值之间的平方距离来衡量误差,那么我们的方法将对数据中的异常值更敏感。一个混乱的异常值可能会使我们整个预测函数偏向它,因此远离数据中更普遍的模式。理想情况下,我们应该在数据准备步骤中处理异常值,并决定是否应该在将数据输入任何机器学习模型之前保留它们。

| x |(以及类似的分段线性函数)和x 2(以及类似的非线性但可微函数)之间的最后一个区别是,| x |的导数非常简单:

1 如果 x>0,-1 如果 x<0(如果 x=0,则未定义)。

在涉及数十亿次计算步骤的模型中,当使用| x |的导数时,无需评估任何内容,这一特性被证明非常有价值。通常情况下,既不是线性的也不是分段线性的函数的导数需要进行评估(因为它们的公式中不仅有常数,还有x),这在大数据环境中可能会很昂贵。

具有奇点的函数

一般来说,可微函数的图形没有尖点、转角、角或任何尖锐的地方。如果它们有这样的奇点,那么这些点处的函数就没有导数。原因是在尖锐的点上,你可以画出两条不同的切线,取决于你决定是在点的左边还是右边画切线(见图 3-5)。回想一下,函数在某一点的导数是函数图形在该点的切线的斜率。如果有两个不同的斜率,那么我们就无法定义该点的导数。

275

图 3-5。在奇点处,导数不存在。在这些点上,切线可能有多个可能的斜率。

切线斜率的不连续在依赖于评估函数的导数的方法(如梯度下降法)中造成了问题。问题在于:

  1. 如果你碰巧落在一个古怪的尖点上,那么方法就不知道该怎么办,因为那里没有定义的导数。有些人会为那一点分配一个导数值(称为次梯度次微分)然后继续前进。实际上,我们会不幸地正好落在那一个可怕的点上的几率有多大呢?除非函数的景观看起来像阿尔卑斯山的崎岖地形(实际上很多函数确实如此),数值方法可能会设法避开它们。

  2. 另一个问题是不稳定性。由于导数的值在函数的景观中跳跃得如此突然,使用这个导数的方法也会突然改变数值,如果你试图收敛到某个地方,就会产生不稳定性。想象一下你正在瑞士阿尔卑斯山徒步旅行图 3-6(损失函数的景观),你的目的地是山谷下面那个漂亮的小镇(误差值最低的地方)。然后突然你被某个外星人带到了山的另一边,你再也看不到你的目的地了。事实上,现在你在山谷下看到的只有一些丑陋的灌木丛,还有一个非常狭窄的峡谷,如果你的方法把你带到那里,你就会被困住。你原来的目的地的收敛现在是不稳定的,甚至完全丢失了。

275

图 3-6. 瑞士阿尔卑斯山:优化类似于徒步穿越函数的景观。

尽管如此,具有这种奇点的函数在机器学习中经常被使用。我们将在一些神经网络训练函数的公式(修正线性单元函数-谁起这些名字?)、一些损失函数(绝对值距离)和一些正则化项(Lasso 回归-这些也是谁起的名字?)中遇到它们。

对于线性回归,损失函数是均方误差

回到本节的主要目标:构建一个误差函数,也称为损失函数,它编码了我们的模型在进行预测时产生了多少误差,并且必须尽量小。

对于线性回归,我们使用均方误差函数。该函数对m个数据点的预测与真实值之间的平方距离误差进行平均(我们很快会提到包括哪些数据点):

均方误差等于 1/m(|y^predict¹ - y^true¹|² + |y^predict² - y^true²|² + ... + |y^predict^m - y^true^m|²)

让我们使用求和符号更紧凑地写出上面的表达式:

均方误差等于 1/m 的 sigma-求和(从 i=1 到 m)|y^predict^i - y^true^i|²

现在我们养成了使用更紧凑的线性代数符号的好习惯。这种习惯在这个领域非常方便,因为我们不想在试图跟踪索引的同时淹没。索引可能潜入我们对理解一切的美好梦想中,并迅速将它们转变成非常可怕的噩梦。使用紧凑的线性代数符号的另一个非常重要的原因是,为机器学习模型构建的软件和硬件都针对矩阵和张量(想象一个由分层矩阵组成的对象,就像一个三维盒子而不是一个平面正方形)计算进行了优化。此外,美丽的数值线性代数领域已经解决了许多潜在问题,并为我们提供了快速执行各种矩阵计算的方法。

使用线性代数符号,我们可以将均方误差写成:

均方误差是预测基准减去真实值的修改后的 y 箭头预测基准减去修改后的 y 箭头真实基准的 t 次方左括号修改后的 y 箭头预测基准减去修改后的 y 箭头真实基准右括号等于 1 除以 m 平行于修改后的 y 箭头预测基准减去修改后的 y 箭头真实基准平行于句号

最后一个等式引入了向量的 l 平方范数,根据定义,这只是其分量的平方和的平方根。

主要观点:我们构建的损失函数编码了训练过程中涉及的数据点的预测和地面真相之间的差异,用某种范数来衡量:作为距离的数学实体。我们可以使用许多其他范数,但 l 平方范数非常受欢迎。

符号:本书中的向量始终是列向量

为了在整本书中符号一致,所有向量都是列向量。因此,如果一个向量修改后的 v 箭头有四个分量,符号修改后的 v 箭头代表的是修改后的 v 箭头代表的是 4 乘 1 矩阵第一行 v1 第二行 v2 第三行 v3 第四行 v4。

向量v →的转置始终是一个行向量。具有四个分量的上述向量的转置是v → t = v 1 v 2 v 3 v 4。

我们永远不会使用点积符号(也称为数量积,因为我们乘以两个向量,但我们的答案是一个标量)。而不是写两个向量的点积a → . b →,我们将写成a → t b →,这是一样的,但本质上将列向量视为形状为:向量的长度乘以 1的矩阵,其转置为形状为:1 乘以向量的长度的矩阵。

假设现在a →和b →有四个分量,那么

a → t b → = a 1 a 2 a 3 a 4 b 1 b 2 b 3 b 4 = a 1 b 1 + a 2 b 2 + a 3 b 3 + a 4 b 4 = ∑ i=1 4 a i b i .

此外,

∥ a → ∥ l 2 2 = a → t a → = a 1 2 + a 2 2 + a 3 2 + a 4 2 .

同样地,

∥ b → ∥ l 2 2 = b → t b → = b 1 2 + b 2 2 + b 3 2 + b 4 2 .

这样,我们在整个过程中都使用矩阵表示,并且只在字母上方加上箭头,以表明我们正在处理一个列向量。

训练、验证和测试子集

我们在损失函数中包含哪些数据点?我们包括整个数据集,其中的一些小批次,甚至只有一个点吗?我们是针对训练子集验证子集还是测试子集来测量均方误差?这些子集到底是什么?

实际上,我们将数据集分成三个子集:

  1. 训练子集:这是我们用来拟合训练函数的数据子集。这意味着这个子集中的数据点被纳入我们的损失函数中(通过将它们的特征值和标签插入到损失函数的y predict和y true中)。

  2. 验证子集:这个子集中的数据点被多种方式使用:

    • 常见的描述是,我们使用这个子集来调整机器学习模型的超参数。 超参数是机器学习模型中不是我们试图解决的训练函数的ω的任何参数。 在机器学习中,有许多这样的参数,它们的值会影响模型的结果和性能。 超参数的示例包括(您现在不必知道这些是什么):出现在梯度下降方法中的学习率,决定支持向量机方法中边缘宽度的超参数,原始数据分成训练、验证和测试子集的百分比,随机批量梯度下降时的批量大小,权重衰减超参数,例如 Ridge、LASSO 和 Elastic Net 回归中使用的超参数,带有动量方法的超参数,例如带有动量的梯度下降和 ADAM(这些方法加速了方法向最小值的收敛,这些项乘以需要在测试和部署之前进行调整的超参数),神经网络的架构,例如层数、每层的宽度,,以及优化过程中的epochs的数量(优化器已经看到整个训练子集的传递次数)。

    • 验证子集还帮助我们知道何时停止优化之前过度拟合我们的训练子集。

    • 它还作为一个测试集,用来比较不同机器学习模型在同一数据集上的性能,例如,比较线性回归模型、随机森林和神经网络的性能。

  3. 测试子集:在决定使用最佳模型(或对多个模型的结果进行平均或聚合)并训练模型之后,我们使用这个未触及的数据子集作为模型在部署到真实世界之前的最后阶段测试。由于模型之前没有见过这个子集中的任何数据点(这意味着它没有在优化过程中包含其中任何数据点),因此它可以被视为最接近真实世界情况的类比。这使我们能够在开始将其应用于全新的真实世界数据之前评估我们模型的性能。

总结

在继续之前,让我们简要回顾一下。

  • 我们当前的机器学习模型称为线性回归

  • 我们的训练函数是线性的,公式为:

y = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 x 5 .

x是特征,ω是未知的权重或参数。

  • 如果我们将特定数据点的特征值(例如第十个数据点)代入训练函数的公式中,我们就可以得到我们模型对该点的预测:

y predict 10 = ω 0 + ω 1 x 1 10 + ω 2 x 2 10 + ω 3 x 3 10 + ω 4 x 4 10 + ω 5 x 5 10 .

上标 10 表示这些值对应于第十个数据点。

  • 我们的损失函数是带有以下公式的均方误差函数:

Mean Squared Error = 1 m (y → predict -y → true ) t ( y → predict - y → true ) = 1 m ∥y → predict -y → true ∥ l 2 2 .

  • 我们想要找到最小化这个损失函数的ω的值。因此,下一步必须是解决一个最小化(优化)问题。

为了让我们的优化工作更加轻松,我们将再次使用线性代数(向量和矩阵)的便捷符号。这使我们能够将整个训练数据子集作为损失函数公式中的矩阵,并立即在训练子集上进行计算,而不是在每个数据点上分别计算。这种小小的符号操作可以避免我们在非常大的数据集上出现许多难以跟踪的组件的错误、痛苦和繁琐计算。

首先,写出我们模型对训练子集的每个数据点的预测:

y predict 1 = 1 ω 0 + ω 1 x 1 1 + ω 2 x 2 1 + ω 3 x 3 1 + ω 4 x 4 1 + ω 5 x 5 1 y predict 2 = 1 ω 0 + ω 1 x 1 2 + ω 2 x 2 2 + ω 3 x 3 2 + ω 4 x 4 2 + ω 5 x 5 2 ⋮ y predict m = 1 ω 0 + ω 1 x 1 m + ω 2 x 2 m + ω 3 x 3 m + ω 4 x 4 m + ω 5 x 5 m

我们可以轻松地将上述系统安排如下:

y predict 1 y predict 2 ⋮ y predict m = 1 1 ⋮ 1 ω 0 + x 1 1 x 1 2 ⋮ x 1 m ω 1 + x 1 1 x 2 2 ⋮ x 2 m ω 2 + x 3 1 x 3 2 ⋮ x 3 m ω 3 + x 4 1 x 4 2 ⋮ x 4 m ω 4 + x 5 1 x 5 2 ⋮ x 5 m ω 5 ,

或者更好:

美元符号开始 4 乘 1 矩阵第一行 y 下标 predict 上标 1 第二行 y 下标 predict 上标 2 第三行省略号第四行 y 下标 predict 上标 m 等于 4 乘 6 矩阵第一行第一列 1 第二列 x1 上标 1 第三列 x2 上标 1 第四列 x3 上标 1 第五列 x4 上标 1 第六列 x5 上标 1 第二行第一列 1 第二列 x1 平方第三列 x2 平方第四列 x3 平方第五列 x4 平方第六列 x5 平方第三行第一列省略号第四行第一列 1 第二列 x1 上标 m 第三列 x2 上标 m 第四列 x3 上标 m 第五列 x4 上标 m 第六列 x5 上标 m 结束矩阵开始 6 乘 1 矩阵第一行 omega0 第二行 omega1 第三行 omega2 第四行 omega3 第五行 omega4 第六行 omega5 结束矩阵。

上述方程左侧的向量是y → predict,右侧的矩阵是训练子集X与包含 1 的向量增广,右侧的最后一个向量包含了所有未知的权重。将这个向量称为ω →,然后用训练子集和ω →简洁地写成y → predict:

y → predict = X ω → .

现在我们之前写过的均方误差损失函数的公式如下:

Mean Squared Error = 1 m (y → predict -y → true ) t ( y → predict - y → true ) = 1 m ∥y → predict -y → true ∥ l 2 2

变成:

均方误差 = 1 m Xω →-y → true t X ω → - y → true = 1 m ∥Xω →-y → true ∥ l 2 2 .

我们现在准备找到最小化精心编写的损失函数的ω →。为此,我们必须访问优化的丰富而美丽的数学领域。

当训练数据具有高度相关的特征时

检查训练矩阵(附加了一个包含 1 的向量)

X = 1 x 1 1 x 2 1 x 3 1 x 4 1 x 5 1 1 x 1 2 x 2 2 x 3 2 x 4 2 x 5 2 ⋮ 1 x 1 m x 2 m x 3 m x 4 m x 5 m

出现在向量y → predict = X ω →中,均方误差损失函数的公式,以及后来确定未知ω →(也称为正规方程)的公式。

ω → = (X t X) -1 X t y → true ,

我们可以看到,如果数据的两个或更多特征(x列)高度相关,我们的模型可能会出现问题:这意味着特征之间存在强烈的线性关系,因此其中一个特征可以通过其他特征的线性组合来确定(或几乎确定)。因此,相应的特征列是不线性独立的(或接近不是线性独立的)。对于矩阵来说,这是一个问题,因为它表明矩阵要么不能被反转,要么病态。病态的矩阵在计算中产生大的不稳定性,因为训练数据的轻微变化(必须假设)会导致模型参数的大变化,从而使其预测不可靠。

我们在计算中希望得到条件良好的矩阵,因此必须消除病态条件的来源。当我们有高度相关的特征时,一个可能的途径是只在我们的模型中包含其中一个,因为其他特征并不添加太多信息。另一个解决方案是应用主成分分析等降维技术,我们将在第十一章中遇到。鱼市数据集具有高度相关的特征,附带的 Jupyter Notebook 解决了这些问题。

也就是说,重要的是要注意,一些机器学习模型,如决策树和随机森林(下文讨论),不受相关特征的影响,而其他一些模型,如当前的线性回归模型,以及接下来的逻辑回归和支持向量机模型受到了负面影响。至于神经网络模型,即使它们可以在训练过程中学习数据特征中的相关性,但当这些冗余在时间之前得到处理时,它们的表现更好,除了节省计算成本和时间。

优化

优化意味着寻找最佳、最大、最小或极端解决方案。

我们编写了一个线性训练函数

y = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 x 5 .

我们留下了它的六个参数ω 0,ω 1,ω 2,ω 3,ω 4和ω 5的值未知。目标是找到使我们的训练函数最适合训练数据子集的值,其中最适合一词是使用损失函数量化的。该函数提供了模型训练函数所做预测与真实情况的偏差程度的度量。我们希望这个损失函数很小,因此我们解决了一个最小化问题。

我们不会坐在那里尝试每个可能的ω值,直到找到使损失最小的组合。即使我们这样做了,我们也不会知道何时停止,因为我们不知道是否还有其他更好的值。我们必须对损失函数的地形有先验知识,并利用其数学特性。类比是盲目徒步穿越瑞士阿尔卑斯山vs.带着详细地图徒步穿越(图 3-7 显示了瑞士阿尔卑斯山的崎岖地形)。我们不是盲目地搜索损失函数的地形以寻找最小值,而是利用优化领域。优化是数学的一个美丽分支,提供了各种方法来高效地搜索函数的最优解及其对应的最优值。

275

图 3-7. 瑞士阿尔卑斯山:优化类似于徒步穿越函数的地形。目的地是最低谷的底部(最小化)或最高峰的顶部(最大化)。我们需要两样东西:最小化或最大化点的坐标,以及这些点的地形高度。

本章和接下来几章的优化问题如下:

min ω → Loss Function .

对于当前的线性回归模型,这是:

min ω → 1 m Xω →-y → true t X ω → - y → true = min ω → 1 m ∥Xω →-y → true ∥ l 2 2 .

当我们进行数学运算时,我们绝不能忘记我们知道什么,我们正在寻找什么。否则我们可能会陷入循环逻辑的陷阱。在上述公式中,我们知道:

  • m(训练子集中的实例数),

  • X(训练子集增加了一个全为 1 的向量),

  • 在训练子集对应的标签向量中的最小损失函数值。

我们正在寻找:

  • 最小化的ω →:我们必须找到它。

  • 在最小化的损失函数值处的ω →。

凸景观 vs. 非凸景观

最容易处理和最容易解决的方程是线性的。不幸的是,我们处理的大多数函数(和方程)都是非线性的。与此同时,这并不太不幸,因为线性的生活是平淡、无聊、乏味和无趣的。当我们手头的函数是完全非线性的时候,有时我们会在我们关心的某些点附近线性化它。这里的想法是,即使函数的整体图像可能是非线性的,我们可能能够在我们关注的局部用线性函数来近似它。换句话说,在一个非常小的邻域内,非线性函数可能看起来和行为上是线性的,尽管该邻域可能是无限小的。打个比方,想想地球从我们自己的地方看起来是平的,从高处我们只能看到它的非线性形状。当我们想要在某一点附近线性化一个函数时,我们通过计算函数对所有变量的一个导数来近似它,因为这给我们提供了近似平坦空间的斜率(它测量了近似平坦空间的倾斜度)。

令人沮丧的消息是,在一个点附近进行线性化可能不够,我们可能希望在多个位置使用线性近似。幸运的是,这是可行的,因为我们在计算上所要做的就是在几个点上评估一个导数。这将我们带到了(在线性函数之后)最容易处理的函数:分段线性函数,它们在结构上是线性的,或者在孤立点或位置上是线性的。线性规划领域处理这样的函数,其中要优化的函数是线性的,而优化发生的域的边界是分段线性的(它们是半空间的交集)。

当我们的目标是优化时,最好处理的函数要么是线性的(线性规划领域帮助我们),要么是凸的(我们不用担心陷入局部最小值,而且我们有很好的不等式帮助我们进行分析)。

在机器学习中要记住的一个重要类型的函数是两个或多个凸函数的最大值。这些函数总是凸的。线性函数是平的,因此它们同时是凸的和凹的。这很有用,因为有些函数被定义为线性函数的最大值:这些函数不一定是线性的(它们是分段线性的),但是保证是凸的。也就是说,即使我们在取线性函数的最大值时失去了线性性,但我们得到了凸性的补偿。

在神经网络中作为非线性激活函数使用的修正线性单元函数(ReLU)是一个被定义为两个线性函数的最大值的例子:R e L U ( x ) = m a x ( 0 , x )。另一个例子是支持向量机中使用的铰链损失函数:H ( x ) = m a x ( 0 , 1 - t x ),其中t是 1 或-1。

请注意,一组凸函数的最小值不能保证是凸的,它可能有双井。然而,它们的最大值肯定是凸的。

线性和凸性之间还有另一个关系:如果我们有一个凸函数(非线性,因为线性将是平凡的),那么所有保持在函数下方的线性函数的最大值恰好等于它。换句话说,凸性取代了线性性,意思是当线性性不可用时,但凸性可用时,我们可以用所有图形位于函数图形下方的线性函数的最大值来替换我们的凸函数(见图 3-8)。请记住,凸函数的图形位于任意点的切线图形上方,而切线是线性的。这为我们提供了一条直接利用线性函数简单性的路径,当我们有凸函数时。当我们考虑所有切线的最大值时,我们有相等,当我们考虑少数点的切线的最大值时,我们只有近似。

300

图 3-8。凸函数等于其所有切线的最大值。

图 3-9 和图 3-10 分别展示了非线性凸函数和非凸函数的一般景观。总的来说,凸函数的景观对于最小化问题是有利的。我们不必担心被困在局部最小值,因为对于凸函数来说,任何局部最小值也是全局最小值。非凸函数的景观有峰值、谷底和鞍点。在这样的景观上进行最小化问题会有被困在局部最小值而无法找到全局最小值的风险。

280

图 3-9。凸函数的景观对于最小化问题是有利的。我们不必担心被困在局部最小值,因为对于凸函数来说,任何局部最小值也是全局最小值。

280

图 3-10。非凸函数的景观有峰值、谷底和鞍点。在这样的景观上进行最小化问题会有被困在局部最小值而无法找到全局最小值的风险。

最后,请确保你知道凸函数、凸集和凸优化问题之间的区别,凸优化问题是在凸集上优化凸函数。

我们如何找到函数的最小值?

一般来说,有两种方法来找到函数的最小值(和/或最大值)。通常的权衡是:

  1. 只计算一个导数并缓慢收敛到最小值(尽管有加速方法可以加快收敛速度)。这些被称为梯度方法。梯度是多个变量的函数的一个导数。例如,我们的损失函数是多个ω的函数(或一个向量ω →)。

  2. 计算两个导数(在计算上更昂贵,尤其是当我们有成千上万个参数时,这是一个大的缺点),并更快地收敛到最小值。可以通过近似第二导数来节省一些计算成本,而不是精确计算它。第二导数方法被称为牛顿方法。Hessian(二阶导数的矩阵)或 Hessian 的近似出现在这些方法中。

我们从不需要计算超过两个导数。

但是为什么函数的一阶和二阶导数对于找到其最优解如此重要呢?简洁的答案是,一阶导数包含了函数在某一点上增加或减少的速度信息(因此如果你按照它的方向,你可能会上升到最大值或下降到最小值),而二阶导数包含了函数的“碗”的形状信息,它是向上弯曲还是向下弯曲。

微积分中的一个关键思想仍然是基本的:极小值(和/或极大值)发生在临界点(定义为函数的一个导数为零或不存在的点)或边界点。因此,为了找到这些最优解,我们必须搜索边界点(如果我们的搜索空间有边界)内部临界点。

我们如何找到搜索空间内部的临界点?

方法 1

我们按照这些步骤进行。

  • 找到我们函数的一个导数(不太糟糕,我们在微积分中都做过),

  • 然后将其设置为零(我们都可以写出等于和零的符号),

  • 并解出使我们的导数为零的ω(这是一个糟糕的步骤!)。

对于其导数是线性的函数,比如我们的均方误差损失函数,解这些ω是相对容易的。线性代数领域特别是为了帮助解线性方程组而建立的。数值线性代数领域是为了帮助解决现实和大型的线性方程组而建立的,其中病态条件很普遍。当我们的系统是线性的时,我们有很多可用的工具(和软件包)。

另一方面,当我们的方程是非线性的时,找到解是完全不同的故事。这成为了一个碰运气的游戏,大多数情况下都是运气不佳!以下是一个简短的例子,说明了解线性和非线性方程之间的差异:

解线性方程

找到ω,使得0 . 002 ω - 5 = 0。

解决方案:将 5 移到另一边,然后除以 0.002,我们得到ω = 5 / 0 . 002 = 2500。完成。

解非线性方程

找到ω,使得0 . 002 sin ( ω ) - 5 ω 2 + e ω = 0。

解决方案:是的,我要离开了。我们需要一个数值方法!(见图 3-11 以图形逼近解这个非线性方程的解)。

275

图 3-11。解非线性方程很困难。在这里,我们绘制f ( ω ) = 0 . 002 sin ( ω ) - 5 ω 2 + e ω并在图上近似其三个根(使f ( ω ) = 0的点)。

有许多数值技术专门用于求解非线性方程的解(以及专门用于数值求解非线性常微分方程和偏微分方程的整个领域)。这些方法找到近似解,然后提供数值解与精确解相差多远的界限。它们通常构造一个在某些条件下收敛到解析解的序列。有些方法收敛速度比其他方法快,并且更适合某些问题而不适合其他问题。

方法 2

另一个选择是沿着梯度方向前进,以便向最小值下降或向最大值上升。

要理解这些梯度类型的方法,可以想象下山徒步旅行(或者如果方法加速或具有动量,则滑雪下山)。我们从搜索空间中的一个随机点开始,这将使我们处于函数景观的初始高度水平。现在,该方法将我们移动到搜索空间中的一个新点,希望在这个新位置,我们最终到达的高度水平比我们来自的高度水平更低。因此,我们将下降。我们重复这个过程,理想情况下,如果函数的地形配合,这些点的序列将收敛到我们正在寻找的函数的最小化器。

当然,对于函数的景观具有许多峰和谷的情况,我们从哪里开始,或者换句话说,如何初始化,很重要,因为我们可能下降到与我们想要到达的完全不同的山谷。我们可能最终会陷入局部最小值而不是全局最小值。

凸函数和下界有界的函数的形状像沙拉碗,因此我们不必担心被困在局部最小值处,远离全局最小值。凸函数可能存在另一个令人担忧的问题:当函数的碗形太窄时,我们的方法可能变得非常缓慢。我们将在下一章中详细讨论这一点。

方法 1 和方法 2 都很有用且受欢迎。有时,我们别无选择,只能使用其中一种,这取决于每种方法在特定设置下收敛的速度有多快,我们试图优化的函数有多“规则”(它有多少良好的导数),等等。有时,这只是品味的问题。对于线性回归的均方误差损失函数,两种方法都适用,所以我们将使用方法 1,只是因为我们将在本书中对所有其他损失函数使用梯度下降方法。

我们必须提到,对于下降方法的登山下山类比是很好的,但有点误导。当我们人类下山时,我们在物理上属于与我们的山脉景观存在的相同三维空间,这意味着我们处于某个海拔高度,我们能够下降到更低海拔的位置,即使我们被蒙住眼睛,即使天气雾蒙蒙,我们只能一步一步地下降。我们感知海拔然后向下移动。另一方面,数值下降方法并不在与函数景观嵌入的相同空间维度中搜索最小值。相反,它们在地面上搜索,即函数景观的一维下方(参见图 3-12)。这使得朝向最小值的下降变得更加困难,因为在地面上,我们可以从任意一点移动到任何其他点,而不知道我们上方存在什么高度水平,直到我们在该点评估函数本身并找到高度。因此,我们的方法可能会意外地将我们从一个具有某个海拔高度的地面点移动到另一个具有更高海拔高度的地面点,因此离最小值更远。这就是为什么在地面上定位一个快速减小函数高度的方向以及我们在地面上可以移动多远(步长)而仍然减小我们上方函数高度的重要性。步长也称为学习率超参数,每当我们使用下降方法时都会遇到。

250

图 3-12。搜索最小值发生在地面上,而不是直接在函数的景观上。

回到我们的主要目标:我们想要找到最佳的ω →,以便为我们的训练函数最小化均方误差损失函数,方法 1:对损失函数进行一阶导数,并将其设置为零,然后解出向量ω →。为此,我们需要掌握对线性代数表达式进行微积分。让我们首先回顾一下我们的微积分课程。

微积分简介

在微积分的第一门课程中,我们学习关于单变量函数(f ( ω ))及其图形,并在特定点进行评估。然后我们学习数学分析中最重要的操作:极限。从极限概念中,我们定义函数的连续性和不连续性,点的导数f ' ( ω )(通过点的切线斜率的极限)和域上的积分(由函数在域上确定的小区域的和的极限)。我们以微积分基本定理结束课程,将积分和微分作为反向操作进行关联。导数的关键特性之一是它确定函数在某一点的增长或减少速度,因此,在其定义域的内部定位函数的最小值和/或最大值中起着至关重要的作用(边界点是分开的)。

在多变量微积分课程中,通常是微积分的第三门课程,许多概念从单变量微积分中转移,包括导数的重要性,现在称为梯度,因为我们有几个变量,用于定位任何内部最小值和/或最大值。函数f ( ω → )的梯度∇ ( f ( ω → ) )是函数对于变量向量ω →的导数。

在深度学习中,未知的权重是以矩阵而不是向量的形式组织的,因此我们需要对变量矩阵W的函数f ( W )进行导数。

对于我们在 AI 中的目的,我们需要计算导数的函数是损失函数,其中包含了训练函数。根据导数的链式法则,我们还需要计算对于ω的训练函数的导数。

让我们使用单变量微积分的一个简单例子来演示,然后立即过渡到对线性代数表达式进行导数运算。

一维优化示例

找到函数f ( ω ) = 3 + (0.5ω-2) 2在区间[-1,6]上的最小值(如果有的话)和最小值。

一个不可能的长方法是尝试在-1 和 6 之间尝试无限多个ω的值,并选择给出最低f值的ω。另一种方法是使用我们的微积分知识,即优化器(最小化器和/或最大化器)发生在临界点(导数不存在或为零)或边界点。有关参考,请参阅图 3-13。

275

图 3-13。函数的最小值f ( ω ) = 3 + (0.5ω-2) 2在区间[-1,6]上是 3,并且发生在临界点ω = 4。在这个临界点,函数的导数为零,这意味着如果我们画一条切线,它将是水平的。

我们的边界点是*-16*,所以我们首先在这些点上评估我们的函数:f ( - 1 ) = 3 + (0.5(-1)-2) 2 = 9 . 25 和 f ( 6 ) = 3 + (0.5(6)-2) 2 = 4 。显然,-1不是一个最小化器,因为f(6)<f(-1),所以这个边界点退出了竞争,现在只有边界点6与内部临界点竞争。为了找到我们的临界点,我们检查区间*[-1,6]内函数的导数:f ' ( ω ) = 0 + 2 ( 0 . 5 ω - 2 ) 0 . 5 = 0 . 25 ( 0 . 5 ω - 2 ) 。将这个导数设为零,我们有0 . 25 ( 0 . 5 ω - 2 ) = 0 意味着ω = 4 。因此,我们只在区间*[-1,6]的内部找到了一个临界点ω = 4。在这个特殊点,函数的值是f ( 4 ) = 3 + (0.5(4)-2) 2 = 3 。由于f的值在这里是最低的,显然我们已经找到了我们最小化竞赛的赢家,即ω = 4,最小的f值等于3*。

我们经常使用的线性代数表达式的导数

在涉及向量和矩阵的表达式上直接计算导数是高效的,而不必将它们分解成它们的分量。以下两种方法很受欢迎:

  1. a和ω是标量且a是常数时,f ( ω ) = a ω的导数是f ' ( ω ) = a。当a →和ω →是向量(长度相同)且a →的条目是常数时,f ( ω → ) = a → t ω →的梯度是∇ f ( ω → ) = a →。同样,f ( ω → ) = w → t a →的梯度是∇ f ( ω → ) = a →。

  2. s是标量且常数,ω是标量时,二次函数f ( ω ) = s ω 2的导数是f ' ( ω ) = 2 s ω。类似的高维情况是当S是具有常数条目的对称矩阵时,函数f ( ω → ) = ω → t S ω →是二次的,其梯度是∇ f ( ω → ) = 2 S ω →。

最小化均方误差损失函数

我们终于准备好最小化均方误差损失函数了。

L ( ω → ) = 1 m Xω →-y → true t X ω → - y → true .

让我们在将其梯度展开并将其设置为零之前打开上述表达式:

数学符号开始布局第一行第一列上方 L 左括号修改上方 omega 箭头右括号第二列等于分数 1/m 左括号左括号上方 X 修改上方 omega 箭头右括号上标 t 减去上方 y 箭头下标 true 上标 t 右括号左括号上方 X 修改上方 omega 箭头减去上方 y 箭头下标 true 右括号第二行第一列空第二列等于分数 1/m 左括号上方 omega 箭头上标 t 上方 X 上标 t 减去上方 y 箭头下标 true 上标 t 右括号左括号上方 X 修改上方 omega 箭头减去上方 y 箭头下标 true 右括号第三行第一列空第二列等于分数 1/m 左括号上方 omega 箭头上标 t 上方 X 上标 t 上方 X 修改上方 omega 箭头减去上方 omega 箭头上标 t 上方 X 上标 t 上方 y 箭头下标 true 减去上方 y 箭头下标 true 上标 t 上方 X 修改上方 omega 箭头加上上方 y 箭头下标 true 上标 t 上方 y 箭头下标 true 右括号第四行第一列空第二列等于分数 1/m 左括号上方 omega 箭头上标 S 上方 omega 箭头减去上方 omega 箭头上标 t 上方 a 箭头减去上方 a 箭头上标 t 上方 omega 箭头加上上方 y 箭头下标 true 上标 t 上方 y 箭头下标 true 右括号,结束布局。

在最后一步中,我们设置了X t X = S和X t y → true = a →。接下来,对上述表达式关于ω →的梯度进行计算,并将其设置为零。在计算梯度时,我们使用了上面小节中学到的关于线性代数表达式的微分知识:

∇ L ( ω → ) = 1 m 2 S ω → - a → - a → + 0 = 0 →

现在很容易解出ω →:

1 m 2 S ω → - 2 a → = 0 →

所以

2 S ω → = 2 a →

这给出了

ω → = S -1 a →

现在回想一下,我们设置了S = X t X和a → = X t y true,所以让我们用训练集X(增加了 1)和相应的标签向量y → true来重新写我们的最小化ω →:

ω → = (X t X) -1 X t y → true .

对于 Fish Market 数据集,这将是(请参阅附带的 Jupyter 笔记本):

ω → = ω 0 ω 1 ω 2 ω 3 ω 4 ω 5 = - 475 . 19929130109716 82 . 84970118 - 28 . 85952426 - 28 . 50769512 29 . 82981435 30 . 97250278

注意:将大矩阵相乘非常昂贵。请改为将矩阵乘以向量。

尽量避免相乘矩阵,而是用向量相乘。例如,在正规方程ω → = (X t X) -1 X t y → true,首先计算X t y → true,避免计算(X t X) -1。解决这个问题的方法是使用X伪逆来解决线性系统X ω → = y → true(查看附带的 Jupyter 笔记本)。我们将在第十一章中讨论伪逆,但现在,它允许我们求解(相当于除以)没有逆的矩阵。

我们只是找到了权重向量ω →,它能够在我们的训练数据和线性回归训练函数之间提供最佳拟合:

f ( ω → ; x → ) = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 x 5 .

我们使用了一种分析方法(计算损失函数的梯度并将其置为零)来推导正规方程给出的解决方案。这是我们能够推导出解析解的非常罕见的情况之一。所有其他找到最小化ω →的方法都是数值方法。

注意:我们永远不希望训练数据拟合得太好。

我们计算的ω → = (X t X) -1 X t y → true给出了使训练函数最佳拟合训练数据的ω值,但是过于拟合意味着训练函数可能也会捕捉到数据中的噪音而不仅仅是信号。因此,上述解决方案,甚至是最小化问题本身,需要进行修改,以不要获得过于完美的拟合正则化提前停止在这里是有帮助的。我们将在下一章节中花一些时间来讨论这些问题。

这是回归的长路。因为我们刚刚开始,所以我们必须通过微积分和线性代数。介绍即将到来的机器学习模型:逻辑回归、支持向量机、决策树和随机森林,将会更快,因为我们所做的一切都是将完全相同的思想应用于不同的函数。

逻辑回归:分类为两类

逻辑回归主要用于分类任务。我们首先解释如何将这个模型用于二元分类任务(将数据分类为两类,例如癌症/非癌症;适合儿童/不适合儿童;可能偿还贷款/不太可能等)。然后我们将模型推广到将数据分类为多个类别(例如,将手写数字图像分类为 0、1、2、3、4、5、6、7、8 或 9)。同样,我们有相同的数学设置:

  1. 训练函数

  2. 损失函数

  3. 优化

训练函数

与线性回归类似,逻辑回归的训练函数计算特征的线性组合并添加一个常数偏差项,但是不是直接输出结果,而是通过逻辑函数,其图在图 3-14 中绘制,其公式为:

σ ( s ) = 1 1+e -s275

图 3-14. 逻辑函数的图形 σ ( s ) = 1 1+e -s。注意,这个函数可以在任何s处进行评估,并始终输出介于01之间的数字,因此其输出可以被解释为概率。

这是一个只接受值在01之间的函数,因此它的输出可以被解释为数据点属于某一类的概率:如果输出小于0.5,则将数据点分类为属于第一类,如果输出大于0.5,则将数据点分类为另一类。数字0.5是做出分类数据点决定的阈值

因此,这里的训练函数最终是特征的线性组合,加上偏差,首先与逻辑函数组合,最后与阈值函数组合:

y = T h r e s h ( σ ( ω 0 + ω 1 x 1 + ⋯ + ω n x n ) )

与线性回归情况类似,ω 是我们需要优化损失函数的未知数。就像线性回归一样,这些未知数的数量等于数据特征的数量,再加上一个偏差项。对于像分类图像这样的任务,每个像素都是一个特征,所以我们可能有成千上万个。

损失函数

让我们为分类设计一个良好的损失函数。我们是工程师,我们希望惩罚错误分类的训练数据点。在我们的标记数据集中,如果一个实例属于一个类,那么它的y true = 1,如果不属于,则y true = 0。

我们希望我们的训练函数输出y predict = 1,对于属于正类的训练实例(其y true也为 1)。成功的ω值应该给出一个较高的t值(线性组合步骤的结果),以进入逻辑函数,从而为正实例分配高概率,并通过 0.5 阈值获得y predict = 1。因此,如果线性组合加偏差步骤给出一个较低的t值,而y true = 1,则对其进行惩罚。

类似地,成功的权重值应该给出一个较低的t值,以进入逻辑函数,用于不属于该类的训练实例(它们真实的y true = 0)。因此,如果线性组合加偏差步骤给出一个较高的t值,而y true = 0,则对其进行惩罚。

那么我们如何找到一个惩罚错误分类的训练数据点的损失函数呢?假阳性和假阴性都应该受到惩罚。回想一下,这个分类模型的输出要么是1,要么是0

  • 想象一下奖励1并惩罚0的微积分函数:- log ( s )(见图 3-15)。

  • 考虑一个对1进行惩罚并对0进行奖励的微积分函数:- log ( 1 - s )(见图 3-15)。

275

图 3-15. 左:函数f ( s ) = - l o g ( s )的图。该函数为接近0的数字分配高值,并为接近1的数字分配低值。右:函数f ( s ) = - l o g ( 1 - s )的图。该函数为接近1的数字分配高值,并为接近0的数字分配低值。

现在关注当前选择的ω的逻辑函数σ ( s )的输出:

  • 如果σ ( s )小于0.5(模型预测为y predict = 0),但真实值y true = 1(假阴性),则通过惩罚- log ( σ ( s ) )让模型付出代价。如果相反地σ ( s ) > 0 . 5,即模型预测为y predict = 1(真阳性),- log ( σ ( s ) )很小,因此不需要付出高惩罚。

  • 同样,如果σ ( s )大于0.5,但真实值y true = 0(假阳性),则通过惩罚- log ( 1 - σ ( s ) )让模型付出代价。同样,对于真阴性也不需要付出高惩罚。

因此,我们可以将误分类一个训练实例的成本写成:

c o s t = - log ( σ ( s ) ) if y true = 1 - log ( 1 - σ ( s ) ) if y true = 0 = - y true log ( σ ( s ) ) - ( 1 - y true ) log ( 1 - σ ( s ) )

最后,损失函数是m个训练实例的平均成本,给出了流行的交叉熵损失函数的公式。

L ( ω → ) = - 1 m ∑ i=1 m y true i log ( σ ( ω 0 + ω 1 x 1 i + ⋯ + ω n x n i ) ) + ( 1 - y true i ) log ( 1 - σ ( ω 0 + ω 1 x 1 i + ⋯ + ω n x n i ) )

优化

与线性回归情况不同,如果我们决定通过设置∇ L ( ω ) = 0来最小化损失函数,那么ω没有封闭形式的解析解。好消息是这个函数是凸函数,所以下一章的梯度下降(或随机或小批量梯度下降)保证能找到最小值(如果学习率不是太大,并且等待足够长的时间)。

Softmax 回归:多类分类

我们可以很容易地将逻辑回归的思想推广到多类分类。一个著名的非二进制分类任务的例子是使用MNIST 数据集对手写数字 0、1、2、3、4、5、6、7、8 和 9 进行分类。这个数据集包含了 70,000 张手写数字的图像(见图 3-16 中这些图像的样本),分为 60,000 张训练子集和 10,000 张测试子集。每个图像都标有它所属的类别,即这十个数字中的一个。

275

图 3-16。MNIST 数据集的样本图像。(图片来源:维基百科)

此数据集的链接还包含许多分类模型的结果,包括线性分类器、k 最近邻决策树、带有各种支持向量机,以及具有各种架构的神经网络,以及相应论文的参考文献和发表年份。看到随着年份的推移和方法的演变,性能的进展是很有趣的。

注意:不要将多类别分类与多输出模型混淆

Softmax 回归一次预测一个类别,所以我们不能用它来分类,例如,在同一张图像中的五个人。相反,我们可以用它来检查给定的 Facebook 图像是否是我的照片,我的妹妹的照片,我的哥哥的照片,我的丈夫的照片,或者我的女儿的照片。传入 softmax 回归模型的图像只能有我们五个人中的一个,否则模型的分类就不太明显。这意味着我们的类别必须是相互排斥的。所以当 Facebook 自动在同一张图像中标记五个人时,它们使用的是一个多输出模型,而不是 softmax 回归模型。

假设我们有数据点的特征,并且我们想要利用这些信息来将数据点分类到k个可能的类别中。以下的训练函数、损失函数和优化过程现在应该是清楚的。

关于图像数据的特征

对于灰度图像,每个像素强度都是一个特征,所以图像通常有成千上万个特征。灰度图像通常表示为数字的二维矩阵,像素强度作为矩阵的条目。彩色图像有三个通道,红色、绿色和蓝色,每个通道再次表示为数字的二维矩阵,并且通道叠加在彼此之上,形成三层二维矩阵。这种结构称为张量。查看这个[链接的 Jupyter 笔记本],它说明了我们如何在 Python 中处理灰度和彩色图像。

训练函数

第一步总是相同的:线性组合特征并添加一个常数偏差项。在逻辑回归中,当我们只有两个类别时,我们将结果传递到逻辑函数中,公式如下:

σ ( s ) = 1 1+e -s = 1 1+1 e s = e s 1+e s = e s e 0 +e s ,

我们将其解释为数据点属于感兴趣类别的概率或不属于的概率。请注意,我们将逻辑函数的公式重写为,以突出它捕捉了两个概率,每个类别一个。换句话说,给出了数据点属于感兴趣类别的概率,而给出了数据点不属于该类别的概率。

当我们有多个类别而不仅仅是两个时,对于同一个数据点,我们重复相同的过程多次:每个类别一次。每个类别都有自己的偏差和一组权重,线性组合特征,因此,给定具有特征值,,...和的数据点,我们计算k不同的线性组合加上偏差:

s 1 = ω 0 1 + ω 1 1 x 1 + ω 2 1 x 2 + ⋯ + ω n 1 x n s 2 = ω 0 2 + ω 1 2 x 1 + ω 2 2 x 2 + ⋯ + ω n 2 x n ⋮ s k = ω 0 k + ω 1 k x 1 + ω 2 k x 2 + ⋯ + ω n k x n .

养成良好习惯

你想养成一个良好的习惯,即跟踪你的训练函数中有多少未知的ω出现在公式中。记住,这些是我们通过最小化损失函数找到的ω。另一个良好的习惯是以高效和一致的方式组织它们在模型中(在向量、矩阵等中)。在 softmax 情况下,当我们有 k 个类别和每个数据点的 n 个特征时,我们最终得到 k×n 个ω用于线性组合,然后 k 个偏差,总共有 k×n 加 k 个未知的ω。例如,如果我们使用 softmax 回归模型来对手写数字的MNIST 数据集中的图像进行分类,每个图像有 28×28 个像素,即 784 个特征,我们想将它们分类为 10 个类别,因此我们最终需要优化 7850 个ω。对于线性和逻辑回归模型,我们只需要优化 n 加 1 个未知的ω。

接下来,我们将这k个结果传递到一个称为softmax 函数的函数中,该函数将逻辑函数从两个类推广到多个类,并且我们也将其解释为概率。Softmax 函数的公式如下:

σ ( s j ) = e s j e s 1 +e s 2 +⋯+e s k

这样,同一个数据点将得到k个概率分数,每个分数对应一个类别。最后,我们将数据点分类为获得最大概率分数的类别。

汇总以上所有内容,我们得到了训练函数的最终公式,现在我们可以用于分类(也就是在通过最小化适当的损失函数找到最优的ω值之后):

y = j such that σ ( ω 0 j + ω 1 j x 1 + ⋯ + ω n j x n ) is maximal.

请注意,对于上述训练函数,我们所需做的就是输入数据特征(x值),它将返回一个类别编号:j

损失函数

我们推导了逻辑回归的交叉熵损失函数:

L ( ω → ) = - 1 m ∑ i=1 m y true i log ( σ ( ω 0 + ω 1 x 1 i + ⋯ + ω n x n i ) ) + ( 1 - y true i ) log ( 1 - σ ( ω 0 + ω 1 x 1 i + ⋯ + ω n x n i ) ) ,

使用

c o s t = - log ( σ ( s ) ) if y true = 1 - log ( 1 - σ ( s ) ) if y true = 0 = - y true log ( σ ( s ) ) - ( 1 - y true ) log ( 1 - σ ( s ) )

现在我们将相同的逻辑推广到多个类别。让我们使用符号 y true,i = 1 来表示,如果某个数据点属于第 i 类,则为 1,否则为零。然后我们有与将某个数据点误分类相关的成本:

c o s t = - log ( σ ( s 1 ) ) if y true,1 = 1 - log ( σ ( s 2 ) ) if y true,2 = 1 - log ( σ ( s 3 ) ) if y true,3 = 1 ⋮ - log ( σ ( s k ) ) if y true,k = 1 = - y true,1 log ( σ ( s 1 ) ) - ⋯ - y true,k log ( σ ( s k ) ) .

在训练集中对所有m个数据点进行平均,我们得到广义交叉熵损失函数,将交叉熵损失函数从只有两类的情况推广到多类的情况:

L ( ω → ) = - 1 m ∑ i=1 m y true,1 i log ( σ ( ω 0 1 + ω 1 1 x 1 i + ⋯ + ω n 1 x n i ) ) + y true,2 i log ( σ ( ω 0 2 + ω 1 2 x 1 i + ⋯ + ω n 2 x n i ) ) + ⋯ + y true,k i log ( σ ( ω 0 k + ω 1 k x 1 i + ⋯ + ω n k x n i ) )

优化

现在我们有了损失函数的公式,我们可以搜索它的最小化ω。由于我们将遇到的大多数损失函数都没有关于训练集和它们的目标标签的最小化的显式公式,因此我们将使用数值方法来寻找最小化值,特别是:下一章的梯度下降、随机梯度下降或小批量梯度下降。同样,广义交叉熵损失函数的凸性有助于我们在最小化过程中,因此我们保证能找到我们寻求的ω。

关于交叉熵和信息论的说明

交叉熵概念源自信息论。我们将在本章后面讨论决策树时详细说明。现在,请记住以下数量,其中p是事件发生的概率:

log ( 1 p ) = - log ( p )

p较小时,上述数量较大,因此,它量化了不太可能事件的更大惊喜

关于逻辑函数和 softmax 函数以及统计力学的说明

如果您熟悉统计力学,您可能已经注意到逻辑函数和 softmax 函数以与统计力学领域的配分函数相同的方式计算概率,计算系统处于某种状态的概率。

将上述模型纳入神经网络的最后一层

线性回归模型通过适当地线性组合数据特征进行预测,然后加入偏差。逻辑回归和 softmax 回归模型通过适当地线性组合数据特征,加入偏差,然后将结果传递到概率评分函数中进行分类。在这些简单模型中,数据的特征仅被线性组合,因此,这些模型在捕捉数据特征之间潜在重要的非线性交互方面较弱。神经网络模型将非线性的激活函数纳入其训练函数中,并在多个层次上进行,因此更适合检测非线性和更复杂的关系。神经网络的最后一层是其输出层。倒数第二层将一些高阶特征输出并输入到最后一层。如果我们希望网络将数据分类为多个类别,那么我们可以将最后一层设为 softmax 层;如果我们希望将其分类为两个类别,那么我们的最后一层可以是逻辑回归层;如果我们希望网络预测数值,那么我们可以将其最后一层设为回归层。我们将在第五章中看到这些示例。

其他流行的机器学习技术和技术集成

在回归和逻辑回归之后,重要的是要涉足机器学习社区,并学习一些最流行的分类和回归任务技术背后的思想。支持向量机决策树随机森林非常强大和流行,能够执行分类和回归任务。自然的问题是,我们何时使用特定的机器学习方法,包括线性和逻辑回归,以及后来的神经网络?我们如何知道使用哪种方法并基于我们的结论和预测?这些是数学分析机器学习模型的类型的问题。

由于对每种方法的数学分析,包括它通常最适合的数据集类型,现在才开始受到严肃关注,这是在最近增加了对人工智能、机器学习和数据科学研究的资源分配之后。目前的做法是在同一数据集上尝试每种方法,并使用结果最好的那种。也就是说,假设我们有必要的计算和时间资源来尝试不同的机器学习技术。更好的是,如果你有时间和资源来训练各种机器学习模型(并行计算在这里非常完美),那么集成方法会将它们的结果组合起来,无论是通过平均还是投票,讽刺的是,数学上是合理的,会比最好的个体表现者取得更好的结果,甚至当最好的表现者是弱表现者时也是如此!

一个集成的例子是随机森林:它是一组决策树的集成。

当我们基于集成进行预测时,行业术语如bagging(或bootstrap aggregating)、pastingboosting(比如ADA boostGradient boosting)、stackingrandom patches会出现。Bagging 和 pasting 在训练集的不同随机子集上训练相同的机器学习模型。Bagging 使用替换从训练集中抽取实例,而 pasting 则不使用替换。Random patches也从特征空间中抽样,每次在随机特征子集上训练机器学习模型。当数据集具有许多特征时,比如图像(其中每个像素都是一个特征),这是非常有帮助的。Stacking学习集成的预测机制,而不是简单的投票或平均值。

支持向量机

支持向量机是一种极其流行的机器学习方法,能够在具有线性(平面)和非线性(曲线)决策边界的情况下执行分类和回归任务。

对于分类,该方法寻求使用尽可能宽的间隔来分离标记数据,从而产生最佳的分隔高速公路,而不是薄薄的分隔线。让我们解释一下支持向量机如何在本章的训练函数、损失函数和优化的结构上对标记数据实例进行分类。

训练函数

我们再次使用未知权重ω的数据点的特征进行线性组合,并添加偏差ω 0。然后通过sign函数得到答案:如果特征的线性组合加上偏差是一个正数,返回 1(或分类为第一类),如果是负数,返回-1(或分类为另一类)。因此,训练函数的公式变为:

f ( ω → ; x → ) = s i g n ( ω → t x → + ω 0 )

损失函数

我们必须设计一个损失函数,惩罚错误分类的点。对于逻辑回归,我们使用交叉熵损失函数。对于支持向量机,我们的损失函数基于一个称为hinge loss function的函数:

max ( 0 , 1 - y true ( ω → t x → + ω 0 ) ) .

让我们看看铰链损失函数如何惩罚分类错误。首先,回想一下y true是 1 或-1,取决于数据点是属于正类还是负类。

  • 如果对于某个数据点y true为 1,但ω → t x → + ω 0 < 0,训练函数将错误分类,并给出y predict = - 1,而铰链损失函数的值将为1 - ( 1 ) ( ω → t x → + ω 0 ) > 1,这是一个高惩罚,当你的目标是最小化时。

  • 另一方面,如果y true为 1 且ω → t x → + ω 0 < 0,训练函数将正确分类它并给出y predict = 1。然而,铰链损失函数设计成这样,即使ω → t x → + ω 0 < 1,它仍会对我们进行惩罚,其值将为1 - ( 1 ) ( ω → t x → + ω 0 ),现在小于 1 但仍大于零。

  • 只有当y true为 1 且ω → t x → + ω 0 < 1(训练函数仍然会正确分类这一点,并给出y predict = 1),则铰链损失函数值将为零,因为它将是零和负量之间的最大值。

  • 当y true为-1 时,相同的逻辑适用:铰链损失函数会对错误的预测进行严厉惩罚,对正确的预测进行轻微惩罚,但如果它与“零除数”(大于 1 的边距)的距离不够远,它将进行惩罚,并且仅当预测正确且该点距离“零除数”大于 1 时才返回零。

  • 请注意,零分隔器的方程式为ω → t x → + ω 0 = 0,边缘边缘的方程式为ω → t x → + ω 0 = - 1和ω → t x → + ω 0 = 1。边缘边缘之间的距离很容易计算为2 ∥ω∥ 2。因此,如果我们想要增加这个边缘宽度,我们必须减少∥ω∥ 2,因此,这个术语必须进入损失函数,以及 hingle 损失函数,惩罚误分类的点和边缘边界内的点。

现在,如果我们将所有 m 个数据点在训练集中的 hinge 损失平均,并添加∥ω∥ 2 2,我们就得到了支持向量机常用的损失函数公式:

L ( ω → ) = 1 m ∑ i=1 m max ( 0 , 1 - y true i ( ω → t x → i + ω 0 ) ) + λ ∥ω∥ 2 2

优化

我们现在的目标是寻找最小化损失函数的w →。让我们观察这个损失函数一分钟:

  • 它有两个项:1 m ∑ i=1 m max ( 0 , 1 - y true i ( ω → t x → i + ω 0 ) )和λ ∥ ω → ∥ 2 2。每当我们在优化问题中有多个项时,很可能它们是竞争项,也就是说,使第一项小且快乐的相同ω值可能会使第二项大且悲伤。因此,在寻找优化它们的和的ω →时,它是两个项之间的推拉游戏。

  • 与λ ∥ ω → ∥ 2 2 项一起出现的λ是我们可以在训练过程的验证阶段调整的模型超参数的一个例子。请注意,控制λ的值有助于我们控制边缘的宽度:如果我们选择一个较大的λ值,优化器将忙于选择具有非常低∥ω∥ 2 2的ω →,以补偿较大的λ,并且损失函数的第一项将受到较少的关注。但请记住,较小的∥ω∥ 2意味着更大的边缘!

  • λ ∥ ω → ∥ 2 2 项也可以被视为正则化项,我们将在下一章中讨论。

  • 这个损失函数是凸的,并且下界为零,所以它的最小化问题并不太糟糕:我们不必担心陷入局部最小值。第一项具有奇点,但正如我们之前提到的,我们可以在奇异点定义其次梯度,然后应用下降方法。

一些优化问题可以被重新表述,而不是解决原始的原始问题,我们最终解决它的对偶问题!通常,一个问题比另一个更容易解决。我们可以将对偶问题看作是原始问题的平行宇宙中的另一个优化问题。这些宇宙在优化器处相遇。因此,解决一个问题会自动给出另一个问题的解。我们在研究优化时研究对偶性。特别感兴趣和应用广泛的领域是线性和二次优化,也称为线性和二次规划。我们目前有的最小化问题:

min ω → 1 m ∑ i=1 m max ( 0 , 1 - y true i ( ω → t x → i + ω 0 ) ) + λ ∥ω∥ 2 2

这是二次规划的一个例子,它有一个对偶问题的公式,结果比原问题更容易优化(特别是当特征数量很高时):

max α → ∑ j=1 m α j - 1 2 ∑ j=1 m ∑ k=1 m α j α k y true j y true k ( (x → j ) t x → k )

受到约束条件 α j ≥ 0 和 ∑ j=1 m α j y true j = 0 。当我们学习原始问题和对偶问题时,编写上述公式通常是直接的,因此我们跳过推导,以免打断我们的流程。

二次规划是一个非常成熟的领域,有许多软件包可以解决这个问题。一旦我们找到最大化的 α →,我们可以找到向量 ω →,使用 ω → = ∑ j=1 m α j y true i x → j 最小化原始问题。一旦我们有了 ω →,我们可以使用我们现在训练过的函数对新数据点进行分类:

f ( x → new ) = s i g n ( ω → t x → new + ω 0 ) = s i g n ( ∑ j α j y i (x → j ) t x → new + ω 0 ) .

如果你想避免二次规划,还有另一种非常快速的方法叫做坐标下降,它解决了对偶问题,并且在具有大量特征的大数据集上表现非常好。

核技巧:我们可以将相同的思想应用于非线性分类

关于对偶问题的一个非常重要的注意事项:数据点只出现在一对中,更具体地说,只出现在一个标量积中,即。同样,它们只在训练函数中作为标量积出现。这个简单的观察可以产生魔法:

  • 如果我们找到一个函数,可以应用于数据点对,并且恰好给出我们转换后的数据点对的标量积到某个更高维度的空间(而不知道实际的转换是什么),那么我们可以通过用替换对偶问题公式中的标量积,在更高维度空间中解决完全相同的对偶问题。

  • 这里的直觉是,在低维度中非线性可分的数据几乎总是在高维度中线性可分。因此,将所有数据点转换到更高的维度,然后进行分离。核技巧解决了在更高维度中的线性分类问题,而不需要转换每个点。核本身评估了转换数据的点积,而不需要转换数据。非常酷的东西。

核函数的示例包括:

  • 多项式核:K ( x → j , x → j ) = (1+(x → j ) t x → j ) d .

  • 高斯核:K ( x → j , x → j ) = e -γ|x j -x k | 2 .

决策树

本章的驱动主题是一切都是一个函数,决策树本质上是一个以布尔变量作为输入的函数(这些变量只能假定为true(或 1)或false(或 0)值),例如:特征>5,特征=晴天,特征=男性,,并输出决策,例如:批准贷款,分类为 covid19,返回 25,。我们使用逻辑运算符,而不是添加或乘以布尔变量。

但是,如果我们的特征在原始数据集中不是布尔变量怎么办?那么我们必须在将它们馈送到模型进行预测之前将它们转换为布尔变量。例如,图 3-17 中的决策树是在 Fish Market 数据集上训练的。它是一个回归树。该树采用原始数据,但表示树的函数实际上是在新变量上操作的,这些新变量是原始数据特征转换为布尔变量:

  1. a1=(Width ≤ 5.117)

  2. a2=(Length3 ≤ 59.55)

  3. a3=(Length3 ≤ 41.1)

  4. a4=(Length3 ≤ 34.9)

  5. a5=(Length3 ≤ 27.95)

  6. a6=(Length3 ≤ 21.25)

400

图 3-17. 基于 Fish Market 数据集构建的回归决策树。有关详细信息,请参阅附带的 Jupyter 笔记本。

现在,表示图 3-17 中决策树的函数是:

f(aBaseline1,aBaseline2,aBaseline3,aBaseline4,aBaseline5,aBaseline6)=(aBaseline1andaBaseline5andaBaseline6)times39.584plus(aBaseline1andaBaseline5andnotaBaseline6)times139.968plus(aBaseline1andnotaBaseline5andaBaseline4)times287.278plus(aBaseline1andnotaBaseline5andnotaBaseline4)times422.769plus(notaBaseline1andaBaseline2andaBaseline3)times639.737plus(notaBaseline1andaBaseline2andnotaBaseline3)times824.211plus(notaBaseline1andnotaBaseline2)times1600dollarsignf(a Baseline 1, a Baseline 2, a Baseline 3, a Baseline 4, a Baseline 5, a Baseline 6) = (a Baseline 1 and a Baseline 5 and a Baseline 6) times 39.584 plus (a Baseline 1 and a Baseline 5 and not a Baseline 6) times 139.968 plus (a Baseline 1 and not a Baseline 5 and a Baseline 4) times 287.278 plus (a Baseline 1 and not a Baseline 5 and not a Baseline 4) times 422.769 plus (not a Baseline 1 and a Baseline 2 and a Baseline 3) times 639.737 plus (not a Baseline 1 and a Baseline 2 and not a Baseline 3) times 824.211 plus (not a Baseline 1 and not a Baseline 2) times 1600 dollar-sign

请注意,与我们迄今在本章中遇到的训练函数不同,上述函数没有我们需要解决的参数ω。这被称为非参数模型,它不会提前固定函数的形状。这使得它具有与数据一起增长或者说适应数据的灵活性。当然,这种对数据的高适应性也带来了过拟合数据的高风险。幸运的是,有办法解决这个问题,我们在这里列出了一些方法,但没有详细说明:在生长后修剪树,限制层数,设置每个节点的最小数据实例数,或者使用一组树而不是一棵树,称为随机森林,下面会讨论。

一个非常重要的观察:决策树决定只在原始数据集的两个特征上进行分割,即宽度和长度 3 特征。决策树的设计方式使得更重要的特征(那些对我们的预测提供最多信息的特征)更接近根部。因此,决策树可以帮助进行特征选择,我们选择最重要的特征来对我们最终模型的预测做出贡献。

难怪宽度和长度 3 特征最终成为预测鱼重量最重要的特征。图 3-18 中的相关矩阵和图 3-3 中的散点图显示所有长度特征之间存在极强的相关性。这意味着它们提供的信息是冗余的,并且在我们的预测模型中包含所有这些特征将增加计算成本并降低性能。

280

图 3-18. 鱼市场数据集的相关矩阵。所有长度特征之间存在极强的相关性。

注:特征选择

我们刚刚介绍了非常重要的特征选择主题。现实世界的数据集包含许多特征,其中一些可能提供冗余信息,其他一些对于预测我们的目标标签来说根本不重要。在机器学习模型中包含无关或冗余的特征会增加计算成本并降低性能。我们刚刚看到决策树是帮助选择重要特征的一种方法。另一种方法是一种称为 Lasso 回归的正则化技术,我们将在第四章中介绍。还有一些统计测试可以测试特征之间的依赖关系。F-测试测试线性依赖关系(这会为相关特征给出更高的分数,但仅仅依靠相关性是具有误导性的),互信息测试非线性依赖关系。这些提供了一个度量,衡量特征对确定目标标签的贡献程度,并因此有助于特征选择,保留最有前途的特征。我们还可以测试特征之间的依赖关系,以及它们的相关性和散点图。方差阈值移除方差很小或没有方差的特征,因为如果一个特征在自身内部变化不大,它的预测能力就很小。

我们如何在数据集上训练决策树?我们优化哪个函数?通常在生成决策树时优化两个函数:基尼不纯度。使用其中一个与另一个并没有太大区别。我们接下来会详细介绍这两个函数。

熵和基尼不纯度

在这里,我们决定根据被评估为最重要的特征来分割树的节点。基尼不纯度是衡量特征重要性的两种流行方法。它们在数学上并不等价,但它们都能工作并提供合理的决策树。基尼不纯度通常计算成本较低,因此它是软件包中的默认设置,但您可以选择从默认设置更改为熵。当某些类别的频率远高于其他类别时,使用基尼不纯度往往会产生较不平衡的树。这些类别最终会被孤立在它们自己的分支中。然而,在许多情况下,使用熵或基尼不纯度在生成的决策树中并没有太大的差异。

  1. 使用熵方法,我们寻找提供最大信息增益的特征分割(我们很快会给出它的公式)。信息增益源自信息理论,它与的概念有关。而熵又源自热力学和统计物理学,它量化了某个系统中的无序程度。

  2. 使用基尼不纯度方法,我们寻找提供子节点最低平均基尼不纯度的特征分割(我们也很快会给出它的公式)。

为了最大化信息增益(或最小化基尼不纯度),生长决策树的算法必须遍历训练数据子集的每个特征,并计算使用该特定特征作为节点进行拆分时所实现的信息增益(或基尼不纯度),然后选择提供最高信息增益(或子节点具有最低平均基尼不纯度)的特征。此外,如果特征具有实际数值,算法必须决定在节点上提出什么问题,也就是说,在哪个特征值上进行拆分,例如,x 5 < 0 . 1?算法必须在树的每一层依次执行此操作,计算每个节点中数据实例的特征的信息增益(或基尼不纯度),有时还要计算每个拆分值的可能性。通过示例更容易理解。但首先,我们写出熵、信息增益和基尼不纯度的公式。

熵和信息增益

理解熵公式最简单的方法是依靠直觉,即如果事件高概率发生,那么与之相关的惊喜就很少。因此,当p ( e v e n t )很大时,它的惊喜就很低。我们可以用一个随着概率增加而减少的函数来数学上表示这一点。微积分函数log 1 x适用,并且具有独立事件的惊喜相加的附加属性。因此,我们可以定义:

S u r p r i s e ( e v e n t ) = log 1 p(event) = - log ( p ( e v e n t ) )

现在,随机变量的熵(在我们的情况下是训练数据集中的特定特征)被定义为与随机变量相关的预期惊喜,因此我们必须将随机变量的每种可能结果(所涉及特征的每个值的惊喜)与它们各自的概率相乘,得到:

E n t r o p y ( X ) = - p ( o u t c o m e 1 ) log ( p ( o u t c o m e 1 ) ) - p ( o u t c o m e 2 ) log ( p ( o u t c o m e 2 ) ) - ⋯ - p ( o u t c o m e n ) log ( p ( o u t c o m e n ) ) .

我们训练数据的一个特征的熵假设有一堆值是:

E n t r o p y ( F e a t u r e ) = - p ( v a l u e 1 ) log ( p ( v a l u e 1 ) ) - p ( v a l u e 2 ) log ( p ( v a l u e 2 ) ) - ⋯ - p ( v a l u e n ) log ( p ( v a l u e n ) )

由于我们的目标是选择在提供关于结果(标签或目标特征)的大信息增益的特征上进行分割,让我们首先计算结果特征的熵。为简单起见,假设这是一个二元分类问题,因此结果特征只有两个值:正(在类中)和负(不在类中)。如果让p表示目标特征中的正实例数,n表示负实例数,则p+n=m将是训练数据子集中的实例数。现在从该目标列中选择正实例的概率将是p m = p p+n,选择负实例的概率类似地是n m = n p+n。因此,结果特征的熵(不利用其他特征的任何信息)是:

E n t r o p y ( Outcome Feature ) = - p ( p o s i t i v e ) log ( p ( p o s i t i v e ) ) - p ( n e g a t i v e ) log ( p ( n e g a t i v e ) ) = - p p+n log ( p p+n ) - n p+n log ( n p+n )

现在我们利用另一个特征的信息,并计算结果特征熵的差异,我们期望随着获得更多信息(更多信息通常会导致更少的惊喜),结果特征的熵将减少。

假设我们选择特征A来分割我们决策树上的一个节点。假设特征A有四个值,并且有k 1个实例具有v a l u e 1,其中p 1个标记为正,n 1个标记为负,所以p 1 + n 1 = k 1。同样,特征A有k 2个实例具有v a l u e 2,其中p 2个标记为正,n 2个标记为负,所以p 2 + n 2 = k 2。对于特征A的v a l u e 3和v a l u e 4也是一样的。注意k 1 + k 2 + k 3 + k 4 = m,即数据集训练子集中的实例总数。现在,特征A的每个值v a l u e k可以被视为一个随机变量,具有p k个正结果和n k个负结果,因此我们可以计算它的熵(期望的惊喜)。

数学符号开始布局第一行第一列熵左括号 v a l u e 1 右括号第二列等于负开始分数 p 1 除以 p 1 加 n 1 结束分数对数左括号开始分数 p 1 除以 p 1 加 n 1 结束分数右括号减开始分数 n 1 除以 p 1 加 n 1 结束分数对数左括号开始分数 n 1 除以 p 1 加 n 1 结束分数右括号第二行第一列熵左括号 v a l u e 2 右括号第二列等于负开始分数 p 2 除以 p 2 加 n 2 结束分数对数左括号开始分数 p 2 除以 p 2 加 n 2 结束分数右括号减开始分数 n 2 除以 p 2 加 n 2 结束分数对数左括号开始分数 n 2 除以 p 2 加 n 2 结束分数右括号第三行第一列熵左括号 v a l u e 3 右括号第二列等于负开始分数 p 3 除以 p 3 加 n 3 结束分数对数左括号开始分数 p 3 除以 p 3 加 n 3 结束分数右括号减开始分数 n 3 除以 p 3 加 n 3 结束分数对数左括号开始分数 n 3 除以 p 3 加 n 3 结束分数右括号第四行第一列熵左括号 v a l u e 4 右括号第二列等于负开始分数 p 4 除以 p 4 加 n 4 结束分数对数左括号开始分数 p 4 除以 p 4 加 n 4 结束分数右括号减开始分数 n 4 除以 p 4 加 n 4 结束分数对数左括号开始分数 n 4 除以 p 4 加 n 4 结束分数右括号结束布局。

既然我们有了这些信息,我们可以计算在特征A上分割后的预期熵,因此我们将上述四个熵分别乘以其相应的概率相加。请注意,p ( v a l u e 1 ) = k 1 m,p ( v a l u e 2 ) = k 2 m,p ( v a l u e 3 ) = k 3 m,以及p ( v a l u e 4 ) = k 4 m。因此,在特征A上分割后的预期熵将是:

预期 熵 ( 特征 A ) = p ( v a l u e 1 ) 熵 ( v a l u e 1 ) + p ( v a l u e 2 ) 熵 ( v a l u e 2 ) + p ( v a l u e 3 ) 熵 ( v a l u e 3 ) + p ( v a l u e 4 ) 熵 ( v a l u e 4 ) = k 1 m 熵 ( v a l u e 1 ) + k 2 m 熵 ( v a l u e 2 ) + k 3 m 熵 ( v a l u e 3 ) + k 4 m 熵 ( v a l u e 4 )

其中,特征A的每个值的熵在前一段中给出。

那么,使用特征A进行分割所获得的信息是什么?这将是没有来自特征A的任何信息时结果特征的熵与特征A的预期熵之间的差异。因此,我们有一个关于信息增益的公式,假设我们决定在特征A上进行分割:

Information Gain = E n t r o p y ( Outcome Feature ) - Expected Entropy ( Feature A ) = - p p+n log ( p p+n ) - n p+n log ( n p+n ) - Expected Entropy ( Feature A ) .

现在很容易浏览训练数据子集的每个特征,并计算使用该特征进行拆分后产生的信息增益。最终,决策树算法决定在具有最高信息增益的特征上进行拆分。该算法对每个节点和树的每一层递归执行此操作,直到没有要拆分的特征或数据实例。因此,我们得到了基于熵的决策树。

将上述逻辑推广到具有多类输出的情况并不太困难,例如,具有三个或更多目标标签的分类问题。经典的Iris 数据集来自UCI 机器学习库是一个具有三个目标标签的绝佳示例。该数据集为给定的鸢尾花具有四个特征:其萼片长度和宽度,以及其花瓣长度和宽度。请注意,每个特征都是连续随机变量,而不是离散的。因此,我们必须设计一个测试来拆分每个特征的值,应用上述逻辑之前。这是数据科学项目的特征工程阶段的一部分。这里的工程步骤是:将连续值特征转换为布尔特征,例如,花瓣长度>2.45?我们不会详细介绍如何选择数字 2.45,但是现在你可能可以猜到这里也应该进行优化过程。

基尼不纯度

每个决策树都由其节点,分支和叶子特征。如果一个节点只包含来自训练数据子集的具有相同目标标签的数据实例(这意味着它们属于同一类),则认为该节点是的。请注意,纯节点是期望的节点,因为我们知道它的类别。因此,算法希望以最小化节点的不纯度的方式来生长树:如果节点中的数据实例不都属于同一类,则该节点是不纯的。基尼不纯度以以下方式量化这种不纯度:

假设我们的分类问题有三个类别,就像Iris 数据集一样。假设决策树中的某个节点是为了适应这个数据集而生长的,有n个训练实例,其中n 1个属于第一类,n 2个属于第二类,n 3个属于第三类(所以n 1 + n 2 + n 3 = n)。那么这个节点的基尼不纯度由以下公式给出:

Gini impurity = 1 - (n 1 n) 2 - (n 2 n) 2 - (n 3 n) 2

因此,对于每个节点,计算属于每个类别的数据实例的比例,然后求平方,然后从 1 中减去这些的总和。请注意,如果节点的所有数据实例都属于同一类,则上述公式给出的基尼不纯度等于零。

决策树生长算法现在寻找每个特征和特征中的分割点,以产生平均基尼不纯度最低的子节点。这意味着节点的子节点平均上必须比父节点更纯。因此,该算法试图最小化两个子节点(二叉树)的基尼不纯度的加权平均值。每个子节点的基尼不纯度由其相对大小加权,其相对大小是其实例数与该树层中的总实例数(与其父节点的实例数相同)之比。因此,我们最终需要搜索解决以下最小化问题的特征和分割点(对于每个特征)组合:

min Feature,FeatureSplitValue n left n G i n i ( Left Node ) + n right n G i n i ( Right Node )

左右子节点中最终存在的数据实例的数量分别为n left和n right,n是父节点中存在的数据实例的数量(注意n left和n right必须加起来等于n)。

回归决策树

需要指出的是,决策树既可以用于回归也可以用于分类。回归决策树返回的是预测值而不是类别,但与分类树类似的过程适用。

与选择最大化信息增益或最小化基尼不纯度的特征和特征值(例如,身高>3 英尺吗?)来分割节点不同,我们选择最小化真实标签与左右子节点中所有实例标签的平均值之间的均方距离的特征和特征值。也就是说,算法选择要分割的特征和特征值,然后查看由该分割产生的左右子节点,并计算:

  • 左节点中所有训练数据实例标签的平均值。这个平均值将成为左节点值y left,如果该节点最终成为叶节点,这就是决策树预测的值。

  • 右节点中所有训练数据实例标签的平均值。这个平均值将成为右节点值y right。同样,如果该节点最终成为叶节点,这就是决策树预测的值。

  • 左节点值与左节点中每个实例的真实标签之间的平方距离之和∑ LeftNodeInstances |y true i -y left | 2。

  • 右节点值与右节点中每个实例的真实标签之间的平方距离之和∑ RightNodeInstances |y true i -y right | 2。

  • 上述两个总和的加权平均值,其中每个节点的权重由其相对于父节点的大小加权,就像我们对基尼不纯度所做的那样:

n left n ∑ LeftNodeInstances | y true i - y left | 2 + n right n ∑ RightNodeInstances | y true i - y right | 2 ) .

上述算法是贪婪和计算密集的,因为它必须对每个特征和每个可能的特征拆分值进行操作,然后选择提供左右子节点之间加权平方误差平均值最小的特征和特征拆分。

CART(分类和回归树)算法是一种著名的算法,被软件包使用,包括 Python 的 Scikit Learn,我们在 Jupyter 笔记本中使用这本书的补充。该算法生成的树的节点只有两个子节点(二叉树),每个节点上的测试只有是或否的答案。其他算法,如 ID3,可以生成具有两个或多个子节点的树。

决策树的缺点

决策树非常容易解释,因为有很多很好的原因而受欢迎:它们适应大数据集,不同的数据类型(离散和连续特征,不需要数据缩放),并且可以执行回归和分类任务。然而,它们可能不稳定,因为向数据集添加一个实例就可以改变树的根,从而导致非常不同的决策树。它们也对数据中的旋转敏感,因为它们的决策边界通常是水平和垂直的(不像支持向量机那样倾斜)。这是因为拆分通常发生在特定的特征值,因此决策边界最终与特征轴平行。解决这个问题的一个方法是转换数据集以匹配其主轴,使用稍后在第十一章中介绍的奇异值分解方法。决策树往往会过度拟合数据,因此需要修剪。这通常使用统计测试来完成。构建树涉及的贪婪算法,其中搜索发生在所有特征及其值上,使它们在计算上昂贵且不太准确。接下来讨论的随机森林解决了其中一些缺点。

随机森林

当我第一次了解决策树时,最令我困惑的是:

  • 我们如何开始构建树,也就是如何决定哪个数据特征是根特征?

  • 在特定的特征值上,我们决定如何分割一个节点?

  • 我们什么时候停下来?

  • 实质上,我们如何构建一棵树?

(请注意,我们在上一小节中回答了一些上述问题。)我在网上寻找答案时并没有使事情变得更容易,只是遇到了声明说决策树很容易构建和理解,所以感觉自己是唯一一个对决策树深感困惑的人。

当我了解了随机森林后,我的困惑立刻消失了。随机森林的惊人之处在于,我们可以获得非常好的回归或分类结果,而不需要回答我困惑的问题。通过随机化整个过程,也就是构建许多决策树并用两个词回答我的问题:“随机选择”,然后将它们的预测聚合在一起,产生非常好的结果,甚至比一个精心设计的决策树还要好。有人说随机化经常产生可靠性

随机森林的另一个非常有用的特性是它们提供了特征重要性的度量,帮助我们找出哪些特征对我们的预测有显著影响,并且也有助于特征选择。

k 均值聚类

数据分析师的一个常见目标是将数据分成,每个簇突出显示某些共同特征。k 均值聚类是一种常见的机器学习方法,它将n个数据点(向量)分成k个簇,其中每个数据点被分配到与其最近均值的簇。每个簇的均值,或者它的质心,作为簇的原型。总的来说,k 均值聚类最小化了每个簇内的方差(到均值的平方欧氏距离)。

k 均值聚类最常见的算法是迭代的:

  • 从初始的一组k均值开始。这意味着我们提前指定了簇的数量,这就引出了一个问题:如何初始化?如何选择第一个k质心的位置?有相关的文献。

  • 将每个数据点分配到与其平方欧氏距离最近的簇中。

  • 重新计算每个簇的均值。

当数据点分配到每个簇不再改变时,算法收敛。

分类模型的性能度量

开发计算事物并产生输出的数学模型相对容易。但是,开发能够很好地执行我们期望的任务的模型则完全不同。此外,根据某些指标表现良好的模型在其他一些指标下表现不佳。我们需要额外小心地开发性能指标,并根据我们特定的用例决定依赖于哪些指标。

衡量预测数值的模型的性能,例如回归模型,比分类模型更容易,因为我们有许多方法来计算数字之间的距离(好的预测和坏的预测)。另一方面,当我们的任务是分类(我们可以使用逻辑回归、softmax 回归、支持向量机、决策树、随机森林或神经网络等模型),我们必须对评估性能进行一些额外的思考。此外,通常存在权衡。例如,如果我们的任务是将 YouTube 视频分类为适合儿童观看(正面)或不适合儿童观看(负面),我们是否调整我们的模型以减少假阳性或假阴性的数量?显然,如果一个视频被分类为安全,而实际上是不安全的(假阳性),那么问题就更加棘手,因此我们的性能指标需要反映这一点。

以下是常用于分类模型的性能测量。不要担心记住它们的名称,因为它们的命名方式并不合乎逻辑。相反,花时间理解它们的含义。

  • 准确度:预测模型正确分类的百分比:

A c c u r a c y = 真正例+真负例 所有预测为正例+所有预测为负例

  • 混淆矩阵:计算所有真正例、假正例、真负例和假负例。
真负例假正例
假负例真正例
  • 精确度分数:正预测的准确性:

P r e c i s i o n = 真正例 所有预测为正例 = 真正例 真正例+假正例

  • 召回率分数:被正确分类的正实例的比率:

R e c a l l = 真正例 所有正标签 = 真正例 真正例+假负例

  • 特异度:被正确分类的负实例的比率:

S p e c i f i c i t y = 真负例 所有负标签 = 真负例 真负例+假正例

  • F 1 分数:只有在精确度和召回率得分都很高时才会很高:

F 1 = 2 1 precision+1 recall

  • AUC(曲线下面积)和 ROC(接收器操作特性)曲线:这些曲线提供了分类模型在各种阈值下的性能度量。我们可以使用这些曲线来衡量某个变量预测某个结果的能力,例如,GRE 学科考试成绩如何预测在第一年通过研究生院的资格考试?

Andrew Ng 的百页书《机器学习渴望》提供了性能指标最佳实践的出色指南。在真正的人工智能应用之前,请仔细阅读,因为该书的方法基于许多试验、成功和失败。

总结和展望

在本章中,我们调查了一些最流行的机器学习模型,强调了本书中出现的特定数学结构:训练函数、损失函数和优化。我们讨论了线性、逻辑和 softmax 回归,然后迅速地浏览了支持向量机、决策树、集成和随机森林。

此外,我们提出了研究以下数学主题的理由:

微积分

最小值和最大值发生在边界或导数为零或不存在的点。

线性代数

  • 线性组合特征:ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n。

  • 使用矩阵和向量表示各种数学表达式。

  • 两个向量的数量积a → t b →。

  • 向量的l 2范数。

  • 避免使用病态矩阵。消除线性相关的特征。这也与特征选择有关。

  • 避免矩阵相乘,这太昂贵了。改为将矩阵乘以向量。

优化

  • 对于凸函数,我们不必担心陷入局部最小值,因为局部最小值也是全局最小值。我们担心狭窄的山谷(下一章)。

  • 梯度下降方法,它们只需要一个导数(下一章)。

  • 牛顿法,它们需要两个导数或两个导数的近似(对于大数据不方便)。

  • 二次规划,对偶问题和坐标下降(都出现在支持向量机中)。

统计学

  • 相关矩阵和散点图。

  • 特征选择的 F 检验和互信息。

  • 标准化数据特征(减去平均值并除以标准差)。

我们没有也不会再讨论的更多步骤(但尚未):

  • 验证我们的模型-调整权重值和超参数,以避免过拟合。

  • 在测试数据的测试子集上测试训练模型,这是我们的模型在训练和验证步骤中没有使用(或看到)的(我们在附带的 Jupyter 笔记本中进行此操作)。

  • 部署和监控最终模型。

  • 永远不要停止思考如何改进我们的模型,以及如何更好地将它们整合到整个生产流程中。

在下一章中,我们将迈入神经网络的新而令人兴奋的时代。

第四章:神经网络的优化

我已经活了我生命中的每一天进行优化...我的第一个顿悟是当我发现我们的大脑也会学习世界的模型。

各种人工神经网络在其架构中具有全连接层。在本章中,我们解释全连接神经网络的数学原理,并通过一个真实数据集的端到端示例进行讲解。我们设计并尝试各种训练和损失函数。我们还解释了训练神经网络时使用的优化和反向传播步骤与我们大脑中学习的方式相似。大脑通过在面对之前见过的概念时加强神经元之间的连接来学习,并在学习到破坏或与之前学到的概念相矛盾的新信息时削弱连接。机器只能理解数字。从数学上讲,更强的连接对应于更大的数字,而更弱的连接对应于更小的数字。

最后,我们将介绍各种正则化技术,解释它们的优点、缺点和用例。

大脑皮层和人工神经网络

神经网络是模仿大脑皮层的结构,其中涉及数十亿个神经元排列成分层结构。图 4-1 显示了大脑新皮层的三个垂直横截面图像,图 4-2 显示了一个完全连接的人工神经网络的图表。

300

图 4-1. Santiago Ramon y Cajal 绘制的三幅皮层层析图,摘自书籍《人类皮层感觉区域的比较研究》。每幅图显示了皮层的垂直横截面,皮层的表面(最靠近头骨的最外侧)位于顶部。左侧:染色的成年人视觉皮层。中间:染色的成年人运动皮层。右侧:一个半月大婴儿的 Golgi 染色皮层。Nissl 染色显示神经元的细胞体。Golgi 染色显示了一组随机神经元的树突和轴突。图片来源:维基百科。在所有三个横截面中,皮层中神经元的分层结构是显而易见的。

300

图 4-2. 一个具有四层的全连接或密集的人工神经网络。

尽管大脑皮层的不同区域负责不同的功能,比如视觉、听觉感知、逻辑思维、语言、言语等,但实际上决定特定区域功能的是它的连接:它连接到哪些感觉和运动技能输入输出区域。这意味着,如果一个皮层区域连接到不同的感觉输入/输出区域,例如,一个视觉而不是听觉的地方,那么它将执行视觉任务(计算),而不是听觉任务。在非常简化的意义上,皮层在神经元水平上执行一个基本功能。在人工神经网络中,基本的计算单元是感知器,它在整个网络中的功能方式相同。神经网络(无论是大脑皮层还是人工神经网络)的各种连接、层和架构是使这些计算结构能够执行非常令人印象深刻的任务的原因。

训练功能:全连接或密集的前馈神经网络

全连接密集的人工神经网络中(参见图 4-2),每个神经元,由每一层中的节点(圆圈)表示,都连接到下一层中的所有神经元。第一层是输入层,最后一层是输出层,中间层称为隐藏层。神经网络本身,无论是全连接还是不全连接(我们将在接下来的几章中遇到的网络是卷积的,不是全连接的),都是表示训练函数公式的计算图。请记住,训练后我们使用这个函数进行预测。

在神经网络的背景下,训练意味着通过最小化损失函数找到进入训练函数公式的参数值或权重。这类似于我们在第三章中讨论的线性回归、逻辑回归、softmax 回归和支持向量机模型的训练。数学结构保持不变:

  1. 训练函数

  2. 损失函数

  3. 优化

唯一的区别是,在第三章中简单模型的训练函数公式非常简单。它们线性组合数据特征,添加偏置项(ω 0),并将结果传递至最多一个非线性函数(例如,在逻辑回归中的逻辑函数)。因此,这些模型的结果也很简单:线性(平坦)函数用于线性回归,逻辑回归中不同类别之间的线性分界线,softmax 回归和支持向量机。即使我们使用这些简单模型来表示非线性数据,例如多项式回归(将数据拟合到特征的多项式函数中)或带有核技巧的支持向量机,我们仍然得到线性函数或分界线,但在更高的维度(对于多项式回归,维度将是特征及其幂)或转换后的维度(例如当我们使用支持向量机的核技巧时)。

另一方面,对于神经网络模型,线性组合特征、添加偏置项,然后通过非线性函数(现在称为激活函数)传递结果的过程是发生在一个神经元中的计算。这个简单的过程在成百上千、甚至数百万个神经元中一遍又一遍地发生,这些神经元排列在层中,其中一层的输出作为下一层的输入。类似于大脑皮层,许多神经元和层上的简单和相似过程的聚合产生了或允许了更复杂功能的表示。这有点神奇。幸运的是,我们能够比我们的大脑神经网络更多地了解人工神经网络,主要是因为我们设计它们,毕竟,人工神经网络只是一个数学函数。一旦我们在数学的镜头下剖析它,没有黑匣子会保持黑暗。也就是说,对人工神经网络的数学分析是一个相对较新的领域:仍有许多问题有待解答,还有很多待发现的东西。

神经网络是训练函数的计算图表示

即使是只有五个神经元的网络,比如图 4-3 中的网络,编写训练函数的公式也会非常混乱。这证明了使用计算图来有组织地、简单地表示神经网络的合理性。图表的特点是两个方面:节点和边(恭喜,这是图论中的第一课)。在神经网络中,连接第 m 层的节点 i 和第 n 层的节点 j 的边被赋予权重ω mn,ij。这是一个边上的四个指标!为了避免淹没在指标的深海中,我们必须将神经网络的权重组织成矩阵。

250

图 4-3. 一个只有五个神经元的全连接(或密集)前馈神经网络,排列在三层中。第一层(最左边的三个黑点)是输入层,第二层是唯一的隐藏层,有三个神经元,最后一层是有两个神经元的输出层。

让我们建模一个前馈全连接神经网络的训练函数。前馈意味着信息通过代表网络训练函数的计算图向前传递。

线性组合,添加偏差,然后激活

当信息通过一个神经元流动时会发生什么样的计算:使用不同的权重线性组合输入信息,添加偏差项,然后使用非线性函数激活神经元。我们将逐步进行这个过程。

权重

让矩阵W 1包含incident to隐藏层 1 的边的权重,W 2包含incident to隐藏层 2 的边的权重,依此类推,直到达到输出层。

因此,对于图 4-3 中表示的小型神经网络,我们只有h=1个隐藏层,获得两个权重矩阵:

W 1 = ω 11 1 ω 12 1 ω 13 1 ω 21 1 ω 22 1 ω 23 1 ω 31 1 ω 32 1 ω 33 1 and W h+1 = W 2 = W output = ω 11 2 ω 12 2 ω 13 2 ω 21 2 ω 22 2 ω 23 2 ,

上标表示边指向的层。请注意,如果输出层只有一个节点而不是两个,那么权重矩阵的最后一个矩阵将只是一个行向量:

W h+1 = W 2 = W output = ω 11 2 ω 12 2 ω 13 2

现在在这个神经网络的一个节点上进行两次计算:

  1. 一个线性组合加上偏差。

  2. 通过非线性激活函数(微积分中的复合运算)传递结果。

我们详细说明这两个,然后最终构建完全连接前馈神经网络的训练函数,该网络在图 4-3 中表示。

线性组合加偏差

在第一个隐藏层的第一个节点处(这个小网络的唯一隐藏层),我们线性组合输入:

z 1 1 = ω 11 1 x 1 + ω 12 1 x 2 + ω 13 1 x 3 + ω 01 1

在第一个隐藏层的第二个节点处,我们使用不同的权重线性组合输入:

z 2 1 = ω 21 1 x 1 + ω 22 1 x 2 + ω 23 1 x 3 + ω 02 1

在第一个隐藏层的第三个节点处,我们使用不同的权重线性组合输入:

z 3 1 = ω 31 1 x 1 + ω 32 1 x 2 + ω 33 1 x 3 + ω 03 1

让我们用向量和矩阵表示上述三个方程。这将极大方便我们后面的优化任务,当然也会保持我们的理智:

z 1 1 z 2 1 z 3 1 = ω 11 1 ω 21 1 ω 31 1 x 1 + ω 12 1 ω 22 1 ω 32 1 x 2 + ω 13 1 ω 23 1 ω 33 1 x 3 + ω 01 1 ω 02 1 ω 03 1 = ω 11 1 ω 12 1 ω 13 1 ω 21 1 ω 22 1 ω 23 1 ω 31 1 ω 32 1 ω 33 1 x 1 x 2 x 3 + ω 01 1 ω 02 1 ω 03 1 .

我们现在可以将上述表达式简洁地总结为:

z → 1 = W 1 x → + ω → 0 1

通过非线性激活函数传递结果

线性组合特征并添加偏差不足以捕捉数据中更复杂的信息,神经网络如果没有这一关键但非常简单的步骤就永远不会成功:在隐藏层的每个节点处与非线性函数组合。

线性组合的线性组合仍然是线性组合

如果我们跳过与非线性函数组合的步骤,仅使用线性组合将信息从第一层传递到下一层,那么我们的网络将无法在下一层学到任何新知识。它将无法从一层到下一层捕捉到更复杂的特征。为什么会这样的数学原因很简单。为了简单起见,假设我们只有两个输入特征,第一个隐藏层只有两个节点,第二个隐藏层也有两个节点。那么没有非线性激活函数的第一个隐藏层的输出将是:

z 1 1 = ω 11 1 x 1 + ω 12 1 x 2 + ω 01 1 z 2 1 = ω 21 1 x 1 + ω 22 1 x 2 + ω 02 1

在第二个隐藏层,这些将再次进行线性组合,因此这一层的第一个节点的输出将是:

z 1 2 = ω 11 2 z 1 1 + ω 12 2 z 2 1 + ω 01 2 = ω 11 2 ( ω 11 1 x 1 + ω 12 1 x 2 + ω 01 1 ) + ω 21 2 ( ω 21 1 x 1 + ω 22 1 x 2 + ω 02 1 ) + ω 01 2 = ( ω 11 2 ω 11 1 + ω 21 2 ω 21 1 ) x 1 + ( ω 11 2 ω 12 1 + ω 21 2 ω 22 1 ) x 2 + ( ω 11 2 ω 01 1 + ω 21 2 ω 02 1 + ω 01 2 ) = ω 1 x 1 + ω 2 x 2 + ω 3 .

这个输出只是原始特征加偏差的简单线性组合。因此,添加一个没有任何非线性激活的层不会带来任何新的东西。换句话说,训练函数将保持线性,并且缺乏捕捉数据中任何非线性关系的能力。

我们是决定非线性激活函数公式的人,不同的节点可以有不同的激活函数,尽管在实践中很少这样做。设 f 为这个激活函数,那么第一个隐藏层的输出将是:

s → 1 = f → ( z → 1 ) = f → ( W 1 x → + ω → 0 1 ) .

现在很容易看到,如果我们有更多的隐藏层,它们的输出将与前一层的输出链接在一起,使得编写训练函数有点繁琐:

s → 2 = f → ( z → 2 ) = f → ( W 2 s → 1 + ω → 0 2 ) = f → ( W 2 ( f → ( W 1 x → + ω → 0 1 ) ) + ω → 0 2 ) , s → 3 = f → ( z → 3 ) = f → ( W 3 s → 2 + ω → 0 3 ) = f → ( W 3 ( f → ( W 2 ( f → ( W 1 x → + ω → 0 1 ) ) + ω → 0 2 ) ) + ω → 0 3 ) .

这种链接继续下去,直到我们到达输出层。在这个最后一层发生的情况取决于网络的任务。如果目标是回归(预测一个数值)或二元分类(分类为两类),那么我们只有一个输出节点(参见图 4-4)。

250

图 4-4. 一个仅有九个神经元排列在四层中的全连接(或密集)前馈神经网络。最左边的第一层是输入层,第二层和第三层是每个四个神经元的两个隐藏层,最后一层是仅有一个神经元的输出层(此网络执行回归任务或二元分类任务)。
  • 如果任务是回归,我们在最终输出节点处线性组合前一层的输出,添加偏差,然后结束(在这种情况下通过非线性函数传递结果)。由于输出层只有一个节点,输出矩阵只是一个行向量W output = W h+1,和一个偏差ω 0 h+1。网络的预测现在将是:

y predict = W h+1 s → h + ω 0 h+1 ,

其中 h 是网络中隐藏层的总数(不包括输入和输出层)。

  • 另一方面,如果任务是二元分类,那么我们再次只有一个输出节点,在这里我们线性组合前一层的输出,添加偏差,然后通过逻辑函数传递结果σ ( s ) = 1 1+e -s,导致网络的预测:

y predict = σ ( W h+1 s → h + ω 0 h+1 )

  • 如果任务是分类到多个类别,比如五个类别,那么输出层将包括五个节点。在这些节点中,我们线性组合前一层的输出,添加偏差,然后通过 softmax 函数传递结果:

σ ( z 1 ) = e z 1 e z 1 +e z 2 +e z 3 +e z 4 +e z 5 , σ ( z 2 ) = e z 2 e z 1 +e z 2 +e z 3 +e z 4 +e z 5 , σ ( z 3 ) = e z 3 e z 1 +e z 2 +e z 3 +e z 4 +e z 5 , σ ( z 4 ) = e z 4 e z 1 +e z 2 +e z 3 +e z 4 +e z 5 , σ ( z 5 ) = e z 5 e z 1 +e z 2 +e z 3 +e z 4 +e z 5 .

将上述分组为一个矢量函数σ →,该函数还将矢量作为输入:σ → ( z → ),那么神经网络的最终预测是一个包含五个概率分数的向量,表示数据实例属于五个类别中的每一个的概率:

y → predict = σ → ( z → ) = σ → ( W output s → h + ω 0 → h+1 )

符号概述

在我们讨论神经网络时,我们将尽量保持符号的一致性:x 是输入特征,W 是包含用于线性组合的权重的矩阵或列向量,ω 0是有时分组为矢量的偏差,z 是线性组合加偏差的结果,s是将这些结果传递到非线性激活函数中的结果。

常见的激活函数

理论上,我们可以使用任何非线性函数来激活我们的节点(想象我们曾经遇到的所有微积分函数)。在实践中,有一些流行的函数,如下所列,并在图 4-5 中绘制。

275

图 4-5。神经网络的各种激活函数。第一行由类似字母 S 形状的 Sigmoid 型激活函数组成。对于输入的绝对值较大,这些函数会饱和(变得平坦并输出相同的值)。第二行由不会饱和的 ReLU 型激活函数组成。

到目前为止,修正线性单元函数(简称 ReLU)是当今网络中最常用的激活函数,2012 年AlexNet的成功部分归因于使用这种激活函数,而不是当时神经网络中常用的双曲正切和逻辑函数(Sigmoid)。下面列表中的前四个函数以及图 4-5 中的函数都受到计算神经科学的启发,它们试图模拟一个神经元细胞的激活(发射)阈值。它们的图形看起来相似,有些是其他函数的平滑变体,有些只输出正数,其他输出在-1 和 1 之间或在- π 2和π 2之间的更平衡的数字。它们对于小或大的输入都会饱和,意味着它们的图形对于绝对值较大的输入会变得平坦。这会导致学习问题,因为如果这些函数一遍又一遍地输出相同的数字,那么学习就不会发生太多。从数学上讲,这表现为所谓的梯度消失问题。第二组激活函数试图纠正这种饱和问题,它确实做到了,正如我们在图 4-5 的第二行图中所看到的。然而,这引入了另一个问题,称为梯度爆炸问题,因为这些激活函数是无界的,现在可以输出大数字,如果这些数字在多个层上增长,我们就会遇到问题。引入的每个新问题都伴随着一套尝试解决它的技术,例如梯度裁剪,在每一层后对输出进行归一化,等等。重要的一点是,这一切都不是魔法。其中很多是试错,新方法出现是为了解决其他新方法引入的问题。我们只需要理解原则,为什么和如何,对领域中流行的内容有一定了解,同时保持开放的思维来改进事物,或者完全不同的方式来做事。

让我们列出常见激活函数的公式,以及它们的导数。在我们寻找神经网络最佳权重时,我们需要计算训练函数的一个导数,以优化损失函数:

  • 阶跃函数:f ( z ) = 0 if z < 0 1 if z ≥ 0

其导数:

  • 逻辑函数:

其导数:

  • 双曲正切函数:

它的导数:

  • 反正切函数:

其导数:

  • 整流线性单元函数或 ReLU(z):

其导数:

  • 泄漏整流线性单元函数(或参数化线性单元):

其导数:

  • 指数线性单元函数:f(z)= {α(e^z - 1)如果 z < 0;z 如果 z ≥ 0}。

它的导数:f'(z)= {f(z)+ α如果 z < 0;1 如果 z ≥ 0}。

  • Softplus 函数:f(z)= ln(1 + e^z)。

它的导数:f'(z)= 1 /(1 + e^-z)= σ(z)。

请注意,所有这些激活函数都是相当基本的函数。这是一件好事,因为它们及其导数通常参与在训练、测试和部署神经网络过程中涉及数千个参数(权重)和数据实例的大规模计算,因此最好保持它们基本。另一个原因是,在理论上,我们最终选择的激活函数并不真的重要,因为接下来将讨论的通用函数逼近定理。在操作上,我们选择神经网络节点的激活函数确实很重要。正如我们在本节前面提到的,AlexNet 在图像分类任务中取得成功部分归功于其使用的修正线性单元函数 ReLU(z)。在这种情况下,理论和实践并不矛盾,尽管表面上看起来是这样。我们将在下一小节中解释这一点。

通用函数逼近

逼近定理一旦可用,就会很棒,因为它们以数学的信心和权威告诉我们,如果我们有一个我们不知道的函数,或者我们知道但难以包含在我们的计算中的函数,那么我们根本不必处理这个未知或困难的函数。相反,我们可以使用更容易计算的已知函数来近似它,以很高的精度。这意味着在未知或复杂函数以及已知和简单(有时是基本的)函数的一定条件下,我们可以使用简单函数,并确信我们的计算是正确的。这些类型的逼近定理量化了真实函数与其近似之间的差距,因此我们确切地知道在用这个近似替代真实函数时我们所犯的错误有多少。

神经网络,甚至有时只有一个隐藏层的非深度神经网络,在视觉、语音识别、分类、回归等各种任务中取得了如此成功的成就,这意味着它们具有某种通用逼近性质:神经网络表示的训练函数(由基本线性组合、偏差和非常简单的激活函数构建)相当好地逼近了真正表示或生成数据的未知函数。

数学家现在必须用一个定理或一堆定理来回答的自然问题是:

  1. 鉴于我们不知道但非常关心的某个函数(因为我们认为它是潜在或生成我们数据的真实函数),是否有一个神经网络可以以很高的精度近似它(而不必知道这个真实函数)?成功使用神经网络的实践表明答案是肯定的,并且神经网络的通用逼近定理证明了对于某一类函数和网络,答案是肯定的。

  2. 如果有一个神经网络可以逼近这个真实而难以捉摸的数据生成函数,我们如何构建它?它应该有多少层?每层有多少节点?应该包含什么类型的激活函数?换句话说,这个网络的架构是什么?遗憾的是,到目前为止,我们对如何构建这些网络知之甚少,尝试各种架构和激活是唯一的前进之路,直到更多的数学家参与其中。

  3. *有多种神经网络架构表现良好吗?有些比其他的更好吗?*实验证明答案是肯定的,因为各种架构在相同任务和数据集上的可比性表现。

请注意,对上述问题有明确答案非常有用。对第一个问题的肯定回答告诉我们:嘿,这里没有魔法,神经网络确实相当好地逼近了广泛类别的函数!这种广泛覆盖或普适性至关重要,因为请记住,我们不知道数据生成函数,但如果逼近定理涵盖了广泛类别的函数,我们未知和难以捉摸的函数很可能也被包括在内,因此神经网络的成功。回答第二和第三个问题对实际应用更有用,因为如果我们知道哪种架构最适合每种任务类型和数据集,那么我们将免于进行大量实验,并立即选择一个表现良好的架构。

在陈述神经网络的通用逼近定理并讨论它们的证明之前,让我们回顾两个例子,我们已经在中学时代遇到过逼近类型的定理。所有例子都适用同一原则:我们有一个难以处理或未知的难以处理的量,我们想用另一个更容易处理的量来近似它。如果我们想要通用结果,我们需要指定三件事:

  1. 难以处理的量或函数属于什么类别或什么空间?它是实数集ℝ吗?无理数集?区间上连续函数的空间?紧支持函数在ℝ上的空间?勒贝格可测函数的空间(我在这里插入了一些测度论的内容,希望没有人注意到或逃跑)?等等

  2. 我们使用什么样的更简单的量或函数来近似难以处理的实体,使用这些量而不是真实函数对我们有什么好处?如果已经有一些其他流行的近似方法,这些近似方法与其他近似方法相比如何?

  3. 近似发生在什么意义上,也就是说,当我们说我们可以用f true来近似f approximate时,我们究竟是如何测量f true和f approximate之间的距离?回想一下,在数学中我们可以用许多方式来测量物体的大小,包括距离。那么我们究竟在我们特定的近似中使用哪种方式?这就是我们听说欧几里得范数、均匀范数、上确界范数、L 2范数等的地方。范数(大小)与距离有什么关系?范数引出距离。这是直观的:如果我们的空间允许我们谈论物体的大小,那么它最好也允许我们谈论距离。我们将在概率章节中稍后形式化这一点。

    例 1:用有理数近似无理数

    任何无理数都可以用有理数近似,直到我们想要的任意精度。有理数表现得很好且有用,因为它们只是整数对。我们的思维可以轻松地理解整数和分数。无理数则完全相反。你有没有在六年级被要求计算47 = 6 . 8556546 . . .,没有计算器,一直计算直到得到一个确定的答案?我有。相当刻薄!即使计算器和计算机也用有理数近似无理数。但我必须坐在那里想着我可以继续写数字,直到我找到一个模式或计算终止。当然,两者都没有发生,大约 30 位数字后,我才知道有些数字就是无理数。

有多种方式可以编写数学陈述来量化这种近似。它们都是等效且有用的:

  • 近似实体可以无限接近真实数量:这是最直观的方式。

给定一个无理数s和任意精度ϵ,无论多么小,我们都可以找到一个距离s小于ϵ的有理数q

| s - q | < ϵ .

这意味着有理数和无理数在实数线ℝ上彼此之间生活得非常接近。这引入了密度的概念。

  • 密度和闭包:逼近实体在真实数量所在的空间中是密集的。

这意味着,如果我们只关注逼近成员的空间,然后加入所有它们序列的所有极限,我们就得到了真实成员的整个空间。在某个空间 S 中加入所有极限点被称为闭合空间,或者取其闭包,S ¯。例如,当我们在开区间( a , b )中加入其极限点ab时,我们得到了闭合区间[a,b]。因此,( a , b )的闭包是[a,b]。我们写成(a,b) ¯ =[a,b]。

有理数集ℚ在实数线ℝ中是密集的。换句话说,ℚ的闭包是ℝ。我们写成ℚ ¯ = ℝ。

  • 序列的极限:真实数量是逼近实体序列的极限。

在前面的点中添加 极限点的概念引入了使用序列及其极限的术语进行逼近。

在有理数逼近无理数的背景下,因此我们可以写成:对于任意无理数s,存在一个有理数序列q n,使得lim n→∞ q n = s。这使我们有机会举例说明最著名的无理数之一的最喜欢的定义:e=2.71828182…

lim n→∞ (1+1 n) n = e

也就是说,无理数e 是有理数序列(1+1 1) 1 , (1+1 2) 2 , (1+1 3) 3 , ⋯的极限,等价于2 , 2 . 25 , 2 . 370370 . . , ⋯。

无论我们使用任意接近概念、密集性和闭包概念还是序列极限概念来用有理数逼近无理数,数学陈述中涉及的任何距离都是使用通常的欧几里德范数来衡量的:d ( s , q ) = | s - q |,这是两个数之间的正常距离。

注意:接近性质需要伴随特定的范数。

我们可能会想:如果我们改变范数会怎样?逼近性质是否仍然成立?如果我们使用某种与通常的欧几里德范数不同的距离定义来衡量它们之间的距离,我们是否仍然可以用有理数逼近无理数?欢迎来到数学分析。一般来说,答案是否定的。使用某种范数可以使量之间彼此接近,而使用另一种范数可以使它们之间相距很远。因此,在数学中,当我们说量之间彼此接近、逼近其他量或收敛到某处时,我们需要提及伴随的范数,以便准确定义这些接近性质是如何发生

例 2:用多项式逼近连续函数

连续函数可以是任何东西。一个孩子可以在一张纸上画一条曲线,那就是一个没有人知道公式的连续函数。另一方面,多项式是一种特殊类型的连续函数,极易评估、求导、积分、解释和进行计算。多项式函数中唯一涉及的操作是幂、标量乘法、加法和减法。n次多项式有一个简单的公式:

p n ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n x n ,

其中a i是标量数。自然地,我们非常希望能够用多项式函数逼近非多项式连续函数。令人惊喜的消息是,我们可以,直到任意精度ϵ。这是数学分析中的一个经典结果,称为魏尔斯特拉斯逼近定理。

魏尔斯特拉斯逼近定理:假设f是定义在实区间[a,b]上的连续实值函数。对于任意精度ϵ > 0,存在一个多项式p n,使得对于[a,b]中的所有x,我们有| f ( x ) - p n ( x ) | < ϵ,或者等价地,上确界范数∥ f - p n ∥ < ϵ。

注意,与我们讨论使用有理数逼近无理数的原理相同:定理断言我们总是可以找到多项式,这些多项式与连续函数任意接近;这意味着多项式集合在区间[a,b]上的连续函数空间中是密集的;或者等价地,对于任何连续函数f,我们可以找到一系列多项式函数,它们收敛于f(因此f是一系列多项式的极限)。在这些相同事实的所有变化中,距离是根据上确界范数来衡量的。在图 4-6 中,我们验证连续函数sin x是多项式函数序列的极限{ x , x - x 3 3! , x - x 3 3! + x 5 5! , ⋯ }

250

图 4-6。通过一系列多项式逼近连续函数sin x。

神经网络的通用逼近定理陈述

现在我们了解了逼近原理,让我们陈述神经网络的最新逼近定理。

回想一下神经网络是将训练函数表示为计算图。我们希望这个训练函数能够很好地逼近生成数据的未知函数。这使我们能够使用训练函数,而不是我们不知道的基础真实函数,也可能永远不会知道,来进行预测。以下逼近定理断言神经网络可以以任意精度逼近基础函数。当我们将这些定理的陈述与上述无理数和连续函数的两个示例进行比较时,我们注意到它们是相同类型的数学陈述。

以下结果归功于 Hornik,Stinchombe 和 White 1989:设 f 是紧集 K 上的连续函数(这是数据背后的真实但未知函数),其输出在ℝ d中。那么:

  • 任意接近:存在一个只有单隐藏层的前馈神经网络,可以在 K 上均匀逼近 f,精度在 K 上任意ϵ > 0。

  • 密集性:具有预定非线性激活和神经元数量和层数限制的神经网络集合在C ( K , ℝ d )的均匀拓扑中是密集的。

在这两种相同事实的变化中,距离是根据连续函数上的上确界范数来衡量的。

证明需要来自测度论泛函分析的数学概念。我们将在第十一章中介绍测度论,即概率。目前我们只列出证明所需的内容,没有任何细节:Borel 和 Radon 测度;Hahn Banach 定理;以及 Reiz 表示定理。

深度学习的逼近理论

在激励逼近理论并陈述其在深度学习中的一个主要结果后,我们指向了诸如神经网络学习概率分布的能力、Barron 定理、神经切线核、以及其他内容等最新成果。

损失函数

尽管在本章中我们从第三章的传统机器学习过渡到了深度学习时代,但训练函数、损失函数和优化的结构仍然完全相同。用于神经网络的损失函数与第三章中讨论的并无不同,因为损失函数的目标并未改变:捕捉地面真相与训练函数所做预测之间的误差。在深度学习中,神经网络代表训练函数,对于前馈神经网络,我们看到这只不过是一系列线性组合后跟随非线性激活函数的组合。

在深度学习中使用最广泛的损失函数仍然是用于回归任务的均方误差和用于分类任务的交叉熵函数。回到第三章详细解释这些函数。

在领域中我们有时会遇到其他损失函数。当我们遇到一个新的损失函数时,通常模型的设计者会有某种理由更喜欢它而不是其他更流行的损失函数,所以确保你仔细阅读他们使用特定损失函数的理由。理想情况下,一个好的损失函数会惩罚糟糕的预测,计算成本不高,并且有一个易于计算的导数。我们需要这个导数存在,以便我们的优化方法表现良好。正如我们在第三章中讨论的,具有一个良好导数的函数比具有不连续导数的函数具有更平滑的地形,因此在搜索损失函数的最小值时,在优化过程中更容易导航。

注意:最小化交叉熵损失函数等同于最大化对数似然函数。概率分布的 KL 散度与之密切相关。

回想一下,交叉熵函数是从信息论和统计力学中借来的,它量化了数据的真实(经验)分布与神经网络训练函数产生的分布(预测)之间的交叉熵。交叉熵函数的公式中有一个负号和一个log函数。最小化一个函数的负号等同于最大化没有负号的相同函数,因此有时你会在领域中遇到以下陈述:最大化对数似然函数,对我们来说等同于最小化交叉熵损失函数。一个密切相关的概念是Kullback-Leibler 散度,也称为 KL 散度。有时,例如在生成图像或机器音频的情况下,我们需要学习一个概率分布,而不是一个确定性函数。在这种情况下,我们的损失函数应该捕捉数据的真实概率分布与学习到的概率分布之间的差异(我不会说距离,因为它的数学公式不是一个距离度量)。KL 散度就是这样一种损失函数的例子,它量化了当学习到的分布用于近似真实分布时丢失的信息量,或者真实分布相对于学习到的分布的相对熵。

优化

忠实于我们的训练函数损失函数优化数学结构,我们现在讨论优化步骤。我们的目标是对损失函数L ( ω → )的景观进行高效搜索,以找到最小化的ω。请注意,当我们在早期章节明确写出神经网络的训练函数的公式时,我们将ω权重捆绑在矩阵W中,将偏差捆绑在向量ω → 0中。在本节中,为了简化符号并保持对数学的关注,我们将所有权重和偏差放在一个非常长的向量ω →中。也就是说,我们将损失函数写为L ( ω → ),而实际上,对于具有h隐藏层的全连接神经网络,它是:

Loss function = L ( W 1 , ω → 0 1 , W 2 , ω → 0 2 , ⋯ , W h+1 , ω → 0 h+1 ) .

我们只需要上述表示当我们明确使用反向传播计算损失函数的导数时,这将在本章后面讨论。

对于深度学习,向量ω →中的ω的数量可能非常高,可以达到数万、百万甚至十亿:OpenAI 的 GPT-2 自然语言拥有 15 亿个参数,并且是在 800 万个网页数据集上训练的。我们需要解决这么多未知数!

使用优化方法,如牛顿类型方法,需要计算这么多未知数的损失函数的二阶导数矩阵,即使在我们当前强大的计算能力下也是不可行的。这是一个很好的例子,数值方法的数学理论完全有效,但在计算和实际应用中是不切实际的。这里令人沮丧的是,使用二阶导数的数值优化方法通常比仅使用一阶导数的方法收敛更快,因为它们利用了关于函数凹凸性(其碗的形状)的额外知识,而不仅仅使用一阶导数提供的关于函数增减的信息。在我们发明更强大的计算机之前,我们必须满足于只使用损失函数对未知ω的一阶导数的一阶方法。这些是梯度下降类型的方法,幸运的是,它们在许多当前部署在我们日常生活中使用的真实 AI 系统中表现非常出色,例如亚马逊的 Alexa。

数学与神秘的神经网络成功

值得在这里停下来反思神经网络的成功,这在本节的背景下可以理解为:我们能够找到使训练函数很好地泛化到新的和未见过的数据的损失函数的最小化器。我没有北美口音,亚马逊的 Alexa 能够完全理解我。从数学上讲,神经网络的这种成功仍然令人困惑,原因有很多。

  • 损失函数的ω域,即发生最小化的地方,是非常高维的(可以达到数十亿维)。我们有数十亿甚至数万亿的选择。我们如何找到正确的解决方案?

  • 损失函数本身的景观是非凸的,因此有很多局部最小值和鞍点,优化方法可能会陷入困境或收敛到错误的局部最小值。同样,我们如何找到正确的解决方案?

  • 在一些人工智能应用中,比如计算机视觉,比数据点(图像)要多得多的ω。回想一下,对于图像,每个像素都是一个特征,因此在输入级别就已经有很多ω。对于这样的应用,未知数(ω)比确定它们所需的信息(数据点)要多得多。从数学上讲,这是一个“欠定”系统,这样的系统有“无限多个可能的解”!那么我们的网络的优化方法究竟是如何选择好的解决方案的呢?哪些能很好地泛化?

一些神秘的成功归因于在训练过程中已经成为基本技术的技巧,比如正则化(在本章的后面部分讨论)、验证、测试等。然而,深度学习仍然缺乏坚实的理论基础。这就是为什么很多数学家最近聚集在一起回答这些问题。国家科学基金会(NSF)在这方面的努力,以及我们从其公告中摘录的引用(用斜体表示)非常具有信息性,并深入了解数学如何与推进人工智能相互交织:

NSF 最近成立了 11 个新的人工智能研究所来推动各个领域的人工智能发展,比如人机交互与协作、优化进展的人工智能、高级网络基础设施的人工智能、计算机和网络系统中的人工智能、动态系统中的人工智能、增强学习和农业和食品系统中的人工智能驱动创新。NSF 能够汇集包括计算机和信息科学工程、认知科学和心理学、经济学和博弈论、工程和控制理论、伦理学、语言学、数学和哲学在内的多个科学领域,使该机构在拓展人工智能前沿方面独具优势。NSF 的资助将帮助美国充分利用人工智能的全部潜力,以加强经济、促进就业增长,并为未来几十年为社会带来利益。

以下内容摘自 NSF 的深度学习 SCALE MoDl 的数学和科学基础深度学习取得了令人印象深刻的经验成功,推动了基础科学发现,并改变了人工智能的许多应用领域。然而,我们对该领域的理论理解尚不完整,这阻碍了更广泛范围的参与者接触深度学习技术。面对我们对深度学习成功机制的不完整理解应该有助于克服其局限性并扩展其适用性。SCALE MoDL 计划将赞助由数学家、统计学家、电气工程师和计算机科学家组成的新研究合作。研究活动应集中在涉及数学和科学基础领域中一些最具挑战性的理论问题的明确主题上。每个合作应通过涉及最近获得博士学位的研究人员、研究生和/或本科生在跨学科领域的研究中进行培训。这些提案可能涉及深度学习理论基础的各种科学主题。可能的主题包括但不限于几何、拓扑、贝叶斯或博弈论形式,利用最优输运理论、优化理论、逼近理论、信息理论、动力系统、偏微分方程或平均场理论的分析方法,以及应用启发式观点探索小数据集的有效训练、对抗性学习和关闭决策-行动循环,更不用说对成功指标、隐私保障、因果推断和算法公平性的基础性工作

梯度下降ω → i+1 = ω → i - η ∇ L ( ω → i )

在深度学习中用于优化的梯度下降方法非常简单,以至于我们可以将其公式放在本小节的标题中。这就是梯度下降如何搜索损失函数L ( ω → )的局部最小值的方式:

  • 在某处初始化 ω → 0:随机选择起始数值 ω → 0 = ( ω 0 , ω 1 , ⋯ , ω n )。这个选择将我们放置在搜索空间的某处以及 L ( ω → ) 的景观中。这里有一个重要的警告:我们从哪里开始很重要!不要用全零或全相等的数字初始化。这将减弱网络学习不同特征的能力,因为不同节点将输出完全相同的数字。我们将在即将到来的子节中讨论初始化。

  • 移动到新点 ω → 1:梯度下降沿着损失函数的梯度向量相反的方向移动 - ∇ L ( ω → 0 )。如果步长 η,也称为学习率不是太大,这将保证梯度下降。

ω → 1 = ω → 0 - η ∇ L ( ω → 0 )

  • 移动到新点 ω → 2:同样,梯度下降沿着损失函数的梯度向量相反的方向移动 - ∇ L ( ω → 1 )。如果学习率 η 不是太大,这将再次保证梯度下降。

ω → 2 = ω → 1 - η ∇ L ( ω → 1 )

  • 继续直到点序列 { ω → 0 , ω → 1 , ω → 2 , ⋯ } 收敛

图 4-7 显示了使用梯度下降最小化某个损失函数 L(ω1,ω2)的图片。我们作为人类受限于我们存在的三维空间,因此无法可视化超过三维。这对我们来说在可视化方面是一个严重的限制,因为我们的损失函数通常作用在非常高维的空间上。它们是许多ω的函数,但如果它们最多依赖于两个ω,我们只能准确地可视化它们。也就是说,我们可以可视化依赖于两个ω的损失函数 L(ω1,ω2),但不能可视化依赖于三个(或更多)ω的损失函数 L(ω1,ω2,ω3)。即使我们在可视化高维空间中的损失函数方面受到严重限制,图 4-7 给出了梯度下降方法的一般操作的准确图像。在图 4-7 中,搜索发生在二维(ω1,ω2)-平面(图 4-7 中的平坦地面),我们跟踪嵌入在ℝ³中的函数 L(ω1,ω2)的景观上的进展。搜索空间的维度始终比嵌入损失函数景观的空间的维度少一个。这使得优化过程更加困难,因为我们正在寻找一个繁忙景观的最小化者,而这个景观在其地形的扁平或压缩版本中(图 4-7 中的地面水平)进行了压缩。

250

图 4-7。两个梯度下降步骤。请注意,如果我们从山的另一侧开始,我们将无法收敛到最小值。因此,当我们搜索非凸函数的最小值时,我们从哪里开始,或者如何初始化ω很重要。

解释学习率超参数η的作用

在每次迭代中,梯度下降方法将我们从搜索空间中的点ω → i移动到另一个点ω → i+1。梯度下降将- η ∇ L ( ω → i )添加到当前ω → i,以获得ω → i+1。数量- η ∇ L ( ω → i )由标量η乘以梯度向量的负值组成,该向量指向从点ω → i开始的损失函数最陡降方向。因此,缩放的- η ∇ L ( ω → i )告诉我们在搜索空间中沿着最陡降方向要走多远,以选择下一个点ω → i+1。换句话说,向量- ∇ L ( ω → i )指定我们将远离当前点的方向,而标量η,称为学习率,控制我们将沿着该方向迈出多远。太大的学习率可能会超过最小值并越过山谷的另一侧。另一方面,学习率太小需要一段时间才能到达最小值。因此,权衡之处在于选择较大的学习率并冒着超过最小值的风险,或选择较小的学习率并增加计算成本和收敛时间。

250

图 4-8。两种不同学习率的一步梯度下降。左侧,学习率过大,梯度下降超过了最小值(星点),落在山谷的另一侧。右侧,学习率较小,但是需要一段时间才能到达最小值(星点)。请注意,某点处的梯度向量与该点处的等高线垂直。

学习率η是机器学习模型的另一个超参数的例子。它不是进入训练函数公式的权重之一。它是一种固有于我们所使用的算法的参数,用于估计训练函数的权重。

特征的比例影响梯度下降的性能

这是提前标准化特征的原因之一。标准化特征意味着从每个数据实例中减去平均值,然后除以标准差。这样可以强制所有数据值具有相同的比例,均值为零,标准差为一,而不是具有迥异的比例,例如一个特征的测量值在百万级,另一个特征的测量值在 0.001 级。但为什么这会影响梯度下降方法的性能?继续阅读。

回想一下,输入特征的值会在训练函数中与权重相乘,而训练函数又会进入损失函数的公式中。输入特征的非常不同的比例会改变损失函数的碗的形状,使最小化过程变得更加困难。图 4-9 显示了函数L ( ω 1 , ω 2 ) = ω 1 2 + a ω 2 2的等高线,模拟不同输入特征的不同比例。请注意,随着a的值增加,损失函数的等高线变得更加狭窄和延长。这意味着损失函数的碗的形状是一个长而窄的山谷。

250

图 4-9。损失函数L ( ω 1 , ω 2 ) = ω 1 2 + a ω 2 2的等高线随着a的值从 1 增加到 20 再到 40 变得更加狭窄和延长。

当梯度下降方法试图在这样一个狭窄的山谷中操作时,它的点会从山谷的一侧跳到另一侧,试图找到最小值时会蜿蜒曲折,大大减慢收敛速度。想象一下在抵达梵蒂冈之前在罗马的所有街道上蜿蜒曲折,而不是直接乘直升机到达梵蒂冈。

但为什么会发生这种蜿蜒曲折的行为?函数的梯度向量的一个特点是它与该函数的等高线垂直。我们在本书的附录中进行了这种计算。因此,如果损失函数的山谷如此长而窄,其等高线几乎看起来像是彼此平行的线条,而且具有足够大的步长(学习率),我们可以从山谷的一侧穿越到另一侧,因为它是如此狭窄。搜索梯度下降蜿蜒曲折,你会看到许多插图展示这种行为。

为了防止在狭窄的长谷底部来回摇摆(假设我们没有提前缩放输入特征值),一个修正方法是选择非常小的学习率,防止梯度下降方法从谷的一侧跨越到另一侧。然而,这会以自己的方式减慢到达最小值的速度,因为方法每次迭代只会逐步前进。这样,我们最终会从罗马到梵蒂冈,但速度很慢。

在损失函数景观的最小值(局部和/或全局)、平坦区域或鞍点附近,梯度下降方法爬行。

梯度下降方法通过添加向量- η ∇ L ( ω → i ) 更新当前点ω → i。因此,从点ω → i沿着负梯度向量的方向的步长是η乘以梯度向量∇ L ( ω → i )的长度。在损失函数的景观中的最小值、最大值、鞍点或任何平坦区域附近,梯度向量为零,因此其长度也为零。这意味着在最小值、最大值、鞍点或任何平坦区域附近,梯度下降方法的步长变得非常小,方法会显著减慢。如果这发生在最小值附近,那么就没有太多担心,因为这可以作为停止准则,除非这个最小值是离全局最小值很远的局部最小值。另一方面,如果发生在平坦区域或鞍点附近,那么方法将会在那里停留一段时间,这是不可取的。一些从业者将学习率η放在一个时间表上,在优化过程中改变其值。当我们研究这些时,我们注意到目标是避免爬行,节省计算时间,并加快收敛速度。

我们将在本章后面讨论随机梯度下降。由于这种方法的随机性质,点会频繁跳动,而不是沿着更一致的路径朝向最小值前进。这在我们被困的情况下(如鞍点或局部最小值)对我们有利,因为我们可能会被随机地推出局部最小值或远离鞍点,进入一个更好朝向最小值的部分景观。

vs非凸景观

我们不能没有讨论凸性的优化章节。事实上,整个数学领域专门致力于凸优化。立即注意到的是,神经网络的优化通常是非凸的。

当我们使用非凸激活函数,例如图 4-5 中第一行中的 S 型函数时,导致的神经网络中涉及的损失函数的景观不是凸的。这就是为什么我们花了大量时间讨论在局部最小值、平坦区域和鞍点处卡住的问题,而对于凸景观,我们不会担心这些。凸和非凸景观之间的对比在图 4-10 中是明显的,它展示了一个凸损失函数及其等高线图,以及图 4-11 和图 4-12,展示了非凸函数及其等高线图。

250

图 4-10。三维凸函数及其等高线图。梯度向量存在于与等高线图相同的空间(ℝ 2),而不是ℝ 3。

250

图 4-11。三维非凸函数及其等高线图。梯度向量存在于与等高线图相同的空间(ℝ 2),而不是ℝ 3。

250

图 4-12。三维非凸函数及其等高线图。梯度向量存在于与等高线图相同的空间(ℝ 2),而不是ℝ 3。

当我们在整个网络中使用凸激活函数,例如图 4-5 中第二行中的 ReLU 型函数,凸损失函数时,我们仍然可能遇到一个凸凸优化问题,因为两个凸函数的组合不一定是凸的。如果损失函数恰好是非递减的和凸的,那么它与凸函数的组合就是凸的。神经网络中流行的损失函数,如均方误差、交叉熵和铰链损失都是凸的,但不是非递减的。

熟悉凸优化的中心概念是很重要的。如果你不知道从哪里开始,记住凸性取代了线性当线性过于简单或不可用时,然后学习关于以下内容的一切(这将与我们在运筹学章节中讨论的人工智能、深度学习和强化学习相关联):

  • 线性函数的最大值是凸的

  • 最大最小和最小最大

  • 鞍点

  • 两人零和博弈

  • 对偶

由于凸优化是一个发展成熟且被理解的领域(至少比神经网络的数学基础更为深入),而神经网络在数学上仍有很长的路要走,如果我们能利用我们对凸性的知识来更深入地理解神经网络将是很好的。这一领域的研究正在进行中。例如,在一篇最近的论文(2020 年)中,题为两层 ReLU 网络的凸几何:隐式自编码和可解释模型,作者将训练两层 ReLU 网络的问题框架为一个凸解析优化问题。以下是该论文的摘要:

我们为 ReLU 神经网络开发了一个凸解析框架,阐明了隐藏神经元及其函数空间特征的内部工作。我们展示了神经网络中的修正线性单元作为凸正则化器,通过某个凸集的极端点鼓励简单解决方案。对于一维回归和分类,我们证明了带有范数正则化的有限两层 ReLU 网络产生线性样条插值。在更一般的高维情况下,我们展示了两层网络的训练问题可以被视为一个具有无限多个约束的凸优化问题。然后我们提供了一系列凸松弛来近似解决方案,并提供了一个切割平面算法来改进这些松弛。我们推导了松弛的准确性条件,并在某些情况下为最优神经网络权重提供了简单的闭合形式公式。我们的结果表明,ReLU 网络的隐藏神经元可以被解释为输入层的凸自编码器。我们还建立了与压缩感知中最小基数解类似的神经网络的l 0 - l 1等价性的联系。大量实验结果表明,所提出的方法产生了可解释且准确的模型

随机梯度下降

到目前为止,前馈神经网络的训练进展如下:

  1. 为训练函数固定一组初始权重ω → 0。

  2. 在训练子集中的所有数据点上评估这个训练函数。

  3. 通过将它们的真实标签与训练函数所做的预测进行比较,计算训练子集中所有数据点的个体损失。

  4. 对训练子集中的所有数据执行此操作。

  5. 对所有这些个体损失求平均。这个平均值就是损失函数。

  6. 在这组初始权重处评估这个损失函数的梯度。

  7. 根据最陡下降规则选择下一组权重。

  8. 重复直到收敛到某个地方,或者根据验证集上训练函数的性能确定一定数量的迭代次数后停止。

以上过程的问题在于,当训练子集包含数千个点,神经网络包含数千个权重时,评估训练函数、损失函数以及在训练子集中的所有数据点上评估损失函数的梯度变得太昂贵。解决方法是随机化过程:随机选择训练子集的一个非常小的部分,在每一步评估训练函数、损失函数以及这个损失函数的梯度。这样可以大大减少每一步的计算成本。

重复这种随机选择(原则上是有替换的,但实际上是无替换的)训练子集的小部分,直到收敛到某个地方,或者根据验证集上训练函数的性能确定一定数量的迭代次数后停止。一次完整的训练子集称为一个时代

随机梯度下降表现出色,已成为训练神经网络的重要方法。

初始化权重ω → 0以进行优化过程

我们已经确定,使用全零权重或全相同权重进行初始化是一个非常糟糕的主意。下一个合乎逻辑的步骤,也是传统做法(2010 年之前)将初始权重随机选择,可以从均匀分布中抽样,例如[-1,1]、[0,1]或[-0.3,0.3],或者从高斯分布中抽样,具有预先选择的均值和方差。尽管这方面尚未深入研究,但根据经验证据,初始权重是从均匀分布还是高斯分布中抽样似乎并不重要,但初始权重的规模对于优化过程的进展以及网络泛化到未见数据的能力似乎很重要。事实证明,在这方面有一些选择比其他选择更好。目前,两种最先进的选择取决于激活函数的选择,无论是 Sigmoid 类型还是 ReLu 类型。

Xavier Glorot 初始化

在这里,初始权重是从均匀分布中随机抽样,范围是[ - 6 n+m , 6 n+m ],其中 n 是节点的输入数量(例如,前一层中的节点数量),m 是该层输出的数量(例如,当前层中的节点数量)。

He 初始化

在这里,初始权重是从均值为零、方差为 2/n 的高斯分布中随机抽样,其中 n 是节点的输入数量。

正则化技术

正则化帮助我们找到训练函数权重的良好选择,同时避免过拟合数据。我们希望我们训练的函数跟随数据中的信号而不是噪音,这样它可以很好地泛化到未见的数据。在这里,我们包括四种简单但流行的正则化技术,这些技术在训练神经网络时使用:Dropout、提前停止、批量归一化和权重衰减(岭回归、Lasso 和弹性网络)正则化。

Dropout

在训练过程中,从每一层中随机删除一些神经元。通常,会随机删除输入层节点的约百分之二十,以及每个隐藏层节点的约一半。不会删除输出层的节点。Dropout 在一定程度上受到遗传繁殖的启发,其中一半父母的基因被删除,然后有一个小的随机突变。这样做的效果是同时训练不同的网络(每层节点数量不同)并对它们的结果进行平均,通常会产生更可靠的结果。

实现 dropout 的一种方法是为每个层引入一个超参数p,该参数指定该层中每个节点被丢弃的概率。回想一下每个节点发生的基本操作:线性组合前一层节点的输出,然后激活。使用 dropout,前一层节点的每个输出(从输入层开始)都乘以一个随机数r,该随机数可以是零或一,概率为p。因此,当一个节点的r取零时,该节点实际上从网络中被丢弃,这样在调整权重时,其他保留节点就需要在一个梯度下降步骤中接管。我们将在反向传播部分进一步解释这一点,这个链接提供了一个实现 dropout 的逐步路线。

对于更深入的数学探索,以下论文(2015)将 dropout 与模型不确定性的贝叶斯近似联系起来。

提前停止

在训练过程中更新权重时,特别是在梯度下降期间,每个时代之后,我们评估训练函数在当前权重下对数据的验证子集所产生的错误。这个错误应该随着模型学习训练数据而减少,然而,在一定数量的时代之后,这个错误将开始增加,表明训练函数现在开始过度拟合训练数据,并且无法很好地泛化到验证数据。一旦我们观察到模型在验证子集上的预测增加,我们就停止训练,并回到那个错误最低的权重集,就在我们开始观察到增加之前。

每层的批量归一化

这里的主要思想是对网络的每一层的输入进行归一化。这意味着每一层的输入将具有零均值和单位方差。通常通过减去每个层输入的均值并除以方差来实现这一点。我们稍后会详细说明这一点。在每个隐藏层这样做的原因与在原始输入层这样做的原因类似。

应用批量归一化通常消除了对 dropout 的需求,并使我们对初始化不那么挑剔。它使训练更快,更安全,避免了梯度消失和梯度爆炸。它还具有正则化的额外优势。所有这些收益的成本并不太高,因为通常只涉及训练每层的两个额外参数,一个用于缩放,一个用于移位。Ioffe 和 Szegedy(2015)的论文介绍了这种方法。他们的论文摘要描述了批量归一化过程以及它解决的问题(括号内是我的评论):

训练深度神经网络变得复杂,因为在训练过程中,每一层的输入分布会随着前面层的参数变化而改变。这需要更低的学习率和谨慎的参数初始化,从而减慢训练速度,并且使得训练具有饱和非线性的模型变得非常困难(例如在图 4-5 中的 Sigmoid 类型激活函数,当输入的幅度很大时,输出几乎保持不变,这使得非线性在训练过程中变得无用,网络在后续层停止学习)。我们将这种现象(每一层输入分布的变化)称为内部协变量转移,通过对层输入进行归一化来解决这个问题。我们的方法之所以有效,是因为将归一化作为模型架构的一部分,并对每个训练小批量执行归一化。批量归一化使我们能够使用更高的学习率,对初始化要求不那么严格,在某些情况下甚至可以消除 Dropout 的需要。应用于最先进的图像分类模型时,批量归一化在 14 倍更少的训练步骤下达到相同的准确率,并且明显超过原始模型。通过使用批量归一化网络的集成,我们改进了 ImageNet 分类的最佳已发布结果:达到 4.82%的前 5 测试错误率,超过了人类评分者的准确率。

批量归一化通常在网络的架构中实现,要么在激活步骤之前作为独立层,要么在激活之后。在训练期间,通常按照以下步骤进行:

  1. 从大小为 b 的训练数据中选择一个批次。每个数据点都有特征向量x i →,因此整个批次具有特征向量x 1 → , x 2 → , ⋯ , x b →。

  2. 计算向量,其条目是该特定批次中每个特征的均值:μ → = x 1 →+x 2 →+⋯+x b → b。

  3. 计算批次的方差:从每个x 1 → , x 2 → , ⋯ , x b →中减去μ →,计算结果的l 2范数,相加,然后除以b

  4. 通过减去均值并除以方差的平方根来对x 1 → , x 2 → , ⋯ , x b →进行归一化:

  5. 通过可由梯度下降初始化和学习的可训练参数进行缩放和移位,与训练函数的权重学习方式相同。这成为第一个隐藏层的输入。

  6. 对于每个后续层的输入执行相同操作。

  7. 为下一批次重复。

在测试和预测过程中,没有数据批次可供训练,每一层的参数已经学习。然而,批量归一化步骤已经融入到训练函数的公式中。在训练过程中,我们正在更改这些每批次的训练数据。这反过来会稍微改变每批次的损失函数公式。然而,规范化的目的部分是不要过分改变损失函数的公式,因为这会改变其最小值的位置,这将导致我们永追逐一个移动的目标。好了,我们在训练过程中通过批量归一化解决了这个问题,现在我们想要验证、测试和预测。那么我们在测试/预测时应该使用哪个均值和方差向量?我们应该使用原始数据集的特征的均值和方差吗?我们必须做出这样的决定。

通过惩罚它们的范数来控制权重的大小

另一种规范化训练函数的方法,以避免过拟合数据,是在最小化问题中引入一个竞争项。而不是仅解决使损失函数最小化的权重集合ω →:

min ω → L ( ω → ) ,

我们引入一个新项α ∥ ω → ∥并解决使权重集合ω →最小化的问题:

min ω → L ( ω → ) + α ∥ ω → ∥ .

例如,对于通常用于回归问题的均方误差损失函数,最小化问题如下所示:

min ω → 1 m ∑ i=1 m | y predict ( ω → ) - y true | 2 + α ∥ ω → ∥

迄今为止,我们已经建立了两种解决上述最小化问题的方法:

最小值出现在导数(梯度)为零的点处

因此,最小化ω →必须满足∇ L ( ω → ) + α ∇ ( ∥ ω → ∥ ) = 0。然后,如果我们有幸获得解的闭式形式,我们解这个方程得到ω →。在线性回归的情况下(我们可以将其视为一个极其简化的神经网络,只有一层和零非线性激活函数),我们有这种奢侈,对于这种正则化情况,最小化ω →的公式是:

ω → = (X t X+αB) -1 X t y → true ,

其中 X 的列是数据的特征列,增加了一个包含 1 的向量,B 是单位矩阵(如果我们使用下面讨论的岭回归)。对于带有正则化的极其简单的线性回归问题的闭式解有助于我们理解权重衰减类型的正则化以及它所起的重要作用:在非正则化解中,我们需要求逆矩阵( X t X )并担心其病态性(例如,来自高度相关的输入特征)和由此产生的不稳定性,而在正则化解中,我们需要求逆( X t X + α B )。添加这个α B项等同于向标量数的分母添加一个小正数项,帮助我们避免除以零:我们使用1 / ( x + α )而不是使用1 / x,其中x可能为零,我们使用一个正常数α。请记住,矩阵求逆是标量数除法的类比。

梯度下降

当我们没有幸运地获得导数为零的闭式解,以及当我们的问题非常庞大以至于计算二阶导数非常昂贵时,我们使用梯度下降或其任何变体,如随机梯度下降。

常用的权重衰减正则化

在本书中,有三种流行的正则化方法来控制我们永远在寻找的权重的大小:

  1. 岭回归:对ω →的l 2范数进行惩罚。在这种情况下,我们将项α ∑ i=1 n |ω i | 2添加到损失函数中,然后我们最小化。

  2. 套索回归:对ω的l 1范数进行惩罚。在这种情况下,我们将项α ∑ i=1 n | ω i |添加到损失函数中,然后我们最小化。

  3. 弹性网络:这是岭回归和套索回归之间的中间情况。我们引入一个额外的超参数γ,它可以取零到一之间的任何值,并通过γ将岭回归和套索回归结合起来添加到损失函数中的一个项:γ α ∑ i=1 n | ω i | 2 + ( 1 - γ ) α ∑ i=1 n | ω i |。当γ = 0时,这变成套索回归,当它等于一时,它是岭回归,当它在零和一之间时,它是某种中间地带。

何时使用普通线性回归、岭回归、套索回归或弹性网络?

如果您已经对构建机器学习模型的多种选择感到困惑和有些不知所措,请加入我们,但不要感到沮丧。在数学分析告诉我们哪些选择比其他选择更好,并在什么情况下变得可用(或者通过数学计算和实验追赶我们)之前,想想可用选择的巨大数量,就像考虑家庭装修一样:我们必须从许多可用的材料、设计和架构中进行选择,以生产最终产品。这是一次家庭装修,而不是一次家庭装饰,因此我们的决定是决定性的,比单纯的家庭装饰更有意义。它们确实影响我们最终产品的质量功能,但它们仍然是选择。放心,有多种方法可以实现人工智能:

  1. 一些正则化总是有益的:添加一个控制权重大小并与最小化损失函数竞争的项通常是有益的。

  2. 岭回归通常是一个不错的选择,因为l 2范数是可微的。最小化这个范数比最小化l 1范数更稳定。

  3. 如果我们决定选择l 1范数,即使在 0 处不可微,我们可以定义其在零点的次梯度或次梯度为零(f(x)= | x |在x ≠ 0时是可微的。当 x>0 时,它的导数为 1,当 x<0 时为-1)。

  4. 如果我们怀疑只有少数特征是有用的,那么最好使用套索或弹性网络作为数据预处理步骤,以消除不太重要的特征。

  5. 弹性网络通常优于套索,因为当特征数量大于训练实例数量或多个特征强相关时,套索可能表现不佳。

惩罚l 2范数 vs 惩罚l 1范数

我们的目标是找到解决最小化问题的ω →:

min ω → L ( ω → , ω 0 → ) + α ∥ ω → ∥ .

第一个术语希望减少损失L ( ω → , ω 0 → )。另一个术语希望减少ω →的坐标值,一直减少到零。我们选择∥ ω → ∥的范数类型决定了ω →到0 →的路径。如果我们使用l 1范数,ω →的坐标将减少,然而,很多坐标可能会过早地变为零,比其他坐标更早。也就是说,l 1范数鼓励稀疏性:当一个权重消失时,它会消除相关特征对训练函数的贡献。在图 4-13 右侧的图中显示了∥ ω → ∥ l 1 = | ω 1 | + | ω 2 |在二维空间中的菱形级别集(如果我们只有两个特征),即,| ω 1 | + | ω 2 | = c对于不同的c*值。如果一个最小化算法遵循最陡下降的路径,比如梯度下降,那么我们必须沿着垂直于级别集的方向前进,正如图中箭头所示,ω 2很快变为零,因为沿着垂直于菱形级别集的方向必然会碰到其中一个坐标轴,有效地消除了相应的特征。然后ω 1沿着水平轴前进到零。

250

图 4-13。左侧的图显示了 l 2 范数的圆形级别集,以及梯度下降沿着朝向最小值 ( 0 , 0 ) 的方向。右侧的图显示了 l 1 范数的菱形级别集,以及梯度下降沿着朝向最小值 ( 0 , 0 ) 的方向。
  • 如果我们使用 l 2 范数,权重的大小会变小,而不会将它们彻底消除。图 4-13 中左侧的图显示了二维空间中 ∥ ω → ∥ l 2 = ω 1 2 + ω 2 2 的圆形级别集,沿着垂直于圆形级别集的路径朝向最小值 ( 0 , 0 ) 减少了 ω 1 和 ω 2 的值,而不会使它们中的任何一个在另一个之前变为零。

选择哪种范数取决于我们的用例。请注意,在所有情况下,我们不对偏置权重 ω 0 → 进行正则化。这就是为什么在本节中我们在损失函数中单独写出它们的原因 L ( ω → , ω 0 → ) 。

解释正则化超参数 α 的作用

带有权重衰减正则化的最小化问题如下所示:

min ω → L ( ω → ) + α ∥ ω → ∥

为了理解正则化超参数 α 的作用,我们观察到以下内容:

  • 第一个术语之间存在竞争,其中损失函数 L ( ω → ) 选择适合训练数据的训练函数的 ω ,而第二个术语只关心使 ω 的值变小。这两个目标不一定同步:使第一个术语变小的 ω 的值可能会使第二个术语变大,反之亦然。

  • 如果 α 很大,那么最小化过程将通过使 ω 的值非常小来进行补偿,无论这些小值的 ω 是否也会使第一项变小。因此,我们增加 α 的值,第二项的最小化变得比第一项更重要,因此我们最终的模型可能最终不能完全拟合数据(高偏差),但有时这是期望的(低方差),以便它能很好地推广到未知数据。

  • 另一方面,如果 α 很小(接近零),那么我们可以选择更大的 ω 值,并且最小化第一项变得更加重要。在这种情况下,最小化过程将导致使第一项满意的 ω 值,因此数据将很好地适应模型(低偏差),但方差可能很高。在这种情况下,我们的模型在已知数据上表现良好(通过最小化 L ( ω → ) 来设计得很好),但可能不会很好地推广到未知数据。

  • 当 α → 0 时,我们可以数学上证明正则化问题的解收敛到未正则化问题的解。

出现在机器学习中的超参数示例

我们现在已经遇到了许多进入机器学习模型的超参数。列出进入我们特定模型的超参数及其值是一个好习惯。让我们列出我们遇到的超参数,并记住调整这些参数可以提高我们模型的性能。大多数情况下,我们可以使用预先推荐的值。这些通常作为机器学习库和软件包中的默认值实现。然而,在建模过程的验证阶段,尽管需要有可用的时间和资源,尝试不同的值总是一个好主意。

  • 梯度下降中的学习率。

  • 权重衰减系数,如 Ridge、Lasso 和 Elastic Net 正则化中出现的系数。

  • 在停止训练之前的时代数量。

  • 数据分割成训练、验证和测试子集的大小。

  • 随机梯度下降及其变体中的小批量大小。

  • 动量方法中的加速系数。

  • 神经网络的架构:层数、每层神经元数量、每层发生的情况(批量归一化、激活函数类型)、正则化类型(dropout、ridge、lasso)、网络类型(前馈、稠密、卷积、对抗、循环)、损失函数类型等。

链式法则和反向传播:计算 ∇ L ( ω → i )

现在是时候动手计算一些重要的东西了:损失函数的梯度,即,∇ L ( ω → i ) 。无论我们决定使用梯度下降、随机梯度下降、小批量梯度下降或任何其他梯度下降的变体来找到最佳权重,都无法避免计算这个量。请记住,损失函数在其公式中包含了神经网络的训练函数,而训练函数又由后续的线性组合和激活函数组成。这意味着我们必须使用链式法则。聪明地使用。在微积分中,我们只使用了单变量的导数链式法则,但现在,我们不得不过渡到多变量的链式法则:有时是数十亿个变量。

神经网络的分层架构迫使我们停下来思考:我们究竟如何计算损失函数的导数。这里的工作马是反向传播算法(也称为反向模式自动微分),它是一个强大的算法。

在写出公式之前,让我们总结一下训练神经网络时遵循的步骤:

  • 训练函数是一个关于 ω → 的函数,因此数据点通过它后神经网络的结果,也就是在数据点上评估训练函数,是: o u t c o m e = f u n c t i o n ( ω → ) 。这由节点输出的线性组合和激活函数组成,重复在所有网络层上。输出层可能有或没有激活函数,可能有一个节点或多个节点,取决于网络的最终任务。

  • 损失函数提供了训练函数的结果与真实值偏离的程度的度量。

  • 我们使用一个随机的权重集 ω → 0 来初始化我们的学习函数,根据前几节中规定的首选初始化规则。然后我们计算损失,或者因为使用这些特定权重值而导致的错误。这是数据点通过网络的前向传递

  • 我们希望移动到下一个给出更低错误的权重集 ω → 1 。我们沿着损失函数的梯度向量的相反方向移动。

  • 但是:训练函数内置于损失函数中,考虑到神经网络的架构以及其高维度,我们如何有效地执行多变量链式法则,以找到梯度并在当前权重集上评估它呢?

答案是我们将数据点发送回网络,从输出层一直向输入层计算梯度向后,在途中评估每个节点如何导致错误。实质上,我们计算∂L/∂node functions,然后相应地调整权重,从ω⁰更新到ω¹。随着我们将更多数据点传递到网络中,这个过程会继续进行,通常是批量进行。每当网络看到完整的训练集时,就会计算一个epoch

反向传播与我们大脑学习的方式并没有太大不同

当我们遇到一个新的数学概念时,我们大脑中的神经元会建立某些连接。下次我们再次看到相同的概念时,相同的神经元连接得更好。对于我们的神经网络的类比是,连接神经元的边的值ω增加。当我们一遍又一遍地看到相同的概念时,它成为我们大脑模型的一部分。除非我们学到了撤销先前信息的新信息,否则这个模型不会改变。在这种情况下,神经元之间的连接会减弱。对于我们的神经网络,连接神经元的ω值会减少。通过最小化损失函数来微调ω,正是为了建立神经元之间的正确连接

神经科学家唐纳德·赫布在他 1949 年的著作中提到(paraphrased):当一个生物神经元经常触发另一个神经元时,这两个神经元之间的连接会变得更加牢固。换句话说,一起激活的细胞会一起连接。

同样,神经网络的计算模型考虑了网络产生结果时所产生的错误:由于计算机只能理解数字,如果节点有助于降低错误,则边的ω会增加,如果节点有助于增加错误函数,则ω会减少。因此,神经网络的学习规则通过增加相应的ω来加强减少错误的连接,并通过减少相应的ω来削弱增加错误的连接。

为什么反向传播更好?

反向传播计算训练函数对每个节点的导数,通过网络向移动。这衡量了每个节点对训练函数和损失函数的贡献。

这里要记住的最重要的公式是:微积分中的链式法则。这计算了链式函数(或函数组合)的导数。微积分的链式法则主要处理只依赖于一个变量ω的函数,例如,对于三个链式函数,关于ω的导数是:

d dω f 3 ( f 2 ( f 1 ( ω ) ) ) = { d dω f 1 ( ω ) } { d df 1 f 2 ( f 1 ( ω ) ) } { d f 2 f 3 ( f 2 ( f 1 ( ω ) ) ) }

对于神经网络,我们必须将链式法则应用于依赖于变量W和ω 0 → 的矩阵和向量的损失函数。因此,我们必须将上述规则推广到许多变量的链式法则。这样做的最简单方法是按照网络的结构计算导数,从输出层一直回溯到输入层。

如果我们决定通过网络向前计算导数,我们将不知道这些导数对每个变量的影响是否最终会对我们的最终结果产生影响,因为我们不知道它们是否会通过网络的图连接。即使图是完全连接的,深层的权重也不会出现在较早的层中,因此在早期层中计算它们的导数是一种巨大的浪费。

当我们通过网络向后计算导数时,我们从输出开始,沿着网络的图向后计算导数,计算每个节点的导数。每个节点的贡献仅从指向它的边和从它出去的边计算。这在计算上要便宜得多,因为现在我们确切知道这些节点如何以及何时对网络的结果产生影响。

在线性代数中,计算矩阵与向量的乘积要比计算两个矩阵的乘积便宜得多。我们必须始终避免将两个矩阵相乘:计算A ( B 𝐯 )比计算( A B ) 𝐯要便宜,尽管从理论上讲,这两者完全相同。对于大型矩阵和向量,这个简单的观察提供了巨大的成本节约。

反向传播详细说明

让我们停下来感谢软件包的存在,这样我们就永远不必自己实现以下计算。我们也不要忘记感谢这些软件包的创造者。现在我们开始计算。

对于具有h个隐藏层的神经网络,我们可以将损失函数写成训练函数的函数,而训练函数又是网络中出现的所有权重的函数:

L = L ( g ( W 1 , ω 0 → 1 , W 2 , ω 0 → 2 , ⋯ , W h , ω 0 → h , W h+1 , ω 0 → h+1 ) )

我们将反向计算L的偏导数,从∂L ∂W h+1开始,并从∂L ∂ω 0 → h+1开始,逐步回溯到∂L ∂W 1和∂L ∂ω 0 → 1。它们的导数是相对于相应矩阵或向量中的每个条目进行的。

假设为简单起见,但不失一般性,网络是一个回归网络,预测单个数值,因此训练函数g是标量(不是向量)。假设我们在整个网络中使用相同的激活函数f。输出神经元没有激活,因为这是一个回归问题。

对指向输出层的权重的导数:

L = L ( W h+1 s → h + ω 0 h+1 )

因此

∂L ∂ω 0 h+1 = 1 × L ' ( W h+1 s → h + ω 0 h+1 )

∂L ∂W h+1 = (s → h ) t L ' ( W h+1 s → h + ω 0 h+1 ) .

回想一下,s → h 是最后一层的输出,因此它取决于前几层的所有权重,即,( W 1 , ω 0 → 1 , W 2 , ω 0 → 2 , ⋯ , W h , ω 0 → h )。

对指向最后隐藏层的权重的导数

要计算这些导数,我们在损失函数的公式中明确显示它们:

L = L ( W h+1 ( f ( W h s → h-1 + ω 0 → h ) ) + ω 0 h+1 )

因此

∂L ∂ω 0 → h = 1 → ( W h+1 f ' ( W h s → h-1 + ω 0 → h ) ) L ' ( W h+1 ( f ( W h s → h-1 + ω 0 → h ) ) + ω 0 h+1 )

∂L ∂W h = s → h-1 ( W h+1 f ' ( W h s → h-1 + ω 0 → h ) ) L ' ( W h+1 ( f ( W h s → h-1 + ω 0 → h ) ) + ω 0 h+1 )

回想一下s → h-1是倒数第二个隐藏层的输出,因此它取决于前几层的所有权重,即( W 1 , ω 0 → 1 , W 2 , ω 0 → 2 , ⋯ , W h-1 , ω 0 → h-1 )。

我们系统地继续这个过程,直到达到输入层。

评估输入数据特征的重要性

数据分析师的一个目标是评估输入变量(数据特征)与输出或目标变量之间的相关性。

这里要回答的主要问题是:如果我们调整某个输入变量的值,输出的相对变化是多少?

例如,如果在给定的公交线路上增加一辆公交车,是否会影响整体的公交车乘客量?

我们所问的数学问题是一个导数问题:找到关于所讨论的输入变量的输出的偏导数。

在模型是线性的时候(敏感性分析),我们在统计学上有大量关于变量重要性的文献。当模型是非线性的,比如我们的神经网络模型时,相关文献就不那么多了。我们不能基于非线性模型做出预测,然后使用为线性模型设计的变量重要性分析。许多数据分析师在他们的分析中使用内置软件包时会陷入这种陷阱。这是另一个寻求深入理解我们基于业务决策的模型假设的原因。

总结和展望

这一章代表了我们正式进入人工智能领域的深度学习时代。虽然第三章介绍了传统但仍然非常有用的机器学习模型,第四章将神经网络添加到我们的机器学习模型库中。这两章都建立在训练函数、损失函数和优化的一般数学结构上,其中每个都针对特定任务和手头的模型进行了定制。

通过在神经网络的每个神经元上使用非线性激活函数,跨多个层,我们的训练函数能够捕捉到数据中复杂的特征,这些特征很难用非线性函数的显式公式描述。数学分析,特别是神经网络的通用逼近定理,支持这种直觉,并提供了一个理论背景,证明了神经网络的巨大成功。然而,这些定理仍然缺乏能力为我们提供一个构建特定任务和数据集的特殊网络的地图,因此我们必须尝试各种架构、正则化、超参数,直到我们获得一个在新的和未知数据上表现良好的神经网络模型。

神经网络非常适合处理具有大数据集的大问题。对于这样的大问题,优化任务需要高效且计算成本低廉的方法,尽管在这种规模下的所有计算都可以被视为昂贵的。随机梯度下降是流行的优化方法选择,而反向传播算法是这种方法的核心。更具体地说,反向传播算法计算当前权重选择下损失函数的梯度(或者当我们添加权重衰减正则化时的目标函数)。理解目标函数的景观对于任何优化任务都是至关重要的,作为一个经验法则,凸问题比非凸问题更容易优化。神经网络模型中涉及的损失函数通常是非凸的。

第四章是本书中最后一个基础(且较长)的章节。我们最终可以讨论更专门的人工智能模型,以及在需要时更深入的数学知识。接下来的章节彼此独立,所以按照对您当前应用领域更相关的顺序阅读它们。

最后,让我们总结一下本章中出现的数学内容,随着我们在这个领域的进展,我们必须更详细地阐述:

概率和测度

这是证明通用逼近类型定理所需的,将在概率章节中讨论。这也与与 Dropout 相关的不确定性分析有关。

统计学

在神经网络的每一层进行批量归一化时的输入标准化步骤,以及相关分布的重塑。

优化

梯度下降,随机梯度下降,凸和非凸景观。

线性代数上的微积分

反向传播算法:这是在矩阵函数上应用的微积分链式法则。