感知机(Perceptron)-----最详细记录感知机

1. 前言

感知机是1957年,由Rosenblatt提出会,是神经网络和支持向量机的基础。

感知机是有生物学上的一个启发,他的参照对象和理论依据可以参照下图:(我们的大脑可以认为是一个神经网络,是一个生物的神经网络,在这个生物的神经网络里边呢,他的最小单元我们可以认为是一个神经元,一个neuron,这些很多个神经元连接起来形成一个错综复杂的网络,我们把它称之为神经网络。当然我们现在所说的,在深度学习包括机器学习指的神经网络Neural Networks实际上指的是人工神经网络Artificial Neural Networks,简写为ANNs。我们只是简化了。我们人的神经网络是由这样一些神经元来构成的,那么这个神经元他的一些工作机制呢就是通过这样一个下面图的结构,首先接收到一些信号,这些信号通过这些树突(dendrite)组织,树突组织接收到这些信号送到细胞里边的细胞核(nucleus),这些细胞核对接收到的这些信号,这些信号是以什么形式存在的呢?这些信号比如说眼睛接收到的光学啊,或者耳朵接收到的声音信号,到树突的时候会产生一些微弱的生物电,那么就形成这样的一些刺激,那么在细胞核里边对这些收集到的接收到的刺激进行综合的处理,当他的信号达到了一定的阈值之后,那么他就会被激活,就会产生一个刺激的输出,那么就会形成一个我们大脑接收到的进一步的信号,那么他是通过轴突这样的输出计算的,这就是我们人脑的一个神经元进行感知的时候大致的一个工作原理。)

感知机(Perceptron)-----最详细记录感知机_第1张图片

为了模拟或者说机器或者算法来实现这样一个过程呢,那么感知机就构建了一个类似的结构。通过下图可以看到:

感知机(Perceptron)-----最详细记录感知机_第2张图片那么Σ这个部分呢就是我们的一个加权求和操作。感知机(Perceptron)-----最详细记录感知机_第3张图片首先有一系列的输入,这些输入作为一些信号被传送到一个细胞体里边去,那么这个细胞体里边会对他进行一个加和,这个加和实际上就是我们的一个加权Σ,那么加权之后就会产生一个加权值,加权之后求和之后得到一个值,当这个值比如说大于0的时候,或者大于某一个阈值\delta的时候,那么就会产生一个输出,那么这样的话我们就通过一个简单的数学计算,就模拟了一个神经元的感知过程,他有输入,有输出,细胞体是他中间的一个计算过程,那么这个就是我们的感知机模型。对于这样的感知机模型我们如果用数学公式来表示他实际上就是权重w和输入向量x的一个点乘,即:

                                                                                          f(x)=w\cdot \vec{x}=\Sigma w_{i}x_{i}

接下来对感知机模型进行拆解:

第一个:输入部分;

第二个:权重(就是w向量);权重是在我们进行训练期间计算的值,初始呢我们是用一些初始值来可以进行随机的初始化,然后在学习过程当中对他们进行更新,最后我们模型学习完之后,这就是我们学习到的参数向量。我们用w来表示。

第三个:偏置;这个偏置对应到上图在输入里边我们有一个常量1,实际上这个常量1就相当于w_{0}乘以1,实际上就是w_{0},,后边w_{0}的计算是和输入是无关的,相当于w_{0}就是一个偏置,相当于i从1开始一直到n,还加上一个w_{0},这就是一个偏置。

                                                                                      f(x)=w\cdot \vec{x}=\sum_{1}^{n} w_{i}x_{i}+w_{0}

或者可以写成(如果w不包括w_{0}):f(x)=w\cdot \vec{x}+w_{0}w_{0}就是那个偏置,这个偏置可以让我们的这个分类器具有一定的移动的能力,在这个坐标体系上有一个移动的能力,可以让我们的模型更快、更高质量的收敛到一个好的一个结果上去。

第四个:加权;

第五个:输出;

所以我们从公式上f(x)=w\cdot \vec{x}+w_{0}来看这个就是一个,我们前边提到过机器学习要做什么呢?机器学习就是要学一个函数,就是这个f(x)函数,对于我们的感知机模型来说就是这样的一个典型的感知机的一个函数就是f(x),就是这样一个线性函数。那么给我一个样本之后,这个样本可能是什么呢?比如说可能是一张图片,那么一张图片呢我可以计算一下他x_{1},标签是y_{1}\left ( x_{1},y_{1} \right );那么还有一个是x_{2},标签是y_{2}\left ( x_{2},y_{2} \right )这样的一系列的图片,那么每一个图片的他的输入是什么呢?可以是比如说它包含的红色的像素的个数r,以及绿色像素的比例g,这是x即x_{1}(r,g)x_{2}呢也是红色像素的比例r和绿色像素的比例g,即x_{2}(r,g),所以对于任何一个x,我实际上就可以放在下边的一个二维的坐标:

那么根据红色绿色的比例不同,我们就可以说有些图片是花flower,有些是草grass,那么我们就把这些图片通过这样的话就输入进来了。那么我们希望这个模型找到一个好的w,那么对于花来说我希望他的输出的值应该是大于0,f(x)=w\cdot \vec{x}+w_{0}> 0如果是大于0的话,那么就是flower;f(x)=w\cdot \vec{x}+w_{0}< 0如果小于0的话就是grass,就是这样一个过程。

感知机(Perceptron)-----最详细记录感知机_第4张图片

2. 感知机的原理

感知机是一个有监督的学习算法;

感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型。

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面。

x是一个n维空间(n维的特征空间),上述我们的例子花和草,n是2,所以他是一个平面的2维空间;他的输出空间也就是说如果是flower的话就是+1,如果是grass的话就是-1;对于这个模型他应该有两种输出可能,要么是花要么是草;根据我们的输入x这个向量我希望,这个每一个x的特征向量实际上对应于输入空间上的一个点,对于x来说他就对应一个点(下图使用不同的点来表示它的类别),那么我们的感知机就是这样一个f(x)函数,它能够完成从x到y的一个映射,他这个映射函数就是给我一个x我算w点集x加上b,之后是sign函数(是一个符号函数),sign函数的意思就是取他的符号值,如果sign括号内部的结果是大于0的话,那么sign就取+1,否的话就取-1;结合上边例子,如果sign括号内部的结果大于0那么就取+1,就给他分类为flower。在整个模型中我们的未知量是w和b。

对于感知机来说我们可以看到他的一个函数呢主要核心在于w\cdot x+b,我们把他写作线性方程实际上他就对应于一个空间中的超平面,实际上这就是一个平面方程,所谓的超平面就是在一个n维的空间里边的n-1的一个子空间,比如说我是一个三维的环境下,那么他就是一个二维的一个平面;如果是二维的环境下,那么他就是一条直线;如果是更高维的环境下那么他就是一个更高维的一个情况;所以他不是一个一般意义上的狭义的平面,所以我们把它称之为超平面。但是我们可以把他想象成就是平面的作用,这样的话我们可以在不同的维度上去考虑他;以下例子还是在最直观的便于理解的二维情况下:

感知机(Perceptron)-----最详细记录感知机_第5张图片比如说我有一个二维的这样的一个坐标,一个空间,在这个空间里边有很多的样本比如说圆形的点和叉形的点,这样的两类样本;

感知机(Perceptron)-----最详细记录感知机_第6张图片那么对于我们的感知机模型,他实际上就是一个分类的超平面,那么这个超平面呢在二维的情况下,实际上他就是一条直线,这条线就对应于w\cdot x+b,对于这条线的话他的斜率就是w来确定的,实际上这个w是这个平面的法向量(就是直线的斜率)来控制他的倾斜程度的;这个b就是截距,实际上我们要完成的就是通过这两个平面把这两类数据进行一个划分,那么我们可以找到这样一条直线或者说这样一个超平面,正好把两类数据给他切割开,放在这个平面的两边,那么这样的话我们就认为我们的感知机就完成了他的分类的功能,就可以把这些样本分离成正、负两类。对于sign函数看他大于0还是小于0实际上是看他在超平面的哪一侧。也就是说他的夹角,这个每一个样本它对应的向量的夹角,是和法向量夹角之间的一个关系,如果他是正向范围说明他就是一个正例;如果和他是逆向的那么就是说明他在平面的另外一侧。(点积在参数向量上的投影为正则为正类,点积投影为负则为负类,点积投影为0为决策边界(只有两向量互相垂直,点积投影为0,所以参数向量垂直于决策边界。))

感知机(Perceptron)-----最详细记录感知机_第7张图片感知机(Perceptron)-----最详细记录感知机_第8张图片

3、感知机学习策略

有了模型之后我们就需要确定模型的参数;模型的参数就是w和b,权重和参数b,这个bais这个偏置参数b。我们希望找到一个好的w和b,来得到那个确定好的分类的超平面,能够把所有的样本进行非常好的划分。

做法:实际上学习的策略就是要为我们的感知机模型或者任意一个模型来定义一个损失函数(损失函数就是我们来衡量一下当前这个模型他的性能来说对于我们已知的样本他分类的准不准。有一个训练数据,他在训练数据上有多少是对的,有多少是错的,那些他犯错的地方就是他带来损失的地方),怎么衡量一个模型在数据上的损失呢?有两种选择:其一是误分类点的数目。其二是误分类点到超平面的总距离

感知机(Perceptron)-----最详细记录感知机_第9张图片||w||就是\left \| w \right \|=\sqrt{\left (w_{1} \right )^{2}+\left (w_{2} \right )^{2}+\cdots +\left (w_{n} \right )^{2}},对于所有的误分类点,如果把绝对值给他去掉的话由|w\cdot x_{i}+b|变成(w\cdot x_{i}+b)这个部分实际上就会有可能有正有负,这就是他的预测结果他的符号,y_{i}是他实际的一个真实的类别,对于这个x_{i}来说如果他是一个误分类点,那么我得到的结果假如是(w\cdot x_{i}+b)=-2(函数值最后要经过sign函数符号变换才会成为+1或者-1;),但是他真实的标签y_{i}=+1,所以前边再加上一个负号,这三者相乘的话他就会变成大于0,也就是说我通过这种方式就可以找到某一个点\left ( x_{i},y_{i} \right )与我们现在的wb模型来进行计算在这个等式情况下他满足大于0,那么就说明这个点被分类是错误的,也就是说我实际上预测的这个值的符号和他真实的类别的符号是不一致的,那么他就是负的。我们的目标是希望这些误分类点越少越好,当我所有的点都分类正确的时候,这些误分类点他就没有了,总距离就趋近于0了(最理想情况下就是0)。所以这个总的距离实际上就表明了我的当前的他的模型这个效果,在训练集上的效果如何。通过这样总的距离来间接地得到损失函数,表明我当前的这个模型在当前的w和b 的情况下是好还是不好。怎么样是最好呢?我希望找到一个w和b,使得这个总距离是最小的。这样我就找到了一个能够把所有的正例和负例都分开的这样的一个超平面了,因为w和b就确定了这样的一个超平面。

感知机(Perceptron)-----最详细记录感知机_第10张图片感知机的学习问题就转化为如何使的这个函数最小化。因为\frac{1}{\left \| w \right \|}这个对求极值是没有影响的。在他最小化时候的那个w和b就是我们的模型最终学习到的结果。

对函数的极值进行求解的时候,最基本的算法叫做梯度下降法。所有的梯度下降法第一步都要初始化。所谓初始化就是把里边未知的参数我要给他赋一个值。对于这里随机的对w和b进行初始化实际上就是随机的选择了一个超平面。

感知机(Perceptron)-----最详细记录感知机_第11张图片\eta是我们对参数进行优化放缩的,下降的步长。\eta取的很大,那么他的下降速度就会很快。在更新的时候为什么\sum没有了呢?因为我们是一个分类点一个分类点的去考虑,那么这是对所有分类点的一个计算。

算法分解:

1、输入;(是训练集和学习率)

对于这个算法来说数据的输入首先要有一个训练的数据集,对于感知机来说他是一个监督学习算法,他是有监督的,所以他的数据都是以输入的向量和他所对应的类别标签形成的一个样本,\left ( x_{1} ,y_{1}\right )是第一个样本,一直到\left ( x_{N} ,y_{N}\right )是第N个样本,构成了一个包含有N个样本的训练数据集T,其中每一个输入的x_{i}他都是一个n维的实数向量,i是从1到N,有N个样本。他的输出空间是+1或者-1,他本质上是一个二类的分类模型。Binary class。另一个参数学习率\eta也是我们认为指定的,就是我们以一个什么样的学习率来更新我们的参数(这个不是我们学习得来的,而是通过人工经验来设置的一个参数)。

2、输出;(使我们要学习的模型参数w和b)

实际上就是找到f(x)函数,该函数实际上就是确定w和b。有了w和b以后输入x的话我就可以给你算出相应的值来。实际上输出就是这个w和b就是这个权重向量和偏差。

3、算法流程;

感知机(Perceptron)-----最详细记录感知机_第12张图片

(1)初始化w和b。

(2)在训练集当中逐个的选取训练数据的样本,比如说i从1到N逐个的选取。(循环遍历所有的数据样本)

(3)如果选取的样本满足y_{i}(w\cdot x_{i}+b)\leq 0,这就意味着用我当前的w和b,得出来的分类是错了,也就是说我现在这个模型对\left ( x_{i} ,y_{i}\right )分类是有误的。(整体为负说明我计算的这部分(w\cdot x_{i}+b)结果的符号就是正负的这个符号,和y_{i}他真实的符号是不一致的,所以他就小于0吗所以我分类是错误的。(本来两者应该是同号的才表示分类是正确的))如果对\left ( x_{i} ,y_{i}\right )分类是错误的,那么我就要更新w和b。更新的方法就是现在的当前的w或者b加上他的偏导乘以学习率,这样的话我就得到一个新的w和b,这就更新了w和b。

(4)更新完w和b之后接下来就是一个循环的过程,就转回到(2),再接着从训练集里边选取新的数据,下一个数据,新的一个\left ( x_{i} ,y_{i}\right ),如果他分类错误了我继续还是更新w和b。一直到我把所有的数据都能够正确分类了,直至训练集中没有误分类点,也就是这个算法我们把他称之为收敛了,结束了。因为我把所有的训练集我都能够正确分类了。那么我的模型就到此学习过程就结束了。(这里有一个疑问是要把N中的每一个点都测试一遍吗????)

实例演示:

我的训练数据集中有三个样本,两个正例,一个负例。点x_{1}标签是+1,即\left ( x_{1} ,+1\right )。点x_{2}标签是+1,即\left ( x_{2} ,+1\right )。点x_{3}标签是-1,即\left ( x_{3} ,-1\right )。每一个样本都是一个二维的向量,即点x_{1}x_{2}x_{3}分别有两个维度x^{\left ( 1 \right )}x^{\left ( 2 \right )}

感知机(Perceptron)-----最详细记录感知机_第13张图片

感知机(Perceptron)-----最详细记录感知机_第14张图片w是一个向量,两个维度都等于3。

感知机(Perceptron)-----最详细记录感知机_第15张图片在某一时刻遍历了所有的样本,发现也就是本例子在第8步的时候,迭代到第8步的时候发现误分类点就没有了,那说明我们这个算法就都是正确的啦。就是最终的感知机模型的学习的结果。

-------------------------------对感知机算法的理论分析

感知机学习算法是通过迭代,一次一次的去更新我们的w和b,来完成这个学习过程,那么这样我们就有必要去确定这个算法是不是具有收敛性。(意思就是因为我们这个是一个迭代更新的算法,我们就要确保这个算法他是能够通过这样的这个有限次的迭代,有限次的更新来达到一个最终的收敛情况,也就是说他能够通过有限次迭代把训练集完全的划分;如果说存在一个训练集我不管进行多少次迭代,我都不可能把训练集进行完全的划分,那么按照我们的算法他就没有办法退出这个迭代,就是无限循环下去,那么这个算法实际上就是没有办法被完成的,也就是他无法找到那个优化目标的最优解。)

在有限的迭代次数里面,为了确保我们能够得到感知机模型,要进行分析:(也就是收敛性)

定理1:(在这样的一个数据集上,他存在一个可以正确分离所有样本的这样的一个超平面)

感知机(Perceptron)-----最详细记录感知机_第16张图片感知机(Perceptron)-----最详细记录感知机_第17张图片感知机(Perceptron)-----最详细记录感知机_第18张图片

定义模为1,即\left \| {\hat{w}_{opt}} \right \|=1是为了更一般化的说明结果,它不影响平面的角度以及其他分割的特性。

定理2:(是说我们要找到这样的一个超平面,他所需要的这样的一个迭代次数,他不是无限的,他是有一个上界的,如果他满足了有一个上界的这样的一个情况,我们就可以说我们的算法他肯定是能够确保是收敛的,他不会无限的循环下去,他不会无限的迭代下去)(如果把这个定理证明的话,我们就可以确定我们的感知机算法他是收敛的)

令R为x模的最大值,即;K是训练集上的误分类次数(我们知道对于算法来说每发生一次误分类,我就要进行一次更新,一次更新就意味着是一次迭代,如果这个误分类次数实际上就是我们的迭代次数,这里k小于等于某一个数,表明他不会是无限的增大下去,无限的迭代下去,他是会在有限的次数里面结束的)

感知机(Perceptron)-----最详细记录感知机_第19张图片{\hat{w}_{k}}表示使我们第k次更新完之后得到的新的w{\hat{w}_{opt}}表示最终的、最优的能够把所有的样本都正确分类的那个wk就是犯错的迭代的次数,\eta是学习率,\gamma是之前定义的最小的分类的那个距离。之后将不等式左边式子展开,左边的{\hat{w}_{k}}可以写成{\hat{w}_{k}}={\hat{w}_{k-1}}+\eta y_{i}{\hat{x}_{i}}之后再乘以一个{\hat{w}_{opt}}乘进去。因为我们的{\hat{w}_{opt}}是最优的那个超平面,所以由第一个定理我们知道y_{i}{\hat{w}_{opt}}{\hat{x}_{i}}\geq \gamma,所以带入之后=号就变成了\geq;之后的{\hat{w}_{k-1}}还可以像上次那个再展开、之后迭代展开,展开到最后就可以把它归结到他是大于等于k\eta \gamma的。

感知机(Perceptron)-----最详细记录感知机_第20张图片不等式左边展开后,中间项2\eta y_{i}{\hat{w}_{k-1}}{\cdot \hat {x}_{i}}其中y_{i}{\hat{w}_{k-1}}{\hat{x}_{i}}这个部分就是一个分类的函数,对于k-1来说,它是对\left ( x_{i} ,y_{i}\right )不能正确分类的,所以这部分是一个小于0的数。当把这部分小于0的数拿掉的话,就相当于没有减去这部分,则整个式子就会变大,所以右边就会变大,由=变成\leq;再往下推导,因为我们在前边定理的时候已经给了R是对于所有的模的最大值,所以把这个模变成R^{2}的时候他就又变大了。之后再把{\hat{w}_{k-1}}继续再往下退化到{\hat{w}_{k-2}}的情况,那么就会变成了2\eta ^{2}R^{2},一直往下拆分,一共有k次,所以就是k\eta ^{2}R^{2}

感知机(Perceptron)-----最详细记录感知机_第21张图片感知机(Perceptron)-----最详细记录感知机_第22张图片两个向量的点乘一定是小于两个向量的模的乘积(线代性质),即{\hat{w}_{k}}\cdot {\hat{w}_{opt}}\leq \left \| {\hat{w}_{k}} \right \|\left \| {\hat{w}_{opt}} \right \|,而我们前边已经限定了\left \| {\hat{w}_{opt}} \right \|=1模为1,即使他不是1的话,他也是一个常量,也不影响我们的证明。将\left \| {\hat{w}_{k}} \right \|此处取平方就是我们的第2个不等式。将前边k\eta \gamma也取平方就整理出来下边的不等式。这就是我们要证明的第2个定理的结论,k他是有一个上界的,也就是我们的迭代次数它是有一个上界的,不会无限的循环下去。因此我们说感知机的算法他是收敛的。

感知机(Perceptron)-----最详细记录感知机_第23张图片误分类次数也就是迭代更新次数他是有上界的。首先强调训练数据集是线性可分的,为我们的感知机才是收敛的;如果训练数据集本身就是线性不可分的,那我们的感知机他就没办法保证所有的数据都能够正确的分类。所有的证明前提都是他是一个线性可分的训练集。

---------------------------感知机的另外有一种形式:感知机学习对偶形式--------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考链接:https://www.bilibili.com/video/BV197411T7i6?p=2

https://www.cnblogs.com/huangyc/p/9706575.html

 

你可能感兴趣的