第二章——感知机
-
感知机是什么
感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。在本书中,0对应“不传递信号”,1对应“传递信号”。
比如某个感知机由输入信号x1、x2和输出信号y组成,x1的权重是w1,x2的权重是w2。x1、x2、y都是一个“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(x1w1,x2w2)。神经元会计算传过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1.这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号θ表示。
感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
-
感知机的实现
(1)简单的实现
import numpy as np # 与门 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(1, 0)) print(AND(0, 1)) print(AND(1, 1)) # 使用numpy来实现 # 与门 def AND2(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) b = -0.7 tmp = np.sum(x * w) + 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(x * w) + 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(x * w) + b if tmp <= 0: return 0 else: return 1
这里把-θ命名为偏置b,但偏置和权重的作用是不一样的。具体的说,权重是控制输入信号重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。有时候,根据上下文语义,也会将b、w1、w2这些参数统称为权重。
与门、与非门、或门是具有相同构造的感知机,区别只在于权重参数的值。
-
感知机的局限性
(1)异或门,也被称为逻辑异或电路,仅当x1或x2中的一方为1时,才会输出1(“异或”是拒绝其他的意思)。
用前面介绍的感知机是无法实现异或门的,因为感知机的局限性就在于它只能表示由一条直线分割的空间,而不能表示由曲线分割的空间。由曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。
-
多层感知机
虽然单层感知机不能表示异或门,但感知机可以“叠加层”。
异或门可以通过与门、与非门、或门的组合来实现:
# 或门 def OR(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) b = -0.2 tmp = np.sum(x * w) + b if tmp <= 0: return 0 else: return 1
异或门是一种多层结构的神经网络。与门、与非门、或门是单层感知机,异或门是2层感知机(因为有权重的层实质上只有2层)。叠加了多层的感知机称为多层感知机。通过叠加层(加深层),感知机能进行更加灵活的表示。多层感知机在理论上可以表示计算机。