chapter2 感知机
2.1 感知机概述
感知机接收多个输入信号,输出一个信号。x1、x2是输入信号,y是输出信号,w1、w2是权重(w是weight的首字母)。○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重. 严格地讲,本章中所说的感知机应该称为“人工神经元”或“朴素感知机”,但是因为很多基本的处理都是共通的,所以这里就简单地称为“感知机”。(w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号θ表示。
2.2 感知机的实现
公式如下(2.1):
可以由这条公式实现与门的功能
# 代码实现 , 与门功能
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
res = w1 * x1 + w2 * x2
if res > theta:
return 1
else:
return 0
print(AND(1, 1))
print(AND(1, 0))
我们将其修改为另外一种实现形式。在此之前,首先把式(2.1)的θ换成−b,于
是就可以用式(2.2)来表示感知机的行为。
公式(2.2):
式(2.1)和式(2.2)虽然有一个符号不同,但表达的内容是完全相同的。
此处,b称为偏置,w1和w2称为权重。如式(2.2)所示,感知机会计算输入
信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0.
用权重和偏置实现门运算:
import numpy as np
# 使用numpy的矩阵简化运算
# 与门
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]) # 仅权重和偏置与AND不同!
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]) # 仅权重和偏置与AND不同!
b = -0.2
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
2.3 感知机的局限性
2.3.1 能否使用之前的逻辑实现异或门,为什么呢?
答: 不能, 因为无法用一条直线分开 △ 还有 ○ , 但是不使用一条直线 这个前提的话就可以. 于是我们就曲线分割而成的空间称为非线性空间,由直线 分割而成的空间称为线性空间。
2.3.2 多层感知机
使用之前的逻辑无法实现异或门, 但是通过组合之前的函数AND ,OR ,NAND 就可以实现异或.
# 通过AND(NAND(x1,x2), OR(x1,x2)) 实现异或
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
所示的感知机与前面介绍的与门、或门的感知机(图2-1)形状不同。实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron).这可以解释为“单层感知机无法表示的东西,通过增加一层就可以解决”。也就是说,通过叠加层(加深层),感知机能进行更加灵活的表示。
2.4 本章所学内容
• 感知机是具有输入和输出的算法。给定一个输入后,将输出一个既
定的值。
• 感知机将权重和偏置设定为参数。
• 使用感知机可以表示与门和或门等逻辑电路。
• 异或门无法通过单层感知机来表示。
• 使用2层感知机可以表示异或门。
• 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
• 多层感知机(在理论上)可以表示计算机