首页 > 其他 > 详细

机器学习-感知机模型

时间:2019-10-19 11:30:31      阅读:46      评论:0      收藏:0      [点我收藏+]

机器学习-感知机模型

为什么学完了SVM甚至是神经网络模型之后才看感知机?因为emmm不知道为什么大脑里闪过了这个词,上网搜了一下,应该是之前翻李航的书时候看见的名词,本着物尽其用的想法就看了一下感知机的原理,还是有些收获的~

有一位博主写的很好!我就不再造轮子了,直接转载一下,再加上一些我自己的理解。

来源:https://www.cnblogs.com/pinard/p/6042320.html

感知机原理小结

    感知机可以说是最古老的分类方法之一了,在 1957 年就已经提出。今天看来它的分类模型在大多数时候泛化能力不强,但是它的原理却值得好好研究。因为研究透了感知机模型,学习支持向量机的话会降低不少难度。同时如果研究透了感知机模型,再学习神经网络,深度学习,也是一个很好的起点。这里对感知机的原理做一个小结。

1. 感知机模型

    感知机的思想很简单,比如我们在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。放到三维空间或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。当然你会问,如果我们找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分,也就意味着感知机模型不适合你的数据的分类。使用感知机一个最大的前提,就是数据是线性可分的。这严重限制了感知机的使用场景。它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过激活函数和增加隐藏层来让数据可分。

    用数学的语言来说,如果我们有 m 个样本,每个样本对应于 n 维特征和一个二元类别输出,如下:

    (??(0)1,??(0)2,...??(0)??,??0),(??(1)1,??(1)2,...??(1)??,??1),...(??(??)1,??(??)2,...??(??)??,*??**??*)(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),ym)

    我们的目标是找到这样一个超平面,即:

    ??0+??1??1+...+*??????**??*=0θ0+θ1x1+...+θnxn=0

    让其中一种类别的样本都满足??0+??1??1+...+????????>0θ0+θ1x1+...+θnxn>0 ,让另一种类别的样本都满足??0+??1??1+...+????????<0θ0+θ1x1+...+θnxn<0 ,从而得到线性可分。如果数据线性可分,这样的超平面一般都不是唯一的,也就是说感知机模型可以有多个解。

    为了简化这个超平面的写法,我们增加一个特征??0=1x0=1 ,这样超平面为∑??=0??????????=0∑i=0nθixi=0。进一步用向量来表示为: ?????=0θ?x=0, 其中??θ为 (n+1)x1 的向量,x 为 (n+1)x1 的向量, ??为内积,后面我们都用向量来表示超平面。

     而感知机的模型可以定义为:??=*??????**??(?????*)y=sign(θ?x) 其中:

*??????**??(??)={?11??<0??*≥0sign(x)={?1x<01x≥0

2. 感知机模型损失函数

    为了后面便于定义损失函数,我们将满足?????>0θ?x>0的样本类别输出值取为 1,满足?????<0θ?x<0的样本类别输出值取为 - 1, 这样取 y 的值有一个好处,就是方便定义损失函数。因为正确分类的样本满足 ???????>0yθ?x>0,而错误分类的样本满足 ???????<0yθ?x<0。我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小。

    由于*??**?????<0yθ?x<0,所以对于每一个误分类的样本??*i ,到超平面的距离是

    ???(??)?????(??)/||??||2?y(i)θ?x(i)/||θ||2,

    其中||??||2||θ||2为 L2 范数。

    我们假设所有误分类的点的集合为 M,则所有误分类的样本到超平面的距离之和为:

    ?∑????????(??)?????(??)/||??||2?∑xi∈My(i)θ?x(i)/||θ||2,

    这样我们就得到了初步的感知机模型的损失函数。

    我们研究可以发现,分子和分母都含有??θ, 当分子的??θ扩大 N 倍时,分母的 L2 范数也会扩大 N 倍。也就是说,分子和分母有固定的倍数关系。那么我们可以固定分子或者分母为 1,然后求另一个即分子自己或者分母的倒数的最小化作为损失函数,这样可以简化我们的损失函数。在感知机模型中,我们采用的是保留分子,即最终感知机模型的损失函数简化为:

    ??(??)=?∑????????(??)?????(??)J(θ)=?∑xi∈My(i)θ?x(i)

    题外话,如果大家了解过支持向量机,就发现支持向量机采用的是固定分子为 1,然后求1/||??||21/||θ||2的最大化。采用不同的损失函数主要与它的后面的优化算法有关系。

这里的类比其实是有点问题的,感知机和SVM在构建损失函数的时候采用的间隔其实并不是一样的:感知机采用的是函数间隔,而SVM采用的是几何间隔。只是他们表现的确实有点像。

关于SVM的为什么表现上也是将分子设置为1,但实际上用的依然是几何间隔,知乎这位答主说的比较清楚,这就是一个变量的代换:

来源:https://www.zhihu.com/question/325564129,Programs的回答

如果把 技术分享图片技术分享图片技术分享图片 同时放大或缩小 技术分享图片 即 优化目标变为:

技术分享图片

技术分享图片 (注意b也要同时放大的,它的变化和w一样)

技术分享图片

所以技术分享图片技术分享图片技术分享图片 同时放大或缩小 技术分享图片并不影响优化问题的解

为什么设置 技术分享图片

这个只是个代数变换,我们可以设置 技术分享图片

这时优化目标变为:

技术分享图片

技术分享图片

技术分享图片

因为 技术分享图片 都是变量,所以这个时候做一次代数替换 技术分享图片 ,优化目标变为:

技术分享图片

技术分享图片

weight和bias由什么符号表示并不重要,可以再次替换 技术分享图片

优化目标便是书上写的形式,可以看到上式右端 技术分享图片 变为了 技术分享图片

但是同样的变换,能用在感知机上面吗,比如我们设置λ为1/w然后把分母化掉?这当然是不可以的啊,因为w是一个向量,而我们限制λ是一个数,他们怎么整也整不成1.所以感知机和SVM不同,它是纯粹采用的就是不包括1/||w||形式的函数间隔,而不是像SVM一样采用了几何间隔再消去分子的。

为什么感知机可以采用这种方式呢,知乎一位答主说的也比较好,我就摘录一下吧:

来源:https://www.zhihu.com/question/36241719,风渣的答案

感知机的前提是训练集线性可分。这意味着必须存在一个正确的超平面。

那么,不管几何距离还是函数距离,损失函数最后都要等于0。

换个说法。假设使用几何距离的损失函数记为 技术分享图片 ,使用函数距离的损失函数记为 技术分享图片 。那么 技术分享图片

这样似乎又产生了新的问题,那就是 技术分享图片技术分享图片 的解不一样该怎么办。

让我们翻开《统计学习方法》第33页:“但是例2.1说明,感知机学习算法存在许多解,......。为了得到唯一的超平面,需要对分离超平面增加约束条件。"

事实上,《统计学习方法》直到第7章才介绍函数间隔,就是因为感知机本来就不关心这个。所以,怎么方便怎么来。要不是不方便,他更愿意像这样 技术分享图片

ps. 说来也怪,既然这本书在很后面才介绍函数间隔,又为什么要在27页就提前说这个事情。

再ps. 感知机和SVM终究不是同一个算法。

感知机和SVM相比,限制性很明显:只能处理线性可分的问题。当然它再优化优化就是SVM了。

3. 感知机模型损失函数的优化方法

    上一节我们讲到了感知机的损失函数:??(??)=?∑????????(??)?????(??)J(θ)=?∑xi∈My(i)θ?x(i),其中 M 是所有误分类的点的集合。这个损失函数可以用梯度下降法或者拟牛顿法来解决,常用的是梯度下降法。

    但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的 M 集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降, 只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。如果对这几种梯度下降法的区别不了解,可以参考我的另一篇文章梯度下降(Gradient Descent)小结

    感知机模型选择的是采用随机梯度下降,这意味着我们每次仅仅需要使用一个误分类的点来更新梯度。

    损失函数基于??θ向量的的偏导数为:

    ??????(??)=?∑????∈*??**??(??)??(??*)??θJ(θ)=?∑xi∈My(i)x(i)

    ??θ的梯度下降迭代公式应该为:

    ??=??+??????????(??)??(??)θ=θ+α∑xi∈My(i)x(i)

    由于我们采用随机梯度下降,所以每次仅仅采用一个误分类的样本来计算梯度,假设采用第 i 个样本来更新梯度,则简化后的??θ向量的梯度下降迭代公式为:

    ??=??+*??**??(??)??(??*)θ=θ+αy(i)x(i)

    其中??α为步长,??(??)y(i)为样本输出 1 或者 - 1,??(??)x(i)为 (n+1)x1 的向量。

注意感知机随机梯度下降的时候用的样本都必须是误分类的,正确分类的不能用。

3. 感知机模型的算法

    前两节我们谈到了感知机模型,对应的损失函数和优化方法。这里我们就对感知机模型基于随机梯度下降来求??θ向量的算法做一个总结。

    算法的输入为 m 个样本,每个样本对应于 n 维特征和一个二元类别输出 1 或者 - 1,如下:

    (??(0)1,??(0)2,...??(0)??,??0),(??(1)1,??(1)2,...??(1)??,??1),...(??(??)1,??(??)2,...??(??)??,*??**??*)(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),ym)

    输出为分离超平面的模型系数??θ向量

    算法的执行步骤如下:

    1) 定义所有??0x0为 1。选择??θ向量的初值和 步长??α的初值。可以将??θ向量置为 0 向量,步长设置为 1。要注意的是,由于感知机的解不唯一,使用的这两个初值会影响??θ向量的最终迭代结果。

    2) 在训练集里面选择一个误分类的点(??(??)1,??(??)2,...??(??)??,*??**??)(x1(i),x2(i),...xn(i),yi), 用向量表示即(??(??),??(??))(x(i),y(i)),这个点应该满足:??(??)?????(??*)≤0y(i)θ?x(i)≤0

    3) 对??θ向量进行一次随机梯度下降的迭代:??=??+*??**??(??)??(??*)θ=θ+αy(i)x(i)

    4)检查训练集里是否还有误分类的点,如果没有,算法结束,此时的??θ向量即为最终结果。如果有,继续第 2 步。

4. 感知机模型的算法对偶形式

    上一节的感知机模型的算法形式我们一般称为感知机模型的算法原始形式。对偶形式是对算法执行速度的优化。具体是怎么优化的呢?

    通过上一节感知机模型的算法原始形式??=??+????(??)??(??)θ=θ+αy(i)x(i)可以看出,我们每次梯度的迭代都是选择的一个样本来更新??θ向量。最终经过若干次的迭代得到最终的结果。对于从来都没有误分类过的样本,他被选择参与??θ迭代的次数是 0,对于被多次误分类而更新的样本 j,它参与??θ迭代的次数我们设置为????mj。如果令??θ向量初始值为 0 向量, 这样我们的??θ向量的表达式可以写为:

    ??=????=1*??????**??(??)??(??*)θ=α∑j=1mmjy(j)x(j)

    其中*??**??mj为样本(??(??),??(??*))(x(j),y(j))在随机梯度下降到当前的这一步之前因误分类而更新的次数。

    每一个样本(??(??),??(??))(x(j),y(j))的????mj的初始值为 0,每当此样本在某一次梯度下降迭代中因误分类而更新时,????mj的值加 1。

    由于步长??α为常量,我们令*????=????**??βj=αmj, 这样??*θ向量的表达式为:

    ??=∑??=1*??????**??(??)??(??*)θ=∑j=1mβjy(j)x(j)

    在每一步判断误分类条件的地方,我们用 ??(??)?????(??)<0y(i)θ?x(i)<0 的变种 ??(??)∑??=1*??????**??(??)??(??)???(??)<0y(i)∑j=1mβjy(j)x(j)?x(i)<0 来判断误分类。注意到这个判断误分类的形式里面是计算两个样本??(??) 和??(??*)x(i) 和 x(j)的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时, 仅仅一次的矩阵内积运算比多次的循环计算省时。 计算量最大的判断误分类这儿就省下了很多的时间,,这也是对偶形式的感知机模型比原始形式优的原因。

    样本的内积矩阵称为 Gram 矩阵,它是一个对称矩阵,记为 ??=[??(??)???(??)]G=[x(i)?x(j)]

    这里给出感知机模型的算法对偶形式的内容。

    算法的输入为 m 个样本,每个样本对应于 n 维特征和一个二元类别输出 1 或者 - 1,如下:

    (??(0)1,??(0)2,...??(0)??,??0),(??(1)1,??(1)2,...??(1)??,??1),...(??(??)1,??(??)2,...??(??)??,*??**??*)(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),ym)

    输出为分离超平面的模型系数??θ向量

    算法的执行步骤如下:

    1) 定义所有??0x0为 1,步长??α初值,设置??β的初值 0。可以将??α设置为 1。要注意的是,由于感知机的解不唯一,使用的步长初值会影响??θ向量的最终迭代结果。

    2) 计算所有样本内积形成的 Gram 矩阵 G。

    2) 在训练集里面选择一个误分类的点(??(??),??(??))(x(i),y(i)),这个点应该满足: ??(??)∑??=1*????????(??)??(??)???(??)≤0y(i)∑j=1mβjy(j)x(j)?x(i)≤0, 在检查是否满足时可以通过查询 Gram 矩阵的????**??*gij 的值来快速计算是否小于 0。

    3) 对??β向量的第 i 个分量进行一次更新:????=????+??βi=βi+α

    4)检查训练集里是否还有误分类的点,如果没有,算法结束,此时的??θ向量最终结果为下式。如果有,继续第 2 步。

      ??=∑??=1*??????**??(??)??(??*)θ=∑j=1mβjy(j)x(j)

      其中*??**??βj 为??*β向量的第 j 个分量。

这里进行代换的目的就是使得判断的式子出现内积,之后就可以使用dynamic programming的思路建一张表保存结果,从而简化时间复杂度了。这里离推出核函数其实就是一步之遥了,但是感知机的损失函数限制了它分类非线性可分问题的能力

5. 小结

    感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)

机器学习-感知机模型

原文:https://www.cnblogs.com/jiading/p/11703123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!