第六百三十四章

  &b;&b;&b;&b;&b;&b;&b;&b;对于一个给定的感知器来说,它的权重和阈值也是给定的,代表一种决策策略。因此,我们可以通过调整权重和阈值来改变这个策略。

  &b;&b;&b;&b;&b;&b;&b;&b;关于阈值r,这里需要指出的一点是,为了表达更方便,一般用它的相反数来表达:b=-r,这里的b被称为偏置(b)。

  &b;&b;&b;&b;&b;&b;&b;&b;这样,前面计算输出的规则就修改为:如果&b;&b;&b;&b;+&b;&b;&b;&b;&b;&b;&b;&b;+&b;&b;&b;&b;&b;&b;&b;&b;+...+&b;&b;&b;&b;b&b;&b;&b;&b;&;&b;&b;&b;&b;,则输出=,否则输出=。

  &b;&b;&b;&b;&b;&b;&b;&b;而权重==-,则b=。

  &b;&b;&b;&b;&b;&b;&b;&b;很明显,只有当==的时候,=,因为(?)*+(?)*+=?,小于。而其它输入的情况下,都是=。

  &b;&b;&b;&b;&b;&b;&b;&b;所以在实际情况下,这其实是一个“与非门”!

  &b;&b;&b;&b;&b;&b;&b;&b;在计算机科学中,与非门是所有门部件中比较特殊的一个,它可以通过组合的方式表达任何其它的门部件。这被称为与非门的普适性(&b;&b;&b;&b;r)。

  &b;&b;&b;&b;&b;&b;&b;&b;既然感知器能够通过设置恰当的权重和偏置参数,来表达一个与非门,那么理论上它也就能表达任意其它的门部件。

  &b;&b;&b;&b;&b;&b;&b;&b;因此,感知器也能够像前面三体中的例子一样,通过彼此连接从而组成一个计算机系统。

  &b;&b;&b;&b;&b;&b;&b;&b;但这似乎没有什么值得惊喜的,我们已经有现成的计算机了,这只不过是让事情复杂化了而已。

  &b;&b;&b;&b;&b;&b;&b;&b;单个感知器能做的事情很有限。要做复杂的决策,所以则是需要将多个感知器连接起来。

  &b;&b;&b;&b;&b;&b;&b;&b;而实际中的网络可能会有上万个,甚至数十万个参数,如果手工一个一个地去配置这些参数,恐怕这项任务永远也完成不了了。

  &b;&b;&b;&b;&b;&b;&b;&b;而神经网络最有特色的地方就在于这里。

  &b;&b;&b;&b;&b;&b;&b;&b;我们不是为网络指定所有参数,而是提供训练数据,让网络自己在训练中去学习,在学习过程中为所有参数找到最恰当的值。

  &b;&b;&b;&b;&b;&b;&b;&b;大体的运转思路是这样:我们告诉网络当输入是某个值的时候,我们期望的输出是什么,这样的每一份训练数据,称为训练样本(r&b;&b;&b;&b;)。

  &b;&b;&b;&b;&b;&b;&b;&b;这个过程相当于老师在教学生某个抽象的知识的时候,举一个具体例子:

  &b;&b;&b;&b;&b;&b;&b;&b;一般来说,我们举的例子越多,就越能表达那个抽象的知识。这在神经网络的训练中同样成立。

  &b;&b;&b;&b;&b;&b;&b;&b;我们可以向网络灌入成千上万个训练样本,然后网络就自动从这些样本中总结出那份隐藏在背后的抽象的知识。

  &b;&b;&b;&b;&b;&b;&b;&b;这份知识的体现,就在于网络的所有权重和偏置参数的取值。

  &b;&b;&b;&b;&b;&b;&b;&b;假设各个参数有一个初始值,当我们输入一个训练样本的时候,它会根据当前参数值计算出唯一的一个实际输出值。

  &b;&b;&b;&b;&b;&b;&b;&b;这个值可能跟我们期望的输出值不一样。想象一下,这时候,我们可以试着调整某些参数的值,让实际输出值和期望输出值尽量接近。

  &b;&b;&b;&b;&b;&b;&b;&b;当所有的训练样本输入完毕之后,网络参数也调整到了最佳值,这时每一次的实际输出值和期望输出值已经无限接近,这样训练过程就结束了。

  &b;&b;&b;&b;&b;&b;&b;&b;假设在训练过程中,网络已经对数万个样本能够给出正确(或接近正确)的反应了,那么再给它输入一个它没见过的数据,它也应该有很大概率给出我们预期的决策。这就是一个神经网络工作的原理。

  &b;&b;&b;&b;&b;&b;&b;&b;但这里还有一个问题,在训练过程中,当实际输出值和期望输出值产生差异的时候,要如何去调整各个参数呢?

  &b;&b;&b;&b;&b;&b;&b;&b;当然,在思考怎么做之前,也应该先弄清楚:通过调整参数的方式获得期望的输出,这个方法行得通吗?

  &b;&b;&b;&b;&b;&b;&b;&b;实际上,对于感知器网络来说,这个方法基本不可行。

  &b;&b;&b;&b;&b;&b;&b;&b;比如在上图有个参数的感知器网络中,如果维持输入不变,我们改变某个参数的值,那么最终的输出基本完全不可预测。

  &b;&b;&b;&b;&b;&b;&b;&b;它或者从变到(或从变到),当然也可能维持不变。这个问题的关键在于:输入和输出都是二进制的,只能是或者。

  &b;&b;&b;&b;&b;&b;&b;&b;如果把整个网络看成一个函数(有输入,有输出),那么这个函数不是连续的。

  &b;&b;&b;&b;&b;&b;&b;&b;因此,为了让训练成为可能,我们需要一个输入和输出能够在实数上保持连续的神经网络。于是,这就出现了神经元。

  &b;&b;&b;&b;&b;&b;&b;&b;神经元(&b;&b;&b;&b;r)是现代神经网络经常使用的基本结构(当然不是唯一的结构)。它与感知器的结构类似,但有两个重要的区别。

  &b;&b;&b;&b;&b;&b;&b;&b;第一,它的输入不再限制为和,而可以是任意~之间的实数。

  &b;&b;&b;&b;&b;&b;&b;&b;第二,它的输出也不再限制为和,而是将各个输入的加权求和再加上偏置参数,经过一个称为函数的计算作为输出。

  &b;&b;&b;&b;&b;&b;&b;&b;具体来说,假设=+++...+b,那么输出=σ(),其中:σ()=&b;&b;&b;&b;/(+-)。

  &b;&b;&b;&b;&b;&b;&b;&b;σ()是一个平滑、连续的函数。而且,它的输出也是~之间的实数,这个输出值可以直接作为下一层神经元的输入,保持在~之间。

  &b;&b;&b;&b;&b;&b;&b;&b;可以想象,在采用神经元组装神经网络之后,网络的输入和输出都变为连续的了,也就是说,当我们对某个参数的值进行微小的改变的时候,它的输出也只是产生微小的改变。这样就使得逐步调整参数值的训练成为可能。

  &b;&b;&b;&b;&b;&b;&b;&b;在历史上,很多研究人员曾经也做过尝试,&b;&b;&b;&b;的书《r&b;&b;&b;&b;rr&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;r》这本书中也曾经提到过这个例子。

  &b;&b;&b;&b;&b;&b;&b;&b;这个神经网络只有一层隐藏层,属于浅层的神经网络(&b;&b;&b;&b;r&b;&b;&b;&b;rr)。而真正的深度神经网络(&b;&b;&b;&b;r&b;&b;&b;&b;rr),则会有多层隐藏层。

  &b;&b;&b;&b;&b;&b;&b;&b;神经元系统采用了左右脑半球的设计方式进行设计和制造。

  &b;&b;&b;&b;&b;&b;&b;&b;最右侧则是输出层(&b;&b;&b;&b;r),有个神经元节点,分别代表识别结果是,,,...,。当然,受函数σ()的限制,每个输出也肯定是~之间的数。

  &b;&b;&b;&b;&b;&b;&b;&b;那我们得到一组输出值之后,哪个输出的值最大,最终的识别结果就是它。

  &b;&b;&b;&b;&b;&b;&b;&b;而在训练的时候,输出的形式则是:正确的那个数字输出为,其它输出为,隐藏层和输出层之间也是全连接。

  &b;&b;&b;&b;&b;&b;&b;&b;神经网络共的权重参数有*+*=个,偏置参数有+=个,总共参数个数为:+=个。

  &b;&b;&b;&b;&b;&b;&b;&b;这是一个非常惊人的数字。