1.感知机概述:
感知机(perceptron)算法可以说是深度学习神经网络的起源算法,是由美国学者Frank Rosenblatt在1957年提出的。
感知机接受多个输入信号,输出一个信号,不过感知机的信号只有“不传递信号/传递信号(0/1)”这两种取值。
下面就是一个简单的接受两个输入信号的感知机的例子:
其中:
- ○是神经元或者节点;
- x1、x2是输入信号;
- y是输出信号;
- w1、w2是weight,也就是权重。
输入信号被送往神经元时,会被分别乘以固定的权重,下一层的神经元会计算传递过去的信号的总和,只有当这个总和的值超过某个阈值(θ)时,才会输出1。
用数学公式来表达如下:
因为感知机的每个输入信号都有其各自的权重,同时输出与否是根据信号和的大小决定的,因此这些信号对应的权重控制着每个信号的重要性。权重越大,对应信号的重要性或也就越高。
这里我们把公式中的θ
换成-b
,那么上面的数学公式也就变成了下面这样:
这个式子就是之后神经网络向前传递信号的公式,其中:
- b叫做bias,也就是偏置;
- w依然是weight,权重。
- 这里需要注意的是两个参数的作用不一样,权重是控制信号重要性的参数,而偏置是调整神经元被激活的程度(输出1)的参数。
2.感知机(perceptron)的实现:
只要挑选合适的参数就可以很容易的实现与门、与非门、或门这三种逻辑电路。
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([0.5,0.5]) # 仅参数不同
b = -0.2 # 仅参数不同
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
3.感知机的局限和多层感知器:
感知机的局限性在于它只能表示由一条直线分割的空间,即只能表示线性空间,而不能表示非线性空间,因此上面介绍的单层感知机这里就不能实现异或门这种逻辑电路。
不过感知器的绝妙之处在于,可以通过叠加感知机的方法来实现多层感知器(multi-layered perceptron),从而实现一些更加灵活的表现。
这里我们利用之前定位的与门、与非门、或门函数来实现异或门。
# 异或门、
def XOR(x1, x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
print(XOR(1,0))
print(XOR(1,1))
输出结果为:
1
0
通过上述介绍可以看住感知器通过叠加层能够表示非线性空间,理论上还可以表示计算机进行的处理。
Reference:
《Deep Learning from Scratch》