鱼书_第二章_感知机
1.感知机
接收多个输入信号(x1,x2,......),输出一个信号(y),w是权重,“○”称为“神经元”神经元或者“节点”。
输入信号分别乘以固定的权重送入到神经元,神经元计算信号的总和,当超过设定的某个界限时,输出1,这也称为“神经元被激活”。其中,这个界限称为阈值,用θ表示。
感知机的中的每个输入信号都有其固有的权重,权重越大,对应的信号就越重要。
2.简单的逻辑电路
2.1 用感知机实现与门
当输入x1和x2都是1时,与门才输出1,其他情况都是输出0。那么根据感知机的公式,需要确定的w1、w2、θ的值,从而实现与门。
实际上,满足条件的(w1, w2, θ)有无数多个。比如,(w1, w2, θ) = (0.5, 0.5, 0.7)、(0.5, 0.5, 0.8)、(1.0, 1.0, 1.0)。
设定这样的参数后,当且仅当x1 = x2 = 1时,信号的加权总和才会超过给定的阈值θ。
与门的实现代码如下:
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 0
# (1, 0) -> 0
# (0, 1) -> 0
# (1, 1) -> 1
2.2 用感知机实现与非门
与非门跟与门恰恰相反,当输入x1 = x2 = 1时,输出为0,其他情况输出1。那么,把与门的参数值取反,作为与非门的参数即可。
与非门的实现代码如下:
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 1
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 0
2.3 用感知机实现或门
只要输入的x1、x2其中一个为1,或门输出即为1。
满足条件的(w1, w2, θ)同样有无数多个。比如,(w1, w2, θ) = (0.5, 0.5, 0.3)、(0.5, 0.5, 0.4)、(1.0, 1.0, 0.5)
或门的实现代码如下:
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 0
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 1
2.4 用感知机实现异或门
异或门的原理:仅当x1或x2中的一方为1时,才会输出1
然而异或门不能用前面的感知机来实现。为什么与门、或门,与非门都能实现,却无法实现异或门?画个图就知道了。其中○表示0,△表示1。
感知机会生成一个线性函数将或门的输出分成两个部分,一个部分是0,一个部分是1。然而,感知机生成的线性函数不能将异或门的输出分成两个部分,只能用非线性函数进行分割。而这正是感知机的局限:只能表示由一条直线分割的空间。
通过这个例子就引出单层感知机不能表示异或门,但是叠加了多层的感知机就能表示了。
异或门是一种多层结构的神经网络。将最左边的一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层。叠加了多层的感知机称为多层感知机。
该神经网络的运行步骤如下:
1.第0层的神经元接收输入信号,经过参数处理后,将信号输出给第1层神经元。
2.第1层的神经元将第0层的输出信号作为这一层的输入信号,经过参数处理后,将其输出给第2层的神经元。
3.第2层的神经元将第1层的输出信号作为这一层的输入信号,经过参数处理后,输出y。
异或门的实现代码如下:
from and_gate import AND
from or_gate import OR
from nand_gate import NAND
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 0
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 0
3.看完第二章要记住的一句话:
感知机通过叠加层可以表示非线性。