机器学习笔记6——【支持向量机1】支持向量机的原理与推导
前言:以下为支持向量机学习笔记,参考教程:
【太...完整了!】上海交大和腾讯强强联合的机器学习与深度学习课程分享!-人工智能/AI/神经网络_哔哩哔哩_bilibili
线性可分与线性不可分
简单来说,线性可分就是可以用线性函数将两类样本分开。在二维中,表现为一条直线,在三维中为一个平面,而更高维中为超平面。如果不存在这样的线性函数,则为线性不可分。
事实:如果一个数据集是线性可分的,那一定存在无数多个超平面将各个类别分开。
支持向量机(Support Vector Machine)
支持向量机(简称SVM)最初是一种解决二分类的有监督学习算法,SVM的目的为:在给定两类样本的数据集的前提下,寻找一个将两类样本分隔开的超平面,并且使得两类样本之间的边界间隔(margin)最大化。最终得到的超平面被称为决策边界(decision boundary)。
示例(二维):
上面的三个超平面都可以将不同类别的样本分开,但是哪个是最好的呢?
如果这里判断超平面“好坏”的标准为哪条直线对样本误差的容忍程度最高,那么直线2显然是最好的。支持向量机就是基于最优化理论,来寻找线2的算法。
注意:在支持向量机中,样本输出值都是-1或1。
最大间隔分离超平面
上面那个图可能不太标准,红圈圈住的样本应该刚好在虚线上才对!
我们假定两类数据中间有一个超平面,将这个超平面向两边平移,直到刚好擦过样本为止(图中两条虚线),我们定义这两个超平面刚好经过的训练样本为这个数据集的支持向量(图中红圈所示样本),把这两个超平面中间的距离叫做间隔(margin)。支持向量机要找的是使间隔最大的那个超平面。并且,求得的超平面只能有一个,所以这个超平面应该处于上线两超平面的中间,即到支持向量距离相等。
于是,支持向量机寻找的最优分类超平面应该满足:
该超平面分开了两类
该超平面最大化了间隔
该超平面处于间隔的中间,到所有支持向量距离相等。
线性可分支持向量机(硬间隔)
线性可分的数学定义
一个训练样本集\({(\vec x_i,y_i)},i = 1 \sim n\) 线性可分,是指存在\((\vec w,b)\) 使得:
\(当 y_i = +1时,\vec w \cdot \vec x_i+b>0,\)
\(当y_i = -1时,\vec w \cdot \vec x_i +b<0\).
(注:有时会看到\(W^Tx_i+b\)的形式,意思都一样的。)
SVM目标函数
假定训练样本集线性可分,那么支持向量机寻找的最大化间隔超平面为:
已知训练样本集\({(\vec x_i,y_i)},i = 1\sim n,y_i = -1 or 1\);
求解\((\vec w,b)\)使得:
\(最小化(Minimize):\frac 1 2||\vec w||^2\)
\(限制条件:y_i(\vec w\cdot \vec x_i +b) \geq1,(i = 1 \sim n)\)
其中\(||\vec w||^2\) (向量w模的平方)为,\(||\vec w||^2 = w_1^2+w_2^2+...+w_m^2 = \sum_{i=1}^m w_i^2\)
我们可以看出,需要求的目标函数其实是凸优化(Convex Optimization)中的二次规划问题。关于目标函数求解,用的是拉格朗日乘子法以及拉格朗日对偶问题求解。拉格朗日乘子法和对偶问题暂时不叙述。这里直接使用凸优化求解包进行求解。
目标函数推导过程
事实1:
\(\vec w \cdot \vec x + b = 0\)与\(a(\vec w\cdot \vec x+b) = 0,(a \neq 0)\) 表示同一个超平面。
事实2:一个点\(X_0\)到超平面\(\vec w\cdot \vec x+b = 0\)的距离为:
\(d = \frac{|\vec w\cdot \vec x_0+b|}{||\vec w||}\)
假设我们已知最终要求的超平面为:\(\vec w\cdot \vec x+b\) ,因为这个超平面在间隔最大的两个平行的超平面正中间,而且上下两个超平面都经过支持向量,所以支持向量到所求超平面的距离应该都是相同的。
于是,我们可以根据事实1,将\((\vec w,b)\) 放缩为\((a\vec w,ab)\) ,最终使得:
在支持向量\(X_0\)上有\(|\vec w\cdot \vec x_0+b| = 1\);
那么显而易见在非支持向量上有\(|\vec w\cdot \vec x_0+b|>1\)。
(有点难懂,我的理解是a对于每一个支持向量都是一个不同的值,使其满足上述条件,也就是说a并不是一个定值。但是无论a怎么变,都表示的同一个超平面,所以对后续没有影响。至于非支持向量上为什么绝对值都大于1,是因为事实2,因为支持向量离超平面距离是最近的,所以分母相同的情况下,非支持向量作为分子自然就更大。)
变换后,根据事实2,支持向量\(X_0\)到超平面的距离将会变为:\(d = \frac{|\vec w\cdot \vec x_0+b|}{||\vec w||} = \frac {1}{||\vec w||}\)
我们的目标是使支持向量到超平面的距离最大,也就是\(maximize(\frac 1 {||\vec w||})\)
又因\(maximize(\frac 1 {||\vec w||}) = minimize(||\vec w||)\)
于是我们将问题优化的目标函数定为:\(最小化(Minimize):\frac 1 2||\vec w||^2\)
而 最小化\(\frac 1 2||\vec w||^2\) 与 最小化$||w|| $ 是完全等价的。之所以写成这种形式,是为了后续求导更加方便。
同时,因为我们将\((\vec w,b)\)放缩为\((a\vec w,ab)\) ,我们可以得到限制条件:
\(y_i(\vec w\cdot \vec x_i +b) \geq1,(i = 1 \sim n)\)
其中,\(y_i = -1 or 1\)
凸优化中的二次规划
目标函数为二次项
限制条件是一次项
因为我们的目标函数\(\frac 1 2||\vec w||^2 = \frac 1 2(w_1^2+w_2^2+...+w_m^2)\)为二次项,限制条件\(y_i(\vec w\cdot \vec x_i +b) \geq1,(i = 1 \sim n)\)为一次项,所以满足二次规划。
凸优化的二次规划问题要么无解,要么只有唯一最小值解。于是,我们就可以用梯度下降算法求解啦!另外,只要一个优化问题是凸的,我们总能找到高效快速的算法去解决它。线性可分条件下的支持向量机是凸优化问题,因此能迅速找到高效的算法解决。不过我们不会详细探讨求解凸优化问题,关于凸优化求解是一门专门的课程,有兴趣可以学习《凸优化理论》这门课程。
线性支持向量机(软间隔)
硬间隔与软间隔
硬间隔:间隔内不存在样本。训练集完全分类正确,损失函数不存在,损失值为0。也就是说,找到的超平面完全分离两类。上述都是硬间隔。硬间隔容易受到极端值影响,泛化能力不强,于是我们提出了软间隔。
软间隔:间隔内允许样本存在。允许一定量的样本分类错误,不过这些错误样本范围不会超过间隔区间。软间隔是硬间隔SVM的拓展版本。
松弛因子
注:因为线性支持向量机模拟出的直线允许误差存在,所以根据线性可分的定义,线性支持向量机其实属于线性不可分。
若数据线性不可分,则增加松弛因子\(\zeta_i \geq0\) ,使函数间隔加上松弛变量大于等于1。于是,
约束条件变为:\(y_i(\vec w\cdot \vec x_i+b) \geq 1-\zeta_i\)
目标函数变为:\(minimize_{w,b}(\frac 1 2||\vec w||^2+C\sum_{i=1}^N\zeta_i)\)
其中,C为惩罚因子,是为了防止松弛因子过大加入的一个代价。当C等于无穷大,只有当\(\zeta_i = 0\)时才有最小值,因此,当C为无穷大时,退化为线性可分支持向量机。
目标函数求解依然是代入拉格朗日乘子,转化为对偶问题并求解。
合页损失函数(hinge loss function)
公式:\(L(y(\vec w\cdot \vec x+b)) = [1-y(\vec w\cdot \vec x+b)]_+\)
下标“+”表示以下情况取正值:
\([z]_+ =\left\{\begin{aligned} z, z>0 \\ 0,z\leq0\end{aligned} \right.\)
当函数间隔\(y_i(\vec w\cdot \vec x+b)>1\)时,即当分类正确并在(软)间隔之外时,损失为0。否则损失为\(1-y_i(\vec w\cdot \vec x+b)\)
当样本正确分类,\(y_i(\vec w\cdot \vec x+b)>0\),反之小于0。
\(|y_i(\vec w\cdot \vec x+b)|\) 表示样本与决策边界的距离。绝对值越大,距离决策边界越远。
于是:
当\(y_i(\vec w\cdot \vec x+b)>0\),即分类正确情况下,距离决策边界越远区分程度越好。
当\(y_i(\vec w\cdot \vec x+b)<0\),即分类错误情况下,距离决策边界越远区分程度越差。
SVM的损失函数
SVM有另一种解释,即最小化以下目标函数:
\(\sum_{i=1}^N[1-y_i(\vec w\cdot \vec x_i+b)]_++\lambda||\vec w||^2\)
这里不提供相关证明,详情见文章:线性支持向量机-合页损失函数(Hinge Loss)_搏击俱乐部_的博客-CSDN博客_支持向量机损失函数
也就是说,SVM目标函数实际上就是合页损失函数加上\(\lambda||\vec w||^2\)。
非线性支持向量机
将特征空间从低位映射到高维
当遇到如下图所示的非线性数据时,支持向量机的处理是将该训练集的特征从低维映射到高维,在高维仍然采用线性超平面对数据进行分类。
现有以下假设:
假设1:在一个M维空间上随机取N个训练样本,随机的对每个训练样本赋予标签+1或-1,设这些训练样本线性可分的概率为\(P(M)\)。那么当M趋于无穷大时,\(P(M)=1\)。
这里略去该假设的证明。
也就是说,一个训练集在低维上不可分,但它到高维的映射将会是可分的。于是,支持向量机将训练样本由低维映射到高维以增加线性可分的概率。
我们设\(\phi(x)\)为x在高维上的映射,那么假定\(\phi(x)\)形式已知的条件下,引入松弛变量的目标函数将会变为:
\(minimize_{w,b}(\frac 1 2||\vec w||^2+C\sum_{i=1}^N\zeta_i), \zeta_i\geq0,(i=1\sim n)\)
限制条件:
\(y_i[\vec w\cdot\phi(\vec x_i)+b]\geq 1-\zeta_i,(i=1 \sim n)\)
注意:这里的\(\vec w\) 是与高维的\(\phi(\vec x)\) 对应的。
我们可以看到,转化为高维后同样可以采用凸优化的二次规划求解。
核函数(Kernel Function)
注意:接下来向量将会用\(X\) 表示,向量点乘则变为矩阵乘法,例如:
\(\vec x_1\cdot\vec x_2\)将变为\(X_1^TX_2\) 。
根据低维映射到高维的规则,重点在于如何找到\(\phi(X)\) 使得线性不可分训练集在高维线性可分。实际上,我们可以不用知道 \(\phi(X)\)的具体形式。取而代之,如果对于任意两个向量\(X_1,X_2\),有\(K(X_1,X_2) = \phi(X_1)^T\phi(X_2)\) ,那么我们仍然可以通过一些技巧完成测试样本的预测。
我们定义\(K(X_1,X_2)\) 为核函数。易得,核函数是一个实数。
可以证明,\(K(X_1,X_2)\)与\(\phi(X_1),\phi(X_2)\) 是一一对应的关系,证明略。另外,核函数必须满足以下条件才能写成两个向量内积的形式:
\(K(X_1,X_2)\)能写成\(\phi(X_1)^T\phi(X_2)\) 的充要条件:
\(K(X_1,X_2) = K(X_2,X_1)\),即交换性
$C_i(i=1N),N有{i=1}^N{j=1}^NC_iC_jK(X_iX_j) $ ,即半正定性
接下来,我们将研究如何在已知\(K(X_1,X_2)\)而不知道\(\phi(X)\)的条件下求解支持向量机的目标函数。
对偶问题与KKT条件
原问题与对偶问题
原问题(Prime problem)定义:
最小化(Minimize):\(f(w)\)
限制条件(Subject to): \[ \begin{split}&g_i(w) \leq0 ,i=1\sim K\\&h_i(w) = 0,i=1\sim m\end{split} \] 注:自变量为\(w\),目标函数是\(f(w)\),限制条件:有K个不等式,分别用\(g_i(w)\) 来表示,等式有m个,分别用\(h_i(m)\) 表示 。
为了定义对偶问题,我们先定义一个函数:
\(L(w,a,\beta) = f(w)+a^Tg(w)+\beta^Th(w)\)
其中,
\(a = [a_1,a_2,...,a_K]^T\),
\(\beta = [\beta_1,\beta_2,...\beta_M]^T\),
\(g(w) = [g_1(w),g_2(w),...,g_K(w)]^T\)
\(h(w) = [h_1(w),h_2(w),...,h_M(w)]^T\)
然后,定义对偶问题如下:
\(最大化:\theta(a,\beta) = inf L(w,a,\beta),所有定义域内的w\)
限制条件:\(a_i \geq0,i=1\sim K\)
对偶问题是:最大化\(\theta(a,\beta)\), 它等于\(L(w,a,\beta)\) 去遍历所有定义域上的\(w\)找到使\(L(w,a,\beta)\)最小的那个\(w\),同时将求得的\(L(w,a,\beta)\) 赋值为\(\theta(a,\beta)\)。注意限制条件。
联合原问题与对偶问题,有以下定理:
定理1:若\(w^*\)是原问题的解,\((a^*,\beta^*)\)是对偶问题的解,那么:\(f(w^*)\geq \theta(a^*,\beta^*)\)
证明略。
这个定理说明:原问题的解\(f(w^*)\)总是大于等于对偶问题的解\(\theta(a^*,\beta^*)\) 。
我们将\(f(w^*)- \theta(a^*,\beta^*)\) 定义为对偶差距(Doality Gap)。根据定理1,对偶差距大于等于0。
强对偶定理
如果\(g(w) = Aw+b,h(w)=Cw+d,f(w)\)为凸函数,则有\(f(w^*) = \theta(a^*,\beta^*)\),对偶差距为0。
简单来说就是,如果原问题的目标函数是凸函数,而限制条件是线性函数那么\(f(w^*) = \theta(a^*,\beta^*)\) 。证明略。
KKT条件
如果强对偶定理成立,即\(f(w^*) = \theta(a^*,\beta^*)\) ,则定理1中必然能推出:对于所有的\(i=1\sim K\) ,要么\(a_i = 0\),要么\(g_i(w^*) = 0\)。这个条件被称为KKT条件。
将支持向量机目标函数转化为对偶问题并求解
目标函数转化为原问题形式
回顾一下现在的支持向量机目标函数:
\(minimize_{w,b}(\frac 1 2||\vec w||^2+C\sum_{i=1}^N\zeta_i)\)
限制条件:
\(\zeta_i\geq0,(i=1\sim n)\)
\(y_i[\vec w\cdot\phi(\vec x_i)+b]\geq 1-\zeta_i,(i=1 \sim n)\)
对比原问题(Prime problem)的形式:
最小化(Minimize):\(f(w)\)
限制条件(Subject to): \[ \begin{split}&g_i(w) \leq0 ,i=1\sim K\\&h_i(w) = 0,i=1\sim m\end{split} \] 注意到,原问题中不等式\(g_i(w) \leq0\),而支持向量机的限制条件中两个不等式都是大于等于0的。所以我们要先将支持向量机中的限制条件转为小于等于。
将\(\zeta_i\) 转为相反数
展开并化简第二个不等式
于是,目标函数将变为:
\(minimize_{w,b}(\frac 1 2||\vec w||^2+C\sum_{i=1}^N\zeta_i)\)
限制条件:
\(\zeta_i\leq0,(i=1\sim n)\)
\(1+\zeta_i-y_iw^T\phi(X_i)-y_ib\leq0(i=1\sim N)\)
因为目标函数是凸的,而其限制条件都是线性函数,所以满足强对偶定理。
利用对偶定理求解
现在,对偶问题中的\(w\) 就是这里的\((w,b,\zeta_i)\),而不等式\(g_i(w)\leq 0\)是这里限制条件(两部分):
\(\zeta_i\leq0,(i=1\sim n)\)
\(1+\zeta_i-y_iw^T\phi(X_i)-y_ib\leq0(i=1\sim N)\)
另外,因为限制条件不存在等式,所以不存在对偶问题中的\(h_i(w)\)。
然后,对偶问题可以写成如下形式:
\(最大化:\theta(a,\beta) = inf_{w,\zeta,b}\{\frac 1 2||w||^2-C\sum_{i=1}^N\beta_i\zeta_i+\sum_{i=1}^Na_i[1+\zeta_i-y_iw^T\phi(X_i)-y_ib]\}\)
限制条件:
- \(a_i\geq0\)
(2)\(\beta_i\geq0\)
如何将原目标函数转化为对偶问题
先对\((w,b,\zeta_i)\)求导并令导数为0:
\(\frac {\partial \theta}{\partial w} = 0\)推出\(w=\sum_{i=1}^Na_iy_i\phi(X_i)\)
\(\frac {\partial \theta}{\partial \zeta_i} = 0\)推出\(a_i+\beta_i=C\)
\(\frac {\partial \theta}{\partial b} = 0\)推出\(\sum_{i=1}^Na_iy_i=0\)
(详细过程略)
于是,可以将支持向量机原目标函数化为以下对偶问题:
\(最大化:\theta(a,\beta) = \sum_{i=1}^Na_i-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^Ny_iy_ja_ia_j\phi(X_i)^T\)
限制条件:
(1) \(0 \leq a_i\leq C,(i=1\sim N)\)
(2)\(\sum_{i=1}^Na_iy_i=0,(i=1\sim N)\)
可以看出,这个对偶问题也是一个凸优化的二次规划问题,可以通过最优化算法快速求解。(利用凸优化包)
如何求解这个对偶问题
由于\(K(X_i,X_j) = \phi(X_i)^T\phi(X_j)\) ,所以我们只需要知道核函数,就可以求解这个对偶问题了。当我们求解了这个对偶问题,解出了所有的\(a_i\) 。我们可以继续观察\(w=\sum_{i=1}^Na_iy_i\phi(X_i)\),因为\(\phi(X_i)\) 不具有显式表达,所以\(w\)也不具有显式表达。但是我们可以推导:即使\(w\)不具有显示表达,我们也可以通过核函数算出\(w^T\phi(X)+b\)的值。
首先,如何求b
由于\(w=\sum_{i=1}^Na_iy_i\phi(X_i)\) ,则
\(w^T\phi(X_i) = \sum_{j=1}^Na_jy_j\phi(X_j)^T\phi(X_i) = \sum_{j=1}^Na_jy_jK(X_j,X_i)\)
其次,根据KKT条件,我们可以推出:
\(a_i[1+\zeta_i-y_iw^T\phi(X_i)-y_ib] = 0\)
\(\beta_i\zeta_i=0\)即\((c-a_i)\zeta_i = 0\)
另外,如果对某个i,\(a_i \not= 0且a_i \not= c\),则根据上面KKT推出的两个公式必有\(\zeta_i = 0\),且\(1+\zeta_i-y_iw^T\phi(X_i)-y_ib = 0\) 。
而这时\(y_iw^T\phi(X_i) = \sum_{j=1}^Na_iy_iy_jK(X_j,X_i)\)
所以,只需要找一个\(0<a_i<c\) ,
\(b = \frac{1-\sum_{j=1}^Na_iy_iy_jK(X_j,X_i)}{y_i}\)
如何求\(w^T\phi(X)+b\) —— 核函数戏法(Kernel Trick)
将\(w=\sum_{i=1}^Na_iy_i\phi(X_i)\)代入得:
\[ \begin{split}w^T\phi(X)+b &= w\\&=\sum_{i=1}^Na_iy_i\phi(X_i)^T\phi(X)+b\\& = \sum_{i=1}^Na_iy_iK(X_i,X)+b\end{split} \]
我们发现,即使不知道\(\phi(X)和w\)的显式形式,也可以通过核函数求得\(w^T\phi(X)+b\) ,这一结论被称为核函数戏法。
最后,我们可以用如下的判别标准来判定一个样本属于哪一类别:
若\(\sum_{i=1}^Na_iy_iK(X_i,X)+b \geq 0\),那么\(X \in C_1\) ;
若\(\sum_{i=1}^Na_iy_iK(X_i,X)+b \leq 0\),那么\(X \in C_2\) 。
总结:支持向量机训练和测试流程
训练过程:
输入训练集${(X_i,y_i)},i=1N \(,其中,\)y_i = +1或-1$ 。
接下来,求解如下目标函数:
\(最大化:\theta(a,\beta) = \sum_{i=1}^Na_i-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^Ny_iy_ja_ia_j\phi(X_i)^T\)
限制条件:
(1)\(0 \leq a_i\leq C,(i=1\sim N)\)
(2)\(\sum_{i=1}^Na_iy_i=0,(i=1\sim N)\)
求出\(a\) 。
然后,求出b:
找一个\(a_i \not= 0且a_i \not=c\),
\(b = \frac{1-\sum_{j=1}^Na_iy_iy_jK(X_j,X_i)}{y_i}\)
一旦求出了\(a,b\),就完成了支持向量机的训练过程。
测试过程:
给出一个测试数据X,预测它的类别y。
若\(\sum_{i=1}^Na_iy_iK(X_i,X)+b \geq 0\),那么\(y = +1\) ;
若\(\sum_{i=1}^Na_iy_iK(X_i,X)+b < 0\),那么\(y = -1\) ;
关于支持向量机的具体应用以及更多细节比如核函数的选择、超参数的控制等等将会在下一章支持向量机中进行说明。