机器学习(ML)(四) — 探析

介绍

几十年前,神经网络刚被发明时,最初的动机是编写能够模仿人类大脑或生物大脑学习和思考方式的软件。尽管如今,神经网络(有时也称为人工神经网络)已经变得与我们对大脑实际看法大不相同。一些生物学动机仍然保留在我们今天对人工神经网络计算机神经网络的看法中。让我们先来看看大脑是如何工作的,以及它与神经网络的关系。人类大脑,或者更广泛地说,生物大脑表现出更高水平或更强大的智能神经网络的初衷是试图构建软件来模仿大脑。

神经网络的研究始于20世纪50年代,后来一度失宠。然后在20世纪80年代和90年代初期,它们再次受到欢迎,并在一些应用领域表现出巨大的吸引力,例如手写数字识别,当时甚至用于读取写邮件的邮政编码和手写支票上的美元数字。但随后在20世纪90年代末,它再次失宠。大约从2005年开始,它再次复苏,并随着深度学习而重新焕发活力。当时惊讶的一件事是深度学习神经网络的含义非常相似。但当时可能没有得到充分重视,深度学习这个术语听起来好多了,因为它是深度的学习。所以,在过去的十年或十五年里,深度学习成为了一个迅速发展的品牌。从那时起,神经网络就彻底改变了一个又一个应用领域。现代神经网络深度学习产生巨大影响的第一个应用领域可能是语音识别,我们开始看到现代深度学习带来的更好的语音识别系统,[inaudible]Geoff Hinton等人对此起到了重要作用,然后它开始进入计算机视觉领域。人们仍然会谈论2012年的ImageNet时刻,那也许是一个更大的轰动,当时[inaudible]发挥了他们的想象力,对计算机视觉产生了巨大的影响。然后在接下来的几年里,它让我们进入了文本或自然语言处理领域等等。现在,神经网络被应用于从气候变化到医学成像到在线广告到产品推荐等各个领域,现在机器学习的许多应用领域都使用神经网络。尽管今天的神经网络与大脑的学习方式几乎没有任何关系,但早期的动机是尝试构建软件来模仿大脑。那么大脑是如何工作的呢?这是一张说明大脑中神经元的图表。

人类的所有思维都来自大脑中的神经元,它们发出电脉冲,有时还会与其他神经元形成新的连接。给定一个像这样的神经元,它有许多输入,从其他神经元接收电脉冲,然后圈出的这个神经元进行一些计算,然后通过电脉冲将这些输出发送给其他神经元,这个上层神经元的输出反过来又成为下层神经元的输入,这个神经元再次聚合来自多个其他神经元的输入,然后可能将其自己的输出发送给其他神经元,这就是人类思维的组成部分。这是生物神经元的简化图。神经元由左侧显示的细胞体组成,如果你上过生物学课,你可能会认出这是神经元的核心。神经元有不同的输入。在生物神经元中,输入线称为树突,然后它偶尔会通过输出线(称为轴突)向其他神经元发送电脉冲。这些电脉冲会成为另一个神经元的输入。因此,人工神经网络使用一个非常简化的数学模型来描述生物神经元的功能。神经元的作用是接受一些输入,一个或多个输入,这些输入只是数字。它进行一些计算并输出其他数字,然后这些数字可以作为第二个神经元的输入,如右图所示。当你构建人工神经网络深度学习算法时,你通常希望同时模拟许多这样的神经元,而不是一次构建一个神经元。在这个图中,画了三个神经元。这些神经元共同的作用是输入一些数字,进行一些计算,然后输出一些其他数字。尽管对生物神经元人工神经元进行了松散的类比,但我今天几乎不知道人类大脑是如何工作的。事实上,每隔几年,神经科学家就会在大脑的工作原理上取得一些根本性的突破。大脑的实际工作原理还有许多突破尚未发现,因此,试图盲目模仿今天对人类大脑的了解(坦率地说,了解的很少),可能不会让我们在构建原始智能方面走得那么远。以目前在神经科学方面的知识水平,肯定不行。话虽如此,即使有了这些极其简化的神经元模型,也能够构建真正强大的深度学习算法。因此,当你深入研究神经网络深度学习时,即使其起源是受生物驱动的,也不要太在意生物驱动。事实上,这些从事深度学习研究的人已经不再过多地关注生物驱动。相反,他们只是使用工程原理来弄清楚如何构建更有效的算法。但我认为,不时推测和思考生物神经元的工作原理仍然很有趣。神经网络的概念已经存在了几十年。为什么神经网络直到最近几年才真正流行起来?在横轴上画出你拥有的用于问题的数据量,在纵轴上画出应用于该问题的学习算法的性能准确性

在过去的几十年里,随着互联网的兴起、手机的兴起、社会的数字化,我们为许多应用所拥有的数据量稳步向右发展。许多使用电子替代了纸质记录,例如,如果您订购了某样东西,而不是写在纸上,那么更有可能是数字记录。如果您去看医生,您的健康记录现在更有可能是数字的,而不是纸质的。因此,在许多应用领域,数据量呈爆炸式增长。我们看到,使用传统的机器学习算法,例如逻辑回归线性回归,即使您为这些算法输入更多数据,也很难使其性能持续提高。因此,就像线性回归逻辑回归等传统学习算法一样,它们无法随着我们现在可以输入的数据量而扩展,也无法有效地利用不同应用所拥有的这些数据。如果你在这个数据集上训练一个小型神经网络,那么它的性能可能看起来是这样的。如果你训练一个中型神经网络,也就是一个包含更多神经元的网络,它的性能可能看起来是那样的。如果你训练一个大型神经网络,也就是一个包含大量人工神经元的网络,那么对于某些应用来说,性能会不断提高。这意味着两件事,对于某些拥有大量数据的应用,有时你会听到大数据这个词,如果你能够训练一个非常大的神经网络来利用你拥有的大量数据,那么你就可以在语音识别图像识别自然语言处理应用等许多领域获得更好的性能,而这些是早期学习算法无法实现的。这导致深度学习算法的腾飞,这也是更快的计算机处理器(包括GPU)兴起的原因。这种硬件最初设计用于生成美观的计算机图形,但后来发现它对深度学习也非常有用。这也是深度学习算法成为今天的样子的主要力量。这就是神经网络的起源,也是它们在过去几年中如此迅速发展的原因。

为了说明神经网络的工作原理,让我们从一个例子开始。使用一个需求预测的例子,在这个例子中,查看产品并尝试预测该产品是否会成为畅销产品?你正在销售T恤,你想知道某件T恤是否会成为畅销产品,并且收集了以不同价格出售的不同T恤的数据,以及哪些T恤成为畅销产品。如今,零售商使用这种类型的应用程序来规划更好的库存水平以及营销活动。如果你知道什么可能成为畅销产品,你会计划提前购买更多库存。在这个例子中,输入特征T恤的价格,这是学习算法的输入。如果使用逻辑回归来将S型函数拟合到这样的数据,那么预测输出看起来像这样,作为学习算法的输出。为了构建神经网络,使用字母来表示该逻辑回归算法的输出。代表激活,指的是神经元向下游其他神经元发送输出的程度。这个逻辑回归单元被认为是大脑中单个神经元的非常简化的模型。神经元的作用是输入价格,然后计算这个公式,输出由这个公式计算得出,输出这件T恤成为畅销品的概率。

另一种理解神经元的方式是将其视为一台小型计算机,其唯一工作是输入一个或几个数字,例如价格,然后输出一个或几个其他数字,在本例中是T恤成为畅销品的概率逻辑回归算法比大脑中的任何生物神经元都简单得多。这就是为什么人工神经网络是人类大脑的一个极其简化的模型。尽管在实践中,深度学习算法确实非常有效。鉴于对单个神经元的这种描述,现在构建神经网络只需要取出一堆这些神经元并将它们连接在一起或将它们放在一起。举一个例子,我们将使用四个特征来预测T恤是否是畅销品。这些特征包括T恤的价格、运费、特定T恤的营销量以及材料质量,这是高品质的厚棉布还是低质量的材料?现在,可能会怀疑T恤是否成为畅销品实际上取决于几个因素。首先,这件T恤的价格是否合理。其次,潜在买家对这件T恤的认知程度如何?第三是感知质量偏见或潜在偏见,认为这是一件高品质的T恤。创建一个人工神经元,估计这件T恤被认为非常实惠的概率。价格实惠主要取决于价格和运费,因为总付款金额是价格加上运费的一部分。在这里使用一个小神经元,一个逻辑回归单元来输入价格和运费,并预测人们是否认为这是实惠的?其次,我将在这里创建另一个人工神经元来估​​计,人们对这件 T 恤的认知程度是否很高?在这种情况下,认知度主要取决于 T 恤的营销。最后,我们将创建另一个神经元来估​​计人们是否认为这是高质量的,这可能主要取决于T恤的价格和材料质量。价格是一个因素,如果有一件价格非常高的T恤,人们会认为它是高质量的,因为它非常昂贵,也许人们认为它会是高质量的。根据这些对可负担性、认知度和感知质量的估计,将这三个神经元的输出连接到右边的另一个神经元,然后是另一个逻辑回归单元。它最终输入这三个数字并输出这件T恤成为畅销品的概率。在神经网络的术语中,把这三个神经元组合成一个层是一组神经元,它将相同或相似的特征作为输入,然后输出几个数字。左侧的三个神经元形成一层,这就是我将它们画在彼此之上的原因,而右侧的单个神经元也是一个层。左侧的层有三个神经元,因此一个层可以有多个神经元,也可以只有一个神经元,就像右侧这一层的情况一样。右侧这一层也称为输出层,因为这个最终神经元的输出是神经网络预测的输出概率。在神经网络术语中,把可负担性意识和感知质量称为激活激活这个术语来自生物神经元,它指的是生物神经元向下游的其他神经元发送的输出值或电脉冲的程度。这些关于可负担性、意识和感知质量的数字是这一层中这三个神经元激活,而且这个输出概率是右侧显示的这个神经元的激活。这个神经网络执行以下计算。它输入四个数字,然后神经网络的这一层使用这四个数字来计算新的数字,也称为激活值。然后最后一层,即神经网络输出层使用这三个数字来计算一个数字。在神经网络中,这四个数字的列表也称为输入层,它只是一个四个数字的列表。现在,对这个神经网络做一个简化。按照目前为止必须一次检查一个神经元,并决定它要从前一层获取什么输入。例如,我们说可负担性只是价格和运费的函数,而知名度只是营销的函数,等等,但是如果你正在构建一个大型神经网络,那么手动决定哪些神经元应该将哪些特征作为输入将是一项艰巨的工作。神经网络在实践中的实现方式是某一层中的每个神经元;假设中间这一层可以访问前一层的每个特征和每个值,也就是输入层,如果试图预测可负担性,并且它知道价格、运费、营销和材料成本是多少,那么你可能会学会忽略营销和材料,只需通过适当设置参数来找出答案,只关注与可负担性最相关的特征子集。为了进一步简化这个神经网络的符号和描述,把这四个输入特征写成一个向量,把神经网络视为具有四个特征,这些特征构成了这个特征向量。这个特征向量被输入到中间这一层,然后计算三个激活值。这三个激活值又变成另一个向量,被输入到这个最终的输出层,最终输出这件T恤成为畅销品的概率。这就是神经网络的全部。

它有几个层,每个层输入一个向量并输出另一个向量。例如,中间的这个层输入四个数字并输出三个数字,分别对应可负担性、知名度和感知质量。这2个层称为输出层,输入层。为了给中间的层起个名字,中间的这个层称为隐藏层。在训练集中,可以观察。数据集告诉您是什么,是什么,但数据集不会告诉您可负担性、知名度和感知质量的正确值是什么。这些值的正确值是隐藏的。在训练集中看不到它们,这就是为什么中间的这个层被称为隐藏层。让我先把这个图的左半部分遮住,然后看看剩下的部分。你在这里看到的是,有一个逻辑回归算法逻辑回归单元,它将T恤的可负担性、知名度和感知质量作为输入,并使用这三个特征来估计T恤成为畅销品的概率。这只是逻辑回归。但很酷的是,它不是使用原始特征,如价格、运费、营销等,而是使用可能更好的特征集,即可负担性、知名度和感知质量质量,希望这些特征能够更好地预测这件T恤是否会成为畅销品。理解这种神经网络的一种方式就是逻辑回归。但作为逻辑回归的一个版本,它们可以学习自己的特征,从而更容易做出准确的预测。如果你想预测房子的价格,你可以取地块的正面或宽度,然后将其乘以地块的深度,以构建一个更复杂的特征,即草坪的大小。我们在那里进行手动特征工程,我们必须查看特征,并手动决定如何将它们组合在一起。神经网络所做的是不需要手动设计特征,它可以学习自己的特征。这就是神经网络成为当今世界上最强大的学习算法之一的原因。总而言之,输入层有一个特征向量,在这个例子中是四个数字,它被输入到隐藏层隐藏层输出三个数字。我将使用一个向量来表示这个隐藏层输出的激活向量。然后输出层将其输入为三个数字并输出一个数字,这将是最终的激活,或者神经网络的最终预测。

请注意,尽管之前将这个神经网络描述为计算可负担性、意识和感知质量,但神经网络的一个非常好的特性是,当你从数据中训练它时,你不需要明确地决定神经网络应该计算哪些特征,比如可负担性等等,或者自己弄清楚它想要在这个隐藏层中使用哪些特征。这就是它如此强大的原因。这个神经网络有一个单层,即隐藏层。让我们看一些其他神经网络的例子。这个神经网络有一个输入特征向量x,它被馈送到一个隐藏层。将其称为第一个隐藏层。如果这个隐藏层有三个神经元,它将输出一个包含三个激活值的向量。这三个数字可以输入到第二个隐藏层。如果第二个隐藏层有两个神经元逻辑单元,那么第二个隐藏层将输出另一个包含两个激活值的向量,向量接着进入输出层,然后输出神经网络的最终预测。在一些文献中,您会看到这种具有多个层的神经网络,称为多层感知器

如果您正在构建人脸识别应用程序,则可能需要训练一个神经网络,该神经网络将这样的图片作为输入,并输出图片中人物的身份。此图像为像素。它在计算机中的表示实际上是网格,或称为像素强度值矩阵。在此示例中,像素强度值,这里的197是图像最左上角像素的亮度,185是像素的亮度,依此类推,直到214是该图像的右下角。如果要把这些像素强度值展开成一个向量,你最终会得到一个包含一百万个像素强度值的列表或向量。一百万是因为的正方形会给你一百万个数字。人脸识别的问题是,你能否训练一个神经网络,具有一百万个像素亮度值的特征向量作为输入,并输出图片中人物的身份。这就是构建一个神经网络来执行此任务的方法。输入图像被馈送到这一层神经元。这是第一个隐藏层,然后提取一些特征。第一个隐藏层的输出被馈送到第二个隐藏层,该输出被馈送到第三层,最后馈送到输出层,然后这是某个人的概率。有趣的是,如果查看一个在大量人脸图像上训练过的神经网络,并尝试可视化这些隐藏层,并尝试计算。当你在大量面部图片上训练这样的系统,并观察隐藏层中的不同神经元正在计算什么时,你可能会发现在第一个隐藏层中,会发现一个神经元正在寻找低垂直线或类似的垂直边缘。第二个神经元正在寻找有向线或有向边缘。第三个神经元寻找该方向的线,依此类推。在神经网络的最早层中,你可能会发现神经元正在寻找图像中非常短的线或非常短的边缘。如果你查看下一个隐藏层,你会发现这些神经元学会将许多小短线和小短边段组合在一起,以寻找面部的各个部分。例如,每个小方框都是该神经元试图检测的内容的可视化。第一个神经元看起来像是在试图检测图像中某个位置是否有眼睛。第二个神经元看起来好像在尝试检测鼻角,也许这里的神经元正在尝试检测耳朵的底部。然后,当您查看此示例中的下一个隐藏层时,神经网络会聚合面部的不同部分,然后尝试检测是否存在较大、较粗糙的面部形状。最后,检测面部与不同面部形状的对应程度会创建一组丰富的特征,然后帮助输出层尝试确定人物照片的身份。神经网络的一个了不起之处在于,可以自行学习不同隐藏层上的这些特征检测器。在此示例中,没有人告诉它在第一层中寻找短小的边缘,在第二层中寻找眼睛、鼻子和面部部分,然后在第三层中寻找更完整的面部形状。神经网络能够从数据中自行找出这些东西。

请注意,在此可视化中,第一个隐藏层神经元显示为查看相对较小的窗口以寻找这些边缘。第二个隐藏层查看更大的窗口,第三个隐藏层查看更大的窗口。这些小神经元可视化实际上对应于图像中不同大小的区域。只是为了好玩,让我们看看如果你在不同的数据集上训练这个神经网络会发生什么,比如在很多汽车图片上,侧面的图片。同样的学习算法被要求检测汽车,然后会在第一层学习边缘。非常相似,但它们将学习在第二隐藏层检测汽车的部分,第三隐藏层学习更完整的汽车形状。只需输入不同的数据,神经网络就会自动学习检测完全不同的特征,从而尝试做出汽车检测或人脸识别的预测,或者是否有特定的给定任务需要训练。这就是神经网络在计算机视觉应用的工作原理。

神经网络模型

大多数神经网络的基本构建块是神经元层。让我们来看看神经元层是如何工作的。其中有四个输入特征,它们被设置为隐藏层中的三个神经元,然后将其输出发送到仅带有一个神经元输出层。放大隐藏层以查看其计算。这个隐藏层输入四个数字,这四个数字是三个神经元中的的输入。这三个神经元中的每一个都只是实现一个小的逻辑回归单元。以第一个神经元为例。它有两个参数,。为了表示这是第一个隐藏单元,把它下标为,。它的作用是输出一些激活值,计算激活值 。这就是第一个神经元的激活值。为了表示这是第一个神经元,给添加下标为。现在让我们看看第二个神经元。第二个神经元有参数是第二个逻辑单元的参数。计算激活值。因为在这个例子中,我们认为潜在买家知道这件T恤的概率为0.7。第三个神经元有第三组参数。计算激活值。在这个例子中,这三个神经元输出0.3、0.70.2,这三个数字的向量变成激活值向量,然后传递到这个神经网络的最终输出层。当构建具有多层的神经网络时,为每层赋予不同的数字会很有用。有些神经网络可以有几十层甚至几百层。但为了引入符号来帮助我们区分不同的层,我将使用上标方括号1来索引不同的层。具体来说,我将使用方括号 1中的上标,这是表示该神经网络隐藏层1层的输出的符号,同样,这里的神经网络1层第一个单元的参数而 是第1层的第二个隐藏单元或第二个隐藏神经元的参数。同样,,表示这些是该神经网络第1隐藏单元激活值。如果你看到上标方括号2,它指的是与神经网络第2层相关的量,其他层也是如此。神经网络第1层的输出是这个激活向量,把它复制到这里,因为这个输出成为第2层的输入。这个神经网络第2层的计算是输出层。第2层的输入是第1层的输出,所以是这个向量

因为输出层只有一个神经元,所以它的工作就是计算,这是第一个也是唯一一个神经元的输出,作为,将sigmoid函数应用于相乘,然后加上()。和之前一样。在这个例子中,因为输出层只有一个神经元,所以这个输出只是一个标量,是一个数字,而不是一个数字向量。按照我们之前的符号惯例,使用方括号2中的上标来表示与该神经网络第2层相关的数量,是该层的输出。为了使符号一致,神经网络第2层相关的参数和激活值也可以定义为。神经网络计算出

接下来是最后一个步骤,可以选择执行或不执行,即二进制预测,10,这是畅销书吗?是或否?激活值,并将其阈值设为0.5。如果,可以预测,如果,则预测。这就是神经网络的工作原理。

每一层都输入一个数字向量,并对其应用一堆逻辑回归单元,然后计算另一个数字向量,然后将其从一层传递到另一层,直到您获得最终输出层的计算,即神经网络的预测。然后,可以将阈值设为0.5,也可以不设为0.5,以得出最终预测。

在复杂的神经网络示例中。该网络有四层,不包括输入层(也称为第0层),其中第1、23层是隐藏层,第4层是输出层,第0层通常为输入层。按照惯例,当神经网络有四层时,包括输出层中的所有隐藏层,但不计算输入层。第三层也是最后一层隐藏层,接下来看看该层的计算。第3层输入一个向量,第3层从做了哪些计算?如果它有三个神经元,那么它有参数,计算。计算,依此类推得到。然后,该层的输出是一个向量。请注意,表示与第3层相关的参数。第3层第二个神经元的激活用表示。总结一下,。现在,您知道如何根据上一层的激活来计算任何一层的激活。

推理(前向传播)

使用手写数字识别作为一个激励示例。只区分手写数字01。所以这只是一个二元分类问题,我们将输入一个图像并进行分类,使用一个的图像。255表示亮白色像素,0表示黑色像素。不同的数字是黑色和白色之间的不同灰度。给定64个输入特征,使用具有两个隐藏层神经网络。第一层隐藏层有25个神经元。第二层隐藏层有15个神经元。最后是输出层10的概率是多少?神经网络需要进行的一系列计算,从输入)到预测概率。第一个计算是从,这就是第一层隐藏层计算。请注意,有·个数字,因为这个隐藏层有25个单元。这就是为什么参数从以及。第0层的激活,即。所以只计算。下一步是计算。看看第二个隐藏层,它会执行此计算,其中的函数,。第二层有15个神经元,这就是为什么这里的参数从。现在计算。最后一步是计算,最后这个第三层,输出层只有一个单位,这就是为什么这里只有一个输出。所以只是一个标量。最后,将其阈值设为0.5以得出二进制分类标签。计算序列首先取 ,然后计算,然后计算,最后计算,这也是神经网络的输出。您也可以将其写为。还记得线性回归逻辑回归,使用表示线性回归或逻辑回归的输出。也可以使用表示神经网络计算的函数。因为这个计算是从左到右进行的,所以从开始计算,然后是,最后是。这​​个算法也被称为前向传播,因为正在传播神经元的激活。所以是从左到右向前进行计算。

TensorFlow实现

代码推理

TensorFlow是实现深度学习算法的领先框架之一。当构建项目时,TensorFlow实际上是我最常用的工具。另一个流行的工具是PyTorch。让我们看看如何使用TensorFlow实现推理代码。学习算法能否帮助优化烘焙过程中获得的咖啡豆的质量?烘焙咖啡时,您需要控制两个参数:加热生咖啡豆的温度和时间。我们创建了不同温度和不同持续时间的数据集,以及咖啡是否味道好的标签。这里代表好咖啡,代表坏咖啡。如果您在太低的温度下烘焙,它就不会被烘焙,最终会煮得不够熟。如果你煮的时间不够长,时间太短,它也不是一组烘焙得很好的咖啡豆。如果你把它煮得太久或温度太高,那么最终会得到过熟的咖啡豆。也不是好咖啡。只有这个小三角形内的点才代表好咖啡。任务中给定一个特征向量,其中包含温度和持续时间,比如200摄氏度,持续17分钟,如何在神经网络中进行推理,这种温度和持续时间设置是否会制作出好咖啡?我们将设置为两个数的数组。输入特征为200摄氏度和17分钟。然后,将第1层创建为第一个隐藏层神经网络在该层中有3隐藏单元,使用激活函数,即S型函数。密集是神经网络层的另一个名称。这里称为密集层,接下来,通过取第1层(实际上是一个函数)并将此函数第1层应用于的值来计算。它将是三个数的列表,因为第1层有三个单元。因此,为了便于说明,这里的可能为。接下来,对于第二个隐藏层,第2层将是密集层。现在它有一个单元,再次使用S型激活函数,然后您可以通过将第2层函数应用于从第1层到的激活值来计算。这将为您提供 的值,为了便于说明,该值可能是0.8。最后,如果您希望将其阈值设为0.5,那么只需测试是否,并将设置为10(正或负交叉)。这就是使用TensorFlow在神经网络中进行推理的方式。

1
2
3
4
5
6
7
8
9
10
11
x = np.array([[200.0,17.0]])
layer_1 = Dense(units = 3, activation = 'sigmoid')
a1 = layer_1(x) # [0.2,0.7,0.3]

layer_2 = Dense(units = 1, activation = 'sigmoid')
a2 = layer_2(a1) # 0.8

if a2 >= 0.5 :
y = 1
else :
y = 0
TensorFlow中的数据

让我们先看看TensorFlow如何表示数据。让我们从矩阵的示例开始。这是一个有的矩阵。在存储这个矩阵的代码中,您只需编写x = np.array,如下图所示。您会注意到[1、2、3]是这个矩阵的第一行,[4、5、6]是这个矩阵的第二行。然后这个左方括号将第一行和第二行组合在一起。这将设置为数值类型的数组。此矩阵只是一个二维数字数组。这里我写出了另一个矩阵。它是一个矩阵。要在代码中编写x = np.array,然后使用此处的语法将矩阵的这四行存储在变量中。因此,将创建一个包含这八个数字的二维数组。矩阵可以有不同的维度。您看到了矩阵和矩阵的示例。矩阵也可以是其他维度,例如。我们之前将设置为输入特征向量时,x = np.array(),即[[200, 17]]。这样做会创建一个矩阵,该矩阵只有一行和两列。如果你将x = np.array(),创建一个矩阵,该矩阵有两行和一列。即[[200],[17]]。上面这个例子也称为行向量,是只有一行的向量。下面这个例子也称为列向量,因为这个向量只有一列。使用像这样的双方括号和像这样的单方括号之间的区别在于,其中一个维度恰好是1。此示例生成一个一维向量。因此,这只是一个没有行或列的一维数组。从技术上讲,这不是,只是一个没有行或没有列的线性数组,当我们处理线性回归逻辑回归时,我们使用这些一维向量来表示输入特征TensorFlow,使用矩阵来表示数据。TensorFlow的设计初衷是处理非常大的数据集,通过用矩阵而不是一维数组来表示数据,TensorFlow的内部计算效率会更高一些。在这个数据集中,特征是17分钟内温度达到200°C。实际上是一个矩阵,恰好有一行和两列来存储数字。回到用于在神经网络中执行传播的代码。当您计算等于第1 层应用于 x 时,实际上是一个矩阵。即,这是一个矩阵。TensorFlow表示这是一个浮点数的方式,意味着它是一个可以使用计算机中32位内存表示的小数点的数字。

那么什么是张量呢?这里的张量TensorFlow团队创建的一种数据类型,用于高效地存储和执行矩阵计算。从技术上讲,张量矩阵更通用一些。NumPyTensorFlow表示矩阵的方式已经融入这些系统中。如果您想将(张量)转换为NumPy数组,您可以使用此函数a1.numpy来实现。它将获取相同的数据并以NumPy数组的形式返回,而不是TensorFlow数组或TensorFlow矩阵的形式。现在让我们看看第二层的激活输出是什么样子的。这是之前的代码,第2层是一个密集层,有一个单元和S形激活函数,a2是通过将第2层应用到来计算的,那么,从技术上讲,这是一个矩阵,是一个有一行和一列的二维数组,所以它等于这个数字0.8。如果打印出,会看到它是一个TensorFlow张量,只有一个元素0.8。它是一个float32小数点数字,占用计算机内存中的32位。你可以使用a2.numpy()TensorFlow张量转换为NumPy矩阵

构建神经网络

如果要进行前向传播,需要初始化数据,创建第一层并计算第一层,然后创建第二层并计算二层。这是一种显式的执行前向传播的方法,每次只计算一层。张量流有一种不同的实现前向传播的方法。在TensorFlow中构建神经网络的另一种方法,这与之前创建第一层和创建第二层的方法相同。但是不用手动获取数据并将其传递到第一层,然后从第一层获取激活并将其传递到第二层。我们可以告诉张量流,我们希望它获取第一层和第二层并将它们串联在一起以形成一个神经网络。这就是TensorFlow中的顺序函数所做的。使用顺序框架,张量流可以做很多工作。假设有一个像左边这样的训练集。这是咖啡示例。然后,可以将训练数据作为输入并将其放入numpy数组中。这是一个的矩阵和目标标签。然后可以按如下方式写出。这只是长度为四的一维数组,然后可以将这组目标存储为一维数组,例如[1,0,0,1],对应于四个训练示例。给定存储在矩阵和数组。如果想训练这个神经网络,需要做的就是调用一些函数,使用一些参数调用model.compile()。然后调用model.fit(x,y),告诉TensorFlow使用由第一层和第二层顺序串联在一起创建的神经网络,并在数据上进行训练。如果你有一个新的示例,比如说,它是具有这两个特征的NumPy数组,那么如何进行前向传播呢?不必一层一层地进行前向传播,只需在上调用模型预测model.predict()。模型预测使用顺序函数编译的神经网络进行前向传播并进行推理。现在将这三行代码放在上面,进一步简化一下,也就是在TensorFlow中编码时。不会明确将两层分配给两个变量,第一层和第二层如下。模型是串联在一起的几个层的顺序模型时,通常会编写这样的代码。顺序地,第一层是具有三个单元和S激活函数密集层,第二层是具有一个单元的密集层,同样是一个S型激活函数。而不是对这些第一层和第二层变量进行显式分配。这几乎是在TensorFlow训练推理神经网络所需的代码。这就是在TensorFlow中构建神经网络的方式。

1
2
3
4
5
6
7
8
9
10
layer_1 = Dense(units = 3, activation = 'sigmoid')
layer_2 = Dense(units = 1, activation = 'sigmoid')
model = Squential([layer_1,layer_2])

x = np.array([[200.0,17.0],[120.0,5.0],[425.0,20.0],[212.0,18.0]]) # 4 x 2 array
y = np.array([1,0,0,1])

model.compile(...)
model.fit(x,y)
model.predict(x_new)

如果必须用Python从头开始​​实现前向传播,你会怎么做,除了直观地了解TensorFlowPyTorch等库之外。如果有一天你决定要构建比TensorFlowPyTorch更好的神经网络。让我们看看如何在单层中实现前向传播,继续使用此处的咖啡烘焙模型。看看如何获​​取输入特征向量,并实现前向传播以获得此输出。在Python实现中,使用一维 数组来表示所有这些向量和参数,这就是为什么这里只有一个方括号。这是Python中的一维数组,而不是二维矩阵。需要计算x = np.array([200,17])也是此处表达式。代码实现为:w1_1 = np.array([1,2]),b1_1 = np.array([-1]),z1_1 = np.dot(w1_1,x) + b1_1,a1_1 = sigmoid(z1_1),代码实现为:w1_2 = np.array([-3,4]),b1_2 = np.array([1]),z1_2 = np.dot(w1_2,x) + b1_2,a1_2 = sigmoid(z1_2);同理,代码实现为:w1_3 = np.array([5,-6]),b1_3 = np.array([2]),z1_3 = np.dot(w1_3,x) + b1_3,a1_3 = sigmoid(z1_3),你已经计算了这三个值,,我们想把这三个数字组合成一个数组a1 = np.array([a1_1,a1_2,a1_3]),这是第一层的输出。你可以使用 np数组将它们组合在一起,接下来实现第二层。所以计算输出,代码实现为:w2_1 = np.array([-7,8,9]),b2_1 = np.array([3]),z2_1 = np.dot(w2_1,x) + b2_1,a2_1 = sigmoid(z2_1),最后得出a2 = a2_1,这就是仅使用PythonNumPy实现前向传播的方法。

如何在Python中实现前向传播,但需要为每个神经元硬编码。可以编写一个函数来实现一个密集层,即神经网络的单层。将前一层的激活以及给定层中神经元的参数作为输入。使用上一个示例,如果第1层有三个神经元,并且有参数,将所有这些波矢量堆叠成一个矩阵。这将是一个的矩阵,其中第一列是参数,第二列是参数,第三列是参数。代码实现为:W = np.array([[1,-3,5],[2,4,-6]]),然后以类似的方式,参数,依此类推,将把这三个参数堆叠成一维数组,代码实现为:b = np.array([-1,1,2])密集函数执行的操作将来自前一层的激活作为输入,这里的可以是,代码实现为:a_in = np.array([-2,4]),如下所示。此函数执行的操作是将输入到来自前一层的激活,并将输出来自当前层的激活。让我们逐步完成执行此操作的代码。

1
2
3
4
5
6
7
8
9
def dense(a_in,W,b):
units = W.shape[1]
a_out = np.zeros(units)
for j in range(units):
w = W[:,j]
z = np.dot(w,a_in) + b[j]
a_out[j] = g(z)

return a_out

首先,units = W.shape[1]。这里的是一个矩阵,所以列数是3。等于这一层中的单元数。查看的形状,这只是提取这一层中单元数的一种方式。接下来,将a_out初始化为一个零数组,元素数与单元数相同。在这个例子中,我们需要输出三个激活值,所以这只是将a_out初始化为[0,0,0]。接下来,通过for循环来计算a_out的第一、第二和第三个元素。j从零到单位数减一。。此命令w = W[:,j]Python中提取矩阵第j列的方法。第一次执行此循环时,这将提取w的第一列,因此将提取。第二次执行此循环时,当计算第二个单元的激活时,将拉出与相对应的第二列,依此类推,第三次执行此循环。然后使用公式计算z = np.dot(w,a_in) + b[j]。然后计算激活a_out[j] = g(z)S型函数应用于z。最后返回a_out密集函数的作用是输入来自上一层的激活,并给定当前层的参数,返回下一层的激活。给定密集函数,可以按顺序将几个密集层串联在一起,以便在神经网络中实现前向传播。给定输入特征,可以计算激活,即稠密函数,其中是参数,有时也称为第一个隐藏层权重。然后,可以计算是第二个隐藏层的参数或权重。然后计算。如果这是一个有四层的神经网络,则定义

1
2
3
4
5
6
7
8
def sequential(x):
a1 = dense(x1,W1,b1)
a2 = dense(a1,W2,b2)
a3 = dense(a2,W3,b3)
a4 = dense(a3,W4,b4)
f_x = a4

return f_x

AI感想

通用人工智能(AGI)的梦想是什么样的?人们对通用人工智能(AGI)有很多不必要的炒作。也许其中一个原因是人工智能实际上包括两个非常不同的东西。一个是ANI,代表人工智能。这是一个只做一件事的人工智能系统,有时做得非常好,而且非常有价值,比如智能音箱、自动驾驶汽车或网络搜索,或者应用于农业或工厂等特定应用的人工智能。在过去几年里,ANI取得了巨大的进步,它正在为当今世界创造巨大的价值。由于ANI是人工智能的一个子集,ANI的快速发展使得人工智能在过去十年中也取得了巨大的进步,这在逻辑上是真的。人工智能中有一个不同的想法,即通用人工智能(AGI)。人们希望建立能够做任何人类能做的事情的人工智能系统。尽管ANI取得了进展,ANI的所有进展都让人们得出结论,人工智能取得了巨大的进步。但这也导致一些人得出结论:”人工智能取得了很大的进步,必然意味着AGI也取得了很大的进步“。随着现代深度学习的兴起,我们开始模拟神经元,并且借助越来越快的计算机甚至GPU模拟更多的神经元。事情并没有那么简单。这有两个原因:首先,我们正在构建的人工神经网络,它们非常简单,以至于逻辑回归单元与任何生物神经元所做的完全不同,它比大脑中的任何神经元所做的要简单得多。其次,即使到今天,几乎不知道大脑是如何工作的。关于神经元如何从输入映射到输出,今天仍然不知道一些基本问题。尝试在计算机中模拟这一点,更不用说单个逻辑函数,与人类大脑实际运作的精确模型相去甚远。鉴于现在以及可能在不久的将来对人类大脑运作方式的了解非常有限,我认为仅仅试图模拟人类大脑作为AGI的途径将是一条极其困难的道路。

一些有趣的动物实验强烈表明,同一块生物脑组织可以完成令人惊讶的广泛任务。这导致了一个学习算法假设,即许多智能可能归因于一个或少数几个学习算法。如果我们能弄清楚那一个或少数几个算法是什么,我们也许有一天能够在计算机中实现它。这里显示的大脑部分是听觉皮层,大脑会根据耳朵检测到的声音,将耳朵发出的信号以电脉冲的形式传递给听觉皮层。事实证明,如果你重新连接动物的大脑,切断耳朵和听觉皮层之间的连接,转而将图像输入听觉皮层,那么听觉皮层就会学会看。所以大多数人学习看的大脑部分,当输入不同的数据时,它会学会看。另一个例子。大脑的这一部分是体感皮层,体感指的是触觉处理。如果重新连接大脑,切断触觉传感器与大脑该部分的连接,而是重新连接大脑以输入图像,然后体感皮层就会学会看。已经有一系列这样的实验表明,大脑的许多不同部分,仅仅取决于给定的数据,就可以学会看、学会感觉或学会听,就好像可能有一种算法,它仅仅取决于给定的数据,就可以学会相应地处理输入。有些系统可以将摄像头安装在某人的前额上,并将其映射到某人舌头上的网格电压模式上。通过将灰度图像映射到舌头上的电压模式,这可以帮助那些没有被引用的人学会用舌头看东西,或者他们一直在进行有趣的人类回声定位或人类声纳实验,海豚和蝙蝠等动物使用声纳来观察,研究人员发现,如果你训练人类发出咔哒声,并聆听这些声音在周围环境中反射的声音,人类有时可以学习一定程度的人类回声定位。有很多这样的实验表明,人类大脑具有惊人的适应能力,神经科学家说它具有惊人的可塑性,他们只是说它能够适应令人眼花缭乱的传感器输入范围,所以问题是,如果同一块大脑组织可以学会看、触摸、感觉甚至其他东西,那么用户的平均水平是多少?我们能否复制这种算法并在计算机中实现?即使到了今天,我仍然认为研究AGI是有史以来最迷人的科学工程问题之一。但是,我认为避免过度炒作很重要,不知道大脑是否真的由一种或少数几种算法组成