> 文章列表 > 深度学习入门之感知机

深度学习入门之感知机

深度学习入门之感知机

一. 感知机的定义

感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。
在这里插入图片描述

其中x1、x2x_1、x_2x1x2是输入信号,yyy是输出信号,w1、w2w_1、w_2w1w2是权重。输入信号被送往神经元时,会被分别乘以固定的权重(w1、w2)(w_1、w_2)w1w2。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号θθθ表示。用数学表达式表达如下:
在这里插入图片描述

二. 感知机实现基本逻辑电路

1. 与门

与门仅在两个输入均为1时输出1,其他时候则输出0。与门的真值表如下:
在这里插入图片描述

2. 或门

或门只要有一个输入信号是1,输出就为1。或门的真值表如下:
在这里插入图片描述

3. 与非门

与非门当两个输入信号同时为1时输出0,其他时候则输出1。与非门的真值表如下:
在这里插入图片描述

4. 异或门

异或门在两个输入信号相同(同时为0或者为1)时输出0,其他时候输出1。
在这里插入图片描述

5. 感知机实现基本逻辑电路

import numpy as np# 与门
def AND(x1, x2):x = np.array([x1, x2])w = np.array([0.5, 0.5])b = -0.7tmp = np.sum(x * w) + bif tmp <= 0:return 0else:return 1# 与非门
def NAND(x1, x2):x = np.array([x1, x2])w = np.array([-0.5, -0.5])b = 0.7tmp = np.sum(x * w) + bif tmp <= 0:return 0else:return 1# 或门
def OR(x1, x2):x = np.array([x1, x2])w = np.array([0.5, 0.5])b = -0.2tmp = np.sum(x * w) + bif tmp <= 0:return 0else:return 1if __name__ == '__main__':print("与门:输入x1 = 1,x2 = 1,输出 =",AND(1, 1))print("与门:输入x1 = 0,x2 = 1,输出 =", AND(0, 1))print("与门:输入x1 = 0,x2 = 0,输出 =", AND(0, 0))print("或门:输入x1 = 1,x2 = 1,输出 =", OR(1, 1))print("或门:输入x1 = 1,x2 = 0,输出 =", OR(1, 0))print("或门:输入x1 = 0,x2 = 0,输出 =", OR(0, 0))print("与非门:输入x1 = 1,x2 = 1,输出 =", NAND(1, 1))print("与非门:输入x1 = 1,x2 = 0,输出 =", NAND(1, 0))print("与非门:输入x1 = 0,x2 = 0,输出 =", NAND(0, 0))

运行结果:

与门:输入x1 = 1,x2 = 1,输出 = 1
与门:输入x1 = 0,x2 = 1,输出 = 0
与门:输入x1 = 0,x2 = 0,输出 = 0
或门:输入x1 = 1,x2 = 1,输出 = 1
或门:输入x1 = 1,x2 = 0,输出 = 1
或门:输入x1 = 0,x2 = 0,输出 = 0
与非门:输入x1 = 1,x2 = 1,输出 = 0
与非门:输入x1 = 1,x2 = 0,输出 = 1
与非门:输入x1 = 0,x2 = 0,输出 = 1

三. 感知机的局限性与解决

1. 单个感知机的局限

前面我们通过感知机已经实现了与门,或门,与非门,但是感知机无法实现异或门。

我们试着将或门的动作形象化。或门的情况下,当权重参数(b,w1,w2)=(−0.5,1.0,1.0)(b, w_1, w_2) = (−0.5, 1.0, 1.0)(b,w1,w2)=(0.5,1.0,1.0)时,可满足或门的真值表条件。此时,感知机可用下式表示。
在这里插入图片描述
感知机会生成由直线−0.5+x1+x2=0−0.5 + x_1 + x_2 = 00.5+x1+x2=0分割开的两个空间。其中一个空间输出1,另一个空间输出0。
在这里插入图片描述

或门在(x1,x2)=(0,0)(x_1, x_2) = (0, 0)(x1,x2)=(0,0)时输出0,在(x1,x2)(x_1, x_2)(x1,x2)(0,1)、(1,0)、(1,1)(0, 1)、 (1, 0)、 (1, 1)(0,1)(1,0)(1,1)时输出1。下图中,○○表示0,△△表示1。如果想制作或门,需要用直线将图中的○○△△分开。实际上,刚才的那条直线就将这4个点正确地分开了。
换成异或门的话会如何?如下图所示。
在这里插入图片描述
显然从图中可以看出,不能使用一条直线将图中的○○△△分开。

单个感知机的局限性就在于它只能表示由一条直线分割的空间

2. 多层感知机

感知机可以通过叠加实现非线性可分的问题。异或门可以通过与门,与非门,或门的叠加实现。
在这里插入图片描述

异或门编程实现
# 异或门
def XOR(x1, x2):s1 = NAND(x1, x2)s2 = OR(x1, x2)y = AND(s1, s2)return yprint("异或门:输入x1 = 1,x2 = 1,输出 =", XOR(1, 1))
print("异或门:输入x1 = 1,x2 = 0,输出 =", XOR(1, 0))
print("异或门:输入x1 = 0,x2 = 1,输出 =", XOR(0, 1))
print("异或门:输入x1 = 0,x2 = 0,输出 =", XOR(0, 0))

运行结果:

异或门:输入x1 = 1,x2 = 1,输出 = 0
异或门:输入x1 = 1,x2 = 0,输出 = 1
异或门:输入x1 = 0,x2 = 1,输出 = 1
异或门:输入x1 = 0,x2 = 0,输出 = 0