感知机
感知机(Perceptron)是二类分类的线性分类模型,对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机关键字信息:二分类模型、线性可分。
感知机预测是学习得到的感知机模型对新的输入实例进行分类。感知机模型求解方法:导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
感知机接收多个输入信号量,经过计算并判断结果是否超过阈值,而决定下一个神经元是否被激活。
以包含两个输入信号量为例,创建数学模型 y = w1*x1 + w2x2 + b。表达式w1*x1 + w2x2 + b作为模拟信号量完成计算,结果>0,返回1;否则返回0。
1、简单逻辑电路实现
通过感知机显示与门、或门等简单电路。与门、或门、与非门对应真值表如下:
x1 | x2 | x1 & x2 | x1 | x2 | !(x1 & x2) |
0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
由人工根据“真值表”,可设计出无穷个w1、w2、b组合的解。而机器学习的目标应是,根据数学模型和训练数据集,设计出最优解。
以下则通过Python代码,给出与门的其中一种解法:
def AndGate(x1, x2): x = np.array([x1, x2]) w = np.array([0.3, 0.5]) b = -0.7 if np.sum(x * w) + b <= 0: return 0 else: return 1
在设计过程中,或门、与非门的实现仅仅是在参数的设定上有所区别,如下所示:
def NAndGate(x1, x2): x = np.array([x1, x2]) w = np.array([-0.3, -0.5]) b = 0.7 if np.sum(x * w) + b <= 0: return 0 else: return 1 def OrGate(x1, x2): x = np.array([x1, x2]) w = np.array([0.3, 0.5]) b = -0.2 if np.sum(x * w) + b <= 0: return 0 else: return 1
2、多层感知机
根据感知机二分类的线性分类模型的特点,因此仅能表示由一条直线分割的线性空间。
尝试使用感知机实现异或门电路,异或门真值表如下表所示:
x1 | x2 | x1 ^ x2 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
通过平面图形表示上记真值表,其中⚪表示0值,而▲表示1,如下所示:
上记异或门的图形无法利用一条直线进行分割,由于感知机只能表示线性空间。因此单层感知机无法表示异或门,其无法分离非线性空间。
但是通过上文真值表的组合运算,能够实现异或门运算。如下所示:
x1 | x2 |
!(x1 & x2) s1 |
x1 | x2 s2 |
s1 & s2 |
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
借助与非门、或门的组合运算能够实现异或操作,单层感知机可分别实现与非门和或门。因此可通过叠加感知机的方式实现异或运算,从而分离出非线性空间。
def XorGate(x1, x2): s1 = NAndGate(x1, x2) s2 = OrGate(x1, x2) return AndGate(s1, s2)
上记代码,通过图表示如下:
通过上图可看出,异或门是一种多层结构的神经网络,是一个2层的感知机。
通过感知机的叠加,实现对非线性空间的表示。