感知器定义
感知器模型来源以及生物神经元的数学抽象
如下图所示
1 生物神经元需要接收与其相连的其他神经元传递过来的信号
2 生物神经元对接收到的多个信号进行运算,输出响应
那么问题来了,信号如何传递,生物神经元究竟对信号做了什么处理。我们该如何定义呢?
感知器就是一种对神经元运行过程的一种抽象结果,
如下图所示
我们先不用理会这个图,直接用我们最直接的方式来推理信号接收回忆高中学的生物学,我们知道神经元在树突部分通过其他神经元分泌的化学刺激产生电信号,
该信号传递至神经元细胞体中。假如一个神经元的树突链接了N个其他神经元的轴突末端,那么他将接收到N个信号,我们再理想化一点,这N个信号同时被神经元接收到。
那么神经元的瞬时输入可以记作一个list[x1,x2,x3,x4....,xn],这种表示方法在数学上其实可以表示为一个N维向量。
信号传递与神经元内部响应
具体如下图所示
1 假设神经元有M个树突(输入),每个树突都有一个相对应权重,用于衡量该信号的重要程度。如果信号重要,对应的输入将被放大,反之亦然。
如果我们不用向量计算,我们依旧可以使用遍历数组的方式,计算出最终传递到神经元细胞体中的信号X =[x1,x2,x3,x4....,xm]W=[w1,w2,w3,w4....,Wm]遍历数组,
每次都将对应下标的w与x相乘,结果插入新的list中.
2 假设神经元细胞体内部将所有带权输入直接做加法处理。那么我们就可以认为神经元最终输出的结果为x1*w1+x2*w2+....+xm*wm数学公式表示如下:
这里简单介绍一下向量点乘。我们查一下资料如下所示,可以看出向量点乘与我们在上文使用的计算过程是一致的(逐个元素求积,然后求和)。
那么这个包含信号接收--信号预处理-信号处理的过程(模拟神经元的信号接收与处理),就可以写为输入信号X向量与对应的权值向量W的点积。
这里如果有对向量不是很熟悉的朋友,可以这样去理解。将如果向量只有一个参数。即神经元只有一个树突,只接受一个信号。那么神经元的带权输入求和计算就退化为 u=w*x (w与x相乘,这里的w与x都是一个数)。
我们使用向量目前看来只是为了将复杂的运算写为与一维相近的形式。
偏置
我们接着上文所提到的退化后的带权输入求和公式往下走,显而易见的,该公式就是一个一条直线,回忆初中时老师教的,一条直线定义为 y=ax+b。
与上文提到的u=w*x相比,我们发现原来的定义并不完整,并不是适谱的直线,只是一条必过原点的直线。
那么这里要问了如果没有这个 b(偏置),这个模型到底是否有效呢?
我们稍微超纲一下,看如下图显示的分类器运算结果以二位平面为例右边灰色区域的所有点为类1左边白色区域的做有点为类2
下图显示了一条直线,将这2个类分开。我们很清楚的看出,这条直线是不过原点的。
也就是说,为了是我们的感知器模型在处理线性分类问题是都是可用的,就必须增加一个b(偏置),来调整我们的直线位置。
那么感知器的模型我们就可以写为如下形式
求和部分 可以理解输入信号向量与权值向量的点乘结果,偏置b用于调整分类的直线(其实这个术语叫超平面,我们用二维平面来理解这个超平面,就是一条直线,同理3维数据的分类线为一个二维平面)。
为了让这个公式看上去更加简洁,将偏置假如感知器的输入中,其对应权值为1,一个输入维数为m的感知器。
定义输入为
权值定义为
那么这个感知器的模型就可以简写为如下形式
以上,感知器的模型就介绍完了。
总结:
1 感知器对输入做加权运算
2 每个输入都有一个对应的权值
3 感知器需要偏置来确定分类超平面的位置
感知器分类 -------
1 感知器的分类能力是无敌的吗?
我们从感知器的形式上看,感知器如果要完成分类,它要求被分类的数据是线性可分的。
通俗来说,如下图所示,能找到一个超平面(二维数据是直线)将数据分离为2个部分。
显而易见,这2类的分类边界就是一个非常工整的直线。因此感知器的分类是有效的。
这里给出超平面的计算公式如下
如果数据不是线性可分的,如下所示,永远找不到一条直线,将b图的两类正确的分离
结论-感知器的分类能力只对线性可分的数据有效。
感知器收敛定理的前提之一:分类的数据是线性可分的,用数学语言的方式表达,解存在。
2 感知器如何对数据进行分类的?
假如存在一对线性可分离的数据集,集合G1与G2。
G1为灰色数据,G2为白色数据。我们看出G1在直线的上部 ,G2在直线的下部。
那么分类的动作就可以这么去定义存在一个解向量(权值向量),对任意的G1,使下式成立(该式子是向量形式,同时是将偏置b作为输入的简写形式)
同理,该向量对任意的G2,满足以下式子
以上我们知道了感知器解的形式,即权值向量那怎么找到这个解?
假如感知器当前的权值向量能够正确的完成分类,即满足上述2个式子。那么权值就不做变化。
如果当前感知器的分类结果与数据集不符,做如下处理简单理解,对G1而言,如果数据计算结果为一个小于等于0的数,为了让结果大于0,需要放大其权值向量
同理,G2做如下处理
学习率是一个大于零的数字!!!!
这个很关键那么,我们知道了感知器的算法大致是什么形式了,不断地迭代调整权值向量,指导找到可用的解向量。
这里要说明迭代的过程,将数据输入感知器后,如果感知器当前分类错误,调整权值向量后,需要再次使用上一次的输入数据与更新过的权值向量做分类计算,
如果失败接着重复。那么大家都知道死循环是没有意义的,这样的算法能自动停止吗?答案是肯定的(数据线性可分的情况下)。有兴趣的可以去看看感知器的收敛定理,
如果留言需要的朋友比较多,我可以尝试做一个感知器收敛定理的推导详解。
接下来言归正传,上述式子提到了学习率参数,这个东西他调节权值向量的过程究竟是怎么样的?
我们知道,如果分类错误,就意味着感知器的分类结果出现了符号错误。
那么以G1分类错误距离说明其作用。
如下式所示,当第N次迭代出现分类结果出现符号错误的时候,我们调整(简单理解为增大)权值向量。
然后在第N+1次迭代中使用 调整后的权值向量与 第N次迭代的输入做分类计算。
好了,似乎我说了废话。但是仔细想,这个次数到底要多少次呢?
这个学习率就是控制着这个迭代此数!学习率越大,迭代次数越少。反之亦然!
但是学习率并不是越大越好的,这有点像微分方程数值解法里的步长的概念。
步长太大的结果就是求解不正确,步长太小,又可能出现计算缓慢(计算量大)的情况。
那么,我们用以下方法来找到最佳的步长(自适应)
在每一迭代后,找到能满足上式的最小整数,这个整数就是自适应的步长。
什么?没搞明白?
答案就是:先用等式求解,右边的计算结果除以左边的计算结果,对计算结果上取整!
读者:劳资想知道为什么这个结果能使下一次迭代的就消除符号错误(分类正确)!
好的,我们可以将这个式子退化到一维,即x向量只有1维.这里公式不好编辑,我用n代替这个学习率,大家凑合看
如果G1分类错误,那么w*x<0;
n*x^2>|w(n)*x|
n=|w(n)*x|/x^2
=|w(n)/x|
不做上取整
w(n+1)=w(n)+n*x
=w(n)+(|w(n)*x|/x^2)*x
=w(n)+|w(n)/x|*xw(n+1)*x
=w(n)*x+|w(n)/x|*x^2
如果负号来自与w(n),我们发现第二次迭代结果为0,但是我们只要对n做了上去整,|w(n)/x|*x^2将比不做上取整的时候更大,此时迭代结果大于零,符号正确。
如果负号来自x,我们同样发现第二次迭代结果为0,对n做上取整后,右边的恒正项(x^2)的系数将变大,那么此时迭代结果大于零,符号正确。
OK,反之G2亦然!接下来我们要说如何将上述的各种式子写为通用形式了,以便我们编程实现感知器算法
先加一个定义,如果感知器的加权计算求和(线性运算)打大于零,输出1,小于零则输出-1;如下所示
感知器的输出可以写为
再定义数据集的期望(就是如何定义正确的结果,给对应的数据打标签)
第一行表示G1,第二行表示G2
那么将感知器的权值式子就可以写为为如下形式(包含分类正确与分类错误这2种情况情况)
如果感知器输出结果y与期望(数据标签)一致,则w(n+1)=w(n)
如果感知器对G1分类错误,则d(n)-y(n)>0
如果感知器对G2分类错误,则d(n)-y(n)<0
到此主要的知识点讲解完毕。
贴上算法说明,下一节我编程实现感知器。并完成算法验证
网友评论