首页 > 代码库 > 【自己动手写神经网络】小白入门连载(三)--神经元的感知

【自己动手写神经网络】小白入门连载(三)--神经元的感知

【真实原创,转载务必注明出处】

上一个连载中我们已经了解了神经元模型和其工作方式。单个神经元就可以构成一个最简单的神经网络——感知机。在单层神经元感知机中,网络接收若干过输入,并通过输入函数、传输函数给出一个网络的输出。这个网络已经可以解决苹果和香蕉的分类问题。在本系列中,将具体介绍其内部原理。

首先,我们确定感知机的输入。在此,我们引入形状和颜色两个变量,苹果的形状为圆形记为1,颜色为红色记为1;香蕉的形状为弯形记为-1,颜色为黄色记为-1。则有输入p如表3.1所示。

 

表3.1 常用传输函数列表

P

形状

颜色

苹果

1

1

香蕉

-1 

-1 

 

 

其次可以确定传输函数f为Step函数。由于Step函数只能有1和0两种输出,故在此处,定义输出1表示苹果,输出0表示香蕉。

令权重w1=1,w2=1,b=0,则有图3.1所示的感知机,它有两个输入,并且都是1。这表示圆形,并且红色。

图3.1 感知机识别苹果

 

此时,net=p1*w1+p2*w2+b

=1+1+0

=2

Step(net)=1

可以看到当输入苹果属性时,感知机正确输出了1,表示苹果。

同样道理当输入-1、-1的香蕉属性时,感知机反应如下:

net=p1*w1+p2*w2+b

=-1-1+0

=-2

Step(net)=0

感知机又作出了正确的判断,当遇到弯的黄色水果时,感知机判断其为香蕉。

虽然感知机在此时已经可以做出来正确的判断,但是我相信读者一定会觉得很疑惑,权值w1、w2和b究竟为什么定义为1、1、0?如果取其它值,感知机还可以正常工作吗?应该如何求出权重和偏置的取值呢?

首先,必须知道,权重和偏置的取值会直接关系到感知机能否正常工作,并不是所有的取值都可以使感知机正常工作。但所幸的是,即使弄错了权值和偏置,还可以使用一套感知机的学习规则,通过不断的迭代学习,求得可以使感知机正常工作的权值和偏置。

感知机学习规则如下:

wnew=wold+ep

bnew=bold+e

其中e表示误差,e=t-a,t为期望输出,a为实际输出。

此规则的含义是,如果感知机的输出有误,则首先计算误差e,e为期望输出和实际输出的差值。新的权值等于旧值加上误差和输入p的乘积。同理,偏置可以看做是输入p恒为1的输入信号,故新的偏置等于旧偏置加入误差。当计算机出新的权重和偏置后,使用测试数据再次测试感知机,直到没有误差或误差在可接受范围内为止。

设w1=1,w2=-1,b=0,输入苹果属性1,1。得到:

net=p1*w1+p2*w2+b

=1-1+0

=0

Step(net)=0

输出错误,存在误差,故进行修正。

e=t-a

=1-0

=1

w1new=w1old+ep

     =1+1*1

=2

w2new=w2old+ep

     =-1+1*1

=0

bnew=bold+e

=0+1

=1

使用新的权值带入感知机,重新计算苹果的属性输入。

net=p1*w1+p2*w2+b

=1*2+1*0+1

=3

Step(net)=1

纠正误差后,苹果判断正确。尝试判断香蕉。

net=p1*w1+p2*w2+b

=-1*2-1*0+1

=-1

Step(net)=0

香蕉判断也正确,误差为0,学习结束。由此可见,即使初始权值是错误的,只要按照感知机学习规则修正权值和偏置,在感知机的可判断范围内,就有可能消除误差或将误差限制在可接收范围内。

感知机的基本原理已经基本介绍完毕。下面就可以动手实现自己的感知机了。为了方便读者理解,本书使用Java来实现神经网络,并引入神经网络框架neuroph,辅助神经网络的实现。有关neuroph框架以及感知机的具体实现,将在下一章节做详细介绍。

转载请注明出处,感谢大家的支持!
本文来自优优码:http://www.uucode.net/201406/perceptron