精华内容
下载资源
问答
  • 两层感知解决异或问题 文章目录两层感知解决异或问题前言感知机简单逻辑电路与门与非门或门异或门异或门的感知机的表示第一层感知机第二层感知机 前言 本文的内容主要参考《深度学习入门》这本书 最近翻看《深度...

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

    前言

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

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

    文章脉络是这样的,

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

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

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

    感知机

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

    感知机示例

    上图是一个接收两个输入信号的感知机的例子。 x 1 x_1 x1 x 2 x_2 x2是输入信号, y y y是输出信号, w 1 w_1 w1 w 2 w_2 w2 是权重。图中的〇称为“神经元”或者“节点”。
    那么接下来的一个问题是,刚刚说了感知机的信号只有两种取值(0/1),那么什么时候输出信号的取值是0,什么时候输出信号的取值是1呢

    计算法则:

    首先神经元会计算传送过来的信号总和( w 1 x 1 + w 2 x 2 w_1x_1+w_2x_2 w1x1+w2x2),然后我们会人为的给定一个阈值 θ \theta θ),当传送过来信号的总和大于阈值的时候,输出信号为1,反之,传送过来的信号的总和小于等于阈值的时候,输出信号的取值为0
    y = { 0 ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 ( w 1 x 1 + w 2 x 2 > θ ) y= \begin{cases} 0& \text{($w_1x_1+w_2x_2 \leq \theta$)}\\ 1& \text{($w_1x_1+w_2x_2 \gt \theta$)} \end{cases} y={01(w1x1+w2x2θ)(w1x1+w2x2>θ)

    简单逻辑电路

    与门

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

    与门真值表

    将其画在图上则为:

    与门样本点示例图

    下面考虑用感知机来表示这个与门。需要做的就确定能满足上图真值表的 w 1 , w 2 , θ w_1,w_2,\theta w1,w2,θ的值。那么设定什么样的值才能制作出满足上图真值表的感知机呢

    还记得我们初中学过的直线表达式吗, a x + b y + c = 0 ax+by+c=0 ax+by+c=0,当某一点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)在这条直线下方时,有 a x 0 + b y 0 + c < 0 ax_0+by_0+c\lt0 ax0+by0+c<0,当 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)在这条直线上方时,有 a x 0 + b y 0 + c > 0 ax_0+by_0+c\gt0 ax0+by0+c>0

    回到感知机的计算法则,
    y = { 0 ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 ( w 1 x 1 + w 2 x 2 > θ ) y= \begin{cases} 0& \text{($w_1x_1+w_2x_2 \leq \theta$)}\\ 1& \text{($w_1x_1+w_2x_2 \gt \theta$)} \end{cases} y={01(w1x1+w2x2θ)(w1x1+w2x2>θ)
    θ \theta θ移到符号左边,即当 ( w 1 x 1 + w 2 x 2 − θ ≤ 0 ) (w_1x_1+w_2x_2-\theta \leq 0) (w1x1+w2x2θ0)时, y y y取值为0;当 ( w 1 x 1 + w 2 x 2 − θ > 0 ) (w_1x_1+w_2x_2-\theta \gt 0) (w1x1+w2x2θ>0)时, y y y取值为1。也就是说当点 ( x 1 , x 2 ) (x_1,x_2) (x1,x2) w 1 x 1 + w 2 x 2 − θ = 0 w_1x_1+w_2x_2-\theta = 0 w1x1+w2x2θ=0这条直线下方时, y y y取值为0;当点 ( x 1 , x 2 ) (x_1,x_2) (x1,x2) w 1 x 1 + w 2 x 2 − θ = 0 w_1x_1+w_2x_2-\theta = 0 w1x1+w2x2θ=0这条直线上方时, y y y取值为1。

    因此其实我们就是在寻找一条直线,将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开

    与门样本点划分示例图

    事实上,这样的直线有无数条,比如当 ( w 1 , w 2 , θ ) = ( 1 , 1 , 1.4 ) (w_1,w_2,\theta)=(1,1,1.4) (w1,w2,θ)=(1,1,1.4)时,就可以满足上述条件。设定这样的参数后,仅当 x 1 x_1 x1 x 2 x_2 x2同时为1时,信号的加权总和才会超过给定的阈值 θ \theta θ

    与非门

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

    与非门真值表

    将其画在图上则为:

    与非门样本点示例图

    在讲述与门的时候提到过其实我们就是在寻找一条直线,将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开
    与非门实例点直线划分

    可以用 ( w 1 , w 2 , θ ) = ( − 1 , − 1 , − 1.4 ) (w_1,w_2,\theta)=(-1,-1,-1.4) (w1,w2,θ)=(1,1,1.4)这样的组合。

    或门

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

    或门真值表

    将其画在图上则表示为:

    或门样本点示例图

    同样的,我们也寻找一条直线,将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开

    或门直线划分示例图

    可以用 ( w 1 , w 2 , θ ) = ( 1 , 1 , 0.5 ) (w_1,w_2,\theta)=(1,1,0.5) (w1,w2,θ)=(1,1,0.5)这样的组合。

    异或门

    异或门是仅当 x 1 x_1 x1 x 2 x_2 x2中的一方为1时,才会输出1。用真值表表示为:

    异或门真值表

    将其画在图上则为:

    异或门样本点示例图

    按照我们上述对与门、与非门、或门的思考方式,我们需要找到一条直线,将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开,但是我们发现,对于异或门而言,无论如何,都找不到一条直线,能够将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开。这其实就是单层感知机的局限性。
    异或门曲线划分

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

    异或门的感知机的表示

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

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

    第一层感知机

    首先我们明确一下第一层感知机的作用。第一层感知机,其实是寻找两条直线,利用这两条直线,将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开。也就是如图所示:
    两条线划分

    ( x 1 x_1 x1, x 2 x_2 x2)=(0,1)与( x 1 x_1 x1, x 2 x_2 x2)=(1,0),在两条线之间,( x 1 x_1 x1, x 2 x_2 x2)=(0,0)在两条线下方,( x 1 x_1 x1, x 2 x_2 x2)=(1,1)在两条线上方

    我们可以设置 ( w 111 , w 121 , θ 11 ) = ( 1 , 1 , 0.5 ) (w_{111},w_{121},\theta_{11})=(1,1,0.5) (w111,w121,θ11)=(1,1,0.5) ( w 112 , w 122 , θ 12 ) = ( 1 , 1 , 1.4 ) (w_{112},w_{122},\theta_{12})=(1,1,1.4) (w112,w122,θ12)=(1,1,1.4)这样的组合

    此时感知机权重为

    第一层感知机权重

    第二层感知机

    经过第一层感知机利用两条直线,将 y = 0 y=0 y=0 y = 1 y=1 y=1的点分开后,我们看一下,感知机的输入与第一层感知输出以及最终应该输出信号的情况,如表所示:

    x 1 x_1 x1 x 2 x_2 x2 s 1 s_1 s1 s 2 s_2 s2 y y y
    00000
    01101
    10101
    11110

    观察后可知,对于( x 1 x_1 x1, x 2 x_2 x2)=(0,0)时输出为(0,0);对于( x 1 x_1 x1, x 2 x_2 x2)=(1,1)时,输出为(1,1);而且最重要的是对于( x 1 x_1 x1, x 2 x_2 x2)=(0,1)与( x 1 x_1 x1, x 2 x_2 x2)=(1,0)时,输出均为(1,0)(他们的最终输出信号 y y y也是一样的);

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

    s 1 s_1 s1 s 2 s_2 s2 y y y
    000
    101
    110

    其中( s 1 s_1 s1, s 2 s_2 s2)=(0,0)与( s 1 s_1 s1, s 2 s_2 s2)=(1,1) 的最终输出信号 y y y是一样的,( s 1 s_1 s1, s 2 s_2 s2)=(1,0) 本身属于一个输出信号。所以第二层感知机就是将这三个点进行分开。我们发现对于这三个点而言,可以找到一条直线将其分开。(这就是第一层感知机最直接的作用,经过第一层感知机后,才可以找到一条直线将不同的输出信号分开)

    直线划分

    可以设置 ( w 211 , w 221 , θ 21 ) = ( 1 , − 1 , − 0.5 ) (w_{211},w_{221},\theta_{21})=(1,-1,-0.5) (w211,w221,θ21)=(1,1,0.5) 满足条件。

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

    双层感知机全部权重参数

    展开全文
  • % 用两层感知器实现异或XOR % 第一层是随机层,即权重何偏差随机确定,以第一层的输出作为第二层的输入
  • 感知机(Perceptron)为什么无法解决异或XOR)问题呢? 1.异或问题 首先我们来分析一下什么是异或问题。通俗得说,这个是概念性的问题,搞懂概念即,相同的就是0,不同的就是1,比如:1000异或1000,结果就是...

    目录

    1.异或问题

    2.感知机(Perceptron)


    感知机(Perceptron)为什么无法解决异或(XOR)问题呢?

    1.异或问题

    首先我们来分析一下什么是异或问题。通俗得说,这个是概念性的问题,搞懂概念即,相同的就是0,不同的就是1,比如:1000异或1000,结果就是0000,1000异或1001,结果就是0001。可用下图表示:

    即异或问题可以分为根据输出可以分为两类,显示在二维坐标系中如上图(右)所示:其中输出结果为1对应右图中红色的十字架,输出为0对应右图中蓝色的圆圈,我们可以发现对于这种情况无法找到一条直线将两类结果分开。

    2.感知机(Perceptron)

    感知机到底是什么呢?首先来看一下他的数学定义:
    假设输入空间(即样本的特征空间)为X⊆R^{n},输出空间为y={+1,−1}。输入位x⊂X表示样本的特征向量,对应于输入空间(特征空间)的点;输出y⊂Y表示样本类别。由输入空间到输出空间对应的函数关系如下:

     此函数被称为感知机。其中,w与b为感知机的模型参数,w⊂R^{n}为权重(weight)或权值向量(weight vector),b⊂R为偏置(bias),w⋅x表示w与x的内积,而sign是符号函数,即:

     感知机是一种线性分类模型,属于判别模型。而异或问题是线性不可分的,在异或问题的图示中,我们可以发现无法找到一条直线将两类结果分开,即无法找到一个线性模型将其进行划分,所以感知机无法解决异或问题。

     

     

    展开全文
  • 据说多层感知机(MLP)是很难处理异或问题的,就好比下面的问题。 首先由一个问题引入,来自邱锡鹏老师的书《神经网络与深度学习》第四章的习题 4-2: 习题 4-2 试设计一个前馈神经网络来解决 XOR 问题,要求该前馈...

    1/ 异或问题(XOR Problem)

    异或问题就是当两个输入的布尔值不一致时,输出为 True(可以用 1 代表),如果两个输入的布尔值一致的时候,输出为 False(可以用 0 代表)。

    据说多层感知机(MLP)是很难处理异或问题的,就好比下面的问题。

    首先由一个问题引入,来自邱锡鹏老师的书《神经网络与深度学习》第四章的习题 4-2:

    习题 4-2 试设计一个前馈神经网络来解决 XOR 问题,要求该前馈神经网络具有两个隐藏神经元和一个输出神经元,并使用 ReLU 作为激活函数。

    一个可行的结果如下,
    W ( 1 ) = [ 1 1 1 1 ] , b ( 1 ) = [ 0 − 1 ] w ( 2 ) = [ 1 − 2 ] , b ( 2 ) = [ 0 ] (1) \boldsymbol{W}^{(1)}=\left[\begin{array}{ll}1 & 1 \\ 1 & 1\end{array}\right], \boldsymbol{b}^{(1)}=\left[\begin{array}{c}0 \\ -1\end{array}\right]\\ \boldsymbol{w}^{(2)}=\left[\begin{array}{c}1 \\ -2\end{array}\right], b^{(2)}=\left[0\right] \tag{1} W(1)=[1111],b(1)=[01]w(2)=[12],b(2)=[0](1)
    故整个网络的计算为:
    y = ( w ( 2 ) ) T ( ReLU ⁡ ( ( W ( 1 ) ) T X + b ( 1 ) ) ) + b ( 2 ) \boldsymbol{y}=\left(\boldsymbol{w}^{(2)}\right)^{\mathrm{T}}\left(\operatorname{ReLU}\left(\left(\boldsymbol{W}^{(1)}\right)^{\mathrm{T}} \boldsymbol{X}+\boldsymbol{b}^{(1)}\right)\right)+b^{(2)} y=(w(2))T(ReLU((W(1))TX+b(1)))+b(2)
    代入:
    X = [ 0 0 1 1 0 1 0 1 ] \boldsymbol{X}=\left[\begin{array}{llll}0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 1\end{array}\right] X=[00011011]
    可以算得: y = [ 0 1 1 0 ] \boldsymbol{y}=\left[\begin{array}{llll}0 & 1 & 1 & 0\end{array}\right] y=[0110]

    2/ 使用 Flux 训练

    2.1/ 两个隐含神经元

    实际上这样的一个网络结构,如果使用随机初始化的方式去训练,是训练不好的,原因在于中间要求的是一个 ReLU 激活函数,如果换成其他的激活函数就能够训练好。

    使用如下代码:

    using Flux
    
    function loss()
        ŷ = mlp(data)
        Flux.mse(ŷ, y)
    end
    
    cb = function ()
        println(loss())
    end
    
    data = Array([[0 1 0 1];
                  [0 0 1 1]]);
    y = Array([[0 1 1 0];]);
    
    mlp = Chain(Dense(2, 2, relu), Dense(2, 1));
    ps = Flux.params(mlp);
    
    opt = ADAM(0.01)
    @time Flux.train!(loss, ps, Iterators.repeated((), 1000), opt, cb=cb)
    

    训练完之后会发现,损失依然很高,输出的结果会是全部都很接近 0.5 0.5 0.5.

    如果我们将隐含层的参数设置为 (1) 式的结果,然后只训练输出层的权重 w ( 2 ) \boldsymbol{w}^{(2)} w(2),那么会得到相同的结果:

    # 自定义权重,将权重都初始化为全 1 的矩阵
    mlp = Chain(Dense(2, 2, relu, bias=[0; -1], init=ones),
                Dense(2, 1, bias=zeros(1), init=ones))
    # 只拿出第三个参数,即输出层的权重训练
    ps = Flux.params(Flux.params(mlp)[3])
    opt = ADAM(0.1)
    @time Flux.train!(loss, ps, Iterators.repeated((), 1000), opt, cb=cb)
    

    结果会得到 w ( 2 ) = [ 0.9999... − 1.9999... ] \boldsymbol{w}^{(2)}=[0.9999... -1.9999...] w(2)=[0.9999...1.9999...],与题目设计的是一样的。

    2.2/ 三个隐含神经元

    但实际上,如果我们在隐含层上使用三个神经元,就能够解决这个问题。这证明只使用两个隐含神经元,模型的能力并不够,加多了一个就能够解决了:

    mlp = Chain(Dense(2, 3, relu), Dense(3, 1));
    ps = Flux.params(mlp)
    opt = ADAM(0.01)
    @time Flux.train!(loss, ps, Iterators.repeated((), 1000), opt, cb=cb)
    # loss = 0.22230548
    # loss = 0.21818444
    # ...
    # loss = 0.0
    ŷ = mlp(data)
    

    最后的解是对的,查看各层的参数可以知道
    W ( 1 ) = [ 0.574309 − 0.574309 0.92754 − 0.966212 1.12378 − 1.12138 ] , b ( 1 ) = [ 0.5743128 − 0.00046141824 − 0.0034916808 ] w ( 2 ) = [ − 1.74122 0.60053 1.2883 ] , b ( 2 ) = [ 1.0000067 ] \boldsymbol{W}^{(1)}=\left[\begin{array}{ll} 0.574309 & -0.574309\\ 0.92754 & -0.966212\\ 1.12378 & -1.12138\end{array}\right], \boldsymbol{b}^{(1)}=\left[\begin{array}{c} 0.5743128\\ -0.00046141824\\ -0.0034916808\end{array}\right]\\ \boldsymbol{w}^{(2)}=\left[\begin{array}{c} -1.74122 \\ 0.60053 \\ 1.2883\end{array}\right], b^{(2)}=\left[1.0000067\right] W(1)=0.5743090.927541.123780.5743090.9662121.12138,b(1)=0.57431280.000461418240.0034916808w(2)=1.741220.600531.2883,b(2)=[1.0000067]
    当使用两个隐含神经元的时候,使用随机初始化权重的方式去训练,会非常难以求解,但是如果使用三个隐含神经元,那么其能力就足以解决异或问题了。

    不过实际上,在使用两个隐含神经元的时候,不使用 ReLU 作为激活函数,而是在隐含层使用 Sigmoid 函数,那么只有两个隐含神经元的情况下,也可以解决异或问题。

    主要的问题应该还是在 ReLU 会把小于零的部分直接截断,相当于这个神经元没有被激活,会容易造成神经元「死亡」无法再继续训练。

    展开全文
  • 双层感知解决异或问题

    千次阅读 2019-03-25 04:01:00
    转载于:https://www.cnblogs.com/china520/p/10591652.html

     

    转载于:https://www.cnblogs.com/china520/p/10591652.html

    展开全文
  • 单层感知器为什么不能解决异或问题(XOR)问题?给出两个思路去考虑这个小问题 最近翻到了自己在印象笔记中学习记录的一些知识点,后续准备系统地整理放在自己的博客上,还请各位不吝指教。 文章目录1. 感知器模型2....
  • 这篇单层感知器的实现具体是为了研究:已知标签的情况下,平面上的二分类问题 1、输入数据集与标签集说明 # 输入数据 X = np . array ( [ [ 1 , 2 , 3 ] , [ 1 , 4 , 5 ] , [ 1 , 1 , 1 ] , [ 1 , 5...
  • 简单多层神经网络实现异或XOR

    万次阅读 2015-08-07 21:38:14
    最近在看《Neural Network Design_Hagan》 然后想自己实现一个XOR 的网络...而 我试了一下 或 和 与 都可以用感知神经元解决,也就是一个。 那么与和或的实现: hardlim (n )=a ,n>=0时 a=1;n 显然需要三个神经元
  • 据说在人工神经网络(artificial neural network, ANN)发展初期,由于无法实现对多层神经网络(包括异或逻辑)的训练而造成了一场ANN危机,到最后BP算法的出现,才让训练带有隐藏层的多层神经网络成为可...
  • 感知机又称之为单层神经网络,只能解决线性问题,无法解决非线性问题,异或问题属于非线性问题,所以感知无法解决异或问题。 注:所有的线性网络都无法解决异或问题。 参考链接:...
  • 两层感知器网络解决异或问题

    热门讨论 2010-05-11 09:29:50
    使用两层感知器网络解决异或问题的程序,使用MATLAB编写,希望大家一起讨论,很简单的神经网络基础问题,可以帮助大家理解神经网络的算法。
  • 感知机(Perceptron)为什么不能表示异或(XOR)

    万次阅读 多人点赞 2017-12-11 10:23:48
    1.感知机不能表示异或在很早之前学Pattern Recognition相关课程的时候,老师在课堂上就说过感知机遇到的一个大问题就是无法表示异或问题(XOR)。后来接触深度学习相关的内容,开头部分肯定会提到感知机,提到感知机...
  • 二层感知器实现异或

    千次阅读 2019-10-05 22:00:45
    用初中的线性规划问题理解 由于单层神经网络不能将异或的判定分为两类。所以需要输入层/隐藏层/输出层 ...# 两层感知器实现异或 # M-P神经元 # 阈值设置:与1,1,2 或1,1,0.5 非-0.6,0,0.5 def uni...
  • 感知器实现异或,与问题的代码,比较简单 ,有用到的就下载吧
  • 1.图中元素说明 ...2. 验证满足XOR运算 (a)当输入 (x1,x2)=(0,0)时: 隐层左perception输出为heaviside(-1.5+1×0+1×0)=0; 隐层右perception输出为heaviside(-0.5+1×0+1×0)=0; 输出层percept...
  • 感知机实现的异或程序,很基础,但很经典的哦
  • 文章目录感知机和单隐藏层网络的模拟“异或运算”(XOR)1、感知机模型2、异或运算3、基于tf的Perception模型和单隐藏层nn实现3.1、Perception 模型3.2、单隐藏层的nn模型 感知机和单隐藏层网络的模拟“异或运算”...
  • 注:在吴恩达老师讲的【机器学习】课程中,最开始介绍神经网络的应用时就介绍了含有一个隐藏层的神经网络可以解决异或问题,而这是单层神经网络(也叫感知机)做不到了,当时就觉得非常神奇,之后就一直打算自己实现...
  • 针对问题 a XOR b,真值表为: a b y 0 0 0 0 1 1 1 0 1 1 1 0 从数据集线性可分性的角度证明XOR逻辑是非线性(即线性不可分的):设数据集T为:其中: 假设T是线性可分的,则存在超平面对T中的4个...
  • https://www.zybuluo.com/ArrowLLL/note/827264“&amp;gt;感知机详细理论
  • 异或xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为: a⊕b = (¬a ∧ b) ∨ (a ∧¬b) 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,297
精华内容 518
关键字:

感知无法解决异或xor