1.SVM的基本思想
考虑用一个线性分类器对样本进行二分类,样本标签为。此时可能存在很多分类方法,它们有着不同的决策面,但是哪一个决策面最好呢?
用w表示决策面的法向量,样本的分类可以用x在法向量上的投影(w与x的内积除以w的长度就是投影大小),和决策面到原点的距离比较来判断。移项整理后,可以得到决策面的描述方程:
一个直观的想法是,我们选择两类样本正中间的那个决策面,如上图所示。对于这个决策面而言,
属于第一类的每个样本 都满足,
属于第二类的每个样本 都满足,
也可以把两个式子整合到一起,写成,使等号成立的样本点被称为支持向量(support vector)。
而两类样本的间隔可以用它们在w上的投影长度之差来计算,即
因此,现在的问题就是在样本点的约束下求最大间隔,即问题被转化为
注意到,这里面的c只是作为一个系数影响着w和b的大小,但它其实不影响我们的决策面选择,并且,最大化等价于最小化,我们可以将问题重写为
这就是一个凸二次规划问题,可以用现成的包求解,但我们还可以对它做更深入的研究。
2.软间隔与损失函数
我们知道,一个机器学习模型的目标函数一般有两项组成,一项与data和model有关,这一项决定与样本数据的吻合度,另一项只与model有关,可以控制模型的复杂程度,使其具有较强的泛化能力。而在这个问题中,显然我们的目标函数只有第二项,这是因为,我们的约束条件已经决定了决策面在训练样本上是100%正确的。
但是样本总是可能出现特例,那些不小心跑到对面的样本点很容易让我们的决策面出现过拟合。
如果我们允许决策面不满足其中一些样本呢?
这就引入了“软间隔”的概念,我们允许某些样本不满足约束,但要为他们找到相应的损失函数
最简单直观的损失函数就是0/1损失函数(下图中红线),即分类正确时损失为0,分类错误时损失为1。但这个函数不连续,性质不好,不利于我们求解目标函数,因而我们可以选择其他函数替代它。由于我们的目标是求解凸函数的最小值,替代时用它的上界会更好。
要取红线以上的函数,我们会想到用黑线替代,这就是hinge损失。但这个函数在z=1处不可导,这也不利于我们的计算,因此还可以采用指数损失,即图中绿线来替代。
现在来回顾一下实验二的逻辑回归,在逻辑回归中,有
对每一个样本,我们都能得到这样一个概率。显然我们希望,当真实标签y=0时,我们预测的概率能逼近1,即远大于0。而真实标签y=1时,能逼近0,即能远小于0。
真实标签对应了真实的概率分布,
我们预测的概率分布为。
我们可以用KL散度(也称为相对熵)来度量这两组概率分布之间的差异。给定两个概率分布P和Q,二者之间的KL散度定义为:
因此,真实概率分布与预测概率分布的KL散度为:
用KL散度作为损失函数,再加上正则项,我们可以写出逻辑回归的优化目标:
类似的,可以写出SVM的优化目标函数:
3.拉格朗日函数
我们先将SVM基本型的约束条件简化为等式约束,因为最终决定我们决策面的其实是那些等号成立的样本点。然后添加拉格朗日乘子λ≥0,得到拉格朗日函数
对w和λ求偏导等于0,即
从第一个式子可以看出,和这两个向量是共线的。我们可以把f(w)想象成一个碗,约束函数是碗上的一道裂纹
假如现在约束是不等式,会得到一个w的可行域。当可行域如上图所示时,显然f(w)的最小值在“裂纹”上取到。当我们采用梯度下降算法时,是斜向上与碗相切的(梯度指向最速上升方向),则垂直于“裂纹” (“裂纹”上h(w)处处相等),当w不在裂纹上时,可以沿着与相反的方向走,但走到裂纹上之后,就只能沿着裂纹走,而方向可以用夹角来判断。在最小值处,和共线了,也就意味着不会再向裂纹的任何一个方向移动了。
相反,如果可行域不是图中的阴影部分,而是碗的剩余部分,显然最小值在碗底,此时最小值与h(w)无关,也意味着λ=0。
4.对偶问题
一般的,对一个原始的规划问题:
对每条约束添加拉格朗日乘子后,它的拉格朗日函数为:
其中,需要注意的是,对于这个函数,其自变量是w,α和β而不仅仅是w。可以发现,当w满足约束条件时,由于g(w)非正,α非负,h(w)=0,故对于不同的α和β而言,f(w)就是这个函数的上界。也就是说,求解约束条件下f(w)最小值的问题被转化为求:
它的对偶问题是:
它们之间的关系有定理给出:
并且, 如果存在一组点使得中间的等号成立,就是强对偶。
为了简化问题,现在我们只考虑一组不等式约束,因为任意一个等式约束h(w)=0可以通过h(w)≥0和h(w)≤0给出。原问题和对偶问题之间的关系可以通过以下分析来更直观的展现:
由于g(w)≤0,f(w)是开口朝上的凸函数,可以大致画出w的可行域如图(也可能没有极小点,这没有关系)。而可以看成线性函数,即图中蓝线,显然是截距,是斜率。对于原问题而言,是先给定w,然后L的值会随α的变化而变化,显然α=0时截距最大。而对偶问题则先给定α,再让w动,即直线平移到与可行域下界相切时,截距最小。
如果L存在一些鞍点(saddle point)满足Karush-Kuhn-Tucker条件(KKT),即:
那么它同时是原问题和对偶问题的解。
现在回到我们的问题:
可以写出它的拉格朗日函数:
将问题转化为它的对偶问题:
首先关于w,b求L的最小值,即对w和b求偏导等于0:
将这些条件代入,可以消去拉格朗日函数中的w和b,就得到了:
现在对偶问题被改写成了如下形式:
看起来问题并没有得到简化,但稍后我们会看到,改写后的对偶问题蕴藏着一些很重要的事。
KKT条件中有:
这意味着只有少数α可以是非0(此时g(w)取0),即,只有支持向量中的样本点的α才可以不取0,其他的α都是0。而且,根据
,
我们就可以将w写成支持向量中的样本的加权组合:
,
对于一个新的数据z,只需计算
,
根据结果的正负来分类即可,而w不需要被明确的计算出来。在计算时,我们可以先固定其他的参数来求它的极值,又因为约束条件的存在,我们可以再选择一个来使它们可变,而仅仅优化这两个参数是十分快速的。通过反复的迭代,我们就能高效的求出所有α。
到此,我们可以给出一些SVM的解释。SVM中的w是一小部分样本的线性组合,这种“稀疏”的表示可以被看成KNN分类器构造的压缩。而我们的决策就是通过比较新数据z和我们支持向量中的点来进行的。
5.核函数
到目前为止,我们通过最大间隔的方式找到了一个线性分类器,但如果我们面对的样本不是线性独立的呢?
处理这个问题的核心思想是,低维空间里非线性的数据在高维空间是线性的(参考实验一,对于n次多项式f,f(x)的分布不是线性的,但升维到,就可以写成,此时它是线性的了)。因此,我们可以对非线性的数据做一个映射使它升维,就又可以采用线性分类器了。
一个简单的例子是“异或”问题,这个问题本身不能被线性分类器解决,但将二维的x升到六维后就能用线性分类器解决了。详细内容见下图:
再回顾一下SVM:
会发现数据在我们表达式中出现的形式只是彼此间的内积,那么,对于非线性可分问题,只要我们对数据升维后再求内积,就依然能用SVM解决了。于是我们定义核函数K:
例如,如果我们用于升维的映射函数是:
代入之后就可以得出核函数
显然解决问题的关键就是找到合适的核函数。
一些常见的核函数有:
线性核 (我们已经见过了)
多项式核 (例如上面的例子)
高斯核
等等。
关于核函数的选择,这个问题会直接决定我们模型的最终性能,但它的选择是一个未决问题,从而也诞生了多核学习(multiple kernel learning)。经验上,当数据情况不明时,我们可以先尝试高斯核。