Neural Networks - 感知器

感知器(perception)是生物神经细胞的简单抽象,在百度上查一下“神经细胞”,得到如下图:

其中,树突用于获取外界信息刺激,细胞核用于对信息进行处理,轴突连接其他神经元,进行信息输出的传递(传递方向为单向传递),基于这个概念,抽象出感知器来模拟神经细胞的这个活动。

单层感知器是一种最简单的单层前向人工神经网络,所谓单层,即除输入层和输出层之外,仅包含一层权值可变的神经元节点,主要用于处理线性可分的二分类问题(两类模式线性可分,算法一定收敛),其基本结构如下:

x1, x2, x3代表输入层(也叫感知层),为3个神经元节点,负责引入外部信息,然后中间圆圈代表处理层,其具有信息处理能力,类似细胞核,工作过程就是一个感知器接收x1、x2、x3这三个二进制输入,并产生一个二进制输出。

考虑如下观点,五一快到了,你想去上海旅游,有3个考虑因素:

  1. 上海天气怎么样?
  2. 住宿地方是否出行便捷?
  3. 约好的朋友是否有空陪同去?

这三个因素对应x1, x2, x3,去上海对应output,是否要去取一个阈值5吧,然后把3个因素分别分配一个权重(权重表示相应输入对于输出重要性的实数):3, 4, 3,也就是说,住宿的地方是否出行便捷对于最终是否去上海影响更大,然后每个因素乘以对应权重(假设天气不好:0,出行便捷:1,不陪同0),得到结果为: 0*3 + 1*4 * 0*3 = 4 < 5,结果就是不去,类似可调整数值,而阈值代表了你想要去上海旅游的欲望,_值越小代表越愿意去_,因此,单层感知器可如下描述:

看到这个表达式,是不是感觉类似符号函数?其实,可以将感知器看作依据权重来做出决定的设备。

令输出为y, 阈值为b(-threshold),输入对应x,权重对应w,则:
y = w1*x1 + w2*x2 + w3*x3 + b

这就是一条直线了,对于二维平面,感知器就对应一条直线,这样在平面上的数据就被这条直线分类了,大部分情况,是收敛的,特殊情况下,数据集会存在不收敛,这样就要调整数据集了。

下面用MatLab新建一个感知器来测试一下:

A. 样本数据准备:

(天气好1,不好0; 出行便捷1,不便捷0; 陪同1,不陪同0; 出行1,不出行0; 天气权重3, 便捷权重4, 陪同3,阈值5)

这些输入表示为一个有3个元素的输入向量,输入元素的取值范围为[0 1]:

B. 创建感知器(设计为单层,单神经元的神经网络):

newp函数用于生成一个感知器神经网络

C. 定义输入9*3样本向量:

把上面样本数据定义为一个向量:

D. 定义目标向量:

E. 训练单层感知器神经网络

train函数用于训练创建好的感知器网络

输入训练后,弹出结果如右边窗口所示,看到感知器经过4次训练,使输出达到目标值,点击”Performance”,可以查看训练误差曲线:

F.测试我们的感知器:

准备数据,分别对应上面样本数据的去与不去, 然后开始测试仿真:

可以得到结果就是1->去, 0->不去,可见设计的感知器达到目标需求。

小结一下,单层感知器的几个缺陷:

  1. 感知器的激活函数使用阈值函数,使得输出只能取两个值(1/-1或0/1),这限制了在分类种类上的扩展
  2. 感知器网络只对线性可分的问题收敛,如果问题不可分,感知器无法解决
  3. 感知器的学习算法只对单层有效,多层时无法直接套用规则
  4. 当输入样本存在奇异样本(样本数据部分值突然增大),感知器网络运算需要花费很长时间

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 linjk121@163.com.