两层感知机解决异或(XOR)问题


文章目录

  • 两层感知机解决异或(XOR)问题
  • 前言
  • 感知机
  • 简单逻辑电路
  • 与门
  • 与非门
  • 或门
  • 异或门
  • 异或门的感知机的表示
  • 第一层感知机
  • 第二层感知机


前言

本文的内容主要参考《深度学习入门》这本书

最近翻看《深度学习入门》一书时,对感知机解决异或问题产生了一些疑问。经过与同学的探讨,终于弄清楚了为什么两层感知机能够解决异或(XOR)问题,以及两层感知机解决异或问题时的权重应该如何设置。

文章脉络是这样的,

首先我会简单介绍什么是感知机

然后会介绍一下一些简单的逻辑电路(与门,与非门,或门),并介绍如何用感知机实现这些逻辑电路

最后我会介绍异或门,引出单层感知机的局限性,进而引出用两层感知机解决异或问题

感知机

感知机接收多个输入信号,输出一个信号。注意,感知机的信号只有(0/1)两种取值

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习

上图是一个接收两个输入信号的感知机的例子。如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03是输入信号,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_04是输出信号,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_05如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_06 是权重。图中的〇称为“神经元”或者“节点”。
那么接下来的一个问题是,刚刚说了感知机的信号只有两种取值(0/1),那么什么时候输出信号的取值是0,什么时候输出信号的取值是1呢

计算法则:

首先神经元会计算传送过来的信号总和(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_07),然后我们会人为的给定一个阈值如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_08),当传送过来信号的总和大于阈值的时候,输出信号为1,反之,传送过来的信号的总和小于等于阈值的时候,输出信号的取值为0
如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_09

简单逻辑电路

与门

与门仅在两个输入均为1时输出1,其他时候输出0。用真值表表示为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_10

将其画在图上则为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_11

下面考虑用感知机来表示这个与门。需要做的就确定能满足上图真值表的如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_12的值。那么设定什么样的值才能制作出满足上图真值表的感知机呢

还记得我们初中学过的直线表达式吗,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_13,当某一点如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_14在这条直线下方时,有如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_15,当如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_14在这条直线上方时,有如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_17

回到感知机的计算法则,
如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_09
如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_08移到符号左边,即当如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_20时,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_04取值为0;当如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_22时,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_04取值为1。也就是说当点如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_24如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_25这条直线下方时,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_04取值为0;当点如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_24如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_25这条直线上方时,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_04取值为1。

因此其实我们就是在寻找一条直线,将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_32

事实上,这样的直线有无数条,比如当如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_33时,就可以满足上述条件。设定这样的参数后,仅当如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03同时为1时,信号的加权总和才会超过给定的阈值如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_08

与非门

与非门 是 Not 与门的意思,颠倒了与门的输出,仅在两个输入均为1时输出0,其他时候输出1。用真值表表示为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_37

将其画在图上则为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_38

在讲述与门的时候提到过其实我们就是在寻找一条直线,将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_python_41

可以用如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_42这样的组合。

或门

只要有一个输入信号是1,输出就为1。真值表表示为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_43

将其画在图上则表示为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_44

同样的,我们也寻找一条直线,将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_python_47

可以用如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_48这样的组合。

异或门

异或门是仅当如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03中的一方为1时,才会输出1。用真值表表示为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_51

将其画在图上则为:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_52

按照我们上述对与门、与非门、或门的思考方式,我们需要找到一条直线,将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开,但是我们发现,对于异或门而言,无论如何,都找不到一条直线,能够将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开。这其实就是单层感知机的局限性。

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_57

单层感知机的局限性就在于它只能表示由一条直线分割的空间,向与门、与非门、或门等这些能够由直线分割而成的空间成为线性空间,向异或门这样不能由直线分割而成的空间,只能由曲线分割而成的空间称为非线性空间

异或门的感知机的表示

虽然单层感知机不能表示异或门,那么双层感知机能否表示异或门呢?其实是可以用双层感知机来表示异或门的。

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_58

那么对于双层感知机设定什么样的值才能制作出异或门呢

第一层感知机

首先我们明确一下第一层感知机的作用。第一层感知机,其实是寻找两条直线,利用这两条直线,将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开。也就是如图所示:

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_python_61

(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03)=(0,1)与(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03)=(1,0),在两条线之间,(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03)=(0,0)在两条线下方,(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03)=(1,1)在两条线上方

我们可以设置如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_70如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_71这样的组合

此时感知机权重为

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_72

第二层感知机

经过第一层感知机利用两条直线,将如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_30如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_31的点分开后,我们看一下,感知机的输入与第一层感知输出以及最终应该输出信号的情况,如表所示:

0

0

0

0

0

0

1

1

0

1

1

0

1

0

1

1

1

1

1

0

观察后可知,对于(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03)=(0,0)时输出为(0,0);对于(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_02,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_03)=(1,1)时,输出为(1,1);而且最重要的是对于(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_84,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_85)=(0,1)与(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_84,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_85)=(1,0)时,输出均为(1,0)(他们的最终输出信号如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_88也是一样的);

因为第一层感知机的输出是第二层感知机的输入,因此第二层的感知机的输入仅剩下三个点,分别为(0,0),(1,1),(1,0)

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_84

0

0

0

1

0

1

1

1

0

其中(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_92,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_93)=(0,0)与(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_92,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_93)=(1,1) 的最终输出信号如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_04是一样的,(如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_92,如何将多层感知机的参数实现到c语言中 多层感知机实现异或_深度学习_93)=(1,0) 本身属于一个输出信号。所以第二层感知机就是将这三个点进行分开。我们发现对于这三个点而言,可以找到一条直线将其分开。(这就是第一层感知机最直接的作用,经过第一层感知机后,才可以找到一条直线将不同的输出信号分开)

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_如何将多层感知机的参数实现到c语言中_99

可以设置如何将多层感知机的参数实现到c语言中 多层感知机实现异或_机器学习_100

因此最终异或门的权重参数为

如何将多层感知机的参数实现到c语言中 多层感知机实现异或_人工智能_101