- 感知机是作为神经网络(深度学习)的起源算法,学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。
- 本章中所说的感知机应该被称为“人工神经元”或者“朴素感知机”。
- 感知机接受多个输入信号,输出一个信号。如图2-1是一个接受两个输入信号的感知机的例子。
- 其中x1、x2是输入信号,y是输出信号,w1、w2是权重。图中的O称为“神经元”或者“节点”。
- 输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2)。
- 神经元会计算传送过来的信息的总和,只有当这个总和超过某个界限值时,才会输出1。也称为这个“神经元被激活”。这个界限值被称为阈值,用符号 θ表示。
以上就是感知机的运行原理,可以将感知机的运行原理用数学公式表示出来,即为式(2.1):
当然我们可以将其修改为另外一种实现形式。在此之前,首先把式(2.1)的θ换成−b,于是就可以用式(2.2)来表示感知机的行为。
-
此处,b称为偏置,w1和w2称为权重。
-
感知机的多个输入信号都有各自固定的权重,而权重用来表示对应输入信号的重要性,即权重越大的输入信号越重要。
- 与门是有两个输入和一个输出的门电路
- 与门只有当两个输入均为1是才输出1,其他任何时候均输出0
- 如图2-2所示为与门对应的真值表
根据之前对感知机运行原理的介绍,很容易想到用感知机来表示这个与门,我们所需要确定的仅是能够满足图2-2真值表的w1、w2和θ的值。
- 实际上,满足图2-2真值表的w1、w2和θ的值有无数多个,例如(w1,w2,b)= (0.5, 0.5, -0.7),(1.0, 1.0 , -1.5)等
下面我们用Python来实现与门
import numpy as np
def AND2(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print(AND(0, 0)) #0
print(AND(0, 1)) #0
print(AND(1, 0)) #0
print(AND(1, 1)) #1
2.2.2 与非门(NAND gate)
- 与非门(NAND gate),NAND是Not AND的意思,与非门就是颠倒了与门的输出。
- 仅当x1和x2同时为1时输出0,其他时候则输出1。
- 用真值表表示的话,如图2-3所示:
若是用感知机来表示与非门的话,只需要将表示与门的参数全部取反即可。例如(w1, w2, b) = (−0.5, −0.5, 0.7)这样的组合。
下面我们用Python来实现与非门
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print(NAND(0, 0)) #1
print(NAND(0, 1)) #1
print(NAND(1, 0)) #1
print(NAND(1, 1)) #0
2.2.3或门 (OR gate)
- 或门(OR)是“只要有一个输入信号是1,输出就为1”的逻辑电路。
- 用真值表表示的话,如图2-4所示:
若是用感知机来表示或门的话,可以去以下的参数组合:(w1, w2, b) = (1, 1, -0.5)
下面我们用Python来实现与非门
import numpy as np
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
b = -0.5
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print(OR(0, 0)) #0
print(OR(0, 1)) #1
print(OR(1, 0)) #1
print(OR(1, 1)) #1
2.3感知机的局限性
我们已知感知机可以实现与门、与非门、或门三种逻辑电路。但是感知机不能实现异或门(XOR gate)。
2.3.1 异或门(XOR gate)- 异或门也被称为逻辑异或电路。仅当x1或x2中的一方为1时,才会输出1(“异或”是拒绝其他的意思)
- 用真值表如图2-5所示
根据之前的感知机的数学形式(式2-2),可知单层感知机会生成一条直线来分割空间,这条直线可以很好的分割或门,如图2-6
那么,换成异或门的话会如何呢?能否像或门那样,用一条直线作出分割图2-7中的○和△的空间呢?
事实上,用一条直线是无法将○和△分开的。
感知机的局限性就在于它只能表示由一条直线分割的空间
但是,使用一条曲线,可以分割异或门
感知机的绝妙之处在于它可以“叠加层”(通过叠加层来表示异或门是本节的要点)
2.4.1已有门路的组合- 异或门的制作方法有很多,其中之一就是组合我们前面做好的与门、与
非门、或门进行配置。
为此与门、与非门、或门用图2-9中的符号表示
- 与非门前端的○表示反转输出的意思
异或门可以通过图2-11所示的配置来实现。这里,x1和x2表示输入信号,
y表示输出信号。x1和x2是与非门和或门的输入,而与非门和或门的输出则
是与门的输入。
观察x1、x2、y,可以发现确实符合异或门的输出
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
def NAND(x1, x2):
x = np.array([x1, x2])
w = 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])
w = np.array([1, 1])
b = -0.5
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
#通过组合与门、与非门和或门来实现异或门
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
if y <= 0:
return 0
else:
return 1
print(XOR(0,0)) #0
print(XOR(1,0)) #1
print(XOR(0,1)) #1
print(XOR(1,1)) #0
这样,异或门的实现就完成了。下面我们试着用感知机的表示方法(明
确地显示神经元)来表示这个异或门,结果如图2-13所示。
- 图2-13所示的感知机与前面介绍的与门、或门的感知机(图2-1)形状不同。实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。
- 感知机是具有输入和输出的算法。给定一个输入后,将输出一个既定的值。
- 感知机将权重和偏置设定为参数。
- 使用感知机可以表示与门和或门等逻辑电路。
- 异或门无法通过单层感知机来表示。
- 使用2层感知机可以表示异或门。
- 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。



