人工智能算法 卷3 深度学习和神经网络

978-7-115-55231-0
作者: [美] 杰弗瑞·希顿(Jeffery Heaton)
译者: 王海鹏
编辑: 陈冀康

图书目录:

详情

自早期以来,神经网络就一直是人工智能的支柱。现在,令人兴奋的新技术(例如深度学习和卷积)正在将神经网络带入一个全新的方向。在本书中,我们将演示各种现实世界任务中的神经网络,例如图像识别和数据科学。我们研究了当前的神经网络技术,包括ReLU 激活、随机梯度下降、交叉熵、正则化、Dropout 及可视化等。

图书摘要

版权信息

书名:人工智能算法(卷3):深度学习和神经网络

ISBN:978-7-115-55231-0

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    [美] 杰弗瑞•希顿(Jeffery Heaton)

译    王海鹏

责任编辑 陈冀康

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Simplified Chinese translation copyright ©2021 by Posts and Telecommunications Press. ALL RIGHTS RESERVED.

Artificial Intelligence for Humans, Volume 3: Deep Learning and Neural Networks by Jeffery Heaton

Copyright © 2015 Jeffery Heaton.

本书中文简体版由作者Jeffery Heaton授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


自早期以来,神经网络就一直是人工智能(Artificial Intelligence,AI)的支柱。现在,令人兴奋的新技术(如深度学习和卷积)正在将神经网络带入一个全新的方向。本书将演示各种现实世界任务中的神经网络,如图像识别和数据科学。我们研究了当前的神经网络技术,包括ReLU激活、随机梯度下降、交叉熵、正则化、Dropout及可视化等。

本书适合作为人工智能入门读者以及对人工智能算法感兴趣的读者阅读参考。


本书是介绍AI的系列图书中的卷3。AI是一个涵盖许多子学科的、研究广泛的领域。对没有读过本系列图书卷1或卷2的读者,本书简介将提供一些背景信息。读者无须在阅读本书之前先阅读卷1或卷2。下文介绍了可从卷1和卷2中获取的信息。

本系列图书将向读者介绍AI领域的各种热门主题。本系列图书无意成为巨细无遗的AI教程,但是,本系列每本书都专注于AI的某个特定领域,让读者熟悉计算机科学领域的一些最新技术。

本系列图书以一种数学上易于理解的方式讲授AI相关概念,这也是本系列图书英文书名中“for Human”的含义。因此,我会在理论之后给出实际的编程示例和伪代码,而不仅仅依靠数学公式进行讲解。尽管如此,我还是要做出以下假设:

书中示例均已改写为多种编程语言的形式,读者可以将示例适配于某种编程语言,以满足特定的编程需求。

本书中只给出了伪代码,具体示例代码则以Java、C#、R、C/C++和Python等语言形式提供,此外还有社区支持维护的Scala版本。社区成员们正在努力将示例代码转换为更多其他的编程语言,说不定当你拿到本书的时候,你喜欢的编程语言也有了相应的示例代码。访问本书的GitHub开源仓库可以获取更多信息,同时我们也鼓励大家通过社区协作的方式来帮助我们完成代码改写和移植工作。如果你也希望加入社区协作,我们将不胜感激。更多相关的流程信息可以参见本书附录A。

在线实验环境

本系列图书中的许多示例都使用了JavaScript,并且可以利用HTML5在线运行。移动设备也必须具有HTML5运行能力才能运行这些程序。所有的线上实验环境资料均可在以下网址中找到:

http://www.aifh.org

这些线上实验环境使你即使是在移动设备上阅读电子书时也能尝试运行各种示例。

代码仓库

本系列图书中的所有代码均基于开源许可证Apache 2.0发布,相关内容可以在以下GitHub开源仓库中获取:

https://github.com/jeffheaton/aifh

附带JavaScript实验环境示例的线上实验环境则保存在以下开源仓库中:

https://www.heatonresearch.com/aifh/

如果你在运行示例时发现其中有拼写错误或其他错误,可以派生(fork)该项目并将修订推送到GitHub。你也会在越来越多的贡献者中获得赞誉。有关贡献代码的更多信息,请参见附录A。

系列图书出版计划

本系列图书的写作计划如下。

卷1~卷3将会依次出版;卷0则会作为“提前计划好的前传”,在本系列图书出版接近尾声之际完成。本系列所有图书都将包含实现程序所需的数学公式,前传将对较早几卷中的所有概念进行回顾和扩展。在本书出版后,我还打算编写更多有关AI的图书。

通常,你可以按任何顺序阅读本系列图书。每本书的介绍都将提供各卷的一些背景资料。这种组织方式能够让你快速跳转到包含你感兴趣的领域的卷。如果你想在以后补充知识,可以阅读卷2。

其他资源

当你在阅读本书的时候,互联网上还有很多别的资源可以帮
助你。

首先是可汗学院,它是一个非营利性的教育网站,上面收集并整理了许多讲授各种数学概念的视频。如果你需要复习某个概念,可汗学院官网上很可能就有你需要的视频讲解,读者可以自行查找。

其次是网站“神经网络常见问答”(Neural Network FAQ)。作为一个纯文本资源,上面拥有大量神经网络和其他AI领域的相关信息。

此外,Encog项目的维基百科页面也有许多机器学习方面的内容,并且这些内容并不局限于Encog项目。

最后,Encog的论坛上也可以讨论AI和神经网络相关话题,该论坛非常活跃,你的问题很可能会得到某个社区成员甚至我本人的回复。

神经网络的出现可追溯到20世纪40年代,因此,其有相当长的发展历史。本书将介绍神经网络的发展历史,因为你需要了解一些术语。激活函数是其中一个很好的例子,它可以缩放神经网络中神经元的值。阈值激活函数是研究人员引入了神经网络时的早期选择,而后S型激活函数、双曲正切激活函数、修正线性单元(Rectified Linear Unit,ReLU)激活函数等相继被提出。虽然目前大多数文献都建议仅使用ReLU激活函数,但你需要了解S型激活函数和双曲正切激活函数,才能理解ReLU激活函数的优势。

只要有可能,我们就会指出要使用神经网络的哪个架构组件。我们总是会将现在大家接受的架构组件指定为推荐选择,而不是较早的经典组件。我们将许多这些架构组件放在一起,并在第14章“构建神经网络”中为你提供一些有关构建神经网络的具体建议。

在神经网络的发展历程中,神经网络曾几次从灰烬中重生。McCulloch W.和Pitts W.(1943)首先提出了神经网络的概念。但是,他们没有方法来训练这些神经网络。程序员必须手工制作这些早期神经网络的权重矩阵。由于这个过程很烦琐,因此神经网络首次被弃用了。

Rosenblatt F.(1958)提出了一种训练算法,即反向传播算法,该算法可自动创建神经网络的权重矩阵。实际上,反向传播算法有许多神经元层,可模拟动物大脑的结构,但是,反向传播算法的速度很慢,并且会随着层数的增加变得更慢。从20世纪80年代到20世纪90年代初期计算能力的增加似乎有助于神经网络执行任务,但这个时代的硬件和训练算法无法有效地训练多层神经网络,神经网络又一次被弃用了。

神经网络的再次兴起,是因为Hinton G.(2006)提出了一种全新的深度神经网络训练算法。高速图形处理单元(Graphics Processing Unit,GPU)的最新进展,使程序员可以训练具有三层或更多层的神经网络。程序员逐步意识到深层神经网络的好处,从而促使该技术重新流行。

为了奠定本书其余部分的基础,我们从分析经典的神经网络开始,这些经典的神经网络对各种任务仍然有用。我们的分析包括一些概念,如自组织映射(Self-Organizing Map,SOM)、霍普菲尔德神经网络(Hopfield neural network)和玻尔兹曼机(Boltzmann machine)。我们还介绍了前馈神经网络(FeedForward Neural Network,FFNN),并展示了几种训练它的方法。

具有许多层的前馈神经网络变成了深度神经网络。这本书包含训练深度网络的方法,如GPU支持。我们还会探索与深度学习相关的技术,如随机Dropout、正则化和卷积。最后,我们通过一些深度学习的真实示例来演示这些技术,如预测建模和图像识别。

你可以按任何顺序阅读本系列图书,但是,本书确实扩展了卷1和卷2中介绍的某些主题。本部分内容的目的是帮助你了解神经网络及其使用方法。大多数人(甚至不是程序员)都听说过神经网络。许多科幻小说的故事都基于神经网络的思想。因此,科幻作家创造了一些有影响力但可能不准确的神经网络观点。

大多数行业外的人都认为神经网络是一种人工大脑。根据这种观点,神经网络可以驱动机器人,或与人类进行智能对话,但是,与神经网络相比,这个概念更接近AI的定义。尽管AI致力于创建真正的智能机器,但计算机的当前状态远低于这一目标。人类的智能仍然胜过计算机的智能。

神经网络只是AI的一小部分。正如神经网络目前的样子,它们执行的是微小的、高度特定的任务。与人脑不同,基于计算机的神经网络不是通用的计算设备。此外,术语“神经网络”可能会给人造成困惑,因为由大脑神经元构成的网络,也被称为神经网络。为了避免这个问题,我们必须做出重要的区分。

实际上,我们应该将人脑称为生物神经网络(Biological Neural Network,BNN)。大多数书籍都不会特别区分BNN和人工神经网络(Artificial Neural Network,ANN),本书也是。当我们提到“神经网络”这个术语时,指的是ANN而不是BNN。

BNN和ANN具有一些非常基本的相似性。如BNN启发了ANN的数学构造。生物合理性描述了各种ANN算法。“神经网络”这个术语决定了ANN算法与BNN算法的高度相似性。

如前所述,程序员设计神经网络来执行一项小任务。完整的应用程序可能会使用神经网络来完成应用程序的某些部分,但是,整个应用程序不会只实现一个神经网络。它可能由几个神经网络组成,每个神经网络都有特定的任务。

模式识别是神经网络可以轻松完成的任务。对于这种任务,你可以将一个模式传入神经网络,然后它将一个模式传回给你。在最高层面上,典型的神经网络只能执行这个功能。尽管某些神经网络可能会取得更大的成就,但绝大多数神经网络以这种方式工作。图1展示了这个层面上的一个神经网络。

图1 典型的神经网络

如你所见,上述神经网络接收一个模式并返回一个模式。神经网络是同步运行的,只有在输入后才会输出。这种行为不同于人脑,人脑不是同步运行的。人脑对输入做出响应,但是它会在任何它愿意的时候产生输出!

神经网络结构

神经网络由一些层组成,各层的神经元相似。大多数神经网络都至少具有输入层和输出层,程序将输入模式交给输入层,然后,输出模式从输出层返回。在输入层和输出层之间是一个黑盒。黑盒是指你不完全了解神经网络为何输出它的结果。现在,我们还不关心神经网络或黑盒的内部结构。许多不同的架构定义了输入层和输出层之间的不同交互。稍后,我们将研究其中一些架构。

输入和输出模式都是浮点数数组。用以下方式表示这些数组。

神经网络输入:[−0.245, 0.283, 0.0]。

神经网络输出:[0.782, 0.543]。

上面的神经网络在输入层中有三个神经元,在输出层中有两个神经元。即使重构神经网络的内部结构,输入层和输出层中神经元的数量也不会改变。

要利用该神经网络,你调整表达问题的方式,使得输入是浮点数数组。同样,问题的解也必须是浮点数数组。归根结底,这种表达是神经网络唯一可以执行的。换言之,它们接收一个数组,并将其转换为第二个数组。神经网络不会循环,不会调用子程序,或执行你在传统编程中可能想到的任何其他任务。神经网络只是识别模式。

你可以认为神经网络是传统编程中将键映射到值的哈希表。它的作用有点像字典。你可以将以下内容视为一种类型的哈希表:

该表在单词和它们的定义之间创建了映射。编程语言通常称之为哈希映射或字典。上述哈希表用字符串类型的键来引用另一个值,引用的值也是相同类型的字符串。如果你以前从未使用过哈希表,那么可以将它们理解为将一个值映射到另一个值的一种索引形式。换言之,当你为字典提供一个键时,它会返回一个值。大多数神经网络都以这种方式工作。一种名为“双向关联记忆”(Bidirectional Associative Memory,BAM)的神经网络可让你提供值并给出键。

编程时使用的哈希表包含键和值。可以将传入神经网络输入层的模式视为哈希表的键,将从神经网络输出层返回的模式视为哈希表返回的值。尽管类比哈希表和神经网络可以帮助你理解这个概念,但是你需要认识到神经网络不仅仅是哈希表。

如果你提供的单词不是映射中的键,那么前面的哈希表会发生什么呢?为了回答这个问题,我们将输入键“wrote”。对于这个例子,哈希表将会返回null。它会以某种方式表明找不到指定的键。但是,神经网络不会返回null,而是找到最接近的匹配项。它们不仅会寻找最接近的匹配项,还会修改输出以估计缺失的值。因此,如果你对神经网络输入“wrote”,那么很可能会收到输入“write”时期望的结果。你也可能会收到其他键对应的输出,因为没有足够的数据供神经网络修改响应。数量有限的样本(在这个例子中是3个)会导致出现这种结果。

上面的映射提出了关于神经网络的重要观点。如前所述,神经网络接收一个浮点数数组并返回另一个数组。这个行为引发了一个问题,即如何将字符串或文本值放入神经网络。尽管存在解决方案,但对神经网络而言,处理数字数据比处理字符串要容易得多。

实际上,这个问题揭示了神经网络编程中最困难的一个方面。如何将问题转换为固定长度的浮点数数组?在下面的示例中,你将看到神经网络的复杂性。

一个简单的例子

在计算机编程中,习惯提供一个“Hello World”应用程序,它只是显示文本“Hello World”。如果你已经阅读过有关神经网络的文章,那么肯定会看到使用异或(XOR)运算符的示例,该运算符示例是神经网络编程的一种“Hello World”应用程序。在后文,我们将描述比XOR更复杂的场景,但它是一个很好的示例。我们将从XOR运算符开始,把它当作一个哈希表。如果你不熟悉XOR运算符,其工作原理类似于AND/OR运算符。要使AND运算结果为真,双方都必须为真;要使OR运算结果为真,必须有任何一方为真;要使XOR运算结果为真,双方真假必须互不相同。XOR的真值表如下:

False XOR False = False 
True XOR False = True
False XOR True = True 
True XOR True = False

用哈希表表示,则上述真值表表示如下:

[0.0, 0.0] −> [0.0]
[1.0, 0.0] −> [1.0]
[0.0, 1.0] −> [1.0]
[1.0, 1.0] −> [0.0]

这些映射展示了神经网络的输入和理想的预期输出。

训练:有监督和无监督

如果指定了理想的输出,你就在使用有监督训练;如果没有指定理想的输出,你就在使用无监督训练。有监督训练会让神经网络产生理想的输出,无监督训练通常会让神经网络将输入数据放入由输出神经元计数定义的多个组中。

有监督训练和无监督训练都是迭代过程。对于有监督训练,每次迭代都会计算实际输出与理想输出的接近程度,并将这种接近程度表示为错误百分比。每次迭代都会修改神经网络的内部权重矩阵,目的是将错误率降到可接受的低水平。

对于无监督训练,计算错误并不容易。由于没有预期的输出,因此无法测量无监督的神经网络与理想输出差多少。因为没有理想的输出,所以你只是进行固定次数的迭代,并尝试训练神经网络。如果神经网络需要更多训练,那么程序会提供。

上述训练数据的另一个重要方面在于,你可以按任何顺序进行训练。无论哪种训练方式,对两个0应用XOR(0 XOR 0)的结果将为0。并非所有神经网络都具有这种特性。对于XOR运算符,我们可能会使用一种名为“前馈神经网络”的神经网络,其中训练集的顺序无关紧要。在本书的后面,我们将研究循环神经网络(Recurrent Neural Network,RNN),它确实需要考虑训练数据的顺序。顺序是简单循环神经网络的重要组成部分。

刚才,你看到简单的XOR运算符利用了训练数据。现在,我们将分析一种情况,它使用了更复杂的训练数据。

每加仑的英里数

通常,神经网络问题涉及一些数据,你可以利用这些数据来预测后来的数据集的值。在训练了神经网络之后,就会得到后来的数据集。神经网络的功能是根据从过去的数据集中学到的知识,来预测全新数据集的结果。考虑一个包含以下字段的汽车数
据库:

尽管我们过度简化了数据,但并不影响本示例演示如何格式化数据。假设你已经针对这些字段收集了一些数据,那么你应该能够构建一个神经网络,来根据其他字段的值来预测某个字段的值。对于这个示例,我们将尝试预测每加仑的英
里数。

如前所述,我们需要将一个浮点数输入数组映射到浮点数输出数组,从而定义这个问题。但是,该问题还有一个附加要求,即这些数组元素中每一个数字的范围应为0~1或者−1~1。这个操作称为归一化。它获取现实世界的数据,并将其转换为神经网络可以处理的形式。

首先,我们需要确定如何归一化以上数据。请考虑神经网络的架构。我们共有6个字段,要使用其中5个字段来预测剩余的1个字段。因此,神经网络将具有5个输入神经元和1个输出神经元。

你的神经网络类似下面这样。

接着我们还需要归一化数据。为了完成归一化,我们必须为这些字段的值都考虑一个合理的范围。然后,我们将输入数据转换为0~1的数字,代表该范围内实际值的位置。考虑以下设置了合理范围的示例。

考虑到当今的汽车,这些范围可能很大,但是,这个特征将使神经网络的重组最少。我们也希望避免在靠近范围的两端出现太多数据。

为了说明这一范围,我们将考虑归一化车重2 000磅(约907千克)的问题。这在上述车重范围中为1 900(即2 000−100),而范围的大小为4 900(即5 000−100),范围大小的占比为0.38(即1 900/4 900)。因此,我们会将0.38提供给输入神经元,以表示该值。这个过程满足输入神经元0~1的范围要求。

混合动力或常规动力字段的值为true或false。为了表示该值,我们用1表示混合动力,用0表示常规动力。我们只需将true或false归一化为1或0两个值即可。

既然你已经了解了神经网络的一些用法,现在该确定如何为特定问题选择合适的神经网络了。在随后的内容中,我们提供了各种可用的神经网络路线图。

本书包含各种类型的神经网络。我们将提供这些神经网络及其示例,展示特定问题域中的神经网络。并不是所有神经网络都适用于每一个问题域。作为神经网络程序员,你需要知道针对特定问题使用哪个神经网络。

这里提供了通往本书其余部分的高级路线指引,它将指导你阅读本书中你感兴趣的领域。表1展示了本书中的神经网络类型及其适用的问题域。

表1 神经网络类型和问题域

类型

聚类

回归

分类

预测

机器人

视觉

优化

自组织映射

√√√

前馈

√√√

√√√

√√

√√

√√

Hopfield

玻尔兹曼机

√√

深度信念网络

√√√

√√

√√

深度前馈

√√√

√√√

√√

√√√

√√

NEAT

√√

√√

√√

CPPN

√√√

√√

HyperNEAT

√√

√√

√√√

√√

卷积网络

√√√

√√√

√√√

埃尔曼网络

√√

√√

√√√

若当网络

√√

√√

√√

√√

循环网络

√√

√√

√√√

√√

表1列出的问题域说明如下。

勾选标记(√)的数量给出了每种神经网络类型对该特定问题的适用性。如果没有勾选,则说明无法将该神经网络类型应用于该问题域。

所有神经网络都有一些共同的特征,如神经元、权重、激活函数和层,它们是神经网络的构建块。在本书的第1章中,我们将介绍这些概念,并介绍大多数神经网络共有的基本特征。

本书包含一些数据集,这些数据集让我们能够展示神经网络在实际数据中的应用。我们选择了几个数据集来介绍如回归、分类、时间序列和计算机视觉等主题。

MNIST手写数字数据集

本书中有几个示例使用了MNIST手写数字数据集(以下简称MNIST数据集)。MNIST数据集是一个大型的手写数字数据集,程序员可以用它来训练各种图像处理系统。这个经典数据集经常与一些神经网络一起提供。该数据集实质上是神经网络的“Hello World”程序。

MNIST数据集以特殊的二进制格式存储。你可以在互联网上找到这种格式。本书提供的示例程序可以读取这种格式。

MNIST数据集包含许多手写数字。它还包括60 000个示例的训练集和10 000个示例的测试集。两个集合上都提供标签,以指示每个数字应该是什么。MNIST数据集是一个经过大量研究的数据集,程序员经常将它作为新机器学习算法和技术的基准。此外,研究人员已经发表了许多有关他们试图实现最低错误率的科学论文。在一项研究中,研究人员使用卷积神经网络(Convolutional Neural Network,CNN)的分层系统,设法在MNIST数据集上实现了0.23%的错误率[1]

图2展示了该数据集的一个样本。

图2 MNIST手写数字样本

我们可以将这个数据集用于分类神经网络。神经网络学会观察图像,并将它分到10个数字中的适当位置。虽然这个数据集用于基于图像的神经网络,但是你也可以认为它是传统数据集。这些图像的大小是28像素×28像素。尽管这些图像令人印象深刻,但本书将从使用常规的神经网络开始,用784(即28×28)个输入神经元的神经网络来处理这些图像。你将使用相同类型的神经网络,来处理具有大量输入的所有分类问题。这样的问题是高维度的。在本书的后面,我们将学习如何使用专门为图像识别设计的神经网络。与较传统的神经网络相比,这些神经网络在MNIST数据集上的性能要好得多。

鸢尾花数据集

由于AI经常使用鸢尾花数据集[2],因此你会在本书中多次看到它。Ronald Fisher爵士(1936)收集了这些数据,作为判别分析的一个例子。即使在今天,该数据集在机器学习中也非常流行。

鸢尾花数据集包含150朵鸢尾花的测量值和物种信息,该数据集实质上可表示为具有以下列或特征的电子表格:

这里的“花瓣”是指鸢尾花最里面的花瓣,而“萼片”是指鸢尾花最外面的花瓣。尽管该数据集似乎是长度为5的向量,但种类特征的处理必须与其他4个特征不同。换言之,向量通常仅包含数字。因此,前4个特征本质上是数字,而种类特征不是。

这个数据集的主要应用之一是创建一个程序,作为分类器。也就是说,它将花朵的特征作为输入(萼片长度、花瓣宽度等),并最终确定种类。对于完整的已知数据集,这种分类将是微不足道的,但我们的目标是使用未知鸢尾花的数据来查看模型是否可以正确识别物种。

简单的数字编码能将鸢尾花种类转换为单个维度。我们必须使用附加的维度编码,如1-of-n或等边的(equilateral),以便让物种编码彼此等距。如果我们要对鸢尾花进行分类,则不希望我们的编码过程产生任何偏差。

将鸢尾花特征视为更高维度空间中的维度,这非常有意义。将单个样本(鸢尾花数据集中的行)视为这个搜索空间中的点,靠近的点可能具有相似之处。通过研究来自鸢尾花数据集的以下3行数据,我们来看看这些相似之处:

5.1, 3.5, 1.4, 0.2, Iris−setosa
7.0, 3.2, 4.7, 1.4, Iris−versicolor 
6.3, 3.3, 6.0, 2.5, Iris−virginica

第1行萼片长度为5.1,萼片宽度为3.5,花瓣长度为1.4,花瓣宽度为0.2。如果使用1-of-n编码,则以上3行数据将编码为以下3个向量:

[5.1, 3.5, 1.4, 0.2, 1, 0, 0]
[7.0, 3.2, 4.7, 1.4, 0, 1, 0]
[6.3, 3.3, 6.0, 2.5, 0, 0, 1]

在第4章“前馈神经网络”中将介绍1-of-n编码。

汽车MPG数据集

汽车每加仑英里数(Miles Per Gallon,MPG)数据集通常用于回归问题。该数据集包含一些汽车的属性。利用这些属性,我们可以训练神经网络来预测汽车的燃油效率。加利福尼亚大学欧文分校(UCI)机器学习存储库提供了这个数据集。

我们从卡内基梅隆大学维护的StatLib库中获取了这些数据。在1983年的美国统计协会的展览会上,程序员使用了该数据集,并且没有丢失任何值。这项研究的作者Quinlan(1993)使用该数据集描述了油耗。“按每加仑英里数,该数据考虑了城市车辆的油耗,旨在根据3个多值离散值和5个连续属性进行预测”[3]

该数据集包含以下属性:

1. mpg(每加仑英里数):连续
2. cylinders(气缸数):多值离散值 
3. displacement(排量):连续
4. horsepower(马力) :连续
5. weight(车重):连续
6. acceleration(加速):连续
7. model year(车型年份):多值离散值
8. origin(来源):多值离散值
9. car name(车名):字符串(每个实例唯一)
太阳黑子数据集

太阳黑子是太阳表面的暂时现象。与周围区域相比,其看起
来像是黑点。强烈的磁活动会引起黑子。尽管它们出现的温度是
3 000~4 500 K(约2 727~4 227℃),但与周围物质大约5 780 K (约5 507℃)的温度形成反差,导致它们成为清晰可见的黑点。黑子有规律地出现和消失,这让它们成为时间序列预测的良好数据集。

图3展示了黑子随时间的活动数。

图3 黑子随时间的活动数

年 月 黑子数 标准差
1749 1 58.0 24.1
1749 2 62.6 25.1
1749 3 70.0 26.6
1749 4 55.7 23.6
1749 5 85.0 29.4
1749 6 83.5 29.2
1749 7 94.8 31.1
1749 8 66.3 25.9
1749 9 75.9 27.7

以上数据提供了观测到的黑子的年、月、黑子数和标准差。许多世界性的组织都在观测黑子。

XOR运算符

XOR运算符是布尔运算符。程序员经常将XOR的真值表作为一种非常简单的“Hello World”训练集,用于机器学习。我们将该表称为XOR数据集。该运算符与XOR奇偶校验运算符相关,该运算符接收3个输入并具有以下真值表:

0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0

在需要手动训练或评估神经网络的情况下,我们会利用XOR运算符。

Kaggle的Otto集团产品分类挑战赛

在本书中,我们还会利用Kaggle的Otto集团产品分类挑战赛(Kaggle Otto Group Product Classification Challenge)数据集。Kaggle是一个平台,促使数据科学家在新数据集上展开竞争。我们使用这个数据集,根据未知属性将产品分为几类。此外,我们将使用深度神经网络来解决这个问题。我们还会在本书中讨论一些高级集成技术,你可以将它们用于Kaggle挑战赛。我们将在第16章中更详细地描述这个数据集。

本书开始将概述大多数神经网络共有的特性。这些特性包括神经元、层、激活函数和连接。在本书的其余部分,我们将介绍更多的神经网络体系结构,从而扩展这些主题。

[1] Schmidhuber,2012。

[2] Fisher,1936。

[3] Quinlan,1993。


本书由异步社区出品,社区(https://www.epubit.com/)为你提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎你将发现的问题反馈给我们,帮助我们提升图书的质量。

当你发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对你提交的勘误进行审核,确认并接受后,你将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果你对本书有任何疑问或建议,请你发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果你有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。

如果你是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果你在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请你将怀疑有侵权行为的链接发邮件给我们。你的这一举动是对作者权益的保护,也是我们持续为你提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


本章要点:

本书探讨神经网络,以及如何训练、查询、构建和解释神经网络。我们介绍许多神经网络架构,以及可以训练这些神经网络的大量算法。训练是一个过程,在这个过程中,神经网络不断调整,实现根据数据进行预测的目标。本章将介绍一些基本概念,它们与本书中介绍的神经网络类型最为相关。

深度学习是用于多层神经网络的相对较新的一组训练技术,也是一个主要主题。它包含几种算法,可以训练复杂类型的神经网络。随着深度学习的发展,我们现在有了一些有效的方法来训练多层神经网络。

本章将讨论不同神经网络之间的共性。此外,你还将学习神经元如何形成加权连接,这些神经元如何创建层,以及激活函数如何影响层的输出。我们从神经元和层开始。

大多数神经网络结构使用某种类型的神经元。存在许多结构不同的神经网络,程序员一直在引入实验性的神经网络结构。即便如此,也不可能涵盖所有的神经网络结构。但是,神经网络实现之间存在一些共性。如果一个算法被称为神经网络,那么它通常将由单独的、相互连接的单元组成,尽管这些单元可能被称为神经元,也可能未被称为神经元。实际上,神经网络处理单元的名称在不同的文献中有所不同,它可以被称为节点、神经元或单元。

图1-1展示了单个人工神经元的抽象结构。

图1-1 单个人工神经元的抽象结构

人工神经元从一个或多个来源接收输入,该来源可以是其他神经元,也可以是计算机程序提供给该网络的数据。输入通常是浮点数或二元值。通常将真(true)和假(false)表示为1和0,从而将二元值输入编码为浮点数。有时,程序还将二元值输入编码体现为双极性系统,即将真表示为1,假表示为−1。

人工神经元将每个输入乘以权重。然后,将这些乘积相加,并将和传递给激活函数。有些神经网络不使用激活函数。公式1-1总结了神经元的计算输出:

(1-1)

在公式1-1中,变量代表神经元的输入和权重。变量代表权重和输入的数量。输入的数量和权重的数量必须总是相同的。每个权重乘以其各自的输入,然后将这些乘积乘以一个激活函数,该函数由希腊字母φ(phi)表示。这个过程使神经元只有单个输出。

图1-1展示了只有一个构建块的结构。你可以将许多人工神经元链接在一起,构建人工神经网络。也可以将人工神经元视为构建块,将输入和输出圆圈视为连接块。图1-2展示了由3个神经元组成的简单人工神经网络。

图1-2 简单人工神经网络

图1-2展示了3个相互连接的神经元。这个图的本质是,图1-1减去一些输入,重复3次然后连接。它总共有4个输入和1个输出。神经元N1和N2的输出提供给N3,以产生输出O。为计算图1-2的输出,我们执行3次公式1-1。前两次计算N1和N2,第三次使用N1和N2的输出来计算N3。

神经网络通常不会显示到如图1-2那样的详细程度。为了简化该图,我们可以省略激活函数和中间输出。简化的人工神经网络如图1-3所示。

图1-3 简化的人工神经网络

在图1-3中,你会看到神经网络的两个附加组件。首先,考虑输入和输出,它们显示为抽象的虚线圆。输入和输出可以是更大的神经网络的一部分。但是,输入和输出通常是特殊类型的神经元,输入神经元从使用该神经网络的计算机程序接收数据,而输出神经元会将结果返回给程序。这种类型的神经元称为输入神经元和输出神经元。我们将在1.2.1小节中讨论这些神经元。

图1-3还展示了神经元的分层排列。输入神经元是第一层,N1和N2神经元创建了第二层,第三层包含N3,第四层包含O。尽管大多数神经网络将神经元排列成层,但并非总是如此。Stanley(2002)引入了一种神经网络架构,称为“增强拓扑神经进化”(NeuroEvolution of Augmenting Topologies,NEAT)。NEAT神经网络可以具有非常杂乱的非分层架构。

形成一层的神经元具有几个特征。首先,层中的每个神经元具有相同的激活函数。但是,不同的层可能具有不同的激活函数。其次,各层完全连接到下一层。换言之,一层中的每个神经元都与上一层中的每个神经元有连接。图1-3所示网络不是完全连接的,有几层缺少连接,如I1和N2不连接。图1-4所示神经网络是图1-3的新版本,它已完全连接,并多了一个神经元N4。

图1-4 完全连接的神经网络

在图1-4中,你可以看到一个完全连接的多层神经网络。神经网络总是有输入层和输出层。隐藏层的数量决定了神经网络结构的名称。图1-4中所示的神经网络是一个两层神经网络。大多数神经网络有0~2个隐藏层。除非你实现了深度学习策略,否则很少有具有两个以上隐藏层的神经网络。

你可能还会注意到,箭头始终从输入指向输出,向下或向前。这种类型的神经网络通常称为“前馈神经网络”。在本书的后面,我们将看到在神经元之间形成反向循环的循环神经网络。

在1.1节中,我们简要介绍了存在不同类型的神经元的思想。现在,我们将解释书中描述的所有神经元类型。并非每个神经网络都会使用每种类型的神经元。单个神经元也有可能扮演几种不同神经元类型的角色。

几乎每个神经网络都有输入和输出神经元。输入神经元接收来自程序的神经网络数据。输出神经元将处理后的数据从神经网络返回给程序。这些输入和输出神经元将由程序分组为单独的层,分组后的层称为输入和输出层。但是,对于某些神经网络结构,神经元可以同时充当输入和输出。霍普菲尔德神经网络就是这样的一个示例,其中神经元既是输入又是输出,我们将在第3章“霍普菲尔德神经网络和玻尔兹曼机”中讨论。

程序通常将神经网络的输入表示为数组,即向量。向量中包含的元素数量必须等于输入神经元的数量。例如,具有3个输入神经元的神经网络可以接收以下输入向量:

[0.5, 0.75, 0.2]

神经网络通常接收浮点数向量作为其输入。同样,神经网络将输出一个向量,其长度等于输出神经元数量。输出通常是来自单个输出神经元的单个值。为了保持一致,我们将单输出神经元网络的输出表示为单个元素的向量。

请注意,输入神经元没有激活函数。如图1-1所示,输入神经元只不过是占位符,简单地对输入进行加权和求和。此外,如果神经网络具有既是输入,又是输出的神经元,那么神经网络的输入和输出向量的大小相同。

隐藏神经元具有两个重要特征。首先,隐藏神经元仅接收来自其他神经元的输入,例如输入神经元或其他隐藏神经元。其次,隐藏神经元仅输出到其他神经元,例如输出神经元或其他隐藏神经元。隐藏神经元可以帮助神经网络理解输入,并形成输出。但是,它们没有直接连接到输入数据或最终输出。隐藏神经元通常被分组为完全连接的隐藏层。

程序员面临的一个常见问题,就是神经网络中隐藏神经元的数量有多少。由于这个问题的答案很复杂,因此本书在不止一个小节中,对隐藏神经元的数量进行了相关讨论。在引入深度学习之前,通常人们建议,除了单个隐藏层以外,其他任何东西都是多余的[1]。研究证明,单层神经网络可以用作通用逼近器(universal approximator)。换言之,只要该神经网络在单层中具有足够的隐藏神经元,它就应该能够学会从任何输入产生(或近似产生)任何输出。

研究者过去忽视其他隐藏层的另一个原因在于,这些层会阻碍神经网络的训练。训练是指确定良好权重的过程。在研究者引入深度学习技术之前,我们根本没有一种有效的方法来训练深度神经网络,即具有大量隐藏层的神经网络。尽管理论上单隐藏层神经网络可以学习任何内容,但深度学习有助于表示数据中更复杂的模式。

程序员向神经网络添加偏置神经元(bias neurons),以帮助它们学习模式。偏置神经元的功能类似于总是产生值1的输入神经元。由于偏置神经元的输出恒定为1,因此它们没有连接到上一层。值1称为偏置激活,也可以将它设置为1以外的值,但是,1是最常见的偏置激活。并非所有的神经网络都有偏置神经元。图1-5展示了带有偏置神经元的单层神经网络。

图1-5 带有偏置神经元的单层神经网络

图1-5所示的神经网络包含3个偏置神经元。除输出层外,每层都包含一个偏置神经元。偏置神经元允许激活函数的输出发生偏移。在后文讨论激活函数时,我们将清楚地看到这种偏移发生的方式。

上下文神经元用于循环神经网络。这种类型的神经元允许神经网络保持状态,因此,给定的输入可能并不总是产生完全相同的输出。这种不一致类似于生物大脑的运作。请考虑当听到喇叭声时,上下文因素如何影响你的反应。如果你在过马路时听到喇叭声,则可能会感到震惊,停止行走并朝喇叭声传来的方向看。如果你在电影院观看动作类、冒险类电影时听到喇叭声,你的反应就不会完全一样。因此,先前的输入为你提供了处理喇叭声输入的上下文。

时间序列是上下文神经元的一种应用。你可能需要训练神经网络来学习输入信号,从而执行语音识别或预测安全价格的趋势。上下文神经元是神经网络处理时间序列数据的一种方法。图1-6展示了上下文神经元如何在神经网络中排列。

图1-6 上下文神经元

这个神经网络具有单个输入和输出神经元。在输入层和输出层之间是两个隐藏神经元和两个上下文神经元。除了两个上下文神经元,该神经网络与本章中先前的神经网络相同。

每个上下文神经元都有一个从0开始的值,并且始终从神经网络的先前使用中接收隐藏1或隐藏2的副本。图1-6中的两条虚线表示上下文神经元是直接副本,没有其他权重。其他线表明输出由列出的6个权重值之一加权。仍然使用公式1-1以相同的方式计算输出。输出神经元的值将是所有4个输入分别乘以它们的权重后的总和,并应用激活函数的结果。

有一种神经网络名为简单循环神经网络(Simple Recurrent Neural Network,SRN),它使用了上下文神经元。若当神经网络(Jordan neural network)和埃尔曼网络(Elman neural nebwork)是两种最常见的简单循环神经网络。图1-6展示了埃尔曼神经网络。第13章“时间序列和循环神经网络”探讨了这两种类型的简单循环神经网络。

组成神经网络的各个单元并不总是称为神经元。研究者有时会将其称为节点或单元。在本书的后续内容中,我们将探讨深度学习,它利用了玻尔兹曼机来替代神经元的作用。无论神经元的类型如何,神经网络几乎总是由这些神经元之间的加权连接构成的。

在神经网络编程中,激活函数或传递函数为神经元的输出建立界限。神经网络可以使用许多不同的激活函数。我们将在本节中讨论最常见的激活函数。

为神经网络选择激活函数是一个重要的考虑,因为它会影响输入数据格式化的方式。在本章中,我们将指导你选择激活函数。第14章“构建神经网络”将包含该选择过程的更多详细信息。

最基本的激活函数是线性函数,因为它根本不改变神经元输出。公式1-2展示了程序通常如何实现线性激活函数:

(1-2)

如你所见,这个激活函数只是返回神经元输入传递给它的值。图1-7展示了线性激活函数的图像。

图1-7 线性激活函数

为学习提供数值的回归神经网络,通常会在其输出层使用线性激活函数。分类神经网络,即为其输入确定合适类别的神经网络,通常在其输出层使用Softmax激活函数。

阶跃或阈值激活函数是另一种简单的激活函数。神经网络最初称为“感知机”(perceptron)。McCulloch和Pitts(1943)引入了最初的感知机,并使用了如公式1-3一样的阶跃激活函数:

(1-3)

公式1-3为0.5或更高的输入值输出1,为所有其他输入值输出0。阶跃激活函数通常被称为阈值激活函数,因为它们仅对大于指定阈值的值返回1(真),如图1-8所示。

图1-8 阶跃激活函数

对于仅需要输出正数的前馈神经网络,S型(Sigmoid)激活函数或逻辑激活函数是非常常见的选择。虽然它使用广泛,但双曲正切激活函数或ReLU激活函数通常是更合适的选择。我们将在本章后面介绍ReLU激活函数。公式1-4展示了S型激活函数:

(1-4)

使用S型激活函数以确保值保持在相对较小的范围内,如图1-9所示。

从图1-9可以看出,大于或小于0的值都会被压缩到0~1的范围内。

图1-9 S型激活函数

对于必须输出−1~1的值的神经网络,双曲正切(tanh)激活函数也是非常常见的激活函数,如公式1-5所示:

(1-5)

双曲正切激活函数图像的形状类似S型激活函数,图像的形状如图1-10所示。

图1-10 双曲正切激活函数

双曲正切激活函数相对S型激活函数具有诸多优点。这些优点涉及神经网络训练中使用的导数,它们将在第6章“反向传播训练”中介绍。

修正线性单元(ReLU)由Teh和Hinton在2000年引入,在过去几年中得到了迅速的应用。在ReLU激活函数之前,双曲正切激活函数通常被视为优先选择的激活函数。由于出色的训练结果,目前大多数最新研究都推荐ReLU激活函数。因此,大多数神经网络应该在隐藏层上使用ReLU激活函数,在输出层上使用Softmax或线性激活函数。公式1-6展示了非常简单的ReLU激活函数:

(1-6)

现在,我们将研究为什么ReLU激活函数通常比隐藏层的其他激活函数要好。性能提高的部分原因在于ReLU激活函数是线性的非饱和激活函数。与S型激活函数/逻辑激活函数或双曲正切激活函数不同,ReLU不会饱和到−1、0或1。饱和激活函数总是朝向并最终获得一个值。如双曲正切激活函数在减小时饱和到−1,在增大时饱和到1。图1-11展示了ReLU激活函数的图像。

图1-11 ReLU激活函数

最新研究表明,神经网络的隐藏层应使用ReLU激活函数。ReLU激活函数优于双曲正切激活函数和S型激活函数的原因将在第6章“反向传播训练”中进行说明。

我们要学习的最后一个激活函数是Softmax激活函数。与线性激活函数一样,通常会在神经网络的输出层中找到Softmax激活函数。Softmax激活函数用于分类神经网络。分类神经网络中,具有最高值的神经元可以宣称神经网络的输入属于它的分类。因为它是一种更好的方法,所以Softmax激活函数会强制神经网络的输出表示输入落入每个类的概率。如果没有Softmax激活函数,则神经元的输出就是数值,值最高的数表示获胜的类。

为了了解如何使用Softmax激活函数,我们来研究一个常见的神经网络分类问题。鸢尾花数据集包含针对150种不同鸢尾花的4个测量值。这些花中的每一种都属于3个鸢尾花物种之一。当你提供花朵的测量值时,Softmax激活函数允许神经网络为你提供这些测量值属于这3个物种的概率。如神经网络可能会告诉你,该鸢尾花有80%的概率是setosa,有15%的概率是virginica,只有5%的概率是versicolour。因为这些是概率,所以它们的总和必须是100%。不可能同时有80%的概率是setosa、75%的概率是virginica、20%的概率是versicolour——这种结果是毫无意义的。

要将输入数据分为3个鸢尾花物种之一,则对于这3个物种中的每一个,你都需要一个输出神经元。输出神经元并不指定这3个物种各自的概率。因此,我们期望提供的这些概率总和为100%。而神经网络将告诉你,花朵属于这3个物种中每一个的概率。要获得概率,请使用公式1-7中的Softmax函数:

(1-7)

在公式1-7中,表示正在计算的输出神经元()的索引,表示该组/级别中所有神经元的索引。变量表示输出神经元的数组。请务必注意,Softmax激活函数的计算方法与本章中的其他激活函数不同。在使用Softmax作为激活函数时,单个神经元的输出取决于其他输出神经元。在公式1-7中,你可以观察到其他输出神经元的输出包含在变量中,而本章中的其他激活函数均未使用。清单1-1用伪代码实现了Softmax激活函数。

清单1-1 Softmax激活函数

def softmax(neuron_output):
  sum = 0
  for v in neuron_output:
    sum = sum + v

  sum = math.exp(sum)
  proba = [ ]
  for i in range(len(neuron_output)):
    proba[i] = math.exp(neuron_output[i])/sum 
  return proba

请考虑一个训练好的神经网络,它将数据分为三类,如3个鸢尾花物种。在这种情况下,你将为每个目标分类使用一个输出神经元。请考虑神经网络要输出以下内容:

Neuron 1: setosa: 0.9 
Neuron 2: versicolour: 0.2 
Neuron 3: virginica: 0.4

从上面的输出中我们可以清楚地看到,神经网络认为数据代表了setosa鸢尾花。但是,这些值不是概率。值0.9不表示数据有90%的概率代表setosa。这些值的总和为1.5。要将它们视为概率,它们的总和必须为1。该神经网络的输出向量如下:

[0.9, 0.2, 0.4]

如果将此向量提供给Softmax激活函数,则返回以下向量:

[0.47548495534876745, 0.2361188410001125, 0.28839620365112]

以上3个值的总和为1,可以视为概率。由于向量中的第一个值四舍五入为0.48(48%),因此数据表示setosa的概率为48%。你可以通过以下方式计算该值:

sum=exp(0.9)+exp(0.2)+exp(0.4)=5.17283056695839
j0=exp(0.9)/sum=0.47548495534876745
j1=exp(0.2)/sum=0.2361188410001125
j2=exp(0.4)/sum=0.28839620365112

在1.3节中看到的激活函数指定了单个神经元的输出。神经元的权重和偏置(bias)共同决定了激活的输出,以产生期望的输出。要查看这个过程如何发生,请考虑公式1-8。它表示了单输入的S型激活神经网络:

(1-8)

变量表示神经网络的单个输入。变量指定了神经网络的权重和偏置。公式1-8是一种组合,包含了指定神经网络的公式1-1和指定S型激活函数的公式1-4。

通过调整神经元的权重可以调整激活函数的斜率或形状。图1-12展示了权重变化对S型激活函数输出的影响。

图1-12 调整神经元权重

图1-12展示了使用以下参数的多个S型曲线:

f(x, 0.5, 0.0)
f(x, 1.0, 0.0)
f(x, 1.5, 0.0)
f(x, 2.0, 0.0)

为了生成这些曲线,我们没有使用偏置,这很显然,因为每种情况下第3个参数都是0。使用4个权重值会在图1-12中产生4条不同的S型曲线。无论权重如何,当为0时我们总是得到相同的值0.5,因为当为0时所有曲线都到达同一点。当输入接近0.5时,我们可能需要神经网络产生其他值。

调整偏置会使S型曲线发生移动,这使得当接近0时,该函数取值不为0.5。图1-13展示了权重为1.0时,偏置变化对S型激活函数输出的影响。

图1-13展示了具有以下参数的多条S型曲线:

f(x, 1.0, 1.0)
f(x, 1.0, 0.5)
f(x, 1.0, 1.5)
f(x, 1.0, 2.0)

图1-13 调整神经元偏置

这些函数的权重均为1.0。当我们调整不同的偏置时,S型曲线向左或向右移动。由于所有曲线在右上角或左下角发生合并,因此并不是完全的移位。

当我们将偏置和权重放在一起时,它们生成了一条曲线,该曲线创建了神经元所需的输出。以上曲线仅是一个神经元的输出。在一个完整的神经网络中,许多不同神经元的输出将合并,以产生复杂的输出模式。

作为计算机程序员,你可能熟悉逻辑编程。你可以使用编程运算符AND、OR和NOT来控制程序的决策方式。这些逻辑运算符通常定义了神经网络中权重和偏置的实际含义。考虑以下真值表:

0 AND 0 = 0
1 AND 0 = 0
0 AND 1 = 0
1 AND 1 = 1
0 OR 0 = 0
1 OR 0 = 1
0 OR 1 = 1
1 OR 1 = 1
NOT 0 = 1
NOT 1 = 0

真值表指定如果AND运算符的两边均为真,则最终输出也为真。在所有其他情况下,AND的结果均为假。这个定义非常适合英文单词“and”。如果你想要一栋风景宜人“且”有大后院的房子,那么这个房子必须同时满足这两个条件才能选择。如果你想要一间视野开阔“或”后院很大的房子,那么这个房子只需要满足一个条件就可以了。

这些逻辑语句可能变得更加复杂。请考虑如果你想要一间视野开阔且后院很大的房子,但是,你对后院较小但在公园附近的房子也会感到满意。你可以通过以下方式表示这一想法:

([nice view] AND [large yard]) OR ((NOT [large yard]) and [park])

你可以使用以下逻辑运算符来表示前面的语句:

(1-9)

在上面的语句中,OR(看起来像字母“v”,AND()看起来像颠倒的“v”,而NOT()看起来像半个方框。

我们可以使用神经网络来表示AND、OR和NOT的基本逻辑运算符,如图1-14所示。

图1-14展示了3个基本逻辑运算符的权重和偏置权重。你可以用公式1-1轻松计算所有这些运算符的输出。请考虑具有两个“真”(1)输入的AND运算符:

(1 * 1) + (1 * 1) + (−1.5) = 0.5

图1-14 基本逻辑运算符

这里我们用的是阶跃激活函数。因为0.5大于或等于0.5,所以输出为1,即真。我们可以计算一个输入为假的表达式:

(1 * 1) + (0 * 1) + (−1.5) = −0.5

由于我们采用阶跃激活函数,因此这个输出为0,即假。

我们可以利用这些神经元构建更复杂的逻辑结构。考虑具有以下真值表的异或运算符:

0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0

XOR运算符规定,它的一个输入(但不是两个输入)为真时,结果为真。如两辆车中的一辆将赢得比赛,但并非两辆都获胜。可以使用基本的AND、OR和NOT运算符编写XOR运算符,如下所示:

(1-10)

带圆圈的加号是XOR运算符的符号,是要评估的两个输入。如果你明白XOR运算符的含义是,但不是同时,那么上述表达式的意义就清楚了。图1-15展示了可以表示XOR运算符的神经网络。

图1-15 XOR神经网络

计算上述神经网络需要几个步骤。首先,必须为每个直接连接到输入的节点计算值。上述神经网络有两个节点。我们将展示用输入[0,1]来计算XOR的例子。我们首先计算两个最上面的未标记(隐藏)节点:

(0 * 1) + (1 * 1) − 0.5 = 0.5 = True
(0 * 1) + (1 * 1) − 1.5 = −0.5 = False

接下来,我们计算未标记(隐藏)的下部节点:

(0 * −1) + 0.5 = 0.5 = True

最后,我们计算O1:

(1 * 1) + (1 * 1) −1.5 = 0.5 = True

如你所见,你可以手动连接神经网络中的连线以产生所需的输出,但是,手动创建神经网络非常烦琐。本书后文将介绍几种算法,它们可以自动确定权重和偏置。

在本章中,我们展示了神经网络由神经元、层和激活函数组成。从根本上说,神经网络中的神经元本质上可能是输入、隐藏或输出神经元。输入和输出神经元将信息传入和传出神经网络。隐藏神经元出现在输入和输出神经元之间,有助于处理信息。

激活函数可缩放神经元的输出。我们也介绍了几种激活函数。两种最常见的激活函数是S型激活函数和双曲正切激活函数。S型激活函数适用于只需要正输出的神经网络。双曲正切激活函数支持正输出和负输出。

神经网络可以构建逻辑表达式,我们展示了如何生成AND、OR和NOT运算符的权重。使用这3个基本运算符,你可以构建更复杂的逻辑表达式。我们提供了一个构建XOR运算符的示例。

既然我们已经了解了神经网络的基本结构,我们将在接下来的内容中探索几种经典的神经网络,以便你可以使用这种抽象结构。经典的神经网络结构包括自组织映射、霍普菲尔德神经网络和玻尔兹曼机等。这些经典的神经网络构成了我们在本书中介绍的其他结构的基础。

[1] Hornik,1991。


相关图书

大模型应用开发 动手做AI Agent
大模型应用开发 动手做AI Agent
GPT图解 大模型是怎样构建的
GPT图解 大模型是怎样构建的
大语言模型:基础与前沿
大语言模型:基础与前沿
生成式AI入门与AWS实战
生成式AI入门与AWS实战
AI辅助编程实战
AI辅助编程实战
ChatGPT原理与应用开发
ChatGPT原理与应用开发

相关文章

相关课程