我见过的最脑残也是最好懂的人工神经网络算法教程

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2014.06.13

用平常语言介绍神经网络

(NeuralNetworksinPlainEnglish)

神经网络介绍(IntroductiontoNeuralNetworks)

曾有很长一个时期,人工神经网络对我来说是完全神秘的东西。当然,有关它们我在文献中已经读过了,我也能描述它们的结构和工作机理,但我始终没有能“啊哈!”一声,如同你头脑中一个难于理解的概念有幸突然得到理解时的感觉那样。我的头上好象一直有个榔头在敲着,或者像电影AnimalHouse(中文片名为“动物屋”)中那个在痛苦地尖叫“先生,谢谢您,再给我一个啊!”的可怜家伙那样。我无法把数学概念转换成实际的应用。有时我甚至想把我读过的所有神经网络的书的作者都抓起来,把他们缚到一棵树上,大声地向他们吼叫:“不要再给我数学了,快给我一点实际东西吧!”。但无需说,这是永远不可能发生的事情。我不得不自己来填补这个空隙...由此我做了在那种条件下唯一可以做的事情。我开始干起来了。<一笑>

这样几个星期后,在一个美丽的日子里,当时我在苏格兰海边度假,当我越过一层薄雾凝视着狭长的海湾时,我的头脑突然受到一个冲击。一下子悟到了人工神经网络是怎样工作的。我得到“啊哈!”的感觉了!但我此时身边只有一个帐篷和一个睡袋,还有半盒子的脆玉米片,没有电脑可以让我迅速写出一些代码来证实我的直觉。Arghhhhh!这时我才想到我应该买一台手提电脑。不管怎样,几天后我回到家了,我立刻让我的手指在键盘上飞舞起来。几个小时后我的第一人工神经网络程序终于编成和运行了,并且工作得挺好!自然,代码写的有点乱,需要进行整理,但它确实已能工作了,并且,更重要的是,我还知道它为什么能工作!我可以告诉你,那天我是一位非常得意的人。

我希望本书传递给你的就是这种“啊哈!”感觉。当我们学完遗传算法时,你可能已尝到了一点感觉,但你希望这种感觉是美妙的话,那就要等把神经网络部分整个学完。

生物学的神经网络-大脑

(ABiologicalNeuralNetwork–TheBrain)

以下表1显示了人和几种动物的神经细胞的数目。

表l人和几种动物的神经细胞的数目

动物种类经细胞的数目(数量级)

蜗牛10,000(=10^4)

蜜蜂100,000(=10^5)

蜂雀10,000,000(=10^7)

老鼠100,000,000(=10^8)

人类10,000,000,000(=10^10)

大象100,000,000,000(=10^11)

图0-1大脑半球像核桃图0-2大脑皮层由灰质和白质组成

图0大脑的外形和切片形状

图1神经细胞的结构

在人的生命的最初9个月内,这些细胞以每分钟25,000个的惊人速度被创建出来。神经细胞和人身上任何其他类型细胞十分不同,每个神经细胞都长着一根像电线一样的称为轴突(axon)的东西,它的长度有时伸展到几厘米[译注],用来将信号传递给其他的神经细胞。神经细胞的结构如图1所示。它由一个细胞体(soma)、一些树突(dendrite)、和一根可以很长的轴突组成。神经细胞体是一颗星状球形物,里面有一个核(nucleus)。树突由细胞体向各个方向长出,本身可有分支,是用来接收信号的。轴突也有许多的分支。轴突通过分支的末梢(terminal)和其他神经细胞的树突相接触,形成所谓的突触(Synapse,图中未画出),一个神经细胞通过轴突和突触把产生的信号送到其他的神经细胞。

有趣的事实

曾经有人估算过,如果将一个人的大脑中所有神经细胞的轴突和树突依次连接起来,并拉成一根直线,可从地球连到月亮,再从月亮返回地球。如果把地球上所有人脑的轴突和树突连接起来,则可以伸展到离开们最近的星系!

神经细胞利用电-化学过程交换信号。输入信号来自另一些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触(synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际怎样传输是一个相当复杂的过程,但就我们而言,重要的是把它看成和现代的计算机一样,利用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即抑制)。发射信号的强度不变,变化的仅仅是频率。神经细胞利用一种我们还不知道的方法,把所有从树突上突触进来的信号进行相加,如果全部信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过分简单化,但已能满足我们的目的。

正是由于数量巨大的连接,使得大脑具备难以置信的能力。尽管每一个神经细胞仅仅工作于大约100Hz的频率,但因各个神经细胞都以独立处理单元的形式并行工作着,使人类的大脑具有下面这些非常明显的特点:

“当神经细胞A的一个轴突重复地或持久地激励另一个神经细胞B后,则其中的一个或同时两个神经细胞就会发生一种生长过程或新陈代谢式的变化,使得激励B细胞之一的A细胞的效能会增加”

对损伤有冗余性(tolerance)。大脑即使有很大一部分受到了损伤,它仍然能够执行复杂的工作。一个著名的试验就是训练老鼠在一个迷宫中行走。然后,科学家们将其大脑一部分一部分地、越来越大地加以切除。他们发现,即使老鼠的很大的一部大脑被切除后,它们仍然能在迷宫中找到行走路径。这一事实证明了,在大脑中,知识并不是保存在一个局部地方。另外所作的一些试验则表明,如果大脑的一小部分受到损伤,则神经细胞能把损伤的连接重新生长出来。

善于归纳推广。大脑和数字计算机不同,它极擅长的事情之一就是模式识别,并能根据已熟悉信息进行归纳推广(generlize)。例如,我们能够阅读他人所写的手稿上的文字,即使我们以前从来没见过他所写的东西。

它是有意识的。意识(consciousness)是神经学家和人工智能的研究者广泛而又热烈地在辩论的一个话题。有关这一论题已有大量的文献出版了,但对于意识实际究竟是什么,至今尚未取得实质性的统一看法。我们甚至不能同意只有人类才有意识,或者包括动物王国中人类的近亲在内才有意识。一头猩猩有意识吗?你的猫有意识吗?上星期晚餐中被你吃掉的那条鱼有意识吗?

因此,一个人工神经网络(Artificialneuralnetwork,简称ANN)就是要在当代数字计算机现有规模的约束下,来模拟这种大量的并行性,并在实现这一工作时,使它能显示许多和生物学大脑相类似的特性。下面就让我们瞧瞧它们的表演吧!

***************************************************************888

(连载之二)

3数字版的神经网络(TheDigitalVersion)

上面我们看到了生物的大脑是由许多神经细胞组成,同样,模拟大脑的人工神经网络ANN是由许多叫做人工神经细胞(Artificialneuron,也称人工神经原,或人工神经元)的细小结构模块组成。人工神经细胞就像真实神经细胞的一个简化版,但采用了电子方式来模拟实现。一个人工神经网络中需要使用多少个数的人工神经细胞,差别可以非常大。有的神经网络只需要使用10个以内的人工神经细胞,而有的神经网络可能需要使用几千个人工神经细胞。这完全取决于这些人工神经网络准备实际用来做什么。

我想你现在可能很想知道,一个人工神经细胞究竟是一个什么样的东西?但是,它实际上什么东西也不像;它只是一种抽象。还是让我们来察看一下图2吧,这是表示一个人工神经细胞的一种形式。

图2一个人工神经细胞

图中,左边几个灰底圆中所标字母w代表浮点数,称为权重(weight,或权值,权数)。进入人工神经细胞的每一个input(输入)都与一个权重w相联系,正是这些权重将决定神经网络的整体活跃性。你现在暂时可以设想所有这些权重都被设置到了-1和1之间的一个随机小数。因为权重可正可负,故能对与它关联的输入施加不同的影响,如果权重为正,就会有激发(excitory)作用,权重为负,则会有抑制(inhibitory)作用。当输入信号进入神经细胞时,它们的值将与它们对应的权重相乘,作为图中大圆的输入。大圆的‘核’是一个函数,叫激励函数(activationfunction),它把所有这些新的、经过权重调整后的输入全部加起来,形成单个的激励值(activationvalue)。激励值也是一浮点数,且同样可正可负。然后,再根据激励值来产生函数的输出也即神经细胞的输出:如果激励值超过某个阀值(作为例子我们假设阀值为1.0),就会产生一个值为1的信号输出;如果激励值小于阀值1.0,则输出一个0。这是人工神经细胞激励函数的一种最简单的类型。在这里,从激励值产生输出值是一个阶跃函数[译注]。看一看图3后你就能猜到为什么有这样的名称。

图3阶跃激励函数

[译注]由图可知阶跃函数是一元的,而激励函数既然能把多个输入相加应为多元,故需加以区别。

如果到目前为止你对这些还没有获得很多感觉,那也不必担心。窍门就是:不要企图去感觉它,暂时就随波逐流地跟我一起向前走吧。在经历本章的若干处后,你最终就会开始弄清楚它们的意义。而现在,就放松一点继续读下去吧。

3.1现在需要一些数学了(NowforSomeMath)

今后讨论中,我将尽量把数学降低到绝对少量,但学习一些数学记号对下面还是很有用的。我将把数学一点一点地喂给你,在到达有关章节时向你介绍一些新概念。我希望采用这样的方式能使你的头脑能更舒适地吸收所有的概念,并使你在开发神经网络的每个阶段都能看到怎样把数学应用到工作中。现在首先让我们来看一看,怎样把我在此之前告诉你的所有知识用数学方式表达出来。

一个人工神经细胞(从现在开始,我将把“人工神经细胞”简称它为“神经细胞”)可以有任意n个输入,n代表总数。可以用下面的数学表达式来代表所有n个输入:

x1,x2,x3,x4,x5,...,xn

同样n个权重可表达为:

w1,w2,w3,w4,w5...,wn

请记住,激励值就是所有输入与它们对应权重的之乘积之总和,因此,现在就可以写为:

a=w1x1+w2x2+w3x3+w4x4+w5x5+...+wnxn

以这种方式写下的求和式,我在第5章“建立一个更好的遗传算法”中已提到,可以用希腊字母Σ来简化:

注:

神经网络的各个输入,以及为各个神经细胞的权重设置,都可以看作一个n维的向量。你在许多技术文献中常常可以看到是以这样的方式来引用的。

下面我们来考察在程序中应该怎样实现?假设输入数组和权重数组均已初始化为x[n]和w[n],则求和的代码如下:

doubleactivation=0;

for(inti=0;i<=""p="">{

activation+=x[i]*w[i];

}

图4以图形的方式表示了此方程。请别忘记,如果激励值超过了阀值,神经细胞就输出1;如果激活小于阀值,则神经细胞的输出为0。这和一个生物神经细胞的兴奋和抑制是等价的。我们假设一个神经细胞有5个输入,他们的权重w都初始化成正负1之间的随机值(-1

图4神经细胞的激励函数

如果我们假定激活所需阀值=1,则因激励值1.1>激活阀值1,所以这个神经细胞将输出1。

在进一步读下去之前,请你一定要确切弄懂激励函数怎样计算。

表2神经细胞激励值的计算

3.2行,我知道什么是神经细胞了,但用它来干什么呢?

大脑里的生物神经细胞和其他的神经细胞是相互连接在一起的。为了创建一个人工神经网络,人工神经细胞也要以同样方式相互连接在一起。为此可以有许多不同的连接方式,其中最容易理解并且也是最广泛地使用的,就是如图5所示那样,把神经细胞一层一层地连结在一起。这一种类型的神经网络就叫前馈网络(feedforwordnetwork)。这一名称的由来,就是因为网络的每一层神经细胞的输出都向前馈送(feed)到了它们的下一层(在图中是画在它的上面的那一层),直到获得整个网络的输出为止。

图5一个前馈网络

由图可知,网络共有三层(译注:输入层不是神经细胞,神经细胞只有两层)。输入层中的每个输入都馈送到了隐藏层,作为该层每一个神经细胞的输入;然后,从隐藏层的每个神经细胞的输出都连到了它下一层(即输出层)的每一个神经细胞。图中仅仅画了一个隐藏层,作为前馈网络,一般地可以有任意多个隐藏层。但在对付你将处理的大多数问题时一层通常是足够的。事实上,有一些问题甚至根本不需要任何隐藏单元,你只要把那些输入直接连结到输出神经细胞就行了。另外,我为图5选择的神经细胞的个数也是完全任意的。每一层实际都可以有任何数目的神经细胞,这完全取决于要解决的问题的复杂性。但神经细胞数目愈多,网络的工作速度也就愈低,由于这一缘故,以及为了其他的几种原因(我将在第9章作出解释),网络的规模总是要求保持尽可能的小。

到此我能想象你或许已对所有这些信息感到有些茫然了。我认为,在这种情况下,我能做的最好的事情,就是向你介绍一个神经网络在现实世界中的实际应用例子,它有望使你自己的大脑神经细胞得到兴奋!不错吧?好的,下面就来了...

你可能已听到或读到过神经网络常常用来作模式识别。这是因为它们善于把一种输入状态(它所企图识别的模式)映射到一种输出状态(它曾被训练用来识别的模式)。

下面我们来看它是怎么完成的。我们以字符识别作为例子。设想有一个由8x8个格子组成的一块面板。每一个格子里放了一个小灯,每个小灯都可独立地被打开(格子变亮)或关闭(格子变黑),这样面板就可以用来显示十个数字符号。图6显示了数字“4”。

图6用于字符显示的矩阵格点

要解决这一问题,我们必需设计一个神经网络,它接收面板的状态作为输入,然后输出一个1或0;输出1代表ANN确认已显示了数字“4”,而输出0表示没有显示“4”。因此,神经网络需要有64个输入(每一个输入代表面板的一个具体格点)和由许多神经细胞组成的一个隐藏层,还有仅有一个神经细胞的输出层,隐藏层的所有输出都馈送到它。我真希望你能在你的头脑中画出这个图来,因为要我为你把所有这些小圆和连线统统画出来确实不是一桩愉快的事<一笑>。

一旦神经网络体系创建成功后,它必须接受训练来认出数字“4”。为此可用这样一种方法来完成:先把神经网的所有权重初始化为任意值。然后给它一系列的输入,在本例中,就是代表面板不同配置的输入。对每一种输入配置,我们检查它的输出是什么,并调整相应的权重。如果我们送给网络的输入模式不是“4”,则我们知道网络应该输出一个0。因此每个非“4”字符时的网络权重应进行调节,使得它的输出趋向于0。当代表“4”的模式输送给网络时,则应把权重调整到使输出趋向于1。

如果你考虑一下这个网络,你就会知道要把输出增加到10是很容易的。然后通过训练,就可以使网络能识别0到9的所有数字。但为什么我们到此停止呢?我们还可以进一步增加输出,使网络能识别字母表中的全部字符。这本质上就是手写体识别的工作原理。对每个字符,网络都需要接受许多训练,使它认识此文字的各种不同的版本。到最后,网络不单能认识已经训练的笔迹,还显示了它有显著的归纳和推广能力。也就是说,如果所写文字换了一种笔迹,它和训练集中所有字迹都略有不同,网络仍然有很大几率来认出它。正是这种归纳推广能力,使得神经网络已经成为能够用于无数应用的一种无价的工具,从人脸识别、医学诊断,直到跑马赛的预测,另外还有电脑游戏中的bot(作为游戏角色的机器人)的导航,或者硬件的robot(真正的机器人)的导航。

这种类型的训练称作有监督的学习(supervisedlearnig),用来训练的数据称为训练集(trainingset)。调整权重可以采用许多不同的方法。对本类问题最常用的方法就是反向传播(backpropagation,简称backprop或BP)方法。有关反向传播问题,我将会在本书的后面,当你已能训练神经网络来识别鼠标走势时,再来进行讨论。在本章剩余部分我将集中注意力来考察另外的一种训练方式,即根本不需要任何导师来监督的训练,或称无监督学习(unsupervisedlearnig)。

这样我已向你介绍了一些基本的知识,现在让我们来考察一些有趣的东西,并向你介绍第一个代码工程。

(连载之三)

4.聪明的扫雷机工程(SmartMinesweeperProject)

我要向你介绍的第一个完整例子,是怎么使用神经网络来控制具有人工智能的扫雷机的行为。扫雷机工作在一个很简单的环境中,那里只有扫雷机以及随机散布的许多地雷。

图7运行中的演示程序。

尽管书上图形画成了黑白色,但当你运行程序时性能最好的扫雷机将显现为红色。地雷,你可能已经猜到,就是那些小方形。工程的目标是创建一个网络,它不需要从我们这里得到任何帮助,就能自己进行演化(evolve)去寻找地雷。为了实现这一功能,网络的权重将被编码到基因组中,并用一个遗传算法来演化它们。

怎么样,很酷吧?

提示(重要)

如果你跳过前面的一些章节来到这里,而你又不了解怎样使用遗传算法,则在进一步阅读下面的内容之前,你应回到前面去补读一下有关遗传算法的内容。

首先让我解释人工神经网络(ANN)的体系结构。我们需要决定输入的数目、输出的数目、还有隐藏层和每个隐藏层中隐藏单元的数目。

4.1选择输出(ChoosingtheOutputs)

那么,人工神经网络怎样控制扫雷机的行动呢?很好!我们把扫雷机想象成和坦克车一样,通过左右2个能转动的履带式轮轨(track)来行动的。见图案9.8。

图8扫雷机的控制

扫雷机向前行进的速度,以及向左、向右转弯的角度,都是通过改变2个履带轮的相对速度来实现的。因此,神经网络需要2个输入,1个是左侧履带轮的速度,另一个是右侧履带轮的速度。

啊,但是...,我听见你在嘀咕了。如果网络只能输出一个1或一个0,我们怎么能控制车轨移动的快慢呢?你是对的;如果利用以前描述的阶跃函数来决定输出,我们就根本无法控制扫雷机实际移动。幸好,我有一套戏法,让我卷起袖子来,把激励函数的输出由阶跃式改变成为在0-1之间连续变化的形式,这样就可以供扫雷机神经细胞使用了。为此,有几种函数都能做到这样,我们使用的是一个被称为逻辑斯蒂S形函数(logisticsigmoidfunction)[译注1]。该函数所实现的功能,本质上说,就是把神经细胞原有的阶跃式输出曲线钝化为一光滑曲线,后者绕y轴0.5处点对称[译注2],如图9所示。

[译注1]logistic有’计算的’或’符号逻辑的’等意思在内,和’逻辑的(logic)’意义不同。

[译注2]点对称图形绕对称点转180度后能与原图重合。若f(x)以原点为点对称,则有f(-x)=-f(x)

图9S形曲线。

当神经细胞的激励值趋于正、负无穷时,S形函数分别趋于1或0。负的激励值对应的函数值都<0.5;正激励值对应的函数值都>0.5。S形函数用数学表达式写出来则为:

这个方程看上去可能会吓唬一些人,但其实很简单。e是数学常数,近似等于2.7183,a是神经细胞的激励值,它是函数的自变量,而p是一个用来控制曲线形状变化快慢或陡峭性的参数。p通常设定为1。当p赋以较大值时,曲线就显得平坦,反之,就会使曲线变为陡峭。见图1O。很低的p值所生成的函数就和阶跃函数近似。P值的大小用来控制何时使神经网络由低变高开始翻转有很大作用,但是在本例子中我们将它保持为1。

注:“S型”的英文原名Sigmoid或Sigmoidal原来是根据希腊字“Sigma”得来的,但非常巧它也可以说成是曲线的一种形状。

图7。10不同的S形响应曲线。

4.2选择输入(ChoosingtheInputs)

上面我们已经把输出安排好了,现在我们来考虑输入,确定网络需要什么样的输入?为此,我们必须想象一下扫雷机的具体细节:需要什么样的信息才能使它朝地雷前进?你可能想到的第一个输入信息清单是:

扫雷机的位置(x1,y1)

与扫雷机最靠近的地雷的位置(x2,y2)

代表扫雷机前进方向的向量(x3,y3)

这样一共得到6个输入。但是,要网络使用这些输入,工作起来就非常困难,因为,网络在像我们希望的那样执行工作之前,必须寻找所有6个输入之间的数学关系,而这有相当工作量。可以把此作为一个练习倒是很理想的:去试试如何给出最少数量的输入而仍能为网络传达解决问题所需要的全部信息。你的网络使用的输入愈少,网络所要求的神经细胞数目也愈少。而较少的神经细胞就意味更快速的训练和更少的计算,有利于网络更高速度的工作。

只要作少量的额外考虑,就能够把输入的个数减少为4,这就是图11中所画出的两个向量的4个参数。

把神经网络的所有输入进行规范化是一种好想法。这里的意思并不是说每个输入都要改变大小使它们都在0~1间,而是说每一个输入应该受到同等重视。例如,拿我们已经讨论过的扫雷机输入为例。瞄准向量或视线向量(look-atvector)总是一个规范化向量,即长度等于1,分量x和y都在0~1间。但从扫雷机到达其最近地雷的向量就可能很大,其中的一个分量甚至有可能和窗体的宽度或高度一样大。如果这个数据以它的原始状态输入到网络,网络对有较大值的输入将显得更灵敏,由此就会使网络性能变差。因此,在信息输入到神经网络中去之前,数据应预先定比(scaled)和标准化(standardized),使它们大小相似(similar)。在本特例中,由扫雷机引到与其最接近地雷的向量需要进行规范化(normalized)。这样可以使扫雷机的性能得到改良。

图11选择输入。

小技巧:

有时,你把输入数据重新换算(rescale)一下,使它以0点为中心,就能从你的神经网络获得最好的性能。这一小窍门在你设计网络时永远值得一试。但我在扫雷机工程中没有采用这一方法,这是因为我想使用一种更直觉的方法。

4.3隐藏的神经细胞要多少?(HowmanyHiddenNeurons)

第一版本中一共使用了10个隐藏神经细胞(当然,我的这个数字也不一定是最好的<一笑>)。你应围绕这个数字的附近来做游戏,并观察隐藏层神经细胞的数目对扫雷机的演化会产生什么样的影响。不管怎样,理论已经够了,让我们拿一个具体程序来看看吧!你可以在本书所附光盘的Chapter7/SmartSweepersv1.0文件夹中找到本章下面几页即将描述的所有程序的源码。

(连载之四)

4.4CNeuralNet.h(神经网络类的头文件)

在CNeuralNet.h文件中,我们定义了人工神经细胞的结构、定义了人工神经细胞的层的结构、以及人工神经网络本身的结构。首先我们来考察人工神经细胞的结构。

4.4.1SNeuron(神经细胞的结构)

这是很简单的结构。人工神经细胞的结构中必须有一个正整数来纪录它有多少个输入,还需要有一个向量std:vector来表示它的权重。请记住,神经细胞的每一个输入都要有一个对应的权重。

StructSNeuron

{

//进入神经细胞的输入个数

intm_NumInputs;

//为每一输入提供的权重

vectorm_vecWeight;

//构造函数

SNeuron(intNumInputs);

};

以下就是SNeuron结构体的构造函数形式:

SNeuron::SNeuron(intNumInputs):m_NumInputs(NumInputs+1)

(

//我们要为偏移值也附加一个权重,因此输入数目上要+1

//把权重初始化为任意的值

m_vecWeight.push_back(RandomClamped());

由上可以看出,构造函数把送进神经细胞的输入数目NumInputs作为一个变元,并为每个输入创建一个随机的权重。所有权重值在-1和1之间。

这是什么?我听见你在说。这里多出了一个权重!不错,我很高兴看到你能注意到这一点,因为这一个附加的权重十分重要。但要解释它为什么在那里,我必须更多地介绍一些数学知识。回忆一下你就能记得,激励值是所有输入*权重的乘积的总和,而神经细胞的输出值取决于这个激励值是否超过某个阀值(t)。这可以用如下的方程来表示:

w1x1+w2x2+w3x3+...+wnxn>=t

上式是使细胞输出为1的条件。因为网络的所有权重需要不断演化(进化),如果阀值的数据也能一起演化,那将是非常重要的。要实现这一点不难,你使用一个简单的诡计就可以让阀值变成权重的形式。从上面的方程两边各减去t,得:

w1x1+w2x2+w3x3+...+wnxn–t>=0

这个方程可以再换用一种形式写出来,如下:

w1x1+w2x2+w3x3+...+wnxn+t*(–1)>=0

到此,我希望你已能看出,阀值t为什么可以想像成为始终乘以输入为-1的权重了。这个特殊的权重通常叫偏移(bias),这就是为什么每个神经细胞初始化时都要增加一个权重的理由。现在,当你演化一个网络时,你就不必再考虑阀值问题,因为它已被内建在权重向量中了。怎么样,想法不错吧?为了让你心中绝对敲定你所学到的新的人工神经细胞是什么样子,请再参看一下图12。

图12带偏移的人工神经细胞。

4.4.2SNeuronLayer(神经细胞层的结构)

神经细胞层SNeuronLayer的结构很简单;它定义了一个如图13中所示的由虚线包围的神经细胞SNeuron所组成的层。

图13一个神经细胞层。

以下就是层的定义的源代码,它应该不再需要任何进一步的解释:

structSNeuronLayer

//本层使用的神经细胞数目

intm_NumNeurons;

//神经细胞的层

vectorm_vecNeurons;

SNeuronLayer(intNumNeurons,intNumInputsPerNeuron);

};

4.4.3CNeuralNet(神经网络类)

这是创建神经网络对象的类。让我们来通读一下这一个类的定义:

classCNeuralNet

private:

intm_NumOutputs;

intm_NumHiddenLayers;

intm_NeuronsPerHiddenLyr;

//为每一层(包括输出层)存放所有神经细胞的存储器

vectorm_vecLayers;

所有private成员由其名称容易得到理解。需要由本类定义的就是输入的个数、输出的个数、隐藏层的数目、以及每个隐藏层中神经细胞的个数等几个参数。

public:

CNeuralNet();

该构造函数利用ini文件来初始化所有的Private成员变量,然后再调用CreateNet来创建网络。

//由SNeurons创建网络

voidCreateNet();

我过一会儿马上就会告诉你这个函数的代码。

//从神经网络得到(读出)权重

vectorGetWeights()const;

由于网络的权重需要演化,所以必须创建一个方法来返回所有的权重。这些权重在网络中是以实数型向量形式表示的,我们将把这些实数表示的权重编码到一个基因组中。当我开始谈论本工程的遗传算法时,我将为您确切说明权重如何进行编码。

//返回网络的权重的总数

intGetNumberOfWeights()const;

//用新的权重代替原有的权重

voidPutWeights(vector&weights);

这一函数所做的工作与函数GetWeights所做的正好相反。当遗传算法执行完一代时,新一代的权重必须重新插入神经网络。为我们完成这一任务的是PutWeight方法。

//S形响应曲线

inlinedoubleSigmoid(doubleactivation,doubleresponse);

当已知一个神经细胞的所有输入*重量的乘积之和时,这一方法将它送入到S形的激励函数。

//根据一组输入,来计算输出

vectorUpdate(vector&inputs);

对此Update函数函数我马上就会来进行注释的。

};//类定义结束

4.4.3.1CNeuralNet::CreateNet(创建神经网络的方法)

我在前面没有对CNeuralNet的2个方法加以注释,这是因为我要为你显示它们的更完整的代码。这2个方法的第一个是网络创建方法CreateNet。它的工作就是把由细胞层SNeuronLayers所收集的神经细胞SNeurons聚在一起来组成整个神经网络,代码为:

voidCNeuralNet::CreateNet()

//创建网络的各个层

if(m_NumHiddenLayers>0)

//创建第一个隐藏层[译注]

m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr,

m_NumInputs));

for(inti=O;i<=""p="">{

m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr,

m_NeuronsPerHiddenLyr));

[译注]如果允许有多个隐藏层,则由接着for循环即能创建其余的隐藏层。

//创建输出层

m_vecLayers.push_back(SNeuronLayer(m_NumOutput,m_NeuronsPerHiddenLyr));

else//无隐藏层时,只需创建输出层

m_vecLayers.push_back(SNeuronLayer(m_NumOutputs,m_NumInputs));

4.4.3.2CNeuralNet::Update(神经网络的更新方法)

Update函数(更新函数)称得上是神经网络的“主要劳动力”了。这里,输入网

THE END
1.神经网络入门brilliant推出的introductiontoneuralnetworks课程Delve into the inner machinery of neural networks to discover how these flexible learning tools actually work. 15 Lessons Neural Networks The Computer Vision Problem The Folly of Computer Programming Can Computers Learn? The Decision Box Activation Arithmetic Decision Boundaries Building an XOR Gate Clashttp://brilliant.org/courses/intro-neural-networks/
2.神经网络——神经网络入门本章的目的是让你开始用神经网络来解决实际问题。你将进一步巩固在前边第一个示例中学到的知识,还会将学到的知识应用于三个新问题,这三个问题涵盖神经网络最常见的三种使用场景:二分类问题、多分类问题和标量回归问题。 本章将进一步介绍神经网络的核心组件,即层、网络、目标函数和优化器;还会简要介绍Keras,它是贯https://blog.csdn.net/qq_36879493/article/details/113036579
3.bp神经网络教程bp神经网络步骤bp神经网络 教程 bp神经网络步骤 BP神经网络简单流程 2017年12月01日 09:47:29 阅读数:2908 BP(Back Propagation)神经网络是一种具有三层或者三层以上的多层神经网络,每一层都由若干个神经元组成,它的左、右各层之间各个神经元实现全连接,即左层的每一个神经元与右层的每个神经元都由连接,而上下各神经元之间https://blog.51cto.com/u_16099193/6333632
4.深度学习之卷积神经网络教程本文我们介绍深度学习与神经网络中卷积算法如何应用在识别图片中?该文是假定你对神经网络和深度学习有一定认识,如果不熟悉,可见本站 “神经网络最基本形式感知器的入门教程”。 首先我们从一个简单任务开始,让机器能够识别数字“8”,我们需要大量手写体的“8”供机器学习和训练使用,那么神经网络将这些大量手写体"8"输https://www.jdon.com/bigdata/convolutional-neural-network.html
5.神经网络15本教程part2,PDF格式一次性方便全方位下载神经网络方面的15本经典教程,让您一网打尽神经网络技术,领略神经网络技术的魅力。由于限于一次性上传文件必须小于15M,只好分成如下六个部分,请谅解! part1包括:1.人工神经网络导论 2.电脑人脑化神经网络 3.大规模人工神经网络理论基础 4.从神经元芯片到控制网络 part2包括:5.人工神经网络与模https://www.iteye.com/resource/llq994300-2013654
6.BP神经网络入门教程老饼讲解神经网络BP神经网络入门要怎么学习?初学者找到的资料也许是过于晦涩或者过于简单,本目录提供给入门初学者一个通俗、简洁又不失全面的入门教程,看完就懂https://www.bbbdata.com/nn
7.深度学习入门教程神经网络概述(上)[1] 神经网络概述(上) 2054播放 待播放 [2] 神经网络概述(下) 1346播放 05:42 [3] 神经网络发展史(上) 1540播放 05:48 [4] 神经网络发展史(下) 912播放 05:51 [5] 从0到1-单层感知器(上) 1319播放 09:26 [6] 从0到1-单层感知器(下) https://open.163.com/newview/movie/free?pid=CHHGR9V4D&mid=KHHGRADKT
8.人工神经网络实用教程人工神经网络实用教程 人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。 经管之家是国内活跃的在线教育咨询平台! 经管之家新媒体交易平台 提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯https://bbs.pinggu.org/jg/kaoyankaobo_kaoyan_3682880_1.html
9.神经网络的基础知识教程码农集市专业分享IT编程学习资源神经网络的基础知识教程tl**rt 上传3KB 文件格式 txt 神经网络 课程资源 神经网络的基础知识教程 点赞(0) 踩踩(0) 反馈 所需:1 积分 电信网络下载 182584482541812.zip 2024-12-02 05:44:45 积分:1 大学生创新创业训练计划经验分享.zip 2024-12-02 05:24:56 积分:1 阮贤国8-2 (3).zip 2024-https://www.coder100.com/index/index/content/id/4038691
10.神经网络基础知识及实用教程.pdf普通高等教育“十一五”规划教材 神经网络实用教程 张良均 曹晶 蒋世忠 编 主审 胡学钢 机械工业出版社 内容简介: 本书基于MATLAB 6.5/7 提供的神经网络工具箱,介绍了神经网络常用算法、优化算法及其混合编程 实现。全书共分为6 章,分别结合实例介绍了人工神经网络概述,实用神经网络模型与学习算法,神经网 络算法优化https://max.book118.com/html/2019/0407/8125143124002015.shtm
11.PythonCNN卷积神经网络实战教程深入讲解pythonCNN,即卷积神经网络,主要用于图像识别,分类。由输入层,卷积层,池化层,全连接层(Affline层),Softmax层叠加而成。卷积神经网络中还有一个非常重要的结构:过滤器,它作用于层与层之间(卷积层与池化层),决定了怎样对数据进行卷积和池化+ 目录 一、CNN简介 1. 神经网络基础 输入层(Input layer),众多神经元(Neuron)https://www.jb51.net/article/269986.htm
12.想了解递归神经网络?这里有一份入门教程雷峰网导语:递归网络是一类人工神经网络,用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,或用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。 递归神经网络入门教程 引言 递归神经网络是一类人工神经网络,可用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,也可用于识别传感器、股票市场、政府https://www.leiphone.com/category/ai/syAwLNx4bGPuFYI1.html
13.深度学习之神经网络入门视频教程深度学习之神经网络入门最佳路径 正十七软件工程师 难度初级 时长2小时15分 学习人数21086 综合评分9.73 简介:本课程首先介绍机器学习与深度学习,包括机器学习的应用、岗位职责,深度学习的等。然后通过讲解神经元及其衍生模型逻辑斯底回归、目标函数、梯度下降等深度学习基础知识。最后通过Tensorflow来实现课程讲解的模型。https://www.imooc.com/learn/1063/
14.让研习AI变得简单(一):人工智能12本经典教材推荐第11章 深度神经网络 第12章 强化学习 第13章 宽度学习 第14章 图卷积神经网络 第15章 语音、文本、图像与视频模式识别 图书链接: 当当自营:http://product.dangdang.com/11234769123.html 京东自营:https://item.jd.com/12686986.html 04.《现代神经网络教程》 https://ipiu.xidian.edu.cn/info/1097/2617.htm
15.生信自学网神经网络GEO基础生信自学课堂生信自学网神经网络 GEO基础 GEO转录组 分子亚型 非肿瘤m6A WGCNA筛选 多芯片联合 GEO单基因 GEO免疫浸润 单细胞测序 geoBatch联合分析 肿瘤微环境 环状RNA芯片 长非编码RNA miRNA芯片 甲基化免疫 GEO精品 自噬基因 多芯片联合 氧化应激 节律基因 细胞衰老 铜死亡 https://ke.biowolf.cn/brand-68-c297.html
16.最简单的人工神经网络在GitHub 上一个极简、入门级的神经网络教程,示例代码为 Go语言,简洁易懂能用一行公式说明白的道理。 内容分为两部分: 第一部分:最简单的人工神经网络 第二部分:最基础的反向传播算法 人工神经网络是人工智能的基础,只有夯实基础,才能玩转 AI 魔法! https://cx.comake.online/getNewsCon?key=1631863864739085
17.卷积神经网络指引——CNN架构译站1. CNN教程–目标 在本卷积神经网络教程中,我们将研究什么是CNN及其体系结构。此外,我们将讨论卷积神经网络的历史,术语,应用和优势。因此,让我们开始CNN教程。 2.什么是卷积神经网络? 在机器学习中,CNN是一类深度学习和前馈学习。它已成功地应用于分析视觉图像。 https://god.yanxishe.com/TextTranslation/1784
18.GitHub6. 从基本原理到梯度下降,小白都能看懂的神经网络教程 GitHub上的机器学习/深度学习综述项目合集 CNN 发展史 1. 94页论文综述卷积神经网络:从基础技术到研究前景 2. 从LeNet-5到DenseNet 3. CNN图像分割简史:从R-CNN到Mask R-CNN(译) 4. 深度学习之目标检测的前世今生(Mask R-CNN) 5. 纵览轻量化卷积神https://github.com/jiying61306/DeepLearning
19.爆肝万字,终于搞定这篇?神经网络搭建全全全流程!学不会你来找可以说所有深度学习模型都是神经网络,但并非所有神经网络都是深度学习模型。一般来说,『深度』学习适用于算法至少有 2 个隐藏层(因此总共 4 层,包括输入和输出)。 关于深度神经网络的详细知识,大家可以阅读学习ShowMeAI的文章 深度学习教程 | 深层神经网络。 https://cloud.tencent.com/developer/article/2069094