【深度学习初探】Day03 - 感知机(Perceptron)
文章目录
感知机(Perceptron)这一算法是神经网络(深度学习)的起源算法,我们学习感知机的构造,以了解通向神经网络和深度学习的一种重要思想。
1.1 感知机是什么
感知机接收多个输入信号,输出一个信号。感知机的信号只有两种取值:1/0。1代表“传递信号”,0代表“不传递信号”。
下图是一个感知机,接收两个输入信号x1,x2,输出信号y,w1和w2是权重(Weight)。图中的⚪称为“神经元”或“节点”。输入信号进入神经元,会分别乘以固定的权重(即 w1 · x1 、 w2 · x2)。神经元会计算传来的信号总和,只有当这个总和超过某个界限值,才会输出1。这也被称为“神经元被激活”。这个界限值我们称为阈值,用符号θ表示。
感知机的原理可以用下面的数学表达式来表示:
感知机的多个输入信号都有各自固有的权重,权重越大,对应该权重的信号的重要性就越高。
1.2 简单逻辑电路
1.2.1 与门
在一个逻辑电路中,与门(AND gate)是有两个输入和一个输出的门电路。给定一个“真值表”,如下表,与门仅在两个输入均为1时输出1,其他时候均输出0。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
如果用感知机表示与门,那么如何设定w1、w2、θ的值?
已知输入x1、x2只可能取0或1。那么w1和w2可以有多种取值。(0.5 0.5, 0.8)可以,(1.0,1.0,1.0)也可以。总之仅当x1和x2同时为1时,信号的加权总和才会超过给定的阈值θ。(w1 * x1 + w2 * x2 > θ)
1.2.2 与非门和或门
与非门(NAND gate)是Not AND的意思,意思是仅当x1、x2同时为0时,才输出为1,真值表与与门的刚好相反。
x1 | x2 | y |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
表示与非门,可以取负值,比如:(w1,w2,θ) = (-0.5,-0.5,-0.7)这样的组合。
或门(OR gate)是“只要有一个输入信号是1,输出就为1”。真值表如下:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
这个时候我们可以取(w1,w2,θ) = (1.0,1.0,0.5)这样的组合。
经过上面的研究,我们可以看到这些逻辑门和感知机构造是一样的。相同构造的感知机,只需要适当调整参数值,就可以“扮演”不同的角色。在机器学习中,学习就是确定合适参数的过程,这个工作由计算机自动进行,人要做的是思考感知机的构造(模型),并把训练数据交给计算机。
1.3 感知机的实现
1.3.1 使用Python实现逻辑门电路
def AND(x1, x2):
w1, w2, theta = 0.5,0.5,0.7
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
定义一个AND函数,传入参数x1、x2作为输入信号,设置w1、w2、θ为我们刚才选好的与门的参数0.5、0.5、0.7。当满足条件时,返回1。然后进行测试。
输出:
0
0
0
1
1.3.2 引入权重和偏置
刚才的与门实现比较直接、容易理解,但是为了考虑后续学习,我们将其修改为另一种实现形式,首先我们把感知机的公式改成如下形式:
实际上,我们是把 θ 换成了 -b ,然后移到了不等号左侧。此公式和上一个出现的公式虽然有一个符号不同,但表达的内容完全相同。
此处,我们把 b 称为偏置,w1和w2称为权重。根据上式,感知机计算输入信号和权重的乘积的和,然后加上偏置,如果这个值大于0则输出1,否则输出0。下面我们使用之前介绍的NumPy来实现这个感知机。
import numpy as np
x = np.array([0, 1]) # 输入信号
w = np.array([0.5, 0.5]) # 权重
b = -0.7 # 偏置
y = np.sum(w*x) + b # 计算输出信号:y = w1*x1 + w2*x2 + b
print(y)
输出:
-0.19999999999999996
如上例所示,在NumPy数组乘法运算中,若两个数组元素个数相同,就会将各个元素分别相乘,返回一个新的同形状数组,因此:wx 可以得到 00.5 和 1*0.5。之后,sum函数计算相乘后各个元素的总和,最后把偏置加到加权总和上,就完成了与门的计算。根据感知机公式,得到结果 y ≤ 0,因此输出 0 。
1.3.3 使用权重和偏置的实现
使用权重和偏置,可以像下面这样实现与门。
def AND(x1, x2):
x = np.array([x1, x2])
y = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
在这里, b就是偏置,偏置和权重的作用是不一样的。权重 w1 和 w2 是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(也就是输出信号是1的程度)的参数。偏置的值决定了神经容易被激活的程度,在没有任何输入时(x1、x2都是0),无论 b 给多高,输出的只有偏置本身的值,而偏置本身在与门中是 ≤ 0 的,因此一定不会输出信号1。
在与门基础上,我们只需要修改权重和偏置的值,就能实现与非门和或门。
def NAND(x1, x2):
x = np.array([x1, x2])
y = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
y = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
1.4 感知机的局限性
使用感知机可以简单地实现与门、与非门、或门三种逻辑电路。那么异或门(XOR gate)又该如何实现呢?
1.4.1 异或门
异或门也被称为逻辑异或电路。仅当x1或x2中的一方为1时,才会输出1。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
你会发现,这个异或门,无论你如何设置权重参数都无法实现。我们可以用画图来帮助理解。在或门情况下,权重参数(b,w1,w2) = (-0.5,1.0,1.0)时,可以满足或门的真值表条件。此时感知机可用如下公式表示,然后绘出由直线 -0.5 + x1 + x2 = 0 分割开的两个空间,其中,左下角的空间输出0,右上角的空间输出1。
图中的⚪,表示输出0,🔺表示输出1。如果想制作或门,图中的直线可以将三角和圆圈分隔开,实际上这就已经实现了。但是异或门的三角和圆圈排布是这样的:
无论如何都无法用一条直线,把🔺和⚪分隔开。这就涉及到线性和非线性问题。
1.4.2 线性和非线性
上图中的⚪和🔺无法用一条直线分开,但是可以用“曲线”分开。
感知机的局限性在于它只能表示一条直线分割的空间,这样的曲线分割而成的非线性空间,感知机就无能为力了。但是,一个感知机不行,我们可以利用多台感知机。
1.5 多层感知机
一语以蔽之,感知机的“叠加层”可以实现异或门。
1.5.1 已有门电路的组合
异或门的制作,本身就可以利用我们已经做好的门来组装。我们回顾下逻辑门的符号。(⭕表示反转输出)
通过以下组合,可以实现异或门。
其真值表如下:
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
1.5.2 异或门的Python实现
利用之前写好的三种门的函数,可以轻松实现异或门。
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
1.5.3 异或门的感知机实现
异或门是一种多层结构神经网络。
在此,我们将叠加了多层的感知机称为多层感知机(multi-layered perceptron)。如上感知机由三层构成,第0层两个神经元接收输入信号,并将信号发送至第一层的神经元,第1层把信号发送到第2层,第2层的神经元输出y。这就是多层感知机。
1.6 与非门与感知机与计算机
借助上面的启发,我们意识到,多层感知机可以实现比之前见到的电路更复杂的电路。但我们一定还没想到,计算机本身就是通过与非门的组合,实现复杂的处理。这也说明,使用感知机也可以表示计算机,通过组合感知机的叠加,可以表示计算机。
感知机是一种非常简单的算法,它是神经网络的基础。