重点:
- 感知机将权重与偏置设定为参数。
- 不改变结构,只改变参数可以使感知机实现不同的功能。
- 单层感知机只能表示线性空间,多层感知机可以表示非线性空间。
2.1 感知机是什么
感知机接收多个(0,1)输入信号,输出一个(0,1)信号。
下图展示了一个二输入的感知机的例子:
x1,x2是输入信号,y是输出信号,w1,w2是权重,⚪表示一个神经元,还有一个重要参数没在图中表示出来,是阈值θ,大于阈值输出1,小于阈值输出0。具体公式如下:
当w1x1+w2x2>θ时,输出为1,称“神经元被激活”。
小结:
- 阈值θ决定了输出神经元激活的难易程度。
- 权重w1,w2决定了输入信号x1和x2的重要性。
2.2 简单逻辑电路
2.2.1 与门
与门真值表:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
考虑用上面的二输入感知机实现与门,可调的参数只有3个,分别是权重w1,w2和阈值θ。
w1,w2,θ可取的值为:
w1 | w2 | θ |
---|---|---|
0.5 | 0.5 | 0.7 |
0.5 | 0.5 | 0.8 |
1.0 | 1.0 | 1.0 |
可以验证,当参数取上面3种情况时,只有x1,x2都为1,输出y才为1。除了上面3种取法,还有无数种,可见参数的选择不唯一。
2.2.2 与非门
与非门真值表:
x1 | x2 | y |
---|---|---|
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
与非门就是在与门基础上,取反
w1,w2,θ可取的值为:
w1 | w2 | θ |
---|---|---|
-0.5 | -0.5 | -0.7 |
-0.5 | -0.5 | -0.8 |
-1.0 | -1.0 | -1.0 |
与非门的参数选择亦有无数种,不唯一。
2.2.3 或门
或门真值表:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
w1,w2,θ可取的值为:
w1 | w2 | θ |
---|---|---|
0.5 | 0.5 | 0.3 |
0.5 | 0.5 | 0.4 |
1.0 | 1.0 | 0.7 |
或门的参数选择亦有无数种,不唯一。
重点: 与,或,与非门的感知机构造都是一样的,都是用二输入感知机实现,通过选取不同的参数,实现不同的逻辑计算。
机器学习的目标就是告诉计算机要实现的目标,让计算机自动选择合适的参数。
2.3 感知机的Python实现
2.3.1 用偏置代替阈值
将上面的数学表达式的θ移到右边,令b=-θ,换一种表达方式:
我们称b为偏置,效果就像穿木屐,在计算b+w1x1+w2x2的过程中,权重w和输入x都知道的时候,b总是将计算结果抬到一个高度,使其更容易或更难大于0。
权重w1,w2是控制输入信号的重要性的参数。
偏置b是调整神经元被激活的容易程度的参数。
2.3.2 用Python实现与门,与非门,或门
与门:
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
#mumpy中数组相乘,为其对应位置元素相乘,构成表达式b+w1x1+w2x2
if tmp <= 0:
return 0
else:
return 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
或门:
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
2.4 感知机的局限性
2.4.1 异或门
我们来看一下异或门的真值表:
异或门真值表:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
只有当输入x1和x2不一样时,输出才为1。
我们用前面使用的二输入感知机无法实现异或门,可以通过画图理解。
下面是或门的输入输出分布图,●表示0,▲表示1,可以通过参数的选取,w1=1,w2=1,b=-0.5。
用直线-0.5+x1+x2=0可以将两个不同的输出区域分割开。
但是观察异或门的输入输出分布图:
很明显,如果遵从数学公式:
无法使用一条直线b+w1x1+w2x2=0将不同的输出区域分割开。
2.4.2 线性和非线性
感知机的局限性就在于它只能表示由一条直线分割的空间。
倘若我们要分割异或门的输入输出空间,就必须使用曲线。
这种由曲线分割而成的空间称为非线性空间。
而由直线分割而成的空间称为线性空间。
2.5 多层感知机
2.5.1 异或门的实现
单层二输入感知机无法实现异或门的表达,但是通过叠加感知机,可以实现更多的逻辑表达。
用下面的符号来表达已有的可以用一个感知机表达的逻辑:
可以通过组合,叠加感知机,实现异或门。
s1是与非门的输出结果,s2是或门的输出结果,将s1,s2作为与门的输入,得到y,可以实现异或门。
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
2.5.2 异或门的python实现
#要先从包含与,或,与非门的模块导入对应的函数
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
用感知机表示异或门,如下图所示
从图可以看出,异或门是一个多层感知机。
最左边一层神经元称为第0层,为的是与Python的列表逻辑符合,由于上图中,拥有权重的层实际上只有2层(第0层和第1层之间,第1层和第2层之间),所以称为2层感知机,有的文献也称为3层,忽略权重。
通过叠加层,感知机能进行更灵活的表示,例如表示非线性空间。