深度学习系列(一):《深度学习入门》学习笔记(2): 感知机

2019/8/12 21:44 下午 posted in  随记 comments

最近学习吴恩达《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层感知机的具体步骤:

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

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