07_支持向量机

  今天是2020年2月17日星期一。别的不多说了,简单谈一下学习感受。这两天看SVM的知识点,多多少少有些崩溃,写这个笔记也是百般难受,理解知识点需要过程,尤其数学基础差。简单的东西一般都很容易就能获得,重要的东西往往复杂因而难得。学习需要反复,暑期看的SVM白板推导部分,现在重新看一遍收获很大,感觉第一遍就是在看热闹,学习还是需要多深入,尽最大可能搞明白,学一个是一个,囫囵吞枣等于没学。距离2021年毕业还有一年半的时间,日子好像又回到了去年这个时候,尽心尽力准备考研,没考上理想学校,生活却不能因此止步。现在又到了新的起点,仍然需要继续向前,那么接下来的一年半,把公众号搞起来,机器学习+深度学习。


 GitHub:https://github.com/wangzycloud/statistical-learning-method


 支持向量机

引入

  SVM的学习有个阶段,每个阶段解决不同的问题,越深入模型越复杂。简单模型是复杂模型的基础,吃透简单模型,复杂模型就迎刃而解了。

  首先SVM也是一种二类分类模型,是定义在特征空间上的间隔最大的线性分类器,还记得感知机算法吧,是应用误分类点到分离超平面距离最小的学习策略,支持向量机的学习策略是间隔最大化。可以形式化为数学上的凸二次规划问题,SVM的学习过程可以看成是凸二次规划问题的最优化。

  在感知机算法中,我们寻找一个能够将所有线性可分数据集进行二类分类的分离超平面。从感知机学习算法的对偶形式中可以发现,学习过程是先给定一个超平面,测试有没有误分类点,有的话就调整一下,调整的方向是误分类点距离超平面减小的方向。接着继续测试,直到找到没有误分类点的超平面,找到了就停了,只需要该超平面能够将数据分离开就可以,没有别的要求SVM算法同样是寻找分离超平面,但合格的超平面有且仅有一个,以线性可分数据集为例,找到的分离超平面不仅能将所有数据分好类,还要求距离最近的实例点保持最远距离,也就是所谓间隔最大化。

  前边说SVM学习有个阶段,由易到难,分别是数据集线性可分时的线性可分支持向量机模型、数据集近似线性可分时的线性支持向量机模型、数据集线性不可分时的线性支持向量机模型,外加序列最小最优化算法。本节先来看一下线性可分支持向量机与硬间隔最大化。

(1)线性可分支持向量机

线性可分支持向量机定义

  讨论模型定义前,仍旧是先交待一下输入输出。书中讲到了输入空间到特征空间的转换,能力有限,对欧氏空间、希尔伯特空间不理解,但是按照之前的学习思路,模型都是针对特征空间上的特征向量进行操作,这里自然不可避免的要进行这个转换。区别在于转换规则,本节记录的线性可分支持向量机以及第二节的线性支持向量机,是采用一一对应的关系将输入空间中的输入映射为特征空间的特征向量,实际上没什么变化。而在第三节非线性支持向量机的学习中,这个转换规则起到了非常大的作用,将输入空间中线性不可分的数据通过非线性映射,映射到高维特征空间,再进行模型学习。

  我们知道,当训练数据集线性可分时,存在无数多个分离超平面可以将两类数据正确划分开,在感知机算法中,我们利用误分类最小的策略,可以求出一个分离超平面,不过这时可以有无数个超平面。

   如图7.1所示,数据集线性可分有很多个超平面都可以将两类数据正确划分,但在SVM算法中,通过间隔最大化求解,我们能够找到将两类数据正确划分且间隔最大的直线。

函数间隔和几何间隔

  这两个概念在感知机算法章节出现过,当时的理解比较浅薄,现在再来仔细的看一下。明确一点,纵轴不是y,丢掉这个先入为主的概念,后边就好理解。在图7.1中,有A、B、C三点表示三个实例,且都位于分离超平面正类一侧,可以看到A点距离超平面比较远,我们可以认为A点能确切的被该超平面分为正类;相反C点,距离超平面很近,被划分到正类的确信度比较小。在这个例子中,我们默认把一个点距离分离超平面的远近表示分类预测的确信程度,这类似感知机中的“距离”度量方式。

  再看一下感知机算法中的图2.1和当时给出的理解。

  以该分离超平面的模型参数w,b作为基准,任一点x0由公式w·x0+b=?,得到值?,实际上,可以将w·x0+b-?=0视作平移的超平面。这里平移的值|?|作为x0到超平面S的距离值。这样的解释,符合我们对图像上对点到距离的认知,也符合书上解释。在w·x+b=0确定的情况下,|w·x+b|能够相对地表示点x距离超平面的远近。

  由于我们能够通过w·x+b的符号与类标记y的符号是否一致,来表示分类是否正确。因此,可以用量y(w·x+b)来表示分类的正确性以及确信程度,这就被称为函数间隔。

  有了函数间隔的概念,我们再来看“间隔最大化”中的“间隔”是什么。回忆下感知机算法,所有误分类点到超平面的总距离作为要优化的目标函数,也就是每个误分类点都要参与到分离超平面的选择中。定义7.2,这里的“间隔”取到的是训练数据集中所有样本点距离超平面函数间隔的最小值。思考一下,SVM应该不是误分类点驱动的算法,因为到目前为止,没有提到错误分类的事情,难道是由所有正确分类的实例点来选择分离超平面吗?从感知机、K近邻算法,我们可以发现一个套路,但凡出现“距离”度量的时候,模型思路基本就快出现了。那么,在SVM算法中,如果不是所有正确分类点驱动的分类算法,难道像定义7.2所示,是由函数间隔距离超平面最近的实例点决定的吗?

  本小节标题叫函数间隔与几何间隔,既然我们已经找到了度量“距离”的标准—函数间隔,那么几何间隔的作用是什么呢?

  直白一点说几何间隔就是我们高中学的点到直线的距离公式。直观上函数间隔表达了实例点到超平面的远近和确信度,但在数学计算上,存在一定的缺陷,如下所示:

  第一个超平面  :w·x+b=0

  某点的函数间隔 :h=w·x+b

  第二个超平面  :2w·x+2b=0

  此时,函数间隔 :2h=2w·x+2b

  可以发现第二个超平面其实和第一个超平面是一个,但此时函数间隔却翻了倍。原本我们希望找到“间隔”最大的分离超平面(找到间隔最大时候的参数w,b),现在好了,只要w,b成比例的放大,间隔距离可以到无穷大,这就没有解了,没什么意义。尤其是我们不止需要分离超平面平移着调整,我们还需要分离超平面偏斜着调整,并且要保证调整后,最近处的实例点到分离超平面的“距离”有可比性。从刚才函数间隔的公式里,可以看到向量w在这里有不小作用,这个w作为超平面的法向量,每个超平面都有自己的法向量,距离的求解也需要这个法向量,我们是不是可以对这个法向量进行约束呢?固定||w||=1,反正本来在函数间隔的计算上,只要成比例的缩放,都不影响该平面的位置。

  这就好像看地图,一人一张地图回答两个地点多远,李华说A到B十厘米,小明说A到B二十厘米,可这都不是真实距离,用的比例尺都不一样,不能简单的用图上距离比较远近。如果给他们相同的比例尺,再问他两个,这时得到的图上距离肯定是相同的,但这也不是真实距离,A和B点的真实距离还要用图上距离除以比例尺。但是现在,固定比例尺是可行的,至少可以进行距离的比较,再如果比例尺是1:1呢,图上距离不就是实际距离了?

  前文提到,对法向量进行标准化,固定||w||=1,或者随便规定成别的数字,只要具有约束性,就可以避免函数间隔的缺陷,那干脆固定为1好了。这时的函数间隔就成为了几何间隔,这就好比固定住了比例尺,大家都要把法向量的长度定为1,再去相互比较,单位长度乘以数量就成了两点间距离。

  图7.2给出了超平面(w,b)及其法向量w,点A表示某一实例xi,其类标记为yi=+1,点A与超平面的距离由线段AB给出,记为(其中w,b成比例变化不改变超平面,||w||=1):

  其实也就是:

  看一下具体的几何间隔的定义:

  样本点被超平面正确分类时的几何距离,一般是实例点到超平面的带符号的距离;用于相互比较时,对法向量进行约束再比较。另外,需要注意到数据集T关于超平面(w,b)的几何间隔,仍然是取所有样本点距离超平面几何间隔的最小值。学完“支持向量”这个概念,再来看这个地方,就能知道在定义部分就透露出SVM的分离超平面仅由起关键作用的支持向量决定。

  如果||w||=1,那么函数间隔和几何间隔相等,如果超平面参数w和b成比例地改变(超平面没有改变),函数间隔也按此比例改变,而几何间隔不变。

间隔最大化

  前边提到,SVM的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。对线性可分的训练数据集而言,线性可分分离超平面有无穷多个(如感知机),但是几何间隔(min γ)最大的分离超平面是唯一的。这里的间隔最大化又称为硬间隔最大化,与下节要讨论的训练数据集近似线性可分时的软间隔最大化相对应。

  直观来说,硬间隔最大化对训练数据集找到几何间隔最大的分离超平面来说,是以充分大的确信度对训练数据进行分。也就是说不仅能将正负实例点分开,而且对最难分的实例点(距离超平面最近的点)也有足够大的确信度将他们分开,这样的超平面应该对未知的新实例有很好的分类预测能力。

  如何求得几何间隔最大的分离超平面呢?形式上可以表示为约束最优化问题:

  书中考虑到几何间隔和函数间隔的关系,将问题进行改写得到:

  给出的解释是函数间隔的取值不影响最优化问题的解,原因是将w,b按比例变化,函数间隔也等比例变化。对最优化问题里的不等式约束7.12没有影响,同时对目标函数7.11的优化也没有影响,这一点很好理解。问题是为什么要由几何间隔再次转换到函数间隔上来求解。按照书本中接下来的解释,既然函数间隔在该目标函数和不等式约束条件下,对最优化问题不影响,那为什么不把这条性质利用起来?于是,产生了一个等价的优化问题,令函数间隔为1时,对优化问题求解。另外,注意到最大化1/||w||和最小化1/2*||w||2是等价的,于是得到下面线性可分支持向量机学习的最优化问题:

  这里再来考虑一下这个过程,公式7.13和公式7.14表示的最优化问题最后由函数间隔转化过来,这中间为什么要插入几何间隔?我的理解是,在距离比较时,几何间隔的确解决了函数间隔存在的问题。我们优化的目标是找到间隔最大时候的分离超平面,超平面由法向量w表示,实际上我们就是要找到合适的w。“间隔”所代表的距离,其实是表面现象(w影响距离),距离背后的比较,是w,那么我们固定间隔距离值,直接比较w好了。

  这里就不在复述书本上凸优化问题的描述了,只要知道现在求解的最优化问题符合凸优化情景就好了,就可以应用凸优化的知识来求解。

  综上所述,我们可以得到最基础的线性可分支持向量机的学习算法—最大间隔法。

最大间隔分离超平面的存在唯一性

  待证,w看懂了,b的证明还没看懂。有时间了腾上来。

支持向量和间隔边界

  在线性可分的情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例称为支持向量,支持向量是使约束条件式7.14等号成立的点,即:

  注意到H1与H2平行,并且没有实例点落在它们中间,分离超平面位于直线H1与H2的中间,两直线的距离称为间隔,从求解过程可以看到,间隔依赖于分离超平面的法向量w,等于2/||w||,H1和H2称为间隔边界。

  在决定分离超平面时只有支持向量起作用,而其它实例点并不起作用。如果移动支持向量,将改变所求的解;但是如果在间隔边界以外移动其它实例点,甚至去掉这些点,则解是不会改变的。由于支持向量在确定分离超平面中起着决定性作用,所以将这种分类模型称为支持向量机。支持向量的个数一般很少,所以支持向量机由很少的“重要的”训练样本确定。

  其实到这里,SVM间隔最大化算法已经可以得到最优解,得到分离超平面了,下面看一个例子。至于接下来的对偶算法,就像感知机的对偶算法一样,从另外的角度求解这个最优解。

学习的对偶算法

  在感知机算法中,我们提到过对偶是从一个不同的角度去解答相似的问题,问题的解是相通的。或者说原始问题求解复杂,我们通过求解一个相对简单的问题得到原始问题的解。那么在SVM模型的求解中,是否存在这样的对偶解法呢?在这里我们将公式7.13和公式7.14表示的求解过程视作原始最优化问题,应用拉格朗日对偶性,寻找并求解对偶问题,得到原始问题的最优解。

  这里对偶问题求解、KKT条件及证明打算新开一节,后补上。

  这里简单介绍一下,具体证明见补充部分。我们的原始问题是带约束的优化问题,不容易解。从微积分里我们知道不带约束的函数求最值,可以利用求极值的必要条件,求导就好了。现在拉格朗日函数做的,就是把有约束问题转化为无约束问题,再利用必要条件去求极值。因此先把公式7.13和公式7.14表示的最优化问题,利用拉格朗日数乘转化形式为:

  为什么会有这样的转换呢?我们要怎么理解呢?看一下这个极小极大过程。

  如果违反约束条件:

  如果不违反约束条件:

  所以,有:

  这个过程是好理解的。然后根据拉格朗日对偶性,原始问题的对偶问题可以转化为:

  为什么可以这样转化,以及转化之后的好处是什么,暂时不太理解。可能看过完整的推导,就能够得到答案。看的资料说这里存在弱对偶性,即:

  这是很好理解的,过程如下:

  该式成立,此时左端确定了参数w和b,并且是函数L(w,b,α)的最小值,此时w,b参数为常数,α为变量,可表示为函数f(α);同理,此时右端确定了参数α,并且是函数L(w,b,α)的最大值,此时α为常数,w,b为变量,可表示为函数g(w,b)。此时有:

  左端f(α)的最大值已经小于等于L(w,b,α)的最小值了,那么无论α取到什么值,都要小于等于L(w,b,α)的最小值,最多就是取到最大值,和L(w,b,α)的最小值相等,右端同理。故:

  如果满足另外的条件达到强对偶性,则有:

  接下来依次看一下求解过程:

  于是,原始最优化问题7.13和7.14,转化为对偶最优化问题7.22-7.24。可以看到对于线性可分训练数据集,利用对偶问题最优化的解α可以得到原始问题的解。有以下定理:

  证明如下:

  分离超平面可以写成:

  分类决策函数可以写成:

  由此,得到了线性可分支持向量机的对偶形式,该分类决策函数只依赖于输入x和训练样本输入的内积。对于线性可分训练数据集,可以首先求对偶问题7.22-7.24的解α;再利用7.25和7.26求得原始问题的解w,b;从而得到分离超平面及分类决策函数。这种算法称为线性可分支持向量机的对偶学习算法,是线性可分支持向量机学习的基本算法。

  在式7.25、式7.26中,可以看到w,b只依赖于训练数据集中对应于α>0的样本点,其它样本点对w,b没有影响。我们将训练数据中对应于α>0的实例点称为支持向量。

  根据KKT条件,可以看到xi一定在间隔边界上,这里的支持向量的定义与前面给出的支持向量的定义是一致的。

(2)线性支持向量机

引入

  上节讲到的线性支持向量机仅适用于数据集线性可分的情况,这是比较理想的情况。但是生活中的实际例子,往往充满着例外,数据集不总是友好。线性不可分或者近似线性可分的情况更多,怎么才能把SVM的思想扩展到线性不可分问题上呢?这就需要修改硬间隔最大化,使其可以容忍少数错误实例点的存在,变更策略为软间隔最大化。

线性支持向量机

  先来看一下输入输出情况。

  线性不可分意味着找不到一个合适的分离超平面,不能够把所有数据完美的划分成两个部分,这归结于特异点的存在。那么我们是不是可以考虑将特异点排除在外,或者说允许特异点存在,也就是我们尽可能的找到一个能够将数据集中大部分样本点正确分类的超平面。这会导致某些样本点(xi,yi)不能满足函数间隔大于等于1的约束条件,为了解决这个问题,可以对每个样本点(xi,yi)引进一个松弛变量ξ≥0,使函数间隔加上松弛变量大于等于1,这就相当于给每个样本点留点余地,只要该样本点本身的函数间隔大于等于差值(1-ξ)了,我们就认为确信度足够了。

  这样,约束条件变为:

  目标函数也需要改变,“允许一些错误存在”时,为目标函数上添加正则化项。对每个松弛变量ξ,增加一个代价ξ,目标函数变为:

  C的存在类似于正则化中的调和系数,调整误分类点占比程度。有了该思路,就可以和训练数据集线性可分时一样来考虑线性不可分时的线性支持向量机的学习问题。相应于硬间隔最大化,它被称为软间隔最大化。由此,可以得到线性支持向量机的原始问题:

  下面给出线性支持向量机的定义:

学习的对偶算法

  先来看一下原始问题的对偶问题具体是什么样子:

  类似线性可分向量机的学习过程,现在来看一下推导过程,如何由原始问题得到对偶问题。首先:

  接着是传统的求解过程,应用必要条件求偏导,令偏导为0。

  最后将目标函数7.44求极大转换为求极小,于是得到对偶问题7.37-7.39。可以通过求解对偶问题而得到原始问题的解,进而确定分离超平面和决策函数。为此,就可以定理的形式叙述原始问题的最优解和对偶问题最优解的关系。

  线性支持向量机学习算法:

  在步骤(2)中,对任一适合条件0<α<C,按式7.51都可求出b。

支持向量

   对照KKT条件(红框互补松弛条件),逐个分析下不同情况:

合页损失函数

  接下来我们分析一下线性支持向量机学习中的另外一种解释,回想一下SVM的思想,间隔边界上的支持向量决定分离超平面,对于远离间隔边界的实例,其实并不起作用。考虑一下本节的ξ,对于近似线性可分的数据集,我们允许存在一点点错误,用ξ表示。

  实际上对于远离间隔边界的实例点来说,ξ=0就可以,用不着这个松弛变量;只有y(w·x+b)<1的这些实例点才可以用的到,也就是落在该类间隔边界对侧的实例点。同时,松弛变量ξ=1- y(w·x+b)。即:

  这里可以使用合页损失函数来表示,该函数形式为:

  下标“+”表示取正值的函数,由此可以得到另外一种目标函数:

  这里我们看一下原始最优化问题与新的目标函数是否等价:

  接下来我们看一下合页损失函数的图形:

  可以看到该函数的形状像一个合页,所以叫做合页损失函数。图中还画出了0-1损失函数,可以认为它是二类分类问题的真正的损失函数,而合页损失函数是它的上界。由于0-1损失函数不是连续可导的,直接优化其构成的目标函数比较困难,可以认为线性支持向量机是优化由0-1损失函数的上界(合页损失函数)构成的目标函数。

  图中虚线显示的感知机算法的损失函数[-yi(w·xi+b)],当样本点(xi,yi)被正确分类时,损失是0,否则损失是-yi(w·xi+b);相比之下,合页损失函数不仅要求分类正确,而且确信度足够高时损失才为0,也就是说损失函数对学习有更高的要求。

(3)非线性支持向量机与核函数

引入

  前文讲到,对于近似线性可分的问题,我们容忍出现一点点错误,给每个实例点加一个松弛距离,利用松弛变量来得到分离超平面。如果数据集完全线性不可分,我们要怎么做呢?这时可以使用非线性支持向量机,该方法利用核技巧,将低维空间中线性不可分的数据巧妙地映射到合适的高维空间(这时数据线性可分了,有定理),在该高维空间中利用硬间隔最大化或者软间隔最大化求解分离超平面。

核技巧

  通过引入部分的介绍,可以看到整个非线性向量机最关键的地方就在于核技巧,“核技巧”是什么?为什么可以这样做?怎么做的?理解了这三个问题,非线性支持向量机就大概了解了。在开始看该章节内容时,抽象的数学证明内容让人望而却步,感觉核技巧是一个玄而又玄的东西,尤其是核函数的定义7.6,怎么就是看不懂。在网上看了几遍“核函数的充要条件”证明,慢慢的明白了点,具体的证明过程暂时不能够写出来,这里只是简单的口头性描述下。

  在我的理解里,核技巧是处理某个问题的方式,该方式落实到具体,就是核函数;核技巧是思想,核函数是工具。数据在低维空间通过一定的映射关系,可以转换到高维空间,这是显而易见的;两个高维空间数据的内积值,需要先计算映射函数结果,再计算内积;核技巧可以应用在该过程中,计算高维空间中两个实例点之间的内积,可以不经过该映射函数,直接得到该内积值;换句话说,解决了寻找映射函数这个复杂的问题,直接得到高维空间中实例点之间的内积值。得到了内积有什么好处?低维数据升维有什么好处?且听我娓娓道来~

  先看一下非分线性分类问题,该问题是指利用非线性模型才能很好的进行分类的问题。看一个例子图7.7,左图是一个分类问题,图中实心点表示正实例,叉表示负实例,由左图可见,无法用直线(线性模型)将正负实例正确划分开,但可以用一条椭圆曲线(非线性模型)将他们正确分开。

  非线性问题往往不好求解,所以希望能用解线性分类问题的方法解决这个问题。所采取的方法是进行一个线性变换,将非线性问题变换为线性问题,通过解变换后的线性问题的方法求解原来的非线性问题。如图7.7所示,通过变换,将左图中椭圆变换成右图中的直线,将非线性问题变换为线性分类问题。

  看一下抽象的过程描述:

  原空间是二维空间,也就是该空间中的实例点向量由两个分量构成;新空间同样为二维空间,由两个分量构成特征向量;原空间到新空间的映射关系是,对原空间各个分量求平方,得到新空间的各个分量值。这时候椭圆方程的二次项转化成了一次项,原空间中的椭圆变成了新空间中的直线。

  这个例子说明,用线性分类方法求解非线性分类问题分为两步:首先使用一个变换将原空间的数据映射到新空间;然后在新空间里用线性分类学习方法从训练数据中学习分类模型。核技巧就是应用这种思想的方法。

核函数

  核技巧的想法是,在学习与预测中只定义核函数K(x,z),而不是显式的定义映射函数Φ。通常,直接计算K(x,z)比较容易,而通过Φ(x)和Φ(z)计算K(x,z)并不容易。并且映射函数是从输入空间到高维特征空间的转换,高维特征空间一般是高维的,甚至是无穷维的。除此之外,对于特定的核函数K(x,z),高维特征空间和映射函数的取法并不唯一,可以取到不同的特征空间,即便是同一特征空间也可以取不同的映射(这是数学家要考虑的...)。

  注意到在我们的线性支持向量机模型的对偶问题表示中,无论是目标函数还是决策函数都只涉及到输入实例与实例之间的内积,目标函数中的xi·xj可以用核函数K(xi,xj)= Φ(xi)·Φ(xj)来代替,此时对偶问题的目标函数变为:

  同时,分类决策函数中的内积也可以用核函数来代替,变为:

  这等价于经过映射函数Φ(x)将原来输入空间变换到一个新的特征空间,将输入空间中的内积xi·xj变换为特征空间的内积Φ(xi)·Φ(xj),在新的特征空间里从训练样本中学习线性支持向量机。也就是说,在给定核函数K(x,z)的条件下,可以利用解线性分类问题的方法求解非线性分类问题。通过核函数,学习是隐式的在特征空间中进行,不需要显式的定义特征空间和映射函数,这样的技巧称为核技巧,巧妙地利用线性分类方法与核函数解决非线性问题。

非线性支持向量分类机

  如上所述,利用核技巧,可以将线性分类的学习方法应用到非线性分类问题中,只需要将线性支持向量机对偶形式中的内积换成核函数。看一下精确定义及算法:

正定核

  书中该部分内容进行了大量的数学证明,我只是了解了其中少部分,具体的需要深入学习。算法是拿来用的,应用的时候,没必要这个证明过程,但是我们在学习的时候,还是需要大概知道这个东西。

  在我的学习中,“正定核”部分是在判断核函数K(x,z)是否能够成为“核函数”。已知映射函数Φ,可以通过Φ(x)和Φ(z)的内积求得核函数K(x,z),不用构造映射Φ(x)能否判断一个给定的函数K(x,z)是不是核函数?哎,该部分内容就是干这个的。

  其实我觉得更重要的,是熟练掌握常用的核函数。

  常用核函数的使用,弄完SVM算法代码后,找一个合适的数据和包进行测试。

序列最小最优化算法

  SMO算法要解如下凸二次规划的对偶问题:

  SMO算法是真够折腾人的,写SVM代码的时候,真的是扒了一层皮。手写推导和代码,专门写一篇。

代码效果

posted @ 2020-06-02 10:00  十八线码农ing  阅读(294)  评论(0编辑  收藏  举报