初学,若有错误,恳请指正!
目录
2.1 感知机是什么
刚读完我不是很理解,只知道感知机可以将多个输入信号转为一个输出信号。所以我就去看了一下其他人的解释,说是可以理解为一个线性二分类器,再没看下面的内容的情况下,就暂且记住这个结论吧。
圈被称为神经元或节点,x1,x2为输入信号(为1/0),w1,w2为权重(可以直接理解为信号的重要性),y为输出信号(为1/0)。
感知机的运行过程:将信号传入神经元,神经元接受之后,分别乘以各自的权重,然后求和,得出输出信号。
怎么知道输出信号是1还是0呢,这里就要提到一个值,阈值θ。当信号乘以其权重大于这个值的时候,输出为1,否则输出为0。
下面即为表达式:
2.2 简单逻辑电路和感知机的实现
数字电路中我们学过简单的逻辑电路,也就是与或非几个门,他们的共同点在于,输入为多个值,输出为一个值。这就跟感知机的作用相同,下面使用输入为2个值,输出为1个值来进行说明。
2.2.1 与门及简单实现
与门就是逻辑AND,“有0为0,全1才1”,由这个也可以得出其真值表:
按照这个真值表,以及上面的感知机表达式,可以进行一个编程。但是在编程前,我们就得考虑权重和阈值。对于感知机来说,这几个值是需要我们自己设定的。
设定的时候依旧是根据真值表和表达式,权重和阈值需要满足整个真值表,通过计算,可以随机取一个例子,比如:w1=0.5,w2=0.5,θ=0.7。按这个权重和阈值进行编程:
def AND(x1,x2):
w1,w2,theta = 0.5,0.5,0.7
tmp = w1 * x1 + w2 * x2
if tmp > theta:
return 1 #这里使用返回值,而不是直接输出,因为可能存在其他函数的调用
else:
return 0
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
输出结果如下:
2.2.2 与非门和或门、导入权重和偏置及其实现
与非门就是给与门求反,可以直接给与门的结果求反;或门可以记忆为“有1为1,全0为0”。
不论是什么门,输入和输出的结构是一样的,唯一不同点就在于权重和阈值。所以如果直接编程,只需要修改与门的权重和阈值即可。
但是,这里不直接这么说了,按照标准的说法来说。
将所有的参数移到一边,另一边留下0,那么在判断的时候直接判断是大于0还是小于等于0即可。将参数移到一边,权重这边就多了个-θ,这里用b来表示,称为偏置。
得到的表达式如下:
w1,w2统称为权重w,x1,x2统称为信号x。那么我们怎么样用一个参数表示两个数呢,就需要用到我们前面学习的数组,所以引入模块numpy进行编程。
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 1
else:
return 0
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 1
else:
return 0
def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.4
tmp = np.sum(w*x) + b
if tmp > 0:
return 1
else:
return 0
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
print("\n")
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
print("\n")
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
为什么有偏置b这个说法,理解的时候可以将有参数的一边看成一个函数,即y=w*x+b,若没有b那么这个函数图像是通过原点的,但是我们的数据并没有标准到都可以使用通过原点的直线进行分割(前面我们说的感知机可以使用直线将数据分为两类),那么这时候就需要修改截距(也就是我们这里的偏置)以灵活的分割数据。
我们前面说权重是代表信号的重要程度,偏置则代表神经元被激活容易程度(偏置太大,我们就得设较大的权重使得总和大于偏置才能输出1)。
2.4 感知机的局限性
根据感知机的表达式,我们可以得到y=w*x+b这个函数,这个函数的图像是一条直线,例如:
但是有的区域分割,通过一条直线是无法直接分割为两部分的,比如下面的这个异或门。
2.4.1 异或门
异或门的图像如下:
可以看到上述的 无法用直线分为两部分。这就是单层感知机的局限性。感知机的局限性就在于它只能表示由一条直线分割的空间。
2.4.2 线性和非线性
曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。
2.5 多层感知机
异或门无法直接表示,但是我们可以使用现有的简单逻辑电路进行组合,这就跟多层感知机的原理一样。
2.5.1 已有门电路的组合
2.5.2 异或门的实现
根据上面的组合,我们可以直接调用我们上述的简单逻辑电路函数,所以根据下面的真值表进行调用:
得到的代码如下:
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 1
else:
return 0
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 1
else:
return 0
def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.4
tmp = np.sum(w*x) + b
if tmp > 0:
return 1
else:
return 0
def XOR(x1,x2):
y1 = NAND(x1,x2)
y2 = OR(x1,x2)
y = AND(y1,y2)
return y
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
print("\n")
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
print("\n")
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
print("\n")
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
然后输出结果:
异或门的实现就可以理解为多层感知机的实现,通过叠加单层感知机来实现多层感知机。
2.6 从与非门到计算机
感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理。
2.7 小结
ok,今天暂且这样,明天学习神经网络。