AI
菌
感知机可以说是最古老的分类方法之一了,今天看来它的分类模型在大多数时候泛化能力不强,但是它的原理却值得好好研究。
因为研究透了感知机模型,既可以发展成支持向量机(通过简单地修改一下损失函数)、又可以发展成神经网络(通过简单地堆叠),所以它也拥有一定的地位。
所以这里对感知机的原理做一个简介
感知机模型
感知机的思想很简单,比如我们在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。下面这张动图或许能够给观众老爷们一些直观感受:
放到三维空间或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。
当然你会问,如果我们找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分,也就意味着感知机模型不适合你的数据的分类。
使用感知机一个最大的前提,就是数据是线性可分的。这严重限制了感知机的使用场景。它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过激活函数和增加隐藏层来让数据可分。
用数学的语言来说,如果我们有m个样本,每个样本对应于n维特征和一个二元类别输出,如下:
我们的目标是找到这样一个超平面,即:
让其中一种类别的样本都满足
让另一种类别的样本都满足
从而得到线性可分。如果数据线性可分,这样的超平面一般都不是唯一的,也就是说感知机模型可以有多个解。
为了简化这个超平面的写法,我们增加一个特征x0=1 ,这样超平面为
进一步用向量来表示为:
,其中θ为(n+1)x1的向量,x为(n+1)x1的向量, ∙.
后面我们都用向量来表示超平面。
但除了 θ 称为权值,还有 b 称为偏置,故超平面的完整表达为:θ*x+b=0
而感知机的模型可以定义为y=sign(θ∙x+b) 其中:
如果我们将sign称之为激活函数的话,感知机与logistic regression的差别就是感知机激活函数是sign,logistic regression的激活函数是sigmoid。
sign(x)将大于0的分为1,小于0的分为-1;sigmoid将大于0.5的分为1,小于0.5的分为0。因此sign又被称为单位阶跃函数,logistic regression也被看作是一种概率估计。
感知机代价函数
好了,上面我们已经知道感知机模型了,我们也知道他的任务是解决二分类问题,也知道了超平面的形式,那么下面关键是如何学习出超平面的参数w,b,这就需要用到我们的学习策略。
我们知道机器学习模型,需要首先找到损失函数,然后转化为最优化问题,用梯度下降等方法进行更新,最终学习到我们模型的参数w,b。
我们很自然的会想到用误分类点的数目来作为损失函数,是的误分类点个数越来越少嘛,感知机本来也是做这种事的,只需要全部分对就好。
但是不幸的是,这样的损失函数并不是w,b连续可导(你根本就无法用函数形式来表达出误分类点的个数),无法进行优化。
于是我们想转为另一种选择,误分类点到超平面的总距离(直观来看,总距离越小越好):
距离公式如下:
而我们知道每一个误分类点都满足
因为当我们数据点正确值为+1的时候,你误分类了,那么你判断为-1,则算出来(w*x0+b)<>-yi(w*x+b)>0
当数据点是正确值为-1的时候,你误分类了,那么你判断为+1,则算出来(w*x0+b>0),所以满足-yi(w*x+b)>0
则我们可以将绝对值符号去掉,得到误分类点的距离为:
因为你知道,所以可以直接将绝对值去掉。那么可以得到总距离为(其中M为误分类点的数目):
这样我们就得到了初步的感知机模型的损失函数。
不考虑w范数分之一,我们可以得到损失函数为(之后我们会详细介绍范数):
总结一下!
感知机的模型是f(x)=sign(w*x+b),它的任务是解决二分类问题,要得到感知机模型我们就需要学习到参数w,b。
则这个时候我们需要一个学习策略,不断的迭代更新w,b,所以我们需要找到一个损失函数。
很自然的我们想到用误分类点的数目来表示损失函数,但是由于不可导,无法进行更新,改为误分类点到超平面的距离来表示,然后不考虑1/||w||,得到我们最终的损失函数!
为什么可以不考虑1/||w||,不用总距离表达式作为损失函数呢?
感知机的任务是进行二分类工作,它最终并不关心得到的超平面离各点的距离有多少(所以我们最后才可以不考虑||w||),只是关心我最后是否已经正确分类正确(也就是考虑误分类点的个数),比如说下面红色与绿线,对于感知机来说,效果任务是一样好的。
但是在SVM的评价标准中(绿线是要比红线好的,这个在学习向量机时你就会明白)
所以我们可以不考||w||,直接去掉它,因为这个时候我们只考虑误分类点,当一个误分类点出现的时候,我们进行梯度下降,对w,b进行改变即可!
这也回到了我们最初始想要把误分类点的个数作为损失函数
引入距离,只是将它推导出一个可导的形式!(最后说一句,我个人认为不去掉||w||,也是一样可以得到最后的正确分类超平面,就是直接用距离来当做损失函数也是可以的,可能是求梯度比较复杂,或者是感知机本身就是用误分类点来区分,就没用这个损失函数了)
学习算法
上面我们讲到了感知机的损失函数:
其中M是所有误分类的点的集合。这是一个凸函数,可以用梯度下降法或者拟牛顿法来解决,常用的是梯度下降法。
但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的
原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化
所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。
而感知机模型选择的是采用随机梯度下降,这意味着我们每次仅仅需要使用一个误分类的点来更新梯度。
而损失函数基于 w 与 b 的的偏导数为:
那么梯度下降公式为:
好了,到这里我们可以给出整个感知机学习过程算法!如下:
(1)选定初值w0,b0,(相当于初始给了一个超平面)
(2)在训练集中选取数据(xi,yi)(任意抽取数据点,判断是否所有数据点判断完成没有误分累点了,如果没有了,直接结束算法,如果还有进入(3))
(3)如果yi(w*xi+b)<>
那么进行参数更新!更新方式如下:
其中 n为步长在统计学习中又称为学习率
(4)转到(2),直到训练集中没有误分类点
AI
菌
关于感知机的理论知识就这样了,关于收敛性的证明与算法的对偶形式,感兴趣的同学可以进一步了解。
虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。
参考文献:李航—统计学习方法
不失初心,不忘初衷