深度学习预热——感知机

小鸡
阅读978 喜欢6 算法 更新2019-5-20

感知机是由美国学者Frank Rosenblatt在1957年提出来的。为何我们现在还要学习这一很久以前就有 的算法呢?因为感知机也是作为神经网络(深度学习)的起源的算法。因此, 学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想

什么是感知机

权重感知机接收输入信息,输出一个信号(0或1)。例如
X1,X2是输入信号,y是输出信号,w1,w2是权重,图中的圆圈被称为神经元或者节点。输入信号被送往神经元,会被分别乘以固定的权重(w1x1,w2x2)神经元会计算送过来的信号的总和,只有当这个总和超过了某个界限值,才会输出1。这也称为“神经元被激活”这里将这个界限值称为阙值


这便是感知机的原理(有点像逻辑回归),用数学表达式表示就是

用感知机来解决简单的的问题

与门电路

这里首先以逻辑电路为题 材来思考一下与门(AND gate)。与门是有两个输入和一个输出的门电路。图2-2 这种输入信号和输出信号的对应表称为“真值表”。如图2-2所示,与门仅在 两个输入均为1时输出1,其他时候则输出0。


下面考虑用感知机来表示这个与门。需要做的就是确定能满足图2-2的 真值表的w1、w2、θ的值。那么,设定什么样的值才能制作出满足图2-2的 条件的感知机呢?

比如,当
(w1,w 2, θ) = (0.5, 0.5, 0.7)时,可以满足图2-2的条件。此外,当(w1,w 2,θ) 为(0.5,0.5, 0.8)或者(1.0, 1.0, 1.0)时,同样也满足与门的条件。设定这样的 参数后,仅当x1和x2同时为1时,信号的加权总和才会超过给定的阈值θ

与非门和或门

接着考虑与非门和或门,同样的道理,与非门真值表如下


要表示与非门,可以用(w1,w 2, θ) = (−0.5,−0.5,−0.7)这样的组合

哎,或门就不讲了

这里决定感知机参数的并不是计算机,而是我们人。我们看着真值 表这种“训练数据”,人工考虑(想到)了参数的值。而机器学习的课 题就是将这个决定参数值的工作交由计算机自动进行。学习是确定 合适的参数的过程,而人要做的是思考感知机的构造(模型),并把 训练数据交给计算机。

感知机的实现

现在我们用python实现一个与门电路的的函数

def And(x1, x2):
w1, w2, theta = 0.5, 0.5, 1
if w1*x1 + w2*x2 >= theta:
return 1
else:
return 0
print(And(0, 1))
print(And(1, 0))
print(And(0, 0))
print(And(1, 1))

输出
0
0
0
1

导入权重和偏置

将θ换成−b,或者说将θ移到和w1x1+w2x2一起,这样方程就改写为


虽然有和之前的方程一个符号不同,但表达的内容是完全相同的。 此处,b称为偏置,w1和w2称为权重。如式方程所示,感知机会计算输入 信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0。 下面,我们使用NumPy,按上方程的方式实现感知机。

import numpy as np
def And(x):
w = np.array([0.5, 0.5]) #权重值矩阵
b = -1 #偏置
tmp = np.sum(w*x) + b
if tmp >= 0:
return 1
else:
return 0
print(And(np.array([0, 0])))
print(And(np.array([1, 0])))
print(And(np.array([0, 1])))
print(And(np.array([1, 1])))

感知机的局限性

异或门也被称为逻辑异或电路。如图所示,仅当x1或x2中的一方为 1时,才会输出1(“异或”是拒绝其他的意思)。那么,要用感知机实现这个 异或门的话,应该设定什么样的权重参数呢


然而上面介绍的感知机实际上无法实现这个异或门,为什么呢?

假设权重参数(n, w1, w2)= (-0.5, 1, 1 )时,感知机的表示方程如下


它表示的感知机会生成由直线−0.5 + x1 + x2 = 0分割开的两个空 间。其中一个空间输出1,另一个空间输出0,如图2-6所示


这里便有了支持向量机(svm)的概念
在一个n维空间中找到一个n-1维的超平面,将两种不同属性的点分隔开

上图中想要用一条直线将图2-7中的○和△分开,无论如何都做不到。事实上, 用一条直线是无法将○和△分开的。

但是如果将“直线”这个限制条 件去掉,就可以实现了。比如,我们可以像图2-8那样,作出分开○和△的空间


感知机的局限性就在于它只能表示由一条直线分割的空间。上图这样弯 曲的曲线无法用感知机表示。另外,由上图这样的曲线分割而成的空间称为 非线性空间,由直线分割而成的空间称为线性空间。线性、非线性这两个术 语在机器学习领域很常见,可以将其想象成图2-6和图2-8所示的直线和曲线。

多层感知机

虽然上面说到感知机不能表示异或门,实际上,感知机的绝妙之处在于它可以“叠加层”

通过门电路的组合实现异或门

异或门可以通过与门,与非门,或门组合来实现,这样的话我们就可以通过不同的感知机进行组合来达到目标

那么该如何对门电路进行组合呢


上面讲局限性讲到的感知机的局限性,严格地讲,应该是“单层感知机无法 表示异或门”或者“单层感知机无法分离非线性空间”。接下来,我 们将看到通过组合感知机(叠加层)就可以实现异或门。


观察x1、x2、y,可以发现确实符合异或门的输出


现在我们可以使用之前的python代码来实现异或门的感知机

def XOR(x):
s1 = NAnd(x)
s2 = OR(x)
s = np.array([s1, s2])
y = And(s)
return y

print(XOR(np.array([0, 0])))
print(XOR(np.array([1, 0])))
print(XOR(np.array([0, 1])))
print(XOR(np.array([1, 1])))

输出
0
1
1
0

可以看出,异或门时多了一层结构的感知机
实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多 层的感知机也称为多层感知机(multi-layered perceptron)。


(图2.13)

图2-13中的感知机总共由3层构成,但是因为拥有权重的层实质 上只有2层(第0层和第1层之间,第1层和第2层之间),所以称 为“2层感知机”。不过,有的文献认为图2-13的感知机是由3层 构成的,因而将其称为“3层感知机”

  • 第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。
  • 第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出y

这可以解释为“单层感知机 无法表示的东西,通过增加一层就可以解决”。也就是说,通过叠加层(加深 层),感知机能进行更加灵活的表示

更复杂的感知机

多层感知机可以实现比之前更复杂的电路,比如加法器,二进制转十进制的编码器,某些满足条件就输出1的电路。

其实计算机的内部处理往简单了讲就是通过与非门等基本逻辑电路的组合

本章所学的内容

  1. 感知机是具有输入和输出的算法。给定一个输入后,将输出一个既 定的值。
  2. 感知机将权重和偏置设定为参数。
  3. 使用感知机可以表示与门和或门等逻辑电路。
  4. 异或门无法通过单层感知机来表示。
  5. 使用2层感知机可以表示异或门。
  6. 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
  7. 多层感知机(在理论上)可以表示计算机。

:本文为斋藤康毅的《深度学习入门:基于Python的理论与实现》片段摘抄与学习笔记