最近学习吴恩达《Machine Learning》课程以及《深度学习入门:基于Python的理论与实现》书,一些东西总结了下。现就后者学习进行笔记总结。本文是本书的学习笔记(二)感知机。
感知机是作为神经网络(深度学习)的起源的算法。
感知机接收多个输入信号,输出一个信号。感知机的信号只有0/1两种取值。在本书,0代表“不传递信号”,1代表“传递信号”。
感知机的数学表达式:
\[y=\begin{cases} 0&(w_1x_1+w_2x_2\leq\theta) \\ 1&(w_1x_1+w_2x_2>\theta) \end{cases} \]感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
感知机的实现
# 与门
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
temp = x1*w1 + x2*w2
if temp <= theta:
return 0
elif temp > theta:
return 1
AND(0, 0)
0
AND(1,0)
0
AND(0,1)
0
AND(1,1)
1
导入权重和偏置
# NumPy实现感知机与权重与偏置
import numpy as np
x = np.array([0, 1])#输入
w = np.array([0.5, 0.5])#权重
b = -0.7#偏置
w*x
array([0. , 0.5])
np.sum(w*x)
0.5
np.sum(w*x)+b#大约为-0.2,由于浮点数小数造成运算误差
-0.19999999999999996
# 使用权重和偏置实现与门
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
# 实现与非门
def NAND2(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 OR2(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
感知机的局限
感知机无法实现逻辑异或门。感知机的局限性就在于它只能表示由一条直线分割的空间,即只能分割线性空间。
多层感知机
感知机可以“叠加层”。
# 异或门的实现
def XOR2(x1, x2):
s1 = NAND2(x1, x2)
s2 = OR2(x1, x2)
y = AND2(s1, s2)
return y
XOR2(0, 0)
0
XOR2(1, 0)
1
XOR2(0, 1)
1
XOR2(1,1)
0
异或门是一种多层结构的神经网络。与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机。
异或门感知机总共由3层构成,但是因为拥有权重的层实质上只有2层(第0层和第1层之间,第1层和第2层之间),所以称为“2层感知机”。不过,有的文献认为异或门感知机是由3层构成的,因此称其为“3层感知机”。
异或门2层感知机的具体步骤:
- 第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。
- 第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出\(y\)。
通过这样的结构,感知机得以实现异或门。这也可以解释为“单层感知机无法表达的东西,通过增加一层就可以解决”。也就是说,通过叠加层(加深层),感知机能进行更加灵活的表示。