page25 继续往下,
2.3 感知机的实现
2.3.1 简单地实现:
我们用python 来实现刚才的逻辑的电路。这里先定义一个接受参数x1 和 x2的AND 函数。
AND逻辑
def OR(x1,x2):
w1,w2,theta = 1.5,1.5,1
tmp = x1*w1 + x2*w2
if tmp<= theta:
return 0
elif tmp>theta:
return 1
print(OR(0,0))
print(OR(1,0))
print(OR(0,1))
print(OR(1,1))
OR逻辑
2.3.2 导入权重和偏值
我们把式2.1 的θ换成-b,用式 2.2来表示感知机的行为。
式2.1
式2.2
此处,b 称为偏置,w1 和 w2称为权重。
如上图:式2.2 所示,感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0,下面使用Numpy,按照式2.2 来实现感知机。
如上例所示,在NumPy数组的乘法运算中,当数组的元素个数相同时,各个元素分别相乘,因此wx的结果就是他们的各个元素分别相乘([0,1] *[0.5,0.5]==>[0,0.5]),之后np.sum(w*x)再计算相乘后各个元素的总和,完成了式2.2的计算。
2.3.3 使用权重和偏置的实现
import numpy as np
def OR(x1,x2):
w1,w2,b = 1.5,1.5,-1
W = np.array([w1,w2])
X = np.array([x1,x2])
sum = np.sum(W*X) + b
if sum>0:
return 1
elif sum<0:
return 0
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
OR 的代码实现
可以看到实现了OR的代码。
我们把-θ 命名为偏置b,但是请注意,偏置和权重w1,w2的作用是不一致的。具体地说,w1和w2 是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度的参数。
如果b为-0.1 则只要输入信号加权综合必须超过20.0,神经元才会被激活。而如果b为-20,则输入信号的加权综合必须超过20.0, 神经元才被激活。我们将w1和w2称为权重,将b称为偏置,但是根据上下文,有时会将b,w1,w2这些参数统称为权重。
2.4 感知机的局限性
使用感知机可以实现与门、与非门、或门三种逻辑电路。
公式2.1
现在我们考虑下异或门:
异或门的真值表
把上面的公式带入,怎么设定w1, w2,θ 才能满足上图呢?
代公式应该可以算出来:
w1 * x1 + w2 * x2 <= θ
w1 * x1 + w2 * x2 > θ
带入上图的x1, x2 , y(θ) 可以得到:
这样 导出结论是:
第2,第3 和 第4 明显是结论冲突的。
书里面用了另外一个画图的思路:
先看或门的逻辑,或门的逻辑如下图2.3:
或门逻辑2.3
如果用二元一次方程来表示,其实就是一条直线。
二元一次方程就是直线,参考 https://web.ntnu.edu.tw/~498403294/teach/s.htm
-0.5+x1+x2=0 直线分割了平面
这里看到-0.5+x1+x2=0 直线 分割了整个平面,直线下半部分平面的阴影其实就是y=0 的情况,上半部分是1的情况。
或门的场景,如果把(x1,x2) 作为上图的坐标, 就是要求(0,0) 坐标在下面,其它(0,1),(1,0),(1,1)等输入场景下,数值都是>0。
如果制作与门也很简单了,(0,0),(0,1),(1,0)都要在直线坐标下面,而(1,1)在坐标上面。
与门实现 x1+x2-1.1 =0
从这里看,异或门的要求就比较奇葩了,要求直线把(0,0)(1,1)放在1边,(0,1) (1,0)放在另一边,这个是没法做到的。
这里引入了一个新的概念。
2.4.2 线性和非线性
我们知道二元一次方程是一条直线,无法实现上面异或门的分割要求。但是用二元二次方程其实可以满足要求,是一条曲线。
这里感知机的局限在于它只能表示由一条直线分割的空间,上图的曲线分割方法需要用非线性的空间来进行划分。
2.5 多层感知机
感知机不能表示异或门让人深感遗憾,但也无需悲观。实际上,感知机的绝妙之处是可以叠加,通过多层来求解。
2.5.1 已有门电路的组合
异或门的制作方法很多,其中之一就是可以通过前面做好的与门、与非门、或门进行配置。
2.5.2 异或门的代码层实现
import numpy as np
def OR(x1,x2):
w1,w2,b = 1.5,1.5,-1
W = np.array([w1,w2])
X = np.array([x1,x2])
sum = np.sum(W*X) + b
if sum>0:
return 1
elif sum<0:
return 0
def AND(x1,x2):
w1,w2,b = 0.5,0.5,-0.7
W = np.array([w1,w2])
X = np.array([x1,x2])
sum = np.sum(W*X) + b
if sum>0:
return 1
elif sum<0:
return 0
def NOT_AND(x1,x2):
w1,w2,b = 0.5,0.5,-0.7
W = np.array([w1,w2])
X = np.array([x1,x2])
sum = np.sum(W*X) + b
if sum>0:
return 0
elif sum<0:
return 1
def XOR(x1,x2):
return AND(NOT_AND(x1,x2),OR(x1,x2))
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
print("------------------")
print(NOT_AND(0,0))
print(NOT_AND(0,1))
print(NOT_AND(1,0))
print(NOT_AND(1,1))
print("-----result of xor------")
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
XOR 运行效果图
这样异或门就实现了。异或门是一种多层结构的神经网络,这里,最左边一列是0层,中间的一列是第1层,最右边的一列称为第2层。
叠加了多层的感知机也称为多层感知机(multi-layered perceptron)
二层感知机
这里我们叫做二层感知机。
具体如下逻辑:
2.6 从与非门到计算机
多层感知机可以实现比前见到的电路更复杂的电路。比如进行加法运算的加法器,比如二进制到十进制转换的编码器。
书里介绍,《计算机系统要素:从零开始构建现代计算机》,论述了通过NAND来构建可运行俄罗斯方块的计算机的过程。通过简单地NAND元件就可以实现计算机这样复杂的系统。
严格来说,2层感知机,激活函数使用了非线性的sigmoid函数的感知机可以表示任意函数。
本节学到,感受最大的是:
单层感知机智能表示线性空间,而多层感知机可以表示非线性空间。-by 飞霜
留言与评论(共有 0 条评论) “” |